Sign.kt 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. package io.nexilis.alpha.ui.main
  2. import androidx.compose.foundation.layout.*
  3. import androidx.compose.foundation.rememberScrollState
  4. import androidx.compose.foundation.text.KeyboardOptions
  5. import androidx.compose.foundation.verticalScroll
  6. import androidx.compose.material.icons.Icons
  7. import androidx.compose.material.icons.filled.*
  8. import androidx.compose.material3.*
  9. import androidx.compose.runtime.*
  10. import androidx.compose.runtime.saveable.rememberSaveable
  11. import androidx.compose.ui.Alignment
  12. import androidx.compose.ui.Modifier
  13. import androidx.compose.ui.platform.LocalContext
  14. import androidx.compose.ui.text.TextRange
  15. import androidx.compose.ui.text.input.KeyboardType
  16. import androidx.compose.ui.text.input.PasswordVisualTransformation
  17. import androidx.compose.ui.text.input.TextFieldValue
  18. import androidx.compose.ui.text.input.VisualTransformation
  19. import androidx.compose.ui.unit.dp
  20. import androidx.hilt.navigation.compose.hiltViewModel
  21. import androidx.navigation.NavHostController
  22. import io.nexilis.service.core.getSharedPreferences
  23. import io.nexilis.service.core.optString
  24. import io.nexilis.service.core.put
  25. import io.nexilis.service.data.viewmodels.BuddyViewModel
  26. @Composable
  27. fun SignUp(
  28. navController: NavHostController,
  29. completion: (Boolean) -> Unit
  30. ) {
  31. var textUsername by rememberSaveable(stateSaver = TextFieldValue.Saver) {
  32. mutableStateOf(TextFieldValue("", TextRange(0, 7)))
  33. }
  34. var textPassword by rememberSaveable(stateSaver = TextFieldValue.Saver) {
  35. mutableStateOf(TextFieldValue("", TextRange(0, 7)))
  36. }
  37. var textConfirmPassword by rememberSaveable(stateSaver = TextFieldValue.Saver) {
  38. mutableStateOf(TextFieldValue("", TextRange(0, 7)))
  39. }
  40. var isVisiblePassword by remember {
  41. mutableStateOf(false)
  42. }
  43. var isVisibleConfirmPassword by remember {
  44. mutableStateOf(false)
  45. }
  46. val viewModel: BuddyViewModel = hiltViewModel()
  47. val context = LocalContext.current
  48. Column(
  49. modifier = Modifier
  50. .fillMaxSize()
  51. .padding(start = 16.dp, end = 16.dp)
  52. .verticalScroll(
  53. rememberScrollState()
  54. ),
  55. horizontalAlignment = Alignment.CenterHorizontally,
  56. verticalArrangement = Arrangement.Center
  57. ) {
  58. OutlinedTextField(
  59. modifier = Modifier
  60. .fillMaxWidth()
  61. .imePadding(),
  62. value = textUsername,
  63. onValueChange = { textUsername = it },
  64. label = {
  65. Text(text = "Username")
  66. },
  67. maxLines = 1
  68. )
  69. OutlinedTextField(
  70. modifier = Modifier
  71. .fillMaxWidth()
  72. .imePadding(),
  73. value = textPassword,
  74. onValueChange = { textPassword = it },
  75. label = {
  76. Text(text = "Password")
  77. },
  78. visualTransformation = if (isVisiblePassword) VisualTransformation.None
  79. else PasswordVisualTransformation(),
  80. trailingIcon = {
  81. IconButton(onClick = { isVisiblePassword = !isVisiblePassword }) {
  82. Icon(
  83. imageVector = if (isVisiblePassword) Icons.Default.Visibility
  84. else Icons.Default.VisibilityOff,
  85. contentDescription = ""
  86. )
  87. }
  88. },
  89. keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Password),
  90. maxLines = 1
  91. )
  92. OutlinedTextField(
  93. modifier = Modifier
  94. .fillMaxWidth()
  95. .imePadding(),
  96. value = textConfirmPassword,
  97. onValueChange = { textConfirmPassword = it },
  98. label = {
  99. Text(text = "Confirm password")
  100. },
  101. visualTransformation = if (isVisibleConfirmPassword) VisualTransformation.None
  102. else PasswordVisualTransformation(),
  103. trailingIcon = {
  104. IconButton(onClick = { isVisibleConfirmPassword = !isVisibleConfirmPassword }) {
  105. Icon(
  106. imageVector = if (isVisibleConfirmPassword) Icons.Default.Visibility
  107. else Icons.Default.VisibilityOff,
  108. contentDescription = ""
  109. )
  110. }
  111. },
  112. maxLines = 1
  113. )
  114. Spacer(modifier = Modifier.size(8.dp))
  115. Button(onClick = {
  116. viewModel.signUp(
  117. textUsername.text,
  118. textConfirmPassword.text
  119. ) { r, pin ->
  120. completion(r)
  121. if (r && pin.isNotEmpty()) {
  122. context.getSharedPreferences().put(key = "pin", value = pin)
  123. }
  124. }
  125. }) {
  126. Text(text = "Submit")
  127. }
  128. }
  129. }
  130. @OptIn(ExperimentalMaterial3Api::class)
  131. @Composable
  132. fun SignIn(navController: NavHostController, completion: (Boolean) -> Unit) {
  133. val viewModel: BuddyViewModel = hiltViewModel()
  134. var textUsername by rememberSaveable(stateSaver = TextFieldValue.Saver) {
  135. mutableStateOf(TextFieldValue("", TextRange(0, 7)))
  136. }
  137. var textPassword by rememberSaveable(stateSaver = TextFieldValue.Saver) {
  138. mutableStateOf(TextFieldValue("", TextRange(0, 7)))
  139. }
  140. var isVisiblePassword by remember {
  141. mutableStateOf(false)
  142. }
  143. val context = LocalContext.current
  144. Column(
  145. modifier = Modifier
  146. .fillMaxSize()
  147. .padding(16.dp),
  148. horizontalAlignment = Alignment.CenterHorizontally,
  149. verticalArrangement = Arrangement.Center
  150. ) {
  151. OutlinedTextField(
  152. modifier = Modifier
  153. .fillMaxWidth()
  154. .imePadding(),
  155. value = textUsername,
  156. onValueChange = { textUsername = it },
  157. label = {
  158. Text(text = "Username")
  159. },
  160. maxLines = 1
  161. )
  162. OutlinedTextField(
  163. modifier = Modifier
  164. .fillMaxWidth()
  165. .imePadding(),
  166. value = textPassword,
  167. onValueChange = { textPassword = it },
  168. label = {
  169. Text(text = "Password")
  170. },
  171. visualTransformation = if (isVisiblePassword) VisualTransformation.None
  172. else PasswordVisualTransformation(),
  173. trailingIcon = {
  174. IconButton(onClick = { isVisiblePassword = !isVisiblePassword }) {
  175. Icon(
  176. imageVector = if (isVisiblePassword) Icons.Default.Visibility
  177. else Icons.Default.VisibilityOff,
  178. contentDescription = ""
  179. )
  180. }
  181. },
  182. keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Password),
  183. maxLines = 1
  184. )
  185. Spacer(modifier = Modifier.size(8.dp))
  186. Button(onClick = {
  187. val api = context.getSharedPreferences().optString("api", "")
  188. viewModel.signIn(api, textUsername.text, textPassword.text) { r, pin ->
  189. completion(r)
  190. if (r && pin.isNotEmpty()) {
  191. context.getSharedPreferences().put(key = "pin", value = pin)
  192. context.getSharedPreferences().put(key = "is_login", value = true)
  193. }
  194. }
  195. }) {
  196. Text(text = "Submit")
  197. }
  198. }
  199. }