82 lines
2.4 KiB
Dart
82 lines
2.4 KiB
Dart
import 'dart:convert';
|
|
import 'dart:math';
|
|
|
|
import 'package:shared_preferences/shared_preferences.dart';
|
|
|
|
/// Device-local bookmarks for public (unauthenticated) app usage.
|
|
class LocalBookmarksService {
|
|
static const _storageKey = 'local_bookmarks';
|
|
static const _deviceIdKey = 'device_id';
|
|
|
|
static Future<String> deviceId() async {
|
|
final prefs = await SharedPreferences.getInstance();
|
|
var id = prefs.getString(_deviceIdKey);
|
|
if (id == null || id.isEmpty) {
|
|
id = '${DateTime.now().millisecondsSinceEpoch}_${Random().nextInt(1 << 32)}';
|
|
await prefs.setString(_deviceIdKey, id);
|
|
}
|
|
return id;
|
|
}
|
|
|
|
static Future<List<Map<String, dynamic>>> getAll() async {
|
|
final prefs = await SharedPreferences.getInstance();
|
|
final raw = prefs.getString(_storageKey);
|
|
if (raw == null || raw.isEmpty) return [];
|
|
final decoded = jsonDecode(raw);
|
|
if (decoded is! List) return [];
|
|
return decoded
|
|
.map((e) => Map<String, dynamic>.from(e as Map))
|
|
.toList();
|
|
}
|
|
|
|
static Future<void> _saveAll(List<Map<String, dynamic>> bookmarks) async {
|
|
final prefs = await SharedPreferences.getInstance();
|
|
await prefs.setString(_storageKey, jsonEncode(bookmarks));
|
|
}
|
|
|
|
static Future<Map<String, dynamic>?> findByDataset(String dataset) async {
|
|
final bookmarks = await getAll();
|
|
for (final b in bookmarks) {
|
|
if (b['data_set'] == dataset || b['dataset'] == dataset) {
|
|
return b;
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
static Future<Map<String, dynamic>> add({
|
|
required String dataset,
|
|
required String bgColor,
|
|
required String mainTopic,
|
|
required String title,
|
|
required String keyParam,
|
|
}) async {
|
|
final bookmarks = await getAll();
|
|
final id = '${DateTime.now().millisecondsSinceEpoch}_${Random().nextInt(1 << 32)}';
|
|
final entry = {
|
|
'id': id,
|
|
'data_set': dataset,
|
|
'dataset': dataset,
|
|
'bgColor': bgColor,
|
|
'main_topic': mainTopic,
|
|
'mainTopic': mainTopic,
|
|
'data_set_tile_heading': title,
|
|
'title': title,
|
|
'keyParam': keyParam,
|
|
'created': DateTime.now().toIso8601String(),
|
|
};
|
|
bookmarks.removeWhere(
|
|
(b) => b['data_set'] == dataset || b['dataset'] == dataset,
|
|
);
|
|
bookmarks.add(entry);
|
|
await _saveAll(bookmarks);
|
|
return entry;
|
|
}
|
|
|
|
static Future<void> remove(String id) async {
|
|
final bookmarks = await getAll();
|
|
bookmarks.removeWhere((b) => b['id'] == id);
|
|
await _saveAll(bookmarks);
|
|
}
|
|
}
|