Skip to content

Commit a7630f3

Browse files
committed
add option to hashtag timeline
1 parent b3d59ff commit a7630f3

File tree

4 files changed

+45
-0
lines changed

4 files changed

+45
-0
lines changed

feature/hashtag/src/commonMain/kotlin/com/livefast/eattrash/raccoonforfriendica/feature/hashtag/di/HashtagModule.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,9 @@ val hashtagModule =
3333
settingsRepository = instance(),
3434
identityRepository = instance(),
3535
userRepository = instance(),
36+
apiConfigurationRepository = instance(),
37+
accountRepository = instance(),
38+
instanceShortcutRepository = instance(),
3639
hapticFeedback = instance(),
3740
imagePreloadManager = instance(),
3841
blurHashRepository = instance(),

feature/hashtag/src/commonMain/kotlin/com/livefast/eattrash/raccoonforfriendica/feature/hashtag/timeline/HashtagMviModel.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,10 @@ interface HashtagMviModel :
7272
data class WillOpenDetail(
7373
val entry: TimelineEntryModel,
7474
) : Intent
75+
76+
data class AddInstanceShortcut(
77+
val node: String,
78+
) : Intent
7579
}
7680

7781
data class State(
@@ -89,6 +93,7 @@ interface HashtagMviModel :
8993
val hideNavigationBarWhileScrolling: Boolean = true,
9094
val layout: TimelineLayout = TimelineLayout.Full,
9195
val lang: String? = null,
96+
val currentNode: String? = null,
9297
)
9398

9499
sealed interface Effect {

feature/hashtag/src/commonMain/kotlin/com/livefast/eattrash/raccoonforfriendica/feature/hashtag/timeline/HashtagScreen.kt

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ import com.livefast.eattrash.raccoonforfriendica.core.utils.di.getShareHelper
6565
import com.livefast.eattrash.raccoonforfriendica.core.utils.isNearTheEnd
6666
import com.livefast.eattrash.raccoonforfriendica.domain.content.data.TimelineEntryModel
6767
import com.livefast.eattrash.raccoonforfriendica.domain.content.data.isOldEntry
68+
import com.livefast.eattrash.raccoonforfriendica.domain.content.data.nodeName
6869
import com.livefast.eattrash.raccoonforfriendica.domain.content.data.original
6970
import com.livefast.eattrash.raccoonforfriendica.domain.content.data.safeKey
7071
import com.livefast.eattrash.raccoonforfriendica.domain.identity.usecase.di.getEntryActionRepository
@@ -368,6 +369,13 @@ class HashtagScreen(
368369
},
369370
)
370371
}
372+
val nodeName = entry.nodeName
373+
if (nodeName.isNotEmpty() && nodeName != uiState.currentNode) {
374+
this +=
375+
OptionId.AddShortcut.toOption(
376+
LocalStrings.current.actionShortcut(nodeName),
377+
)
378+
}
371379
},
372380
onOptionSelected = { optionId ->
373381
when (optionId) {
@@ -430,6 +438,11 @@ class HashtagScreen(
430438
model.reduce(
431439
HashtagMviModel.Intent.ToggleTranslation(entry.original),
432440
)
441+
442+
OptionId.AddShortcut ->
443+
model.reduce(
444+
HashtagMviModel.Intent.AddInstanceShortcut(entry.nodeName),
445+
)
433446
else -> Unit
434447
}
435448
},

feature/hashtag/src/commonMain/kotlin/com/livefast/eattrash/raccoonforfriendica/feature/hashtag/timeline/HashtagViewModel.kt

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import com.livefast.eattrash.raccoonforfriendica.core.utils.imageload.ImagePrelo
1313
import com.livefast.eattrash.raccoonforfriendica.core.utils.vibrate.HapticFeedback
1414
import com.livefast.eattrash.raccoonforfriendica.domain.content.data.TimelineEntryModel
1515
import com.livefast.eattrash.raccoonforfriendica.domain.content.data.blurHashParamsForPreload
16+
import com.livefast.eattrash.raccoonforfriendica.domain.content.data.nodeName
1617
import com.livefast.eattrash.raccoonforfriendica.domain.content.data.original
1718
import com.livefast.eattrash.raccoonforfriendica.domain.content.data.urlsForPreload
1819
import com.livefast.eattrash.raccoonforfriendica.domain.content.pagination.TimelineNavigationManager
@@ -24,8 +25,11 @@ import com.livefast.eattrash.raccoonforfriendica.domain.content.repository.UserR
2425
import com.livefast.eattrash.raccoonforfriendica.domain.content.usecase.GetTranslationUseCase
2526
import com.livefast.eattrash.raccoonforfriendica.domain.content.usecase.ToggleEntryDislikeUseCase
2627
import com.livefast.eattrash.raccoonforfriendica.domain.content.usecase.ToggleEntryFavoriteUseCase
28+
import com.livefast.eattrash.raccoonforfriendica.domain.identity.repository.AccountRepository
29+
import com.livefast.eattrash.raccoonforfriendica.domain.identity.repository.ApiConfigurationRepository
2730
import com.livefast.eattrash.raccoonforfriendica.domain.identity.repository.IdentityRepository
2831
import com.livefast.eattrash.raccoonforfriendica.domain.identity.repository.ImageAutoloadObserver
32+
import com.livefast.eattrash.raccoonforfriendica.domain.identity.repository.InstanceShortcutRepository
2933
import com.livefast.eattrash.raccoonforfriendica.domain.identity.repository.SettingsRepository
3034
import kotlinx.coroutines.flow.launchIn
3135
import kotlinx.coroutines.flow.onEach
@@ -40,6 +44,9 @@ class HashtagViewModel(
4044
private val settingsRepository: SettingsRepository,
4145
private val identityRepository: IdentityRepository,
4246
private val userRepository: UserRepository,
47+
private val apiConfigurationRepository: ApiConfigurationRepository,
48+
private val accountRepository: AccountRepository,
49+
private val instanceShortcutRepository: InstanceShortcutRepository,
4350
private val hapticFeedback: HapticFeedback,
4451
private val imagePreloadManager: ImagePreloadManager,
4552
private val blurHashRepository: BlurHashRepository,
@@ -97,6 +104,11 @@ class HashtagViewModel(
97104
updateEntryInState(event.entry.id) { event.entry }
98105
}.launchIn(this)
99106

107+
apiConfigurationRepository.node
108+
.onEach { node ->
109+
updateState { it.copy(currentNode = node) }
110+
}.launchIn(this)
111+
100112
if (uiState.value.initial) {
101113
val model = tagRepository.getBy(tag)
102114
updateState {
@@ -149,6 +161,7 @@ class HashtagViewModel(
149161
timelineNavigationManager.push(state)
150162
emitEffect(HashtagMviModel.Effect.OpenDetail(intent.entry))
151163
}
164+
is HashtagMviModel.Intent.AddInstanceShortcut -> addInstanceShortcut(intent.node)
152165
}
153166
}
154167

@@ -501,4 +514,15 @@ class HashtagViewModel(
501514
updateEntryInState(entry.id) { newEntry }
502515
}
503516
}
517+
518+
private fun addInstanceShortcut(nodeName: String) {
519+
screenModelScope.launch {
520+
accountRepository.getActive()?.id?.also { accountId ->
521+
instanceShortcutRepository.create(
522+
accountId = accountId,
523+
node = nodeName,
524+
)
525+
}
526+
}
527+
}
504528
}

0 commit comments

Comments
 (0)