load default project from server

This commit is contained in:
Benimautner 2023-12-23 22:38:16 +01:00
parent 045bc6f668
commit 2b505ceaf4
5 changed files with 125 additions and 12 deletions

View File

@ -44,4 +44,12 @@ class UserAPIService extends APIService implements UserService {
Future<User> getCurrentUser() { Future<User> getCurrentUser() {
return client.get('/user').then((map) => User.fromJson(map?.body)); return client.get('/user').then((map) => User.fromJson(map?.body));
} }
@override
Future<UserSettings?> setCurrentUserSettings(UserSettings userSettings) async {
return client.post('/user/settings/general', body: userSettings.toJson()).then((response) {
if(response == null) return null;
return userSettings;
});
}
} }

View File

@ -1,10 +1,92 @@
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:vikunja_app/global.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<String, dynamic>? 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<String, dynamic> 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<String, dynamic>? 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 { class User {
final int id; final int id;
final String name, username; final String name, username;
final DateTime created, updated; final DateTime created, updated;
UserSettings? settings;
User({ User({
this.id = 0, this.id = 0,
@ -12,6 +94,7 @@ class User {
required this.username, required this.username,
DateTime? created, DateTime? created,
DateTime? updated, DateTime? updated,
this.settings,
}) : this.created = created ?? DateTime.now(), }) : this.created = created ?? DateTime.now(),
this.updated = updated ?? DateTime.now(); this.updated = updated ?? DateTime.now();
@ -20,7 +103,11 @@ class User {
name = json.containsKey('name') ? json['name'] : '', name = json.containsKey('name') ? json['name'] : '',
username = json['username'], username = json['username'],
created = DateTime.parse(json['created']), 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() => { toJSON() => {
'id': id, 'id': id,
@ -28,6 +115,7 @@ class User {
'username': username, 'username': username,
'created': created.toUtc().toIso8601String(), 'created': created.toUtc().toIso8601String(),
'updated': updated.toUtc().toIso8601String(), 'updated': updated.toUtc().toIso8601String(),
'user_settings': settings?.toJson(),
}; };
String avatarUrl(BuildContext context) { String avatarUrl(BuildContext context) {

View File

@ -6,6 +6,7 @@ import 'package:vikunja_app/models/list.dart';
import '../main.dart'; import '../main.dart';
import '../models/project.dart'; import '../models/project.dart';
import '../models/user.dart';
import '../service/services.dart'; import '../service/services.dart';
@ -23,6 +24,7 @@ class SettingsPageState extends State<SettingsPage> {
late TextEditingController durationTextController; late TextEditingController durationTextController;
bool initialized = false; bool initialized = false;
FlutterThemeMode? themeMode; FlutterThemeMode? themeMode;
User? currentUser;
void init() { void init() {
@ -33,9 +35,9 @@ class SettingsPageState extends State<SettingsPage> {
.getAll() .getAll()
.then((value) => setState(() => projectList = value)); .then((value) => setState(() => projectList = value));
VikunjaGlobal.of(context).projectService.getDefaultList().then((value) => //VikunjaGlobal.of(context).projectService.getDefaultList().then((value) =>
setState( // setState(
() => defaultProject = value == null ? null : int.tryParse(value))); // () => defaultProject = value == null ? null : int.tryParse(value)));
VikunjaGlobal.of(context).settingsManager.getIgnoreCertificates().then( VikunjaGlobal.of(context).settingsManager.getIgnoreCertificates().then(
(value) => (value) =>
@ -57,12 +59,20 @@ class SettingsPageState extends State<SettingsPage> {
VikunjaGlobal.of(context).settingsManager.getThemeMode().then((value) => setState(() => themeMode = value)); 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; initialized = true;
} }
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final currentUser = VikunjaGlobal.of(context).currentUser; final global = VikunjaGlobal.of(context);
if (!initialized) init(); if (!initialized) init();
return new Scaffold( return new Scaffold(
@ -71,12 +81,12 @@ class SettingsPageState extends State<SettingsPage> {
body: ListView( body: ListView(
children: [ children: [
UserAccountsDrawerHeader( UserAccountsDrawerHeader(
accountName: currentUser != null ? Text(currentUser.username) : null, accountName: currentUser != null ? Text(currentUser!.username) : null,
accountEmail: currentUser != null ? Text(currentUser.name) : null, accountEmail: currentUser != null ? Text(currentUser!.name) : null,
currentAccountPicture: currentUser == null currentAccountPicture: currentUser == null
? null ? null
: CircleAvatar( : CircleAvatar(
backgroundImage: NetworkImage(currentUser.avatarUrl(context)), backgroundImage: (currentUser?.username != "") ? NetworkImage(currentUser!.avatarUrl(context)) : null,
), ),
decoration: BoxDecoration( decoration: BoxDecoration(
image: DecorationImage( image: DecorationImage(
@ -103,9 +113,9 @@ class SettingsPageState extends State<SettingsPage> {
value: defaultProject, value: defaultProject,
onChanged: (int? value) { onChanged: (int? value) {
setState(() => defaultProject = value); setState(() => defaultProject = value);
VikunjaGlobal.of(context) global.newUserService?.setCurrentUserSettings(
.listService currentUser!.settings!.copyWith(default_project_id: value)).then((value) => currentUser!.settings = value);
.setDefaultList(value); //VikunjaGlobal.of(context).userManager.setDefaultList(value);
}, },
), ),
) )

View File

@ -212,5 +212,11 @@ class MockedUserService implements UserService {
return Future.value(_users[1]); return Future.value(_users[1]);
} }
@override
Future<UserSettings> setCurrentUserSettings(UserSettings userSettings) {
// TODO: implement setCurrentUserSettings
throw UnimplementedError();
}
} }

View File

@ -191,7 +191,7 @@ abstract class ListService {
Future<String?> getDefaultList(); Future<String?> getDefaultList();
void setDefaultList(int? listId); //void setDefaultList(int? listId);
} }
abstract class TaskService { abstract class TaskService {
@ -235,6 +235,7 @@ abstract class UserService {
Future<UserTokenPair?> register(String username, email, password); Future<UserTokenPair?> register(String username, email, password);
Future<User?> getCurrentUser(); Future<User?> getCurrentUser();
Future<UserSettings?> setCurrentUserSettings(UserSettings userSettings);
} }
abstract class LabelService { abstract class LabelService {