Files

84 lines
2.3 KiB
Dart

import 'package:flutter_riverpod/flutter_riverpod.dart';
import '../api/disk.dart';
import '../core/api/client.dart';
class DiskState {
final List<String> availableProviders;
final List<Map<String, dynamic>> connectedProviders;
final bool isLoading;
final String? error;
DiskState({
this.availableProviders = const [],
this.connectedProviders = const [],
this.isLoading = false,
this.error,
});
DiskState copyWith({
List<String>? availableProviders,
List<Map<String, dynamic>>? 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<DiskState> {
final DiskApi _api;
DiskNotifier(this._api) : super(DiskState());
Future<void> 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<dynamic>? ?? [])
.map((e) => e as Map<String, dynamic>)
.toList();
state = state.copyWith(
availableProviders: providers,
connectedProviders: connected,
isLoading: false,
);
} catch (e) {
state = state.copyWith(isLoading: false, error: e.toString());
}
}
Future<bool> connect(String provider, String code) async {
final ok = await _api.connect(provider, code);
if (ok) await load();
return ok;
}
Future<bool> 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<String?> getOAuthUrl(String provider) =>
_api.getOAuthUrl(provider);
}
final diskProvider = StateNotifierProvider<DiskNotifier, DiskState>((ref) {
final api = ref.read(apiClientProvider);
return DiskNotifier(DiskApi(api));
});