82 lines
2.4 KiB
Dart
82 lines
2.4 KiB
Dart
import 'dart:convert';
|
|
|
|
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
|
|
|
import '../models/rotation_config.dart';
|
|
import 'supabase_provider.dart';
|
|
|
|
/// Key used to store the rotation configuration in `app_settings`.
|
|
const _settingsKey = 'rotation_config';
|
|
|
|
/// Provides the current [RotationConfig] from `app_settings`.
|
|
final rotationConfigProvider = FutureProvider<RotationConfig>((ref) async {
|
|
final client = ref.watch(supabaseClientProvider);
|
|
final row = await client
|
|
.from('app_settings')
|
|
.select()
|
|
.eq('key', _settingsKey)
|
|
.maybeSingle();
|
|
if (row == null) return RotationConfig();
|
|
final value = row['value'];
|
|
if (value is Map<String, dynamic>) {
|
|
return RotationConfig.fromJson(value);
|
|
}
|
|
if (value is String) {
|
|
return RotationConfig.fromJson(jsonDecode(value) as Map<String, dynamic>);
|
|
}
|
|
return RotationConfig();
|
|
});
|
|
|
|
/// Controller for persisting [RotationConfig] changes.
|
|
final rotationConfigControllerProvider = Provider<RotationConfigController>((
|
|
ref,
|
|
) {
|
|
final client = ref.watch(supabaseClientProvider);
|
|
return RotationConfigController(client, ref);
|
|
});
|
|
|
|
class RotationConfigController {
|
|
RotationConfigController(this._client, this._ref);
|
|
|
|
final dynamic _client;
|
|
final Ref _ref;
|
|
|
|
Future<void> save(RotationConfig config) async {
|
|
await _client.from('app_settings').upsert({
|
|
'key': _settingsKey,
|
|
'value': config.toJson(),
|
|
});
|
|
_ref.invalidate(rotationConfigProvider);
|
|
}
|
|
|
|
Future<void> updateShiftTypes(List<ShiftTypeConfig> shiftTypes) async {
|
|
final config = await _ref.read(rotationConfigProvider.future);
|
|
await save(config.copyWith(shiftTypes: shiftTypes));
|
|
}
|
|
|
|
Future<void> updateRoleWeeklyHours(Map<String, int> roleWeeklyHours) async {
|
|
final config = await _ref.read(rotationConfigProvider.future);
|
|
await save(config.copyWith(roleWeeklyHours: roleWeeklyHours));
|
|
}
|
|
|
|
Future<void> updateHolidays(List<Holiday> holidays) async {
|
|
final config = await _ref.read(rotationConfigProvider.future);
|
|
await save(config.copyWith(holidays: holidays));
|
|
}
|
|
|
|
Future<void> setHolidaySync({
|
|
required bool enabled,
|
|
required int year,
|
|
required List<Holiday> holidays,
|
|
}) async {
|
|
final config = await _ref.read(rotationConfigProvider.future);
|
|
await save(
|
|
config.copyWith(
|
|
syncPhilippinesHolidays: enabled,
|
|
holidaysYear: year,
|
|
holidays: holidays,
|
|
),
|
|
);
|
|
}
|
|
}
|