functional datastructure. Needs to be able to write to storage as well
Some checks failed
Build and push docker image / Build (pull_request) Failing after 3m5s
Build and release APK / Build APK (pull_request) Successful in 7m24s
Build web / Build Web (pull_request) Successful in 3m36s

This commit is contained in:
2024-06-21 19:30:40 +02:00
parent 9a5ae95d97
commit db41528702
18 changed files with 346 additions and 210 deletions

View File

@@ -1,56 +1,69 @@
class Landmark {
final String name;
final List location;
final LandmarkType type;
final String imageURL;
// final String description;
// final Duration duration;
// final bool visited;
import 'dart:collection';
import 'dart:convert';
const Landmark({
import 'package:shared_preferences/shared_preferences.dart';
final class Landmark extends LinkedListEntry<Landmark>{
// A linked node of a list of Landmarks
final String uuid;
final String name;
final List<double> location;
final LandmarkType type;
final bool? isSecondary;
// description to be shown in the overview
final String? imageURL;
final String? description;
final Duration? duration;
final bool? visited;
// Next node
// final Landmark? next;
final Duration? tripTime;
Landmark({
required this.uuid,
required this.name,
required this.location,
required this.type,
this.imageURL = 'https://upload.wikimedia.org/wikipedia/commons/thumb/a/a8/Tour_Eiffel_Wikimedia_Commons.jpg/1037px-Tour_Eiffel_Wikimedia_Commons.jpg',
// required this.description,
// required this.duration,
// required this.visited,
this.isSecondary,
this.imageURL,
this.description,
this.duration,
this.visited,
// this.next,
this.tripTime,
});
factory Landmark.fromJson(Map<String, dynamic> json) {
return switch (json) {
{
'loc': List location,
if (json
case { // automatically match all the non-optionals and cast them to the right type
'uuid': String uuid,
'name': String name,
'type': String type,
// 'description': String description,
// 'duration': int duration,
// 'visited': bool visited
} =>
Landmark(
name: name,
location: location,
type: LandmarkType(name: type)
// description: description,
// duration: Duration(minutes: duration),
// visited: visited
),
_ => throw const FormatException('Failed to load destination.'),
};
'location': List<double> location,
'type': LandmarkType type,
}) {
// parse the rest separately, they could be missing
final isSecondary = json['is_secondary'] as bool?;
final imageURL = json['image_url'] as String?;
final description = json['description'] as String?;
final duration = json['duration'] as Duration?;
final visited = json['visited'] as bool?;
return Landmark(
uuid: uuid, name: name, location: location, type: type, isSecondary: isSecondary, imageURL: imageURL, description: description, duration: duration, visited: visited);
} else {
throw FormatException('Invalid JSON: $json');
}
}
Map<String, dynamic> toJson() {
return {
'name': name,
'location': location,
'type': type.name,
// 'description': description,
// 'duration': duration.inMinutes,
// 'visited': visited
};
}
@override
bool operator ==(Object other) {
return other is Landmark && uuid == other.uuid;
}
}
@@ -67,3 +80,12 @@ class LandmarkType {
}
// Helper
(Landmark, String?) getLandmarkFromPrefs(SharedPreferences prefs, String uuid) {
String? content = prefs.getString('landmark_$uuid');
Map<String, dynamic> json = jsonDecode(content!);
String? nextUUID = json['next_uuid'];
return (Landmark.fromJson(json), nextUUID);
}