11package to.bitkit.ui.screens.shop.shopDiscover
22
33import android.annotation.SuppressLint
4+ import android.view.MotionEvent
45import android.view.ViewGroup
56import android.webkit.WebView
67import androidx.annotation.StringRes
78import androidx.compose.foundation.background
89import androidx.compose.foundation.layout.Arrangement
910import androidx.compose.foundation.layout.Box
1011import androidx.compose.foundation.layout.Column
12+ import androidx.compose.foundation.layout.PaddingValues
1113import androidx.compose.foundation.layout.Row
1214import androidx.compose.foundation.layout.fillMaxWidth
1315import androidx.compose.foundation.layout.padding
1416import androidx.compose.foundation.layout.size
1517import androidx.compose.foundation.lazy.LazyColumn
1618import androidx.compose.foundation.lazy.items
19+ import androidx.compose.foundation.pager.HorizontalPager
20+ import androidx.compose.foundation.pager.rememberPagerState
1721import androidx.compose.foundation.shape.CircleShape
1822import androidx.compose.material3.CircularProgressIndicator
1923import androidx.compose.material3.HorizontalDivider
@@ -22,16 +26,19 @@ import androidx.compose.runtime.Composable
2226import androidx.compose.runtime.getValue
2327import androidx.compose.runtime.mutableStateOf
2428import androidx.compose.runtime.remember
29+ import androidx.compose.runtime.rememberCoroutineScope
2530import androidx.compose.runtime.setValue
2631import androidx.compose.ui.Alignment
2732import androidx.compose.ui.Modifier
2833import androidx.compose.ui.draw.clip
2934import androidx.compose.ui.res.painterResource
3035import androidx.compose.ui.res.stringResource
3136import androidx.compose.ui.tooling.preview.Preview
37+ import androidx.compose.ui.unit.Dp
3238import androidx.compose.ui.unit.dp
3339import androidx.compose.ui.viewinterop.AndroidView
3440import kotlinx.collections.immutable.toImmutableList
41+ import kotlinx.coroutines.launch
3542import to.bitkit.R
3643import to.bitkit.env.Env
3744import to.bitkit.ext.configureForBasicWebContent
@@ -42,6 +49,7 @@ import to.bitkit.ui.components.Text13Up
4249import to.bitkit.ui.components.VerticalSpacer
4350import to.bitkit.ui.scaffold.AppTopBar
4451import to.bitkit.ui.scaffold.DrawerNavIcon
52+ import to.bitkit.ui.scaffold.PinnedTabsScaffold
4553import to.bitkit.ui.scaffold.ScreenColumn
4654import to.bitkit.ui.screens.wallets.activity.components.CustomTabRowWithSpacing
4755import to.bitkit.ui.screens.wallets.activity.components.TabItem
@@ -64,26 +72,39 @@ fun ShopDiscoverScreen(
6472 modifier : Modifier = Modifier ,
6573) {
6674 val tabs = remember { ShopDiscoverTab .entries.toImmutableList() }
67- var selectedTab by remember { mutableStateOf(ShopDiscoverTab .Shop ) }
75+ val pagerState = rememberPagerState(pageCount = { tabs.size })
76+ val scope = rememberCoroutineScope()
6877
6978 ScreenColumn (modifier = modifier) {
70- AppTopBar (
71- titleText = stringResource(R .string.other__shop__discover__nav_title),
72- onBackClick = onBack,
73- actions = { DrawerNavIcon () },
74- )
79+ PinnedTabsScaffold (
80+ header = {
81+ Column (modifier = Modifier .fillMaxWidth()) {
82+ AppTopBar (
83+ titleText = stringResource(R .string.other__shop__discover__nav_title),
84+ onBackClick = onBack,
85+ actions = { DrawerNavIcon () },
86+ )
7587
76- CustomTabRowWithSpacing (
77- tabs = tabs,
78- currentTabIndex = tabs.indexOf(selectedTab),
79- selectedColor = Colors .White ,
80- onTabChange = { selectedTab = it },
81- modifier = Modifier .padding(horizontal = 16 .dp)
82- )
88+ CustomTabRowWithSpacing (
89+ tabs = tabs,
90+ currentTabIndex = pagerState.currentPage,
91+ selectedColor = Colors .White ,
92+ onTabChange = { scope.launch { pagerState.animateScrollToPage(tabs.indexOf(it)) } },
93+ modifier = Modifier .padding(horizontal = 16 .dp)
94+ )
95+ }
96+ }
97+ ) { topPadding ->
98+ HorizontalPager (state = pagerState) { page ->
99+ when (tabs[page]) {
100+ ShopDiscoverTab .Shop -> ShopTabContent (
101+ navigateWebView = navigateWebView,
102+ contentPadding = PaddingValues (top = topPadding, bottom = 42 .dp),
103+ )
83104
84- when (selectedTab) {
85- ShopDiscoverTab . Shop -> ShopTabContent (navigateWebView = navigateWebView)
86- ShopDiscoverTab . Map -> MapTabContent ()
105+ ShopDiscoverTab . Map -> MapTabContent (topPadding = topPadding)
106+ }
107+ }
87108 }
88109 }
89110}
@@ -92,8 +113,10 @@ fun ShopDiscoverScreen(
92113private fun ShopTabContent (
93114 navigateWebView : (String , String ) -> Unit ,
94115 modifier : Modifier = Modifier ,
116+ contentPadding : PaddingValues = PaddingValues (0.dp),
95117) {
96118 LazyColumn (
119+ contentPadding = contentPadding,
97120 modifier = modifier.padding(horizontal = 16 .dp)
98121 ) {
99122 item {
@@ -213,10 +236,11 @@ private fun ShopTabContent(
213236 }
214237}
215238
216- @SuppressLint(" SetJavaScriptEnabled" )
239+ @SuppressLint(" SetJavaScriptEnabled" , " ClickableViewAccessibility " )
217240@Composable
218241private fun MapTabContent (
219242 modifier : Modifier = Modifier ,
243+ topPadding : Dp = 0.dp,
220244) {
221245 var isLoading by remember { mutableStateOf(true ) }
222246
@@ -229,7 +253,7 @@ private fun MapTabContent(
229253 Box (
230254 contentAlignment = Alignment .Center ,
231255 modifier = modifier
232- .padding(top = 16 .dp, start = 16 .dp, end = 16 .dp)
256+ .padding(start = 16 .dp, end = 16 .dp, top = topPadding + 16 .dp)
233257 .clip(Shapes .medium)
234258 ) {
235259 AndroidView (
@@ -242,6 +266,20 @@ private fun MapTabContent(
242266
243267 this .webViewClient = webViewClient
244268 configureForBasicWebContent()
269+ // Keep the parent HorizontalPager from intercepting horizontal pans while the user is
270+ // interacting with the map. Outside the WebView bounds the pager still swipes normally.
271+ setOnTouchListener { view, event ->
272+ when (event.actionMasked) {
273+ MotionEvent .ACTION_DOWN ,
274+ MotionEvent .ACTION_MOVE ,
275+ -> view.parent?.requestDisallowInterceptTouchEvent(true )
276+
277+ MotionEvent .ACTION_UP ,
278+ MotionEvent .ACTION_CANCEL ,
279+ -> view.parent?.requestDisallowInterceptTouchEvent(false )
280+ }
281+ false
282+ }
245283 loadUrl(Env .BTC_MAP_URL )
246284 }
247285 },
0 commit comments