76 lines
2.1 KiB
Dart
76 lines
2.1 KiB
Dart
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<List<CreditNote>> {
|
|
@override
|
|
FutureOr<List<CreditNote>> build() async {
|
|
return _fetchCreditNotes();
|
|
}
|
|
|
|
Future<List<CreditNote>> _fetchCreditNotes() async {
|
|
try {
|
|
final response = await DioClient().dio.get('/credit-notes');
|
|
if (response.statusCode == 200) {
|
|
final List<dynamic> data = response.data;
|
|
return data.map((e) => CreditNote.fromJson(e)).toList();
|
|
}
|
|
return [];
|
|
} catch (e) {
|
|
return [];
|
|
}
|
|
}
|
|
|
|
Future<void> refresh() async {
|
|
state = const AsyncValue.loading();
|
|
try {
|
|
final creditNotes = await _fetchCreditNotes();
|
|
state = AsyncValue.data(creditNotes);
|
|
} catch (e, stack) {
|
|
state = AsyncValue.error(e, stack);
|
|
}
|
|
}
|
|
|
|
Future<CreditNote?> 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, List<CreditNote>>(CreditNotesNotifier.new);
|
|
|
|
final invoiceCreditNotesProvider =
|
|
FutureProvider.family<List<CreditNote>, int>((ref, invoiceId) async {
|
|
try {
|
|
final response = await DioClient().dio.get('/invoices/$invoiceId/credit-notes');
|
|
if (response.statusCode == 200) {
|
|
final List<dynamic> data = response.data;
|
|
return data.map((e) => CreditNote.fromJson(e)).toList();
|
|
}
|
|
return [];
|
|
} catch (e) {
|
|
return [];
|
|
}
|
|
});
|