Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions AndroidDemo/app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -179,6 +179,7 @@ dependencies {
// Required transitive dependencies when using AAR:
implementation(libs.androidxWebkit)
implementation(libs.androidxDatastorePreferences)
implementation(libs.androidxTracing)

implementation(libs.kotlinxSerializationJson)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -115,5 +115,5 @@ data class WalletRecord(
* User preferences for the demo app.
*/
data class UserPreferences(
val activeWalletAddress: String? = null,
val activeWalletId: String? = null,
)
Original file line number Diff line number Diff line change
Expand Up @@ -133,7 +133,7 @@ class SecureDemoAppStorage(context: Context) : DemoAppStorage {

override suspend fun saveUserPreferences(preferences: UserPreferences): Unit = withContext(Dispatchers.IO) {
userPrefs.edit().apply {
preferences.activeWalletAddress?.let {
preferences.activeWalletId?.let {
putString(PREF_ACTIVE_WALLET, it)
} ?: remove(PREF_ACTIVE_WALLET)
}.apply()
Expand All @@ -143,7 +143,7 @@ class SecureDemoAppStorage(context: Context) : DemoAppStorage {
override suspend fun loadUserPreferences(): UserPreferences? = withContext(Dispatchers.IO) {
val activeWallet = userPrefs.getString(PREF_ACTIVE_WALLET, null)
if (activeWallet != null) {
UserPreferences(activeWalletAddress = activeWallet)
UserPreferences(activeWalletId = activeWallet)
} else {
null
}
Expand Down Expand Up @@ -201,7 +201,7 @@ class SecureDemoAppStorage(context: Context) : DemoAppStorage {
private const val WALLET_PREFS_NAME = "walletkit_demo_wallets"
private const val USER_PREFS_NAME = "walletkit_demo_prefs"
private const val WALLET_PREFIX = "wallet:"
private const val PREF_ACTIVE_WALLET = "active_wallet_address"
private const val PREF_ACTIVE_WALLET = "active_wallet_id"
private const val PREF_PASSWORD_HASH = "password_hash"
private const val KEY_MNEMONIC = "mnemonic"
private const val KEY_NAME = "name"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,14 +42,14 @@ interface WalletActions {
fun onOpenBrowser(url: String, injectTonConnect: Boolean = true)
fun onRefresh()
fun onDismissSheet()
fun onWalletDetails(address: String)
fun onSendFromWallet(address: String)
fun onStakeFromWallet(address: String)
fun onWalletDetails(walletId: String)
fun onSendFromWallet(walletId: String)
fun onStakeFromWallet(walletId: String)
fun onDisconnectSession(sessionId: String)
fun onToggleWalletSwitcher()
fun onSwitchWallet(address: String)
fun onRemoveWallet(address: String)
fun onRenameWallet(address: String, newName: String)
fun onSwitchWallet(walletId: String)
fun onRemoveWallet(walletId: String)
fun onRenameWallet(walletId: String, newName: String)
fun onImportWallet(
name: String,
network: TONNetwork,
Expand All @@ -69,7 +69,7 @@ interface WalletActions {
fun onRejectSignMessage(request: SignMessageRequestUi)
fun onConfirmSignerApproval()
fun onCancelSignerApproval()
fun onRefreshTransactions(address: String)
fun onRefreshTransactions(walletId: String)
fun onTransactionClick(transactionHash: String, walletAddress: String)
fun onHandleUrl(url: String)
fun onDismissUrlPrompt()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,21 +54,21 @@ class WalletActionsImpl @Inject constructor(

override fun onDismissSheet() = viewModel.dismissSheet()

override fun onWalletDetails(address: String) = viewModel.showWalletDetails(address)
override fun onWalletDetails(walletId: String) = viewModel.showWalletDetails(walletId)

override fun onSendFromWallet(address: String) = viewModel.openSendTransactionSheet(address)
override fun onSendFromWallet(walletId: String) = viewModel.openSendTransactionSheet(walletId)

override fun onStakeFromWallet(address: String) = viewModel.openStakingSheet(address)
override fun onStakeFromWallet(walletId: String) = viewModel.openStakingSheet(walletId)

override fun onDisconnectSession(sessionId: String) = viewModel.disconnectSession(sessionId)

override fun onToggleWalletSwitcher() = viewModel.toggleWalletSwitcher()

override fun onSwitchWallet(address: String) = viewModel.switchWallet(address)
override fun onSwitchWallet(walletId: String) = viewModel.switchWallet(walletId)

override fun onRemoveWallet(address: String) = viewModel.removeWallet(address)
override fun onRemoveWallet(walletId: String) = viewModel.removeWallet(walletId)

override fun onRenameWallet(address: String, newName: String) = viewModel.renameWallet(address, newName)
override fun onRenameWallet(walletId: String, newName: String) = viewModel.renameWallet(walletId, newName)

override fun onImportWallet(
name: String,
Expand Down Expand Up @@ -106,7 +106,7 @@ class WalletActionsImpl @Inject constructor(

override fun onCancelSignerApproval() = viewModel.cancelSignerApproval()

override fun onRefreshTransactions(address: String) = viewModel.refreshTransactions(address)
override fun onRefreshTransactions(walletId: String) = viewModel.refreshTransactions(walletId)

override fun onTransactionClick(transactionHash: String, walletAddress: String) = viewModel.showTransactionDetail(transactionHash, walletAddress)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ import io.ton.walletkit.api.generated.TONTransaction
import io.ton.walletkit.demo.domain.model.WalletInterfaceType

data class WalletSummary(
val walletId: String,
val address: String,
val name: String,
val network: TONNetwork,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ data class WalletUiState(
val initialized: Boolean = false,
val status: String = "",
val wallets: List<WalletSummary> = emptyList(),
val activeWalletAddress: String? = null,
val activeWalletId: String? = null,
val sessions: List<SessionSummary> = emptyList(),
val sheetState: SheetState = SheetState.None,
val previousSheet: SheetState? = null, // Used to restore sheet after modal interactions
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -76,37 +76,37 @@ import io.ton.walletkit.demo.presentation.ui.preview.PreviewData
@Composable
fun WalletSwitcher(
wallets: List<WalletSummary>,
activeWalletAddress: String?,
activeWalletId: String?,
isExpanded: Boolean,
onToggle: () -> Unit,
onSwitchWallet: (String) -> Unit,
onRemoveWallet: (String) -> Unit,
onRenameWallet: (String, String) -> Unit,
modifier: Modifier = Modifier,
) {
var editingWalletAddress by rememberSaveable { mutableStateOf<String?>(null) }
var editingWalletId by rememberSaveable { mutableStateOf<String?>(null) }
var editingName by rememberSaveable { mutableStateOf("") }
var walletToDelete by remember { mutableStateOf<WalletSummary?>(null) }

val activeWallet = wallets.firstOrNull { it.address == activeWalletAddress }
val activeWallet = wallets.firstOrNull { it.walletId == activeWalletId }

fun startEdit(wallet: WalletSummary) {
editingWalletAddress = wallet.address
editingWalletId = wallet.walletId
editingName = wallet.name
}

fun saveEdit() {
editingWalletAddress?.let { address ->
editingWalletId?.let { walletId ->
if (editingName.isNotBlank()) {
onRenameWallet(address, editingName.trim())
onRenameWallet(walletId, editingName.trim())
}
editingWalletAddress = null
editingWalletId = null
editingName = ""
}
}

fun cancelEdit() {
editingWalletAddress = null
editingWalletId = null
editingName = ""
}

Expand Down Expand Up @@ -188,8 +188,8 @@ fun WalletSwitcher(
verticalArrangement = Arrangement.spacedBy(WALLET_LIST_ITEM_SPACING),
) {
wallets.forEach { wallet ->
val isActive = wallet.address == activeWalletAddress
val isEditing = editingWalletAddress == wallet.address
val isActive = wallet.walletId == activeWalletId
val isEditing = editingWalletId == wallet.walletId

OutlinedCard(
modifier = Modifier.fillMaxWidth(),
Expand Down Expand Up @@ -277,7 +277,7 @@ fun WalletSwitcher(

Row {
if (!isActive) {
IconButton(onClick = { onSwitchWallet(wallet.address) }) {
IconButton(onClick = { onSwitchWallet(wallet.walletId) }) {
Icon(
imageVector = Icons.Default.SwapHoriz,
contentDescription = stringResource(R.string.action_switch),
Expand Down Expand Up @@ -327,7 +327,7 @@ fun WalletSwitcher(
style = MaterialTheme.typography.bodySmall,
fontFamily = FontFamily.Monospace,
)
if (wallet.address == activeWalletAddress && wallets.size > 1) {
if (wallet.walletId == activeWalletId && wallets.size > 1) {
Spacer(modifier = Modifier.height(DIALOG_SPACING))
Text(
text = stringResource(R.string.wallet_switcher_remove_warning),
Expand All @@ -340,7 +340,7 @@ fun WalletSwitcher(
confirmButton = {
TextButton(
onClick = {
onRemoveWallet(wallet.address)
onRemoveWallet(wallet.walletId)
walletToDelete = null
},
) {
Expand Down Expand Up @@ -380,11 +380,13 @@ private fun WalletSwitcherPreview() {
val wallets = listOf(
PreviewData.wallet,
PreviewData.wallet.copy(
walletId = "wallet-2",
address = "EQD9876543210",
name = "Wallet 2",
balance = "123.45",
),
PreviewData.wallet.copy(
walletId = "wallet-3",
address = "EQD1111111111",
name = "Wallet 3",
balance = "0.50",
Expand All @@ -393,7 +395,7 @@ private fun WalletSwitcherPreview() {

WalletSwitcher(
wallets = wallets,
activeWalletAddress = wallets.first().address,
activeWalletId = wallets.first().walletId,
isExpanded = true,
onToggle = {},
onSwitchWallet = {},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ import org.json.JSONObject

object PreviewData {
val wallet: WalletSummary = WalletSummary(
walletId = "preview-wallet-id",
address = "EQpreviewaddressExampleToShowWalletKit123",
name = "Preview Wallet",
network = TONNetwork.MAINNET,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -159,7 +159,7 @@ fun LegacyWalletScreen(
val session = if (browserSheet.injectTonConnect) injectedSession else plainSession
if (session.tabs.isEmpty()) session.openTab(browserSheet.url)
}
val activeWallet = state.wallets.firstOrNull { it.address == state.activeWalletAddress }
val activeWallet = state.wallets.firstOrNull { it.walletId == state.activeWalletId }
?: state.wallets.firstOrNull()
if (showSheet) {
ModalBottomSheet(
Expand Down Expand Up @@ -339,7 +339,7 @@ fun LegacyWalletScreen(
if (state.wallets.size > 1) {
WalletSwitcher(
wallets = state.wallets,
activeWalletAddress = state.activeWalletAddress,
activeWalletId = state.activeWalletId,
isExpanded = state.isWalletSwitcherExpanded,
onToggle = actions::onToggleWalletSwitcher,
onSwitchWallet = actions::onSwitchWallet,
Expand Down Expand Up @@ -425,7 +425,7 @@ fun LegacyWalletScreen(
activeWallet?.let { wallet ->
val nftDetails = NFTDetails.from(nft)
NFTDetailsScreen(
walletAddress = wallet.address,
walletId = wallet.walletId,
walletKit = walletKit,
nftDetails = nftDetails,
onClose = { selectedNFT = null },
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ import io.ton.walletkit.demo.presentation.viewmodel.NFTDetailsViewModel
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun NFTDetailsScreen(
walletAddress: String,
walletId: String,
walletKit: ITONWalletKit,
nftDetails: NFTDetails,
onClose: () -> Unit,
Expand All @@ -87,9 +87,9 @@ fun NFTDetailsScreen(
var wallet by remember { mutableStateOf<ITONWallet?>(null) }
var isLoadingWallet by remember { mutableStateOf(true) }

LaunchedEffect(walletAddress) {
LaunchedEffect(walletId) {
isLoadingWallet = true
wallet = walletKit.getWallets().firstOrNull { it.address().value == walletAddress }
wallet = walletKit.getWallet(walletId)
isLoadingWallet = false
}

Expand Down Expand Up @@ -124,7 +124,7 @@ fun NFTDetailsScreen(
}

val viewModel: NFTDetailsViewModel = viewModel(
key = walletAddress + nftDetails.contractAddress,
key = walletId + nftDetails.contractAddress,
factory = NFTDetailsViewModel.factory(wallet!!, nftDetails),
)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -73,12 +73,12 @@ fun SendTransactionScreen(
walletKit: ITONWalletKit,
onBack: () -> Unit,
) {
var tonWallet by remember(wallet.address) { mutableStateOf<ITONWallet?>(null) }
var resolving by remember(wallet.address) { mutableStateOf(true) }
var tonWallet by remember(wallet.walletId) { mutableStateOf<ITONWallet?>(null) }
var resolving by remember(wallet.walletId) { mutableStateOf(true) }

LaunchedEffect(wallet.address) {
LaunchedEffect(wallet.walletId) {
resolving = true
tonWallet = walletKit.getWallets().firstOrNull { it.address().value == wallet.address }
tonWallet = walletKit.getWallet(wallet.walletId)
resolving = false
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -269,7 +269,7 @@ fun WalletScreen(
val session = if (browserSheet.injectTonConnect) injectedSession else plainSession
if (session.tabs.isEmpty()) session.openTab(browserSheet.url)
}
val activeWallet = state.wallets.firstOrNull { it.address == state.activeWalletAddress }
val activeWallet = state.wallets.firstOrNull { it.walletId == state.activeWalletId }
?: state.wallets.firstOrNull()
if (showSheet) {
ModalBottomSheet(
Expand Down Expand Up @@ -392,7 +392,7 @@ fun WalletScreen(
)
}

val activeIndex = state.wallets.indexOfFirst { it.address == state.activeWalletAddress }
val activeIndex = state.wallets.indexOfFirst { it.walletId == state.activeWalletId }
val homeTitle = if (activeIndex >= 0) "Wallet ${activeIndex + 1}" else "Wallet"
val homeAddress = activeWallet?.address.orEmpty()
val nftsList by (nftsViewModel?.nfts?.collectAsState() ?: remember { mutableStateOf(emptyList<TONNFT>()) })
Expand All @@ -418,7 +418,7 @@ fun WalletScreen(

// Reset the sub-screen on wallet switch so the user lands on home for the
// new wallet (mirrors iOS NavigationStack popping on `.id(active.id)`).
LaunchedEffect(state.activeWalletAddress) {
LaunchedEffect(state.activeWalletId) {
subScreen = HomeSubScreen.None
}
if (subScreen != HomeSubScreen.None) {
Expand Down Expand Up @@ -550,9 +550,9 @@ fun WalletScreen(
},
assets = assetItems,
nfts = nftPreviews,
onSend = { activeWallet?.let { actions.onSendFromWallet(it.address) } },
onSend = { activeWallet?.let { actions.onSendFromWallet(it.walletId) } },
onSwap = { actions.onSwapClick() },
onStake = { activeWallet?.let { actions.onStakeFromWallet(it.address) } },
onStake = { activeWallet?.let { actions.onStakeFromWallet(it.walletId) } },
onShowAllAssets = { subScreen = HomeSubScreen.AllAssets },
onShowAllNFTs = { subScreen = HomeSubScreen.AllNFTs },
onNFTTap = { preview ->
Expand All @@ -579,9 +579,9 @@ fun WalletScreen(
) {
WalletsBottomSheet(
wallets = state.wallets,
activeWalletAddress = state.activeWalletAddress,
activeWalletId = state.activeWalletId,
onSelect = { wallet ->
actions.onSwitchWallet(wallet.address)
actions.onSwitchWallet(wallet.walletId)
showWalletsSheet = false
},
onCopyAddress = { address ->
Expand All @@ -594,7 +594,7 @@ fun WalletScreen(
},
onDelete = { wallet ->
showWalletsSheet = false
actions.onRemoveWallet(wallet.address)
actions.onRemoveWallet(wallet.walletId)
},
onClose = { showWalletsSheet = false },
)
Expand All @@ -613,7 +613,7 @@ fun WalletScreen(
activeWallet?.let { wallet ->
val nftDetails = NFTDetails.from(nft)
NFTDetailsScreen(
walletAddress = wallet.address,
walletId = wallet.walletId,
walletKit = walletKit,
nftDetails = nftDetails,
onClose = { selectedNFT = null },
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -73,9 +73,9 @@ fun WalletsSection(
} else {
WalletCard(
wallet = activeWallet,
onDetails = { onWalletSelected(activeWallet.address) },
onSend = { onSendFromWallet(activeWallet.address) },
onStake = { onStakeFromWallet(activeWallet.address) },
onDetails = { onWalletSelected(activeWallet.walletId) },
onSend = { onSendFromWallet(activeWallet.walletId) },
onStake = { onStakeFromWallet(activeWallet.walletId) },
isStreamingConnected = isStreamingConnected,
onRefresh = onRefresh,
)
Expand Down
Loading