fixed settings account bugs

This commit is contained in:
Kima 2023-05-27 14:48:06 +02:00
parent 8729f9887f
commit 8ec2ff8b1a
4 changed files with 77 additions and 41 deletions

View File

@ -89,7 +89,7 @@ class _SettingsScreenState extends State<SettingsScreen>
if (!settings.presentationMode) { if (!settings.presentationMode) {
_firstName = _nameParts.length > 1 ? _nameParts[1] : _nameParts[0]; _firstName = _nameParts.length > 1 ? _nameParts[1] : _nameParts[0];
} else { } else {
_firstName = "Béla"; _firstName = "János";
} }
accountTiles.add(AccountTile( accountTiles.add(AccountTile(
@ -128,8 +128,8 @@ class _SettingsScreenState extends State<SettingsScreen>
icon: Icon(FeatherIcons.grid, color: AppColors.of(context).teal), icon: Icon(FeatherIcons.grid, color: AppColors.of(context).teal),
title: Text("open_dkt".i18n), title: Text("open_dkt".i18n),
), ),
const UserMenuNickname(), UserMenuNickname(u),
const UserMenuProfilePic(), UserMenuProfilePic(u),
// BottomSheetMenuItem( // BottomSheetMenuItem(
// onPressed: () {}, // onPressed: () {},
// icon: Icon(FeatherIcons.camera), // icon: Icon(FeatherIcons.camera),
@ -247,7 +247,7 @@ class _SettingsScreenState extends State<SettingsScreen>
child: Text( child: Text(
!settings.presentationMode !settings.presentationMode
? (user.displayName ?? "?") ? (user.displayName ?? "?")
: "Béla", : "János",
maxLines: 1, maxLines: 1,
softWrap: false, softWrap: false,
overflow: TextOverflow.ellipsis, overflow: TextOverflow.ellipsis,

View File

@ -30,7 +30,8 @@ const Map<PremiumFeature, String> _featureAssets = {
PremiumFeature.gradestats: "assets/images/premium_stats_showcase.png", PremiumFeature.gradestats: "assets/images/premium_stats_showcase.png",
PremiumFeature.customcolors: "assets/images/premium_theme_showcase.png", PremiumFeature.customcolors: "assets/images/premium_theme_showcase.png",
PremiumFeature.profile: "assets/images/premium_nickname_showcase.png", PremiumFeature.profile: "assets/images/premium_nickname_showcase.png",
PremiumFeature.weeklytimetable: "assets/images/premium_timetable_showcase.png", PremiumFeature.weeklytimetable:
"assets/images/premium_timetable_showcase.png",
PremiumFeature.goalplanner: "assets/images/premium_goal_showcase.png", PremiumFeature.goalplanner: "assets/images/premium_goal_showcase.png",
PremiumFeature.widget: "assets/images/premium_widget_showcase.png", PremiumFeature.widget: "assets/images/premium_widget_showcase.png",
}; };
@ -40,37 +41,51 @@ const Map<PremiumFeature, String> _featureTitles = {
PremiumFeature.customcolors: "Több személyre szabás kell?", PremiumFeature.customcolors: "Több személyre szabás kell?",
PremiumFeature.profile: "Nem tetszik a neved?", PremiumFeature.profile: "Nem tetszik a neved?",
PremiumFeature.iconpack: "Jobban tetszettek a régi ikonok?", PremiumFeature.iconpack: "Jobban tetszettek a régi ikonok?",
PremiumFeature.subjectrename: "Sokáig tart elolvasni, hogy \"Földrajz természettudomány\"?", PremiumFeature.subjectrename:
"Sokáig tart elolvasni, hogy \"Földrajz természettudomány\"?",
PremiumFeature.weeklytimetable: "Szeretnéd egyszerre az egész hetet látni?", PremiumFeature.weeklytimetable: "Szeretnéd egyszerre az egész hetet látni?",
PremiumFeature.goalplanner: "Kövesd a céljaidat, sok-sok statisztikával.", PremiumFeature.goalplanner: "Kövesd a céljaidat, sok-sok statisztikával.",
PremiumFeature.widget: "Órák a kezdőképernyőd kényelméből.", PremiumFeature.widget: "Órák a kezdőképernyőd kényelméből.",
}; };
const Map<PremiumFeature, String> _featureDescriptions = { const Map<PremiumFeature, String> _featureDescriptions = {
PremiumFeature.gradestats: "Támogass Kupak szinten, hogy több statisztikát láthass. ", PremiumFeature.gradestats:
PremiumFeature.customcolors: "Támogass Kupak szinten, és szabd személyre az elemek, a háttér, és a panelek színeit.", "Támogass Kupak szinten, hogy több statisztikát láthass. ",
PremiumFeature.profile: "Kupak szinten változtathatod a nevedet, sőt, akár a profilképedet is.", PremiumFeature.customcolors:
PremiumFeature.iconpack: "Támogass Kupak szinten, hogy ikon témát választhass.", "Támogass Kupak szinten, és szabd személyre az elemek, a háttér, és a panelek színeit.",
PremiumFeature.subjectrename: "Támogass Kupak szinten, hogy átnevezhesd Föcire.", PremiumFeature.profile:
PremiumFeature.weeklytimetable: "Támogass Tinta szinten a heti órarend funkcióért.", "Kupak szinten változtathatod a nevedet, sőt, akár a profilképedet is.",
PremiumFeature.iconpack:
"Támogass Kupak szinten, hogy ikon témát választhass.",
PremiumFeature.subjectrename:
"Támogass Kupak szinten, hogy átnevezhesd Föcire.",
PremiumFeature.weeklytimetable:
"Támogass Tinta szinten a heti órarend funkcióért.",
PremiumFeature.goalplanner: "A célkövetéshez támogass Tinta szinten.", PremiumFeature.goalplanner: "A célkövetéshez támogass Tinta szinten.",
PremiumFeature.widget: "Támogass Tinta szinten, és helyezz egy widgetet a kezdőképernyődre.", PremiumFeature.widget:
"Támogass Tinta szinten, és helyezz egy widgetet a kezdőképernyődre.",
}; };
class PremiumLockedFeatureUpsell extends StatelessWidget { class PremiumLockedFeatureUpsell extends StatelessWidget {
const PremiumLockedFeatureUpsell({super.key, required this.feature}); const PremiumLockedFeatureUpsell({super.key, required this.feature});
static void show({required BuildContext context, required PremiumFeature feature}) => static void show(
showDialog(context: context, builder: (context) => PremiumLockedFeatureUpsell(feature: feature)); {required BuildContext context, required PremiumFeature feature}) =>
showDialog(
context: context,
builder: (context) => PremiumLockedFeatureUpsell(feature: feature));
final PremiumFeature feature; final PremiumFeature feature;
IconData _getIcon() => _featureLevels[feature] == PremiumFeatureLevel.kupak ? FilcIcons.kupak : FilcIcons.tinta; IconData _getIcon() => _featureLevels[feature] == PremiumFeatureLevel.kupak
Color _getColor(BuildContext context) => _featureLevels[feature] == PremiumFeatureLevel.kupak ? FilcIcons.kupak
? const Color(0xffC8A708) : FilcIcons.tinta;
: Theme.of(context).brightness == Brightness.light Color _getColor(BuildContext context) =>
? const Color(0xff691A9B) _featureLevels[feature] == PremiumFeatureLevel.kupak
: const Color(0xffA66FC8); ? const Color(0xffC8A708)
: Theme.of(context).brightness == Brightness.light
? const Color(0xff691A9B)
: const Color(0xffA66FC8);
String? _getAsset() => _featureAssets[feature]; String? _getAsset() => _featureAssets[feature];
String _getTitle() => _featureTitles[feature]!; String _getTitle() => _featureTitles[feature]!;
String _getDescription() => _featureDescriptions[feature]!; String _getDescription() => _featureDescriptions[feature]!;
@ -138,11 +153,14 @@ class PremiumLockedFeatureUpsell extends StatelessWidget {
width: double.infinity, width: double.infinity,
child: TextButton( child: TextButton(
style: ButtonStyle( style: ButtonStyle(
backgroundColor: MaterialStatePropertyAll(color.withOpacity(.25)), backgroundColor:
MaterialStatePropertyAll(color.withOpacity(.25)),
foregroundColor: MaterialStatePropertyAll(color), foregroundColor: MaterialStatePropertyAll(color),
overlayColor: MaterialStatePropertyAll(color.withOpacity(.1))), overlayColor:
MaterialStatePropertyAll(color.withOpacity(.1))),
onPressed: () { onPressed: () {
Navigator.of(context, rootNavigator: true).push(MaterialPageRoute(builder: (context) { Navigator.of(context, rootNavigator: true)
.push(MaterialPageRoute(builder: (context) {
return const PremiumScreen(); return const PremiumScreen();
})); }));
}, },

View File

@ -1,5 +1,6 @@
import 'package:filcnaplo/api/providers/database_provider.dart'; import 'package:filcnaplo/api/providers/database_provider.dart';
import 'package:filcnaplo/api/providers/user_provider.dart'; import 'package:filcnaplo/api/providers/user_provider.dart';
import 'package:filcnaplo/models/user.dart';
import 'package:filcnaplo_mobile_ui/common/bottom_sheet_menu/bottom_sheet_menu_item.dart'; import 'package:filcnaplo_mobile_ui/common/bottom_sheet_menu/bottom_sheet_menu_item.dart';
import 'package:filcnaplo_premium/models/premium_scopes.dart'; import 'package:filcnaplo_premium/models/premium_scopes.dart';
import 'package:filcnaplo_premium/providers/premium_provider.dart'; import 'package:filcnaplo_premium/providers/premium_provider.dart';
@ -9,18 +10,24 @@ import 'package:flutter_feather_icons/flutter_feather_icons.dart';
import 'package:filcnaplo_mobile_ui/screens/settings/settings_screen.i18n.dart'; import 'package:filcnaplo_mobile_ui/screens/settings/settings_screen.i18n.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
// ignore: must_be_immutable
class UserMenuNickname extends StatelessWidget { class UserMenuNickname extends StatelessWidget {
const UserMenuNickname({Key? key}) : super(key: key); late User u;
UserMenuNickname(User u, {Key? key}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return BottomSheetMenuItem( return BottomSheetMenuItem(
onPressed: () { onPressed: () {
if (!Provider.of<PremiumProvider>(context, listen: false).hasScope(PremiumScopes.nickname)) { if (!Provider.of<PremiumProvider>(context, listen: false)
PremiumLockedFeatureUpsell.show(context: context, feature: PremiumFeature.profile); .hasScope(PremiumScopes.nickname)) {
PremiumLockedFeatureUpsell.show(
context: context, feature: PremiumFeature.profile);
return; return;
} }
showDialog(context: context, builder: (context) => const UserNicknameEditor()); showDialog(
context: context, builder: (context) => UserNicknameEditor(u));
}, },
icon: const Icon(FeatherIcons.edit2), icon: const Icon(FeatherIcons.edit2),
title: Text("edit_nickname".i18n), title: Text("edit_nickname".i18n),
@ -28,8 +35,11 @@ class UserMenuNickname extends StatelessWidget {
} }
} }
// ignore: must_be_immutable
class UserNicknameEditor extends StatefulWidget { class UserNicknameEditor extends StatefulWidget {
const UserNicknameEditor({Key? key}) : super(key: key); late User u;
UserNicknameEditor(User u, {Key? key}) : super(key: key);
@override @override
State<UserNicknameEditor> createState() => _UserNicknameEditorState(); State<UserNicknameEditor> createState() => _UserNicknameEditorState();
@ -54,7 +64,7 @@ class _UserNicknameEditorState extends State<UserNicknameEditor> {
autofocus: true, autofocus: true,
decoration: InputDecoration( decoration: InputDecoration(
border: const OutlineInputBorder(), border: const OutlineInputBorder(),
label: Text(user.name!), label: Text(widget.u.name),
suffixIcon: IconButton( suffixIcon: IconButton(
icon: const Icon(FeatherIcons.x), icon: const Icon(FeatherIcons.x),
onPressed: () { onPressed: () {
@ -81,8 +91,10 @@ class _UserNicknameEditorState extends State<UserNicknameEditor> {
style: const TextStyle(fontWeight: FontWeight.w500), style: const TextStyle(fontWeight: FontWeight.w500),
), ),
onPressed: () { onPressed: () {
user.user!.nickname = _userName.text.trim(); widget.u.nickname = _userName.text.trim();
Provider.of<DatabaseProvider>(context, listen: false).store.storeUser(user.user!); Provider.of<DatabaseProvider>(context, listen: false)
.store
.storeUser(widget.u);
Provider.of<UserProvider>(context, listen: false).refresh(); Provider.of<UserProvider>(context, listen: false).refresh();
Navigator.of(context).pop(true); Navigator.of(context).pop(true);
}, },

View File

@ -4,6 +4,7 @@ import 'dart:io';
import 'package:filcnaplo/api/providers/database_provider.dart'; import 'package:filcnaplo/api/providers/database_provider.dart';
import 'package:filcnaplo/api/providers/user_provider.dart'; import 'package:filcnaplo/api/providers/user_provider.dart';
import 'package:filcnaplo/models/user.dart';
import 'package:filcnaplo_mobile_ui/common/bottom_sheet_menu/bottom_sheet_menu_item.dart'; import 'package:filcnaplo_mobile_ui/common/bottom_sheet_menu/bottom_sheet_menu_item.dart';
import 'package:filcnaplo_premium/models/premium_scopes.dart'; import 'package:filcnaplo_premium/models/premium_scopes.dart';
import 'package:filcnaplo_premium/providers/premium_provider.dart'; import 'package:filcnaplo_premium/providers/premium_provider.dart';
@ -14,8 +15,11 @@ import 'package:filcnaplo_mobile_ui/screens/settings/settings_screen.i18n.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:image_picker/image_picker.dart'; import 'package:image_picker/image_picker.dart';
// ignore: must_be_immutable
class UserMenuProfilePic extends StatelessWidget { class UserMenuProfilePic extends StatelessWidget {
const UserMenuProfilePic({Key? key}) : super(key: key); late User u;
UserMenuProfilePic(User u, {Key? key}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@ -27,8 +31,7 @@ class UserMenuProfilePic extends StatelessWidget {
return BottomSheetMenuItem( return BottomSheetMenuItem(
onPressed: () { onPressed: () {
showDialog( showDialog(
context: context, context: context, builder: (context) => UserProfilePicEditor(u));
builder: (context) => const UserProfilePicEditor());
}, },
icon: const Icon(FeatherIcons.camera), icon: const Icon(FeatherIcons.camera),
title: Text("edit_profile_picture".i18n), title: Text("edit_profile_picture".i18n),
@ -36,8 +39,11 @@ class UserMenuProfilePic extends StatelessWidget {
} }
} }
// ignore: must_be_immutable
class UserProfilePicEditor extends StatefulWidget { class UserProfilePicEditor extends StatefulWidget {
const UserProfilePicEditor({Key? key}) : super(key: key); late User u;
UserProfilePicEditor(User u, {Key? key}) : super(key: key);
@override @override
State<UserProfilePicEditor> createState() => _UserProfilePicEditorState(); State<UserProfilePicEditor> createState() => _UserProfilePicEditorState();
@ -101,10 +107,10 @@ class _UserProfilePicEditorState extends State<UserProfilePicEditor> {
Future<void> _cropImage() async { Future<void> _cropImage() async {
List<int> imageBytes = await _file!.readAsBytes(); List<int> imageBytes = await _file!.readAsBytes();
String base64Image = base64Encode(imageBytes); String base64Image = base64Encode(imageBytes);
user.user!.picture = base64Image; widget.u.picture = base64Image;
Provider.of<DatabaseProvider>(context, listen: false) Provider.of<DatabaseProvider>(context, listen: false)
.store .store
.storeUser(user.user!); .storeUser(widget.u);
Provider.of<UserProvider>(context, listen: false).refresh(); Provider.of<UserProvider>(context, listen: false).refresh();
} }
@ -137,7 +143,7 @@ class _UserProfilePicEditorState extends State<UserProfilePicEditor> {
const EdgeInsets.symmetric(vertical: 12.0, horizontal: 24.0), const EdgeInsets.symmetric(vertical: 12.0, horizontal: 24.0),
child: openImageWidget(), child: openImageWidget(),
), ),
if (user.user!.picture != "") if (widget.u.picture != "")
TextButton( TextButton(
child: Text( child: Text(
"remove_profile_picture".i18n, "remove_profile_picture".i18n,
@ -145,10 +151,10 @@ class _UserProfilePicEditorState extends State<UserProfilePicEditor> {
fontWeight: FontWeight.w500, color: Colors.red), fontWeight: FontWeight.w500, color: Colors.red),
), ),
onPressed: () { onPressed: () {
user.user!.picture = ""; widget.u.picture = "";
Provider.of<DatabaseProvider>(context, listen: false) Provider.of<DatabaseProvider>(context, listen: false)
.store .store
.storeUser(user.user!); .storeUser(widget.u);
Provider.of<UserProvider>(context, listen: false).refresh(); Provider.of<UserProvider>(context, listen: false).refresh();
Navigator.of(context).pop(true); Navigator.of(context).pop(true);
}, },