Skip to content

Commit

Permalink
feat: Support deepLink on tablet
Browse files Browse the repository at this point in the history
  • Loading branch information
sirambd committed Dec 13, 2024
1 parent b092ed7 commit 4cd7c7e
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 30 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -63,13 +63,12 @@ fun TransferDetailsScreen(
transferUuid: String,
direction: TransferDirection,
navigateBack: (() -> Unit)?,
isDeepLink: Boolean = false,
transferDetailsViewModel: TransferDetailsViewModel = hiltViewModel<TransferDetailsViewModel>(),
) {
val uiState by transferDetailsViewModel.uiState.collectAsStateWithLifecycle()

LaunchedEffect(transferUuid) {
transferDetailsViewModel.loadTransfer(transferUuid, isDeepLink)
transferDetailsViewModel.loadTransfer(transferUuid)
}

if (uiState is Delete) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,26 +54,28 @@ class TransferDetailsViewModel @Inject constructor(

val checkedFiles: SnapshotStateMap<String, Boolean> = mutableStateMapOf()

fun loadTransfer(transferUuid: String, isDeeplink: Boolean) {
fun loadTransfer(transferUuid: String) {
viewModelScope.launch {
if (isDeeplink) handleTransferDeeplink(transferUuid)
_transferUuidFlow.emit(transferUuid)
if (!isDeeplink) transferManager.fetchTransfer(transferUuid)
runCatching {
val transfer = transferManager.getTransferFlow(transferUuid).first()
if (transfer == null) handleTransferDeeplink(transferUuid)
_transferUuidFlow.emit(transferUuid)
if (transfer != null) transferManager.fetchTransfer(transferUuid)
}.onFailure { exception ->
SentryLog.e(TAG, "Failure on load a transfer", exception)
}
}
}

fun getTransferUrl(transferUuid: String): String = sharedApiUrlCreator.shareTransferUrl(transferUuid)

private suspend fun handleTransferDeeplink(transferUuid: String) {
runCatching {
val transfer = transferManager.getTransferFlow(transferUuid).first()
if (transfer == null) {
transferManager.addTransferByLinkUUID(
linkUUID = transferUuid,
password = null,
transferDirection = TransferDirection.RECEIVED,
)
}
transferManager.addTransferByLinkUUID(
linkUUID = transferUuid,
password = null,
transferDirection = TransferDirection.RECEIVED,
)
}.onFailure { exception ->
SentryLog.e(TAG, "An error has occurred when deeplink a transfer", exception)
// TODO: Handle errors
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,6 @@ import com.infomaniak.swisstransfer.ui.screen.main.received.ReceivedScreen
import com.infomaniak.swisstransfer.ui.screen.main.sent.SentScreen
import com.infomaniak.swisstransfer.ui.screen.main.transferdetails.TransferDetailsScreen
import com.infomaniak.swisstransfer.ui.theme.SwissTransferTheme
import com.infomaniak.swisstransfer.ui.utils.GetSetCallbacks
import com.infomaniak.swisstransfer.ui.utils.PreviewAllWindows
import com.infomaniak.swisstransfer.ui.utils.ScreenWrapperUtils
import kotlinx.parcelize.Parcelize
Expand All @@ -50,7 +49,6 @@ import kotlinx.parcelize.Parcelize
@Composable
fun TransfersScreenWrapper(direction: TransferDirection, transferUuid: String? = null) {
var hasTransfer: Boolean by rememberSaveable { mutableStateOf(false) }
var isDeepLink = false

TwoPaneScaffold<DestinationContent>(
listPane = {
Expand All @@ -60,13 +58,17 @@ fun TransfersScreenWrapper(direction: TransferDirection, transferUuid: String? =
transferUuid = transferUuid,
isDeepLinkConsumed = { isDeepLinkConsumed },
consumeDeepLink = transfersViewModel::consumeDeepLink,
isDeepLink = GetSetCallbacks(get = { isDeepLink }, set = { isDeepLink = it }),
direction = direction
direction = direction,
)
ListPane(
direction,
navigator = this,
updateHasTransfer = { hasTransfer = it },
transfersViewModel = transfersViewModel
)
ListPane(direction, navigator = this, hasTransfer = { hasTransfer = it }, transfersViewModel = transfersViewModel)
},
detailPane = {
DetailPane(navigator = this, hasTransfer, isDeepLink)
DetailPane(navigator = this, hasTransfer = { hasTransfer })
},
)
}
Expand All @@ -77,12 +79,10 @@ private fun ThreePaneScaffoldNavigator<DestinationContent>.HandleDeepLink(
transferUuid: String?,
isDeepLinkConsumed: () -> Boolean,
consumeDeepLink: () -> Unit,
isDeepLink: GetSetCallbacks<Boolean>,
direction: TransferDirection
direction: TransferDirection,
) {
if (transferUuid != null && !isDeepLinkConsumed()) {
consumeDeepLink()
isDeepLink.set(true)
navigateToDetails(direction, transferUuid)
}
}
Expand All @@ -93,20 +93,20 @@ private fun ListPane(
direction: TransferDirection,
navigator: ThreePaneScaffoldNavigator<DestinationContent>,
transfersViewModel: TransfersViewModel,
hasTransfer: (Boolean) -> Unit,
updateHasTransfer: (Boolean) -> Unit,
) {
when (direction) {
TransferDirection.SENT -> SentScreen(
navigateToDetails = { transferUuid -> navigator.navigateToDetails(direction, transferUuid) },
getSelectedTransferUuid = navigator::getSelectedTransferUuid,
transfersViewModel = transfersViewModel,
hasTransfer = hasTransfer,
hasTransfer = updateHasTransfer,
)
TransferDirection.RECEIVED -> ReceivedScreen(
navigateToDetails = { transferUuid -> navigator.navigateToDetails(direction, transferUuid) },
getSelectedTransferUuid = navigator::getSelectedTransferUuid,
transfersViewModel = transfersViewModel,
hasTransfer = hasTransfer,
hasTransfer = updateHasTransfer,
)
}
}
Expand All @@ -128,19 +128,17 @@ private fun ThreePaneScaffoldNavigator<DestinationContent>.getSelectedTransferUu
@Composable
private fun DetailPane(
navigator: ThreePaneScaffoldNavigator<DestinationContent>,
hasTransfer: Boolean,
isDeepLink: Boolean,
hasTransfer: () -> Boolean,
) {

val destinationContent = navigator.safeCurrentContent()

if (destinationContent == null) {
NoSelectionEmptyState(hasTransfer)
NoSelectionEmptyState(hasTransfer())
} else {
TransferDetailsScreen(
transferUuid = destinationContent.transferUuid,
direction = destinationContent.direction,
isDeepLink = isDeepLink,
navigateBack = ScreenWrapperUtils.getBackNavigation(navigator),
)
}
Expand Down

0 comments on commit 4cd7c7e

Please sign in to comment.