Add link between lexiconDetail and questDetail

This commit is contained in:
Thomas Andres Gomez 2023-08-02 11:00:24 +02:00
parent b17eefac39
commit 4967989315
3 changed files with 23 additions and 5 deletions

View file

@ -1,9 +1,7 @@
package com.pixelized.rplexicon.repository package com.pixelized.rplexicon.repository
import android.net.Uri
import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.derivedStateOf
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.core.net.toUri
import com.google.api.client.extensions.android.http.AndroidHttp import com.google.api.client.extensions.android.http.AndroidHttp
import com.google.api.client.json.gson.GsonFactory import com.google.api.client.json.gson.GsonFactory
import com.google.api.services.sheets.v4.Sheets import com.google.api.services.sheets.v4.Sheets
@ -42,6 +40,10 @@ class LexiconRepository @Inject constructor(
private val _data = MutableStateFlow<List<Lexicon>>(emptyList()) private val _data = MutableStateFlow<List<Lexicon>>(emptyList())
val data: StateFlow<List<Lexicon>> get() = _data val data: StateFlow<List<Lexicon>> 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) @Throws(ServiceNotReady::class, IncompatibleSheetStructure::class, Exception::class)
suspend fun fetchLexicon() { suspend fun fetchLexicon() {
val service = sheetService val service = sheetService

View file

@ -3,6 +3,7 @@ package com.pixelized.rplexicon.ui.screens.quest.detail
import android.content.res.Configuration import android.content.res.Configuration
import android.net.Uri import android.net.Uri
import androidx.compose.foundation.Image import androidx.compose.foundation.Image
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.PaddingValues 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.LazyListOffset
import com.pixelized.rplexicon.ui.composable.remember.rememberLazyListOffset import com.pixelized.rplexicon.ui.composable.remember.rememberLazyListOffset
import com.pixelized.rplexicon.ui.navigation.LocalScreenNavHost 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.ui.theme.LexiconTheme
import com.pixelized.rplexicon.utilitary.extentions.lexicon import com.pixelized.rplexicon.utilitary.extentions.lexicon
import java.lang.Integer.min import java.lang.Integer.min
@ -69,6 +71,7 @@ data class QuestDetailUio(
data class QuestStep( data class QuestStep(
val completed: Boolean, val completed: Boolean,
val subtitle: String?, val subtitle: String?,
val giverId: Int? = null,
val giver: String?, val giver: String?,
val place: String?, val place: String?,
val individualReward: String?, val individualReward: String?,
@ -87,6 +90,7 @@ data class AnnotatedQuestDetailUio(
data class AnnotatedQuestStep( data class AnnotatedQuestStep(
val completed: Boolean, val completed: Boolean,
val subtitle: String?, val subtitle: String?,
val giverId: Int?,
val giver: String?, val giver: String?,
val place: String?, val place: String?,
val individualReward: String?, val individualReward: String?,
@ -117,6 +121,7 @@ private fun QuestDetailUio.QuestStep.annotate(): AnnotatedQuestDetailUio.Annotat
AnnotatedQuestDetailUio.AnnotatedQuestStep( AnnotatedQuestDetailUio.AnnotatedQuestStep(
completed = completed, completed = completed,
subtitle = subtitle, subtitle = subtitle,
giverId = giverId,
giver = giver, giver = giver,
place = place, place = place,
individualReward = individualReward, individualReward = individualReward,
@ -146,6 +151,7 @@ fun QuestDetailScreen(
modifier = Modifier.fillMaxSize(), modifier = Modifier.fillMaxSize(),
item = viewModel.quest, item = viewModel.quest,
onBack = { screen.popBackStack() }, onBack = { screen.popBackStack() },
onGiver = { screen.navigateToLexiconDetail(id = it) }
) )
} }
} }
@ -156,6 +162,7 @@ private fun QuestDetailContent(
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
item: State<QuestDetailUio>, item: State<QuestDetailUio>,
onBack: () -> Unit, onBack: () -> Unit,
onGiver: (Int) -> Unit,
) { ) {
val state = rememberLazyListState() val state = rememberLazyListState()
val annotatedQuest = item.value.annotate() val annotatedQuest = item.value.annotate()
@ -263,7 +270,12 @@ private fun QuestDetailContent(
} }
} }
quest.giver?.let { quest.giver?.let {
Column { Column(
modifier = Modifier.clickable(
enabled = quest.giverId != null,
onClick = { quest.giverId?.let { onGiver(it) } }
)
) {
Text( Text(
style = MaterialTheme.typography.bodyMedium, style = MaterialTheme.typography.bodyMedium,
fontWeight = FontWeight.Bold, fontWeight = FontWeight.Bold,
@ -347,6 +359,7 @@ private fun QuestDetailPreview(
QuestDetailContent( QuestDetailContent(
item = preview, item = preview,
onBack = { }, onBack = { },
onGiver = { },
) )
} }
} }

View file

@ -4,6 +4,7 @@ import androidx.compose.runtime.State
import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableStateOf
import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.SavedStateHandle
import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModel
import com.pixelized.rplexicon.repository.LexiconRepository
import com.pixelized.rplexicon.repository.QuestRepository import com.pixelized.rplexicon.repository.QuestRepository
import com.pixelized.rplexicon.ui.navigation.screens.questDetailArgument import com.pixelized.rplexicon.ui.navigation.screens.questDetailArgument
import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.lifecycle.HiltViewModel
@ -12,13 +13,14 @@ import javax.inject.Inject
@HiltViewModel @HiltViewModel
class QuestDetailViewModel @Inject constructor( class QuestDetailViewModel @Inject constructor(
savedStateHandle: SavedStateHandle, savedStateHandle: SavedStateHandle,
repository: QuestRepository, questRepository: QuestRepository,
lexiconRepository: LexiconRepository,
) : ViewModel() { ) : ViewModel() {
val quest: State<QuestDetailUio> val quest: State<QuestDetailUio>
init { init {
val argument = savedStateHandle.questDetailArgument val argument = savedStateHandle.questDetailArgument
val source = repository.data.value[argument.id] val source = questRepository.data.value[argument.id]
quest = mutableStateOf( quest = mutableStateOf(
QuestDetailUio( QuestDetailUio(
@ -29,6 +31,7 @@ class QuestDetailViewModel @Inject constructor(
QuestDetailUio.QuestStep( QuestDetailUio.QuestStep(
completed = entry.complete, completed = entry.complete,
subtitle = entry.subtitle, subtitle = entry.subtitle,
giverId = lexiconRepository.findId(entry.questGiver),
giver = entry.questGiver, giver = entry.questGiver,
place = entry.area, place = entry.area,
individualReward = entry.individualReward, individualReward = entry.individualReward,