import 'dart:convert'; import 'package:flutter/widgets.dart'; import 'package:freezed_annotation/freezed_annotation.dart'; import 'package:island/pods/config.dart'; import 'package:island/widgets/tour/techincal_review_intro.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; part 'tour.g.dart'; part 'tour.freezed.dart'; const kAppTourStatusKey = "app_tour_statuses"; const List kAllTours = [ Tour(id: 'technical_review_intro', isStartup: true), ]; @freezed abstract class Tour with _$Tour { const Tour._(); const factory Tour({required String id, required bool isStartup}) = _Tour; Widget get widget => switch (id) { 'technical_review_intro' => const TechicalReviewIntroWidget(), _ => throw UnimplementedError(), }; } @riverpod class TourStatusNotifier extends _$TourStatusNotifier { @override Map build() { final prefs = ref.watch(sharedPreferencesProvider); final storedJson = prefs.getString(kAppTourStatusKey); if (storedJson != null) { try { final Map stored = jsonDecode(storedJson); return Map.from(stored); } catch (_) { return {for (final id in kAllTours.map((e) => e.id)) id: false}; } } return {for (final id in kAllTours.map((e) => e.id)) id: false}; } bool isTourShown(String tourId) => state[tourId] ?? false; Future _saveState(Map newState) async { state = newState; final prefs = ref.read(sharedPreferencesProvider); await prefs.setString(kAppTourStatusKey, jsonEncode(newState)); } Future showTour(String tourId) async { if (!isTourShown(tourId) || true) { final newState = {...state, tourId: true}; await _saveState(newState); return kAllTours.firstWhere((e) => e.id == tourId).widget; } return null; } Future resetTours() async { final newState = {for (final id in kAllTours.map((e) => e.id)) id: false}; await _saveState(newState); } }