From d0fc8f2f1a82938e7a988094523099756cd65ad7 Mon Sep 17 00:00:00 2001 From: k1ngsterr1 Date: Tue, 3 Mar 2026 03:28:12 +0500 Subject: [PATCH] feat: implement fullscreen image viewer in SearchScreen and refactor MediaTabContent --- .../messenger/ui/chats/SearchScreen.kt | 55 +++++++++++++------ 1 file changed, 37 insertions(+), 18 deletions(-) diff --git a/app/src/main/java/com/rosetta/messenger/ui/chats/SearchScreen.kt b/app/src/main/java/com/rosetta/messenger/ui/chats/SearchScreen.kt index 8119f8d..2fc23b4 100644 --- a/app/src/main/java/com/rosetta/messenger/ui/chats/SearchScreen.kt +++ b/app/src/main/java/com/rosetta/messenger/ui/chats/SearchScreen.kt @@ -185,8 +185,18 @@ fun SearchScreen( // Focus requester для автофокуса val focusRequester = remember { FocusRequester() } + // Fullscreen image viewer state — lifted to top level for true fullscreen overlay + var showImageViewer by remember { mutableStateOf(false) } + var imageViewerInitialIndex by remember { mutableStateOf(0) } + var imageViewerImages by remember { mutableStateOf>(emptyList()) } + var imageViewerPrivateKey by remember { mutableStateOf("") } + // 🔥 Обработка системного жеста Back BackHandler { + if (showImageViewer) { + showImageViewer = false + return@BackHandler + } hideKeyboardInstantly() searchViewModel.clearSearchQuery() onBackClick() @@ -212,6 +222,7 @@ fun SearchScreen( } } + Box(modifier = Modifier.fillMaxSize()) { Scaffold( topBar = { // Хедер как в Telegram: стрелка назад + поле ввода @@ -366,7 +377,13 @@ fun SearchScreen( currentUserPublicKey = currentUserPublicKey, isDarkTheme = isDarkTheme, textColor = textColor, - secondaryTextColor = secondaryTextColor + secondaryTextColor = secondaryTextColor, + onOpenImageViewer = { images, index, privateKey -> + imageViewerImages = images + imageViewerInitialIndex = index + imageViewerPrivateKey = privateKey + showImageViewer = true + } ) } SearchTab.DOWNLOADS -> { @@ -386,7 +403,22 @@ fun SearchScreen( } } } + } // End Scaffold + + // Fullscreen image viewer overlay — rendered OUTSIDE Scaffold for true fullscreen + if (showImageViewer && imageViewerImages.isNotEmpty()) { + com.rosetta.messenger.ui.chats.components.ImageViewerScreen( + images = imageViewerImages, + initialIndex = imageViewerInitialIndex.coerceIn(0, imageViewerImages.lastIndex), + privateKey = imageViewerPrivateKey, + onDismiss = { + showImageViewer = false + imageViewerImages = emptyList() + }, + isDarkTheme = isDarkTheme + ) } + } // End outer Box } // ═══════════════════════════════════════════════════════════ @@ -800,7 +832,8 @@ private fun MediaTabContent( currentUserPublicKey: String, isDarkTheme: Boolean, textColor: Color, - secondaryTextColor: Color + secondaryTextColor: Color, + onOpenImageViewer: (images: List, initialIndex: Int, privateKey: String) -> Unit = { _, _, _ -> } ) { val context = LocalContext.current var mediaItems by remember { mutableStateOf>(emptyList()) } @@ -810,10 +843,6 @@ private fun MediaTabContent( com.rosetta.messenger.data.MessageRepository.getInstance(context).getCurrentPrivateKey().orEmpty() } - // Fullscreen image viewer state - var showImageViewer by remember { mutableStateOf(false) } - var imageViewerInitialIndex by remember { mutableStateOf(0) } - val viewerImages = remember(mediaItems) { mediaItems.map { item -> com.rosetta.messenger.ui.chats.components.ViewableImage( @@ -903,24 +932,14 @@ private fun MediaTabContent( currentUserPublicKey = currentUserPublicKey, privateKey = privateKey, onClick = { - imageViewerInitialIndex = if (index >= 0) index else 0 - showImageViewer = true + val idx = if (index >= 0) index else 0 + onOpenImageViewer(viewerImages, idx, privateKey) } ) } } } - // Fullscreen image viewer overlay - if (showImageViewer && viewerImages.isNotEmpty()) { - com.rosetta.messenger.ui.chats.components.ImageViewerScreen( - images = viewerImages, - initialIndex = imageViewerInitialIndex.coerceIn(0, viewerImages.lastIndex), - privateKey = privateKey, - onDismiss = { showImageViewer = false }, - isDarkTheme = isDarkTheme - ) - } } }