uaestats_fe/lib/infrastructure/services/local_bookmarks_service.dart
2026-05-25 18:01:41 +05:30

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);
}
}