feat: implement fullscreen image viewer in SearchScreen and refactor MediaTabContent
This commit is contained in:
@@ -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
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user