import 'dart:async'; import 'package:flutter/material.dart'; import '../models/app_user.dart'; import '../models/sync_result.dart'; import '../models/user_profile.dart'; import '../repositories/user_profile_repository.dart'; import '../services/questions_hub_service.dart'; import '../theme/app_theme.dart'; /// Starts a profile sync session for [user] and exposes profile + sync state. class ProfileSession extends StatefulWidget { const ProfileSession({ super.key, required this.user, required this.builder, }); final AppUser user; final Widget Function( BuildContext context, UserProfile? profile, ProfileSyncStatus syncStatus, ) builder; @override State createState() => _ProfileSessionState(); } class _ProfileSessionState extends State { late final Future _sessionReady; ProfileSyncStatus _syncStatus = ProfileSyncStatus.idle; StreamSubscription? _syncStatusSubscription; @override void initState() { super.initState(); _sessionReady = UserProfileRepository.instance.startSession(widget.user) ..then((_) => QuestionsHubService.instance.onLogin()); _syncStatusSubscription = UserProfileRepository.instance.syncStatusStream.listen(( ProfileSyncStatus status, ) { if (mounted) { setState(() => _syncStatus = status); } }); } @override void dispose() { _syncStatusSubscription?.cancel(); QuestionsHubService.instance.clearGuessScoreCache(); unawaited(QuestionsHubService.instance.disconnect()); UserProfileRepository.instance.endSession(); super.dispose(); } @override Widget build(BuildContext context) { return FutureBuilder( future: _sessionReady, builder: (BuildContext context, AsyncSnapshot sessionSnap) { if (sessionSnap.connectionState != ConnectionState.done) { return const Scaffold( body: Center( child: CircularProgressIndicator(color: AppColors.accent), ), ); } return StreamBuilder( stream: UserProfileRepository.instance.profileStream, initialData: UserProfileRepository.instance.currentProfile, builder: (BuildContext context, AsyncSnapshot snap) { return widget.builder(context, snap.data, _syncStatus); }, ); }, ); } }