84 lines
2.3 KiB
Dart
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));
|
|
});
|