Skip to content

Commit eda0bfe

Browse files
author
darkhan.nausharipov
committed
delete my account (apache#25255)
1 parent a34b170 commit eda0bfe

12 files changed

Lines changed: 147 additions & 64 deletions

File tree

learning/tour-of-beam/frontend/assets/translations/en.yaml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,8 @@ ui:
2323
continueGoogle: Continue with Google
2424
copyright: © The Apache Software Foundation
2525
hint: Hint
26-
deleteAccount: Delete my account
26+
deleteMyAccount: Delete my account
27+
deleteTobAccount: Delete my Tour of Beam account
2728
privacyPolicy: Privacy Policy
2829
reportIssue: Report Issue in GitHub
2930
signIn: Sign in
@@ -47,6 +48,7 @@ pages:
4748

4849
dialogs:
4950
signInIf: If you would like to save your progress and track completed modules
51+
deleteAccountWarning: Are you sure you want to delete your Tour of Beam account? This will permanently erase your learning progress.
5052

5153
complexity:
5254
basic: Basic level

learning/tour-of-beam/frontend/lib/auth/notifier.dart

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,12 @@ import 'package:firebase_auth/firebase_auth.dart';
2222
import 'package:firebase_auth_platform_interface/firebase_auth_platform_interface.dart';
2323
import 'package:flutter/material.dart';
2424

25+
import '../repositories/client/client.dart';
26+
2527
class AuthNotifier extends ChangeNotifier {
26-
AuthNotifier() {
28+
final TobClient client;
29+
30+
AuthNotifier({required this.client}) {
2731
FirebaseAuth.instance.authStateChanges().listen((user) {
2832
notifyListeners();
2933
});
@@ -42,4 +46,9 @@ class AuthNotifier extends ChangeNotifier {
4246
Future<void> logOut() async {
4347
await FirebaseAuth.instance.signOut();
4448
}
49+
50+
Future<void> deleteAccount() async {
51+
await client.postDeleteUserProgress();
52+
await FirebaseAuth.instance.currentUser?.delete();
53+
}
4554
}

learning/tour-of-beam/frontend/lib/components/profile/user_menu.dart

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -125,9 +125,29 @@ class _Buttons extends StatelessWidget {
125125
),
126126
const BeamDivider(),
127127
_IconLabel(
128-
onTap: () {},
128+
onTap: () {
129+
closeOverlayCallback();
130+
showDialog(
131+
context: context,
132+
builder: (context) => Dialog(
133+
backgroundColor: Colors.transparent,
134+
child: BeamAlertDialog(
135+
continueLabel: 'ui.deleteMyAccount'.tr(),
136+
title: 'ui.deleteTobAccount'.tr(),
137+
body: 'dialogs.deleteAccountWarning'.tr(),
138+
onContinue: () {
139+
authNotifier.deleteAccount().then(
140+
(_) {
141+
Navigator.pop(context);
142+
},
143+
);
144+
},
145+
),
146+
),
147+
);
148+
},
129149
iconPath: Assets.svg.profileDelete,
130-
label: 'ui.deleteAccount'.tr(),
150+
label: 'ui.deleteMyAccount'.tr(),
131151
),
132152
],
133153
);

learning/tour-of-beam/frontend/lib/constants/sizes.dart

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919
class TobSizes {
2020
static const double footerHeight = 35;
2121
static const double authOverlayWidth = 260;
22-
static const double hintPopupWidth = 420;
2322
}
2423

2524
class ScreenSizes {

learning/tour-of-beam/frontend/lib/locator.dart

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -31,24 +31,24 @@ import 'router/page_factory.dart';
3131
import 'router/route_information_parser.dart';
3232
import 'state.dart';
3333

34+
final _client = CloudFunctionsTobClient();
35+
3436
Future<void> initializeServiceLocator() async {
3537
_initializeAuth();
3638
_initializeState();
3739
_initializeCaches();
3840
}
3941

4042
void _initializeAuth() {
41-
GetIt.instance.registerSingleton(AuthNotifier());
43+
GetIt.instance.registerSingleton(AuthNotifier(client: _client));
4244
}
4345

4446
void _initializeCaches() {
45-
final client = CloudFunctionsTobClient();
46-
47-
GetIt.instance.registerSingleton<TobClient>(client);
48-
GetIt.instance.registerSingleton(ContentTreeCache(client: client));
49-
GetIt.instance.registerSingleton(SdkCache(client: client));
50-
GetIt.instance.registerSingleton(UnitContentCache(client: client));
51-
GetIt.instance.registerSingleton(UnitProgressCache(client: client));
47+
GetIt.instance.registerSingleton<TobClient>(_client);
48+
GetIt.instance.registerSingleton(ContentTreeCache(client: _client));
49+
GetIt.instance.registerSingleton(SdkCache(client: _client));
50+
GetIt.instance.registerSingleton(UnitContentCache(client: _client));
51+
GetIt.instance.registerSingleton(UnitProgressCache(client: _client));
5252
}
5353

5454
void _initializeState() {

learning/tour-of-beam/frontend/lib/pages/tour/widgets/hints.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ class _Popup extends StatelessWidget {
6363
Widget build(BuildContext context) {
6464
return OverlayBody(
6565
child: Container(
66-
width: TobSizes.hintPopupWidth,
66+
width: BeamSizes.popupWidth,
6767
padding: const EdgeInsets.all(BeamSizes.size16),
6868
child: Column(
6969
crossAxisAlignment: CrossAxisAlignment.start,

learning/tour-of-beam/frontend/lib/pages/tour/widgets/solution_button.dart

Lines changed: 8 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ import 'package:flutter_svg/svg.dart';
2222
import 'package:playground_components/playground_components.dart';
2323

2424
import '../../../assets/assets.gen.dart';
25-
import '../../../constants/sizes.dart';
2625
import '../state.dart';
2726

2827
class SolutionButton extends StatelessWidget {
@@ -49,7 +48,14 @@ class SolutionButton extends StatelessWidget {
4948
context: context,
5049
builder: (context) => Dialog(
5150
backgroundColor: Colors.transparent,
52-
child: _Popup(tourNotifier: tourNotifier),
51+
child: BeamAlertDialog(
52+
continueLabel: 'pages.tour.showSolution'.tr(),
53+
title: 'pages.tour.solveYourself'.tr(),
54+
onContinue: () {
55+
tourNotifier.toggleShowingSolution();
56+
Navigator.pop(context);
57+
},
58+
),
5359
),
5460
);
5561
},
@@ -63,51 +69,3 @@ class SolutionButton extends StatelessWidget {
6369
);
6470
}
6571
}
66-
67-
class _Popup extends StatelessWidget {
68-
final TourNotifier tourNotifier;
69-
70-
const _Popup({
71-
required this.tourNotifier,
72-
});
73-
74-
@override
75-
Widget build(BuildContext context) {
76-
return OverlayBody(
77-
child: Container(
78-
width: TobSizes.hintPopupWidth,
79-
padding: const EdgeInsets.all(BeamSizes.size16),
80-
child: Column(
81-
crossAxisAlignment: CrossAxisAlignment.start,
82-
mainAxisSize: MainAxisSize.min,
83-
children: [
84-
Text(
85-
'pages.tour.solveYourself',
86-
style: Theme.of(context).textTheme.headlineMedium,
87-
).tr(),
88-
const SizedBox(height: BeamSizes.size8),
89-
Row(
90-
mainAxisAlignment: MainAxisAlignment.end,
91-
children: [
92-
TextButton(
93-
onPressed: () {
94-
Navigator.pop(context);
95-
},
96-
child: const Text('ui.cancel').tr(),
97-
),
98-
const SizedBox(width: BeamSizes.size8),
99-
TextButton(
100-
onPressed: () {
101-
tourNotifier.toggleShowingSolution();
102-
Navigator.pop(context);
103-
},
104-
child: const Text('pages.tour.showSolution').tr(),
105-
),
106-
],
107-
),
108-
],
109-
),
110-
),
111-
);
112-
}
113-
}

learning/tour-of-beam/frontend/lib/repositories/client/client.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,4 +31,6 @@ abstract class TobClient {
3131
Future<GetUserProgressResponse?> getUserProgress(String sdkId);
3232

3333
Future<void> postUnitComplete(String sdkId, String id);
34+
35+
Future<void> postDeleteUserProgress();
3436
}

learning/tour-of-beam/frontend/lib/repositories/client/cloud_functions_client.dart

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,4 +101,17 @@ class CloudFunctionsTobClient extends TobClient {
101101
},
102102
);
103103
}
104+
105+
@override
106+
Future<void> postDeleteUserProgress() async {
107+
final token = await GetIt.instance.get<AuthNotifier>().getToken();
108+
await http.post(
109+
Uri.parse(
110+
'$cloudFunctionsBaseUrl/postDeleteProgress',
111+
),
112+
headers: {
113+
HttpHeaders.authorizationHeader: 'Bearer $token',
114+
},
115+
);
116+
}
104117
}

playground/frontend/playground_components/lib/playground_components.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ export 'src/util/string.dart';
6060
export 'src/widgets/bubble.dart';
6161
export 'src/widgets/clickable.dart';
6262
export 'src/widgets/complexity.dart';
63+
export 'src/widgets/dialogs/alert_dialog.dart';
6364
export 'src/widgets/divider.dart';
6465
export 'src/widgets/header_icon_button.dart';
6566
export 'src/widgets/loading_error.dart';

0 commit comments

Comments
 (0)