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