Skip to content

Commit 278f435

Browse files
committed
add tab settings
1 parent 56bf1a0 commit 278f435

File tree

22 files changed

+941
-304
lines changed

22 files changed

+941
-304
lines changed

app/src/main/java/dev/dimension/flare/ui/screen/home/TabSettingScreen.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,10 +48,10 @@ import dev.dimension.flare.ui.model.map
4848
import dev.dimension.flare.ui.model.onSuccess
4949
import dev.dimension.flare.ui.presenter.home.UserPresenter
5050
import dev.dimension.flare.ui.presenter.invoke
51+
import dev.dimension.flare.ui.screen.settings.AllTabsPresenter
5152
import dev.dimension.flare.ui.screen.settings.EditTabDialog
5253
import dev.dimension.flare.ui.screen.settings.TabAddBottomSheet
5354
import dev.dimension.flare.ui.screen.settings.TabCustomItem
54-
import dev.dimension.flare.ui.screen.settings.allTabsPresenter
5555
import dev.dimension.flare.ui.theme.screenHorizontalPadding
5656
import kotlinx.collections.immutable.toImmutableList
5757
import kotlinx.coroutines.CoroutineScope
@@ -227,7 +227,7 @@ private fun presenter(
227227
)
228228
}.invoke()
229229
var selectedEditTab by remember { mutableStateOf<TabItem?>(null) }
230-
val allTabsState = allTabsPresenter(filterIsTimeline = true)
230+
val allTabsState = remember { AllTabsPresenter(filterIsTimeline = true) }.invoke()
231231
val tabSettings by settingsRepository.tabSettings.collectAsUiState()
232232
val cacheTabs =
233233
remember {

app/src/main/java/dev/dimension/flare/ui/screen/misskey/MisskeyEntryBuilder.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ internal fun EntryProviderBuilder<NavKey>.misskeyEntryBuilder(
5858
tabItem = remember(args) {
5959
Misskey.AntennasTimelineTabItem(
6060
account = args.accountType,
61-
id = args.antennaId,
61+
antennasId = args.antennaId,
6262
metaData = TabMetaData(
6363
title = TitleType.Text(args.title),
6464
icon = IconType.Material(IconType.Material.MaterialIcon.Rss),

app/src/main/java/dev/dimension/flare/ui/screen/settings/TabAddBottomSheet.kt

Lines changed: 86 additions & 87 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ import kotlinx.coroutines.launch
7878
@Composable
7979
internal fun TabAddBottomSheet(
8080
tabs: ImmutableList<TabItem>,
81-
allTabs: AllTabsState,
81+
allTabs: AllTabsPresenter.State,
8282
onDismissRequest: () -> Unit,
8383
onAddTab: (TabItem) -> Unit,
8484
onDeleteTab: (String) -> Unit,
@@ -149,7 +149,7 @@ internal fun TabAddBottomSheet(
149149
},
150150
modifier = Modifier.clip(CircleShape),
151151
)
152-
tabs.forEachIndexed { index, tabState ->
152+
tabs.forEachIndexed { index, tab ->
153153
LeadingIconTab(
154154
modifier = Modifier.clip(CircleShape),
155155
selected = pagerState.currentPage == index + 2,
@@ -159,35 +159,31 @@ internal fun TabAddBottomSheet(
159159
}
160160
},
161161
text = {
162-
tabState.onSuccess { tab ->
163-
Row(
164-
verticalAlignment = Alignment.CenterVertically,
165-
horizontalArrangement = Arrangement.spacedBy(8.dp),
166-
) {
167-
RichText(
168-
text = tab.profile.name,
169-
maxLines = 1,
170-
overflow = TextOverflow.Ellipsis,
171-
)
172-
Text(
173-
text = tab.profile.handle,
174-
style = MaterialTheme.typography.bodySmall,
175-
modifier =
176-
Modifier
177-
.alpha(MediumAlpha),
178-
maxLines = 1,
179-
overflow = TextOverflow.Ellipsis,
180-
)
181-
}
162+
Row(
163+
verticalAlignment = Alignment.CenterVertically,
164+
horizontalArrangement = Arrangement.spacedBy(8.dp),
165+
) {
166+
RichText(
167+
text = tab.profile.name,
168+
maxLines = 1,
169+
overflow = TextOverflow.Ellipsis,
170+
)
171+
Text(
172+
text = tab.profile.handle,
173+
style = MaterialTheme.typography.bodySmall,
174+
modifier =
175+
Modifier
176+
.alpha(MediumAlpha),
177+
maxLines = 1,
178+
overflow = TextOverflow.Ellipsis,
179+
)
182180
}
183181
},
184182
icon = {
185-
tabState.onSuccess { tab ->
186-
AvatarComponent(
187-
tab.profile.avatar,
188-
size = 24.dp,
189-
)
190-
}
183+
AvatarComponent(
184+
tab.profile.avatar,
185+
size = 24.dp,
186+
)
191187
},
192188
)
193189
}
@@ -278,82 +274,85 @@ internal fun TabAddBottomSheet(
278274
verticalArrangement = Arrangement.spacedBy(8.dp),
279275
modifier = Modifier.fillMaxWidth(),
280276
) {
281-
val tabState = tabs[it - 2]
282-
tabState.onSuccess { tab ->
283-
var selectedIndex by remember { mutableStateOf(0) }
284-
if (tab.extraTabs.any()) {
285-
val items =
286-
listOf(
287-
stringResource(id = R.string.tab_settings_default),
288-
) +
289-
tab.extraTabs
290-
.map {
291-
when (it) {
292-
is PinnableTimelineTabPresenter.State.Tab.Feed ->
293-
R.string.tab_settings_feed
277+
val tab = tabs[it - 2]
278+
var selectedIndex by remember { mutableStateOf(0) }
279+
if (tab.extraTabs.any()) {
280+
val items =
281+
listOf(
282+
stringResource(id = R.string.tab_settings_default),
283+
) +
284+
tab.extraTabs
285+
.map {
286+
when (it) {
287+
is PinnableTimelineTabPresenter.State.Tab.Feed ->
288+
R.string.tab_settings_feed
294289

295-
is PinnableTimelineTabPresenter.State.Tab.List ->
296-
R.string.tab_settings_list
290+
is PinnableTimelineTabPresenter.State.Tab.List ->
291+
R.string.tab_settings_list
297292

298-
is PinnableTimelineTabPresenter.State.Tab.Antenna ->
299-
R.string.home_tab_antennas_title
300-
}
301-
}.map { stringResource(id = it) }
302-
ButtonGroup(
303-
overflowIndicator = {},
304-
horizontalArrangement = Arrangement.spacedBy(4.dp, Alignment.CenterHorizontally),
305-
modifier = Modifier.fillMaxWidth(),
293+
is PinnableTimelineTabPresenter.State.Tab.Antenna ->
294+
R.string.home_tab_antennas_title
295+
}
296+
}.map { stringResource(id = it) }
297+
ButtonGroup(
298+
overflowIndicator = {},
299+
horizontalArrangement =
300+
Arrangement.spacedBy(
301+
4.dp,
302+
Alignment.CenterHorizontally,
303+
),
304+
modifier = Modifier.fillMaxWidth(),
305+
) {
306+
items.forEachIndexed { index, text ->
307+
toggleableItem(
308+
checked = selectedIndex == index,
309+
onCheckedChange = { selectedIndex = index },
310+
label = text,
311+
)
312+
}
313+
}
314+
}
315+
when (selectedIndex) {
316+
0 -> {
317+
LazyColumn(
318+
contentPadding = PaddingValues(horizontal = screenHorizontalPadding),
319+
verticalArrangement = Arrangement.spacedBy(2.dp),
306320
) {
307-
items.forEachIndexed { index, text ->
308-
toggleableItem(
309-
checked = selectedIndex == index,
310-
onCheckedChange = { selectedIndex = index },
311-
label = text,
321+
itemsIndexed(tab.tabs) { index, it ->
322+
TabItem(
323+
it,
324+
modifier =
325+
Modifier
326+
.listCard(
327+
index = index,
328+
totalCount = tab.tabs.size,
329+
),
312330
)
313331
}
314332
}
315333
}
316-
when (selectedIndex) {
317-
0 -> {
318-
LazyColumn(
319-
contentPadding = PaddingValues(horizontal = screenHorizontalPadding),
320-
verticalArrangement = Arrangement.spacedBy(2.dp),
321-
) {
322-
itemsIndexed(tab.tabs) { index, it ->
334+
335+
else -> {
336+
LazyColumn(
337+
contentPadding = PaddingValues(horizontal = screenHorizontalPadding),
338+
verticalArrangement = Arrangement.spacedBy(2.dp),
339+
) {
340+
val data =
341+
tab.extraTabs.elementAtOrNull(selectedIndex - 1)?.data
342+
if (data != null) {
343+
itemsIndexed(data) { index, totalCount, item ->
323344
TabItem(
324-
it,
345+
remember(item) { item.toTabItem(accountKey = tab.profile.key) },
325346
modifier =
326347
Modifier
327348
.listCard(
328349
index = index,
329-
totalCount = tab.tabs.size,
350+
totalCount = totalCount,
330351
),
331352
)
332353
}
333354
}
334355
}
335-
336-
else -> {
337-
LazyColumn(
338-
contentPadding = PaddingValues(horizontal = screenHorizontalPadding),
339-
verticalArrangement = Arrangement.spacedBy(2.dp),
340-
) {
341-
val data = tab.extraTabs.elementAtOrNull(selectedIndex - 1)?.data
342-
if (data != null) {
343-
itemsIndexed(data) { index, totalCount, item ->
344-
TabItem(
345-
remember(item) { item.toTabItem(accountKey = tab.profile.key) },
346-
modifier =
347-
Modifier
348-
.listCard(
349-
index = index,
350-
totalCount = totalCount,
351-
),
352-
)
353-
}
354-
}
355-
}
356-
}
357356
}
358357
}
359358
}

app/src/main/java/dev/dimension/flare/ui/screen/settings/TabCustomizeScreen.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ import dev.dimension.flare.ui.component.listCard
6969
import dev.dimension.flare.ui.model.UiProfile
7070
import dev.dimension.flare.ui.model.collectAsUiState
7171
import dev.dimension.flare.ui.model.onSuccess
72+
import dev.dimension.flare.ui.presenter.invoke
7273
import dev.dimension.flare.ui.presenter.list.PinnableTimelineTabPresenter
7374
import dev.dimension.flare.ui.theme.screenHorizontalPadding
7475
import kotlinx.collections.immutable.ImmutableList
@@ -393,7 +394,7 @@ private fun presenter(
393394
// val except = remember(cacheTabs) {
394395
// cacheTabs.map { it.key }.toImmutableList()
395396
// }
396-
val allTabs = allTabsPresenter()
397+
val allTabs = remember { AllTabsPresenter() }.invoke()
397398

398399
object {
399400
val tabs = cacheTabs

compose-ui/src/commonMain/kotlin/dev/dimension/flare/data/model/TabSettings.kt

Lines changed: 50 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import dev.dimension.flare.model.AccountType
55
import dev.dimension.flare.model.MicroBlogKey
66
import dev.dimension.flare.model.PlatformType
77
import dev.dimension.flare.ui.model.UiAccount
8+
import dev.dimension.flare.ui.model.UiList
89
import dev.dimension.flare.ui.model.UiRssSource
910
import dev.dimension.flare.ui.model.UiUserV2
1011
import dev.dimension.flare.ui.presenter.home.HomeTimelinePresenter
@@ -35,6 +36,10 @@ public data class TabSettings(
3536

3637
@Serializable
3738
public sealed class TabItem {
39+
// for iOS
40+
public val id: String by lazy {
41+
key
42+
}
3843
public abstract val metaData: TabMetaData
3944
public abstract val account: AccountType
4045
public abstract val key: String
@@ -678,6 +683,20 @@ public data class ListTimelineTabItem(
678683
val listId: String,
679684
override val metaData: TabMetaData,
680685
) : TimelineTabItem() {
686+
public constructor(accountKey: MicroBlogKey, data: UiList) : this(
687+
listId = data.id,
688+
account = AccountType.Specific(accountKey),
689+
metaData =
690+
TabMetaData(
691+
title = TitleType.Text(data.title),
692+
icon =
693+
IconType.Mixed(
694+
icon = IconType.Material.MaterialIcon.List,
695+
userKey = accountKey,
696+
),
697+
),
698+
)
699+
681700
override val key: String = "list_${account}_$listId"
682701

683702
override fun createPresenter(): TimelinePresenter = ListTimelinePresenter(account, listId)
@@ -822,15 +841,29 @@ public object Misskey {
822841

823842
@Serializable
824843
public data class AntennasTimelineTabItem(
825-
val id: String,
844+
val antennasId: String,
826845
override val account: AccountType,
827846
override val metaData: TabMetaData,
828847
) : TimelineTabItem() {
829-
override val key: String = "antennas_${account}_$id"
848+
public constructor(accountKey: MicroBlogKey, data: UiList) : this(
849+
antennasId = data.id,
850+
account = AccountType.Specific(accountKey),
851+
metaData =
852+
TabMetaData(
853+
title = TitleType.Text(data.title),
854+
icon =
855+
IconType.Mixed(
856+
icon = IconType.Material.MaterialIcon.Rss,
857+
userKey = accountKey,
858+
),
859+
),
860+
)
861+
862+
override val key: String = "antennas_${account}_$antennasId"
830863

831864
override fun createPresenter(): TimelinePresenter =
832865
dev.dimension.flare.ui.presenter.list
833-
.AntennasTimelinePresenter(account, id)
866+
.AntennasTimelinePresenter(account, antennasId)
834867

835868
override fun update(metaData: TabMetaData): TabItem = copy(metaData = metaData)
836869
}
@@ -883,6 +916,20 @@ public object Bluesky {
883916
val uri: String,
884917
override val metaData: TabMetaData,
885918
) : TimelineTabItem() {
919+
public constructor(accountKey: MicroBlogKey, data: UiList) : this(
920+
uri = data.id,
921+
account = AccountType.Specific(accountKey),
922+
metaData =
923+
TabMetaData(
924+
title = TitleType.Text(data.title),
925+
icon =
926+
IconType.Mixed(
927+
icon = IconType.Material.MaterialIcon.Feeds,
928+
userKey = accountKey,
929+
),
930+
),
931+
)
932+
886933
override fun createPresenter(): TimelinePresenter =
887934
dev.dimension.flare.ui.presenter.home.bluesky
888935
.BlueskyFeedTimelinePresenter(account, uri)

compose-ui/src/commonMain/kotlin/dev/dimension/flare/ui/model/UiListExt.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ public fun UiList.toTabItem(accountKey: MicroBlogKey): TabItem =
4848
UiList.Type.Antenna ->
4949
Misskey.AntennasTimelineTabItem(
5050
account = AccountType.Specific(accountKey),
51-
id = id,
51+
antennasId = id,
5252
metaData =
5353
TabMetaData(
5454
title = TitleType.Text(title),

0 commit comments

Comments
 (0)