import 'dart:async'; import 'package:flutter/foundation.dart'; import 'package:supabase_flutter/supabase_flutter.dart'; import 'api.dart'; enum SessionState { checking, signedOut, admin } /// Who is signed in. Only admin accounts get past the sign-in page: anyone else is /// signed straight out again (the database refuses their changes either way). class AdminSession extends ChangeNotifier { AdminSession._(); static final instance = AdminSession._(); SessionState state = SessionState.checking; String? email; /// Shown on the sign-in page after a non-admin account tried to sign in. String? refusal; StreamSubscription? _sub; void start() { _sub ??= Supabase.instance.client.auth.onAuthStateChange.listen((e) => _check(e.session)); _check(Supabase.instance.client.auth.currentSession); } Future _check(Session? session) async { if (session == null) { _set(SessionState.signedOut, null); return; } if (state == SessionState.admin && email == session.user.email) return; try { if (await AdminApi.isAdmin()) { refusal = null; _set(SessionState.admin, session.user.email); return; } refusal = '${session.user.email} is not an admin account.'; } catch (e) { refusal = 'Could not check your account: $e'; } await AdminApi.signOut(); _set(SessionState.signedOut, null); } void _set(SessionState s, String? e) { if (s == state && e == email) return; state = s; email = e; notifyListeners(); } }