Skip to content

Commit 64e8017

Browse files
authored
Merge branch 'feat/pubky-profile' into feat/pubky-async-image
2 parents 94b2b5a + a3ac562 commit 64e8017

35 files changed

Lines changed: 292 additions & 440 deletions

File tree

app/src/main/java/to/bitkit/env/Env.kt

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -150,11 +150,13 @@ internal object Env {
150150
const val BITREFILL_REF = "AL6dyZYt"
151151

152152
val pubkyCapabilities: String
153-
get() = when (network) {
154-
Network.BITCOIN ->
155-
"/pub/paykit.app/v0/:rw,/pub/pubky.app/profile.json:rw,/pub/pubky.app/follows/:rw"
156-
else ->
157-
"/pub/staging.paykit.app/v0/:rw,/pub/staging.pubky.app/profile.json:rw,/pub/pubky.app/follows/:rw"
153+
get() {
154+
val prefix = when (network) {
155+
Network.BITCOIN -> ""
156+
else -> "staging."
157+
}
158+
return "/pub/${prefix}paykit.app/v0/:rw," +
159+
"/pub/${prefix}pubky.app/profile.json:rw,/pub/${prefix}pubky.app/follows/:rw"
158160
}
159161

160162
val rnBackupServerHost: String

app/src/main/java/to/bitkit/ui/ContentView.kt

Lines changed: 13 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -71,8 +71,6 @@ import to.bitkit.ui.screens.profile.PubkyRingAuthScreen
7171
import to.bitkit.ui.screens.profile.PubkyRingAuthViewModel
7272
import to.bitkit.ui.screens.recovery.RecoveryMnemonicScreen
7373
import to.bitkit.ui.screens.recovery.RecoveryModeScreen
74-
import to.bitkit.ui.screens.scanner.QrScanningScreen
75-
import to.bitkit.ui.screens.scanner.SCAN_REQUEST_KEY
7674
import to.bitkit.ui.screens.settings.DevSettingsScreen
7775
import to.bitkit.ui.screens.settings.FeeSettingsScreen
7876
import to.bitkit.ui.screens.settings.LdkDebugScreen
@@ -180,13 +178,12 @@ import to.bitkit.ui.sheets.GiftSheet
180178
import to.bitkit.ui.sheets.HighBalanceWarningSheet
181179
import to.bitkit.ui.sheets.LnurlAuthSheet
182180
import to.bitkit.ui.sheets.PinSheet
181+
import to.bitkit.ui.sheets.QrScanningSheet
183182
import to.bitkit.ui.sheets.QuickPayIntroSheet
184183
import to.bitkit.ui.sheets.SendSheet
185184
import to.bitkit.ui.sheets.UpdateSheet
186-
import to.bitkit.ui.theme.TRANSITION_SHEET_MS
187185
import to.bitkit.ui.utils.AutoReadClipboardHandler
188186
import to.bitkit.ui.utils.RequestNotificationPermissions
189-
import to.bitkit.ui.utils.Transitions
190187
import to.bitkit.ui.utils.composableWithDefaultTransitions
191188
import to.bitkit.ui.utils.navigationWithDefaultTransitions
192189
import to.bitkit.utils.Logger
@@ -200,7 +197,6 @@ import to.bitkit.viewmodels.RestoreState
200197
import to.bitkit.viewmodels.SettingsViewModel
201198
import to.bitkit.viewmodels.TransferViewModel
202199
import to.bitkit.viewmodels.WalletViewModel
203-
import kotlin.time.Duration.Companion.milliseconds
204200

205201
@Suppress("CyclomaticComplexMethod")
206202
@Composable
@@ -417,6 +413,7 @@ fun ContentView(
417413
)
418414

419415
is Sheet.Gift -> GiftSheet(sheet, appViewModel)
416+
Sheet.QrScanner -> QrScanningSheet(appViewModel)
420417
is Sheet.TimedSheet -> {
421418
when (sheet.type) {
422419
TimedSheetType.APP_UPDATE -> {
@@ -490,7 +487,7 @@ fun ContentView(
490487
TabBar(
491488
onSendClick = { appViewModel.showSheet(Sheet.Send()) },
492489
onReceiveClick = { appViewModel.showSheet(Sheet.Receive) },
493-
onScanClick = { navController.navigateToScanner() },
490+
onScanClick = { appViewModel.showScannerSheet() },
494491
modifier = Modifier.align(Alignment.BottomCenter)
495492
)
496493
}
@@ -560,7 +557,6 @@ private fun RootNavHost(
560557
cjitDetailSettings(navController)
561558
lightningConnections(navController)
562559
activityItem(activityListViewModel, navController)
563-
qrScanner(appViewModel, navController)
564560
authCheck(navController)
565561
logs(navController)
566562
suggestions(navController)
@@ -702,7 +698,7 @@ private fun RootNavHost(
702698
}
703699
composableWithDefaultTransitions<Routes.FundingAdvanced> {
704700
FundingAdvancedScreen(
705-
onLnurl = { navController.navigateToScanner() },
701+
onLnurl = { appViewModel.showScannerSheet() },
706702
onManual = { navController.navigateTo(Routes.ExternalNav) },
707703
onBackClick = { navController.popBackStack() },
708704
)
@@ -717,10 +713,13 @@ private fun RootNavHost(
717713

718714
ExternalConnectionScreen(
719715
route = route,
720-
savedStateHandle = it.savedStateHandle,
721716
viewModel = viewModel,
722717
onNodeConnected = { navController.navigateTo(Routes.ExternalAmount) },
723-
onScanClick = { navController.navigateToScanner(isCalledForResult = true) },
718+
onScanClick = {
719+
appViewModel.showScannerSheet {
720+
viewModel.parseNodeUri(it)
721+
}
722+
},
724723
onBackClick = { navController.popBackStack() },
725724
)
726725
}
@@ -898,7 +897,7 @@ private fun NavGraphBuilder.settings(
898897
VssDebugScreen(navController)
899898
}
900899
composableWithDefaultTransitions<Routes.ProbingTool> {
901-
ProbingToolScreen(it.savedStateHandle, navController)
900+
ProbingToolScreen(navController)
902901
}
903902
composableWithDefaultTransitions<Routes.FeeSettings> {
904903
FeeSettingsScreen(navController)
@@ -922,6 +921,7 @@ private fun NavGraphBuilder.contacts(
922921
ContactsScreen(
923922
viewModel = viewModel,
924923
onBackClick = { navController.popBackStack() },
924+
onClickMyProfile = { navController.navigateTo(Routes.Profile) },
925925
onClickContact = { navController.navigateTo(Routes.ContactDetail(it)) },
926926
)
927927
}
@@ -1055,10 +1055,10 @@ private fun NavGraphBuilder.advancedSettings(navController: NavHostController) {
10551055
CoinSelectPreferenceScreen(navController)
10561056
}
10571057
composableWithDefaultTransitions<Routes.ElectrumConfig> {
1058-
ElectrumConfigScreen(it.savedStateHandle, navController)
1058+
ElectrumConfigScreen(navController)
10591059
}
10601060
composableWithDefaultTransitions<Routes.RgsServer> {
1061-
RgsServerScreen(it.savedStateHandle, navController)
1061+
RgsServerScreen(navController)
10621062
}
10631063
composableWithDefaultTransitions<Routes.AddressTypePreference> {
10641064
AddressTypePreferenceScreen(navController)
@@ -1250,23 +1250,6 @@ private fun NavGraphBuilder.activityItem(
12501250
}
12511251
}
12521252

1253-
private fun NavGraphBuilder.qrScanner(
1254-
appViewModel: AppViewModel,
1255-
navController: NavHostController,
1256-
) {
1257-
composableWithDefaultTransitions<Routes.QrScanner>(
1258-
enterTransition = { Transitions.slideInVertically },
1259-
popExitTransition = { Transitions.slideOutVertically },
1260-
) {
1261-
QrScanningScreen(navController = navController) { qrCode ->
1262-
appViewModel.onScanResult(
1263-
data = qrCode,
1264-
startDelay = TRANSITION_SHEET_MS.milliseconds,
1265-
)
1266-
}
1267-
}
1268-
}
1269-
12701253
private fun NavGraphBuilder.authCheck(
12711254
navController: NavHostController,
12721255
) {
@@ -1635,13 +1618,6 @@ fun NavController.navigateToActivityItem(id: String) = navigateTo(Routes.Activit
16351618

16361619
fun NavController.navigateToActivityExplore(id: String) = navigateTo(Routes.ActivityExplore(id))
16371620

1638-
fun NavController.navigateToScanner(isCalledForResult: Boolean = false) {
1639-
if (isCalledForResult) {
1640-
currentBackStackEntry?.savedStateHandle?.set(SCAN_REQUEST_KEY, true)
1641-
}
1642-
navigateTo(Routes.QrScanner)
1643-
}
1644-
16451621
fun NavController.navigateToLogDetail(fileName: String) = navigateTo(Routes.LogDetail(fileName))
16461622

16471623
fun NavController.navigateToTransactionSpeedSettings() = navigateTo(Routes.TransactionSpeedSettings)
@@ -1867,9 +1843,6 @@ sealed interface Routes {
18671843
@Serializable
18681844
data class ActivityExplore(val id: String) : Routes
18691845

1870-
@Serializable
1871-
data object QrScanner : Routes
1872-
18731846
@Serializable
18741847
data object BuyIntro : Routes
18751848

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
package to.bitkit.ui.components
2+
3+
import androidx.annotation.DrawableRes
4+
import androidx.compose.foundation.background
5+
import androidx.compose.foundation.border
6+
import androidx.compose.foundation.layout.size
7+
import androidx.compose.foundation.shape.CircleShape
8+
import androidx.compose.material3.Icon
9+
import androidx.compose.material3.IconButton
10+
import androidx.compose.runtime.Composable
11+
import androidx.compose.ui.Modifier
12+
import androidx.compose.ui.draw.clip
13+
import androidx.compose.ui.graphics.Brush
14+
import androidx.compose.ui.graphics.vector.ImageVector
15+
import androidx.compose.ui.res.painterResource
16+
import androidx.compose.ui.unit.dp
17+
import to.bitkit.ui.shared.modifiers.rememberDebouncedClick
18+
import to.bitkit.ui.theme.Colors
19+
20+
@Composable
21+
fun ActionButton(
22+
onClick: () -> Unit,
23+
@DrawableRes iconRes: Int? = null,
24+
imageVector: ImageVector? = null,
25+
enabled: Boolean = true,
26+
modifier: Modifier = Modifier,
27+
) {
28+
IconButton(
29+
onClick = rememberDebouncedClick(onClick = onClick),
30+
enabled = enabled,
31+
modifier = modifier
32+
.size(48.dp)
33+
.clip(CircleShape)
34+
.background(
35+
Brush.verticalGradient(listOf(Colors.Gray5, Colors.Gray6)),
36+
CircleShape,
37+
)
38+
.border(1.dp, Colors.White10, CircleShape)
39+
) {
40+
val tint = if (enabled) Colors.White else Colors.White32
41+
when {
42+
iconRes != null -> Icon(
43+
painter = painterResource(iconRes),
44+
contentDescription = null,
45+
tint = tint,
46+
modifier = Modifier.size(24.dp)
47+
)
48+
imageVector != null -> Icon(
49+
imageVector = imageVector,
50+
contentDescription = null,
51+
tint = tint,
52+
modifier = Modifier.size(24.dp)
53+
)
54+
}
55+
}
56+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package to.bitkit.ui.components
2+
3+
import androidx.compose.foundation.layout.Column
4+
import androidx.compose.foundation.layout.fillMaxWidth
5+
import androidx.compose.material3.HorizontalDivider
6+
import androidx.compose.runtime.Composable
7+
import androidx.compose.ui.Modifier
8+
import androidx.compose.ui.unit.dp
9+
import to.bitkit.ui.theme.Colors
10+
11+
@Composable
12+
fun LinkRow(
13+
label: String,
14+
value: String,
15+
modifier: Modifier = Modifier,
16+
) {
17+
Column(modifier = modifier.fillMaxWidth()) {
18+
VerticalSpacer(16.dp)
19+
Text13Up(text = label, color = Colors.White64)
20+
VerticalSpacer(8.dp)
21+
BodySSB(text = value)
22+
VerticalSpacer(16.dp)
23+
HorizontalDivider()
24+
}
25+
}

app/src/main/java/to/bitkit/ui/components/SheetHost.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ sealed interface Sheet {
4646
data object ForceTransfer : Sheet
4747
data class Gift(val code: String, val amount: ULong) : Sheet
4848
data object ConnectionClosed : Sheet
49+
data object QrScanner : Sheet
4950

5051
data class TimedSheet(val type: TimedSheetType) : Sheet
5152
}

app/src/main/java/to/bitkit/ui/screens/contacts/ContactDetailScreen.kt

Lines changed: 6 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package to.bitkit.ui.screens.contacts
22

33
import androidx.compose.foundation.background
4-
import androidx.compose.foundation.border
54
import androidx.compose.foundation.layout.Arrangement
65
import androidx.compose.foundation.layout.Box
76
import androidx.compose.foundation.layout.Column
@@ -13,16 +12,13 @@ import androidx.compose.foundation.layout.size
1312
import androidx.compose.foundation.rememberScrollState
1413
import androidx.compose.foundation.shape.CircleShape
1514
import androidx.compose.foundation.verticalScroll
16-
import androidx.compose.material3.CircularProgressIndicator
1715
import androidx.compose.material3.HorizontalDivider
1816
import androidx.compose.material3.Icon
19-
import androidx.compose.material3.IconButton
2017
import androidx.compose.runtime.Composable
2118
import androidx.compose.runtime.getValue
2219
import androidx.compose.ui.Alignment
2320
import androidx.compose.ui.Modifier
2421
import androidx.compose.ui.draw.clip
25-
import androidx.compose.ui.graphics.Brush
2622
import androidx.compose.ui.platform.LocalContext
2723
import androidx.compose.ui.res.painterResource
2824
import androidx.compose.ui.res.stringResource
@@ -33,17 +29,18 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle
3329
import to.bitkit.R
3430
import to.bitkit.models.PubkyProfile
3531
import to.bitkit.models.PubkyProfileLink
32+
import to.bitkit.ui.components.ActionButton
3633
import to.bitkit.ui.components.BodyM
3734
import to.bitkit.ui.components.BodySSB
35+
import to.bitkit.ui.components.GradientCircularProgressIndicator
3836
import to.bitkit.ui.components.Headline
37+
import to.bitkit.ui.components.LinkRow
3938
import to.bitkit.ui.components.PubkyImage
4039
import to.bitkit.ui.components.SecondaryButton
41-
import to.bitkit.ui.components.Text13Up
4240
import to.bitkit.ui.components.VerticalSpacer
4341
import to.bitkit.ui.scaffold.AppTopBar
4442
import to.bitkit.ui.scaffold.DrawerNavIcon
4543
import to.bitkit.ui.scaffold.ScreenColumn
46-
import to.bitkit.ui.shared.modifiers.rememberDebouncedClick
4744
import to.bitkit.ui.shared.util.shareText
4845
import to.bitkit.ui.theme.AppThemeSurface
4946
import to.bitkit.ui.theme.Colors
@@ -149,8 +146,8 @@ private fun ContactBody(
149146
VerticalSpacer(24.dp)
150147

151148
Row(horizontalArrangement = Arrangement.spacedBy(16.dp)) {
152-
ActionButton(iconRes = R.drawable.ic_copy, onClick = onClickCopy)
153-
ActionButton(iconRes = R.drawable.ic_share, onClick = onClickShare)
149+
ActionButton(onClick = onClickCopy, iconRes = R.drawable.ic_copy)
150+
ActionButton(onClick = onClickShare, iconRes = R.drawable.ic_share)
154151
}
155152

156153
VerticalSpacer(32.dp)
@@ -159,50 +156,13 @@ private fun ContactBody(
159156
}
160157
}
161158

162-
@Composable
163-
private fun ActionButton(
164-
iconRes: Int,
165-
onClick: () -> Unit,
166-
) {
167-
IconButton(
168-
onClick = rememberDebouncedClick(onClick = onClick),
169-
modifier = Modifier
170-
.size(48.dp)
171-
.clip(CircleShape)
172-
.background(
173-
Brush.verticalGradient(listOf(Colors.Gray5, Colors.Gray6)),
174-
CircleShape,
175-
)
176-
.border(1.dp, Colors.White10, CircleShape)
177-
) {
178-
Icon(
179-
painter = painterResource(iconRes),
180-
contentDescription = null,
181-
tint = Colors.White,
182-
modifier = Modifier.size(24.dp)
183-
)
184-
}
185-
}
186-
187-
@Composable
188-
private fun LinkRow(label: String, value: String) {
189-
Column(modifier = Modifier.fillMaxWidth()) {
190-
VerticalSpacer(16.dp)
191-
Text13Up(text = label, color = Colors.White64)
192-
VerticalSpacer(8.dp)
193-
BodySSB(text = value)
194-
VerticalSpacer(16.dp)
195-
HorizontalDivider()
196-
}
197-
}
198-
199159
@Composable
200160
private fun LoadingState() {
201161
Box(
202162
contentAlignment = Alignment.Center,
203163
modifier = Modifier.fillMaxSize()
204164
) {
205-
CircularProgressIndicator(color = Colors.White32)
165+
GradientCircularProgressIndicator(modifier = Modifier.size(24.dp))
206166
}
207167
}
208168

0 commit comments

Comments
 (0)