import 'dart:async'; import 'package:fikoyt_ui/fikoyt_ui.dart'; import 'package:isar/isar.dart'; abstract class IsarKokSinif { late Isar isar; RxList liste = RxList([]); bool yukleniyor = false; bool hepsiYuklendi = false; int sayi = 3; int limit = 3; int offset = 0; String aramaMetni = ''; String? siralamaAlani = ''; bool siralamaTers = false; int veriSayisi = 0; StreamSubscription>? _subscription; dynamic get aktifKullanici => null; Isar getIsar(); IsarCollection get koleksiyon; QueryBuilder getQuery(); QueryBuilder applyAramaFiltre(QueryBuilder q, String arama) { return q; } Map Function(QueryBuilder, bool)> getSiralamaFonksiyonlari() { return {}; } QueryBuilder applySiralama(QueryBuilder q) { final siralama = siralamaAlani ?? ''; final ters = siralamaTers; final fonksiyonlar = getSiralamaFonksiyonlari(); if (siralama.isNotEmpty && fonksiyonlar.containsKey(siralama)) { return fonksiyonlar[siralama]!(q, ters); } return q; } Future iliskileriYukle(List liste) async {} IsarKokSinif() { isar = getIsar(); _veriyiIzle(); ilkYukleme(); } Future _veriyiIzle() async { await _subscription?.cancel(); final q = applySiralama(applyAramaFiltre(getQuery(), aramaMetni)); _subscription = q.watch(fireImmediately: true).listen((veriler) async { final gosterilecek = veriler.take(offset).toList(); await iliskileriYukle(gosterilecek); liste.value = gosterilecek; hepsiYuklendi = gosterilecek.length >= veriler.length; }); veriSayisi = await q.count(); } Future ilkYukleme() async { offset = limit; hepsiYuklendi = false; await dahaFazla(); } bool get dahaAzGoster => liste.length > sayi; Future dahaAz() async { yukleniyor = true; offset = liste.length - sayi; if (offset < sayi) offset = sayi; hepsiYuklendi = false; await _veriyiIzle(); yukleniyor = false; } bool get dahaSifirlaGoster => liste.length > sayi; Future dahaSifirla() async { yukleniyor = true; offset = sayi; hepsiYuklendi = false; await _veriyiIzle(); yukleniyor = false; } bool get dahaFazlaGoster => veriSayisi > liste.length; Future dahaFazla() async { if (yukleniyor || hepsiYuklendi) return; yukleniyor = true; final q = applySiralama(applyAramaFiltre(getQuery(), aramaMetni)).offset(liste.length).limit(sayi); final yeniVeri = await q.findAll(); await iliskileriYukle(yeniVeri); liste.addAll(yeniVeri); if (yeniVeri.length < sayi) hepsiYuklendi = true; offset = liste.length; yukleniyor = false; } Future listeyiYenile() async { yukleniyor = true; offset = liste.length; hepsiYuklendi = false; await _veriyiIzle(); yukleniyor = false; } Future listeyiSifirla() async { yukleniyor = true; offset = sayi; limit = sayi; hepsiYuklendi = false; yukleniyor = false; } Timer? debounceTimer; void aramaYap(String yeniMetin) { debounceTimer?.cancel(); debounceTimer = Timer(const Duration(milliseconds: 0), () async { aramaMetni = yeniMetin; await listeyiYenile(); await dahaSifirla(); debounceTimer?.cancel(); }); } void siralamaAyarla(String alan, {bool ters = false}) { siralamaAlani = alan; siralamaTers = ters; listeyiYenile(); } Future> getList({ int? offset, int? limit, String? arama, String? siralama, bool siralamaTers = false, bool iliskileriYukle = true, }) async { var q = getQuery(); if (arama != null && arama.isNotEmpty) { q = applyAramaFiltre(q, arama); } final fonksiyonlar = getSiralamaFonksiyonlari(); if (siralama != null && siralama.isNotEmpty && fonksiyonlar.containsKey(siralama)) { q = fonksiyonlar[siralama]!(q, siralamaTers); } if (offset != null) q = q.offset(offset) as QueryBuilder; if (limit != null) q = q.limit(limit) as QueryBuilder; final sonuc = await q.findAll(); if (iliskileriYukle) await this.iliskileriYukle(sonuc); return sonuc; } Future beforeEkle(T item) async => item; Future ekle(T item) async { await isar.writeTxn(() async { item = await beforeEkle(item); if (item == null) { await listeyiYenile(); return; } await koleksiyon.put(item); await afterEkle(item); }); await listeyiYenile(); } Future afterEkle(T item) async {} Future guncelle(T item) async { await isar.writeTxn(() => koleksiyon.put(item)); await listeyiYenile(); } Future sil(Id id) async { await isar.writeTxn(() => koleksiyon.delete(id)); await listeyiYenile(); } Future getir(Id id) async => await koleksiyon.get(id); Future topluEkle(List veri) async { await isar.writeTxn(() async { await koleksiyon.putAll(veri); }); await listeyiYenile(); } Future topluGuncelle(List veri) async { await isar.writeTxn(() async { await koleksiyon.putAll(veri); }); await listeyiYenile(); } void dispose() { _subscription?.cancel(); } }