diff --git a/filcnaplo/lib/database/init.dart b/filcnaplo/lib/database/init.dart index 4f7d1ed..274dbce 100644 --- a/filcnaplo/lib/database/init.dart +++ b/filcnaplo/lib/database/init.dart @@ -33,6 +33,7 @@ const settingsDB = DatabaseStruct("settings", { "renamed_subjects_italics": int, "renamed_teachers_enabled": int, "renamed_teachers_italics": int, "live_activity_color": String, + "welcome_message": String, }); // DON'T FORGET TO UPDATE DEFAULT VALUES IN `initDB` MIGRATION OR ELSE PARENTS WILL COMPLAIN ABOUT THEIR CHILDREN MISSING // YOU'VE BEEN WARNED!!! diff --git a/filcnaplo/lib/models/settings.dart b/filcnaplo/lib/models/settings.dart index 3e42b26..05989b6 100644 --- a/filcnaplo/lib/models/settings.dart +++ b/filcnaplo/lib/models/settings.dart @@ -76,6 +76,7 @@ class SettingsProvider extends ChangeNotifier { bool _renamedTeachersEnabled; bool _renamedTeachersItalics; Color _liveActivityColor; + String _welcomeMessage; SettingsProvider({ DatabaseProvider? database, @@ -120,6 +121,7 @@ class SettingsProvider extends ChangeNotifier { required bool renameTeachersEnabled, required bool renameTeachersItalics, required Color liveActivityColor, + required String welcomeMessage, }) : _database = database, _language = language, _startPage = startPage, @@ -161,7 +163,8 @@ class SettingsProvider extends ChangeNotifier { _renamedSubjectsItalics = renameSubjectsItalics, _renamedTeachersEnabled = renameTeachersEnabled, _renamedTeachersItalics = renameTeachersItalics, - _liveActivityColor = liveActivityColor; + _liveActivityColor = liveActivityColor, + _welcomeMessage = welcomeMessage; factory SettingsProvider.fromMap(Map map, {required DatabaseProvider database}) { @@ -223,6 +226,7 @@ class SettingsProvider extends ChangeNotifier { renameTeachersEnabled: map["renamed_teachers_enabled"] == 1, renameTeachersItalics: map["renamed_teachers_italics"] == 1, liveActivityColor: Color(map["live_activity_color"]), + welcomeMessage: map["welcome_message"], ); } @@ -272,6 +276,7 @@ class SettingsProvider extends ChangeNotifier { "renamed_teachers_enabled": _renamedTeachersEnabled ? 1 : 0, "renamed_teachers_italics": _renamedTeachersItalics ? 1 : 0, "live_activity_color": _liveActivityColor.value, + "welcome_message": _welcomeMessage, }; } @@ -325,6 +330,7 @@ class SettingsProvider extends ChangeNotifier { renameTeachersEnabled: false, renameTeachersItalics: false, liveActivityColor: const Color(0xFF676767), + welcomeMessage: '', ); } @@ -373,6 +379,7 @@ class SettingsProvider extends ChangeNotifier { bool get renamedTeachersEnabled => _renamedTeachersEnabled; bool get renamedTeachersItalics => _renamedTeachersItalics; Color get liveActivityColor => _liveActivityColor; + String get welcomeMessage => _welcomeMessage; Future update({ bool store = true, @@ -417,6 +424,7 @@ class SettingsProvider extends ChangeNotifier { bool? renamedTeachersEnabled, bool? renamedTeachersItalics, Color? liveActivityColor, + String? welcomeMessage, }) async { if (language != null && language != _language) _language = language; if (startPage != null && startPage != _startPage) _startPage = startPage; @@ -535,6 +543,9 @@ class SettingsProvider extends ChangeNotifier { if (liveActivityColor != null && liveActivityColor != _liveActivityColor) { _liveActivityColor = liveActivityColor; } + if (welcomeMessage != null && welcomeMessage != _welcomeMessage) { + _welcomeMessage = welcomeMessage; + } if (store) await _database?.store.storeSettings(this); notifyListeners(); } diff --git a/filcnaplo_mobile_ui/lib/screens/settings/settings_screen.dart b/filcnaplo_mobile_ui/lib/screens/settings/settings_screen.dart index 6a6339c..8d199b9 100755 --- a/filcnaplo_mobile_ui/lib/screens/settings/settings_screen.dart +++ b/filcnaplo_mobile_ui/lib/screens/settings/settings_screen.dart @@ -43,6 +43,7 @@ import 'package:filcnaplo_premium/ui/mobile/settings/profile_pic.dart'; import 'package:filcnaplo_premium/ui/mobile/settings/icon_pack.dart'; import 'package:filcnaplo_premium/ui/mobile/settings/modify_subject_names.dart'; import 'package:filcnaplo_premium/ui/mobile/settings/modify_teacher_names.dart'; +import 'package:filcnaplo_premium/ui/mobile/settings/welcome_message.dart'; class SettingsScreen extends StatefulWidget { const SettingsScreen({Key? key}) : super(key: key); @@ -454,6 +455,7 @@ class _SettingsScreenState extends State Material( type: MaterialType.transparency, child: MenuNotifications(settings: settings)), + WelcomeMessagePanelButton(settings, user), ], ), ), diff --git a/filcnaplo_mobile_ui/lib/screens/settings/settings_screen.i18n.dart b/filcnaplo_mobile_ui/lib/screens/settings/settings_screen.i18n.dart index 3ff52aa..d6c242d 100755 --- a/filcnaplo_mobile_ui/lib/screens/settings/settings_screen.i18n.dart +++ b/filcnaplo_mobile_ui/lib/screens/settings/settings_screen.i18n.dart @@ -73,6 +73,9 @@ extension SettingsLocalization on String { "devsettings": "Developer Settings", "devmode": "Developer Mode", "copy_jwt": "Copy JWT", + "welcome_msg": "Welcome Message", + "default": "Default", + "edit_welcome_msg": "Edit welcome message", }, "hu_hu": { "personal_details": "Személyes információk", @@ -144,6 +147,9 @@ extension SettingsLocalization on String { "devsettings": "Fejlesztői Beállítások", "devmode": "Fejlesztői mód", "copy_jwt": "JWT másolása", + "welcome_msg": "Üdvözlő üzenet", + "default": "Alapértelmezett", + "edit_welcome_msg": "Üdvözlő üzenet szerkesztése", }, "de_de": { "personal_details": "Persönliche Angaben", @@ -214,6 +220,9 @@ extension SettingsLocalization on String { "devsettings": "Entwickleroptionen", "devmode": "Entwicklermodus", "copy_jwt": "JWT kopieren", + "welcome_msg": "Willkommensnachricht", + "default": "Standard", + "edit_welcome_msg": "Begrüßungsnachricht bearbeiten", }, }; diff --git a/filcnaplo_premium/lib/ui/mobile/settings/welcome_message.dart b/filcnaplo_premium/lib/ui/mobile/settings/welcome_message.dart new file mode 100644 index 0000000..efb834f --- /dev/null +++ b/filcnaplo_premium/lib/ui/mobile/settings/welcome_message.dart @@ -0,0 +1,142 @@ +import 'package:filcnaplo/api/providers/user_provider.dart'; +import 'package:filcnaplo/models/settings.dart'; +import 'package:filcnaplo_mobile_ui/common/panel/panel_button.dart'; +import 'package:filcnaplo_premium/models/premium_scopes.dart'; +import 'package:filcnaplo_premium/providers/premium_provider.dart'; +import 'package:filcnaplo_premium/ui/mobile/premium/upsell.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_feather_icons/flutter_feather_icons.dart'; +import 'package:filcnaplo_mobile_ui/screens/settings/settings_screen.i18n.dart'; +import 'package:provider/provider.dart'; +import 'package:i18n_extension/i18n_extension.dart'; + +// ignore: must_be_immutable +class WelcomeMessagePanelButton extends StatelessWidget { + late SettingsProvider settingsProvider; + late UserProvider user; + + WelcomeMessagePanelButton(this.settingsProvider, this.user, {Key? key}) + : super(key: key); + + @override + Widget build(BuildContext context) { + String finalName = ((user.nickname ?? '') != '' + ? user.nickname + : (user.displayName ?? '') != '' + ? user.displayName + : 'János') ?? + 'János'; + + return PanelButton( + onPressed: () { + if (!Provider.of(context, listen: false) + .hasScope(PremiumScopes.all)) { + PremiumLockedFeatureUpsell.show( + context: context, feature: PremiumFeature.profile); + return; + } + showDialog( + context: context, + builder: (context) => WelcomeMessageEditor(settingsProvider)); + }, + title: Text("welcome_msg".i18n), + leading: const Icon(FeatherIcons.smile), + trailing: SizedBox( + width: 100, + child: Expanded( + child: Text( + settingsProvider.welcomeMessage != '' + ? localizeFill( + settingsProvider.welcomeMessage, + [finalName, finalName, finalName], + ) + : 'default'.i18n, + style: const TextStyle(fontSize: 14.0), + textAlign: TextAlign.end, + softWrap: true, + overflow: TextOverflow.ellipsis, + ), + ), + ), + ); + } +} + +// ignore: must_be_immutable +class WelcomeMessageEditor extends StatefulWidget { + late SettingsProvider settingsProvider; + + WelcomeMessageEditor(this.settingsProvider, {Key? key}) : super(key: key); + + @override + State createState() => _WelcomeMessageEditorState(); +} + +class _WelcomeMessageEditorState extends State { + final _welcomeMsg = TextEditingController(); + + @override + void initState() { + super.initState(); + _welcomeMsg.text = + widget.settingsProvider.welcomeMessage.replaceAll('%s', '%name%'); + } + + @override + Widget build(BuildContext context) { + return AlertDialog( + title: Text("edit_welcome_msg".i18n), + content: TextField( + controller: _welcomeMsg, + autofocus: true, + decoration: InputDecoration( + border: const OutlineInputBorder(), + label: Text('welcome_msg'.i18n), + suffixIcon: IconButton( + icon: const Icon(FeatherIcons.x), + onPressed: () { + setState(() { + _welcomeMsg.text = ""; + }); + }, + ), + ), + ), + actions: [ + TextButton( + child: Text( + "cancel".i18n, + style: const TextStyle(fontWeight: FontWeight.w500), + ), + onPressed: () { + Navigator.of(context).maybePop(); + }, + ), + TextButton( + child: Text( + "done".i18n, + style: const TextStyle(fontWeight: FontWeight.w500), + ), + onPressed: () { + // var trimmed = _welcomeMsg.text.trim(); + + // var defLen = trimmed.length; + // var replacedLen = trimmed.replaceAll('%s', '').length; + + // if (defLen - 2 > replacedLen) { + // print('fuck yourself rn'); + // } + var finalText = _welcomeMsg.text + .trim() + .replaceAll('%s', '') + .replaceFirst('%name%', '%s'); + + widget.settingsProvider + .update(welcomeMessage: finalText, store: true); + Navigator.of(context).pop(true); + }, + ), + ], + ); + } +}