import 'package:flutter/cupertino.dart'; import 'package:please_pay_me/core/config/app_config.dart'; import 'package:please_pay_me/core/storage/session_storage.dart'; import 'package:please_pay_me/data/demo/demo_backend.dart'; import 'package:please_pay_me/features/auth/session_controller.dart'; import 'package:please_pay_me/features/budgets/budgets_controller.dart'; import 'package:please_pay_me/features/journal/journal_controller.dart'; import 'package:please_pay_me/features/work/jobs_controller.dart'; import 'package:please_pay_me/theme/theme.dart'; import 'package:provider/provider.dart'; /// Wires real app screens to the in-memory [DemoBackend] so the catalog shows /// production widgets with production state management. class DemoScope extends StatefulWidget { const DemoScope({super.key, required this.child, this.seeded = true}); final Widget child; /// `false` renders the empty states (no budgets / jobs / operations). final bool seeded; @override State createState() => _DemoScopeState(); } class _DemoScopeState extends State { late DemoBackend _backend; late SessionController _session; @override void initState() { super.initState(); _build(); } @override void didUpdateWidget(DemoScope oldWidget) { super.didUpdateWidget(oldWidget); if (oldWidget.seeded != widget.seeded) _build(); } void _build() { _backend = widget.seeded ? DemoBackend() : DemoBackend.empty(); _session = SessionController( config: AppConfig.demo, storage: InMemorySessionStorage(), demoBackend: _backend, )..startDemo(); } @override Widget build(BuildContext context) { return MultiProvider( key: ValueKey(widget.seeded), providers: [ ChangeNotifierProvider.value(value: _session), ChangeNotifierProvider( create: (_) => ThemeController(store: MemoryThemeStore()), ), ChangeNotifierProvider( create: (_) => BudgetsController( budgets: _backend.budgets, expenses: _backend.expenses, )..load(), ), ChangeNotifierProvider( create: (_) => JournalController(expenses: _backend.expenses)..load(), ), ChangeNotifierProvider( create: (_) => JobsController(jobs: _backend.jobs)..load(), ), ], child: widget.child, ); } }