import 'dart:async'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import '../modeller/job.dart'; import '../modeller/proje.dart'; import '../servisler/job_orkestratoru.dart'; import '../servisler/proje_deposu.dart'; import 'geri_al_durumu.dart'; class ProjeNotifier extends StateNotifier { ProjeNotifier(this._ref) : super(null) { _jobAbone = JobOrkestratoru.ornek.events.listen(_jobOlayi); } final Ref _ref; Timer? _kayitDebounce; StreamSubscription? _jobAbone; bool _undoBypass = false; Future _jobOlayi(Job job) async { final aktif = state; if (aktif == null || job.projeId != aktif.id) return; // Job durumu değiştiğinde proje state'ini diskten yenile // (segment durumu uretiliyor → tamam geçişlerini yansıtmak için) if (job.durum == JobDurum.tamam || job.durum == JobDurum.hata || job.durum == JobDurum.calisiyor) { final yeni = await ProjeDeposu.yukle(aktif.klasorYolu); if (yeni != null) state = yeni; } } void ayarla(Proje p) { // Undo stack'e mevcut state'i kaydet (bypass değilse) if (!_undoBypass && state != null) { try { _ref.read(geriAlProvider).kaydet(state!); } catch (_) {} } state = p; _kayitDebounce?.cancel(); _kayitDebounce = Timer(const Duration(milliseconds: 800), () { if (state != null) ProjeDeposu.kaydet(state!); }); } /// Undo/redo sırasında stack'e tekrar eklemeden ayarla void ayarlaBypass(Proje p) { _undoBypass = true; try { ayarla(p); } finally { _undoBypass = false; } } void guncelle(Proje Function(Proje) fn) { if (state != null) ayarla(fn(state!)); } Future hemenKaydet() async { _kayitDebounce?.cancel(); if (state != null) await ProjeDeposu.kaydet(state!); } /// Aktif projeyi tamamen sıfırla (silinince çağrılır). void temizle() { _kayitDebounce?.cancel(); state = null; } @override void dispose() { _kayitDebounce?.cancel(); _jobAbone?.cancel(); if (state != null) ProjeDeposu.kaydet(state!); super.dispose(); } } final projeProvider = StateNotifierProvider((ref) => ProjeNotifier(ref)); final projelerListesiProvider = FutureProvider>((ref) => ProjeDeposu.sonProjeler()); /// Seçili segment id'si. final secilenSegmentIdProvider = StateProvider((ref) => null); /// Aktif görünüm modu. enum GorunumModu { studio, timeline, storyboard, muzik, gorsel, lora } final gorunumModuProvider = StateProvider((ref) => GorunumModu.studio); /// Çoklu seçim — segment id seti final cokluSecimProvider = StateProvider>((ref) => {});