diff --git a/.idea/deploymentTargetSelector.xml b/.idea/deploymentTargetSelector.xml index b268ef3..92c1ebd 100644 --- a/.idea/deploymentTargetSelector.xml +++ b/.idea/deploymentTargetSelector.xml @@ -5,6 +5,9 @@ + + \ No newline at end of file diff --git a/.kotlin/errors/errors-1739790341460.log b/.kotlin/errors/errors-1739790341460.log new file mode 100644 index 0000000..8918055 --- /dev/null +++ b/.kotlin/errors/errors-1739790341460.log @@ -0,0 +1,82 @@ +kotlin version: 2.0.0 +error message: Daemon compilation failed: null +java.lang.Exception + at org.jetbrains.kotlin.daemon.common.CompileService$CallResult$Error.get(CompileService.kt:69) + at org.jetbrains.kotlin.daemon.common.CompileService$CallResult$Error.get(CompileService.kt:65) + at org.jetbrains.kotlin.compilerRunner.GradleKotlinCompilerWork.compileWithDaemon(GradleKotlinCompilerWork.kt:240) + at org.jetbrains.kotlin.compilerRunner.GradleKotlinCompilerWork.compileWithDaemonOrFallbackImpl(GradleKotlinCompilerWork.kt:159) + at org.jetbrains.kotlin.compilerRunner.GradleKotlinCompilerWork.run(GradleKotlinCompilerWork.kt:111) + at org.jetbrains.kotlin.compilerRunner.GradleCompilerRunnerWithWorkers$GradleKotlinCompilerWorkAction.execute(GradleCompilerRunnerWithWorkers.kt:76) + at org.gradle.workers.internal.DefaultWorkerServer.execute(DefaultWorkerServer.java:63) + at org.gradle.workers.internal.NoIsolationWorkerFactory$1$1.create(NoIsolationWorkerFactory.java:66) + at org.gradle.workers.internal.NoIsolationWorkerFactory$1$1.create(NoIsolationWorkerFactory.java:62) + at org.gradle.internal.classloader.ClassLoaderUtils.executeInClassloader(ClassLoaderUtils.java:100) + at org.gradle.workers.internal.NoIsolationWorkerFactory$1.lambda$execute$0(NoIsolationWorkerFactory.java:62) + at org.gradle.workers.internal.AbstractWorker$1.call(AbstractWorker.java:44) + at org.gradle.workers.internal.AbstractWorker$1.call(AbstractWorker.java:41) + at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:209) + at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204) + at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66) + at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59) + at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:166) + at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59) + at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53) + at org.gradle.workers.internal.AbstractWorker.executeWrappedInBuildOperation(AbstractWorker.java:41) + at org.gradle.workers.internal.NoIsolationWorkerFactory$1.execute(NoIsolationWorkerFactory.java:59) + at org.gradle.workers.internal.DefaultWorkerExecutor.lambda$submitWork$0(DefaultWorkerExecutor.java:174) + at java.base/java.util.concurrent.FutureTask.run(Unknown Source) + at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.runExecution(DefaultConditionalExecutionQueue.java:194) + at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.access$700(DefaultConditionalExecutionQueue.java:127) + at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner$1.run(DefaultConditionalExecutionQueue.java:169) + at org.gradle.internal.Factories$1.create(Factories.java:31) + at org.gradle.internal.work.DefaultWorkerLeaseService.withLocks(DefaultWorkerLeaseService.java:263) + at org.gradle.internal.work.DefaultWorkerLeaseService.runAsWorkerThread(DefaultWorkerLeaseService.java:127) + at org.gradle.internal.work.DefaultWorkerLeaseService.runAsWorkerThread(DefaultWorkerLeaseService.java:132) + at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.runBatch(DefaultConditionalExecutionQueue.java:164) + at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.run(DefaultConditionalExecutionQueue.java:133) + at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) + at java.base/java.util.concurrent.FutureTask.run(Unknown Source) + at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64) + at org.gradle.internal.concurrent.AbstractManagedExecutor$1.run(AbstractManagedExecutor.java:48) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) + at java.base/java.lang.Thread.run(Unknown Source) +Caused by: java.nio.file.DirectoryNotEmptyException: C:\Users\sokol\AppData\Local\Temp\kotlin-backups11175331209764711453 + at java.base/sun.nio.fs.WindowsFileSystemProvider.implDelete(Unknown Source) + at java.base/sun.nio.fs.AbstractFileSystemProvider.delete(Unknown Source) + at java.base/java.nio.file.Files.delete(Unknown Source) + at org.jetbrains.kotlin.incremental.RecoverableCompilationTransaction$cleanupStash$2$1$1.invoke(CompilationTransaction.kt:244) + at org.jetbrains.kotlin.incremental.RecoverableCompilationTransaction$cleanupStash$2$1$1.invoke(CompilationTransaction.kt:244) + at org.jetbrains.kotlin.incremental.RecoverableCompilationTransaction.cleanupStash$lambda$11$lambda$10$lambda$9(CompilationTransaction.kt:244) + at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(Unknown Source) + at java.base/java.util.ArrayList.forEach(Unknown Source) + at java.base/java.util.stream.SortedOps$RefSortingSink.end(Unknown Source) + at java.base/java.util.stream.Sink$ChainedReference.end(Unknown Source) + at java.base/java.util.stream.AbstractPipeline.copyInto(Unknown Source) + at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(Unknown Source) + at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(Unknown Source) + at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(Unknown Source) + at java.base/java.util.stream.AbstractPipeline.evaluate(Unknown Source) + at java.base/java.util.stream.ReferencePipeline.forEach(Unknown Source) + at org.jetbrains.kotlin.incremental.RecoverableCompilationTransaction.cleanupStash(CompilationTransaction.kt:244) + at org.jetbrains.kotlin.incremental.RecoverableCompilationTransaction.close(CompilationTransaction.kt:254) + at org.jetbrains.kotlin.incremental.IncrementalCompilerRunner.tryCompileIncrementally(IncrementalCompilerRunner.kt:747) + at org.jetbrains.kotlin.incremental.IncrementalCompilerRunner.compile(IncrementalCompilerRunner.kt:120) + at org.jetbrains.kotlin.daemon.CompileServiceImplBase.execIncrementalCompiler(CompileServiceImpl.kt:676) + at org.jetbrains.kotlin.daemon.CompileServiceImplBase.access$execIncrementalCompiler(CompileServiceImpl.kt:92) + at org.jetbrains.kotlin.daemon.CompileServiceImpl.compile(CompileServiceImpl.kt:1661) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(Unknown Source) + at java.base/java.lang.reflect.Method.invoke(Unknown Source) + at java.rmi/sun.rmi.server.UnicastServerRef.dispatch(Unknown Source) + at java.rmi/sun.rmi.transport.Transport$1.run(Unknown Source) + at java.rmi/sun.rmi.transport.Transport$1.run(Unknown Source) + at java.base/java.security.AccessController.doPrivileged(Unknown Source) + at java.rmi/sun.rmi.transport.Transport.serviceCall(Unknown Source) + at java.rmi/sun.rmi.transport.tcp.TCPTransport.handleMessages(Unknown Source) + at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(Unknown Source) + at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(Unknown Source) + at java.base/java.security.AccessController.doPrivileged(Unknown Source) + at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(Unknown Source) + ... 3 more + + diff --git a/.kotlin/errors/errors-1739803403035.log b/.kotlin/errors/errors-1739803403035.log new file mode 100644 index 0000000..cb49dd8 --- /dev/null +++ b/.kotlin/errors/errors-1739803403035.log @@ -0,0 +1,82 @@ +kotlin version: 2.0.0 +error message: Daemon compilation failed: null +java.lang.Exception + at org.jetbrains.kotlin.daemon.common.CompileService$CallResult$Error.get(CompileService.kt:69) + at org.jetbrains.kotlin.daemon.common.CompileService$CallResult$Error.get(CompileService.kt:65) + at org.jetbrains.kotlin.compilerRunner.GradleKotlinCompilerWork.compileWithDaemon(GradleKotlinCompilerWork.kt:240) + at org.jetbrains.kotlin.compilerRunner.GradleKotlinCompilerWork.compileWithDaemonOrFallbackImpl(GradleKotlinCompilerWork.kt:159) + at org.jetbrains.kotlin.compilerRunner.GradleKotlinCompilerWork.run(GradleKotlinCompilerWork.kt:111) + at org.jetbrains.kotlin.compilerRunner.GradleCompilerRunnerWithWorkers$GradleKotlinCompilerWorkAction.execute(GradleCompilerRunnerWithWorkers.kt:76) + at org.gradle.workers.internal.DefaultWorkerServer.execute(DefaultWorkerServer.java:63) + at org.gradle.workers.internal.NoIsolationWorkerFactory$1$1.create(NoIsolationWorkerFactory.java:66) + at org.gradle.workers.internal.NoIsolationWorkerFactory$1$1.create(NoIsolationWorkerFactory.java:62) + at org.gradle.internal.classloader.ClassLoaderUtils.executeInClassloader(ClassLoaderUtils.java:100) + at org.gradle.workers.internal.NoIsolationWorkerFactory$1.lambda$execute$0(NoIsolationWorkerFactory.java:62) + at org.gradle.workers.internal.AbstractWorker$1.call(AbstractWorker.java:44) + at org.gradle.workers.internal.AbstractWorker$1.call(AbstractWorker.java:41) + at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:209) + at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204) + at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66) + at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59) + at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:166) + at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59) + at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53) + at org.gradle.workers.internal.AbstractWorker.executeWrappedInBuildOperation(AbstractWorker.java:41) + at org.gradle.workers.internal.NoIsolationWorkerFactory$1.execute(NoIsolationWorkerFactory.java:59) + at org.gradle.workers.internal.DefaultWorkerExecutor.lambda$submitWork$0(DefaultWorkerExecutor.java:174) + at java.base/java.util.concurrent.FutureTask.run(Unknown Source) + at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.runExecution(DefaultConditionalExecutionQueue.java:194) + at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.access$700(DefaultConditionalExecutionQueue.java:127) + at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner$1.run(DefaultConditionalExecutionQueue.java:169) + at org.gradle.internal.Factories$1.create(Factories.java:31) + at org.gradle.internal.work.DefaultWorkerLeaseService.withLocks(DefaultWorkerLeaseService.java:263) + at org.gradle.internal.work.DefaultWorkerLeaseService.runAsWorkerThread(DefaultWorkerLeaseService.java:127) + at org.gradle.internal.work.DefaultWorkerLeaseService.runAsWorkerThread(DefaultWorkerLeaseService.java:132) + at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.runBatch(DefaultConditionalExecutionQueue.java:164) + at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.run(DefaultConditionalExecutionQueue.java:133) + at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) + at java.base/java.util.concurrent.FutureTask.run(Unknown Source) + at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64) + at org.gradle.internal.concurrent.AbstractManagedExecutor$1.run(AbstractManagedExecutor.java:48) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) + at java.base/java.lang.Thread.run(Unknown Source) +Caused by: java.nio.file.DirectoryNotEmptyException: C:\Users\sokol\AppData\Local\Temp\kotlin-backups6180312817685843796 + at java.base/sun.nio.fs.WindowsFileSystemProvider.implDelete(Unknown Source) + at java.base/sun.nio.fs.AbstractFileSystemProvider.delete(Unknown Source) + at java.base/java.nio.file.Files.delete(Unknown Source) + at org.jetbrains.kotlin.incremental.RecoverableCompilationTransaction$cleanupStash$2$1$1.invoke(CompilationTransaction.kt:244) + at org.jetbrains.kotlin.incremental.RecoverableCompilationTransaction$cleanupStash$2$1$1.invoke(CompilationTransaction.kt:244) + at org.jetbrains.kotlin.incremental.RecoverableCompilationTransaction.cleanupStash$lambda$11$lambda$10$lambda$9(CompilationTransaction.kt:244) + at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(Unknown Source) + at java.base/java.util.ArrayList.forEach(Unknown Source) + at java.base/java.util.stream.SortedOps$RefSortingSink.end(Unknown Source) + at java.base/java.util.stream.Sink$ChainedReference.end(Unknown Source) + at java.base/java.util.stream.AbstractPipeline.copyInto(Unknown Source) + at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(Unknown Source) + at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(Unknown Source) + at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(Unknown Source) + at java.base/java.util.stream.AbstractPipeline.evaluate(Unknown Source) + at java.base/java.util.stream.ReferencePipeline.forEach(Unknown Source) + at org.jetbrains.kotlin.incremental.RecoverableCompilationTransaction.cleanupStash(CompilationTransaction.kt:244) + at org.jetbrains.kotlin.incremental.RecoverableCompilationTransaction.close(CompilationTransaction.kt:254) + at org.jetbrains.kotlin.incremental.IncrementalCompilerRunner.tryCompileIncrementally(IncrementalCompilerRunner.kt:747) + at org.jetbrains.kotlin.incremental.IncrementalCompilerRunner.compile(IncrementalCompilerRunner.kt:120) + at org.jetbrains.kotlin.daemon.CompileServiceImplBase.execIncrementalCompiler(CompileServiceImpl.kt:676) + at org.jetbrains.kotlin.daemon.CompileServiceImplBase.access$execIncrementalCompiler(CompileServiceImpl.kt:92) + at org.jetbrains.kotlin.daemon.CompileServiceImpl.compile(CompileServiceImpl.kt:1661) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(Unknown Source) + at java.base/java.lang.reflect.Method.invoke(Unknown Source) + at java.rmi/sun.rmi.server.UnicastServerRef.dispatch(Unknown Source) + at java.rmi/sun.rmi.transport.Transport$1.run(Unknown Source) + at java.rmi/sun.rmi.transport.Transport$1.run(Unknown Source) + at java.base/java.security.AccessController.doPrivileged(Unknown Source) + at java.rmi/sun.rmi.transport.Transport.serviceCall(Unknown Source) + at java.rmi/sun.rmi.transport.tcp.TCPTransport.handleMessages(Unknown Source) + at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(Unknown Source) + at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(Unknown Source) + at java.base/java.security.AccessController.doPrivileged(Unknown Source) + at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(Unknown Source) + ... 3 more + + diff --git a/app/src/main/java/com/example/shoesapptest/MainActivity.kt b/app/src/main/java/com/example/shoesapptest/MainActivity.kt index 99d16af..ab2fa0a 100644 --- a/app/src/main/java/com/example/shoesapptest/MainActivity.kt +++ b/app/src/main/java/com/example/shoesapptest/MainActivity.kt @@ -14,6 +14,7 @@ import androidx.compose.ui.tooling.preview.Preview import com.example.shoesapp.ui.screen.SignInContent import com.example.shoesapp.ui.screen.SigninScreen import com.example.shoesapp.ui.theme.MatuleTheme +import com.example.shoesapptest.screen.ForgotPasswordScreen class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { @@ -21,7 +22,7 @@ class MainActivity : ComponentActivity() { enableEdgeToEdge() setContent { MatuleTheme { - SigninScreen() + ForgotPasswordScreen() } } } diff --git a/app/src/main/java/com/example/shoesapptest/screen/ForgotPasswordScreen.kt b/app/src/main/java/com/example/shoesapptest/screen/ForgotPasswordScreen.kt new file mode 100644 index 0000000..1c68ee3 --- /dev/null +++ b/app/src/main/java/com/example/shoesapptest/screen/ForgotPasswordScreen.kt @@ -0,0 +1,260 @@ +package com.example.shoesapptest.screen + +import android.app.Dialog +import androidx.compose.foundation.background +import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +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.layout.wrapContentSize +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.foundation.text.BasicTextField +import androidx.compose.material3.Button +import androidx.compose.material3.ButtonColors +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.ModalBottomSheetDefaults +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.material3.TextFieldDefaults +import androidx.compose.runtime.Composable +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.input.VisualTransformation +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.unit.dp +import androidx.compose.ui.window.DialogProperties +import com.example.shoesapp.ui.theme.MatuleTheme +import com.example.shoesapptest.R +import androidx.compose.material3.AlertDialog +import androidx.compose.runtime.getValue +import androidx.compose.runtime.setValue + +@Composable +fun ForgotPasswordScreen(){ + Scaffold( + topBar = { + Row( + modifier = Modifier + .padding(top = 35.dp) + .fillMaxWidth() + .height(40.dp) + ) { + IconButton(onClick = {}) { + Icon(painter= painterResource(R.drawable.back_arrow), + contentDescription = null) + } + } + } + ){ paddingValues -> + ScreenContent(paddingValues) + } + +} + +@Composable +fun ScreenContent(paddingValues: PaddingValues){ +Column( + modifier = Modifier.padding(paddingValues = paddingValues) +){ + TitleWithSubtitleText( + title = stringResource(R.string.title_forgot_password), + subTitle = stringResource(R.string.subtitle_forgot_password) + ) + val email = remember { mutableStateOf("") } + Spacer(modifier = Modifier.height(35.dp)) + EmailTextField( + placeHolderText = stringResource(R.string.placeholder_email), + EmailValue = email.value, + onEmailChange = { + email.value=it + } + ) +} +} + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun EmailTextField(EmailValue: String, + onEmailChange: (String) -> Unit, + placeHolderText: String){ + Column( + modifier = Modifier + .padding(20.dp) + .wrapContentSize(), + verticalArrangement = Arrangement.spacedBy(8.dp) + ){ + val email = remember { MutableInteractionSource() } + BasicTextField( + value=EmailValue, + onValueChange = {onEmailChange(it)}, + modifier = Modifier + .padding(horizontal = 20.dp) + .fillMaxWidth() + .clip(RoundedCornerShape(14.dp)) + .background(MatuleTheme.colors.background) + ){ innerTextField -> + TextFieldDefaults.DecorationBox( + value = EmailValue, + singleLine = true, + innerTextField = innerTextField, + colors = TextFieldDefaults.colors( + focusedContainerColor = MatuleTheme.colors.background, + disabledContainerColor = MatuleTheme.colors.background, + unfocusedContainerColor = MatuleTheme.colors.background, + errorContainerColor = MatuleTheme.colors.background, + unfocusedIndicatorColor = Color.Transparent, + focusedIndicatorColor = Color.Transparent, + disabledIndicatorColor = Color.Transparent, + errorIndicatorColor = Color.Transparent + ), + visualTransformation = VisualTransformation.None, + interactionSource = email, + enabled = true, + placeholder = { + if (placeHolderText != null) + Text( + text = placeHolderText, + style = MatuleTheme.typography.bodyRegular14.copy(color = MatuleTheme.colors.hint) + ) + } + ) + } + CommonButton( + modifier = Modifier.padding(top=30.dp), + buttonLabel = stringResource(R.string.send_email_forgot) + ) {} + } +} + +@Composable +fun TitleWithSubtitleText(title: String, subTitle:String){ + Column( + modifier = Modifier + .padding(horizontal = 20.dp) + .padding(top = 50.dp), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.spacedBy(10.dp) + ) + { + Text( + text = title, + style = MatuleTheme.typography.headingBold32.copy(color = MatuleTheme.colors.text), + textAlign = TextAlign.Center + ) + Text( + text = subTitle, + maxLines = 2, + style = MatuleTheme.typography.subTitleRegular16.copy(color = MatuleTheme.colors.subTextDark), + textAlign = TextAlign.Center + ) + } + +} + + +@Composable +fun CommonButton(modifier: Modifier, buttonLabel: String, onClick: () -> Unit){ + var showDialog by remember { mutableStateOf(false) } + Button( + + modifier = modifier + .padding(horizontal = 20.dp) + .fillMaxWidth() + .height(50.dp) + .clip(RoundedCornerShape(14.dp)) + .background(MatuleTheme.colors.accent) + , + colors = ButtonColors( + containerColor = MatuleTheme.colors.accent, + disabledContentColor = Color.Transparent, + disabledContainerColor = MatuleTheme.colors.accent, + contentColor = Color.Transparent + ), + onClick= {showDialog=true} + ){ + Text( + text=buttonLabel, + style = MatuleTheme.typography.bodyRegular14.copy(color= MatuleTheme.colors.background), + textAlign = TextAlign.Center + ) + } + if (showDialog) { + CheckEmailDialog(onDismiss = { showDialog = false }) + } +} + +@Composable +fun CheckEmailDialog(onDismiss: () -> Unit) { + AlertDialog( + onDismissRequest = onDismiss, + confirmButton = {}, + title = { + Column( + horizontalAlignment = Alignment.CenterHorizontally, + modifier = Modifier.fillMaxWidth() + ) { + Row( + modifier = Modifier.padding(bottom = 8.dp), + horizontalArrangement = Arrangement.Center + ) { + Icon( + painter = painterResource(R.drawable.email_image), + contentDescription = null, + tint = MatuleTheme.colors.accent, + modifier = Modifier.size(40.dp) + ) + } + Text( + text = "Проверьте Ваш Email", + style = MatuleTheme.typography.bodyRegular16.copy(color = MatuleTheme.colors.text), + textAlign = TextAlign.Center + ) + } + }, + text = { + Text( + text = "Мы отправили код восстановления пароля на вашу электронную почту.", + textAlign = TextAlign.Center, + style = MatuleTheme.typography.bodyRegular14.copy(color = MatuleTheme.colors.hint) + ) + }, + modifier = Modifier.clip(RoundedCornerShape(14.dp)), + containerColor = Color.White + ) +} + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/java/com/example/shoesapptest/screen/SigninScreen.kt b/app/src/main/java/com/example/shoesapptest/screen/SigninScreen.kt index f243365..7c4ca2f 100644 --- a/app/src/main/java/com/example/shoesapptest/screen/SigninScreen.kt +++ b/app/src/main/java/com/example/shoesapptest/screen/SigninScreen.kt @@ -1,113 +1,294 @@ package com.example.shoesapp.ui.screen -import android.R -import android.provider.CalendarContract.Colors -import android.text.style.ForegroundColorSpan -import android.widget.EditText + +import androidx.compose.foundation.background +import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.width +import androidx.compose.foundation.layout.wrapContentSize +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.foundation.text.BasicTextField import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.material3.Button -import androidx.compose.material3.HorizontalDivider -import androidx.compose.material3.OutlinedTextField +import androidx.compose.material3.ButtonColors +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.Scaffold import androidx.compose.material3.Text -import androidx.compose.material3.TextField -import androidx.compose.material3.TopAppBar +import androidx.compose.material3.TextFieldDefaults import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember -import androidx.compose.runtime.saveable.rememberSaveable 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.graphics.Color -import androidx.compose.ui.layout.VerticalAlignmentLine +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.text.input.PasswordVisualTransformation +import androidx.compose.ui.text.input.VisualTransformation import androidx.compose.ui.text.style.TextAlign -import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import androidx.compose.ui.unit.sp import com.example.shoesapp.ui.theme.MatuleTheme +import com.example.shoesapptest.R @Composable fun SigninScreen(){ - SignInContent() -} - - - -@Composable -fun SignInContent() { - Column { - TitleWithSubtitleText() + Scaffold( + topBar = { + Row( + modifier = Modifier + .padding(top = 35.dp) + .fillMaxWidth() + .height(40.dp) + ) { + IconButton(onClick = {}) { + Icon(painter= painterResource(R.drawable.back_arrow), + contentDescription = null) + } + } + }, + bottomBar = { + Row( + horizontalArrangement = Arrangement.Center, + verticalAlignment = Alignment.CenterVertically, + modifier = Modifier + .padding(bottom = 50.dp) + .fillMaxWidth() + .height(40.dp) + ) { + Text( + text= stringResource(R.string.sign_up), + style = MatuleTheme.typography.bodyRegular16.copy(color=MatuleTheme.colors.text), + textAlign = TextAlign.Center + ) + } + } + ) { paddingValues -> + SignInContent(paddingValues) } } -@Preview + + @Composable -fun TitleWithSubtitleText(){ +fun SignInContent(paddingValues: PaddingValues) { Column( - modifier = Modifier.run { padding(horizontal = 20.dp, vertical = 200.dp) }, + modifier = Modifier.padding(paddingValues = paddingValues) + ) { + + TitleWithSubtitleText( + title = stringResource(R.string.hello), + subTitle = stringResource(R.string.sign_in_subtitle) + ) + val email = remember { mutableStateOf("") } + val password = remember { mutableStateOf("")} + Spacer(modifier = Modifier.height(35.dp)) + AuthTextField( + labelTextEmail = stringResource(R.string.email), + labelTextPassword = stringResource(R.string.password), + placeHolderTextEmail = stringResource(R.string.template_email), + placeHolderTextPassword= stringResource(R.string.template_password), + emailValue = email.value, + onEmailChange = { + email.value = it + }, + passwordValue = password.value, + onPasswordChange = { + password.value = it + } + ) + CommonButton( + modifier = Modifier.padding(top=50.dp), + buttonLabel = stringResource(R.string.sign_in)){ + + } + } +} + +@Composable +fun TitleWithSubtitleText(title: String, subTitle:String){ + Column( + modifier = Modifier.run { padding(horizontal = 20.dp) }, horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.spacedBy(10.dp) ) { Text( - text = "Привет!", + text = title, style = MatuleTheme.typography.headingBold32.copy(color = MatuleTheme.colors.text), textAlign = TextAlign.Center, ) Text( - text = "Заполните Свои данные или продолжите через социальные медиа", + text = subTitle, maxLines = 2, style = MatuleTheme.typography.subTitleRegular16.copy(color = MatuleTheme.colors.subTextDark), - textAlign = TextAlign.Center, - color = Color(112, 123, 129, 255) + textAlign = TextAlign.Center ) - Column( - modifier = Modifier.run {padding(horizontal = 10.dp, vertical = 30.dp)}, - horizontalAlignment = Alignment.Start, - verticalArrangement = Arrangement.spacedBy(5.dp) + + + } +} + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun AuthTextField( emailValue: String, + onEmailChange: (String) -> Unit, + passwordValue: String, + onPasswordChange: (String) -> Unit, + placeHolderTextEmail: String? = null, + placeHolderTextPassword: String? = null, + labelTextEmail: String? = null, + labelTextPassword: String? = null){ + Column ( + modifier = Modifier + .padding(horizontal = 20.dp) + .wrapContentSize(), + verticalArrangement = Arrangement.spacedBy(8.dp) + ) { + if (labelTextEmail != null) { + Text( + text = labelTextEmail, + style = MatuleTheme.typography.bodyRegular16.copy(MatuleTheme.colors.text), + textAlign = TextAlign.Right + ) + } + val interaction = remember { MutableInteractionSource() } + BasicTextField( + value = emailValue, + onValueChange = { onEmailChange(it) }, + modifier = Modifier + .padding(horizontal = 20.dp) + .fillMaxWidth() + .clip(RoundedCornerShape(14.dp)) + .background(MatuleTheme.colors.background) + ) { innerTextField -> + TextFieldDefaults.DecorationBox( + value = emailValue, + singleLine = true, + innerTextField = innerTextField, + enabled = true, + colors = TextFieldDefaults.colors( + focusedContainerColor = MatuleTheme.colors.background, + disabledContainerColor = MatuleTheme.colors.background, + unfocusedContainerColor = MatuleTheme.colors.background, + errorContainerColor = MatuleTheme.colors.background, + unfocusedIndicatorColor = Color.Transparent, + focusedIndicatorColor = Color.Transparent, + disabledIndicatorColor = Color.Transparent, + errorIndicatorColor = Color.Transparent + ), + visualTransformation = VisualTransformation.None, + interactionSource = interaction, + placeholder = { + if (placeHolderTextEmail != null) + Text( + text = placeHolderTextEmail, + style = MatuleTheme.typography.bodyRegular14.copy(color = MatuleTheme.colors.hint) + ) + } + ) + } + if (labelTextPassword != null) { + Text( + text = labelTextPassword, + style = MatuleTheme.typography.bodyRegular16.copy(MatuleTheme.colors.text), + textAlign = TextAlign.Right + ) + } + val password = remember { MutableInteractionSource() } + var passwordVisible by remember { mutableStateOf(false) } + Row( + modifier = Modifier + .padding(horizontal = 20.dp) + .fillMaxWidth(), + verticalAlignment = Alignment.CenterVertically ) { - Text( - text="Email", - fontSize = 18.sp, - textAlign = TextAlign.Left, - color=Color(43,43,43,255) - ) - val message = remember{mutableStateOf("")} - OutlinedTextField( - message.value, - {message.value = it}, - placeholder = { Text("xyz@gmail.com") } - ) - Text( - text="Пароль", - fontSize = 18.sp, - textAlign = TextAlign.Left, - color=Color(43,43,43,255) - ) - var password by rememberSaveable { mutableStateOf("") } - OutlinedTextField( - value = password, - onValueChange = { password = it }, - placeholder = {Text("••••••••")}, - visualTransformation = PasswordVisualTransformation(), - keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Password) - ) - } - Button(onClick = {}) { - Text("Восстановить") + BasicTextField( + value = passwordValue, + onValueChange = { onPasswordChange(it) }, + visualTransformation = if (passwordVisible) VisualTransformation.None else PasswordVisualTransformation(), + keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Password), + modifier = Modifier + .weight(1f) + .clip(RoundedCornerShape(14.dp)) + .background(MatuleTheme.colors.background) + ) { innerTextField -> + TextFieldDefaults.DecorationBox( + value = passwordValue, + singleLine = true, + innerTextField = innerTextField, + enabled = true, + colors = TextFieldDefaults.colors( + focusedContainerColor = MatuleTheme.colors.background, + disabledContainerColor = MatuleTheme.colors.background, + unfocusedContainerColor = MatuleTheme.colors.background, + errorContainerColor = MatuleTheme.colors.background, + unfocusedIndicatorColor = Color.Transparent, + focusedIndicatorColor = Color.Transparent, + disabledIndicatorColor = Color.Transparent, + errorIndicatorColor = Color.Transparent + ), + visualTransformation = if (passwordVisible) VisualTransformation.None else PasswordVisualTransformation(), + interactionSource = password, + placeholder = { + if (placeHolderTextPassword != null) + Text( + text = placeHolderTextPassword, + style = MatuleTheme.typography.bodyRegular14.copy(color = MatuleTheme.colors.hint) + ) + } + ) + } + + IconButton( + onClick={passwordVisible = !passwordVisible} + ) { + Icon( + painter= painterResource(if (passwordVisible) R.drawable.eye_close else R.drawable.eye_open), + contentDescription = "Показать пароль" + ) + } } } +} +@Composable +fun CommonButton(modifier: Modifier, buttonLabel: String, onClick: () -> Unit){ + Button( + + modifier = modifier + .padding(horizontal = 20.dp) + .fillMaxWidth() + .height(50.dp) + .clip(RoundedCornerShape(14.dp)) + .background(MatuleTheme.colors.accent) + , + colors = ButtonColors( + containerColor = MatuleTheme.colors.accent, + disabledContentColor = Color.Transparent, + disabledContainerColor = MatuleTheme.colors.accent, + contentColor = Color.Transparent + ), + onClick=onClick + ){ + Text( + text=buttonLabel, + style = MatuleTheme.typography.bodyRegular14.copy(color= MatuleTheme.colors.background), + textAlign = TextAlign.Center + ) + } } \ No newline at end of file diff --git a/app/src/main/java/com/example/shoesapptest/ui/theme/Theme.kt b/app/src/main/java/com/example/shoesapptest/ui/theme/Theme.kt index 767c17a..beba3fe 100644 --- a/app/src/main/java/com/example/shoesapptest/ui/theme/Theme.kt +++ b/app/src/main/java/com/example/shoesapptest/ui/theme/Theme.kt @@ -20,7 +20,8 @@ data class MatuleColors( val text: Color, val subTextDark: Color, val background: Color, - val hint: Color + val hint: Color, + val accent: Color ) @Immutable @@ -49,7 +50,8 @@ val LocalMatuleColors = staticCompositionLocalOf { text = Color.Unspecified, subTextDark = Color.Unspecified, background = Color.Unspecified, - hint = Color.Unspecified + hint = Color.Unspecified, + accent = Color.Unspecified ) } @@ -73,7 +75,8 @@ fun MatuleTheme( content: (@Composable () -> Unit)){ text = Color(0xFF2B2B2B), subTextDark = Color(0xFF707B81), background = Color(0xFFF7F7F9), - hint = Color(0xFF6A6A6A) + hint = Color(0xFF6A6A6A), + accent = Color(0xFF48B2E7) ) val matuleTypography = MatuleTextStyle( diff --git a/app/src/main/res/drawable/back_arrow.xml b/app/src/main/res/drawable/back_arrow.xml new file mode 100644 index 0000000..68d0bc8 --- /dev/null +++ b/app/src/main/res/drawable/back_arrow.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/email_image.xml b/app/src/main/res/drawable/email_image.xml new file mode 100644 index 0000000..5380e0d --- /dev/null +++ b/app/src/main/res/drawable/email_image.xml @@ -0,0 +1,62 @@ + + + + + + + + + + diff --git a/app/src/main/res/drawable/eye_close.xml b/app/src/main/res/drawable/eye_close.xml new file mode 100644 index 0000000..f22659b --- /dev/null +++ b/app/src/main/res/drawable/eye_close.xml @@ -0,0 +1,21 @@ + + + + + + + diff --git a/app/src/main/res/drawable/eye_open.xml b/app/src/main/res/drawable/eye_open.xml new file mode 100644 index 0000000..210fc3c --- /dev/null +++ b/app/src/main/res/drawable/eye_open.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 2ad5677..38ce91c 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,3 +1,15 @@ ShoesappTest + Привет! + Заполните Свои данные или продолжите через социальные медиа + xyz@gmail.com + Email + Войти + Вы впервые? Создать пользователя + •••••••• + Пароль + Забыл Пароль + Введите Свою Учётную Запись Для Сброса + xyz@gmail.com + Отправить \ No newline at end of file