diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/NewTransferViewModel.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/NewTransferViewModel.kt index 2612e19e4..0dc465230 100644 --- a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/NewTransferViewModel.kt +++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/NewTransferViewModel.kt @@ -22,12 +22,11 @@ import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.infomaniak.swisstransfer.di.IoDispatcher +import com.infomaniak.swisstransfer.ui.screen.newtransfer.importfiles.components.TransferType import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.FlowPreview -import kotlinx.coroutines.flow.SharingStarted -import kotlinx.coroutines.flow.debounce -import kotlinx.coroutines.flow.stateIn +import kotlinx.coroutines.flow.* import kotlinx.coroutines.launch import javax.inject.Inject @@ -57,6 +56,9 @@ class NewTransferViewModel @Inject constructor( savedStateHandle[IS_VIEW_MODEL_RESTORED_KEY] = value } + private val _selectedTransferType = MutableStateFlow(TransferType.LINK) + val selectedTransferType: StateFlow = _selectedTransferType.asStateFlow() + init { viewModelScope.launch(ioDispatcher) { if (isFirstViewModelCreation) { @@ -87,4 +89,8 @@ class NewTransferViewModel @Inject constructor( companion object { private const val IS_VIEW_MODEL_RESTORED_KEY = "IS_VIEW_MODEL_RESTORED_KEY" } + + fun selectTransferType(type: TransferType) { + _selectedTransferType.value = type + } } diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/importfiles/ImportFilesScreen.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/importfiles/ImportFilesScreen.kt index 52df5e196..e784d88f5 100644 --- a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/importfiles/ImportFilesScreen.kt +++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/importfiles/ImportFilesScreen.kt @@ -21,6 +21,7 @@ import android.net.Uri import androidx.activity.compose.rememberLauncherForActivityResult import androidx.activity.result.contract.ActivityResultContracts import androidx.annotation.StringRes +import androidx.compose.animation.AnimatedVisibility import androidx.compose.foundation.layout.* import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll @@ -47,6 +48,7 @@ import com.infomaniak.swisstransfer.ui.screen.newtransfer.importfiles.components import com.infomaniak.swisstransfer.ui.screen.newtransfer.importfiles.components.TransferTypeButtons import com.infomaniak.swisstransfer.ui.theme.Margin import com.infomaniak.swisstransfer.ui.theme.SwissTransferTheme +import com.infomaniak.swisstransfer.ui.utils.GetSetCallbacks import com.infomaniak.swisstransfer.ui.utils.HumanReadableSizeUtils.getHumanReadableSize import com.infomaniak.swisstransfer.ui.utils.PreviewAllWindows @@ -60,15 +62,20 @@ fun ImportFilesScreen( val files by newTransferViewModel.importedFilesDebounced.collectAsStateWithLifecycle() val filesToImportCount by newTransferViewModel.filesToImportCount.collectAsStateWithLifecycle() val currentSessionFilesCount by newTransferViewModel.currentSessionFilesCount.collectAsStateWithLifecycle() + val selectedTransferType by newTransferViewModel.selectedTransferType.collectAsStateWithLifecycle() + ImportFilesScreen( files = { files }, filesToImportCount = { filesToImportCount }, currentSessionFilesCount = { currentSessionFilesCount }, + selectedTransferType = GetSetCallbacks( + get = { selectedTransferType }, + set = newTransferViewModel::selectTransferType, + ), removeFileByUid = newTransferViewModel::removeFileByUid, addFiles = newTransferViewModel::importFiles, closeActivity = closeActivity, initialShowUploadSourceChoiceBottomSheet = true, - initialShouldShowEmailAddressesFields = true, ) } @@ -77,11 +84,11 @@ private fun ImportFilesScreen( files: () -> List, filesToImportCount: () -> Int, currentSessionFilesCount: () -> Int, + selectedTransferType: GetSetCallbacks, removeFileByUid: (uid: String) -> Unit, addFiles: (List) -> Unit, closeActivity: () -> Unit, initialShowUploadSourceChoiceBottomSheet: Boolean, - initialShouldShowEmailAddressesFields: Boolean, ) { val context = LocalContext.current var showUploadSourceChoiceBottomSheet by rememberSaveable { mutableStateOf(initialShowUploadSourceChoiceBottomSheet) } @@ -128,9 +135,9 @@ private fun ImportFilesScreen( showUploadSourceChoiceBottomSheet = { showUploadSourceChoiceBottomSheet = true }, removeFileByUid = removeFileByUid, ) - ImportTextFields(initialShouldShowEmailAddressesFields) + ImportTextFields(selectedTransferType.get) ImportFilesTitle(Modifier.padding(vertical = Margin.Medium), titleRes = R.string.transferTypeTitle) - TransferTypeButtons(initialSelectedTransferType = TransferType.LINK, onClick = {}) + TransferTypeButtons(selectedTransferType) ImportFilesTitle(Modifier.padding(vertical = Margin.Medium), titleRes = R.string.advancedSettingsTitle) TransferAdvancedSettings( states = { @@ -155,19 +162,10 @@ private fun ImportFilesScreen( } @Composable -private fun ImportTextFields(initialShouldShowEmailAddressesFields: Boolean) { - if (initialShouldShowEmailAddressesFields) { - SwissTransferTextField( - modifier = Modifier.fillMaxWidth(), - label = stringResource(R.string.transferSenderAddressPlaceholder), - ) - Spacer(Modifier.size(Margin.Medium)) - SwissTransferTextField( - modifier = Modifier.fillMaxWidth(), - label = stringResource(R.string.transferRecipientAddressPlaceholder), - ) - Spacer(Modifier.size(Margin.Medium)) - } +private fun ColumnScope.ImportTextFields(selectedTransferType: () -> TransferType) { + + EmailAddressesTextFields(selectedTransferType) + SwissTransferTextField( modifier = Modifier.fillMaxWidth(), label = stringResource(R.string.transferMessagePlaceholder), @@ -176,6 +174,27 @@ private fun ImportTextFields(initialShouldShowEmailAddressesFields: Boolean) { ) } +@Composable +private fun ColumnScope.EmailAddressesTextFields(selectedTransferType: () -> TransferType) { + + val shouldShowEmailAddressesFields by remember { derivedStateOf { selectedTransferType() == TransferType.MAIL } } + + AnimatedVisibility(visible = shouldShowEmailAddressesFields) { + Column { + SwissTransferTextField( + modifier = Modifier.fillMaxWidth(), + label = stringResource(R.string.transferSenderAddressPlaceholder), + ) + Spacer(Modifier.size(Margin.Medium)) + SwissTransferTextField( + modifier = Modifier.fillMaxWidth(), + label = stringResource(R.string.transferRecipientAddressPlaceholder), + ) + Spacer(Modifier.size(Margin.Medium)) + } + } +} + @Composable private fun SendButton(isImporting: () -> Boolean, importProgress: () -> Float, modifier: Modifier) { val progress: (() -> Float)? = if (isImporting()) importProgress else null @@ -215,11 +234,11 @@ private fun ImportFilesScreenPreview(@PreviewParameter(FileUiListPreviewParamete files = { files }, filesToImportCount = { 0 }, currentSessionFilesCount = { 0 }, + selectedTransferType = GetSetCallbacks(get = { TransferType.QR_CODE }, set = {}), removeFileByUid = {}, addFiles = {}, closeActivity = {}, initialShowUploadSourceChoiceBottomSheet = false, - initialShouldShowEmailAddressesFields = true, ) } } diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/importfiles/components/TransferTypeButtons.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/importfiles/components/TransferTypeButtons.kt index c17ea7666..139c86b1d 100644 --- a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/importfiles/components/TransferTypeButtons.kt +++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/importfiles/components/TransferTypeButtons.kt @@ -26,9 +26,6 @@ import androidx.compose.foundation.layout.padding import androidx.compose.foundation.rememberScrollState import androidx.compose.material3.Surface import androidx.compose.runtime.Composable -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.tooling.preview.Preview @@ -40,12 +37,10 @@ import com.infomaniak.swisstransfer.ui.images.icons.QrCode import com.infomaniak.swisstransfer.ui.images.icons.WifiWave import com.infomaniak.swisstransfer.ui.theme.Margin import com.infomaniak.swisstransfer.ui.theme.SwissTransferTheme +import com.infomaniak.swisstransfer.ui.utils.GetSetCallbacks @Composable -fun TransferTypeButtons(initialSelectedTransferType: TransferType, onClick: (TransferType) -> Unit) { - - val selectedItem by rememberSaveable { mutableStateOf(initialSelectedTransferType) } - +fun TransferTypeButtons(transferType: GetSetCallbacks) { Row( modifier = Modifier .horizontalScroll(rememberScrollState()) @@ -54,8 +49,8 @@ fun TransferTypeButtons(initialSelectedTransferType: TransferType, onClick: (Tra for (transferTypeEntry in TransferType.entries) { TransferTypeButton( transferType = transferTypeEntry, - isActive = { transferTypeEntry == selectedItem }, - onClick = { onClick(transferTypeEntry) }, + isActive = { transferTypeEntry == transferType.get() }, + onClick = { transferType.set(transferTypeEntry) }, ) } } @@ -99,7 +94,7 @@ enum class TransferType( private fun TransferTypeButtonsPreview() { SwissTransferTheme { Surface { - TransferTypeButtons(initialSelectedTransferType = TransferType.QR_CODE, onClick = {}) + TransferTypeButtons(GetSetCallbacks(get = { TransferType.QR_CODE }, set = {})) } } }