✨ Tour and introduce
This commit is contained in:
68
lib/services/tour.dart
Normal file
68
lib/services/tour.dart
Normal file
@ -0,0 +1,68 @@
|
||||
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<Tour> 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<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) || true) {
|
||||
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);
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user