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