Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion api/src/main/java/com/getcode/manager/BottomBarManager.kt
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import kotlin.concurrent.timerTask
object BottomBarManager {
data class BottomBarMessage(
val title: String,
val subtitle: String,
val subtitle: String = "",
val positiveText: String,
val negativeText: String,
val tertiaryText: String? = null,
Expand Down
5 changes: 5 additions & 0 deletions app/src/main/java/com/getcode/manager/AuthManager.kt
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,11 @@ class AuthManager @Inject constructor(
.ignoreElement()
}

fun deleteAndLogout(activity: Activity, onComplete: () -> Unit = {}) {
//todo: add account deletion
logout(activity, onComplete)
}

fun logout(activity: Activity, onComplete: () -> Unit = {}) {
AccountUtils.removeAccounts(activity)
.doOnSuccess { res: Boolean ->
Expand Down
49 changes: 47 additions & 2 deletions app/src/main/java/com/getcode/view/SheetNav.kt
Original file line number Diff line number Diff line change
@@ -1,14 +1,36 @@
package com.getcode.view

import androidx.annotation.StringRes
import androidx.compose.animation.ExperimentalAnimationApi
import androidx.navigation.NamedNavArgument
import androidx.navigation.NavController
import androidx.navigation.NavGraphBuilder
import androidx.navigation.NavType
import androidx.navigation.navArgument
import androidx.compose.animation.*
import androidx.navigation.*
import com.getcode.R
import com.getcode.view.login.PhoneConfirm
import com.getcode.view.login.PhoneVerify
import com.getcode.view.main.account.*
import com.getcode.view.main.account.AccountPage.*
import com.getcode.view.main.account.AccountAccessKey
import com.getcode.view.main.account.AccountDebugOptions
import com.getcode.view.main.account.AccountDeposit
import com.getcode.view.main.account.AccountDetails
import com.getcode.view.main.account.AccountFaq
import com.getcode.view.main.account.AccountHome
import com.getcode.view.main.account.AccountPage
import com.getcode.view.main.account.AccountPage.ACCESS_KEY
import com.getcode.view.main.account.AccountPage.ACCOUNT_DEBUG_OPTIONS
import com.getcode.view.main.account.AccountPage.ACCOUNT_DETAILS
import com.getcode.view.main.account.AccountPage.DELETE_ACCOUNT
import com.getcode.view.main.account.AccountPage.DEPOSIT
import com.getcode.view.main.account.AccountPage.FAQ
import com.getcode.view.main.account.AccountPage.PHONE
import com.getcode.view.main.account.AccountPage.WITHDRAW
import com.getcode.view.main.account.AccountPage.BUY_AND_SELL_KIN
import com.getcode.view.main.account.AccountPhone
import com.getcode.view.main.account.ConfirmDeleteAccount
import com.getcode.view.main.account.DeleteCodeAccount
import com.getcode.view.main.account.withdraw.AccountWithdrawAddress
import com.getcode.view.main.account.withdraw.AccountWithdrawAmount
import com.getcode.view.main.account.withdraw.AccountWithdrawSummary
Expand All @@ -32,6 +54,7 @@ fun NavGraphBuilder.addSheetGraph(
DEPOSIT -> navController.navigate(SheetSections.DEPOSIT.route)
WITHDRAW -> navController.navigate(SheetSections.WITHDRAW_AMOUNT.route)
ACCESS_KEY -> navController.navigate(SheetSections.ACCESS_KEY.route)
DELETE_ACCOUNT -> navController.navigate(SheetSections.DELETE_ACCOUNT.route)
FAQ -> navController.navigate(SheetSections.FAQ.route)
ACCOUNT_DETAILS -> navController.navigate(SheetSections.ACCOUNT_DETAILS.route)
PHONE -> navController.navigate(
Expand Down Expand Up @@ -85,6 +108,20 @@ fun NavGraphBuilder.addSheetGraph(
onTitleChange(SheetSections.ACCESS_KEY.title)
AccountAccessKey(navController)
}
composableItem(
route = SheetSections.DELETE_ACCOUNT.route
) {
onBackButtonVisibilityChange(true)
onTitleChange(SheetSections.DELETE_ACCOUNT.title)
DeleteCodeAccount(navController)
}
composableItem(
route = SheetSections.CONFIRM_DELETE_ACCOUNT.route
) {
onBackButtonVisibilityChange(true)
onTitleChange(SheetSections.CONFIRM_DELETE_ACCOUNT.title)
ConfirmDeleteAccount(navController)
}
composableItem(
route = SheetSections.FAQ.route,
) {
Expand Down Expand Up @@ -257,6 +294,14 @@ enum class SheetSections(
title = R.string.title_myAccount,
route = "sheet/accountDetails"
),
DELETE_ACCOUNT(
title = R.string.action_deleteAccount,
route = "sheet/deleteAccount"
),
CONFIRM_DELETE_ACCOUNT(
title = R.string.action_deleteAccount,
route = "sheet/confirmDeleteAccount"
),
PHONE_VERIFY(
title = R.string.title_enterPhoneNumber,
route = "login/verifyPhone?" +
Expand Down
25 changes: 25 additions & 0 deletions app/src/main/java/com/getcode/view/components/TextSection.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package com.getcode.view.components

import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.material.MaterialTheme
import androidx.compose.material.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp

@Composable
fun TextSection(title: String, description: String) {
Column(verticalArrangement = Arrangement.spacedBy(10.dp)) {
Text(
text = title,
style = MaterialTheme.typography.h6.copy(
fontWeight = FontWeight.Bold,
)
)
Text(
text = description,
style = MaterialTheme.typography.subtitle2
)
}
}
17 changes: 13 additions & 4 deletions app/src/main/java/com/getcode/view/main/account/AccountDetails.kt
Original file line number Diff line number Diff line change
@@ -1,15 +1,20 @@
package com.getcode.view.main.account

import androidx.compose.foundation.*
import androidx.compose.foundation.layout.*
import androidx.compose.runtime.*
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxHeight
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.hilt.navigation.compose.hiltViewModel
import com.getcode.App
import com.getcode.R
import com.getcode.manager.BottomBarManager
import com.getcode.util.getActivity

@Composable
fun AccountDetails(
Expand Down Expand Up @@ -54,6 +59,10 @@ fun AccountDetails(
icon = R.drawable.ic_menu_phone,
isPhoneLinked = dataState.isPhoneLinked,
) { onPage(AccountPage.PHONE) },
AccountMainItem(
name = R.string.action_deleteAccount,
icon = R.drawable.ic_delete
) { onPage(AccountPage.DELETE_ACCOUNT) },
)

for (action in actions) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ enum class AccountPage {
DEPOSIT,
WITHDRAW,
PHONE,
DELETE_ACCOUNT,
ACCESS_KEY,
FAQ,
ACCOUNT_DETAILS,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
package com.getcode.view.main.account

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.imePadding
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.wrapContentHeight
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.MaterialTheme
import androidx.compose.material.Text
import androidx.compose.material.TextField
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.ui.ExperimentalComposeUiApi
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalSoftwareKeyboardController
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import androidx.hilt.navigation.compose.hiltViewModel
import androidx.navigation.NavController
import com.getcode.App
import com.getcode.R
import com.getcode.manager.BottomBarManager
import com.getcode.theme.inputColors
import com.getcode.util.getActivity
import com.getcode.view.components.ButtonState
import com.getcode.view.components.CodeButton

@OptIn(ExperimentalComposeUiApi::class)
@Composable
fun ConfirmDeleteAccount(navController: NavController) {
val viewModel = hiltViewModel<DeleteAccountViewModel>()
val context = LocalContext.current
val keyboardController = LocalSoftwareKeyboardController.current
Column(
Modifier
.padding(20.dp)
.imePadding(),
verticalArrangement = Arrangement.spacedBy(10.dp)
) {
Text(
text = stringResource(id = R.string.subtitle_deleteAccountDescription),
style = MaterialTheme.typography.subtitle2
)
TextField(
modifier = Modifier
.fillMaxWidth()
.wrapContentHeight(),
placeholder = {
Text(
stringResource(id = R.string.subtitle_typeDelete).format(viewModel.requiredPhrase),
style = MaterialTheme.typography.subtitle1.copy(
fontSize = 16.sp,
)
)
},
value = viewModel.typedText.collectAsState().value,
onValueChange = {
viewModel.onTextUpdated(it)
},
textStyle = MaterialTheme.typography.subtitle1.copy(
fontSize = 16.sp,
),
singleLine = true,
colors = inputColors(),
shape = RoundedCornerShape(size = 5.dp)
)
Spacer(modifier = Modifier.weight(1f))
CodeButton(
onClick = {
keyboardController?.hide()
showConfirmDeletionBanner(onConfirm = {
context.getActivity()?.let { viewModel.onConfirmDelete(it) }
})
},
text = stringResource(R.string.action_deleteAccount),
buttonState = ButtonState.Filled,
enabled = viewModel.isDeletionAllowed()
)
}
}

fun showConfirmDeletionBanner(onConfirm: () -> Unit) {
BottomBarManager.showMessage(
BottomBarManager.BottomBarMessage(
title = App.getInstance()
.getString(R.string.prompt_title_deleteAccount),
positiveText = App.getInstance()
.getString(R.string.action_deleteAccount),
negativeText = App.getInstance().getString(R.string.action_cancel),
onPositive = onConfirm,
onNegative = { }
))
}
60 changes: 60 additions & 0 deletions app/src/main/java/com/getcode/view/main/account/DeleteAccount.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
package com.getcode.view.main.account

import androidx.compose.foundation.Image
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import androidx.navigation.NavController
import com.getcode.R
import com.getcode.view.SheetSections
import com.getcode.view.components.ButtonState
import com.getcode.view.components.CodeButton
import com.getcode.view.components.TextSection

@Composable
fun DeleteCodeAccount(navController: NavController) {
Column(Modifier.padding(20.dp)) {
LazyColumn(
modifier = Modifier.weight(1f),
verticalArrangement = Arrangement.spacedBy(30.dp)
) {
item {
Image(
painter = painterResource(id = R.drawable.ic_delete_bubble),
contentDescription = "Delete"
)
}
item {
TextSection(
title = stringResource(id = R.string.deleteAccount_title_willDo),
description = stringResource(id = R.string.deleteAccount_description_willDo)
)
}
item {
TextSection(
title = stringResource(id = R.string.deleteAccount_title_wontDo),
description = stringResource(id = R.string.deleteAccount_description_wontDo)
)
}
item {
TextSection(
title = stringResource(id = R.string.deleteAccount_title_willHappen),
description = stringResource(id = R.string.deleteAccount_description_willHappen)
)
}
}
CodeButton(
onClick = {
navController.navigate(SheetSections.CONFIRM_DELETE_ACCOUNT.route)
},
text = stringResource(R.string.action_continue),
buttonState = ButtonState.Filled,
)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package com.getcode.view.main.account

import android.app.Activity
import com.getcode.manager.AuthManager
import com.getcode.view.BaseViewModel
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.flow.MutableStateFlow
import javax.inject.Inject


@HiltViewModel
class DeleteAccountViewModel @Inject constructor(
private val authManager: AuthManager
) : BaseViewModel() {
val requiredPhrase = "Delete"
val typedText = MutableStateFlow("")

fun onTextUpdated(text: String) {
typedText.value = text
}

fun isDeletionAllowed() = typedText.value.equals(requiredPhrase, ignoreCase = true)

fun onConfirmDelete(activity: Activity) {
authManager.deleteAndLogout(activity)
}
}
25 changes: 25 additions & 0 deletions app/src/main/res/drawable/ic_delete_bubble.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="90dp"
android:height="90dp"
android:viewportWidth="90"
android:viewportHeight="90">
<group>
<clip-path
android:pathData="M0,0L90,0L90,90L0,90Z"/>
<path
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"
android:fillColor="#bc3434"/>
<path
android:pathData="M40.112,54.809L42.64,54.809L42.64,39.64L40.112,39.64Z"
android:fillColor="#ffffff"/>
<path
android:pathData="M47.697,54.809L50.225,54.809L50.225,39.64L47.697,39.64Z"
android:fillColor="#ffffff"/>
<path
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"
android:fillColor="#ffffff"/>
<path
android:pathData="M40.112,29.528L50.225,29.528L50.225,27L40.112,27Z"
android:fillColor="#ffffff"/>
</group>
</vector>
Loading