Implemented per stream subscription recovery with polling fallback
This commit is contained in:
@@ -6,6 +6,7 @@ import 'package:supabase_flutter/supabase_flutter.dart';
|
||||
import '../models/profile.dart';
|
||||
import 'auth_provider.dart';
|
||||
import 'supabase_provider.dart';
|
||||
import 'stream_recovery.dart';
|
||||
|
||||
final currentUserIdProvider = Provider<String?>((ref) {
|
||||
final authState = ref.watch(authStateChangesProvider);
|
||||
@@ -23,20 +24,43 @@ final currentProfileProvider = StreamProvider<Profile?>((ref) {
|
||||
return const Stream.empty();
|
||||
}
|
||||
final client = ref.watch(supabaseClientProvider);
|
||||
return client
|
||||
.from('profiles')
|
||||
.stream(primaryKey: ['id'])
|
||||
.eq('id', userId)
|
||||
.map((rows) => rows.isEmpty ? null : Profile.fromMap(rows.first));
|
||||
|
||||
final wrapper = StreamRecoveryWrapper<Profile?>(
|
||||
stream: client.from('profiles').stream(primaryKey: ['id']).eq('id', userId),
|
||||
onPollData: () async {
|
||||
final data = await client
|
||||
.from('profiles')
|
||||
.select()
|
||||
.eq('id', userId)
|
||||
.maybeSingle();
|
||||
return data == null ? [] : [Profile.fromMap(data)];
|
||||
},
|
||||
fromMap: Profile.fromMap,
|
||||
);
|
||||
|
||||
ref.onDispose(wrapper.dispose);
|
||||
return wrapper.stream.map((result) {
|
||||
return result.data.isEmpty ? null : result.data.first;
|
||||
});
|
||||
});
|
||||
|
||||
final profilesProvider = StreamProvider<List<Profile>>((ref) {
|
||||
final client = ref.watch(supabaseClientProvider);
|
||||
return client
|
||||
.from('profiles')
|
||||
.stream(primaryKey: ['id'])
|
||||
.order('full_name')
|
||||
.map((rows) => rows.map(Profile.fromMap).toList());
|
||||
|
||||
final wrapper = StreamRecoveryWrapper<Profile>(
|
||||
stream: client
|
||||
.from('profiles')
|
||||
.stream(primaryKey: ['id'])
|
||||
.order('full_name'),
|
||||
onPollData: () async {
|
||||
final data = await client.from('profiles').select().order('full_name');
|
||||
return data.map(Profile.fromMap).toList();
|
||||
},
|
||||
fromMap: Profile.fromMap,
|
||||
);
|
||||
|
||||
ref.onDispose(wrapper.dispose);
|
||||
return wrapper.stream.map((result) => result.data);
|
||||
});
|
||||
|
||||
/// Controller for the current user's profile (update full name / password).
|
||||
|
||||
Reference in New Issue
Block a user