mirror of
https://github.com/permissionlesstech/bitchat-android.git
synced 2026-08-08 06:46:11 +00:00
* Automated update of relay data - Sun Sep 21 06:21:05 UTC 2025 * Automated update of relay data - Sun Sep 28 06:20:40 UTC 2025 * refactor: new close button like ios(but not liquid glass) * Automated update of relay data - Sun Oct 5 06:20:09 UTC 2025 * Automated update of relay data - Sun Oct 12 06:20:12 UTC 2025 * Automated update of relay data - Sun Oct 19 06:21:51 UTC 2025 * Automated update of relay data - Sun Oct 26 06:21:31 UTC 2025 * Automated update of relay data - Sun Nov 2 06:22:16 UTC 2025 * Automated update of relay data - Sun Nov 9 06:21:43 UTC 2025 * Automated update of relay data - Sun Nov 16 06:22:37 UTC 2025 * Automated update of relay data - Sun Nov 23 06:22:51 UTC 2025 * Automated update of relay data - Sun Nov 30 06:24:08 UTC 2025 * Automated update of relay data - Sun Dec 7 06:22:59 UTC 2025 * Automated update of relay data - Sun Dec 14 06:24:33 UTC 2025 * Automated update of relay data - Sun Dec 21 06:24:49 UTC 2025 * Automated update of relay data - Sun Dec 28 06:25:38 UTC 2025 * Automated update of relay data - Sun Jan 4 06:26:28 UTC 2026 * refactor: Extract CloseButton to core UI components * feat: Add BitchatBottomSheet component * refactor: Use BitchatBottomSheet component and minor ui change(CloseButton, colors) * Refactor: Use BitchatBottomSheet in MeshPeerListSheet --------- Co-authored-by: GitHub Action <action@github.com>
99 lines
3.6 KiB
Kotlin
99 lines
3.6 KiB
Kotlin
package com.bitchat.android.ui
|
|
|
|
import androidx.compose.foundation.layout.*
|
|
import androidx.compose.material3.*
|
|
import androidx.compose.runtime.Composable
|
|
import androidx.compose.runtime.getValue
|
|
import androidx.compose.runtime.remember
|
|
import androidx.compose.ui.Alignment
|
|
import androidx.compose.ui.Modifier
|
|
import androidx.compose.ui.platform.LocalContext
|
|
import androidx.compose.ui.unit.dp
|
|
import androidx.lifecycle.compose.collectAsStateWithLifecycle
|
|
import com.bitchat.android.core.ui.component.sheet.BitchatBottomSheet
|
|
import com.bitchat.android.geohash.GeohashChannelLevel
|
|
import com.bitchat.android.geohash.LocationChannelManager
|
|
|
|
/**
|
|
* Presenter component for LocationNotesSheet
|
|
* Handles sheet presentation logic with proper error states
|
|
* Extracts this logic from ChatScreen for better separation of concerns
|
|
*/
|
|
@OptIn(ExperimentalMaterial3Api::class)
|
|
@Composable
|
|
fun LocationNotesSheetPresenter(
|
|
viewModel: ChatViewModel,
|
|
onDismiss: () -> Unit
|
|
) {
|
|
val context = LocalContext.current
|
|
val locationManager = remember { LocationChannelManager.getInstance(context) }
|
|
val availableChannels by locationManager.availableChannels.collectAsStateWithLifecycle()
|
|
val nickname by viewModel.nickname.collectAsStateWithLifecycle()
|
|
|
|
// iOS pattern: notesGeohash ?? LocationChannelManager.shared.availableChannels.first(where: { $0.level == .building })?.geohash
|
|
val buildingGeohash = availableChannels.firstOrNull { it.level == GeohashChannelLevel.BUILDING }?.geohash
|
|
|
|
if (buildingGeohash != null) {
|
|
// Get location name from locationManager
|
|
val locationNames by locationManager.locationNames.collectAsStateWithLifecycle()
|
|
val locationName = locationNames[GeohashChannelLevel.BUILDING]
|
|
?: locationNames[GeohashChannelLevel.BLOCK]
|
|
|
|
LocationNotesSheet(
|
|
geohash = buildingGeohash,
|
|
locationName = locationName,
|
|
nickname = nickname,
|
|
onDismiss = onDismiss
|
|
)
|
|
} else {
|
|
// No building geohash available - show error state (matches iOS)
|
|
LocationNotesErrorSheet(
|
|
onDismiss = onDismiss,
|
|
locationManager = locationManager
|
|
)
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Error sheet when location is unavailable
|
|
*/
|
|
@OptIn(ExperimentalMaterial3Api::class)
|
|
@Composable
|
|
private fun LocationNotesErrorSheet(
|
|
onDismiss: () -> Unit,
|
|
locationManager: LocationChannelManager
|
|
) {
|
|
BitchatBottomSheet(
|
|
onDismissRequest = onDismiss,
|
|
) {
|
|
Column(
|
|
modifier = Modifier
|
|
.fillMaxWidth()
|
|
.padding(24.dp),
|
|
horizontalAlignment = Alignment.CenterHorizontally
|
|
) {
|
|
Text(
|
|
text = "Location Unavailable",
|
|
style = MaterialTheme.typography.titleMedium,
|
|
color = MaterialTheme.colorScheme.onSurface
|
|
)
|
|
Spacer(modifier = Modifier.height(16.dp))
|
|
Text(
|
|
text = "Location permission is required for notes",
|
|
style = MaterialTheme.typography.bodyMedium,
|
|
color = MaterialTheme.colorScheme.onSurfaceVariant
|
|
)
|
|
Spacer(modifier = Modifier.height(24.dp))
|
|
Button(onClick = {
|
|
// UNIFIED FIX: Enable location services first (user toggle)
|
|
locationManager.enableLocationServices()
|
|
// Then request location channels (which will also request permission if needed)
|
|
locationManager.enableLocationChannels()
|
|
locationManager.refreshChannels()
|
|
}) {
|
|
Text("Enable Location")
|
|
}
|
|
}
|
|
}
|
|
}
|