Skip to content

Commit 07a6512

Browse files
Delete Account (#5)
* Adding delete account * Enum added to sheetnav * Added base delete account * Deletiong confirmation done * Delete account added * Confirm dialog added * Account deletion connections * linking account deletion repo * Auto hide keyboard * fixed rebase
1 parent d63bbc2 commit 07a6512

File tree

12 files changed

+305
-9
lines changed

12 files changed

+305
-9
lines changed

api/src/main/java/com/getcode/manager/BottomBarManager.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import kotlin.concurrent.timerTask
1111
object BottomBarManager {
1212
data class BottomBarMessage(
1313
val title: String,
14-
val subtitle: String,
14+
val subtitle: String = "",
1515
val positiveText: String,
1616
val negativeText: String,
1717
val tertiaryText: String? = null,

app/src/main/java/com/getcode/manager/AuthManager.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,11 @@ class AuthManager @Inject constructor(
132132
.ignoreElement()
133133
}
134134

135+
fun deleteAndLogout(activity: Activity, onComplete: () -> Unit = {}) {
136+
//todo: add account deletion
137+
logout(activity, onComplete)
138+
}
139+
135140
fun logout(activity: Activity, onComplete: () -> Unit = {}) {
136141
AccountUtils.removeAccounts(activity)
137142
.doOnSuccess { res: Boolean ->

app/src/main/java/com/getcode/view/SheetNav.kt

Lines changed: 47 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,36 @@
11
package com.getcode.view
22

33
import androidx.annotation.StringRes
4+
import androidx.compose.animation.ExperimentalAnimationApi
5+
import androidx.navigation.NamedNavArgument
6+
import androidx.navigation.NavController
7+
import androidx.navigation.NavGraphBuilder
8+
import androidx.navigation.NavType
9+
import androidx.navigation.navArgument
410
import androidx.compose.animation.*
511
import androidx.navigation.*
612
import com.getcode.R
713
import com.getcode.view.login.PhoneConfirm
814
import com.getcode.view.login.PhoneVerify
9-
import com.getcode.view.main.account.*
10-
import com.getcode.view.main.account.AccountPage.*
15+
import com.getcode.view.main.account.AccountAccessKey
16+
import com.getcode.view.main.account.AccountDebugOptions
17+
import com.getcode.view.main.account.AccountDeposit
18+
import com.getcode.view.main.account.AccountDetails
1119
import com.getcode.view.main.account.AccountFaq
20+
import com.getcode.view.main.account.AccountHome
21+
import com.getcode.view.main.account.AccountPage
22+
import com.getcode.view.main.account.AccountPage.ACCESS_KEY
23+
import com.getcode.view.main.account.AccountPage.ACCOUNT_DEBUG_OPTIONS
24+
import com.getcode.view.main.account.AccountPage.ACCOUNT_DETAILS
25+
import com.getcode.view.main.account.AccountPage.DELETE_ACCOUNT
26+
import com.getcode.view.main.account.AccountPage.DEPOSIT
27+
import com.getcode.view.main.account.AccountPage.FAQ
28+
import com.getcode.view.main.account.AccountPage.PHONE
29+
import com.getcode.view.main.account.AccountPage.WITHDRAW
30+
import com.getcode.view.main.account.AccountPage.BUY_AND_SELL_KIN
31+
import com.getcode.view.main.account.AccountPhone
32+
import com.getcode.view.main.account.ConfirmDeleteAccount
33+
import com.getcode.view.main.account.DeleteCodeAccount
1234
import com.getcode.view.main.account.withdraw.AccountWithdrawAddress
1335
import com.getcode.view.main.account.withdraw.AccountWithdrawAmount
1436
import com.getcode.view.main.account.withdraw.AccountWithdrawSummary
@@ -32,6 +54,7 @@ fun NavGraphBuilder.addSheetGraph(
3254
DEPOSIT -> navController.navigate(SheetSections.DEPOSIT.route)
3355
WITHDRAW -> navController.navigate(SheetSections.WITHDRAW_AMOUNT.route)
3456
ACCESS_KEY -> navController.navigate(SheetSections.ACCESS_KEY.route)
57+
DELETE_ACCOUNT -> navController.navigate(SheetSections.DELETE_ACCOUNT.route)
3558
FAQ -> navController.navigate(SheetSections.FAQ.route)
3659
ACCOUNT_DETAILS -> navController.navigate(SheetSections.ACCOUNT_DETAILS.route)
3760
PHONE -> navController.navigate(
@@ -85,6 +108,20 @@ fun NavGraphBuilder.addSheetGraph(
85108
onTitleChange(SheetSections.ACCESS_KEY.title)
86109
AccountAccessKey(navController)
87110
}
111+
composableItem(
112+
route = SheetSections.DELETE_ACCOUNT.route
113+
) {
114+
onBackButtonVisibilityChange(true)
115+
onTitleChange(SheetSections.DELETE_ACCOUNT.title)
116+
DeleteCodeAccount(navController)
117+
}
118+
composableItem(
119+
route = SheetSections.CONFIRM_DELETE_ACCOUNT.route
120+
) {
121+
onBackButtonVisibilityChange(true)
122+
onTitleChange(SheetSections.CONFIRM_DELETE_ACCOUNT.title)
123+
ConfirmDeleteAccount(navController)
124+
}
88125
composableItem(
89126
route = SheetSections.FAQ.route,
90127
) {
@@ -257,6 +294,14 @@ enum class SheetSections(
257294
title = R.string.title_myAccount,
258295
route = "sheet/accountDetails"
259296
),
297+
DELETE_ACCOUNT(
298+
title = R.string.action_deleteAccount,
299+
route = "sheet/deleteAccount"
300+
),
301+
CONFIRM_DELETE_ACCOUNT(
302+
title = R.string.action_deleteAccount,
303+
route = "sheet/confirmDeleteAccount"
304+
),
260305
PHONE_VERIFY(
261306
title = R.string.title_enterPhoneNumber,
262307
route = "login/verifyPhone?" +
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package com.getcode.view.components
2+
3+
import androidx.compose.foundation.layout.Arrangement
4+
import androidx.compose.foundation.layout.Column
5+
import androidx.compose.material.MaterialTheme
6+
import androidx.compose.material.Text
7+
import androidx.compose.runtime.Composable
8+
import androidx.compose.ui.text.font.FontWeight
9+
import androidx.compose.ui.unit.dp
10+
11+
@Composable
12+
fun TextSection(title: String, description: String) {
13+
Column(verticalArrangement = Arrangement.spacedBy(10.dp)) {
14+
Text(
15+
text = title,
16+
style = MaterialTheme.typography.h6.copy(
17+
fontWeight = FontWeight.Bold,
18+
)
19+
)
20+
Text(
21+
text = description,
22+
style = MaterialTheme.typography.subtitle2
23+
)
24+
}
25+
}

app/src/main/java/com/getcode/view/main/account/AccountDetails.kt

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,20 @@
11
package com.getcode.view.main.account
22

3-
import androidx.compose.foundation.*
4-
import androidx.compose.foundation.layout.*
5-
import androidx.compose.runtime.*
3+
import androidx.compose.foundation.layout.Box
4+
import androidx.compose.foundation.layout.Column
5+
import androidx.compose.foundation.layout.fillMaxHeight
6+
import androidx.compose.foundation.rememberScrollState
7+
import androidx.compose.foundation.verticalScroll
8+
import androidx.compose.runtime.Composable
9+
import androidx.compose.runtime.LaunchedEffect
10+
import androidx.compose.runtime.collectAsState
11+
import androidx.compose.runtime.getValue
612
import androidx.compose.ui.Modifier
713
import androidx.compose.ui.platform.LocalContext
814
import androidx.hilt.navigation.compose.hiltViewModel
915
import com.getcode.App
1016
import com.getcode.R
1117
import com.getcode.manager.BottomBarManager
12-
import com.getcode.util.getActivity
1318

1419
@Composable
1520
fun AccountDetails(
@@ -54,6 +59,10 @@ fun AccountDetails(
5459
icon = R.drawable.ic_menu_phone,
5560
isPhoneLinked = dataState.isPhoneLinked,
5661
) { onPage(AccountPage.PHONE) },
62+
AccountMainItem(
63+
name = R.string.action_deleteAccount,
64+
icon = R.drawable.ic_delete
65+
) { onPage(AccountPage.DELETE_ACCOUNT) },
5766
)
5867

5968
for (action in actions) {

app/src/main/java/com/getcode/view/main/account/AccountSheetViewModel.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ enum class AccountPage {
2424
DEPOSIT,
2525
WITHDRAW,
2626
PHONE,
27+
DELETE_ACCOUNT,
2728
ACCESS_KEY,
2829
FAQ,
2930
ACCOUNT_DETAILS,
Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
package com.getcode.view.main.account
2+
3+
import androidx.compose.foundation.layout.Arrangement
4+
import androidx.compose.foundation.layout.Column
5+
import androidx.compose.foundation.layout.Spacer
6+
import androidx.compose.foundation.layout.fillMaxWidth
7+
import androidx.compose.foundation.layout.imePadding
8+
import androidx.compose.foundation.layout.padding
9+
import androidx.compose.foundation.layout.wrapContentHeight
10+
import androidx.compose.foundation.shape.RoundedCornerShape
11+
import androidx.compose.material.MaterialTheme
12+
import androidx.compose.material.Text
13+
import androidx.compose.material.TextField
14+
import androidx.compose.runtime.Composable
15+
import androidx.compose.runtime.collectAsState
16+
import androidx.compose.ui.ExperimentalComposeUiApi
17+
import androidx.compose.ui.Modifier
18+
import androidx.compose.ui.platform.LocalContext
19+
import androidx.compose.ui.platform.LocalSoftwareKeyboardController
20+
import androidx.compose.ui.res.stringResource
21+
import androidx.compose.ui.unit.dp
22+
import androidx.compose.ui.unit.sp
23+
import androidx.hilt.navigation.compose.hiltViewModel
24+
import androidx.navigation.NavController
25+
import com.getcode.App
26+
import com.getcode.R
27+
import com.getcode.manager.BottomBarManager
28+
import com.getcode.theme.inputColors
29+
import com.getcode.util.getActivity
30+
import com.getcode.view.components.ButtonState
31+
import com.getcode.view.components.CodeButton
32+
33+
@OptIn(ExperimentalComposeUiApi::class)
34+
@Composable
35+
fun ConfirmDeleteAccount(navController: NavController) {
36+
val viewModel = hiltViewModel<DeleteAccountViewModel>()
37+
val context = LocalContext.current
38+
val keyboardController = LocalSoftwareKeyboardController.current
39+
Column(
40+
Modifier
41+
.padding(20.dp)
42+
.imePadding(),
43+
verticalArrangement = Arrangement.spacedBy(10.dp)
44+
) {
45+
Text(
46+
text = stringResource(id = R.string.subtitle_deleteAccountDescription),
47+
style = MaterialTheme.typography.subtitle2
48+
)
49+
TextField(
50+
modifier = Modifier
51+
.fillMaxWidth()
52+
.wrapContentHeight(),
53+
placeholder = {
54+
Text(
55+
stringResource(id = R.string.subtitle_typeDelete).format(viewModel.requiredPhrase),
56+
style = MaterialTheme.typography.subtitle1.copy(
57+
fontSize = 16.sp,
58+
)
59+
)
60+
},
61+
value = viewModel.typedText.collectAsState().value,
62+
onValueChange = {
63+
viewModel.onTextUpdated(it)
64+
},
65+
textStyle = MaterialTheme.typography.subtitle1.copy(
66+
fontSize = 16.sp,
67+
),
68+
singleLine = true,
69+
colors = inputColors(),
70+
shape = RoundedCornerShape(size = 5.dp)
71+
)
72+
Spacer(modifier = Modifier.weight(1f))
73+
CodeButton(
74+
onClick = {
75+
keyboardController?.hide()
76+
showConfirmDeletionBanner(onConfirm = {
77+
context.getActivity()?.let { viewModel.onConfirmDelete(it) }
78+
})
79+
},
80+
text = stringResource(R.string.action_deleteAccount),
81+
buttonState = ButtonState.Filled,
82+
enabled = viewModel.isDeletionAllowed()
83+
)
84+
}
85+
}
86+
87+
fun showConfirmDeletionBanner(onConfirm: () -> Unit) {
88+
BottomBarManager.showMessage(
89+
BottomBarManager.BottomBarMessage(
90+
title = App.getInstance()
91+
.getString(R.string.prompt_title_deleteAccount),
92+
positiveText = App.getInstance()
93+
.getString(R.string.action_deleteAccount),
94+
negativeText = App.getInstance().getString(R.string.action_cancel),
95+
onPositive = onConfirm,
96+
onNegative = { }
97+
))
98+
}
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
package com.getcode.view.main.account
2+
3+
import androidx.compose.foundation.Image
4+
import androidx.compose.foundation.layout.Arrangement
5+
import androidx.compose.foundation.layout.Column
6+
import androidx.compose.foundation.layout.padding
7+
import androidx.compose.foundation.lazy.LazyColumn
8+
import androidx.compose.runtime.Composable
9+
import androidx.compose.ui.Modifier
10+
import androidx.compose.ui.res.painterResource
11+
import androidx.compose.ui.res.stringResource
12+
import androidx.compose.ui.unit.dp
13+
import androidx.navigation.NavController
14+
import com.getcode.R
15+
import com.getcode.view.SheetSections
16+
import com.getcode.view.components.ButtonState
17+
import com.getcode.view.components.CodeButton
18+
import com.getcode.view.components.TextSection
19+
20+
@Composable
21+
fun DeleteCodeAccount(navController: NavController) {
22+
Column(Modifier.padding(20.dp)) {
23+
LazyColumn(
24+
modifier = Modifier.weight(1f),
25+
verticalArrangement = Arrangement.spacedBy(30.dp)
26+
) {
27+
item {
28+
Image(
29+
painter = painterResource(id = R.drawable.ic_delete_bubble),
30+
contentDescription = "Delete"
31+
)
32+
}
33+
item {
34+
TextSection(
35+
title = stringResource(id = R.string.deleteAccount_title_willDo),
36+
description = stringResource(id = R.string.deleteAccount_description_willDo)
37+
)
38+
}
39+
item {
40+
TextSection(
41+
title = stringResource(id = R.string.deleteAccount_title_wontDo),
42+
description = stringResource(id = R.string.deleteAccount_description_wontDo)
43+
)
44+
}
45+
item {
46+
TextSection(
47+
title = stringResource(id = R.string.deleteAccount_title_willHappen),
48+
description = stringResource(id = R.string.deleteAccount_description_willHappen)
49+
)
50+
}
51+
}
52+
CodeButton(
53+
onClick = {
54+
navController.navigate(SheetSections.CONFIRM_DELETE_ACCOUNT.route)
55+
},
56+
text = stringResource(R.string.action_continue),
57+
buttonState = ButtonState.Filled,
58+
)
59+
}
60+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package com.getcode.view.main.account
2+
3+
import android.app.Activity
4+
import com.getcode.manager.AuthManager
5+
import com.getcode.view.BaseViewModel
6+
import dagger.hilt.android.lifecycle.HiltViewModel
7+
import kotlinx.coroutines.flow.MutableStateFlow
8+
import javax.inject.Inject
9+
10+
11+
@HiltViewModel
12+
class DeleteAccountViewModel @Inject constructor(
13+
private val authManager: AuthManager
14+
) : BaseViewModel() {
15+
val requiredPhrase = "Delete"
16+
val typedText = MutableStateFlow("")
17+
18+
fun onTextUpdated(text: String) {
19+
typedText.value = text
20+
}
21+
22+
fun isDeletionAllowed() = typedText.value.equals(requiredPhrase, ignoreCase = true)
23+
24+
fun onConfirmDelete(activity: Activity) {
25+
authManager.deleteAndLogout(activity)
26+
}
27+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
<vector xmlns:android="http://schemas.android.com/apk/res/android"
2+
android:width="90dp"
3+
android:height="90dp"
4+
android:viewportWidth="90"
5+
android:viewportHeight="90">
6+
<group>
7+
<clip-path
8+
android:pathData="M0,0L90,0L90,90L0,90Z"/>
9+
<path
10+
android:pathData="M45,90C20.147,90 0,69.853 0,45 0,20.147 20.147,0 45,0 69.853,0 90,20.147 90,45 90,69.853 69.853,90 45,90Z"
11+
android:fillColor="#bc3434"/>
12+
<path
13+
android:pathData="M40.112,54.809L42.64,54.809L42.64,39.64L40.112,39.64Z"
14+
android:fillColor="#ffffff"/>
15+
<path
16+
android:pathData="M47.697,54.809L50.225,54.809L50.225,39.64L47.697,39.64Z"
17+
android:fillColor="#ffffff"/>
18+
<path
19+
android:pathData="M30,32.056L30,34.584L32.528,34.584L32.528,59.865C32.528,60.536 32.794,61.179 33.269,61.653 33.743,62.127 34.386,62.393 35.056,62.393L55.281,62.393C55.951,62.393 56.594,62.127 57.069,61.653 57.543,61.179 57.809,60.536 57.809,59.865L57.809,34.584L60.337,34.584L60.337,32.056L30,32.056ZM35.056,59.865L35.056,34.584L55.281,34.584L55.281,59.865L35.056,59.865Z"
20+
android:fillColor="#ffffff"/>
21+
<path
22+
android:pathData="M40.112,29.528L50.225,29.528L50.225,27L40.112,27Z"
23+
android:fillColor="#ffffff"/>
24+
</group>
25+
</vector>

0 commit comments

Comments
 (0)