This commit is contained in:
Alex 2025-02-17 18:59:08 +03:00
parent aa79a85a07
commit 4dd82d0143
12 changed files with 793 additions and 67 deletions

View File

@ -5,6 +5,9 @@
<SelectionState runConfigName="app">
<option name="selectionMode" value="DROPDOWN" />
</SelectionState>
<SelectionState runConfigName="CommonButton">
<option name="selectionMode" value="DROPDOWN" />
</SelectionState>
</selectionStates>
</component>
</project>

View File

@ -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

View File

@ -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

View File

@ -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()
}
}
}

View File

@ -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
)
}

View File

@ -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
)
}
}

View File

@ -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(

View File

@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="6dp"
android:height="12dp"
android:viewportWidth="6"
android:viewportHeight="12">
<path
android:pathData="M5.468,0.414C5.792,0.673 5.844,1.145 5.586,1.468L1.96,6L5.586,10.531C5.844,10.855 5.792,11.327 5.468,11.586C5.145,11.844 4.673,11.792 4.414,11.469L0.414,6.468C0.195,6.195 0.195,5.805 0.414,5.531L4.414,0.531C4.673,0.208 5.145,0.156 5.468,0.414Z"
android:fillColor="#2B2B2B"
android:fillType="evenOdd"/>
</vector>

View File

@ -0,0 +1,62 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:pathData="M1.125,9.627V20.877C1.125,21.274 1.283,21.656 1.564,21.937C1.846,22.219 2.227,22.377 2.625,22.377H21.375C21.773,22.377 22.154,22.219 22.436,21.937C22.717,21.656 22.875,21.274 22.875,20.877V9.627"
android:strokeLineJoin="round"
android:strokeWidth="1.125"
android:fillColor="#00000000"
android:strokeColor="#FFF8F8"
android:strokeLineCap="round"/>
<path
android:pathData="M5.438,7.665C3.93,8.125 2.482,8.764 1.125,9.566V9.566L11.149,16.478C11.399,16.65 11.696,16.743 12,16.743C12.304,16.743 12.601,16.65 12.851,16.478L22.875,9.566C21.518,8.764 20.07,8.125 18.563,7.665"
android:strokeLineJoin="round"
android:strokeWidth="1.125"
android:fillColor="#00000000"
android:strokeColor="#FFF8F8"
android:strokeLineCap="round"/>
<path
android:pathData="M5.438,12.54V2.737C5.438,2.439 5.556,2.153 5.767,1.942C5.978,1.731 6.264,1.612 6.563,1.612H17.438C17.736,1.612 18.022,1.731 18.233,1.942C18.444,2.153 18.563,2.439 18.563,2.737V12.536L12.851,16.477C12.601,16.65 12.304,16.742 12,16.742C11.696,16.742 11.399,16.65 11.149,16.477L5.441,12.54"
android:strokeLineJoin="round"
android:strokeWidth="1.125"
android:fillColor="#00000000"
android:strokeColor="#FFF8F8"
android:strokeLineCap="round"/>
<path
android:pathData="M15.563,4.946H8.438"
android:strokeLineJoin="round"
android:strokeWidth="1.125"
android:fillColor="#00000000"
android:strokeColor="#FFF8F8"
android:strokeLineCap="round"/>
<path
android:pathData="M12,10.725H8.438"
android:strokeLineJoin="round"
android:strokeWidth="1.125"
android:fillColor="#00000000"
android:strokeColor="#FFF8F8"
android:strokeLineCap="round"/>
<path
android:pathData="M15.563,7.837H8.438"
android:strokeLineJoin="round"
android:strokeWidth="1.125"
android:fillColor="#00000000"
android:strokeColor="#FFF8F8"
android:strokeLineCap="round"/>
<path
android:pathData="M9.442,15.308L1.609,21.983"
android:strokeLineJoin="round"
android:strokeWidth="1.125"
android:fillColor="#00000000"
android:strokeColor="#FFF8F8"
android:strokeLineCap="round"/>
<path
android:pathData="M14.539,15.308L22.395,21.983"
android:strokeLineJoin="round"
android:strokeWidth="1.125"
android:fillColor="#00000000"
android:strokeColor="#FFF8F8"
android:strokeLineCap="round"/>
</vector>

View File

@ -0,0 +1,21 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="25dp"
android:height="20dp"
android:viewportWidth="25"
android:viewportHeight="20">
<path
android:pathData="M3.038,0.64C2.718,0.959 2.718,1.477 3.038,1.797L20.461,19.22C20.781,19.54 21.299,19.54 21.618,19.22C21.938,18.901 21.938,18.383 21.618,18.063L4.195,0.64C3.875,0.32 3.357,0.32 3.038,0.64Z"
android:fillColor="#2B2B2B"/>
<path
android:pathData="M0.5,9.829C0.5,9.136 1.889,7.102 4.126,5.271L5.26,6.458C5.193,6.512 5.127,6.566 5.061,6.621C4.068,7.448 3.278,8.303 2.75,9.003C2.484,9.355 2.304,9.643 2.198,9.849C2.18,9.883 2.165,9.913 2.154,9.937L2.156,9.946C2.175,10.025 2.209,10.131 2.265,10.264C2.377,10.533 2.561,10.867 2.828,11.25C3.362,12.015 4.164,12.884 5.179,13.703C7.225,15.354 9.942,16.647 12.773,16.647C13.459,16.647 14.132,16.567 14.784,16.421L16.072,17.769C15.031,18.094 13.925,18.284 12.773,18.284C6.145,18.284 0.5,12.283 0.5,9.829Z"
android:fillColor="#2B2B2B"/>
<path
android:pathData="M8.136,10.374C8.136,10.091 8.162,9.814 8.21,9.544L13.396,14.969C13.192,14.997 12.984,15.011 12.773,15.011C10.212,15.011 8.136,12.935 8.136,10.374Z"
android:fillColor="#2B2B2B"/>
<path
android:pathData="M11.655,5.874L17.219,11.694C17.343,11.276 17.409,10.833 17.409,10.374C17.409,7.814 15.333,5.738 12.773,5.738C12.387,5.738 12.013,5.785 11.655,5.874Z"
android:fillColor="#2B2B2B"/>
<path
android:pathData="M20.044,13.643C19.871,13.795 19.692,13.944 19.508,14.089L20.643,15.277C23.03,13.351 24.5,11 24.5,9.829C24.5,7.92 19.127,1.92 12.5,1.92C11.128,1.92 9.809,2.2 8.581,2.658L9.83,3.964C10.693,3.705 11.589,3.556 12.5,3.556C15.327,3.556 17.977,4.846 19.963,6.436C20.947,7.224 21.722,8.05 22.236,8.753C22.493,9.105 22.667,9.402 22.77,9.626C22.826,9.747 22.85,9.822 22.859,9.856C22.851,9.905 22.825,10.021 22.749,10.21C22.645,10.47 22.474,10.799 22.228,11.179C21.734,11.938 20.991,12.814 20.044,13.643Z"
android:fillColor="#2B2B2B"/>
</vector>

View File

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="23dp"
android:height="16dp"
android:viewportWidth="23"
android:viewportHeight="16">
<path
android:pathData="M11.5,5C12.296,5 13.059,5.316 13.621,5.879C14.184,6.441 14.5,7.204 14.5,8C14.5,8.796 14.184,9.559 13.621,10.121C13.059,10.684 12.296,11 11.5,11C10.704,11 9.941,10.684 9.379,10.121C8.816,9.559 8.5,8.796 8.5,8C8.5,7.204 8.816,6.441 9.379,5.879C9.941,5.316 10.704,5 11.5,5ZM11.5,0.5C16.5,0.5 20.77,3.61 22.5,8C20.77,12.39 16.5,15.5 11.5,15.5C6.5,15.5 2.23,12.39 0.5,8C2.23,3.61 6.5,0.5 11.5,0.5ZM2.68,8C3.488,9.65 4.743,11.041 6.302,12.013C7.862,12.986 9.662,13.501 11.5,13.501C13.338,13.501 15.138,12.986 16.698,12.013C18.257,11.041 19.512,9.65 20.32,8C19.512,6.35 18.257,4.959 16.698,3.987C15.138,3.014 13.338,2.499 11.5,2.499C9.662,2.499 7.862,3.014 6.302,3.987C4.743,4.959 3.488,6.35 2.68,8Z"
android:fillColor="#2B2B2B"/>
</vector>

View File

@ -1,3 +1,15 @@
<resources>
<string name="app_name">ShoesappTest</string>
<string name="hello">Привет!</string>
<string name="sign_in_subtitle">Заполните Свои данные или продолжите через социальные медиа</string>
<string name="template_email">xyz@gmail.com</string>
<string name="email">Email</string>
<string name="sign_in">Войти</string>
<string name="sign_up">Вы впервые? Создать пользователя</string>
<string name="template_password">••••••••</string>
<string name="password">Пароль</string>
<string name="title_forgot_password">Забыл Пароль</string>
<string name="subtitle_forgot_password">Введите Свою Учётную Запись Для Сброса</string>
<string name="placeholder_email">xyz@gmail.com</string>
<string name="send_email_forgot">Отправить</string>
</resources>