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


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
import ru.notesapp.ui.theme.ThemeVariant

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(Icons.Default.Search, contentDescription = "Поиск")
                    }
                },
            )
        },
        floatingActionButton = {
            FloatingActionButton(
                onClick = {
                    scope.launch {
                        val result = snackbarHostState.showSnackbar(
                            message = "Создание новой заметки",
                            actionLabel = "Отмена",
                        )
                        if (result == SnackbarResult.ActionPerformed) {
                            Log.d(TAG, "Action: ОТМЕНА")
                        }
                    }
                },
            ) {
                Icon(Icons.Default.Add, contentDescription = "Добавить заметку")
            }
        },
        snackbarHost = { SnackbarHost(hostState = snackbarHostState) },
    ) { innerPadding ->
        NoteList(
            notes = notes,
            onClick = onNoteClick,
            modifier = Modifier.padding(innerPadding),
        )
    }
}

// ============================================================
// Общие данные для preview
// ============================================================
private fun previewNotes(): List<Note> {
    val now = System.currentTimeMillis()
    return listOf(
        Note(1L, "Список покупок",
            "Молоко, хлеб, яйца, сыр, масло, овощи", now, NoteType.Text),
        Note(2L, "Фото заката",
            "Красивый закат на берегу моря", now, NoteType.Image),
        Note(3L, "Идея проекта",
            "Приложение для заметок с синхронизацией", now, NoteType.Audio),
    )
}

// ============================================================
// 4 @Preview: Pastel Light, Pastel Dark, Forest Light, Forest Dark
// ============================================================

@Preview(name = "Pastel Light", showBackground = true)
@Composable
private fun NotesListScreenPastelLightPreview() {
    NotesAppTheme(
        darkTheme = false,
        themeVariant = ThemeVariant.PASTEL,
        dynamicColor = false,
    ) {
        NotesListScreen(
            notes = previewNotes(),
            onNoteClick = {},
        )
    }
}

@Preview(name = "Pastel Dark", showBackground = true)
@Composable
private fun NotesListScreenPastelDarkPreview() {
    NotesAppTheme(
        darkTheme = true,
        themeVariant = ThemeVariant.PASTEL,
        dynamicColor = false,
    ) {
        NotesListScreen(
            notes = previewNotes(),
            onNoteClick = {},
        )
    }
}

@Preview(name = "Forest Light", showBackground = true)
@Composable
private fun NotesListScreenForestLightPreview() {
    NotesAppTheme(
        darkTheme = false,
        themeVariant = ThemeVariant.FOREST,
        dynamicColor = false,
    ) {
        NotesListScreen(
            notes = previewNotes(),
            onNoteClick = {},
        )
    }
}

@Preview(name = "Forest Dark", showBackground = true)
@Composable
private fun NotesListScreenForestDarkPreview() {
    NotesAppTheme(
        darkTheme = true,
        themeVariant = ThemeVariant.FOREST,
        dynamicColor = false,
    ) {
        NotesListScreen(
            notes = previewNotes(),
            onNoteClick = {},
        )
    }
}