Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: Add transfer button type state #142

Merged
merged 4 commits into from
Nov 1, 2024
Merged
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
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 = {}))
}
}
}
Loading