From ea3689529b4f13ab65eb5eb422404fef1316f82c Mon Sep 17 00:00:00 2001 From: Gabby Gurdin Date: Mon, 26 Feb 2024 16:01:08 -0500 Subject: [PATCH] switch to using matrix profile to store DOB --- lib/pangea/constants/local.key.dart | 1 + lib/pangea/constants/pangea_event_types.dart | 2 + .../controllers/permissions_controller.dart | 6 +- lib/pangea/controllers/user_controller.dart | 63 +++++++++++++++++-- lib/pangea/models/user_model.dart | 23 ++++++- lib/pangea/pages/p_user_age/p_user_age.dart | 2 +- lib/pangea/repo/user_repo.dart | 2 - 7 files changed, 83 insertions(+), 16 deletions(-) diff --git a/lib/pangea/constants/local.key.dart b/lib/pangea/constants/local.key.dart index a0fd78670..a830b9f5a 100644 --- a/lib/pangea/constants/local.key.dart +++ b/lib/pangea/constants/local.key.dart @@ -1,5 +1,6 @@ class PLocalKey { static const String user = 'user'; + static const String matrixProfile = 'matrixProfile'; static const String classes = 'classes'; diff --git a/lib/pangea/constants/pangea_event_types.dart b/lib/pangea/constants/pangea_event_types.dart index 3eb642a0c..abd155460 100644 --- a/lib/pangea/constants/pangea_event_types.dart +++ b/lib/pangea/constants/pangea_event_types.dart @@ -16,4 +16,6 @@ class PangeaEventTypes { static const audio = "p.audio"; static const botOptions = "pangea.bot_options"; + + static const userAge = "pangea.user_age"; } diff --git a/lib/pangea/controllers/permissions_controller.dart b/lib/pangea/controllers/permissions_controller.dart index 6dcf64388..314b17c29 100644 --- a/lib/pangea/controllers/permissions_controller.dart +++ b/lib/pangea/controllers/permissions_controller.dart @@ -1,5 +1,3 @@ -import 'package:matrix/matrix.dart'; - import 'package:fluffychat/pangea/constants/age_limits.dart'; import 'package:fluffychat/pangea/constants/pangea_event_types.dart'; import 'package:fluffychat/pangea/controllers/base_controller.dart'; @@ -7,6 +5,7 @@ import 'package:fluffychat/pangea/controllers/pangea_controller.dart'; import 'package:fluffychat/pangea/extensions/pangea_room_extension.dart'; import 'package:fluffychat/pangea/models/class_model.dart'; import 'package:fluffychat/pangea/utils/p_extension.dart'; +import 'package:matrix/matrix.dart'; class PermissionsController extends BaseController { late PangeaController _pangeaController; @@ -32,8 +31,7 @@ class PermissionsController extends BaseController { /// Returns false if user is null bool isUser18() { - final dob = - _pangeaController.userController.userModel?.profile?.dateOfBirth; + final dob = _pangeaController.userController.matrixProfile?.dateOfBirth; return dob != null ? DateTime.parse(dob).isAtLeastYearsOld(AgeLimits.toAccessFeatures) : false; diff --git a/lib/pangea/controllers/user_controller.dart b/lib/pangea/controllers/user_controller.dart index 4142a9bdd..316332537 100644 --- a/lib/pangea/controllers/user_controller.dart +++ b/lib/pangea/controllers/user_controller.dart @@ -2,14 +2,15 @@ import 'dart:async'; import 'dart:developer'; import 'package:collection/collection.dart'; -import 'package:jwt_decode/jwt_decode.dart'; -import 'package:matrix/matrix.dart' as matrix; - import 'package:fluffychat/pangea/constants/language_keys.dart'; import 'package:fluffychat/pangea/constants/model_keys.dart'; +import 'package:fluffychat/pangea/constants/pangea_event_types.dart'; import 'package:fluffychat/pangea/controllers/base_controller.dart'; import 'package:fluffychat/pangea/controllers/pangea_controller.dart'; import 'package:fluffychat/widgets/fluffy_chat_app.dart'; +import 'package:jwt_decode/jwt_decode.dart'; +import 'package:matrix/matrix.dart' as matrix; + import '../constants/local.key.dart'; import '../models/user_model.dart'; import '../repo/user_repo.dart'; @@ -35,6 +36,11 @@ class UserController extends BaseController { if (newUserModel != null) { _savePUserModel(newUserModel); + if (newUserModel.profile!.dateOfBirth != null) { + await setMatrixProfile(newUserModel.profile!.dateOfBirth!); + } + final MatrixProfile? matrixProfile = await getMatrixProfile(); + _saveMatrixProfile(matrixProfile); } _completeCompleter(); @@ -45,6 +51,29 @@ class UserController extends BaseController { } } + Future setMatrixProfile(String dob) async { + await _pangeaController.matrixState.client.setAccountData( + userId!, + PangeaEventTypes.userAge, + {ModelKey.userDateOfBirth: dob}, + ); + final MatrixProfile? matrixProfile = await getMatrixProfile(); + _saveMatrixProfile(matrixProfile); + } + + Future getMatrixProfile() async { + try { + final Map accountData = + await _pangeaController.matrixState.client.getAccountData( + userId!, + PangeaEventTypes.userAge, + ); + return MatrixProfile.fromJson(accountData); + } catch (_) { + return null; + } + } + void _completeCompleter() { if (!_completer.isCompleted) { _completer.complete(null); @@ -91,6 +120,11 @@ class UserController extends BaseController { return data != null ? PUserModel.fromJson(data) : null; } + MatrixProfile? get matrixProfile { + final data = _pangeaController.pStoreService.read(PLocalKey.matrixProfile); + return data != null ? MatrixProfile.fromJson(data) : null; + } + Future get isPUserDataAvailable async { try { final PUserModel? toCheck = userModel ?? (await fetchUserModel()); @@ -102,8 +136,10 @@ class UserController extends BaseController { Future get isUserDataAvailableAndDateOfBirthSet async { try { - final PUserModel? toCheck = userModel ?? (await fetchUserModel()); - return toCheck?.profile?.dateOfBirth != null ? true : false; + if (matrixProfile == null) { + await fetchUserModel(); + } + return matrixProfile?.dateOfBirth != null ? true : false; } catch (err) { return false; } @@ -147,6 +183,16 @@ class UserController extends BaseController { FluffyChatApp.router.go("/rooms/user_age"); } + _saveMatrixProfile(MatrixProfile? matrixProfile) { + if (matrixProfile != null) { + _pangeaController.pStoreService.save( + PLocalKey.matrixProfile, + matrixProfile.toJson(), + ); + setState(data: matrixProfile); + } + } + _savePUserModel(PUserModel? pUserModel) { final jsonUser = pUserModel!.toJson(); _pangeaController.pStoreService.save(PLocalKey.user, jsonUser); @@ -199,16 +245,21 @@ class UserController extends BaseController { profile: updatedUserProfile, ), ); + + if (dateOfBirth != null) { + await setMatrixProfile(dateOfBirth); + } } Future createPangeaUser({required String dob}) async { final PUserModel newUserModel = await PUserRepo.repoCreatePangeaUser( userID: userId!, - dateOfBirth: dob, fullName: fullname, matrixAccessToken: _matrixAccessToken!, ); await _savePUserModel(newUserModel); + + await setMatrixProfile(dob); } String? get _matrixAccessToken => diff --git a/lib/pangea/models/user_model.dart b/lib/pangea/models/user_model.dart index cd8fa3aac..c0e5a58f0 100644 --- a/lib/pangea/models/user_model.dart +++ b/lib/pangea/models/user_model.dart @@ -1,11 +1,10 @@ import 'dart:convert'; -import 'package:flutter/material.dart'; - import 'package:country_picker/country_picker.dart'; +import 'package:fluffychat/pangea/constants/model_keys.dart'; +import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:fluffychat/pangea/constants/model_keys.dart'; import '../constants/language_keys.dart'; import 'language_model.dart'; @@ -40,6 +39,24 @@ class PUserModel { } } +class MatrixProfile { + String dateOfBirth; + + MatrixProfile({ + required this.dateOfBirth, + }); + + factory MatrixProfile.fromJson(Map json) => MatrixProfile( + dateOfBirth: json[ModelKey.userDateOfBirth], + ); + + Map toJson() { + final Map data = {}; + data[ModelKey.userDateOfBirth] = dateOfBirth; + return data; + } +} + class Profile { // i'm considering removing this field because it's duplicating info in the // matrix database diff --git a/lib/pangea/pages/p_user_age/p_user_age.dart b/lib/pangea/pages/p_user_age/p_user_age.dart index 955ad1e15..9d59e84b5 100644 --- a/lib/pangea/pages/p_user_age/p_user_age.dart +++ b/lib/pangea/pages/p_user_age/p_user_age.dart @@ -83,7 +83,7 @@ class PUserAgeController extends State { loading = true; }); - final String date = DateFormat('MM-dd-yyyy').format(selectedDate!); + final String date = DateFormat('yyyy-MM-dd').format(selectedDate!); if (pangeaController.userController.userModel?.access == null) { await pangeaController.userController.createPangeaUser(dob: date); diff --git a/lib/pangea/repo/user_repo.dart b/lib/pangea/repo/user_repo.dart index 76b4104fc..70ab06704 100644 --- a/lib/pangea/repo/user_repo.dart +++ b/lib/pangea/repo/user_repo.dart @@ -13,7 +13,6 @@ import '../network/urls.dart'; class PUserRepo { static Future repoCreatePangeaUser({ required String userID, - required String dateOfBirth, required fullName, required String matrixAccessToken, }) async { @@ -25,7 +24,6 @@ class PUserRepo { final Map body = { ModelKey.userFullName: fullName, ModelKey.userPangeaUserId: userID, - ModelKey.userDateOfBirth: dateOfBirth, }; final Response res = await req.post( url: PApiUrls.createUser,