Update CreateMaskedEmailScreen.kt

This commit is contained in:
Paweł Orzech 2026-01-31 02:04:56 +01:00
parent 4a081300cb
commit 5b6b7438df
No known key found for this signature in database

View file

@ -1,6 +1,8 @@
package com.fastmask.ui.create package com.fastmask.ui.create
import android.widget.Toast import android.content.ClipData
import android.content.ClipboardManager
import android.content.Context
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.Spacer
@ -22,6 +24,10 @@ import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.OutlinedTextField import androidx.compose.material3.OutlinedTextField
import androidx.compose.material3.RadioButton import androidx.compose.material3.RadioButton
import androidx.compose.material3.Scaffold import androidx.compose.material3.Scaffold
import androidx.compose.material3.SnackbarDuration
import androidx.compose.material3.SnackbarHost
import androidx.compose.material3.SnackbarHostState
import androidx.compose.material3.SnackbarResult
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.material3.TopAppBar import androidx.compose.material3.TopAppBar
import androidx.compose.material3.TopAppBarDefaults import androidx.compose.material3.TopAppBarDefaults
@ -29,13 +35,20 @@ import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.hapticfeedback.HapticFeedbackType
import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalHapticFeedback
import androidx.compose.ui.semantics.contentDescription
import androidx.compose.ui.semantics.semantics
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.hilt.navigation.compose.hiltViewModel import androidx.hilt.navigation.compose.hiltViewModel
import com.fastmask.domain.model.EmailState import com.fastmask.domain.model.EmailState
import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.launch
@OptIn(ExperimentalMaterial3Api::class) @OptIn(ExperimentalMaterial3Api::class)
@Composable @Composable
@ -45,16 +58,24 @@ fun CreateMaskedEmailScreen(
) { ) {
val uiState by viewModel.uiState.collectAsState() val uiState by viewModel.uiState.collectAsState()
val context = LocalContext.current val context = LocalContext.current
val snackbarHostState = remember { SnackbarHostState() }
val scope = rememberCoroutineScope()
val haptic = LocalHapticFeedback.current
LaunchedEffect(Unit) { LaunchedEffect(Unit) {
viewModel.events.collectLatest { event -> viewModel.events.collectLatest { event ->
when (event) { when (event) {
is CreateMaskedEmailEvent.Created -> { is CreateMaskedEmailEvent.Created -> {
Toast.makeText( val result = snackbarHostState.showSnackbar(
context, message = "Created: ${event.email}",
"Created: ${event.email}", actionLabel = "Copy",
Toast.LENGTH_LONG duration = SnackbarDuration.Long
).show() )
if (result == SnackbarResult.ActionPerformed) {
val clipboard = context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
val clip = ClipData.newPlainText("Email", event.email)
clipboard.setPrimaryClip(clip)
}
onNavigateBack() onNavigateBack()
} }
} }
@ -66,18 +87,29 @@ fun CreateMaskedEmailScreen(
TopAppBar( TopAppBar(
title = { Text("Create Masked Email") }, title = { Text("Create Masked Email") },
navigationIcon = { navigationIcon = {
IconButton(onClick = onNavigateBack) { IconButton(
onClick = {
haptic.performHapticFeedback(HapticFeedbackType.LongPress)
onNavigateBack()
},
modifier = Modifier.semantics {
contentDescription = "Navigate back"
}
) {
Icon( Icon(
imageVector = Icons.AutoMirrored.Filled.ArrowBack, imageVector = Icons.AutoMirrored.Filled.ArrowBack,
contentDescription = "Back" contentDescription = null
) )
} }
}, },
colors = TopAppBarDefaults.topAppBarColors( colors = TopAppBarDefaults.topAppBarColors(
containerColor = MaterialTheme.colorScheme.primaryContainer, containerColor = MaterialTheme.colorScheme.surface,
titleContentColor = MaterialTheme.colorScheme.onPrimaryContainer titleContentColor = MaterialTheme.colorScheme.onSurface
) )
) )
},
snackbarHost = {
SnackbarHost(hostState = snackbarHostState)
} }
) { paddingValues -> ) { paddingValues ->
Column( Column(
@ -156,7 +188,10 @@ fun CreateMaskedEmailScreen(
) { ) {
RadioButton( RadioButton(
selected = uiState.initialState == state, selected = uiState.initialState == state,
onClick = { viewModel.onStateChange(state) }, onClick = {
haptic.performHapticFeedback(HapticFeedbackType.LongPress)
viewModel.onStateChange(state)
},
enabled = !uiState.isLoading enabled = !uiState.isLoading
) )
Text( Text(
@ -178,7 +213,10 @@ fun CreateMaskedEmailScreen(
Spacer(modifier = Modifier.height(32.dp)) Spacer(modifier = Modifier.height(32.dp))
Button( Button(
onClick = viewModel::create, onClick = {
haptic.performHapticFeedback(HapticFeedbackType.LongPress)
viewModel.create()
},
modifier = Modifier.fillMaxWidth(), modifier = Modifier.fillMaxWidth(),
enabled = !uiState.isLoading && uiState.prefixError == null enabled = !uiState.isLoading && uiState.prefixError == null
) { ) {