From cf061f24f6ac1f26c145a268f0b512d7c957a977 Mon Sep 17 00:00:00 2001 From: null Date: Tue, 30 Jun 2026 18:14:12 -0500 Subject: [PATCH] feat(date-memories): add date memory marking logic to DateMatchesViewModel --- .../closer/ui/dates/DateMatchesViewModel.kt | 35 ++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/app/closer/ui/dates/DateMatchesViewModel.kt b/app/src/main/java/app/closer/ui/dates/DateMatchesViewModel.kt index 90996771..4c47b896 100644 --- a/app/src/main/java/app/closer/ui/dates/DateMatchesViewModel.kt +++ b/app/src/main/java/app/closer/ui/dates/DateMatchesViewModel.kt @@ -3,9 +3,11 @@ package app.closer.ui.dates import android.util.Log import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope +import app.closer.data.remote.FirestoreDateMemoryDataSource import app.closer.data.repository.DateIdeaSeed import app.closer.domain.model.DateIdea import app.closer.domain.model.DateMatch +import app.closer.domain.model.DateMemory import app.closer.domain.model.DateMatchSuggestion import app.closer.domain.model.DateSwipe import app.closer.domain.model.SwipeAction @@ -16,8 +18,11 @@ import app.closer.domain.repository.UserRepository import dagger.hilt.android.lifecycle.HiltViewModel import javax.inject.Inject import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.SharedFlow import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asSharedFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.combine import kotlinx.coroutines.launch @@ -42,16 +47,44 @@ class DateMatchesViewModel @Inject constructor( private val repository: DateMatchRepository, private val authRepository: AuthRepository, private val coupleRepository: CoupleRepository, - private val userRepository: UserRepository + private val userRepository: UserRepository, + private val memoryDataSource: FirestoreDateMemoryDataSource ) : ViewModel() { private val _uiState = MutableStateFlow(DateMatchesUiState()) val uiState: StateFlow = _uiState.asStateFlow() + /** Emits the dateId to open its reflection screen right after a date is marked done. */ + private val _markedDateId = MutableSharedFlow(extraBufferCapacity = 1) + val markedDateId: SharedFlow = _markedDateId.asSharedFlow() + init { loadMatches() } + /** Log a matched date as completed (idempotent) → then open its reflection. */ + fun markCompleted(match: DateMatch) { + val cid = _uiState.value.coupleId ?: return + val uid = authRepository.currentUserId ?: return + val idea = match.dateIdea ?: DateIdeaSeed.byId(match.dateIdeaId) + viewModelScope.launch { + runCatching { + memoryDataSource.markCompleted( + cid, + DateMemory( + id = match.id, + dateIdeaId = match.dateIdeaId, + title = idea?.title ?: "", + category = idea?.category ?: "", + completedAt = System.currentTimeMillis(), + addedBy = uid + ) + ) + }.onSuccess { _markedDateId.tryEmit(match.id) } + .onFailure { Log.w(TAG, "markCompleted failed", it) } + } + } + private fun loadMatches() { viewModelScope.launch { _uiState.value = DateMatchesUiState(isLoading = true)