package su.reya.coop.screens import android.net.Uri import androidx.activity.compose.rememberLauncherForActivityResult import androidx.activity.result.contract.ActivityResultContracts import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.verticalScroll import androidx.compose.material3.Button import androidx.compose.material3.ButtonDefaults import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.LoadingIndicator import androidx.compose.material3.MaterialTheme import androidx.compose.material3.OutlinedTextField import androidx.compose.material3.Scaffold import androidx.compose.material3.SnackbarHost import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.material3.TopAppBar import androidx.compose.material3.TopAppBarDefaults import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.unit.dp import coil3.compose.AsyncImage import coop.composeapp.generated.resources.Res import coop.composeapp.generated.resources.ic_arrow_back import coop.composeapp.generated.resources.ic_avatar import org.jetbrains.compose.resources.painterResource import su.reya.coop.LocalSnackbarHostState @OptIn(ExperimentalMaterial3ExpressiveApi::class) @Composable fun NewIdentityScreen( isLoading: Boolean, onBack: () -> Unit, onSave: (name: String, bio: String, picture: Uri?) -> Unit ) { val snackbarHostState = LocalSnackbarHostState.current var name by remember { mutableStateOf("") } var bio by remember { mutableStateOf("") } var picture by remember { mutableStateOf(null) } val launcher = rememberLauncherForActivityResult(contract = ActivityResultContracts.GetContent()) { uri: Uri? -> picture = uri } Scaffold( containerColor = MaterialTheme.colorScheme.surfaceContainer, snackbarHost = { SnackbarHost(snackbarHostState) }, topBar = { TopAppBar( title = { Text("Create a new identity") }, navigationIcon = { IconButton(onClick = onBack) { Icon( painter = painterResource(Res.drawable.ic_arrow_back), contentDescription = "Back" ) } }, colors = TopAppBarDefaults.topAppBarColors( containerColor = MaterialTheme.colorScheme.surfaceContainer, ) ) }, content = { innerPadding -> Surface( modifier = Modifier .fillMaxSize() .padding(top = innerPadding.calculateTopPadding()), color = MaterialTheme.colorScheme.surface, shape = RoundedCornerShape(topStart = 24.dp, topEnd = 24.dp), ) { Column( modifier = Modifier .fillMaxSize() .padding(24.dp) .verticalScroll(rememberScrollState()), horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.spacedBy(16.dp) ) { Box( modifier = Modifier .size(120.dp) .clip(CircleShape) .clickable { launcher.launch("image/*") }, contentAlignment = Alignment.Center ) { if (picture != null) { AsyncImage( model = picture, contentDescription = "Profile picture", modifier = Modifier.fillMaxSize(), contentScale = ContentScale.Crop ) } else { Surface( color = MaterialTheme.colorScheme.surfaceVariant, modifier = Modifier.fillMaxSize() ) { Box(contentAlignment = Alignment.Center) { Icon( painter = painterResource(Res.drawable.ic_avatar), contentDescription = "Pick avatar", modifier = Modifier.size(48.dp), tint = MaterialTheme.colorScheme.onSurfaceVariant ) } } } } OutlinedTextField( value = name, onValueChange = { name = it }, label = { Text("Name") }, modifier = Modifier.fillMaxWidth(), singleLine = true, ) OutlinedTextField( value = bio, onValueChange = { bio = it }, label = { Text("Bio:") }, modifier = Modifier .fillMaxWidth() .height(150.dp), minLines = 3, ) Spacer(modifier = Modifier.weight(1f)) Button( onClick = { onSave(name, bio, picture) }, modifier = Modifier .fillMaxWidth() .height(ButtonDefaults.LargeContainerHeight), enabled = name.isNotBlank() && !isLoading, ) { if (isLoading) { LoadingIndicator() } else { Text( text = "Save & Continue", style = MaterialTheme.typography.titleLargeEmphasized, ) } } } } } ) }