import 'dart:convert'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:flutter/foundation.dart'; import 'package:uuid/uuid.dart'; /// Persists the user's profile (nickname, tagline, interests) and ephemeral BLE /// token locally. No data is ever sent without explicit user consent (toggle). class SessionStore extends ChangeNotifier { static const _interestsKey = 'interests'; static const _tokenKey = 'ble_token'; static const _nameKey = 'profile_name'; static const _taglineKey = 'profile_tagline'; static const _profileDoneKey = 'profile_done'; List _interests = []; String _bleToken = ''; String _name = ''; String _tagline = ''; bool _profileDone = false; List get interests => List.unmodifiable(_interests); String get bleToken => _bleToken; String get name => _name; String get tagline => _tagline; /// True once the user has completed profile setup at least once. bool get hasProfile => _profileDone; /// Display name — falls back to "Anonym" if not set. String get displayName => _name.isNotEmpty ? _name : 'Anonym'; SessionStore() { _load(); } Future _load() async { final prefs = await SharedPreferences.getInstance(); _interests = prefs.getStringList(_interestsKey) ?? []; _bleToken = prefs.getString(_tokenKey) ?? _newToken(prefs); _name = prefs.getString(_nameKey) ?? ''; _tagline = prefs.getString(_taglineKey) ?? ''; _profileDone = prefs.getBool(_profileDoneKey) ?? false; notifyListeners(); } String _newToken(SharedPreferences prefs) { final token = const Uuid().v4(); prefs.setString(_tokenKey, token); return token; } /// Saves the full profile in one call. Marks profile as complete. Future saveProfile({ required String name, required String tagline, required List interests, }) async { final prefs = await SharedPreferences.getInstance(); await Future.wait([ prefs.setString(_nameKey, name), prefs.setString(_taglineKey, tagline), prefs.setStringList(_interestsKey, interests), prefs.setBool(_profileDoneKey, true), ]); _name = name; _tagline = tagline; _interests = interests; _profileDone = true; notifyListeners(); } /// Reset ephemeral identity — fresh BLE token, clears profile. Future reset() async { final prefs = await SharedPreferences.getInstance(); await Future.wait([ prefs.remove(_interestsKey), prefs.remove(_nameKey), prefs.remove(_taglineKey), prefs.remove(_profileDoneKey), ]); _interests = []; _name = ''; _tagline = ''; _profileDone = false; _bleToken = _newToken(prefs); notifyListeners(); } }