2 Commits 501d46ed00 ... 22c5ab05a4

Tác giả SHA1 Thông báo Ngày
  Bax 22c5ab05a4 update: process creatin sognIn 2 ngày trước cách đây
  Bax 19dc2a0773 feat: add update bottombar 2 ngày trước cách đây
16 tập tin đã thay đổi với 438 bổ sung18 xóa
  1. 8 0
      mobile_app/new/wabi/.idea/deploymentTargetSelector.xml
  2. 6 1
      mobile_app/new/wabi/app/src/main/java/com/example/wabi/domain/navigation/Navigation.kt
  3. 5 0
      mobile_app/new/wabi/app/src/main/java/com/example/wabi/domain/repository/UserShareDate.kt
  4. 7 0
      mobile_app/new/wabi/app/src/main/java/com/example/wabi/models/screens/SignInState.kt
  5. 23 5
      mobile_app/new/wabi/app/src/main/java/com/example/wabi/view/MainActivity.kt
  6. 21 2
      mobile_app/new/wabi/app/src/main/java/com/example/wabi/view/MainActivityViewModel.kt
  7. 101 0
      mobile_app/new/wabi/app/src/main/java/com/example/wabi/view/components/bars/bottom/BottomBar.kt
  8. 18 0
      mobile_app/new/wabi/app/src/main/java/com/example/wabi/view/components/bars/bottom/BottomBarViewModel.kt
  9. 25 0
      mobile_app/new/wabi/app/src/main/java/com/example/wabi/view/components/bars/bottom/DestinationBB.kt
  10. 5 4
      mobile_app/new/wabi/app/src/main/java/com/example/wabi/view/screeens/onboard/items/PartSlider.kt
  11. 2 2
      mobile_app/new/wabi/app/src/main/java/com/example/wabi/view/screeens/profile/Profile.kt
  12. 2 2
      mobile_app/new/wabi/app/src/main/java/com/example/wabi/view/screeens/signIn/SignIn.kt
  13. 50 0
      mobile_app/new/wabi/app/src/main/java/com/example/wabi/view/screeens/signIn/SignInViewModel.kt
  14. 65 0
      mobile_app/new/wabi/app/src/main/java/com/example/wabi/view/screeens/signIn/items/EmailForReset.kt
  15. 98 0
      mobile_app/new/wabi/app/src/main/java/com/example/wabi/view/screeens/signIn/items/Login.kt
  16. 2 2
      mobile_app/new/wabi/app/src/main/java/com/example/wabi/view/screeens/signUp/SignUp.kt

+ 8 - 0
mobile_app/new/wabi/.idea/deploymentTargetSelector.xml

@@ -4,6 +4,14 @@
     <selectionStates>
       <SelectionState runConfigName="app">
         <option name="selectionMode" value="DROPDOWN" />
+        <DropdownSelection timestamp="2024-11-22T21:44:11.710793400Z">
+          <Target type="DEFAULT_BOOT">
+            <handle>
+              <DeviceId pluginId="LocalEmulator" identifier="path=C:\Users\bax\.android\avd\Medium_Phone_API_30.avd" />
+            </handle>
+          </Target>
+        </DropdownSelection>
+        <DialogSelection />
       </SelectionState>
     </selectionStates>
   </component>

+ 6 - 1
mobile_app/new/wabi/app/src/main/java/com/example/wabi/domain/navigation/Navigation.kt

@@ -2,6 +2,7 @@ package com.example.wabi.domain.navigation
 
 import android.util.Log
 import androidx.compose.runtime.Composable
+import androidx.compose.runtime.MutableState
 import androidx.navigation.NavHostController
 import androidx.navigation.compose.NavHost
 import androidx.navigation.compose.composable
@@ -13,17 +14,21 @@ import com.example.wabi.view.screeens.signIn.SignIn
 import com.example.wabi.view.screeens.signUp.SignUp
 
 @Composable
-fun Navigation(navHostController: NavHostController, start: String) {
+fun Navigation(
+    navHostController: NavHostController, start: String, isBottomBar: MutableState<Boolean>
+) {
 
     NavHost(
         navController = navHostController, startDestination = start
 
     ) {
         composable(Routes.BASKET) {
+            isBottomBar.value = true
             Log.d("navigation", "go to BASKET")
             Basket(navHostController)
         }
         composable(Routes.ONBOARD) {
+            isBottomBar.value = false
             Log.d("navigation", "go to ONBOARD")
             Onboard(navHostController)
         }

+ 5 - 0
mobile_app/new/wabi/app/src/main/java/com/example/wabi/domain/repository/UserShareDate.kt

@@ -2,8 +2,13 @@ package com.example.wabi.domain.repository
 
 import android.annotation.SuppressLint
 import android.content.Context
+import androidx.compose.runtime.MutableState
+import androidx.compose.runtime.mutableStateOf
+import com.example.wabi.domain.navigation.Routes
 
 @SuppressLint("StaticFieldLeak")
 object UserShareDate {
     var context: Context? = null
+    var currentRoute: String = Routes.BASKET
+    val userIsLogging: MutableState<Boolean> = mutableStateOf(false)
 }

+ 7 - 0
mobile_app/new/wabi/app/src/main/java/com/example/wabi/models/screens/SignInState.kt

@@ -0,0 +1,7 @@
+package com.example.wabi.models.screens
+
+data class SignInState(
+    var email: String = "",
+    var password: String = ""
+)
+

+ 23 - 5
mobile_app/new/wabi/app/src/main/java/com/example/wabi/view/MainActivity.kt

@@ -9,6 +9,7 @@ import androidx.compose.foundation.layout.fillMaxSize
 import androidx.compose.foundation.layout.padding
 import androidx.compose.material3.Scaffold
 import androidx.compose.runtime.Composable
+import androidx.compose.runtime.MutableState
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.remember
 import androidx.compose.ui.Modifier
@@ -22,6 +23,7 @@ import com.example.wabi.domain.navigation.Routes
 import com.example.wabi.domain.repository.PrefManager
 import com.example.wabi.domain.repository.UserShareDate
 import com.example.wabi.ui.theme.WabiTheme
+import com.example.wabi.view.components.bars.bottom.BottomBar
 import dagger.hilt.android.AndroidEntryPoint
 
 @AndroidEntryPoint
@@ -34,7 +36,7 @@ class MainActivity : ComponentActivity() {
         setContent {
             UserShareDate.context = LocalContext.current
             val navHostController = rememberNavController()
-            val isBottomBar = remember { mutableStateOf(false) }
+            val isBottomBar = remember { mutableStateOf(true) }
             val isTopBar = remember { mutableStateOf(false) }
 
             PrefManager.initPrefManager(UserShareDate.context!!)
@@ -42,7 +44,13 @@ class MainActivity : ComponentActivity() {
             WabiTheme(themeState = PrefManager.userTheme) {
                 Scaffold(modifier = Modifier.fillMaxSize(),
                     containerColor = WabiTheme.colors.backgroundColor,
-                    bottomBar = {},
+                    bottomBar = {
+                        if (isBottomBar.value) {
+                            BottomBar(
+                                navHostController = navHostController
+                            )
+                        }
+                    },
                     topBar = {}) { innerPadding ->
                     Box(
                         modifier = Modifier
@@ -50,7 +58,7 @@ class MainActivity : ComponentActivity() {
                             .padding(innerPadding)
                     ) {
 
-                        InitApp(navHostController)
+                        InitApp(navHostController, isBottomBar)
                     }
                 }
             }
@@ -59,6 +67,16 @@ class MainActivity : ComponentActivity() {
 }
 
 @Composable
-fun InitApp(navHostController: NavHostController, vm: MainActivityViewModel = hiltViewModel()) {
-    Navigation(navHostController, Routes.ONBOARD)
+fun InitApp(
+    navHostController: NavHostController,
+    isBottomBar: MutableState<Boolean>,
+    vm: MainActivityViewModel = hiltViewModel()
+) {
+    Navigation(
+        navHostController, start = if (PrefManager.onboard) {
+            Routes.ONBOARD
+        } else {
+            UserShareDate.currentRoute
+        }, isBottomBar
+    )
 }

+ 21 - 2
mobile_app/new/wabi/app/src/main/java/com/example/wabi/view/MainActivityViewModel.kt

@@ -1,11 +1,30 @@
 package com.example.wabi.view
 
 import androidx.lifecycle.ViewModel
-import com.example.wabi.domain.navigation.NavigationProvider
+import androidx.lifecycle.viewModelScope
+import com.example.wabi.domain.repository.PrefManager
+import com.example.wabi.domain.repository.UserShareDate
+import com.example.wabi.domain.supabase.SupabaseServiceImpl
 import dagger.hilt.android.lifecycle.HiltViewModel
+import kotlinx.coroutines.launch
 import javax.inject.Inject
 
 @HiltViewModel
-class MainActivityViewModel @Inject constructor(private val nav: NavigationProvider) : ViewModel() {
+class MainActivityViewModel @Inject constructor(private val supabase: SupabaseServiceImpl) :
+    ViewModel() {
 
+    init {
+        val email = PrefManager.getDataCurrentUser()[0]
+        val password = PrefManager.getDataCurrentUser()[1]
+
+        viewModelScope.launch {
+            if (email != null && password != null && email.isNotEmpty() && password.isNotEmpty()) {
+                val response = supabase.signIn(email, password)
+
+                if (response.error == "") {
+                    UserShareDate.userIsLogging.value == true
+                }
+            }
+        }
+    }
 }

+ 101 - 0
mobile_app/new/wabi/app/src/main/java/com/example/wabi/view/components/bars/bottom/BottomBar.kt

@@ -0,0 +1,101 @@
+package com.example.wabi.view.components.bars.bottom
+
+import androidx.compose.foundation.BorderStroke
+import androidx.compose.foundation.layout.Arrangement
+import androidx.compose.foundation.layout.PaddingValues
+import androidx.compose.foundation.layout.Row
+import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.foundation.layout.offset
+import androidx.compose.foundation.layout.size
+import androidx.compose.foundation.shape.RoundedCornerShape
+import androidx.compose.material3.Button
+import androidx.compose.material3.ButtonDefaults
+import androidx.compose.material3.Icon
+import androidx.compose.material3.NavigationBar
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.getValue
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.draw.clip
+import androidx.compose.ui.graphics.vector.ImageVector
+import androidx.compose.ui.res.vectorResource
+import androidx.compose.ui.unit.dp
+import androidx.hilt.navigation.compose.hiltViewModel
+import androidx.navigation.NavHostController
+import androidx.navigation.compose.currentBackStackEntryAsState
+import com.example.wabi.ui.theme.WabiTheme
+
+@Composable
+fun BottomBar(
+    navHostController: NavHostController,
+    modifier: Modifier = Modifier,
+    vm: BottomBarViewModel = hiltViewModel()
+) {
+    val screens = listOf(
+        DestinationBB.Catalog, DestinationBB.Basket, DestinationBB.Profile
+    )
+
+    NavigationBar(
+        modifier = modifier.clip(shape = RoundedCornerShape(topEnd = 15.dp, topStart = 15.dp)),
+        containerColor = WabiTheme.colors.mainColor
+    ) {
+        val navBackStackEntry by navHostController.currentBackStackEntryAsState()
+        val currentRoute = navBackStackEntry?.destination?.route
+
+        Row(
+            modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceAround
+        ) {
+            screens.forEach { screen ->
+                if (screen.route == currentRoute) {
+                    Button(
+                        onClick = {
+                            vm.changeScreen(
+                                navHostController = navHostController,
+                                whereFrom = currentRoute,
+                                where = screen.route
+                            )
+                        },
+                        contentPadding = PaddingValues(10.dp),
+                        modifier = Modifier
+                            .size(60.dp)
+                            .offset(y = (-8).dp),
+                        colors = ButtonDefaults.buttonColors(
+                            contentColor = WabiTheme.colors.backgroundColor,
+                            containerColor = WabiTheme.colors.mainColor
+                        ),
+                        border = BorderStroke(
+                            width = 3.dp, color = WabiTheme.colors.backgroundColor
+                        )
+                    ) {
+                        Icon(
+                            imageVector = ImageVector.vectorResource(screen.iconId),
+                            contentDescription = screen.route,
+                            modifier = Modifier.size(30.dp)
+                        )
+                    }
+                } else {
+                    Button(
+                        onClick = {
+                            vm.changeScreen(
+                                navHostController = navHostController,
+                                whereFrom = currentRoute!!,
+                                where = screen.route
+                            )
+                        },
+                        contentPadding = PaddingValues(10.dp),
+                        modifier = Modifier.size(60.dp),
+                        colors = ButtonDefaults.buttonColors(
+                            contentColor = WabiTheme.colors.backgroundColor,
+                            containerColor = WabiTheme.colors.mainColor
+                        ),
+                    ) {
+                        Icon(
+                            imageVector = ImageVector.vectorResource(screen.iconId),
+                            contentDescription = screen.route,
+                            modifier = Modifier.size(30.dp)
+                        )
+                    }
+                }
+            }
+        }
+    }
+}

+ 18 - 0
mobile_app/new/wabi/app/src/main/java/com/example/wabi/view/components/bars/bottom/BottomBarViewModel.kt

@@ -0,0 +1,18 @@
+package com.example.wabi.view.components.bars.bottom
+
+import androidx.lifecycle.ViewModel
+import androidx.navigation.NavHostController
+import com.example.wabi.domain.navigation.NavigationProvider
+import dagger.hilt.android.lifecycle.HiltViewModel
+import javax.inject.Inject
+
+@HiltViewModel
+class BottomBarViewModel @Inject constructor(private val nav: NavigationProvider) : ViewModel() {
+    fun changeScreen(
+        navHostController: NavHostController, whereFrom: String, where: String
+    ) {
+        nav.goToNextScreen(
+            navHostController = navHostController, whereFrom = whereFrom, where = where
+        )
+    }
+}

+ 25 - 0
mobile_app/new/wabi/app/src/main/java/com/example/wabi/view/components/bars/bottom/DestinationBB.kt

@@ -0,0 +1,25 @@
+package com.example.wabi.view.components.bars.bottom
+
+import com.example.wabi.R
+import com.example.wabi.domain.navigation.Routes
+import com.example.wabi.domain.repository.UserShareDate
+
+sealed class DestinationBB(
+    val route: String, val iconId: Int
+) {
+    data object Basket : DestinationBB(
+        route = Routes.BASKET, iconId = R.drawable.user_basket_vector
+    )
+
+    data object Catalog : DestinationBB(
+        route = Routes.CATALOG, iconId = R.drawable.catalog_vector
+    )
+
+    data object Profile : DestinationBB(
+        route = if (UserShareDate.userIsLogging.value) {
+            Routes.PROFILE
+        } else {
+            Routes.SIGNIN
+        }, iconId = R.drawable.man_vector
+    )
+}

+ 5 - 4
mobile_app/new/wabi/app/src/main/java/com/example/wabi/view/screeens/onboard/items/PartSlider.kt

@@ -4,10 +4,10 @@ import androidx.compose.foundation.Image
 import androidx.compose.foundation.background
 import androidx.compose.foundation.layout.Arrangement
 import androidx.compose.foundation.layout.Column
-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.rememberScrollState
+import androidx.compose.foundation.verticalScroll
 import androidx.compose.material3.Text
 import androidx.compose.runtime.Composable
 import androidx.compose.ui.Alignment
@@ -39,7 +39,8 @@ fun PartSlider(onboardItem: OnboardListState, modifier: Modifier = Modifier) {
             modifier = modifier
                 .weight(0.2f)
                 .background(color = WabiTheme.colors.onBoardDark)
-                .fillMaxWidth(),
+                .fillMaxWidth()
+                .verticalScroll(rememberScrollState()),
             horizontalAlignment = Alignment.CenterHorizontally,
             verticalArrangement = Arrangement.SpaceAround
         ) {
@@ -54,7 +55,7 @@ fun PartSlider(onboardItem: OnboardListState, modifier: Modifier = Modifier) {
                 color = WabiTheme.colors.onBoardLight,
                 modifier = Modifier.padding(50.dp, 0.dp),
                 minLines = 3,
-                maxLines = 3
+                maxLines = 3,
             )
         }
     }

+ 2 - 2
mobile_app/new/wabi/app/src/main/java/com/example/wabi/view/screeens/profile/Profile.kt

@@ -1,10 +1,10 @@
 package com.example.wabi.view.screeens.profile
 
+import androidx.compose.material3.Text
 import androidx.compose.runtime.Composable
-import androidx.compose.ui.Modifier
 import androidx.navigation.NavHostController
 
 @Composable
 fun Profile(navHostController: NavHostController) {
-
+    Text("Профиль")
 }

+ 2 - 2
mobile_app/new/wabi/app/src/main/java/com/example/wabi/view/screeens/signIn/SignIn.kt

@@ -1,10 +1,10 @@
 package com.example.wabi.view.screeens.signIn
 
+import androidx.compose.material3.Text
 import androidx.compose.runtime.Composable
-import androidx.compose.ui.Modifier
 import androidx.navigation.NavHostController
 
 @Composable
 fun SignIn(navHostController: NavHostController) {
-
+    Text("Вход")
 }

+ 50 - 0
mobile_app/new/wabi/app/src/main/java/com/example/wabi/view/screeens/signIn/SignInViewModel.kt

@@ -0,0 +1,50 @@
+package com.example.wabi.view.screeens.signIn
+
+import android.util.Log
+import androidx.compose.runtime.MutableState
+import androidx.compose.runtime.mutableStateOf
+import androidx.lifecycle.ViewModel
+import androidx.lifecycle.viewModelScope
+import androidx.navigation.NavHostController
+import com.example.wabi.domain.navigation.NavigationProvider
+import com.example.wabi.domain.navigation.Routes
+import com.example.wabi.domain.repository.UserShareDate
+import com.example.wabi.domain.supabase.SupabaseServiceImpl
+import com.example.wabi.models.screens.SignInState
+import dagger.hilt.android.lifecycle.HiltViewModel
+import kotlinx.coroutines.launch
+import javax.inject.Inject
+
+@HiltViewModel
+class SignInViewModel @Inject constructor(
+    private val supabase: SupabaseServiceImpl, private val nav: NavigationProvider
+) : ViewModel() {
+    private val _data = mutableStateOf(SignInState())
+    val data: SignInState get() = _data.value
+
+    fun updateData(newData: SignInState) {
+        _data.value = newData
+    }
+
+    fun signIn(navController: NavHostController, printError: MutableState<Boolean>) {
+        if (data.email != "" && data.password != "") {
+            viewModelScope.launch {
+                val response = supabase.signIn(_data.value.email, _data.value.password)
+                if (response.error == "") {
+                    UserShareDate.userIsLogging.value = true
+                    printError.value = false
+                    nav.goToNextScreen(
+                        navHostController = navController, Routes.SIGNIN, Routes.BASKET
+                    )
+                } else {
+                    Log.d("signIn", "Ошибка входа!")
+                    printError.value = true
+                }
+            }
+        }
+    }
+
+    fun validateEmail(email: String): Boolean {
+        return email != "" && android.util.Patterns.EMAIL_ADDRESS.matcher(email).matches()
+    }
+}

+ 65 - 0
mobile_app/new/wabi/app/src/main/java/com/example/wabi/view/screeens/signIn/items/EmailForReset.kt

@@ -0,0 +1,65 @@
+package com.example.wabi.view.screeens.signIn.items
+
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.Row
+import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.foundation.layout.padding
+import androidx.compose.material3.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.MutableState
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.unit.dp
+import com.example.wabi.ui.theme.WabiTheme
+import com.example.wabi.view.common_elements.button.MainButton
+import com.example.wabi.view.common_elements.textfields.MainTextField
+import com.example.wabi.view.components.buttons.ButtonBack
+import com.example.wabi.view.components.buttons.MainButton
+import com.example.wabi.view.components.texts.Error.ErrorList
+import com.example.wabi.view.components.texts.Error.ErrorPrint
+import com.example.wabi.view.screeens.signIn.SignInViewModel
+
+@Composable
+fun EmailForReset(email: String, vm: SignInViewModel, visible: MutableState<Boolean>) {
+    var correctEmail = remember { mutableStateOf(false) }
+    val currentEmail = remember { mutableStateOf(email) }
+    Row(
+        modifier = Modifier.fillMaxWidth()
+    ) {
+        ButtonBack(onClick = {
+            visible.value = true
+        }, modifier = Modifier.padding(10.dp))
+    }
+    Text(
+        text = "Восстановите\nпароль",
+        style = WabiTheme.fonts.headerFont,
+        maxLines = 2,
+        minLines = 2,
+        color = WabiTheme.colors.mainColor
+    )
+    Text(
+        text = "Для восстановления\nпароля введите\nсвою почту",
+        style = WabiTheme.fonts.mainFont,
+        color = WabiTheme.colors.mainColor
+    )
+    ErrorPrint(text = if (correctEmail.value) ErrorList.emailNotExists else "")
+
+    Column() {
+        MainTextField(
+            value = currentEmail.value,
+            input = { currentEmail.value = it },
+            placeholder = "Почта",
+            lable = "Введите почту:",
+            trailingText = ""
+        )
+    }
+
+    MainButton(
+        onClick = {},
+        enabled = vm.validateEmail(currentEmail.value),
+        textContent = "Отправить код",
+        modifier = Modifier.padding(30.dp, 0.dp)
+    )
+
+}

+ 98 - 0
mobile_app/new/wabi/app/src/main/java/com/example/wabi/view/screeens/signIn/items/Login.kt

@@ -0,0 +1,98 @@
+package com.example.wabi.view.screens.signIn.states
+
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.Spacer
+import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.foundation.layout.height
+import androidx.compose.foundation.layout.offset
+import androidx.compose.foundation.layout.padding
+import androidx.compose.material3.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.MutableState
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.unit.dp
+import androidx.navigation.NavHostController
+import com.example.wabi.model.screens.SignInState
+import com.example.wabi.ui.theme.WabiTheme
+import com.example.wabi.view.common_elements.button.ButtonLink
+import com.example.wabi.view.common_elements.button.MainButton
+import com.example.wabi.view.common_elements.text.error.ErrorList
+import com.example.wabi.view.common_elements.text.error.ErrorPrint
+import com.example.wabi.view.common_elements.textfields.MainTextField
+import com.example.wabi.view.common_elements.textfields.PasswordTextField
+import com.example.wabi.view.screens.signIn.SignInViewModel
+
+@Composable
+fun Login(
+    navController: NavHostController,
+    printError: MutableState<Boolean>,
+    visible: MutableState<Boolean>,
+    data: SignInState,
+    vm: SignInViewModel
+) {
+    Text(
+        text = "Добро\nпожаловать!",
+        style = WabiTheme.fonts.headerFont,
+        maxLines = 2,
+        minLines = 2,
+        color = WabiTheme.colors.mainColor
+    )
+    Text(
+        text = "Войдите, чтобы\nпользоваться функциями приложения",
+        style = WabiTheme.fonts.mainFont,
+        color = WabiTheme.colors.mainColor
+    )
+    ErrorPrint(text = if (printError.value) ErrorList.errorPassOrEmail else "")
+    Column(
+        modifier = Modifier.fillMaxWidth()
+    ) {
+        MainTextField(
+            value = data.email,
+            input = { vm.updateData(data.copy(email = it)) },
+            placeholder = "Почта",
+            lable = "Введите почту:",
+            trailingText = ""
+        )
+        Spacer(modifier = Modifier.height(10.dp))
+        PasswordTextField(
+            value = data.password,
+            input = { vm.updateData(data.copy(password = it)) },
+            placeholder = "Пароль",
+            lable = "Введите пароль:"
+        )
+    }
+    Column(
+        horizontalAlignment = Alignment.CenterHorizontally
+    ) {
+        Text(
+            text = "Нет аккаунта?",
+            style = WabiTheme.fonts.acentFont,
+            color = WabiTheme.colors.mainColor
+        )
+        ButtonLink(
+            onClick = {
+                vm.goToRegistration(navController = navController)
+            },
+            textContent = "Зарегистирируйтесь!",
+            modifierButton = Modifier.offset(y = (-15).dp),
+            colorContent = WabiTheme.colors.mainColor
+        )
+        MainButton(
+            onClick = {
+                vm.signIn(navController = navController, printError = printError)
+            },
+            enabled = data.password != "" && vm.validateEmail(data.email),
+            textContent = "Войти",
+            modifierButton = Modifier
+                .padding(30.dp, 0.dp)
+                .fillMaxWidth()
+        )
+        Spacer(Modifier.height(5.dp))
+        ButtonLink(
+            onClick = {
+                visible.value = false
+            }, textContent = "Забыли пароль?", colorContent = WabiTheme.colors.mainColor
+        )
+    }
+}

+ 2 - 2
mobile_app/new/wabi/app/src/main/java/com/example/wabi/view/screeens/signUp/SignUp.kt

@@ -1,10 +1,10 @@
 package com.example.wabi.view.screeens.signUp
 
+import androidx.compose.material3.Text
 import androidx.compose.runtime.Composable
-import androidx.compose.ui.Modifier
 import androidx.navigation.NavHostController
 
 @Composable
 fun SignUp(navHostController: NavHostController) {
-
+    Text("Регистрация")
 }