Browse Source

feat: end creating registration

Bax 3 days ago
parent
commit
bac1c56e45
17 changed files with 183 additions and 263 deletions
  1. 1 0
      mobile_app/Wabi/.idea/gradle.xml
  2. 1 0
      mobile_app/Wabi/.idea/vcs.xml
  3. 2 2
      mobile_app/Wabi/app/build.gradle.kts
  4. 0 3
      mobile_app/Wabi/app/src/main/java/com/example/wabi/domain/repository/UserShareDate.kt
  5. 2 0
      mobile_app/Wabi/app/src/main/java/com/example/wabi/domain/supabase/SupabaseService.kt
  6. 24 2
      mobile_app/Wabi/app/src/main/java/com/example/wabi/domain/supabase/SupabaseServiceImpl.kt
  7. 1 0
      mobile_app/Wabi/app/src/main/java/com/example/wabi/models/screens/SignUpUser.kt
  8. 1 1
      mobile_app/Wabi/app/src/main/java/com/example/wabi/view/MainActivity.kt
  9. 1 6
      mobile_app/Wabi/app/src/main/java/com/example/wabi/view/MainActivityViewModel.kt
  10. 6 3
      mobile_app/Wabi/app/src/main/java/com/example/wabi/view/components/images/StandartProfileImage.kt
  11. 1 29
      mobile_app/Wabi/app/src/main/java/com/example/wabi/view/screeens/basket/Basket.kt
  12. 5 0
      mobile_app/Wabi/app/src/main/java/com/example/wabi/view/screeens/basket/BasketViewModel.kt
  13. 50 10
      mobile_app/Wabi/app/src/main/java/com/example/wabi/view/screeens/logIn/LogInViewModel.kt
  14. 1 1
      mobile_app/Wabi/app/src/main/java/com/example/wabi/view/screeens/logIn/items/SignUp.kt
  15. 47 4
      mobile_app/Wabi/app/src/main/java/com/example/wabi/view/screeens/logIn/items/signUpItems/CreatePofile.kt
  16. 40 0
      mobile_app/Wabi/app/src/main/java/com/example/wabi/view/screeens/logIn/items/signUpItems/ImageProfileSignUp.kt
  17. 0 202
      mobile_app/new/wabi/.idea/workspace.xml

+ 1 - 0
mobile_app/Wabi/.idea/gradle.xml

@@ -1,5 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <project version="4">
+  <component name="GradleMigrationSettings" migrationVersion="1" />
   <component name="GradleSettings">
     <option name="linkedExternalProjectsSettings">
       <GradleProjectSettings>

+ 1 - 0
mobile_app/Wabi/.idea/vcs.xml

@@ -2,5 +2,6 @@
 <project version="4">
   <component name="VcsDirectoryMappings">
     <mapping directory="$PROJECT_DIR$/../../.." vcs="Git" />
+    <mapping directory="$PROJECT_DIR$/../.." vcs="Git" />
   </component>
 </project>

+ 2 - 2
mobile_app/Wabi/app/build.gradle.kts

@@ -78,8 +78,8 @@ dependencies {
     implementation("androidx.navigation:navigation-compose:2.8.4")
 
     //coil
-    implementation("io.coil-kt:coil-compose:2.2.2")
-    implementation("io.coil-kt:coil-svg:2.2.2")
+    implementation("io.coil-kt:coil-compose:2.7.0")
+    implementation("io.coil-kt:coil-svg:2.7.0")
 
     // hilt
     implementation("com.google.dagger:hilt-android:2.48")

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

@@ -5,13 +5,10 @@ import android.content.Context
 import androidx.compose.runtime.MutableState
 import androidx.compose.runtime.mutableStateOf
 import com.example.wabi.domain.navigation.Routes
-import com.example.wabi.view.screeens.connection.ConncetionDestinations
 
 @SuppressLint("StaticFieldLeak")
 object UserShareDate {
     var context: Context? = null
     var currentRoute: String = Routes.BASKET
     val userIsLogging: MutableState<Boolean> = mutableStateOf(false)
-    val connectionInternet: MutableState<Boolean> =
-        mutableStateOf(ConncetionDestinations.internetConnection)
 }

+ 2 - 0
mobile_app/Wabi/app/src/main/java/com/example/wabi/domain/supabase/SupabaseService.kt

@@ -3,6 +3,7 @@ package com.example.wabi.domain.supabase
 import com.example.wabi.models.responses.Response
 import com.example.wabi.models.screens.SignUpUser
 import com.example.wabi.models.supabase.Basket
+import io.github.jan.supabase.gotrue.user.UserInfo
 
 interface SupabaseService {
     suspend fun signIn(userEmail: String, userPasword: String): Response
@@ -11,6 +12,7 @@ interface SupabaseService {
     suspend fun addUser(user: SignUpUser): Response
     suspend fun emailIsExists(userEmail: String): Boolean
     suspend fun uploadImageToStorage(where: String, name: String, image: ByteArray): Response
+    suspend fun getCurrentUser(): UserInfo?
 
     suspend fun resetPasswordForEmail(userEmail: String): Response
     suspend fun getBasket(): List<Basket>

+ 24 - 2
mobile_app/Wabi/app/src/main/java/com/example/wabi/domain/supabase/SupabaseServiceImpl.kt

@@ -4,9 +4,11 @@ import android.util.Log
 import com.example.wabi.models.responses.Response
 import com.example.wabi.models.screens.SignUpUser
 import com.example.wabi.models.supabase.Basket
+import com.example.wabi.models.supabase.User
 import io.github.jan.supabase.SupabaseClient
 import io.github.jan.supabase.gotrue.auth
 import io.github.jan.supabase.gotrue.providers.builtin.Email
+import io.github.jan.supabase.gotrue.user.UserInfo
 import io.github.jan.supabase.postgrest.from
 import io.github.jan.supabase.postgrest.query.Columns
 import io.github.jan.supabase.postgrest.query.Count
@@ -56,7 +58,23 @@ class SupabaseServiceImpl @Inject constructor(private val supabase: SupabaseClie
     }
 
     override suspend fun addUser(user: SignUpUser): Response {
-        TODO("Not yet implemented")
+        return try {
+            val userCreate = User(
+                id = user.id,
+                email = user.email,
+                image = user.image,
+                nickname = user.nickname,
+                basketCode = user.basketCode
+            )
+
+            var response = supabase.from("user").insert(userCreate)
+
+            Log.d("add user", "The user was update for create")
+            Response(response.toString())
+        } catch (ex: Exception) {
+            Log.e("signUp", ex.message.toString())
+            Response("", ex.message.toString())
+        }
     }
 
     override suspend fun emailIsExists(userEmail: String): Boolean {
@@ -76,7 +94,7 @@ class SupabaseServiceImpl @Inject constructor(private val supabase: SupabaseClie
         where: String, name: String, image: ByteArray
     ): Response {
         return try {
-            var response = supabase.storage.from(where).upload(name, image, upsert = false)
+            var response = supabase.storage.from(where).upload(name, image, upsert = true)
             Log.d("storage", "Image $name was uploaded to $where")
             Response(response.toString())
         } catch (ex: Exception) {
@@ -85,6 +103,10 @@ class SupabaseServiceImpl @Inject constructor(private val supabase: SupabaseClie
         }
     }
 
+    override suspend fun getCurrentUser(): UserInfo? {
+        return supabase.auth.currentUserOrNull()
+    }
+
     override suspend fun resetPasswordForEmail(userEmail: String): Response {
         return try {
             val response = supabase.auth.resetPasswordForEmail(email = userEmail)

+ 1 - 0
mobile_app/Wabi/app/src/main/java/com/example/wabi/models/screens/SignUpUser.kt

@@ -6,6 +6,7 @@ data class SignUpUser(
     val id: String = "",
     val nickname: String = "",
     val image: String? = "",
+    val imageOfBytes: ByteArray? = null,
     @SerialName("basket_code") val basketCode: String? = "",
     val theme: Int = 0,
     val email: String = ""

+ 1 - 1
mobile_app/Wabi/app/src/main/java/com/example/wabi/view/MainActivity.kt

@@ -107,7 +107,7 @@ fun InitApp(
     isBottomBar: MutableState<Boolean>,
     vm: MainActivityViewModel = hiltViewModel()
 ) {
-    vm.checkUserlogging()
+    vm.checkUserLogging()
     Navigation(
         navHostController, start = if (PrefManager.onboard) {
             Routes.ONBOARD

+ 1 - 6
mobile_app/Wabi/app/src/main/java/com/example/wabi/view/MainActivityViewModel.kt

@@ -1,6 +1,5 @@
 package com.example.wabi.view
 
-import android.content.Context
 import androidx.lifecycle.ViewModel
 import androidx.lifecycle.viewModelScope
 import com.example.wabi.domain.repository.PrefManager
@@ -15,7 +14,7 @@ import javax.inject.Inject
 class MainActivityViewModel @Inject constructor(private val supabase: SupabaseServiceImpl) :
     ViewModel() {
 
-    fun checkUserlogging() {
+    fun checkUserLogging() {
         val email = PrefManager.getDataCurrentUser()[0]
         val password = PrefManager.getDataCurrentUser()[1]
 
@@ -28,8 +27,4 @@ class MainActivityViewModel @Inject constructor(private val supabase: SupabaseSe
             }
         }
     }
-
-    fun checkInternetConection() {
-
-    }
 }

+ 6 - 3
mobile_app/Wabi/app/src/main/java/com/example/wabi/view/components/images/StandartProfileImage.kt

@@ -3,6 +3,7 @@ package com.example.wabi.view.components.images
 import androidx.compose.foundation.Image
 import androidx.compose.foundation.background
 import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.fillMaxSize
 import androidx.compose.foundation.layout.padding
 import androidx.compose.foundation.shape.RoundedCornerShape
 import androidx.compose.runtime.Composable
@@ -18,9 +19,11 @@ import com.example.wabi.ui.theme.WabiTheme
 @Composable
 fun StandartProfileImage(modifier: Modifier = Modifier) {
     Box(
-        modifier = modifier.background(
-            WabiTheme.colors.singleColor, shape = RoundedCornerShape(30.dp)
-        ), contentAlignment = Alignment.Center
+        modifier = modifier
+            .background(
+                WabiTheme.colors.singleColor, shape = RoundedCornerShape(30.dp)
+            )
+            .fillMaxSize(0.4f), contentAlignment = Alignment.Center
     ) {
         Image(
             imageVector = ImageVector.vectorResource(R.drawable.man_vector),

+ 1 - 29
mobile_app/Wabi/app/src/main/java/com/example/wabi/view/screeens/basket/Basket.kt

@@ -1,39 +1,11 @@
 package com.example.wabi.view.screeens.basket
 
-import androidx.compose.foundation.layout.Arrangement
-import androidx.compose.foundation.layout.Column
-import androidx.compose.foundation.layout.fillMaxSize
-import androidx.compose.material3.Button
-import androidx.compose.material3.ExperimentalMaterial3Api
-import androidx.compose.material3.Text
-import androidx.compose.material3.rememberModalBottomSheetState
 import androidx.compose.runtime.Composable
-import androidx.compose.runtime.getValue
-import androidx.compose.runtime.mutableStateOf
-import androidx.compose.runtime.saveable.rememberSaveable
-import androidx.compose.runtime.setValue
-import androidx.compose.ui.Alignment
-import androidx.compose.ui.Modifier
 import androidx.hilt.navigation.compose.hiltViewModel
 import androidx.navigation.NavHostController
 
-@OptIn(ExperimentalMaterial3Api::class)
+
 @Composable
 fun Basket(navHostController: NavHostController, vm: BasketViewModel = hiltViewModel()) {
-    val sheetState = rememberModalBottomSheetState()
-    var isSheetOpen by rememberSaveable {
-        mutableStateOf(false)
-    }
-
-    Column(
-        verticalArrangement = Arrangement.Center,
-        horizontalAlignment = Alignment.CenterHorizontally,
-        modifier = Modifier.fillMaxSize()
-    ) {
-        Button(onClick = {
-            vm.getListBasket()
-        }) { Text("Открыть") }
-
 
-    }
 }

+ 5 - 0
mobile_app/Wabi/app/src/main/java/com/example/wabi/view/screeens/basket/BasketViewModel.kt

@@ -1,11 +1,16 @@
 package com.example.wabi.view.screeens.basket
 
+import android.graphics.Bitmap
+import android.graphics.BitmapFactory
+import android.net.Uri
 import android.util.Log
 import androidx.lifecycle.ViewModel
 import androidx.lifecycle.viewModelScope
+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 java.io.ByteArrayOutputStream
 import javax.inject.Inject
 
 @HiltViewModel

+ 50 - 10
mobile_app/Wabi/app/src/main/java/com/example/wabi/view/screeens/logIn/LogInViewModel.kt

@@ -1,15 +1,15 @@
 package com.example.wabi.view.screeens.logIn
 
-import android.content.Context
 import android.graphics.Bitmap
 import android.graphics.BitmapFactory
+import android.net.Uri
 import android.util.Log
+import android.widget.Toast
 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.R
 import com.example.wabi.domain.navigation.NavigationProvider
 import com.example.wabi.domain.navigation.Routes
 import com.example.wabi.domain.repository.PrefManager
@@ -24,6 +24,7 @@ import kotlinx.coroutines.flow.MutableStateFlow
 import kotlinx.coroutines.flow.asStateFlow
 import kotlinx.coroutines.launch
 import java.io.ByteArrayOutputStream
+import java.util.UUID
 import javax.inject.Inject
 
 @HiltViewModel
@@ -94,20 +95,52 @@ class LogInViewModel @Inject constructor(
     fun signUp(
     ) {
         viewModelScope.launch {
-            val response = supabase.signUp(
+            var response = supabase.signUp(
                 userEmail = _signUpData.value.email, userPasword = _signUpData.value.passwordOne
             )
 
             if (response.error == "") {
 
-                UserShareDate.userIsLogging.value = true
-                PrefManager.initPrefManager(UserShareDate.context!!)
-                PrefManager.saveDataCurrentUser(
-                    _signInData.value.email, _signInData.value.password
+                Log.d("current user", supabase.getCurrentUser().toString())
+
+                val uuidBasket = UUID.randomUUID().toString()
+
+                updateUserDataSignUp(
+                    _signUpUser.value.copy(
+                        id = supabase.getCurrentUser()!!.id,
+                        email = _signUpData.value.email,
+                        image = if (_signUpUser.value.imageOfBytes != null) {
+                            "$uuidBasket.png"
+                        } else {
+                            null
+                        },
+                        basketCode = uuidBasket
+                    )
                 )
 
+                if (_signUpUser.value.imageOfBytes != null) {
+                    supabase.uploadImageToStorage(
+                        where = "image/user",
+                        name = "$uuidBasket.png",
+                        image = _signUpUser.value.imageOfBytes!!
+                    )
+                }
+
+                response = supabase.addUser(_signUpUser.value)
+
+                if (response.error == "") {
+                    UserShareDate.userIsLogging.value = true
+                    PrefManager.initPrefManager(UserShareDate.context!!)
+                    PrefManager.saveDataCurrentUser(
+                        _signInData.value.email, _signInData.value.password
+                    )
+                    Toast.makeText(UserShareDate.context!!, "Добро пожаловать!", Toast.LENGTH_LONG)
+                        .show()
+                } else {
+                    Log.e("signUn", "Error registration!")
+                }
             } else {
-                Log.d("signUn", "Error registration!")
+                Log.e("signUn", "Error registration!")
             }
         }
     }
@@ -146,13 +179,20 @@ class LogInViewModel @Inject constructor(
         return password.length > 5
     }
 
-    private fun converterBitMapToByteArray(context: Context): ByteArray {
-        val bitmap = BitmapFactory.decodeResource(context.resources, R.drawable.man_vector)
+    fun converterBitMapToByteArray(uri: Uri): ByteArray {
+        val inputStream = UserShareDate.context!!.contentResolver.openInputStream(uri)
+        val bitmap = BitmapFactory.decodeStream(inputStream)
         val byteArrayInputStream = ByteArrayOutputStream()
         bitmap.compress(Bitmap.CompressFormat.PNG, 100, byteArrayInputStream)
         return byteArrayInputStream.toByteArray()
     }
 
+    fun uploadUserImage(image: ByteArray, name: String) {
+        viewModelScope.launch {
+            supabase.uploadImageToStorage(where = "image/user", name = "$name.png", image = image)
+        }
+    }
+
     fun sendEmailForResetPassword(email: String): Boolean {
         var result = false
         viewModelScope.launch {

+ 1 - 1
mobile_app/Wabi/app/src/main/java/com/example/wabi/view/screeens/logIn/items/SignUp.kt

@@ -34,7 +34,7 @@ fun SignUp(vm: LogInViewModel, screenState: MutableState<Int>) {
         )
 
         SignUpStateDestination.createProfile -> CreatePofile(
-            station = SingUpDestinations.emailAndPassword, vm = vm
+            station = SingUpDestinations.profile, vm = vm
         )
     }
 }

+ 47 - 4
mobile_app/Wabi/app/src/main/java/com/example/wabi/view/screeens/logIn/items/signUpItems/CreatePofile.kt

@@ -1,14 +1,24 @@
 package com.example.wabi.view.screeens.logIn.items.signUpItems
 
+import android.net.Uri
+import androidx.activity.compose.rememberLauncherForActivityResult
+import androidx.activity.result.PickVisualMediaRequest
+import androidx.activity.result.contract.ActivityResultContracts
+import androidx.compose.foundation.border
+import androidx.compose.foundation.layout.Box
 import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.shape.RoundedCornerShape
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.MutableState
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.remember
+import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.unit.dp
+import com.example.wabi.ui.theme.WabiTheme
 import com.example.wabi.view.components.buttons.MainButton
 import com.example.wabi.view.components.images.StandartProfileImage
+import com.example.wabi.view.components.textFields.MainTextField
 import com.example.wabi.view.components.texts.HeaderText
 import com.example.wabi.view.components.texts.MainText
 import com.example.wabi.view.screeens.logIn.LogInViewModel
@@ -20,7 +30,18 @@ fun CreatePofile(
     vm: LogInViewModel,
 ) {
     val user = vm.signUpUser
-    val image: MutableState<ByteArray?> = remember { mutableStateOf(byteArrayOf()) }
+
+    var image: MutableState<Uri> = remember { mutableStateOf(Uri.EMPTY) }
+    val launcher =
+        rememberLauncherForActivityResult(contract = ActivityResultContracts.PickVisualMedia()) { uri ->
+            if (uri != null) {
+                image.value = uri
+                if (image.value != Uri.EMPTY) {
+                    var byteArray = vm.converterBitMapToByteArray(uri = image.value)
+                    vm.updateUserDataSignUp(user.copy(imageOfBytes = byteArray))
+                }
+            }
+        }
 
     HeaderText(text = station.header)
 
@@ -28,14 +49,36 @@ fun CreatePofile(
         text = station.description
     )
 
-    StandartProfileImage()
+    Box(
+        contentAlignment = Alignment.Center, modifier = modifier.border(
+            width = 3.dp, color = WabiTheme.colors.mainColor, shape = RoundedCornerShape(30.dp)
+        )
+    ) {
+        if (image.value == Uri.EMPTY) {
+            StandartProfileImage()
+        } else {
+            ImageProfileSignUp(image.value)
+        }
+    }
 
     MainButton(
-        onClick = {}, textContent = "Cвоё изображение", modifier = Modifier.padding(30.dp)
+        onClick = {
+            launcher.launch(PickVisualMediaRequest(mediaType = ActivityResultContracts.PickVisualMedia.ImageOnly))
+        }, textContent = "Cвоё изображение", modifier = Modifier.padding(30.dp)
+    )
+
+    MainTextField(
+        value = user.nickname,
+        input = { vm.updateUserDataSignUp(user.copy(nickname = it)) },
+        placeholder = "nikname",
+        lable = "Введите псевдоним:",
+        trailingText = ""
     )
 
     MainButton(
-        onClick = {}, textContent = station.buttonName, modifier = Modifier.padding(30.dp)
+        onClick = {
+            vm.signUp()
+        }, textContent = station.buttonName, modifier = Modifier.padding(30.dp)
     )
 
 }

+ 40 - 0
mobile_app/Wabi/app/src/main/java/com/example/wabi/view/screeens/logIn/items/signUpItems/ImageProfileSignUp.kt

@@ -0,0 +1,40 @@
+package com.example.wabi.view.screeens.logIn.items.signUpItems
+
+import android.net.Uri
+import androidx.compose.foundation.Image
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.foundation.shape.RoundedCornerShape
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.draw.clip
+import androidx.compose.ui.layout.ContentScale
+import androidx.compose.ui.unit.dp
+import coil.compose.AsyncImagePainter.State
+import coil.compose.rememberAsyncImagePainter
+import coil.request.ImageRequest
+import coil.size.Size.Companion.ORIGINAL
+import com.example.wabi.domain.repository.UserShareDate
+import com.example.wabi.view.components.images.StandartProfileImage
+
+@Composable
+fun ImageProfileSignUp(image: Uri, modifier: Modifier = Modifier) {
+    val painter = rememberAsyncImagePainter(
+        model = ImageRequest.Builder(UserShareDate.context!!).data(image).size(ORIGINAL).build(),
+        contentScale = ContentScale.Crop
+    ).state
+
+    if (painter is State.Error) {
+        StandartProfileImage()
+    } else {
+        if (painter is State.Success) {
+            Image(
+                painter = painter.painter,
+                contentDescription = "Image from URI",
+                contentScale = ContentScale.Crop,
+                modifier = Modifier
+                    .clip(shape = RoundedCornerShape(30.dp))
+                    .fillMaxSize(0.4f)
+            )
+        }
+    }
+}

+ 0 - 202
mobile_app/new/wabi/.idea/workspace.xml

@@ -1,202 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4">
-  <component name="AndroidLayouts">
-    <shared>
-      <config />
-    </shared>
-  </component>
-  <component name="AutoImportSettings">
-    <option name="autoReloadType" value="NONE" />
-  </component>
-  <component name="ChangeListManager">
-    <list default="true" id="21b3d92b-fd7e-4612-a134-20c6a430b8d2" name="Changes" comment="" />
-    <option name="SHOW_DIALOG" value="false" />
-    <option name="HIGHLIGHT_CONFLICTS" value="true" />
-    <option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
-    <option name="LAST_RESOLUTION" value="IGNORE" />
-  </component>
-  <component name="ClangdSettings">
-    <option name="formatViaClangd" value="false" />
-  </component>
-  <component name="ExecutionTargetManager" SELECTED_TARGET="device_and_snapshot_combo_box_target[DeviceId(pluginId=LocalEmulator, isTemplate=false, identifier=path=C:\Users\bax\.android\avd\Medium_Phone.avd)]" />
-  <component name="ExternalProjectsData">
-    <projectState path="$PROJECT_DIR$">
-      <ProjectState />
-    </projectState>
-  </component>
-  <component name="ExternalProjectsManager">
-    <system id="GRADLE">
-      <state>
-        <task path="$PROJECT_DIR$/app">
-          <activation />
-        </task>
-        <projects_view>
-          <tree_state>
-            <expand>
-              <path>
-                <item name="" type="6a2764b6:ExternalProjectsStructure$RootNode" />
-                <item name="Wabi" type="f1a62948:ProjectNode" />
-              </path>
-              <path>
-                <item name="" type="6a2764b6:ExternalProjectsStructure$RootNode" />
-                <item name="Wabi" type="f1a62948:ProjectNode" />
-                <item name="app" type="2d1252cf:ModuleNode" />
-              </path>
-              <path>
-                <item name="" type="6a2764b6:ExternalProjectsStructure$RootNode" />
-                <item name="Wabi" type="f1a62948:ProjectNode" />
-                <item name="app" type="2d1252cf:ModuleNode" />
-                <item name="Tasks" type="e4a08cd1:TasksNode" />
-              </path>
-              <path>
-                <item name="" type="6a2764b6:ExternalProjectsStructure$RootNode" />
-                <item name="Wabi" type="f1a62948:ProjectNode" />
-                <item name="app" type="2d1252cf:ModuleNode" />
-                <item name="Tasks" type="e4a08cd1:TasksNode" />
-                <item name="other" type="c8890929:TasksNode$1" />
-              </path>
-            </expand>
-            <select />
-          </tree_state>
-        </projects_view>
-      </state>
-    </system>
-  </component>
-  <component name="FileTemplateManagerImpl">
-    <option name="RECENT_TEMPLATES">
-      <list>
-        <option value="Kotlin Interface" />
-        <option value="Kotlin Object" />
-        <option value="Kotlin Data Class" />
-        <option value="Kotlin File" />
-        <option value="Kotlin Class" />
-      </list>
-    </option>
-  </component>
-  <component name="Git.Settings">
-    <option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$/../../.." />
-  </component>
-  <component name="ProjectColorInfo">{
-  &quot;associatedIndex&quot;: 8
-}</component>
-  <component name="ProjectId" id="2pCytqLWoPIbbENJ60gH1roMmsG" />
-  <component name="ProjectLevelVcsManager" settingsEditedManually="true">
-    <ConfirmationsSetting value="2" id="Add" />
-  </component>
-  <component name="ProjectViewState">
-    <option name="hideEmptyMiddlePackages" value="true" />
-    <option name="showLibraryContents" value="true" />
-  </component>
-  <component name="PropertiesComponent"><![CDATA[{
-  "keyToString": {
-    "Android App.app.executor": "Run",
-    "RunOnceActivity.ShowReadmeOnStart": "true",
-    "RunOnceActivity.cidr.known.project.marker": "true",
-    "RunOnceActivity.readMode.enableVisualFormatting": "true",
-    "cf.first.check.clang-format": "false",
-    "cidr.known.project.marker": "true",
-    "com.google.services.firebase.aqiPopupShown": "true",
-    "git-widget-placeholder": "master",
-    "kotlin-language-version-configured": "true",
-    "last_opened_file_path": "D:/Progect/mobile/Wabi/mobile_app/Wabi",
-    "project.structure.last.edited": "Dependencies",
-    "project.structure.proportion": "0.17",
-    "project.structure.side.proportion": "0.2",
-    "settings.editor.selected.configurable": "project.propVCSSupport.DirectoryMappings",
-    "show.do.not.copy.http.proxy.settings.to.gradle": "false"
-  },
-  "keyToStringList": {
-    "kotlin-gradle-user-dirs": [
-      "C:\\Users\\bax\\.gradle"
-    ]
-  }
-}]]></component>
-  <component name="RecentsManager">
-    <key name="CopyFile.RECENT_KEYS">
-      <recent name="D:\Progect\mobile\Wabi\mobile_app\new\wabi\app\src\main\java\com\example\wabi\view\components\textFields" />
-      <recent name="D:\Progect\mobile\Wabi\mobile_app\new\wabi\app\src\main\java\com\example\wabi\view\screeens\signIn\items" />
-      <recent name="D:\Progect\mobile\Wabi\mobile_app\new\wabi\app\src\main\java\com\example\wabi\view\components\texts\Error" />
-      <recent name="D:\Progect\mobile\Wabi\mobile_app\new\wabi\app\src\main\java\com\example\wabi\view\components\buttons" />
-      <recent name="D:\Progect\mobile\Wabi\mobile_app\new\wabi\app\src\main\java\com\example\wabi\models\supabase" />
-    </key>
-  </component>
-  <component name="RunManager">
-    <configuration name="app" type="AndroidRunConfigurationType" factoryName="Android App" activateToolWindowBeforeRun="false">
-      <module name="Wabi.app.main" />
-      <option name="DEPLOY" value="true" />
-      <option name="DEPLOY_APK_FROM_BUNDLE" value="false" />
-      <option name="DEPLOY_AS_INSTANT" value="false" />
-      <option name="ARTIFACT_NAME" value="" />
-      <option name="PM_INSTALL_OPTIONS" value="" />
-      <option name="ALL_USERS" value="false" />
-      <option name="ALWAYS_INSTALL_WITH_PM" value="false" />
-      <option name="CLEAR_APP_STORAGE" value="false" />
-      <option name="DYNAMIC_FEATURES_DISABLED_LIST" value="" />
-      <option name="ACTIVITY_EXTRA_FLAGS" value="" />
-      <option name="MODE" value="default_activity" />
-      <option name="CLEAR_LOGCAT" value="false" />
-      <option name="SHOW_LOGCAT_AUTOMATICALLY" value="false" />
-      <option name="TARGET_SELECTION_MODE" value="DEVICE_AND_SNAPSHOT_COMBO_BOX" />
-      <option name="SELECTED_CLOUD_MATRIX_CONFIGURATION_ID" value="-1" />
-      <option name="SELECTED_CLOUD_MATRIX_PROJECT_ID" value="" />
-      <option name="DEBUGGER_TYPE" value="Auto" />
-      <Auto>
-        <option name="USE_JAVA_AWARE_DEBUGGER" value="false" />
-        <option name="SHOW_STATIC_VARS" value="true" />
-        <option name="WORKING_DIR" value="" />
-        <option name="TARGET_LOGGING_CHANNELS" value="lldb process:gdb-remote packets" />
-        <option name="SHOW_OPTIMIZED_WARNING" value="true" />
-        <option name="ATTACH_ON_WAIT_FOR_DEBUGGER" value="false" />
-        <option name="DEBUG_SANDBOX_SDK" value="false" />
-      </Auto>
-      <Hybrid>
-        <option name="USE_JAVA_AWARE_DEBUGGER" value="false" />
-        <option name="SHOW_STATIC_VARS" value="true" />
-        <option name="WORKING_DIR" value="" />
-        <option name="TARGET_LOGGING_CHANNELS" value="lldb process:gdb-remote packets" />
-        <option name="SHOW_OPTIMIZED_WARNING" value="true" />
-        <option name="ATTACH_ON_WAIT_FOR_DEBUGGER" value="false" />
-        <option name="DEBUG_SANDBOX_SDK" value="false" />
-      </Hybrid>
-      <Java>
-        <option name="ATTACH_ON_WAIT_FOR_DEBUGGER" value="false" />
-        <option name="DEBUG_SANDBOX_SDK" value="false" />
-      </Java>
-      <Native>
-        <option name="USE_JAVA_AWARE_DEBUGGER" value="false" />
-        <option name="SHOW_STATIC_VARS" value="true" />
-        <option name="WORKING_DIR" value="" />
-        <option name="TARGET_LOGGING_CHANNELS" value="lldb process:gdb-remote packets" />
-        <option name="SHOW_OPTIMIZED_WARNING" value="true" />
-        <option name="ATTACH_ON_WAIT_FOR_DEBUGGER" value="false" />
-        <option name="DEBUG_SANDBOX_SDK" value="false" />
-      </Native>
-      <Profilers>
-        <option name="ADVANCED_PROFILING_ENABLED" value="false" />
-        <option name="STARTUP_PROFILING_ENABLED" value="false" />
-        <option name="STARTUP_CPU_PROFILING_ENABLED" value="false" />
-        <option name="STARTUP_CPU_PROFILING_CONFIGURATION_NAME" value="Java/Kotlin Method Sample (legacy)" />
-        <option name="STARTUP_NATIVE_MEMORY_PROFILING_ENABLED" value="false" />
-        <option name="NATIVE_MEMORY_SAMPLE_RATE_BYTES" value="2048" />
-      </Profilers>
-      <option name="DEEP_LINK" value="" />
-      <option name="ACTIVITY_CLASS" value="" />
-      <option name="SEARCH_ACTIVITY_IN_GLOBAL_SCOPE" value="false" />
-      <option name="SKIP_ACTIVITY_VALIDATION" value="false" />
-      <method v="2">
-        <option name="Android.Gradle.BeforeRunTask" enabled="true" />
-      </method>
-    </configuration>
-  </component>
-  <component name="SpellCheckerSettings" RuntimeDictionaries="0" Folders="0" CustomDictionaries="0" DefaultDictionary="application-level" UseSingleDictionary="true" transferred="true" />
-  <component name="TaskManager">
-    <task active="true" id="Default" summary="Default task">
-      <changelist id="21b3d92b-fd7e-4612-a134-20c6a430b8d2" name="Changes" comment="" />
-      <created>1732284569873</created>
-      <option name="number" value="Default" />
-      <option name="presentableId" value="Default" />
-      <updated>1732284569873</updated>
-    </task>
-    <servers />
-  </component>
-</project>