import 'dart:async'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:dio/dio.dart'; import '../../../core/network/dio_client.dart'; import '../domain/credit_note.dart'; import 'invoices_provider.dart'; class CreditNotesNotifier extends AsyncNotifier> { @override FutureOr> build() async { return _fetchCreditNotes(); } Future> _fetchCreditNotes() async { try { final response = await DioClient().dio.get('/credit-notes'); if (response.statusCode == 200) { final List data = response.data; return data.map((e) => CreditNote.fromJson(e)).toList(); } return []; } catch (e) { return []; } } Future refresh() async { state = const AsyncValue.loading(); try { final creditNotes = await _fetchCreditNotes(); state = AsyncValue.data(creditNotes); } catch (e, stack) { state = AsyncValue.error(e, stack); } } Future createCreditNote(int invoiceId, CreditNote creditNote) async { try { final response = await DioClient().dio.post( '/invoices/$invoiceId/credit-notes', data: creditNote.toJson(), ); await refresh(); ref.refresh(invoicesProvider); if (response.data != null) { return CreditNote.fromJson(response.data); } return null; } catch (e) { if (e is DioException) { throw Exception( 'Failed to process return: ${e.response?.statusCode} - ${e.response?.data}', ); } throw Exception('Failed to process return: $e'); } } } final creditNotesProvider = AsyncNotifierProvider>(CreditNotesNotifier.new); final invoiceCreditNotesProvider = FutureProvider.family, int>((ref, invoiceId) async { try { final response = await DioClient().dio.get('/invoices/$invoiceId/credit-notes'); if (response.statusCode == 200) { final List data = response.data; return data.map((e) => CreditNote.fromJson(e)).toList(); } return []; } catch (e) { return []; } });