Преглед на файлове

Created back navigation on signup, forgot password & login screen, created module object, navigation & route for signup and forgot password screen

Khubaib преди 6 месеца
родител
ревизия
ecc0d48080
променени са 15 файла, в които са добавени 528 реда и са изтрити 72 реда
  1. 19 0
      app/src/main/java/com/fastest/pass/forgotpassword/di/ForgotPasswordModule.kt
  2. 8 3
      app/src/main/java/com/fastest/pass/forgotpassword/presentation/components/ForgotPasswordScreen.kt
  3. 22 1
      app/src/main/java/com/fastest/pass/forgotpassword/presentation/ui/ForgotPasswordFragment.kt
  4. 16 0
      app/src/main/java/com/fastest/pass/forgotpassword/presentation/viewmodels/ForgotPasswordViewmodel.kt
  5. 23 0
      app/src/main/java/com/fastest/pass/forgotpassword/utils/ForgotPasswordNavigation.kt
  6. 6 0
      app/src/main/java/com/fastest/pass/forgotpassword/utils/ForgotPasswordRoute.kt
  7. 49 53
      app/src/main/java/com/fastest/pass/login/presentation/components/LoginScreen.kt
  8. 1 3
      app/src/main/java/com/fastest/pass/login/presentation/ui/LoginFragment.kt
  9. 0 6
      app/src/main/java/com/fastest/pass/login/presentation/viewmodels/LoginViewModel.kt
  10. 19 0
      app/src/main/java/com/fastest/pass/signup/di/SignUpModule.kt
  11. 298 4
      app/src/main/java/com/fastest/pass/signup/presentation/components/SignUpScreen.kt
  12. 22 2
      app/src/main/java/com/fastest/pass/signup/presentation/ui/SignUpFragment.kt
  13. 16 0
      app/src/main/java/com/fastest/pass/signup/presentation/viewmodels/SignUpViewModel.kt
  14. 23 0
      app/src/main/java/com/fastest/pass/signup/utils/SignUpNavigation.kt
  15. 6 0
      app/src/main/java/com/fastest/pass/signup/utils/SignUpRoute.kt

+ 19 - 0
app/src/main/java/com/fastest/pass/forgotpassword/di/ForgotPasswordModule.kt

@@ -0,0 +1,19 @@
+package com.fastest.pass.forgotpassword.di
+
+import com.fastest.pass.forgotpassword.utils.ForgotPasswordNavigation
+import dagger.Module
+import dagger.Provides
+import dagger.hilt.InstallIn
+import dagger.hilt.components.SingletonComponent
+import javax.inject.Singleton
+
+@Module
+@InstallIn(SingletonComponent::class)
+object ForgotPasswordModule {
+
+    @Provides
+    @Singleton
+    fun provideNavigation(): ForgotPasswordNavigation {
+        return ForgotPasswordNavigation()
+    }
+}

+ 8 - 3
app/src/main/java/com/fastest/pass/forgotpassword/presentation/components/ForgotPasswordScreen.kt

@@ -47,10 +47,13 @@ import androidx.compose.ui.text.style.TextAlign
 import androidx.compose.ui.unit.dp
 import androidx.compose.ui.unit.sp
 import com.fastest.pass.R
-import com.fastest.pass.login.presentation.components.ClickType
+
+enum class ClickType {
+    GO_BACK
+}
 
 @Composable
-fun ForgotPasswordScreen() {
+fun ForgotPasswordScreen(clickType: (ClickType) -> Unit) {
     val keyboardController = LocalSoftwareKeyboardController.current
     val focusManager = LocalFocusManager.current
 
@@ -66,7 +69,9 @@ fun ForgotPasswordScreen() {
                 .padding(top = 0.dp)
                 .statusBarsPadding()
         ) {
-            ShowHeaderFP(text = stringResource(id = R.string.forgot_password)) {}
+            ShowHeaderFP(text = stringResource(id = R.string.forgot_password)) { clickType ->
+                clickType(clickType)
+            }
             Column(
                 modifier = Modifier
                     .fillMaxSize()

+ 22 - 1
app/src/main/java/com/fastest/pass/forgotpassword/presentation/ui/ForgotPasswordFragment.kt

@@ -6,12 +6,27 @@ import android.view.View
 import android.view.ViewGroup
 import androidx.compose.ui.platform.ComposeView
 import androidx.fragment.app.Fragment
+import androidx.fragment.app.viewModels
+import com.fastest.pass.forgotpassword.presentation.components.ClickType
 import com.fastest.pass.forgotpassword.presentation.components.ForgotPasswordScreen
+import com.fastest.pass.forgotpassword.presentation.viewmodels.ForgotPasswordViewmodel
+import com.fastest.pass.forgotpassword.utils.ForgotPasswordNavigation
+import com.fastest.pass.forgotpassword.utils.ForgotPasswordRoute
 import com.fastest.pass.ui.theme.FastestPassTheme
+import dagger.hilt.android.AndroidEntryPoint
+import javax.inject.Inject
 
+@AndroidEntryPoint
 class ForgotPasswordFragment : Fragment() {
+
+    val viewmodel: ForgotPasswordViewmodel by viewModels()
+
+    @Inject
+    lateinit var navigation: ForgotPasswordNavigation
+
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
+        navigation.navigate(this)
     }
 
     override fun onCreateView(
@@ -22,7 +37,13 @@ class ForgotPasswordFragment : Fragment() {
         return ComposeView(requireActivity()).apply {
             setContent {
                 FastestPassTheme {
-                    ForgotPasswordScreen()
+                    ForgotPasswordScreen { clickType ->
+                        when (clickType) {
+                            ClickType.GO_BACK -> {
+                                viewmodel.navigateTo(ForgotPasswordRoute.GoBackToLogin)
+                            }
+                        }
+                    }
                 }
             }
         }

+ 16 - 0
app/src/main/java/com/fastest/pass/forgotpassword/presentation/viewmodels/ForgotPasswordViewmodel.kt

@@ -0,0 +1,16 @@
+package com.fastest.pass.forgotpassword.presentation.viewmodels
+
+import androidx.lifecycle.ViewModel
+import com.fastest.pass.forgotpassword.utils.ForgotPasswordRoute
+import com.fastest.pass.login.utils.LoginRoute
+import kotlinx.coroutines.flow.MutableStateFlow
+
+class ForgotPasswordViewmodel : ViewModel() {
+
+    private val _router = MutableStateFlow<ForgotPasswordRoute>(ForgotPasswordRoute.OpenNoneScreen)
+    val router: MutableStateFlow<ForgotPasswordRoute> = _router
+
+    fun navigateTo(forgotPasswordRoute: ForgotPasswordRoute) {
+        _router.value = forgotPasswordRoute
+    }
+}

+ 23 - 0
app/src/main/java/com/fastest/pass/forgotpassword/utils/ForgotPasswordNavigation.kt

@@ -0,0 +1,23 @@
+package com.fastest.pass.forgotpassword.utils
+
+import androidx.lifecycle.lifecycleScope
+import androidx.navigation.fragment.findNavController
+import com.fastest.pass.forgotpassword.presentation.ui.ForgotPasswordFragment
+
+class ForgotPasswordNavigation {
+
+    fun navigate(forgotPasswordFragment: ForgotPasswordFragment) {
+        forgotPasswordFragment.lifecycleScope.launchWhenStarted {
+            forgotPasswordFragment.viewmodel.router.collect { router ->
+                when (router) {
+                    ForgotPasswordRoute.OpenNoneScreen -> {}
+                    ForgotPasswordRoute.GoBackToLogin -> {
+                        forgotPasswordFragment.findNavController().popBackStack()
+                    }
+                }
+
+                forgotPasswordFragment.viewmodel.navigateTo(ForgotPasswordRoute.OpenNoneScreen)
+            }
+        }
+    }
+}

+ 6 - 0
app/src/main/java/com/fastest/pass/forgotpassword/utils/ForgotPasswordRoute.kt

@@ -0,0 +1,6 @@
+package com.fastest.pass.forgotpassword.utils
+
+sealed class ForgotPasswordRoute {
+    data object GoBackToLogin : ForgotPasswordRoute()
+    data object OpenNoneScreen : ForgotPasswordRoute()
+}

+ 49 - 53
app/src/main/java/com/fastest/pass/login/presentation/components/LoginScreen.kt

@@ -1,5 +1,6 @@
 package com.fastest.pass.login.presentation.components
 
+import android.widget.Toast
 import androidx.compose.foundation.Image
 import androidx.compose.foundation.background
 import androidx.compose.foundation.border
@@ -39,6 +40,7 @@ import androidx.compose.ui.Modifier
 import androidx.compose.ui.draw.clip
 import androidx.compose.ui.focus.FocusManager
 import androidx.compose.ui.graphics.ColorFilter
+import androidx.compose.ui.platform.LocalContext
 import androidx.compose.ui.platform.LocalFocusManager
 import androidx.compose.ui.platform.LocalSoftwareKeyboardController
 import androidx.compose.ui.platform.SoftwareKeyboardController
@@ -63,6 +65,9 @@ enum class ClickType {
 
 @Composable
 fun LoginScreen(clickType: (ClickType) -> Unit) {
+    val keyboardController = LocalSoftwareKeyboardController.current
+    val focusManager = LocalFocusManager.current
+
     Box(
         modifier = Modifier
             .background(colorResource(id = R.color.blue_login))
@@ -78,8 +83,28 @@ fun LoginScreen(clickType: (ClickType) -> Unit) {
             ShowHeaderLogin(text = stringResource(R.string.login)) { clickType ->
                 clickType(clickType)
             }
-            ShowWelcomeText(R.string.enter_master_password, R.string.login) { clickType ->
-                clickType(clickType)
+
+            Column(
+                modifier = Modifier
+                    .fillMaxSize()
+                    .padding(top = 25.dp)
+                    .clip(RoundedCornerShape(topStart = 35.dp, topEnd = 35.dp))
+                    .background(
+                        colorResource(id = R.color.light_gray_login),
+                    )
+            ) {
+                ShowWelcomeText(R.string.enter_master_password)
+                LoginTextField(keyboardController, focusManager)
+                Spacer(modifier = Modifier.height(20.dp))
+                PasswordTextField(keyboardController, focusManager)
+                Spacer(modifier = Modifier.height(25.dp))
+                LoginButton(buttonText = R.string.login)
+                ForgotPasswordText() { clickType ->
+                    clickType(clickType)
+                }
+                CreateAccountText { clickType ->
+                    clickType(clickType)
+                }
             }
         }
     }
@@ -87,6 +112,7 @@ fun LoginScreen(clickType: (ClickType) -> Unit) {
 
 @Composable
 fun ColumnScope.ShowHeaderLogin(text: String, clickType: (ClickType) -> Unit) {
+    val c = LocalContext.current
     Row(
         modifier = Modifier
             .align(Alignment.Start)
@@ -127,60 +153,30 @@ fun ColumnScope.ShowHeaderLogin(text: String, clickType: (ClickType) -> Unit) {
 @Composable
 fun ColumnScope.ShowWelcomeText(
     masterPasswordText: Int,
-    buttonText: Int,
-    isFromLogin: Boolean = true,
-    clickType: (ClickType) -> Unit
 ) {
-    val keyboardController = LocalSoftwareKeyboardController.current
-    val focusManager = LocalFocusManager.current
-
-    Column(
+    Text(
+        text = stringResource(id = R.string.master_password_required),
+        color = colorResource(id = R.color.gray_splash),
+        style = MaterialTheme.typography.headlineLarge.copy(
+            fontSize = 26.sp
+        ),
+        lineHeight = 20.sp,
         modifier = Modifier
-            .fillMaxSize()
-            .padding(top = 25.dp)
-            .clip(RoundedCornerShape(topStart = 35.dp, topEnd = 35.dp))
-            .background(
-                colorResource(id = R.color.light_gray_login),
-            )
-    ) {
-        Text(
-            text = stringResource(id = R.string.master_password_required),
-            color = colorResource(id = R.color.gray_splash),
-            style = MaterialTheme.typography.headlineLarge.copy(
-                fontSize = 26.sp
-            ),
-            lineHeight = 20.sp,
-            modifier = Modifier
-                .align(Alignment.Start)
-                .padding(start = 30.dp, top = 35.dp)
-        )
-        Text(
-            text = stringResource(id = masterPasswordText),
-            color = colorResource(id = R.color.gray_splash),
-            style = MaterialTheme.typography.displayLarge.copy(
-                fontSize = 18.sp
-            ),
-            lineHeight = 25.sp,
-            modifier = Modifier
-                .align(Alignment.Start)
-                .padding(start = 30.dp, top = 5.dp, end = 50.dp)
-
-        )
+            .align(Alignment.Start)
+            .padding(start = 30.dp, top = 35.dp)
+    )
+    Text(
+        text = stringResource(id = masterPasswordText),
+        color = colorResource(id = R.color.gray_splash),
+        style = MaterialTheme.typography.displayLarge.copy(
+            fontSize = 18.sp
+        ),
+        lineHeight = 25.sp,
+        modifier = Modifier
+            .align(Alignment.Start)
+            .padding(start = 30.dp, top = 5.dp, end = 50.dp)
 
-        LoginTextField(keyboardController, focusManager)
-        Spacer(modifier = Modifier.height(20.dp))
-        PasswordTextField(keyboardController, focusManager)
-        Spacer(modifier = Modifier.height(25.dp))
-        LoginButton(buttonText = buttonText)
-        if (isFromLogin) {
-            ForgotPasswordText() { clickType ->
-                clickType(clickType)
-            }
-            CreateAccountText { clickType ->
-                clickType(clickType)
-            }
-        }
-    }
+    )
 }
 
 @Composable

+ 1 - 3
app/src/main/java/com/fastest/pass/login/presentation/ui/LoginFragment.kt

@@ -1,14 +1,12 @@
 package com.fastest.pass.login.presentation.ui
 
 import android.os.Bundle
-import androidx.fragment.app.Fragment
 import android.view.LayoutInflater
 import android.view.View
 import android.view.ViewGroup
 import androidx.compose.ui.platform.ComposeView
+import androidx.fragment.app.Fragment
 import androidx.fragment.app.viewModels
-import androidx.navigation.findNavController
-import com.fastest.pass.R
 import com.fastest.pass.login.presentation.components.ClickType
 import com.fastest.pass.login.presentation.components.LoginScreen
 import com.fastest.pass.login.presentation.viewmodels.LoginViewModel

+ 0 - 6
app/src/main/java/com/fastest/pass/login/presentation/viewmodels/LoginViewModel.kt

@@ -1,14 +1,8 @@
 package com.fastest.pass.login.presentation.viewmodels
 
 import androidx.lifecycle.ViewModel
-import com.fastest.pass.login.domain.repository.LoginRepository
-import com.fastest.pass.login.domain.usecase.LoginUseCase
-import com.fastest.pass.login.presentation.ui.LoginFragment
-import com.fastest.pass.login.utils.LoginNavigation
 import com.fastest.pass.login.utils.LoginRoute
-import dagger.hilt.android.lifecycle.HiltViewModel
 import kotlinx.coroutines.flow.MutableStateFlow
-import javax.inject.Inject
 
 class LoginViewModel : ViewModel() {
 

+ 19 - 0
app/src/main/java/com/fastest/pass/signup/di/SignUpModule.kt

@@ -0,0 +1,19 @@
+package com.fastest.pass.signup.di
+
+import com.fastest.pass.signup.utils.SignUpNavigation
+import dagger.Module
+import dagger.Provides
+import dagger.hilt.InstallIn
+import dagger.hilt.components.SingletonComponent
+import javax.inject.Singleton
+
+@Module
+@InstallIn(SingletonComponent::class)
+object SignUpModule {
+
+    @Provides
+    @Singleton
+    fun provideNavigation(): SignUpNavigation {
+        return SignUpNavigation()
+    }
+}

+ 298 - 4
app/src/main/java/com/fastest/pass/signup/presentation/components/SignUpScreen.kt

@@ -1,22 +1,70 @@
 package com.fastest.pass.signup.presentation.components
 
+import androidx.compose.foundation.Image
 import androidx.compose.foundation.background
+import androidx.compose.foundation.border
+import androidx.compose.foundation.clickable
 import androidx.compose.foundation.layout.Box
 import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.ColumnScope
+import androidx.compose.foundation.layout.Row
+import androidx.compose.foundation.layout.Spacer
 import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.foundation.layout.height
 import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.layout.size
 import androidx.compose.foundation.layout.statusBarsPadding
+import androidx.compose.foundation.shape.RoundedCornerShape
+import androidx.compose.foundation.text.KeyboardActions
+import androidx.compose.foundation.text.KeyboardOptions
+import androidx.compose.material3.Button
+import androidx.compose.material3.ButtonDefaults
+import androidx.compose.material3.IconButton
+import androidx.compose.material3.MaterialTheme
+import androidx.compose.material3.Surface
+import androidx.compose.material3.Text
+import androidx.compose.material3.TextField
+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.setValue
+import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
+import androidx.compose.ui.draw.clip
+import androidx.compose.ui.focus.FocusManager
+import androidx.compose.ui.graphics.ColorFilter
+import androidx.compose.ui.platform.LocalContext
+import androidx.compose.ui.platform.LocalFocusManager
+import androidx.compose.ui.platform.LocalSoftwareKeyboardController
+import androidx.compose.ui.platform.SoftwareKeyboardController
 import androidx.compose.ui.res.colorResource
+import androidx.compose.ui.res.painterResource
 import androidx.compose.ui.res.stringResource
+import androidx.compose.ui.text.input.ImeAction
+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.unit.dp
+import androidx.compose.ui.unit.sp
 import com.fastest.pass.R
-import com.fastest.pass.login.presentation.components.ShowHeaderLogin
+import com.fastest.pass.login.presentation.components.LoginButton
+import com.fastest.pass.login.presentation.components.LoginTextField
+import com.fastest.pass.login.presentation.components.PasswordTextField
 import com.fastest.pass.login.presentation.components.ShowWelcomeText
 
+enum class ClickType {
+    GO_BACK
+}
+
 @Composable
-fun SignUpScreen() {
+fun SignUpScreen(clickType: (ClickType) -> Unit) {
+    val keyboardController = LocalSoftwareKeyboardController.current
+    val focusManager = LocalFocusManager.current
+
     Box(
         modifier = Modifier
             .background(colorResource(id = R.color.blue_login))
@@ -29,8 +77,254 @@ fun SignUpScreen() {
                 .padding(top = 0.dp)
                 .statusBarsPadding()
         ) {
-            ShowHeaderLogin(text = stringResource(R.string.new_account)) {}
-            ShowWelcomeText(R.string.setup_master_password, R.string.signup, isFromLogin = false) {}
+            ShowHeaderSignUp(text = stringResource(R.string.new_account)) { clickType ->
+                clickType(clickType)
+            }
+
+            Column(
+                modifier = Modifier
+                    .fillMaxSize()
+                    .padding(top = 25.dp)
+                    .clip(RoundedCornerShape(topStart = 35.dp, topEnd = 35.dp))
+                    .background(
+                        colorResource(id = R.color.light_gray_login),
+                    )
+            ) {
+                ShowWelcomeText(R.string.setup_master_password)
+                SignUpTextField(keyboardController, focusManager)
+                Spacer(modifier = Modifier.height(20.dp))
+                PasswordTextFieldSU(keyboardController, focusManager)
+                Spacer(modifier = Modifier.height(25.dp))
+                SignUpButton(buttonText = R.string.signup)
+            }
         }
     }
+}
+
+@Composable
+fun ColumnScope.ShowHeaderSignUp(
+    text: String,
+    clickType: (ClickType) -> Unit
+) {
+    val c = LocalContext.current
+    Row(
+        modifier = Modifier
+            .align(Alignment.Start)
+            .padding(top = 30.dp)
+            .fillMaxWidth(),
+        verticalAlignment = Alignment.CenterVertically
+    ) {
+        IconButton(
+            onClick = {
+                clickType.invoke(ClickType.GO_BACK)
+            },
+            modifier = Modifier
+                .padding(start = 30.dp)
+                .size(24.dp, 24.dp)
+        ) {
+            Image(
+                painter = painterResource(id = R.drawable.arrow_left),
+                contentDescription = "Arrow-Back",
+                modifier = Modifier.size(24.dp, 24.dp)
+            )
+        }
+        Surface(
+            modifier = Modifier
+                .padding(start = 15.dp),
+            color = colorResource(id = R.color.transparent)
+        ) {
+            Text(
+                text = text,
+                color = colorResource(id = R.color.white),
+                style = MaterialTheme.typography.displayLarge.copy(
+                    fontSize = 24.sp
+                ),
+            )
+        }
+    }
+}
+
+@Composable
+fun ColumnScope.SignUpTextField(
+    keyboardController: SoftwareKeyboardController?,
+    focusManager: FocusManager
+) {
+    var emailText by remember { mutableStateOf("") }
+
+    TextField(
+        value = emailText,
+        onValueChange = {
+            emailText = it
+        },
+        textStyle = MaterialTheme.typography.displaySmall,
+        modifier = Modifier
+            .padding(start = 30.dp, end = 30.dp, top = 50.dp)
+            .align(Alignment.Start)
+            .fillMaxWidth()
+            .height(60.dp)
+            .border(
+                1.dp,
+                color = colorResource(id = R.color.gray_border_textfield),
+                shape = RoundedCornerShape(16.dp)
+            )
+            .background(color = colorResource(id = R.color.transparent)),
+        shape = RoundedCornerShape(16.dp),
+        placeholder = {
+            Text(
+                text = "Enter email address",
+                color = colorResource(id = R.color.gray_splash))
+        },
+//        label = {
+//            Text(text = context.getString(R.string.email),
+//                style = MaterialTheme.typography.customTypography.bodySmall
+//            )
+//        },
+        leadingIcon = {
+            Image(
+                painter = painterResource(id = R.drawable.profile_circle),
+                contentDescription = "Email Logo",
+                modifier = Modifier
+                    .size(24.dp, 24.dp)
+            )
+        },
+        maxLines = 1,
+        colors = TextFieldDefaults.colors(
+            focusedLabelColor = colorResource(id = R.color.gray_splash),
+            unfocusedContainerColor = colorResource(id = R.color.transparent),
+            focusedContainerColor = colorResource(id = R.color.transparent),
+            focusedIndicatorColor = colorResource(id = R.color.transparent),
+            disabledIndicatorColor = colorResource(id = R.color.transparent),
+            unfocusedIndicatorColor = colorResource(id = R.color.transparent),
+            cursorColor = colorResource(id = R.color.gray_splash),
+        ),
+        keyboardOptions = KeyboardOptions(
+            keyboardType = KeyboardType.Email,
+            imeAction = ImeAction.Done
+        ),
+        keyboardActions = KeyboardActions(
+            onDone = {
+                focusManager.clearFocus()
+                keyboardController?.hide()
+            }
+        ),
+    )
+}
+
+@Composable
+fun ColumnScope.PasswordTextFieldSU(
+    keyboardController: SoftwareKeyboardController?,
+    focusManager: FocusManager
+) {
+    var passwordText by remember { mutableStateOf("") }
+    var passwordVisible by remember { mutableStateOf(false) }
+
+    TextField(
+        value = passwordText,
+        onValueChange = {
+            passwordText = it
+        },
+        textStyle = MaterialTheme.typography.displaySmall,
+        modifier = Modifier
+            .padding(start = 30.dp, end = 30.dp)
+            .align(Alignment.Start)
+            .fillMaxWidth()
+            .height(60.dp)
+            .border(
+                1.dp,
+                color = colorResource(id = R.color.gray_border_textfield),
+                shape = RoundedCornerShape(16.dp)
+            )
+            .background(color = colorResource(id = R.color.transparent)),
+        shape = RoundedCornerShape(16.dp),
+        placeholder = {
+            Text(text = "Master password",
+                color = colorResource(id = R.color.gray_splash))
+        },
+//        label = {
+//            Text(text = context.getString(R.string.password),
+//                style = MaterialTheme.typography.customTypography.bodyLarge
+//            )
+//        },
+        maxLines = 1,
+        colors = TextFieldDefaults.colors(
+            focusedLabelColor = colorResource(id = R.color.gray_splash),
+            unfocusedContainerColor = colorResource(id = R.color.transparent),
+            focusedContainerColor = colorResource(id = R.color.transparent),
+            focusedIndicatorColor = colorResource(id = R.color.transparent),
+            disabledIndicatorColor = colorResource(id = R.color.transparent),
+            unfocusedIndicatorColor = colorResource(id = R.color.transparent),
+            cursorColor = colorResource(id = R.color.gray_splash),
+        ),
+        keyboardOptions = KeyboardOptions(
+            keyboardType = KeyboardType.Password,
+            imeAction = ImeAction.Done
+        ),
+        keyboardActions = KeyboardActions(
+            onDone = {
+                focusManager.clearFocus()
+                keyboardController?.hide()
+            }
+        ),
+        visualTransformation =
+        if (passwordVisible) VisualTransformation.Companion.None
+        else PasswordVisualTransformation(),
+
+        trailingIcon = {
+            val description = if (passwordVisible) "Hide Password"
+            else "Show Password"
+
+            IconButton(onClick = {
+                passwordVisible = !passwordVisible
+            })
+            {
+                if (passwordVisible) {
+                    Image(
+                        painter = painterResource(id = R.drawable.eye_open),
+                        contentDescription = description,
+                        modifier = Modifier.size(24.dp)
+                    )
+                }
+                else {
+                    Image(
+                        painter = painterResource(id = R.drawable.eye_slash3x),
+                        contentDescription = description,
+                        modifier = Modifier
+                            .size(24.dp),
+                        colorFilter = ColorFilter.tint(
+                            colorResource(id = R.color.gray_splash)
+                        )
+                    )
+                }
+            }
+        }
+    )
+}
+
+@Composable
+fun ColumnScope.SignUpButton(buttonText: Int) {
+    Button(
+        modifier = Modifier
+            .padding(start = 30.dp, end = 30.dp,)
+            .background(colorResource(id = R.color.transparent))
+            .fillMaxWidth()
+            .height(60.dp)
+            .clickable() { },
+        onClick = {},
+        shape = RoundedCornerShape(15.dp),
+//            border = BorderStroke(25.dp, colorResource(id = R.color.black)),
+        colors = ButtonDefaults.buttonColors(
+            contentColor = colorResource(id = R.color.white),
+            containerColor = colorResource(id = R.color.red_login_button),
+        ),
+    )
+    {
+        Text(
+            text = stringResource(id = buttonText),
+            style = MaterialTheme.typography.bodyMedium.copy(
+                fontSize = 20.sp,
+                color = colorResource(id = R.color.white)
+            ),
+            textAlign = TextAlign.Center
+        )
+    }
 }

+ 22 - 2
app/src/main/java/com/fastest/pass/signup/presentation/ui/SignUpFragment.kt

@@ -6,13 +6,27 @@ import android.view.View
 import android.view.ViewGroup
 import androidx.compose.ui.platform.ComposeView
 import androidx.fragment.app.Fragment
+import androidx.fragment.app.viewModels
+import com.fastest.pass.signup.presentation.components.ClickType
 import com.fastest.pass.signup.presentation.components.SignUpScreen
+import com.fastest.pass.signup.presentation.viewmodels.SignUpViewModel
+import com.fastest.pass.signup.utils.SignUpNavigation
+import com.fastest.pass.signup.utils.SignUpRoute
 import com.fastest.pass.ui.theme.FastestPassTheme
+import dagger.hilt.android.AndroidEntryPoint
+import javax.inject.Inject
 
+@AndroidEntryPoint
 class SignUpFragment : Fragment() {
 
+    val viewmodel: SignUpViewModel by viewModels()
+
+    @Inject
+    lateinit var navigation: SignUpNavigation
+
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
+        navigation.navigate(this)
     }
 
     override fun onCreateView(
@@ -20,10 +34,16 @@ class SignUpFragment : Fragment() {
         container: ViewGroup?,
         savedInstanceState: Bundle?
     ): View? {
-        return ComposeView(requireContext()).apply {
+        return ComposeView(requireActivity()).apply {
             setContent {
                 FastestPassTheme {
-                    SignUpScreen()
+                    SignUpScreen { clickType ->
+                        when (clickType) {
+                            ClickType.GO_BACK -> {
+                                viewmodel.navigateTo(SignUpRoute.GoBack)
+                            }
+                        }
+                    }
                 }
             }
         }

+ 16 - 0
app/src/main/java/com/fastest/pass/signup/presentation/viewmodels/SignUpViewModel.kt

@@ -0,0 +1,16 @@
+package com.fastest.pass.signup.presentation.viewmodels
+
+import androidx.lifecycle.ViewModel
+import com.fastest.pass.login.utils.LoginRoute
+import com.fastest.pass.signup.utils.SignUpRoute
+import kotlinx.coroutines.flow.MutableStateFlow
+
+class SignUpViewModel : ViewModel() {
+
+    private val _router = MutableStateFlow<SignUpRoute>(SignUpRoute.OpenNoneScreen)
+    val router: MutableStateFlow<SignUpRoute> = _router
+
+    fun navigateTo(signUpRoute: SignUpRoute) {
+        _router.value = signUpRoute
+    }
+}

+ 23 - 0
app/src/main/java/com/fastest/pass/signup/utils/SignUpNavigation.kt

@@ -0,0 +1,23 @@
+package com.fastest.pass.signup.utils
+
+import androidx.lifecycle.lifecycleScope
+import androidx.navigation.fragment.findNavController
+import com.fastest.pass.signup.presentation.ui.SignUpFragment
+
+class SignUpNavigation {
+
+    fun navigate(signUpFragment: SignUpFragment) {
+        signUpFragment.lifecycleScope.launchWhenStarted {
+            signUpFragment.viewmodel.router.collect { router ->
+                when (router) {
+                    SignUpRoute.GoBack -> {
+                        signUpFragment.findNavController().popBackStack()
+                    }
+                    SignUpRoute.OpenNoneScreen -> {}
+                }
+
+                signUpFragment.viewmodel.navigateTo(SignUpRoute.OpenNoneScreen)
+            }
+        }
+    }
+}

+ 6 - 0
app/src/main/java/com/fastest/pass/signup/utils/SignUpRoute.kt

@@ -0,0 +1,6 @@
+package com.fastest.pass.signup.utils
+
+sealed class SignUpRoute {
+    data object GoBack : SignUpRoute()
+    data object OpenNoneScreen : SignUpRoute()
+}