Skip to content

Commit a70d423

Browse files
committed
chore(flipcash/menu): add delete account option
Signed-off-by: Brandon McAnsh <[email protected]>
1 parent 0e208b2 commit a70d423

File tree

4 files changed

+139
-5
lines changed

4 files changed

+139
-5
lines changed

apps/flipcash/core/src/main/res/values/strings.xml

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,4 +68,15 @@
6868
<string name="title_labsAreEmpty">Nothing Cooking in the Lab Right Now</string>
6969
<string name="subtitle_labsAreEmpty">Check back in the next app update.</string>
7070
<string name="subtitle_beta">Beta</string>
71+
72+
<string name="prompt_title_deleteAccount">Permanently Delete Account?</string>
73+
<string name="prompt_description_deleteAccount">This will permanently delete your Flipcash account</string>
74+
<string name="action_deleteAccount">Delete Flipcash Account</string>
75+
76+
<string name="error_title_failedToLogOut">Something went wrong</string>
77+
<string name="error_description_failedToLogOut">We were unable to log you out. Please try again</string>
78+
79+
<string name="error_title_failedToDeleteAccount">Something went wrong</string>
80+
<string name="error_description_failedToDeleteAccount">We were unable to delete your Flipcash account. Please try again</string>
81+
7182
</resources>

apps/flipcash/features/menu/src/main/kotlin/com/flipcash/app/menu/internal/MenuItem.kt

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,15 @@ package com.flipcash.app.menu.internal
22

33
import androidx.compose.material.icons.Icons
44
import androidx.compose.material.icons.filled.Science
5+
import androidx.compose.material.icons.outlined.Delete
56
import androidx.compose.runtime.Composable
67
import androidx.compose.ui.graphics.painter.Painter
8+
import androidx.compose.ui.graphics.vector.ImageVector
79
import androidx.compose.ui.graphics.vector.rememberVectorPainter
810
import androidx.compose.ui.res.painterResource
911
import androidx.compose.ui.res.stringResource
1012
import com.flipcash.features.menu.R
13+
import com.getcode.util.resources.icons.Delete
1114
import java.util.UUID
1215

1316
internal sealed interface MenuItem {
@@ -97,3 +100,12 @@ internal data object LogOut : FullMenuItem() {
97100
@Composable get() = stringResource(R.string.action_logout)
98101
override val action: MenuScreenViewModel.Event = MenuScreenViewModel.Event.OnLogOutClicked
99102
}
103+
104+
internal data object DeleteAccount: FullMenuItem() {
105+
override val icon: Painter
106+
@Composable get() = rememberVectorPainter(ImageVector.Delete)
107+
override val name: String
108+
@Composable get() = stringResource(R.string.action_deleteAccount)
109+
override val action: MenuScreenViewModel.Event = MenuScreenViewModel.Event.OnDeleteAccountClicked
110+
}
111+

apps/flipcash/features/menu/src/main/kotlin/com/flipcash/app/menu/internal/MenuScreenViewModel.kt

Lines changed: 40 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import com.flipcash.features.menu.R
99
import com.flipcash.services.user.AuthState
1010
import com.flipcash.services.user.UserManager
1111
import com.getcode.manager.BottomBarManager
12+
import com.getcode.manager.TopBarManager
1213
import com.getcode.opencode.managers.MnemonicManager
1314
import com.getcode.util.resources.ResourceHelper
1415
import com.getcode.view.BaseViewModel2
@@ -32,6 +33,7 @@ private val FullMenuList = buildList {
3233
add(SwitchAccount)
3334
add(Labs)
3435
add(LogOut)
36+
add(DeleteAccount)
3537
}
3638

3739
@HiltViewModel
@@ -69,6 +71,7 @@ internal class MenuScreenViewModel @Inject constructor(
6971
data object OnLogOutClicked : Event
7072
data object OnLoggedOutCompletely : Event
7173
data class OnSwitchAccountTo(val entropy: String): Event
74+
data object OnDeleteAccountClicked : Event
7275
}
7376

7477
init {
@@ -130,7 +133,40 @@ internal class MenuScreenViewModel @Inject constructor(
130133
dispatchEvent(Event.OnLoggedOutCompletely)
131134
}
132135
.onFailure {
136+
TopBarManager.showMessage(
137+
TopBarManager.TopBarMessage(
138+
title = resources.getString(R.string.error_title_failedToLogOut),
139+
message = resources.getString(R.string.error_description_failedToLogOut),
140+
)
141+
)
142+
}
143+
}
144+
}
145+
)
146+
)
147+
}.launchIn(viewModelScope)
133148

149+
eventFlow
150+
.filterIsInstance<Event.OnDeleteAccountClicked>()
151+
.onEach {
152+
BottomBarManager.showMessage(
153+
BottomBarManager.BottomBarMessage(
154+
title = resources.getString(R.string.prompt_title_deleteAccount),
155+
subtitle = resources.getString(R.string.prompt_description_deleteAccount),
156+
positiveText = resources.getString(R.string.action_deleteAccount),
157+
tertiaryText = resources.getString(R.string.action_cancel),
158+
onPositive = {
159+
viewModelScope.launch {
160+
delay(150) // wait for dismiss
161+
authManager.deleteAndLogout()
162+
.onSuccess { dispatchEvent(Event.OnLoggedOutCompletely) }
163+
.onFailure {
164+
TopBarManager.showMessage(
165+
TopBarManager.TopBarMessage(
166+
title = resources.getString(R.string.error_title_failedToDeleteAccount),
167+
message = resources.getString(R.string.error_description_failedToDeleteAccount),
168+
)
169+
)
134170
}
135171
}
136172
}
@@ -181,11 +217,10 @@ internal class MenuScreenViewModel @Inject constructor(
181217
Event.OnAppSettingsClicked,
182218
Event.OnLogOutClicked,
183219
Event.OnSwitchAccountsClicked,
184-
Event.OnLabsClicked -> { state -> state }
185-
186-
Event.OnLoggedOutCompletely -> { state -> state }
187-
188-
is Event.OnSwitchAccountTo -> { state -> state }
220+
Event.OnLabsClicked,
221+
Event.OnLoggedOutCompletely,
222+
is Event.OnSwitchAccountTo,
223+
Event.OnDeleteAccountClicked -> { state -> state }
189224
}
190225
}
191226
}
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
package com.getcode.util.resources.icons
2+
3+
4+
import androidx.compose.ui.graphics.Color
5+
import androidx.compose.ui.graphics.PathFillType
6+
import androidx.compose.ui.graphics.SolidColor
7+
import androidx.compose.ui.graphics.StrokeCap
8+
import androidx.compose.ui.graphics.StrokeJoin
9+
import androidx.compose.ui.graphics.vector.ImageVector
10+
import androidx.compose.ui.graphics.vector.path
11+
import androidx.compose.ui.unit.dp
12+
13+
val ImageVector.Companion.Delete: ImageVector
14+
get() {
15+
if (_delete != null) {
16+
return _delete!!
17+
}
18+
_delete = ImageVector.Builder(
19+
name = "Delete",
20+
defaultWidth = 24.dp,
21+
defaultHeight = 24.dp,
22+
viewportWidth = 960f,
23+
viewportHeight = 960f
24+
).apply {
25+
path(
26+
fill = SolidColor(Color.Black),
27+
fillAlpha = 1.0f,
28+
stroke = null,
29+
strokeAlpha = 1.0f,
30+
strokeLineWidth = 1.0f,
31+
strokeLineCap = StrokeCap.Butt,
32+
strokeLineJoin = StrokeJoin.Miter,
33+
strokeLineMiter = 1.0f,
34+
pathFillType = PathFillType.NonZero
35+
) {
36+
moveTo(280f, 840f)
37+
quadToRelative(-33f, 0f, -56.5f, -23.5f)
38+
reflectiveQuadTo(200f, 760f)
39+
verticalLineToRelative(-520f)
40+
horizontalLineToRelative(-40f)
41+
verticalLineToRelative(-80f)
42+
horizontalLineToRelative(200f)
43+
verticalLineToRelative(-40f)
44+
horizontalLineToRelative(240f)
45+
verticalLineToRelative(40f)
46+
horizontalLineToRelative(200f)
47+
verticalLineToRelative(80f)
48+
horizontalLineToRelative(-40f)
49+
verticalLineToRelative(520f)
50+
quadToRelative(0f, 33f, -23.5f, 56.5f)
51+
reflectiveQuadTo(680f, 840f)
52+
close()
53+
moveToRelative(400f, -600f)
54+
horizontalLineTo(280f)
55+
verticalLineToRelative(520f)
56+
horizontalLineToRelative(400f)
57+
close()
58+
moveTo(360f, 680f)
59+
horizontalLineToRelative(80f)
60+
verticalLineToRelative(-360f)
61+
horizontalLineToRelative(-80f)
62+
close()
63+
moveToRelative(160f, 0f)
64+
horizontalLineToRelative(80f)
65+
verticalLineToRelative(-360f)
66+
horizontalLineToRelative(-80f)
67+
close()
68+
moveTo(280f, 240f)
69+
verticalLineToRelative(520f)
70+
close()
71+
}
72+
}.build()
73+
return _delete!!
74+
}
75+
76+
private var _delete: ImageVector? = null

0 commit comments

Comments
 (0)