feat: deploy infrastructure + disk/drive, calendar, presentation, workspaces, onboarding, demo user
This commit is contained in:
@@ -0,0 +1,83 @@
|
||||
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));
|
||||
});
|
||||
Reference in New Issue
Block a user