package ru.notesapp.viewmodel
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.launch
import ru.notesapp.data.SyncedNotesRepository
import ru.notesapp.data.remote.NetworkResult
import ru.notesapp.domain.Note
import ru.notesapp.domain.NoteType
class NotesViewModel(
private val repository: SyncedNotesRepository,
) : ViewModel() {
private val _uiState = MutableStateFlow<NotesUiState>(NotesUiState.Loading)
val uiState: StateFlow<NotesUiState> = _uiState.asStateFlow()
private val _isRefreshing = MutableStateFlow(false)
val isRefreshing: StateFlow<Boolean> = _isRefreshing.asStateFlow()
private val _snackbarMessage = MutableStateFlow<String?>(null)
val snackbarMessage: StateFlow<String?> = _snackbarMessage.asStateFlow()
init {
loadNotes()
}
fun loadNotes() {
viewModelScope.launch {
_uiState.value = NotesUiState.Loading
repository.observeAll().collect { notes ->
_uiState.value = if (notes.isEmpty()) NotesUiState.Empty
else NotesUiState.Success(notes)
}
}
}
fun refresh() {
viewModelScope.launch {
_isRefreshing.value = true
when (val result = repository.refresh()) {
is NetworkResult.Success -> {
val count = (uiState.value as? NotesUiState.Success)?.notes?.size ?: 0
_snackbarMessage.value = "Обновлено: $count заметок"
}
is NetworkResult.Error -> {
_snackbarMessage.value = "Ошибка сервера: ${result.code}"
}
is NetworkResult.NetworkError -> {
_snackbarMessage.value = "Нет соединения с интернетом"
}
}
_isRefreshing.value = false
}
}
fun addNote(title: String, content: String, type: NoteType) {
viewModelScope.launch {
repository.add(
Note(0, title, content, System.currentTimeMillis(), type)
)
}
}
fun deleteNote(id: Long) {
viewModelScope.launch {
repository.delete(id)
}
}
fun clearSnackbarMessage() {
_snackbarMessage.value = null
}
}