feat: implement fullscreen image viewer in SearchScreen and refactor MediaTabContent

This commit is contained in:
2026-03-03 03:28:12 +05:00
parent 86d42c8e10
commit d0fc8f2f1a

View File

@@ -185,8 +185,18 @@ fun SearchScreen(
// Focus requester для автофокуса // Focus requester для автофокуса
val focusRequester = remember { FocusRequester() } 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<List<com.rosetta.messenger.ui.chats.components.ViewableImage>>(emptyList()) }
var imageViewerPrivateKey by remember { mutableStateOf("") }
// 🔥 Обработка системного жеста Back // 🔥 Обработка системного жеста Back
BackHandler { BackHandler {
if (showImageViewer) {
showImageViewer = false
return@BackHandler
}
hideKeyboardInstantly() hideKeyboardInstantly()
searchViewModel.clearSearchQuery() searchViewModel.clearSearchQuery()
onBackClick() onBackClick()
@@ -212,6 +222,7 @@ fun SearchScreen(
} }
} }
Box(modifier = Modifier.fillMaxSize()) {
Scaffold( Scaffold(
topBar = { topBar = {
// Хедер как в Telegram: стрелка назад + поле ввода // Хедер как в Telegram: стрелка назад + поле ввода
@@ -366,7 +377,13 @@ fun SearchScreen(
currentUserPublicKey = currentUserPublicKey, currentUserPublicKey = currentUserPublicKey,
isDarkTheme = isDarkTheme, isDarkTheme = isDarkTheme,
textColor = textColor, textColor = textColor,
secondaryTextColor = secondaryTextColor secondaryTextColor = secondaryTextColor,
onOpenImageViewer = { images, index, privateKey ->
imageViewerImages = images
imageViewerInitialIndex = index
imageViewerPrivateKey = privateKey
showImageViewer = true
}
) )
} }
SearchTab.DOWNLOADS -> { 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, currentUserPublicKey: String,
isDarkTheme: Boolean, isDarkTheme: Boolean,
textColor: Color, textColor: Color,
secondaryTextColor: Color secondaryTextColor: Color,
onOpenImageViewer: (images: List<com.rosetta.messenger.ui.chats.components.ViewableImage>, initialIndex: Int, privateKey: String) -> Unit = { _, _, _ -> }
) { ) {
val context = LocalContext.current val context = LocalContext.current
var mediaItems by remember { mutableStateOf<List<MediaItem>>(emptyList()) } var mediaItems by remember { mutableStateOf<List<MediaItem>>(emptyList()) }
@@ -810,10 +843,6 @@ private fun MediaTabContent(
com.rosetta.messenger.data.MessageRepository.getInstance(context).getCurrentPrivateKey().orEmpty() 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) { val viewerImages = remember(mediaItems) {
mediaItems.map { item -> mediaItems.map { item ->
com.rosetta.messenger.ui.chats.components.ViewableImage( com.rosetta.messenger.ui.chats.components.ViewableImage(
@@ -903,24 +932,14 @@ private fun MediaTabContent(
currentUserPublicKey = currentUserPublicKey, currentUserPublicKey = currentUserPublicKey,
privateKey = privateKey, privateKey = privateKey,
onClick = { onClick = {
imageViewerInitialIndex = if (index >= 0) index else 0 val idx = if (index >= 0) index else 0
showImageViewer = true 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
)
}
} }
} }