Skip to content

Commit

Permalink
Merge pull request #142 from Infomaniak/Add-transfer-button-type
Browse files Browse the repository at this point in the history
feat: Add transfer button type state
  • Loading branch information
sirambd authored Nov 1, 2024
2 parents b130ab1 + e297d43 commit d4e7879
Show file tree
Hide file tree
Showing 3 changed files with 51 additions and 31 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down Expand Up @@ -57,6 +56,9 @@ class NewTransferViewModel @Inject constructor(
savedStateHandle[IS_VIEW_MODEL_RESTORED_KEY] = value
}

private val _selectedTransferType = MutableStateFlow(TransferType.LINK)
val selectedTransferType: StateFlow<TransferType> = _selectedTransferType.asStateFlow()

init {
viewModelScope.launch(ioDispatcher) {
if (isFirstViewModelCreation) {
Expand Down Expand Up @@ -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
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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

Expand All @@ -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,
)
}

Expand All @@ -77,11 +84,11 @@ private fun ImportFilesScreen(
files: () -> List<FileUi>,
filesToImportCount: () -> Int,
currentSessionFilesCount: () -> Int,
selectedTransferType: GetSetCallbacks<TransferType>,
removeFileByUid: (uid: String) -> Unit,
addFiles: (List<Uri>) -> Unit,
closeActivity: () -> Unit,
initialShowUploadSourceChoiceBottomSheet: Boolean,
initialShouldShowEmailAddressesFields: Boolean,
) {
val context = LocalContext.current
var showUploadSourceChoiceBottomSheet by rememberSaveable { mutableStateOf(initialShowUploadSourceChoiceBottomSheet) }
Expand Down Expand Up @@ -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 = {
Expand All @@ -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),
Expand All @@ -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
Expand Down Expand Up @@ -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,
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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<TransferType>) {
Row(
modifier = Modifier
.horizontalScroll(rememberScrollState())
Expand All @@ -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) },
)
}
}
Expand Down Expand Up @@ -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 = {}))
}
}
}

0 comments on commit d4e7879

Please sign in to comment.