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


package ru.notesapp.ui

import android.util.Log
import androidx.compose.foundation.layout.padding
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Add
import androidx.compose.material.icons.filled.Search
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.FloatingActionButton
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.Scaffold
import androidx.compose.material3.SnackbarHost
import androidx.compose.material3.SnackbarHostState
import androidx.compose.material3.SnackbarResult
import androidx.compose.material3.Text
import androidx.compose.material3.TopAppBar
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.Modifier
import androidx.compose.ui.tooling.preview.Preview
import kotlinx.coroutines.launch
import ru.notesapp.domain.Note
import ru.notesapp.domain.NoteType
import ru.notesapp.ui.theme.NotesAppTheme

private const val TAG = "NotesApp"

@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun NotesListScreen(
    notes: List<Note>,
    onNoteClick: (Note) -> Unit,
    modifier: Modifier = Modifier,
) {
    val snackbarHostState = remember { SnackbarHostState() }
    val scope = rememberCoroutineScope()

    Scaffold(
        modifier = modifier,
        topBar = {
            TopAppBar(
                title = { Text("Заметки") },
                actions = {
                    IconButton(onClick = { /* поиск — на будущих практиках */ }) {
                        Icon(
                            imageVector = Icons.Default.Search,
                            contentDescription = "Поиск",
                        )
                    }
                },
            )
        },
        floatingActionButton = {
            FloatingActionButton(
                onClick = {
                    scope.launch {
                        val result = snackbarHostState.showSnackbar(
                            message = "Создание новой заметки",
                            actionLabel = "Отмена",
                        )
                        if (result == SnackbarResult.ActionPerformed) {
                            Log.d(TAG, "Action: ОТМЕНА")
                        }
                    }
                },
            ) {
                Icon(
                    imageVector = Icons.Default.Add,
                    contentDescription = "Добавить заметку",
                )
            }
        },
        snackbarHost = { SnackbarHost(hostState = snackbarHostState) },
    ) { innerPadding ->
        NoteList(
            notes = notes,
            onClick = onNoteClick,
            modifier = Modifier.padding(innerPadding),
        )
    }
}

// ---------- @Preview ----------
@Preview(showBackground = true)
@Composable
private fun NotesListScreenPreview() {
    val now = System.currentTimeMillis()
    NotesAppTheme {
        NotesListScreen(
            notes = listOf(
                Note(1L, "Список покупок",
                    "Молоко, хлеб, яйца, сыр, масло, овощи", now, NoteType.Text),
                Note(2L, "Фото заката",
                    "Красивый закат на берегу моря", now, NoteType.Image),
                Note(3L, "Идея проекта",
                    "Приложение для заметок с синхронизацией", now, NoteType.Audio),
            ),
            onNoteClick = {},
        )
    }
}

@Preview(showBackground = true)
@Composable
private fun NotesListScreenEmptyPreview() {
    NotesAppTheme {
        NotesListScreen(
            notes = emptyList(),
            onNoteClick = {},
        )
    }
}