Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 18 additions & 2 deletions api/anilist/src/main/graphql/mutations/UpdateUser.graphql
Original file line number Diff line number Diff line change
@@ -1,7 +1,23 @@
mutation UpdateUser($profileColor: String) {
UpdateUser(profileColor: $profileColor) {
mutation UpdateUser(
$profileColor: String,
$animeListOptions: MediaListOptionsInput,
$mangaListOptions: MediaListOptionsInput,
) {
UpdateUser(
profileColor: $profileColor,
animeListOptions: $animeListOptions
mangaListOptions: $mangaListOptions
) {
options {
profileColor
}
mediaListOptions {
animeList {
sectionOrder
}
mangaList {
sectionOrder
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import com.apollographql.cache.normalized.fetchPolicy
import com.imashnake.animite.api.anilist.sanitize.media.Media
import com.imashnake.animite.api.anilist.sanitize.profile.User
import com.imashnake.animite.api.anilist.type.MediaListOptionsInput
import com.imashnake.animite.api.anilist.type.MediaType
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.filter
Expand Down Expand Up @@ -59,11 +60,29 @@
.asResult { User.MediaCollection(it, type, language, mediaListOrder) }
}

fun updateUser(profileColor: String?): Flow<Result<String?>> {
fun updateUser(

Check warning

Code scanning / detekt

Public functions require documentation. Warning

The function updateUser is missing documentation.
profileColor: String? = null,
animeSectionOrder: List<String>? = null,
mangaSectionOrder: List<String>? = null,
): Flow<Result<UpdateUserMutation.UpdateUser?>> {
return apolloClient
.mutation(UpdateUserMutation(Optional.presentIfNotNull(profileColor)))
.mutation(
UpdateUserMutation(
profileColor = Optional.presentIfNotNull(profileColor),
animeListOptions = Optional.presentIfNotNull(
MediaListOptionsInput(
sectionOrder = Optional.presentIfNotNull(animeSectionOrder)
)
),
mangaListOptions = Optional.presentIfNotNull(
MediaListOptionsInput(
sectionOrder = Optional.presentIfNotNull(mangaSectionOrder)
)
)
)
)
.fetchPolicy(FetchPolicy.NetworkOnly)
.toFlow()
.asResult { it.UpdateUser?.options?.profileColor }
.asResult { it.UpdateUser }
}
}
2 changes: 2 additions & 0 deletions profile/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,8 @@ dependencies {
implementation(libs.hilt.navigationCompose)
ksp(libs.hilt.android.compiler)

implementation(libs.reorderable)

testImplementation(libs.test.junit)

androidTestImplementation(libs.androidx.test.junit)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -260,11 +260,11 @@ fun ProfileScreen(
user = this@run,
animeCollection = viewerAnimeLists.data,
mangaCollection = viewerMangaLists.data,
updateAnimeListsOrder = viewModel::updateAnimeLists,
updateMangaListsOrder = viewModel::updateMangaLists,
onNavigateToMediaItem = onNavigateToMediaItem,
showUserDescription = showUserDescription,
onUserDescriptionClick = {
showUserDescriptionSheet = true
},
onUserDescriptionClick = { showUserDescriptionSheet = true },
sharedTransitionScope = sharedTransitionScope,
animatedVisibilityScope = animatedVisibilityScope,
contentPadding = navigationComponentPaddingValues + insetPaddingValues,
Expand Down Expand Up @@ -482,6 +482,8 @@ private fun UserTabs(
user: User,
animeCollection: User.MediaCollection?,
mangaCollection: User.MediaCollection?,
updateAnimeListsOrder: (List<String>) -> Unit,
updateMangaListsOrder: (List<String>) -> Unit,
onNavigateToMediaItem: (MediaPage) -> Unit,
showUserDescription: Boolean,
onUserDescriptionClick: () -> Unit,
Expand Down Expand Up @@ -612,12 +614,14 @@ private fun UserTabs(
ProfileTab.ANIME -> MediaTab(
mediaCollection = animeCollection,
listVisibility = animeListVisibility,
updateMediaListsOrder = updateAnimeListsOrder,
onNavigateToMediaItem = onNavigateToMediaItem,
contentPadding = mediaTabContentPadding,
)
ProfileTab.MANGA -> MediaTab(
mediaCollection = mangaCollection,
listVisibility = mangaListVisibility,
updateMediaListsOrder = updateMangaListsOrder,
onNavigateToMediaItem = onNavigateToMediaItem,
contentPadding = mediaTabContentPadding,
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,8 @@

private val navArgs = savedStateHandle.toRoute<ProfileRoute>()
private val refreshTrigger = MutableSharedFlow<Unit>()
private val animeListsRefreshTrigger = MutableSharedFlow<Unit>()
private val mangaListsRefreshTrigger = MutableSharedFlow<Unit>()

var useNetwork = false

Expand Down Expand Up @@ -71,7 +73,7 @@
)

val viewerAnimeLists = combine(
flow = refreshTrigger.onStart { emit(Unit) },
flow = animeListsRefreshTrigger.onStart { emit(Unit) },
flow2 = combine(
preferencesRepository.viewerId.filterNotNull(),
preferencesRepository.language.filterNotNull(),
Expand All @@ -96,7 +98,7 @@
)

val viewerMangaLists = combine(
flow = refreshTrigger.onStart { emit(Unit) },
flow = mangaListsRefreshTrigger.onStart { emit(Unit) },
flow2 = combine(
preferencesRepository.viewerId.filterNotNull(),
preferencesRepository.language.filterNotNull(),
Expand All @@ -118,25 +120,53 @@
scope = viewModelScope,
started = SharingStarted.WhileSubscribed(1000),
initialValue = Resource.loading(),
)

Check warning

Code scanning / detekt

Public functions require documentation. Warning

The function logOut is missing documentation.

fun logOut() = viewModelScope.launch(Dispatchers.IO) {
with(preferencesRepository) {
setAccessToken(null)
setViewerId(null)
setViewerAvatar(null)
fun updateAnimeLists(sectionOrder: List<String>) = viewModelScope.launch(Dispatchers.IO) {

Check warning

Code scanning / detekt

Public functions require documentation. Warning

The function updateAnimeLists is missing documentation.
userRepository.updateUser(animeSectionOrder = sectionOrder).collect {
preferencesRepository.setAnimeListOrder(it.getOrNull()?.mediaListOptions?.animeList?.sectionOrder?.filterNotNull())

Check warning

Code scanning / detekt

Line detected, which is longer than the defined maximum line length in the code style. Warning

Line detected, which is longer than the defined maximum line length in the code style.
}
refreshAnimeLists()
}

fun updateMangaLists(sectionOrder: List<String>) = viewModelScope.launch(Dispatchers.IO) {

Check warning

Code scanning / detekt

Public functions require documentation. Warning

The function updateMangaLists is missing documentation.
userRepository.updateUser(mangaSectionOrder = sectionOrder).collect {
preferencesRepository.setMangaListOrder(it.getOrNull()?.mediaListOptions?.mangaList?.sectionOrder?.filterNotNull())

Check warning

Code scanning / detekt

Line detected, which is longer than the defined maximum line length in the code style. Warning

Line detected, which is longer than the defined maximum line length in the code style.
}
refreshMangaLists()
}

private fun refreshAnimeLists() = viewModelScope.launch(Dispatchers.IO) {
useNetwork = true
animeListsRefreshTrigger.emit(Unit)
useNetwork = false
}

fun refresh(setIsRefreshing: (Boolean) -> Unit) = viewModelScope.launch {
private fun refreshMangaLists() = viewModelScope.launch(Dispatchers.IO) {
useNetwork = true
mangaListsRefreshTrigger.emit(Unit)
useNetwork = false
}

fun refresh(setIsRefreshing: (Boolean) -> Unit) = viewModelScope.launch(Dispatchers.IO) {

Check warning

Code scanning / detekt

Public functions require documentation. Warning

The function refresh is missing documentation.
setIsRefreshing(true)
useNetwork = true
refreshTrigger.emit(Unit)
animeListsRefreshTrigger.emit(Unit)
mangaListsRefreshTrigger.emit(Unit)
delay(1500L)
useNetwork = false
setIsRefreshing(false)
}

fun logOut() = viewModelScope.launch(Dispatchers.IO) {
with(preferencesRepository) {
setAccessToken(null)
setViewerId(null)
setViewerAvatar(null)
}
}

val viewerAvatar = preferencesRepository.viewerAvatar
fun saveViewerAvatar(avatarUrl: String?) = viewModelScope.launch(Dispatchers.IO) {
preferencesRepository.setViewerAvatar(avatarUrl)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ import kotlinx.collections.immutable.ImmutableList
fun MediaTab(
mediaCollection: User.MediaCollection?,
listVisibility: SnapshotStateMap<Int, Boolean>,
updateMediaListsOrder: (List<String>) -> Unit,
onNavigateToMediaItem: (MediaPage) -> Unit,
modifier: Modifier = Modifier,
contentPadding: PaddingValues = PaddingValues(),
Expand All @@ -48,6 +49,7 @@ fun MediaTab(
type = mediaCollection.type,
lists = mediaCollection.namedLists,
listVisibility = listVisibility,
updateMediaListsOrder = updateMediaListsOrder,
onNavigateToMediaItem = onNavigateToMediaItem,
modifier = modifier,
contentPadding = contentPadding,
Expand All @@ -61,6 +63,7 @@ private fun UserMediaLists(
type: Media.Small.Type,
lists: ImmutableList<User.MediaCollection.NamedTrackingList>,
listVisibility: SnapshotStateMap<Int, Boolean>,
updateMediaListsOrder: (List<String>) -> Unit,
onNavigateToMediaItem: (MediaPage) -> Unit,
modifier: Modifier = Modifier,
contentPadding: PaddingValues = PaddingValues(),
Expand All @@ -69,6 +72,7 @@ private fun UserMediaLists(
type = type,
namedLists = lists,
listVisibility = listVisibility,
updateMediaListsOrder = updateMediaListsOrder,
onNavigateToMediaItem = onNavigateToMediaItem,
contentPadding = contentPadding,
modifier = modifier.fillMaxSize()
Expand Down
Loading
Loading