From 496798931526daf0229003086347e0dd392773e7 Mon Sep 17 00:00:00 2001 From: Thomas Andres Gomez Date: Wed, 2 Aug 2023 11:00:24 +0200 Subject: [PATCH] Add link between lexiconDetail and questDetail --- .../rplexicon/repository/LexiconRepository.kt | 6 ++++-- .../ui/screens/quest/detail/QuestDetailScreen.kt | 15 ++++++++++++++- .../screens/quest/detail/QuestDetailViewModel.kt | 7 +++++-- 3 files changed, 23 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/pixelized/rplexicon/repository/LexiconRepository.kt b/app/src/main/java/com/pixelized/rplexicon/repository/LexiconRepository.kt index 4e0592f..c88bf6d 100644 --- a/app/src/main/java/com/pixelized/rplexicon/repository/LexiconRepository.kt +++ b/app/src/main/java/com/pixelized/rplexicon/repository/LexiconRepository.kt @@ -1,9 +1,7 @@ package com.pixelized.rplexicon.repository -import android.net.Uri import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.getValue -import androidx.core.net.toUri import com.google.api.client.extensions.android.http.AndroidHttp import com.google.api.client.json.gson.GsonFactory import com.google.api.services.sheets.v4.Sheets @@ -42,6 +40,10 @@ class LexiconRepository @Inject constructor( private val _data = MutableStateFlow>(emptyList()) val data: StateFlow> get() = _data + fun findId(name: String?): Int? { + return name?.let { _data.value.firstOrNull { item -> item.name == it }?.id } + } + @Throws(ServiceNotReady::class, IncompatibleSheetStructure::class, Exception::class) suspend fun fetchLexicon() { val service = sheetService diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/quest/detail/QuestDetailScreen.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/quest/detail/QuestDetailScreen.kt index 704827d..32a9212 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/screens/quest/detail/QuestDetailScreen.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/screens/quest/detail/QuestDetailScreen.kt @@ -3,6 +3,7 @@ package com.pixelized.rplexicon.ui.screens.quest.detail import android.content.res.Configuration import android.net.Uri import androidx.compose.foundation.Image +import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues @@ -54,6 +55,7 @@ import com.pixelized.rplexicon.ui.composable.BackgroundImage import com.pixelized.rplexicon.ui.composable.remember.LazyListOffset import com.pixelized.rplexicon.ui.composable.remember.rememberLazyListOffset import com.pixelized.rplexicon.ui.navigation.LocalScreenNavHost +import com.pixelized.rplexicon.ui.navigation.screens.navigateToLexiconDetail import com.pixelized.rplexicon.ui.theme.LexiconTheme import com.pixelized.rplexicon.utilitary.extentions.lexicon import java.lang.Integer.min @@ -69,6 +71,7 @@ data class QuestDetailUio( data class QuestStep( val completed: Boolean, val subtitle: String?, + val giverId: Int? = null, val giver: String?, val place: String?, val individualReward: String?, @@ -87,6 +90,7 @@ data class AnnotatedQuestDetailUio( data class AnnotatedQuestStep( val completed: Boolean, val subtitle: String?, + val giverId: Int?, val giver: String?, val place: String?, val individualReward: String?, @@ -117,6 +121,7 @@ private fun QuestDetailUio.QuestStep.annotate(): AnnotatedQuestDetailUio.Annotat AnnotatedQuestDetailUio.AnnotatedQuestStep( completed = completed, subtitle = subtitle, + giverId = giverId, giver = giver, place = place, individualReward = individualReward, @@ -146,6 +151,7 @@ fun QuestDetailScreen( modifier = Modifier.fillMaxSize(), item = viewModel.quest, onBack = { screen.popBackStack() }, + onGiver = { screen.navigateToLexiconDetail(id = it) } ) } } @@ -156,6 +162,7 @@ private fun QuestDetailContent( modifier: Modifier = Modifier, item: State, onBack: () -> Unit, + onGiver: (Int) -> Unit, ) { val state = rememberLazyListState() val annotatedQuest = item.value.annotate() @@ -263,7 +270,12 @@ private fun QuestDetailContent( } } quest.giver?.let { - Column { + Column( + modifier = Modifier.clickable( + enabled = quest.giverId != null, + onClick = { quest.giverId?.let { onGiver(it) } } + ) + ) { Text( style = MaterialTheme.typography.bodyMedium, fontWeight = FontWeight.Bold, @@ -347,6 +359,7 @@ private fun QuestDetailPreview( QuestDetailContent( item = preview, onBack = { }, + onGiver = { }, ) } } diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/quest/detail/QuestDetailViewModel.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/quest/detail/QuestDetailViewModel.kt index 23ca609..c3a494b 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/screens/quest/detail/QuestDetailViewModel.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/screens/quest/detail/QuestDetailViewModel.kt @@ -4,6 +4,7 @@ import androidx.compose.runtime.State import androidx.compose.runtime.mutableStateOf import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.ViewModel +import com.pixelized.rplexicon.repository.LexiconRepository import com.pixelized.rplexicon.repository.QuestRepository import com.pixelized.rplexicon.ui.navigation.screens.questDetailArgument import dagger.hilt.android.lifecycle.HiltViewModel @@ -12,13 +13,14 @@ import javax.inject.Inject @HiltViewModel class QuestDetailViewModel @Inject constructor( savedStateHandle: SavedStateHandle, - repository: QuestRepository, + questRepository: QuestRepository, + lexiconRepository: LexiconRepository, ) : ViewModel() { val quest: State init { val argument = savedStateHandle.questDetailArgument - val source = repository.data.value[argument.id] + val source = questRepository.data.value[argument.id] quest = mutableStateOf( QuestDetailUio( @@ -29,6 +31,7 @@ class QuestDetailViewModel @Inject constructor( QuestDetailUio.QuestStep( completed = entry.complete, subtitle = entry.subtitle, + giverId = lexiconRepository.findId(entry.questGiver), giver = entry.questGiver, place = entry.area, individualReward = entry.individualReward,