68 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
			
		
		
	
	
			68 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
| import 'dart:convert';
 | |
| 
 | |
| import 'package:flutter/widgets.dart';
 | |
| import 'package:freezed_annotation/freezed_annotation.dart';
 | |
| import 'package:island/pods/config.dart';
 | |
| import 'package:riverpod_annotation/riverpod_annotation.dart';
 | |
| 
 | |
| part 'tour.g.dart';
 | |
| part 'tour.freezed.dart';
 | |
| 
 | |
| const kAppTourStatusKey = "app_tour_statuses";
 | |
| 
 | |
| const List<Tour> kAllTours = [
 | |
|   // Tour(id: 'technical_review_intro', isStartup: true),
 | |
| ];
 | |
| 
 | |
| @freezed
 | |
| sealed 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<String, bool> build() {
 | |
|     final prefs = ref.watch(sharedPreferencesProvider);
 | |
|     final storedJson = prefs.getString(kAppTourStatusKey);
 | |
|     if (storedJson != null) {
 | |
|       try {
 | |
|         final Map<String, dynamic> stored = jsonDecode(storedJson);
 | |
|         return Map<String, bool>.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<void> _saveState(Map<String, bool> newState) async {
 | |
|     state = newState;
 | |
|     final prefs = ref.read(sharedPreferencesProvider);
 | |
|     await prefs.setString(kAppTourStatusKey, jsonEncode(newState));
 | |
|   }
 | |
| 
 | |
|   Future<Widget?> showTour(String tourId) async {
 | |
|     if (!isTourShown(tourId)) {
 | |
|       final newState = {...state, tourId: true};
 | |
|       await _saveState(newState);
 | |
|       return kAllTours.firstWhere((e) => e.id == tourId).widget;
 | |
|     }
 | |
|     return null;
 | |
|   }
 | |
| 
 | |
|   Future<void> resetTours() async {
 | |
|     final newState = {for (final id in kAllTours.map((e) => e.id)) id: false};
 | |
|     await _saveState(newState);
 | |
|   }
 | |
| }
 |