cyberhybridhub/lib/widgets/profile_session.dart
2026-05-20 10:22:58 -05:00

80 lines
2.2 KiB
Dart

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 '../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<ProfileSession> createState() => _ProfileSessionState();
}
class _ProfileSessionState extends State<ProfileSession> {
late final Future<void> _sessionReady;
ProfileSyncStatus _syncStatus = ProfileSyncStatus.idle;
StreamSubscription<ProfileSyncStatus>? _syncStatusSubscription;
@override
void initState() {
super.initState();
_sessionReady = UserProfileRepository.instance.startSession(widget.user);
_syncStatusSubscription =
UserProfileRepository.instance.syncStatusStream.listen((
ProfileSyncStatus status,
) {
if (mounted) {
setState(() => _syncStatus = status);
}
});
}
@override
void dispose() {
_syncStatusSubscription?.cancel();
UserProfileRepository.instance.endSession();
super.dispose();
}
@override
Widget build(BuildContext context) {
return FutureBuilder<void>(
future: _sessionReady,
builder: (BuildContext context, AsyncSnapshot<void> sessionSnap) {
if (sessionSnap.connectionState != ConnectionState.done) {
return const Scaffold(
body: Center(
child: CircularProgressIndicator(color: AppColors.accent),
),
);
}
return StreamBuilder<UserProfile?>(
stream: UserProfileRepository.instance.profileStream,
initialData: UserProfileRepository.instance.currentProfile,
builder: (BuildContext context, AsyncSnapshot<UserProfile?> snap) {
return widget.builder(context, snap.data, _syncStatus);
},
);
},
);
}
}