From 2b505ceaf4f9c1dd5eb5742d955c685b454825ac Mon Sep 17 00:00:00 2001 From: Benimautner Date: Sat, 23 Dec 2023 22:38:16 +0100 Subject: [PATCH] load default project from server --- lib/api/user_implementation.dart | 8 +++ lib/models/user.dart | 90 +++++++++++++++++++++++++++++++- lib/pages/settings.dart | 30 +++++++---- lib/service/mocked_services.dart | 6 +++ lib/service/services.dart | 3 +- 5 files changed, 125 insertions(+), 12 deletions(-) diff --git a/lib/api/user_implementation.dart b/lib/api/user_implementation.dart index 9a70bd3..50c9606 100644 --- a/lib/api/user_implementation.dart +++ b/lib/api/user_implementation.dart @@ -44,4 +44,12 @@ class UserAPIService extends APIService implements UserService { Future getCurrentUser() { return client.get('/user').then((map) => User.fromJson(map?.body)); } + + @override + Future setCurrentUserSettings(UserSettings userSettings) async { + return client.post('/user/settings/general', body: userSettings.toJson()).then((response) { + if(response == null) return null; + return userSettings; + }); + } } diff --git a/lib/models/user.dart b/lib/models/user.dart index 553aabd..a273188 100644 --- a/lib/models/user.dart +++ b/lib/models/user.dart @@ -1,10 +1,92 @@ import 'package:flutter/cupertino.dart'; import 'package:vikunja_app/global.dart'; +class UserSettings { + final int default_project_id; + final bool discoverable_by_email, discoverable_by_name, email_reminders_enabled; + final Map? frontend_settings; + final String language; + final String name; + final bool overdue_tasks_reminders_enabled; + final String overdue_tasks_reminders_time; + final String timezone; + final int week_start; + + UserSettings({ + this.default_project_id = 0, + this.discoverable_by_email = false, + this.discoverable_by_name = false, + this.email_reminders_enabled = false, + this.frontend_settings = null, + this.language = '', + this.name = '', + this.overdue_tasks_reminders_enabled = false, + this.overdue_tasks_reminders_time = '', + this.timezone = '', + this.week_start = 0, + }); + + UserSettings.fromJson(Map json) + : default_project_id = json['default_project_id'], + discoverable_by_email = json['discoverable_by_email'], + discoverable_by_name = json['discoverable_by_name'], + email_reminders_enabled = json['email_reminders_enabled'], + frontend_settings = json['frontend_settings'], + language = json['language'], + name = json['name'], + overdue_tasks_reminders_enabled = json['overdue_tasks_reminders_enabled'], + overdue_tasks_reminders_time = json['overdue_tasks_reminders_time'], + timezone = json['timezone'], + week_start = json['week_start']; + + toJson() => { + 'default_project_id': default_project_id, + 'discoverable_by_email': discoverable_by_email, + 'discoverable_by_name': discoverable_by_name, + 'email_reminders_enabled': email_reminders_enabled, + 'frontend_settings': frontend_settings, + 'language': language, + 'name': name, + 'overdue_tasks_reminders_enabled': overdue_tasks_reminders_enabled, + 'overdue_tasks_reminders_time': overdue_tasks_reminders_time, + 'timezone': timezone, + 'week_start': week_start, + }; + + UserSettings copyWith({ + int? default_project_id, + bool? discoverable_by_email, + bool? discoverable_by_name, + bool? email_reminders_enabled, + Map? frontend_settings, + String? language, + String? name, + bool? overdue_tasks_reminders_enabled, + String? overdue_tasks_reminders_time, + String? timezone, + int? week_start, + }) { + return UserSettings( + default_project_id: default_project_id ?? this.default_project_id, + discoverable_by_email: discoverable_by_email ?? this.discoverable_by_email, + discoverable_by_name: discoverable_by_name ?? this.discoverable_by_name, + email_reminders_enabled: email_reminders_enabled ?? this.email_reminders_enabled, + frontend_settings: frontend_settings ?? this.frontend_settings, + language: language ?? this.language, + name: name ?? this.name, + overdue_tasks_reminders_enabled: overdue_tasks_reminders_enabled ?? this.overdue_tasks_reminders_enabled, + overdue_tasks_reminders_time: overdue_tasks_reminders_time ?? this.overdue_tasks_reminders_time, + timezone: timezone ?? this.timezone, + week_start: week_start ?? this.week_start, + ); + } +} + class User { final int id; final String name, username; final DateTime created, updated; + UserSettings? settings; User({ this.id = 0, @@ -12,6 +94,7 @@ class User { required this.username, DateTime? created, DateTime? updated, + this.settings, }) : this.created = created ?? DateTime.now(), this.updated = updated ?? DateTime.now(); @@ -20,7 +103,11 @@ class User { name = json.containsKey('name') ? json['name'] : '', username = json['username'], created = DateTime.parse(json['created']), - updated = DateTime.parse(json['updated']); + updated = DateTime.parse(json['updated']) { + if(json.containsKey('settings')){ + this.settings = UserSettings.fromJson(json['settings']); + }; + } toJSON() => { 'id': id, @@ -28,6 +115,7 @@ class User { 'username': username, 'created': created.toUtc().toIso8601String(), 'updated': updated.toUtc().toIso8601String(), + 'user_settings': settings?.toJson(), }; String avatarUrl(BuildContext context) { diff --git a/lib/pages/settings.dart b/lib/pages/settings.dart index e563028..143ea39 100644 --- a/lib/pages/settings.dart +++ b/lib/pages/settings.dart @@ -6,6 +6,7 @@ import 'package:vikunja_app/models/list.dart'; import '../main.dart'; import '../models/project.dart'; +import '../models/user.dart'; import '../service/services.dart'; @@ -23,6 +24,7 @@ class SettingsPageState extends State { late TextEditingController durationTextController; bool initialized = false; FlutterThemeMode? themeMode; + User? currentUser; void init() { @@ -33,9 +35,9 @@ class SettingsPageState extends State { .getAll() .then((value) => setState(() => projectList = value)); - VikunjaGlobal.of(context).projectService.getDefaultList().then((value) => - setState( - () => defaultProject = value == null ? null : int.tryParse(value))); + //VikunjaGlobal.of(context).projectService.getDefaultList().then((value) => + // setState( + // () => defaultProject = value == null ? null : int.tryParse(value))); VikunjaGlobal.of(context).settingsManager.getIgnoreCertificates().then( (value) => @@ -57,12 +59,20 @@ class SettingsPageState extends State { VikunjaGlobal.of(context).settingsManager.getThemeMode().then((value) => setState(() => themeMode = value)); + VikunjaGlobal.of(context).newUserService?.getCurrentUser().then((value) => { + setState(() { + currentUser = value!; + defaultProject = value.settings?.default_project_id; + } ), + }); + + initialized = true; } @override Widget build(BuildContext context) { - final currentUser = VikunjaGlobal.of(context).currentUser; + final global = VikunjaGlobal.of(context); if (!initialized) init(); return new Scaffold( @@ -71,12 +81,12 @@ class SettingsPageState extends State { body: ListView( children: [ UserAccountsDrawerHeader( - accountName: currentUser != null ? Text(currentUser.username) : null, - accountEmail: currentUser != null ? Text(currentUser.name) : null, + accountName: currentUser != null ? Text(currentUser!.username) : null, + accountEmail: currentUser != null ? Text(currentUser!.name) : null, currentAccountPicture: currentUser == null ? null : CircleAvatar( - backgroundImage: NetworkImage(currentUser.avatarUrl(context)), + backgroundImage: (currentUser?.username != "") ? NetworkImage(currentUser!.avatarUrl(context)) : null, ), decoration: BoxDecoration( image: DecorationImage( @@ -103,9 +113,9 @@ class SettingsPageState extends State { value: defaultProject, onChanged: (int? value) { setState(() => defaultProject = value); - VikunjaGlobal.of(context) - .listService - .setDefaultList(value); + global.newUserService?.setCurrentUserSettings( + currentUser!.settings!.copyWith(default_project_id: value)).then((value) => currentUser!.settings = value); + //VikunjaGlobal.of(context).userManager.setDefaultList(value); }, ), ) diff --git a/lib/service/mocked_services.dart b/lib/service/mocked_services.dart index 273f872..6a55818 100644 --- a/lib/service/mocked_services.dart +++ b/lib/service/mocked_services.dart @@ -212,5 +212,11 @@ class MockedUserService implements UserService { return Future.value(_users[1]); } + @override + Future setCurrentUserSettings(UserSettings userSettings) { + // TODO: implement setCurrentUserSettings + throw UnimplementedError(); + } + } diff --git a/lib/service/services.dart b/lib/service/services.dart index 9eb2d41..afa8829 100644 --- a/lib/service/services.dart +++ b/lib/service/services.dart @@ -191,7 +191,7 @@ abstract class ListService { Future getDefaultList(); - void setDefaultList(int? listId); + //void setDefaultList(int? listId); } abstract class TaskService { @@ -235,6 +235,7 @@ abstract class UserService { Future register(String username, email, password); Future getCurrentUser(); + Future setCurrentUserSettings(UserSettings userSettings); } abstract class LabelService {