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() {
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: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 {
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) {

View File

@ -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<SettingsPage> {
late TextEditingController durationTextController;
bool initialized = false;
FlutterThemeMode? themeMode;
User? currentUser;
void init() {
@ -33,9 +35,9 @@ class SettingsPageState extends State<SettingsPage> {
.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<SettingsPage> {
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<SettingsPage> {
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<SettingsPage> {
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);
},
),
)

View File

@ -212,5 +212,11 @@ class MockedUserService implements UserService {
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();
void setDefaultList(int? listId);
//void setDefaultList(int? listId);
}
abstract class TaskService {
@ -235,6 +235,7 @@ abstract class UserService {
Future<UserTokenPair?> register(String username, email, password);
Future<User?> getCurrentUser();
Future<UserSettings?> setCurrentUserSettings(UserSettings userSettings);
}
abstract class LabelService {