From 64690d11f9765d7be2a2afa862c71dcdbcdd9e93 Mon Sep 17 00:00:00 2001 From: m Date: Fri, 11 Sep 2026 23:07:23 +0200 Subject: [PATCH] add recente document --- .../vaultdrop/mobile/data/local/dao/FileDao.kt | 9 +++++++++ .../mobile/data/repository/FileRepository.kt | 5 +++++ .../vaultdrop/mobile/ui/search/SearchScreen.kt | 16 +++++++++++++--- .../mobile/ui/search/SearchViewModel.kt | 9 +++++++-- .../app/src/main/res/values-en/strings.xml | 1 + .../app/src/main/res/values/strings.xml | 1 + 6 files changed, 36 insertions(+), 5 deletions(-) diff --git a/mobile-kotlin/app/src/main/java/com/vaultdrop/mobile/data/local/dao/FileDao.kt b/mobile-kotlin/app/src/main/java/com/vaultdrop/mobile/data/local/dao/FileDao.kt index d50cc60..00c5adf 100644 --- a/mobile-kotlin/app/src/main/java/com/vaultdrop/mobile/data/local/dao/FileDao.kt +++ b/mobile-kotlin/app/src/main/java/com/vaultdrop/mobile/data/local/dao/FileDao.kt @@ -33,6 +33,15 @@ interface FileDao { """) fun searchWithFilters(query: String?, category: String?): Flow> + @Query(""" + SELECT * FROM files + WHERE "exists" = 1 + AND (:category IS NULL OR category = :category) + ORDER BY added_at DESC, name ASC + LIMIT :limit + """) + fun recentFiles(category: String?, limit: Int): Flow> + @Upsert suspend fun upsert(file: FileEntity) diff --git a/mobile-kotlin/app/src/main/java/com/vaultdrop/mobile/data/repository/FileRepository.kt b/mobile-kotlin/app/src/main/java/com/vaultdrop/mobile/data/repository/FileRepository.kt index 9b2cc98..924e751 100644 --- a/mobile-kotlin/app/src/main/java/com/vaultdrop/mobile/data/repository/FileRepository.kt +++ b/mobile-kotlin/app/src/main/java/com/vaultdrop/mobile/data/repository/FileRepository.kt @@ -39,6 +39,10 @@ class FileRepository @Inject constructor( category = category, ) + /** Les `limit` fichiers les plus récemment ajoutés, filtrés par catégorie. */ + fun recentFiles(category: String?, limit: Int = RECENT_LIMIT): Flow> = + fileDao.recentFiles(category = category, limit = limit) + suspend fun getFile(resourceId: String): FileEntity? = fileDao.getByResourceId(resourceId) @@ -122,6 +126,7 @@ class FileRepository @Inject constructor( companion object { private const val PAGE_SIZE = 50 + private const val RECENT_LIMIT = 5 } } diff --git a/mobile-kotlin/app/src/main/java/com/vaultdrop/mobile/ui/search/SearchScreen.kt b/mobile-kotlin/app/src/main/java/com/vaultdrop/mobile/ui/search/SearchScreen.kt index de13043..80cc152 100644 --- a/mobile-kotlin/app/src/main/java/com/vaultdrop/mobile/ui/search/SearchScreen.kt +++ b/mobile-kotlin/app/src/main/java/com/vaultdrop/mobile/ui/search/SearchScreen.kt @@ -164,10 +164,10 @@ private fun SearchResults( onOpenDocument: (String) -> Unit, modifier: Modifier = Modifier, ) { - val hasQueryOrCategory = uiState.query.isNotBlank() || uiState.selectedCategory != null + val hasQuery = uiState.query.isNotBlank() when { - !hasQueryOrCategory -> Box( + !hasQuery && uiState.results.isEmpty() -> Box( modifier = modifier.fillMaxSize(), contentAlignment = Alignment.Center, ) { @@ -180,7 +180,7 @@ private fun SearchResults( ) } - uiState.results.isEmpty() -> Box( + hasQuery && uiState.results.isEmpty() -> Box( modifier = modifier.fillMaxSize(), contentAlignment = Alignment.Center, ) { @@ -196,6 +196,16 @@ private fun SearchResults( contentPadding = PaddingValues(bottom = 16.dp), verticalArrangement = Arrangement.spacedBy(10.dp), ) { + if (!hasQuery) { + item(key = "recent-header") { + Text( + text = stringResource(R.string.search_recent), + style = MaterialTheme.typography.titleMedium, + fontWeight = FontWeight.SemiBold, + modifier = Modifier.padding(top = 4.dp), + ) + } + } items(uiState.results, key = { it.resourceId }) { file -> SearchResultCard(file = file, onClick = { onOpenDocument(file.resourceId) }) } diff --git a/mobile-kotlin/app/src/main/java/com/vaultdrop/mobile/ui/search/SearchViewModel.kt b/mobile-kotlin/app/src/main/java/com/vaultdrop/mobile/ui/search/SearchViewModel.kt index d2c7f85..9840a44 100644 --- a/mobile-kotlin/app/src/main/java/com/vaultdrop/mobile/ui/search/SearchViewModel.kt +++ b/mobile-kotlin/app/src/main/java/com/vaultdrop/mobile/ui/search/SearchViewModel.kt @@ -31,8 +31,13 @@ class SearchViewModel @Inject constructor( _selectedCategory, ) { query, category -> CategoryQuery(query, category) } .flatMapLatest { (query, category) -> - fileRepository.searchFiles(query, category) - .map { files -> SearchUiState(query, category, files) } + val trimmed = query.trim() + val flow = if (trimmed.isEmpty()) { + fileRepository.recentFiles(category) + } else { + fileRepository.searchFiles(trimmed, category) + } + flow.map { files -> SearchUiState(query, category, files) } } .stateIn( scope = viewModelScope, diff --git a/mobile-kotlin/app/src/main/res/values-en/strings.xml b/mobile-kotlin/app/src/main/res/values-en/strings.xml index 327c00d..22ab478 100644 --- a/mobile-kotlin/app/src/main/res/values-en/strings.xml +++ b/mobile-kotlin/app/src/main/res/values-en/strings.xml @@ -32,6 +32,7 @@ Search Search for a document… Type a search or pick a category + Recent documents No results All PDF diff --git a/mobile-kotlin/app/src/main/res/values/strings.xml b/mobile-kotlin/app/src/main/res/values/strings.xml index eb28665..0412064 100644 --- a/mobile-kotlin/app/src/main/res/values/strings.xml +++ b/mobile-kotlin/app/src/main/res/values/strings.xml @@ -33,6 +33,7 @@ Recherche Rechercher un document… Saisis une recherche ou choisis une catégorie + Documents récents Aucun résultat Tous PDF