Files
kulakpos_app/lib/Screens/party ledger/provider.dart
2026-02-07 15:57:09 +07:00

190 lines
5.5 KiB
Dart

import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:mobile_pos/Screens/party%20ledger/repo/party_ledger_repo.dart';
import 'model/party_leder_filer_param.dart';
import 'model/party_ledger_model.dart';
// State Class
class LedgerState {
final List<PartyLedgerModel> transactions;
final bool isLoading;
final bool isLoadMoreRunning;
final int page;
final bool hasMoreData;
final String currentFilter;
LedgerState({
this.transactions = const [],
this.isLoading = true,
this.isLoadMoreRunning = false,
this.page = 1,
this.hasMoreData = true,
this.currentFilter = 'All',
});
LedgerState copyWith({
List<PartyLedgerModel>? transactions,
bool? isLoading,
bool? isLoadMoreRunning,
int? page,
bool? hasMoreData,
String? currentFilter,
}) {
return LedgerState(
transactions: transactions ?? this.transactions,
isLoading: isLoading ?? this.isLoading,
isLoadMoreRunning: isLoadMoreRunning ?? this.isLoadMoreRunning,
page: page ?? this.page,
hasMoreData: hasMoreData ?? this.hasMoreData,
currentFilter: currentFilter ?? this.currentFilter,
);
}
}
// Notifier
// class PartyLedgerNotifier extends StateNotifier<LedgerState> {
// final PartyLedgerRepo _repository = PartyLedgerRepo();
// final String partyId;
//
// PartyLedgerNotifier(this.partyId) : super(LedgerState()) {
// loadInitialData();
// }
//
// // 1. Load Initial Data (Page 1)
// Future<void> loadInitialData() async {
// try {
// state = state.copyWith(isLoading: true);
// final response = await _repository.getPartyLedger(partyId: partyId, page: 1, duration: state.currentFilter // Pass the filter
// );
//
// state = state.copyWith(
// transactions: response.data,
// isLoading: false,
// page: 1,
// hasMoreData: response.currentPage < response.lastPage,
// );
// } catch (e) {
// state = state.copyWith(isLoading: false, hasMoreData: false);
// print("Error loading ledger: $e");
// }
// }
//
// // 2. Load More (Infinite Scroll)
// Future<void> loadMore() async {
// if (state.isLoadMoreRunning || !state.hasMoreData) return;
//
// state = state.copyWith(isLoadMoreRunning: true);
//
// try {
// final nextPage = state.page + 1;
// final response = await _repository.getPartyLedger(partyId: partyId, page: nextPage, duration: state.currentFilter // Keep using current filter
// );
//
// state = state.copyWith(
// transactions: [...state.transactions, ...response.data],
// page: nextPage,
// isLoadMoreRunning: false,
// hasMoreData: response.currentPage < response.lastPage,
// );
// } catch (e) {
// state = state.copyWith(isLoadMoreRunning: false);
// }
// }
//
// // 3. Update Filter (Resets data)
// void updateFilter(String newFilter) {
// if (state.currentFilter == newFilter) return;
//
// // Reset state but keep the new filter
// state = LedgerState(currentFilter: newFilter, isLoading: true);
// loadInitialData(); // Reload with new filter
// }
// }
class PartyLedgerNotifier extends StateNotifier<LedgerState> {
final PartyLedgerRepo _repository = PartyLedgerRepo();
final String partyId;
PartyLedgerNotifier({
required this.partyId,
required String initialFilter,
}) : super(LedgerState(currentFilter: initialFilter)) {
loadInitialData();
}
// Load initial page (page 1)
Future<void> loadInitialData() async {
try {
state = state.copyWith(isLoading: true, page: 0, hasMoreData: true);
final response = await _repository.getPartyLedger(
partyId: partyId,
page: 1,
duration: state.currentFilter,
);
state = state.copyWith(
transactions: response.data,
isLoading: false,
page: 1,
hasMoreData: response.currentPage < response.lastPage,
);
} catch (e, st) {
print('Error loading ledger: $e\n$st');
state = state.copyWith(isLoading: false, hasMoreData: false);
}
}
// Load more for pagination
Future<void> loadMore() async {
if (state.isLoadMoreRunning || !state.hasMoreData) return;
state = state.copyWith(isLoadMoreRunning: true);
try {
final nextPage = state.page + 1;
final response = await _repository.getPartyLedger(
partyId: partyId,
page: nextPage,
duration: state.currentFilter,
);
state = state.copyWith(
transactions: [...state.transactions, ...response.data],
page: nextPage,
isLoadMoreRunning: false,
hasMoreData: response.currentPage < response.lastPage,
);
} catch (e) {
print('Error loading more ledger: $e');
state = state.copyWith(isLoadMoreRunning: false);
}
}
// Update filter (resets data and reloads)
void updateFilter(String newFilter) {
if (state.currentFilter == newFilter) return;
state = LedgerState(
currentFilter: newFilter,
isLoading: true,
transactions: [],
page: 0,
hasMoreData: true,
isLoadMoreRunning: false,
);
loadInitialData();
}
}
final partyLedgerProvider =
StateNotifierProvider.family.autoDispose<PartyLedgerNotifier, LedgerState, PartyLedgerFilterParam>(
(ref, input) => PartyLedgerNotifier(
partyId: input.partyId,
initialFilter: input.duration ?? '',
),
);
// final partyLedgerProvider = StateNotifierProvider.family.autoDispose<PartyLedgerNotifier, LedgerState, String>(
// (ref, partyId) => PartyLedgerNotifier(partyId),
// );