import 'dart:convert'; import 'dart:io'; import 'package:training_planner/services/ishift_provider_service.dart'; import 'package:training_planner/shift.dart'; import 'package:uuid/uuid.dart'; import 'package:in_date_utils/in_date_utils.dart' as DateUtilities; import 'package:path_provider/path_provider.dart'; class LocalShiftProviderService extends IProgramProviderService { LocalShiftProviderService() { writeShiftsFromFile([]); } Future get _localPath async { final directory = await getApplicationDocumentsDirectory(); return directory.path; } Future get _localFile async { final path = await _localPath; return File('$path/shifts.json'); } Future writeShiftsFromFile(List shifts) async { try { final file = await _localFile; String content = jsonEncode(shifts); await file.writeAsString(content); print('Writing to file: ' + content); } catch (e, stacktrace) { print(stacktrace); print(e); } } Future> readShiftsFromFile() async { try { final file = await _localFile; final contents = await file.readAsString(); final Iterable iterable = await jsonDecode(contents); List data = List.from(iterable.map((model) => Shift.fromJson(model))); print('Read from file: ' + contents); return data; } catch (e, stacktrace) { print(stacktrace); print(e); return []; } } @override Future updateShift(Shift shift) async { List savedShifts = await readShiftsFromFile(); for (var item in savedShifts) { if (DateUtilities.DateUtils.isSameDay(shift.start, item.start)) { item.isActive = shift.isActive; item.start = shift.start; item.end = shift.end; item.type = shift.type; break; } } await writeShiftsFromFile(savedShifts); } @override Future addShift(Shift shift) async { List savedShifts = await readShiftsFromFile(); for (var item in savedShifts) { if (DateUtilities.DateUtils.isSameDay(shift.start, item.start)) { return; } } savedShifts.add(shift); await writeShiftsFromFile(savedShifts); } @override Future> getPastShifts() async { List shifts = await readShiftsFromFile(); shifts.sort((a, b) => a.start.compareTo(b.start)); return shifts; } @override Future> getShiftsForWeek(DateTime firstDayOfWeek) async { var items = await getPastShifts(); List result = []; for (var item in items) { if (DateUtilities.DateUtils.firstDayOfWeek(item.start) == firstDayOfWeek) { result.add(item); } } return result; } @override Future deleteShift(Shift shift) async { List savedShifts = await readShiftsFromFile(); for (var item in savedShifts) { if (DateUtilities.DateUtils.isSameDay(shift.start, item.start)) { savedShifts.remove(item); break; } } await writeShiftsFromFile(savedShifts); } }