Skip to content

Commit e1a1722

Browse files
committed
add option to circle timeline
1 parent 2ecbc7e commit e1a1722

File tree

4 files changed

+45
-0
lines changed

4 files changed

+45
-0
lines changed

feature/circles/src/commonMain/kotlin/com/livefast/eattrash/raccoonforfriendica/feature/circles/di/CirclesModule.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,9 @@ val circlesModule =
4545
timelineEntryRepository = instance(),
4646
settingsRepository = instance(),
4747
userRepository = instance(),
48+
apiConfigurationRepository = instance(),
49+
accountRepository = instance(),
50+
instanceShortcutRepository = instance(),
4851
circleCache = instance(),
4952
hapticFeedback = instance(),
5053
imagePreloadManager = instance(),

feature/circles/src/commonMain/kotlin/com/livefast/eattrash/raccoonforfriendica/feature/circles/timeline/CircleTimelineMviModel.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,10 @@ interface CircleTimelineMviModel :
6868
data class WillOpenDetail(
6969
val entry: TimelineEntryModel,
7070
) : Intent
71+
72+
data class AddInstanceShortcut(
73+
val entry: TimelineEntryModel,
74+
) : Intent
7175
}
7276

7377
data class State(
@@ -85,6 +89,7 @@ interface CircleTimelineMviModel :
8589
val hideNavigationBarWhileScrolling: Boolean = true,
8690
val layout: TimelineLayout = TimelineLayout.Full,
8791
val lang: String? = null,
92+
val currentNode: String? = null,
8893
)
8994

9095
sealed interface Effect {

feature/circles/src/commonMain/kotlin/com/livefast/eattrash/raccoonforfriendica/feature/circles/timeline/CircleTimelineScreen.kt

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ import com.livefast.eattrash.raccoonforfriendica.core.utils.di.getShareHelper
6464
import com.livefast.eattrash.raccoonforfriendica.core.utils.isNearTheEnd
6565
import com.livefast.eattrash.raccoonforfriendica.domain.content.data.TimelineEntryModel
6666
import com.livefast.eattrash.raccoonforfriendica.domain.content.data.isOldEntry
67+
import com.livefast.eattrash.raccoonforfriendica.domain.content.data.nodeName
6768
import com.livefast.eattrash.raccoonforfriendica.domain.content.data.original
6869
import com.livefast.eattrash.raccoonforfriendica.domain.content.data.safeKey
6970
import com.livefast.eattrash.raccoonforfriendica.domain.identity.usecase.di.getEntryActionRepository
@@ -361,6 +362,13 @@ class CircleTimelineScreen(
361362
},
362363
)
363364
}
365+
val nodeName = entry.nodeName
366+
if (nodeName.isNotEmpty() && nodeName != uiState.currentNode) {
367+
this +=
368+
OptionId.AddShortcut.toOption(
369+
LocalStrings.current.actionShortcut(nodeName),
370+
)
371+
}
364372
},
365373
onOptionSelected = { optionId ->
366374
when (optionId) {
@@ -431,6 +439,10 @@ class CircleTimelineScreen(
431439
),
432440
)
433441

442+
OptionId.AddShortcut ->
443+
model.reduce(
444+
CircleTimelineMviModel.Intent.AddInstanceShortcut(entry),
445+
)
434446
else -> Unit
435447
}
436448
},

feature/circles/src/commonMain/kotlin/com/livefast/eattrash/raccoonforfriendica/feature/circles/timeline/CircleTimelineViewModel.kt

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import com.livefast.eattrash.raccoonforfriendica.domain.content.data.CircleModel
1414
import com.livefast.eattrash.raccoonforfriendica.domain.content.data.TimelineEntryModel
1515
import com.livefast.eattrash.raccoonforfriendica.domain.content.data.TimelineType
1616
import com.livefast.eattrash.raccoonforfriendica.domain.content.data.blurHashParamsForPreload
17+
import com.livefast.eattrash.raccoonforfriendica.domain.content.data.nodeName
1718
import com.livefast.eattrash.raccoonforfriendica.domain.content.data.original
1819
import com.livefast.eattrash.raccoonforfriendica.domain.content.data.urlsForPreload
1920
import com.livefast.eattrash.raccoonforfriendica.domain.content.pagination.TimelineNavigationManager
@@ -26,8 +27,11 @@ import com.livefast.eattrash.raccoonforfriendica.domain.content.usecase.GetTrans
2627
import com.livefast.eattrash.raccoonforfriendica.domain.content.usecase.ToggleEntryDislikeUseCase
2728
import com.livefast.eattrash.raccoonforfriendica.domain.content.usecase.ToggleEntryFavoriteUseCase
2829
import com.livefast.eattrash.raccoonforfriendica.domain.identity.data.SettingsModel
30+
import com.livefast.eattrash.raccoonforfriendica.domain.identity.repository.AccountRepository
31+
import com.livefast.eattrash.raccoonforfriendica.domain.identity.repository.ApiConfigurationRepository
2932
import com.livefast.eattrash.raccoonforfriendica.domain.identity.repository.IdentityRepository
3033
import com.livefast.eattrash.raccoonforfriendica.domain.identity.repository.ImageAutoloadObserver
34+
import com.livefast.eattrash.raccoonforfriendica.domain.identity.repository.InstanceShortcutRepository
3135
import com.livefast.eattrash.raccoonforfriendica.domain.identity.repository.SettingsRepository
3236
import kotlinx.coroutines.flow.launchIn
3337
import kotlinx.coroutines.flow.onEach
@@ -41,6 +45,9 @@ class CircleTimelineViewModel(
4145
private val timelineEntryRepository: TimelineEntryRepository,
4246
private val settingsRepository: SettingsRepository,
4347
private val userRepository: UserRepository,
48+
private val apiConfigurationRepository: ApiConfigurationRepository,
49+
private val accountRepository: AccountRepository,
50+
private val instanceShortcutRepository: InstanceShortcutRepository,
4451
private val circleCache: LocalItemCache<CircleModel>,
4552
private val hapticFeedback: HapticFeedback,
4653
private val imagePreloadManager: ImagePreloadManager,
@@ -94,6 +101,11 @@ class CircleTimelineViewModel(
94101
updateEntryInState(event.entry.id) { event.entry }
95102
}.launchIn(this)
96103

104+
apiConfigurationRepository.node
105+
.onEach { node ->
106+
updateState { it.copy(currentNode = node) }
107+
}.launchIn(this)
108+
97109
if (uiState.value.initial) {
98110
refresh(
99111
initial = true,
@@ -149,6 +161,7 @@ class CircleTimelineViewModel(
149161
timelineNavigationManager.push(state)
150162
emitEffect(CircleTimelineMviModel.Effect.OpenDetail(intent.entry))
151163
}
164+
is CircleTimelineMviModel.Intent.AddInstanceShortcut -> addInstanceShortcut(intent.entry)
152165
}
153166
}
154167

@@ -495,4 +508,16 @@ class CircleTimelineViewModel(
495508
updateEntryInState(entry.id) { newEntry }
496509
}
497510
}
511+
512+
private fun addInstanceShortcut(entry: TimelineEntryModel) {
513+
val nodeName = entry.nodeName.takeIf { it.isNotEmpty() } ?: return
514+
screenModelScope.launch {
515+
accountRepository.getActive()?.id?.also { accountId ->
516+
instanceShortcutRepository.create(
517+
accountId = accountId,
518+
node = nodeName,
519+
)
520+
}
521+
}
522+
}
498523
}

0 commit comments

Comments
 (0)