import 'package:flutter_riverpod/flutter_riverpod.dart'; import '../api/disk.dart'; import '../core/api/client.dart'; class DiskState { final List availableProviders; final List> connectedProviders; final bool isLoading; final String? error; DiskState({ this.availableProviders = const [], this.connectedProviders = const [], this.isLoading = false, this.error, }); DiskState copyWith({ List? availableProviders, List>? connectedProviders, bool? isLoading, String? error, }) => DiskState( availableProviders: availableProviders ?? this.availableProviders, connectedProviders: connectedProviders ?? this.connectedProviders, isLoading: isLoading ?? this.isLoading, error: error, ); bool isConnected(String provider) => connectedProviders.any((p) => p['provider'] == provider); } class DiskNotifier extends StateNotifier { final DiskApi _api; DiskNotifier(this._api) : super(DiskState()); Future load() async { state = state.copyWith(isLoading: true, error: null); try { final providers = await _api.getProviders(); final status = await _api.getStatus(); final connected = (status['connected'] as List? ?? []) .map((e) => e as Map) .toList(); state = state.copyWith( availableProviders: providers, connectedProviders: connected, isLoading: false, ); } catch (e) { state = state.copyWith(isLoading: false, error: e.toString()); } } Future connect(String provider, String code) async { final ok = await _api.connect(provider, code); if (ok) await load(); return ok; } Future disconnect(String provider) async { final ok = await _api.disconnect(provider); if (ok) { state = state.copyWith( connectedProviders: state.connectedProviders .where((p) => p['provider'] != provider) .toList(), ); } return ok; } Future getOAuthUrl(String provider) => _api.getOAuthUrl(provider); } final diskProvider = StateNotifierProvider((ref) { final api = ref.read(apiClientProvider); return DiskNotifier(DiskApi(api)); });