feat: web UI library views — artists / artist detail / album detail #18

Merged
bvandeusen merged 262 commits from dev into main 2026-04-23 22:05:24 -04:00
2 changed files with 40 additions and 17 deletions
Showing only changes of commit 2cb9f062c5 - Show all commits
@@ -77,23 +77,45 @@ private fun ListenBrainzForm(
onSaveToken: () -> Unit, onSaveToken: () -> Unit,
onSetEnabled: (Boolean) -> Unit, onSetEnabled: (Boolean) -> Unit,
) { ) {
TokenField(
tokenInput = tokenInput,
tokenSet = status?.tokenSet == true,
onChange = onTokenChange,
)
Spacer(Modifier.height(4.dp))
SaveTokenButton(
isSaving = isSaving,
enabled = !isSaving && tokenInput.isNotBlank(),
onClick = onSaveToken,
)
EnabledRow(status = status, isSaving = isSaving, onSetEnabled = onSetEnabled)
if (message != null) {
Text(
text = message,
style = MaterialTheme.typography.bodySmall,
color = MaterialTheme.colorScheme.onSurfaceVariant,
)
}
}
@Composable
private fun TokenField(tokenInput: String, tokenSet: Boolean, onChange: (String) -> Unit) {
OutlinedTextField( OutlinedTextField(
value = tokenInput, value = tokenInput,
onValueChange = onTokenChange, onValueChange = onChange,
label = { label = { Text(if (tokenSet) "Replace token" else "Token") },
Text(if (status?.tokenSet == true) "Replace token" else "Token") placeholder = { Text(if (tokenSet) "Token saved" else "") },
},
placeholder = {
Text(if (status?.tokenSet == true) "Token saved" else "")
},
modifier = Modifier.fillMaxWidth(), modifier = Modifier.fillMaxWidth(),
singleLine = true, singleLine = true,
visualTransformation = PasswordVisualTransformation(), visualTransformation = PasswordVisualTransformation(),
) )
Spacer(Modifier.height(4.dp)) }
@Composable
private fun SaveTokenButton(isSaving: Boolean, enabled: Boolean, onClick: () -> Unit) {
Button( Button(
onClick = onSaveToken, onClick = onClick,
enabled = !isSaving && tokenInput.isNotBlank(), enabled = enabled,
modifier = Modifier.fillMaxWidth(), modifier = Modifier.fillMaxWidth(),
) { ) {
if (isSaving) { if (isSaving) {
@@ -106,6 +128,14 @@ private fun ListenBrainzForm(
} }
Text(if (isSaving) "Saving…" else "Save token") Text(if (isSaving) "Saving…" else "Save token")
} }
}
@Composable
private fun EnabledRow(
status: ListenBrainzStatus?,
isSaving: Boolean,
onSetEnabled: (Boolean) -> Unit,
) {
Row( Row(
modifier = Modifier.fillMaxWidth(), modifier = Modifier.fillMaxWidth(),
verticalAlignment = Alignment.CenterVertically, verticalAlignment = Alignment.CenterVertically,
@@ -131,11 +161,4 @@ private fun ListenBrainzForm(
enabled = !isSaving && status?.tokenSet == true, enabled = !isSaving && status?.tokenSet == true,
) )
} }
if (message != null) {
Text(
text = message,
style = MaterialTheme.typography.bodySmall,
color = MaterialTheme.colorScheme.onSurfaceVariant,
)
}
} }