Загрузка данных


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
    }
}