Skip to content

Commit

Permalink
refactor/#16 : 에피소드 firebase 업로드 로직 설정
Browse files Browse the repository at this point in the history
  • Loading branch information
TaewoongR committed Feb 18, 2025
1 parent 58708b1 commit 6d2c3be
Show file tree
Hide file tree
Showing 3 changed files with 52 additions and 22 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,19 @@ package com.boostcamp.mapisode.episode.UseCase
import com.boostcamp.mapisode.episode.repository.DatabaseRepository
import com.boostcamp.mapisode.episode.repository.EpisodeRepository
import com.boostcamp.mapisode.model.EpisodeModel
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import javax.inject.Inject

class UploadNewEpisodeUseCase @Inject constructor(
private val episodeRepository: EpisodeRepository,
private val databaseRepository: DatabaseRepository,
) {
suspend fun invoke(episodeModel: EpisodeModel) {
databaseRepository.insertEpisode(episodeModel)
val urls = episodeRepository.uploadImagesToStorage(episodeModel.id, episodeModel.imageUrls)
episodeRepository.createEpisode(episodeModel, urls)
episodeRepository.updateEpisode(episodeModel)
CoroutineScope(Dispatchers.IO).launch {
episodeRepository.createEpisode(episodeModel, urls)
}
}
}
Original file line number Diff line number Diff line change
@@ -1,12 +1,16 @@
package com.boostcamp.mapisode.episode

import androidx.lifecycle.viewModelScope
import com.boostcamp.mapisode.common.util.UuidGenerator
import com.boostcamp.mapisode.datastore.UserPreferenceDataStore
import com.boostcamp.mapisode.episode.UseCase.UploadNewEpisodeUseCase
import com.boostcamp.mapisode.episode.common.NewEpisodeConstant.MAP_DEFAULT_ZOOM
import com.boostcamp.mapisode.episode.repository.GroupRepository
import com.boostcamp.mapisode.episode.state.EpisodeEffect
import com.boostcamp.mapisode.episode.state.EpisodeIntent
import com.boostcamp.mapisode.episode.state.EpisodeState
import com.boostcamp.mapisode.model.EpisodeLatLng
import com.boostcamp.mapisode.model.EpisodeModel
import com.boostcamp.mapisode.network.repository.NaverMapsRepository
import com.boostcamp.mapisode.ui.base.RevisedBaseViewModel
import com.boostcamp.mapisode.ui.base.retainFirstIfNavigating
Expand All @@ -21,11 +25,13 @@ import kotlinx.coroutines.flow.SharedFlow
import kotlinx.coroutines.flow.firstOrNull
import kotlinx.coroutines.launch
import timber.log.Timber
import java.util.Date
import javax.inject.Inject

@HiltViewModel
class EpisodeViewModel @Inject constructor(
private val userPreferenceDataStore: UserPreferenceDataStore,
private val uploadNewEpisodeUseCase: UploadNewEpisodeUseCase,
private val groupRepository: GroupRepository,
private val naverMapsRepository: NaverMapsRepository,
private val imageCaptionRepository: ImageCaptionRepository,
Expand Down Expand Up @@ -102,9 +108,38 @@ class EpisodeViewModel @Inject constructor(

EpisodeIntent.OnCompleteInfoPick -> {
sendState { copy(isLoading = true) }
delay(2000L)
sendEffect { EpisodeEffect.ShowToast("에피소드가 업로드 되었습니다.") }
sendEffect { EpisodeEffect.NavigateBackToHomeScreen }
val episodeId = UuidGenerator.generate()
viewModelScope.launch {
currentState.selectedGroups.forEach { groupModel ->
val userPreference =
userPreferenceDataStore.getUserPreferencesFlow().firstOrNull()
userPreference?.let {
uploadNewEpisodeUseCase.invoke(
EpisodeModel(
id = episodeId,
category = "see",
content = currentState.userInput,
createdBy = it.userId ?: "",
createdByName = it.username ?: "",
group = groupModel.id,
imageUrls = currentState.imageUrls,
imageUrlsUsedForOnlyUpdate = emptyList(),
address = currentState.episodeAddress,
location = EpisodeLatLng(
latitude = currentState.cameraPosition.target.latitude,
longitude = currentState.cameraPosition.target.longitude,
),
memoryDate = Date(),
tags = emptyList(),
title = currentState.selectedEpisode,
createdAt = Date(),
),
)
}
}
sendState { copy(isLoading = false) }
sendEffect { EpisodeEffect.NavigateBackToHomeScreen }
}
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
Expand Down Expand Up @@ -77,12 +77,8 @@ fun EpisodeContentRoute(
EpisodeContentScreen(
uiState = uiState,
context = context,
onUserInputChange = { viewModel.sendIntent(EpisodeIntent.OnUserInputChange(it)) },
onValueChange = { text -> viewModel.sendIntent(EpisodeIntent.OnUserInputChange(text)) },
onGenerateLLMClick = { viewModel.sendIntent(EpisodeIntent.OnGenerateLLMClick) },
onSelectEpisodeClick = { generatedEpisode ->
viewModel.sendIntent(EpisodeIntent.OnSelectEpisodeClick(generatedEpisode))
},
onSelfTypedEpisodeChange = { viewModel.sendIntent(EpisodeIntent.OnSelfTypedEpisodeChange(it)) },
onCompleteInfoPick = { viewModel.sendIntent(EpisodeIntent.OnCompleteInfoPick) },
onBackClick = { viewModel.sendIntent(EpisodeIntent.OnBackClick) },
)
Expand Down Expand Up @@ -110,18 +106,12 @@ fun EpisodeContentRoute(
fun EpisodeContentScreen(
uiState: EpisodeState,
context: Context,
onUserInputChange: (String) -> Unit,
onValueChange: (String) -> Unit,
onGenerateLLMClick: () -> Unit,
onSelectEpisodeClick: (String) -> Unit,
onSelfTypedEpisodeChange: (String) -> Unit,
onCompleteInfoPick: () -> Unit,
onBackClick: () -> Unit,
) {
var valueChanged by remember { mutableStateOf(uiState.userInput) }

LaunchedEffect(uiState.userInput) {
valueChanged = uiState.userInput
}
var valueChanged by rememberSaveable { mutableStateOf(uiState.userInput) }

Scaffold(
modifier = Modifier
Expand Down Expand Up @@ -179,6 +169,7 @@ fun EpisodeContentScreen(
value = valueChanged,
onValueChange = { text ->
valueChanged = text
onValueChange(text)
},
modifier = Modifier.aspectRatio(1.5f),
placeholder = "경험을 자유롭게 적어주세요.\nAI 추천을 받기 위한 내용을 입력하시면 더 정확한 추천을 받을 수 있어요.",
Expand Down Expand Up @@ -231,6 +222,7 @@ fun EpisodeContentScreen(
onClick = {
if (generatedEpisode.isNotBlank()) {
valueChanged += " $generatedEpisode"
onValueChange(valueChanged)
}
},
borderColor = MapisodeTheme.colorScheme.chipUnselectedStroke,
Expand All @@ -252,8 +244,8 @@ fun EpisodeContentScreen(
onClick = {
onCompleteInfoPick()
},
text = if (uiState.isEpisodeSelected) "완료" else "내용을 입력해주세요",
enabled = uiState.isEpisodeSelected,
text = if (valueChanged.isNotBlank()) "완료" else "내용을 입력해주세요",
enabled = valueChanged.isNotBlank(),
showRipple = true,
)
Spacer(modifier = Modifier.height(10.dp))
Expand Down

0 comments on commit 6d2c3be

Please sign in to comment.