import 'package:flutter_riverpod/flutter_riverpod.dart'; import '../core/api/client.dart'; import '../core/api/endpoints.dart'; import '../core/api/exceptions.dart'; import '../models/workspace.dart'; class WorkspaceState { final List workspaces; final Workspace? selectedWorkspace; final List members; final bool isLoading; final String? error; WorkspaceState({ this.workspaces = const [], this.selectedWorkspace, this.members = const [], this.isLoading = false, this.error, }); WorkspaceState copyWith({ List? workspaces, Workspace? selectedWorkspace, List? members, bool? isLoading, String? error, }) => WorkspaceState( workspaces: workspaces ?? this.workspaces, selectedWorkspace: selectedWorkspace ?? this.selectedWorkspace, members: members ?? this.members, isLoading: isLoading ?? this.isLoading, error: error, ); } class WorkspaceNotifier extends StateNotifier { final ApiClient _api; WorkspaceNotifier(this._api) : super(WorkspaceState()); Future loadWorkspaces() async { state = state.copyWith(isLoading: true, error: null); try { final response = await _api.get(Endpoints.workspaces); final list = (response.data as List) .map((e) => Workspace.fromJson(e as Map)) .toList(); state = state.copyWith(workspaces: list, isLoading: false); } on ApiException catch (e) { state = state.copyWith(isLoading: false, error: e.message); } } Future createWorkspace(CreateWorkspaceRequest request) async { try { final response = await _api.post(Endpoints.workspaces, data: request.toJson()); final ws = Workspace.fromJson(response.data as Map); state = state.copyWith(workspaces: [...state.workspaces, ws]); return ws; } on ApiException catch (e) { state = state.copyWith(error: e.message); return null; } } Future selectWorkspace(Workspace workspace) async { state = state.copyWith(selectedWorkspace: workspace); await loadMembers(workspace.id); } Future loadMembers(String workspaceId) async { try { final response = await _api.get(Endpoints.workspaceMembers(workspaceId)); final list = (response.data as List) .map((e) => WorkspaceMember.fromJson(e as Map)) .toList(); state = state.copyWith(members: list); } on ApiException catch (e) { state = state.copyWith(error: e.message); } } Future addMember(String workspaceId, String email, String role) async { try { await _api.post(Endpoints.workspaceMembers(workspaceId), data: { 'email': email, 'role': role, }); await loadMembers(workspaceId); return true; } on ApiException catch (e) { state = state.copyWith(error: e.message); return false; } } Future removeMember(String workspaceId, String userId) async { try { await _api.delete(Endpoints.workspaceMember(workspaceId, userId)); state = state.copyWith( members: state.members.where((m) => m.userId != userId).toList(), ); return true; } on ApiException catch (e) { state = state.copyWith(error: e.message); return false; } } void clearError() { state = state.copyWith(error: null); } } final workspaceProvider = StateNotifierProvider((ref) { final api = ref.read(apiClientProvider); return WorkspaceNotifier(api); });