feat: show "Publishing to" chip in Composer for multi-account users

When more than one account is configured, display an informational
AssistChip at the top of the Composer showing the active blog name
and site icon. Uses SiteMetadataCache for the blog title, falls back
to account name. Non-clickable, only shown for disambiguation.
This commit is contained in:
Paweł Orzech 2026-03-20 00:33:16 +01:00
parent 0679b18b8e
commit ac461c3e6f

View file

@ -42,8 +42,12 @@ import androidx.compose.ui.window.Dialog
import androidx.compose.ui.window.DialogProperties import androidx.compose.ui.window.DialogProperties
import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.lifecycle.viewmodel.compose.viewModel import androidx.lifecycle.viewmodel.compose.viewModel
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.ui.platform.LocalContext
import coil.compose.AsyncImage import coil.compose.AsyncImage
import com.swoosh.microblog.data.AccountManager
import com.swoosh.microblog.data.HashtagParser import com.swoosh.microblog.data.HashtagParser
import com.swoosh.microblog.data.SiteMetadataCache
import com.swoosh.microblog.data.model.FeedPost import com.swoosh.microblog.data.model.FeedPost
import com.swoosh.microblog.data.model.PostStats import com.swoosh.microblog.data.model.PostStats
import com.swoosh.microblog.ui.animation.SwooshMotion import com.swoosh.microblog.ui.animation.SwooshMotion
@ -209,6 +213,39 @@ fun ComposerScreen(
.fillMaxSize() .fillMaxSize()
.padding(padding) .padding(padding)
) { ) {
// "Publishing to" chip when multiple accounts exist
val composerContext = LocalContext.current
val composerAccountManager = remember { AccountManager(composerContext) }
val composerAccounts = remember { composerAccountManager.getAccounts() }
val composerActiveAccount = remember { composerAccountManager.getActiveAccount() }
if (composerAccounts.size > 1 && composerActiveAccount != null) {
val composerSiteCache = remember { SiteMetadataCache(composerContext) }
val composerSiteData = remember {
composerSiteCache.get(composerActiveAccount.id)
}
val siteName = composerSiteData?.title ?: composerActiveAccount.name
val siteIconUrl = composerSiteData?.icon ?: composerSiteData?.logo
AssistChip(
onClick = { },
label = { Text("Publishing to: $siteName") },
leadingIcon = if (siteIconUrl != null) {
{
AsyncImage(
model = siteIconUrl,
contentDescription = null,
modifier = Modifier
.size(18.dp)
.clip(CircleShape),
contentScale = ContentScale.Crop
)
}
} else null,
modifier = Modifier.padding(horizontal = 16.dp, vertical = 4.dp)
)
}
// Hashtag visual transformation for edit mode text field // Hashtag visual transformation for edit mode text field
val hashtagColor = MaterialTheme.colorScheme.primary val hashtagColor = MaterialTheme.colorScheme.primary
val hashtagTransformation = remember(hashtagColor) { val hashtagTransformation = remember(hashtagColor) {