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 для автофокуса
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
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<com.rosetta.messenger.ui.chats.components.ViewableImage>, initialIndex: Int, privateKey: String) -> Unit = { _, _, _ -> }
) {
val context = LocalContext.current
var mediaItems by remember { mutableStateOf<List<MediaItem>>(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
)
}
}
}