Bu repo, Flutter + Supabase tabanlı İngilizce öğrenme uygulamasının güncel sürümünü içerir. Mevcut kapsam artık yalnızca Faz 1 değil; Faz 2 (reading/çeviri), Faz 3 (dashboard/akış iyileştirmeleri) ve Faz 4 (gramer modülü + content pipeline) dahildir.
PASSAGETR: YDS ve İngilizce öğrenenler için özel olarak tasarlanmış, zengin okuma parçası koleksiyonuna sahip akıllı öğrenme uygulaması.
📚 500+ Özgün Okuma Parçası 🎯 YDS, YÖKDİL, YDT'ye Özel İçerik 🤖 Akıllı Kelime Çıkarıcı 📊 Detaylı İlerleme Takibi 🎧 Sesli Okuma Desteği 📱 Çevrimdışı Kullanım
Özel Slogan: Reading is Power.
- Faz 1: Kelime paketleri, flashcard, test hub, progress takibi
- Faz 2: Reading modülü, çeviri servisleri ve çeviri cache
- Faz 3: Home/dashboard ve gezinme akışı iyileştirmeleri
- Faz 4: Gramer modülü, markdown->json dönüştürme ve Supabase yükleme pipeline'ı
- Framework: Flutter
- State management: Riverpod
- Backend: Supabase
- Render:
flutter_html,flutter_html_table - Local lightweight state:
shared_preferences
| Tür | Paket | Amaç |
|---|---|---|
| dependency | flutter_riverpod |
Provider/state katmanı |
| dependency | supabase_flutter |
Auth + DB erişimi |
| dependency | shared_preferences |
Basit lokal kalıcılık |
| dependency | flutter_html |
HTML içerik render |
| dependency | flutter_html_table |
HTML table desteği |
| dependency | http |
Servis çağrıları |
| dependency | google_fonts |
Tipografi |
| dev_dependency | flutter_test |
Test |
| dev_dependency | flutter_lints |
Lint kuralları |
lib/
|-- main.dart # Uygulama giriş noktası, Supabase init
|-- app/ # MaterialApp, routing ve app-level yapı
|-- core/ # Ortak altyapı
| |-- auth/ # Oturum/anon auth yardımcıları
| |-- config/ # dart-define / env config okuma
| |-- constants/ # Uygulama sabitleri
| |-- services/ # Harici servis katmanı (çeviri vb.)
| |-- theme/ # Renk, tipografi, tema tanımları
| |-- utils/ # Saf yardımcı fonksiyonlar (levenshtein, lru_cache vb.)
| `-- widgets/ # Yeniden kullanılabilir UI bileşenleri (shimmer, stat tile vb.)
|-- data/
| |-- local/ # Lokal veri kaynakları (Drift/SQLite)
| `-- repositories/ # Supabase repository implementasyonları
|-- domain/
| |-- entities/ # İş modeli nesneleri
| |-- repositories/ # Repository arayüzleri
| `-- value_objects/ # Value object tipleri
|-- features/ # Feature-first ekran/modül yapısı
| |-- bootstrap/ # Açılış/başlatma akışı (branded splash)
| |-- home/ # Dashboard
| |-- shell/ # Bottom navigation container (badge desteği)
| |-- packs/ # Paket listesi
| |-- words/ # Kelime liste/detay
| |-- flashcard/ # Flashcard oturumları
| |-- tests/ # MCQ, matching, typing testleri
| |-- readings/ # Okuma modülü
| |-- grammar/ # Gramer modülü (modül/sayfa/reader)
| `-- profile/ # Profil, ayarlar ve tema geçişi
`-- state/ # Riverpod provider tanımları (domain-split)
|-- providers.dart # Barrel export (tüm provider'ları re-export eder)
|-- auth_providers.dart # Auth bootstrap, session service
|-- content_providers.dart # DB init, dictionary bootstrap, app bootstrap
|-- translation_providers.dart # Çeviri servisi provider
|-- pack_providers.dart # Pack listesi, repository
|-- word_providers.dart # Kelime sorguları, quick view controller (LRU cache)
|-- reading_providers.dart # Okuma listesi, detay, cümle çeviri
|-- grammar_providers.dart # Gramer modül/sayfa provider'ları
|-- dashboard_providers.dart # Home dashboard metrikleri
|-- theme_providers.dart # Tema modu (Light/Dark/System, persist)
`-- nav_badge_providers.dart # Bottom nav badge sayıları
git clone <REPO_URL>
cd <repo-folder>
flutter pub getcp env/app.dev.json.example env/app.dev.jsonenv/app.dev.json örnek içerik:
{
"SUPABASE_URL": "https://YOUR_PROJECT_REF.supabase.co",
"SUPABASE_ANON_KEY": "sb_publishable_xxx",
"TRANSLATE_PROVIDER": "deepl"
}cp .env.example .env.env örnek içerik:
SUPABASE_URL=https://YOUR_PROJECT_REF.supabase.co
SUPABASE_SERVICE_ROLE_KEY=sb_secret_xxxNot:
- Mobil uygulama tarafında yalnızca
SUPABASE_ANON_KEY(sb_publishable_...) kullanılmalıdır. SUPABASE_SERVICE_ROLE_KEYyalnızca script/server tarafında kullanılmalıdır.
Windows (PowerShell script):
.\scripts\run_flutter_dev.ps1macOS/Linux veya script kullanmak istemeyenler:
flutter run --dart-define-from-file=env/app.dev.json- Java: 17
- Kotlin plugin:
2.2.20(android/settings.gradle.kts) - Gradle wrapper:
8.14(android/gradle/wrapper/gradle-wrapper.properties) - Android compile/min/target SDK: Flutter tarafından sağlanır (
flutter.compileSdkVersion,flutter.minSdkVersion,flutter.targetSdkVersion) - NDK: Flutter tarafından sağlanır (
flutter.ndkVersion)
CLI ile:
supabase db pushAlternatif:
- Supabase SQL Editor aç
supabase/migrations/*.sqliçeriğini sırayla çalıştır
user_word_progress için temel politika mantığı:
create policy progress_select_own on public.user_word_progress
for select to authenticated
using (auth.uid() = user_id);Benzer şekilde insert/update için with check (auth.uid() = user_id) uygulanır.
- Kelime setleri/okuma içerikleri için:
docs/supabase_csv_import.md,docs/supabase_readings_import.md - Gramer verisi için:
- Markdown -> JSON
- JSON -> Supabase uploader
- Markdown kaynak klasörü:
docs/gramer - Converter:
markdown_to_json_converter.py - Uploader:
supabase_uploader.py - Migration:
supabase/migrations/202603030005_grammar.sql - Flutter ekranları:
lib/features/grammar/
python markdown_to_json_converter.py --input-dir docs/gramer --output-dir json_output
.\scripts\upload_grammar.ps1 -Mode replace -DryRun
.\scripts\upload_grammar.ps1 -Mode replaceAlternatif uploader:
python supabase_uploader.py --json-file json_output/tum_gramer_modulleri.json --mode replace- Açılış/Splash: Supabase bağlantısı kontrol edilir, anonim oturum başlatılır.
- Paket listesi: Kullanıcı çalışacağı paketi seçer.
- Kelime listesi: Arama/filtreleme yapılır, buradan öğrenme oturumu başlatılır.
- Flashcard oturumu: Bilme düzeyi işaretlenir, progress güncellenir.
- Test hub: MCQ / eşleştirme / yazma testleri.
- Reading: Metin, çeviri ve kelime etkileşimleri.
- Gramer: Modül listesi -> modül sayfaları -> reader akışı.
+-----------------------------------+
| PASSAGETR |
+-----------------------------------+
| [Ana Sayfa] [Kelime] [Okuma] [Gramer] [Profil] <- Bottom Nav
+-----------------------------------+
[KELIME LISTESI]
+-----------------------------------+
| Arama... [Filtre]
| Paket: YDS Set 001 |
|-----------------------------------|
| abandon terk etmek |
| ability yetenek |
| ... |
|-----------------------------------|
| [KARTLARLA OGRENMEYE BASLA] |
+-----------------------------------+
[TEST HUB]
+-----------------------------------+
| < Geri TEST MERKEZI |
| [Coktan Secmeli] [Eslestirme] [Yaz]
|-----------------------------------|
| Soru: "ability" |
| ( ) mevcut olmayan |
| (*) yetenek |
| ( ) terk etmek |
|-----------------------------------|
| [CEVAPLA] |
+-----------------------------------+
[READING DETAIL]
+-----------------------------------+
| < Geri A Day in Paris |
|-----------------------------------|
| The weather was breathtaking... |
| [Ceviriyi Goster] |
|-----------------------------------|
| Hava ... nefes kesiciydi. |
+-----------------------------------+
[GRAMER - MODUL LISTESI]
+-----------------------------------+
| < Geri INGILIZCE GRAMER |
|-----------------------------------|
| [1] Temel Kavramlar 16 sf |
| [2] Tense System 25 sf |
| [3] Modality 15 sf |
| ... |
+-----------------------------------+
[GRAMER - MODUL SAYFALARI]
+-----------------------------------+
| < Geri Adjectives/Adverbs |
|-----------------------------------|
| 1) Sifatlar - Tanim ve Turetme |
| 2) Sifatlarin Sirasi |
| ... |
| 20) Bolum Tarama Testi |
+-----------------------------------+
[GRAMER - READER]
+-----------------------------------+
| < Geri Adjectives/Adverbs |
| 3/20 [=========-----] |
|-----------------------------------|
| Sayfa basligi |
| HTML icerik (tablo + metin) |
|-----------------------------------|
| Ornekler |
| Mini Test |
+-----------------------------------+
- Bottom nav:
Ana Sayfa / Kelime / Okuma / Gramer / Profil - Home hızlı başlangıç:
resume reading -> weak words -> random words - Reading detail: seçim ve hızlı sözlük etkileşimi
- Gramer reader: modül bazlı sayfa ilerleme akışı
flutter analyze
flutter test
python -m py_compile markdown_to_json_converter.py supabase_uploader.pyNot:
- Typing testi Levenshtein mesafe algoritması ile hibrit doğrulama yapar:
- Exact match → tam doğru (yeşil)
- Near match (kısa kelime ≤1 hata, uzun kelime ≤2 hata) → doğru sayılır ama doğru yazılış gösterilir (sarı)
- Wrong → yanlış (kırmızı)
- 18 adet Levenshtein unit test ile doğrulanmıştır.
- Anonymous auth hızlı onboarding sağlar; ancak cihaz değişimi/uygulama silme sonrası kullanıcı kimliği taşınamazsa ilerleme geri getirilemeyebilir.
- Public translation fallback endpoint'leri geliştirmede pratik olsa da production için gizlilik, limit ve uptime riskleri barındırır.
| Sorun | Belirti | Kontrol / Çözüm |
|---|---|---|
| Supabase URL/Key eksik | Uygulama Supabase'e bağlanmaz | SUPABASE_URL + SUPABASE_ANON_KEY değerlerini kontrol et |
| Anonymous provider kapalı | Açılışta anonim oturum oluşmaz | Supabase Dashboard -> Auth -> Providers -> Anonymous aç |
| Android INTERNET izni eksik | Failed host lookup / SocketException |
AndroidManifest.xml içinde INTERNET iznini doğrula |
| Translation endpoint yok | Çeviri özelliği çalışmaz | Endpoint tanımla veya fallback davranışını kabul et |
Küçük boyutlu APK (ABI bazlı):
flutter build apk --release --split-per-abi --dart-define-from-file=env/app.dev.jsonBu README dosyası UTF-8 kodlaması ile tutulur. Türkçe karakterlerin (ç, ğ, ı, İ, ö, ş, ü) bozulmaması için dosyayı UTF-8 olarak açıp kaydedin.
Kök neden:
- Dosya içeriği UTF-8 olsa bile terminal/editor kodlaması UTF-8 değilse metin bozuk görünür (mojibake).
Kalıcı önlem:
- Repo kökünde
.editorconfig+.gitattributesUTF-8/LF zorlaması vardır. - Bozukluk denetimi için
python scripts/check_mojibake.pyçalıştırın.- Bu komut
README.md,docs/**/*.mdvelib/**/*.dartdosyalarını tarar.
- Bu komut
- Windows PowerShell'de görüntüleme için UTF-8 kullanın:
chcp 65001[Console]::InputEncoding = [System.Text.UTF8Encoding]::new()[Console]::OutputEncoding = [System.Text.UTF8Encoding]::new()$PSDefaultParameterValues['Out-File:Encoding'] = 'utf8'
- Bottom nav güncellendi:
Ana Sayfa / Kelime / Okuma / Gramer / Profil. - Ayrık
Sözlüksekmesi kaldırıldı; sözlük aramasıKelimesekmesindeki birleşik arama kutusuna taşındı. - Kelime aramasında sonuç kartı varsa iki aksiyon sunulur:
Kelime KartıveSözlük. - ReadingDetail odak kelimeler paneli varsayılan kapalı gelir; açıldığında EN + TR anlam listelenir.
- Reading quick word popup layoutu taşma yapmayacak şekilde yeniden hizalandı.
- Home/Profile auth akışında anonim session zorunlu hale getirildi; auth hataları kullanıcı dostu Retry mesajı ile gösterilir.
Bu bölüm, mevcut Faz 3.1 notlarına ek olarak son patchlerde gelen davranış güncellemelerini listeler.
- Bottom nav artık 5 sekmelidir:
Ana Sayfa / Kelime / Okuma / Gramer / Profil. - Ayrık
Sözlüksekmesi shell'den çıkarılmıştır. - Sözlük özelliği kaldırılmadı;
Kelimesekmesi içinde birleşik arama deneyimine taşındı.
- Kelime sekmesinde üstte tek bir arama kutusu bulunur.
- Boş aramada gereksiz sorgu atılmaz, yönlendirme metni gösterilir.
- Arama sonucu kelime kartında eşleşirse:
Kelime Kartıaksiyonu ileWordDetailaçılır.Sözlükaksiyonu ile dictionary/fallback sonucu açılır.
- Arama sonucu kelime kartında yoksa:
Sözlükaksiyonu ile fallback lookup sonucu açılır.
- Kelime sekmesinin altında pack listesi gömülü kalır (
PackListPage(embedded: true)).
appBootstrapProviderauth hatalarını artık swallow etmez.- Home/Profile veri provider'ları auth session kurulmadan metrik sorgularına geçmez.
- Geçici oturum kopmalarında bir kez otomatik toparlama (retry) uygulanır.
- Kullanıcıya gösterilen hata dili teknik yerine aksiyon odaklıdır (
Retry).
- Popup üst bölümünde başlık ve etiketler
Column + Wrapdüzenine alınmıştır. - Uzun kelime ve uzun etiketlerde satır kırılması/overflow riski azaltılmıştır.
- Bulunan kelime kartında
trMeaningchip satırından ayrılıp ayrı blokta gösterilir. - Synonym/antonym chip'leri ilişkili kelime veya sözlük fallback akışını tetikleyebilir.
Kaynakta Açotomatik çalışmaz, sadece butonla dış tarayıcı açılır.
- Panel varsayılan olarak kapalıdır (collapse/expand).
- Panel açıldığında her satırda
EN + TR + POSbilgisi gösterilir. Kelime ÇalışveMini MCQaksiyonları panel açıkken görünür.- Odak kelimeler mevcut deterministic highlight yaklaşımıyla uyumlu üretilir.
- Pack kartlarında görünen kelime sayısı tek bir kaynak şemasıyla sunulur (
Pack.wordCount). - Reading pack kart metni
X kelimeformatına alınmıştır. - Word ve Reading yüzeyinde aynı pack için aynı sayı gösterilmesi hedeflenmiştir.
Küçük boyutlu arm64 release APK için:
flutter build apk --release --target-platform android-arm64 --split-per-abi --dart-define-from-file=env/app.dev.jsonBeklenen cikti:
build/app/outputs/flutter-apk/app-arm64-v8a-release.apk
- Uygulama adı tüm platformlarda
PASSAGETRolarak güncellendi. - Uygulama sloganı:
Reading is Power. - Flutter package adı:
passagetr - Android/iOS/macOS/Linux uygulama kimliği bu turda güncellendi:
com.example.passagetrv0
- Kaynak ikon:
docs/icon_taslak/flutter/splash.png - Proje içi kaynak:
assets/branding/app_icon_source.png - İkon üretim komutu:
dart run flutter_launcher_iconsBu faz, projenin kod mimarisini güçlendiren ve kullanıcı deneyimini iyileştiren değişiklikleri kapsar.
808 satırlık monolitik providers.dart dosyası 8 domain-specific dosyaya bölündü:
| Dosya | İçerik |
|---|---|
auth_providers.dart |
Auth bootstrap, session service, Supabase client |
content_providers.dart |
DB init, dictionary bootstrap, app bootstrap zinciri |
translation_providers.dart |
Çeviri servisi provider (configurable fallback) |
pack_providers.dart |
Pack listesi, pack repository |
word_providers.dart |
Kelime sorguları, quick view controller (LRU cache) |
reading_providers.dart |
Okuma listesi/detay, cümle çeviri |
grammar_providers.dart |
Gramer modül/sayfa provider'ları |
dashboard_providers.dart |
Home dashboard metrikleri |
Mevcut providers.dart barrel export dosyası olarak çalışır — tüm import'lar uyumlu kalır.
String-based hata kontrolü (_isMissingAuthSessionError()) yerine typed exception hierarchy eklendi:
sealed class AppException implements Exception { ... }
class AuthMissingException extends AppException { ... }
class NetworkException extends AppException { ... }SupabaseProgressRepository ve DashboardProviders'da kullanılır.
WordQuickViewController._translationCache artık sınırsız büyümez — LruCache<String, String>(maxSize: 500) ile bellek sızıntısı riski ortadan kaldırıldı.
Exact-match yerine hibrit doğrulama sistemi:
- Exact match → tam doğru (yeşil SnackBar)
- Near match (Levenshtein mesafe ≤ eşik) → doğru sayılır, doğru yazılış sarı SnackBar ile gösterilir
- Wrong → yanlış (kırmızı SnackBar)
Eşik değerleri: kısa kelime (≤5 harf) → max 1 hata, uzun kelime (>5 harf) → max 2 hata.
LibreTranslateService._fallbackEndpoints artık hardcode değil — AppConfig.allowLibreFallbacks flag'i ile kontrol edilir (varsayılan: false). Production'da fallback'ler kapalıdır.
analysis_options.yaml'a eklenen kurallar:
prefer_const_constructorsavoid_printalways_declare_return_typesunawaited_futurescancel_subscriptions
Profil sayfasında SegmentedButton<ThemeMode> ile Light / Dark / System geçişi. Tercih SharedPreferences'da persist edilir — uygulama yeniden başlatıldığında korunur.
Bootstrap ekranı artık sadece CircularProgressIndicator yerine:
- App ikonu + fade-in animasyonu
- Uygulama başlığı + açıklama metni
LinearProgressIndicator- Hata state'inde stilize ikon + "Tekrar Dene" butonu
Pack listesi ve okuma sayfalarında loading state artık AppShimmerBlock / AppShimmerCard widget'ları ile gösterilir. Pure-Flutter gradient animasyonu — ek paket gerektirmez.
"Kelime" tab'ında zayıf kelime sayısını gösteren Badge.count widget'ı eklendi. weakWordCountProvider ile reaktif güncellenir.
- Uçak modunda veya zayıf ağlarda uygulamanın çökmesi engellendi.
AuthSessionServiceağ hatalarını (NetworkException, SocketException) sessizce yakalar.- Ana sayfa ve profil ekranları, hata anında sıfır metrikli zarif fallback arayüzü sunar.
- Profil sayfasında ağ bağlantısı kurulamadığında "Çevrimdışı mod" ibaresi (chip) gösterilir.
WordHomePagearama çubuğundaki "Temizle" (clear) butonunun görünürlüğüonChangedtetikleyicisiyle anında güncellenir.- Buton davranışlarındaki belirsizlikler ve parametre hataları giderildi.
- Tüm kelimelerin tek bir pakete ("YDS Set 001") kilitlenmesi sorunu aşıldı.
LocalPackRepositoryartık paket kelime sayılarını hesaplarken, o paketin okuma parçalarında (passages) geçen kelimeleri global kelime havuzunda (7000 kelime) arayarak dinamik bulur.- In-memory statik cache sayesinde runtime'da yüksek performans sağlar. Artık okuma paketlerinde "0 kelime" yerine gerçek kelime içerik sayıları görülebiliyor.
- Uygulamaya
flutter_ttsentegrasyonu eklenmiştir. TtsService(hız, dil ayarları) vettsServiceProviderile global erişim sağlanır.AppSpeakButtonkullanılarak kelime kartları ve detay sayfalarında kelimelerin orijinal (İngilizce) telaffuzları dinlenebilir.
- Gramer sekmesi artık yalnızca Supabase'e bağımlı değildir.
USE_LOCAL_STATIC_CONTENT=truemodunda önce lokalapp_content.dbkaynakları kullanılır.- Lokal grammar tabloları:
grammar_modulesgrammar_pagesgrammar_examplesgrammar_tests
HybridGrammarRepositorydavranışı:- Önce lokalden okur.
- Lokal boşsa Supabase'den çekip lokale yazar.
- Ağ/senkron hatası varsa lokal içerikle devam eder.
GrammarHomePageaçılışında non-blocking arka plan senkronu (syncIfStale) çalışır.
python markdown_to_json_converter.py --input-dir docs/gramer --output-dir json_output
python scripts/build_app_content_db.py --dictionary-xlsx docs/dictionary.xlsx --words-file docs/YDS_Set_001.csv --passages-file docs/readings_passages.csv --sentences-file docs/readings_sentences.csv --grammar-dir docs/gramer --output-db assets/db/app_content.db --report-file json_output/app_content_build_report.jsonDetaylı döküman: docs/grammar_offline_mode.md
Aşağıdaki iş kalemleri backend değişikliği, yeni paket veya büyük çaplı refactor gerektirdiği için gelecek sprint'lerde ele alınması planlanmaktadır.
Problem: signInAnonymously() ile oluşan kimlik cihaza bağlıdır. Uygulama silinirse veya cihaz değişirse user_word_progress, user_reading_progress tablolarındaki tüm ilerleme verisi erişilemez hale gelir.
Önerilen Çözüm: Supabase updateUser() API'si ile anonim kullanıcıyı e-posta/şifre hesabına bağlama. Profil sayfasına "Hesabını Yükselt" CTA butonu + e-posta/şifre form dialog eklenmesi.
Gerekli Değişiklikler:
auth_session_service.dart—upgradeAnonymousAccount(email, password)metodu- Yeni
account_upgrade_page.dart— e-posta girişi + onay akışı - Supabase Dashboard — e-posta onay template, redirect URL ayarları
Problem: Mevcut 27 test yalnızca core/ utility fonksiyonları ve 1 widget smoke test kapsar. Repository ve provider katmanlarında test yok.
Önerilen Çözüm: mocktail paketi ile mock-based unit testler:
SupabaseProgressRepository: Mock Supabase client ile CRUD testlerihomeDashboardProvider:ProviderContainer+ overrides ile state testleriBootstrapPage: Provider override ile widget testleri
Gerekli Paketler: mocktail: ^1.0.0
Problem: Tüm navigasyon Navigator.push(MaterialPageRoute(...)) ile yapılıyor. Deep-link desteği, URL-based navigasyon ve guard-based auth kontrolü yok.
Önerilen Çözüm: go_router paketine geçiş. ~15-20 dosyada Navigator.push → context.go/push değişikliği gerektirir. StatefulShellRoute ile bottom navigation entegrasyonu.
Tahmini Etki: Büyük refactor — feature-branch'te yapılması önerilir.
Problem: Kelime tekrarı tamamen rastgele; zorlanılan ve bilinen kelimeler eşit sıklıkta gösteriliyor.
Önerilen Çözüm: SM-2 (SuperMemo 2) algoritması ile akıllı tekrar zamanlaması. user_word_progress tablosuna srs_interval_days, srs_ease_factor, srs_next_review, srs_repetitions alanları eklenmesi.
Gerekli Değişiklikler: DB şema migration + yeni srs_algorithm.dart + flashcard akışına entegrasyon.
Problem: Kullanıcı motivasyonu için geri bildirim mekanizması yok. Düzenli çalışma teşvik edilmiyor.
Önerilen Çözüm: Yeni user_daily_stats tablosu ile ardışık çalışma günleri sayacı + günlük kelime/okuma hedefi. Dashboard'da 🔥 streak badge + progress bar.
Gerekli Değişiklikler: DB şema (yeni tablo) + streak_service.dart + dashboard/profil entegrasyonu.
Problem: Kullanıcının öğrenme ilerlemesini görselleştiren bir ekran yok.
Önerilen Çözüm: fl_chart paketi ile haftalık/aylık grafik + en zorlanılan kelimeler listesi. Mevcut user_word_progress tablosundan sorgu.
Gerekli Paketler: fl_chart: ^0.69.0
Problem: WordQuickViewController Riverpod 1.x StateNotifier pattern'ı kullanıyor. Riverpod 2.x'te Notifier/AsyncNotifier öneriliyor.
Önerilen Çözüm: StateNotifier<T> → AutoDisposeFamilyAsyncNotifier<T, Arg> geçişi. ref doğrudan class üzerinden erişilebilir hale gelir, manual constructor parametresi kalkır.
Risk: API değişikliği tüm tüketici dosyaları etkiler — feature-branch'te yapılmalı.
Problem: assets/db/app_content.db ve assets/db/dictionary_local.sqlite asset olarak gömülü. Bu dosyaların güncelleme stratejisi dokümante edilmemiş.
Önerilen İçerik:
- Asset versioning (
pubspec.yaml'da hash/version tracking) - Schema migration (Drift
schemaVersion+MigrationStrategy) - Content update flow (asset vs. cihaz DB version karşılaştırması)
- Remote sync (opsiyonel: Supabase'den diff-based content güncelleme)
- Rollback stratejisi
- Reading Player app bar:
Paylas,Yer imi,Dinleme ayarlari. - Kelime dokunusunda inline mini anlam baloncugu +
Detayile Quick Word sheet. - Reading audio settings sheet: hiz (
x0.5/x1/x1.25/x1.5), bilgi sikligi, dokunusta durdur. - Reading home segmentleri:
Hikayeler,Haber Akisi,Kitapligim. - Sprint-2 veri katmani:
user_reading_bookmarksveuser_reading_favoritestablolari + RLS.
Bu repoda web calisma yolu, Firebase Hosting yayini ve masaustu duzeni aktif olarak eklendi.
- Web production modu
remote-firstcalisir. USE_LOCAL_STATIC_CONTENT=falseile browser tarafinda lokal sqlite yoluna gidilmez.- Uygulama web'de Supabase + remote veri akisi ile acilir.
- Mobil/native tarafindaki lokal Drift/SQLite mantigi korunur.
- Hosting config: firebase.json
- Release guide: firebase_hosting_release.md
- Build script: build_web_firebase.ps1
- Deploy script: deploy_web_firebase.ps1
- Preflight script: check_firebase_hosting_ready.ps1
Varsayilan production deploy yolu:
powershell -ExecutionPolicy Bypass -File .\scripts\deploy_web_firebase.ps1 -EnvironmentFile env\app.web.prod.jsonNot:
- Sadece
flutter build web+firebase deploy --only hostingyapmak yeterli kabul edilmemelidir. - Production web icin prune + smoke adimi zorunlu tutulmalidir.
firebase.jsonicindekiignorekurallari artik lokal sqlite ve drift worker artefaktlarini ek bir guvenlik katmani olarak bloklar.
Eklenen ana responsive altyapi:
Aktif davranis:
<768: mobile768-1199: tablet>=1200: desktop
Desktop'ta:
NavigationBaryerine soldaNavigationRail- sayfa ici
max-widthcontainer Kelimeekraninda sol arama paneli + sag sonuc/paket alaniOkumaana sayfasindahero + devam et + iki kolonlu feedOkumadetayindasol meta + orta metin + sag sozluk/ceviri paneliAna Sayfa,GramerveProfilicin iki kolonlu / daha yogun masaustu duzeni
Canli Firebase ortami icin temiz Chrome oturumunda alinmis ekran goruntuleri:
Bu smoke seti su script ile tekrar alinabilir:
Ornek kullanim:
npm install --prefix temp\playwright-runner playwright
$env:NODE_PATH = "$PWD\temp\playwright-runner\node_modules"
node .\scripts\live_smoke_playwright.js https://passagetr-fef48.web.app artifacts\live_smoke- main_shell_page_test.dart
- word_home_page_test.dart
- reading_home_page_test.dart
- reading_detail_page_test.dart
- home_dashboard_page_test.dart
- profile_page_test.dart
- grammar_home_page_test.dart
Web tarafindaki en buyuk darboaz koddan once build artefakti ve asset boyutudur.
Bu repoda pubspec.yaml su asset'leri web build'e de dahil eder:
assets/db/app_content.db-> yaklasik56.98 MBassets/db/dictionary_local.sqlite-> yaklasik36.06 MBweb/drift_worker.dart.js-> yaklasik1.12 MBweb/sqlite3.wasm-> yaklasik0.70 MB
Toplam etkisi:
- Ilk acilista gereksiz buyuk bundle/caching davranisi
- Firebase Spark deploy boyutunun sisirilmesi
- Service worker ve browser cache tarafinda daha agir ilk kurulum
- Manual deploy yapildiginda production web'e gereksiz lokal-db artefaktlarinin tasinmasi
Web production mantigi zaten remote-first calistigi icin bu sqlite dosyalari production browser akisi icin gerekli degildir.
Yani yavasligin ana nedeni:
- Yanlis veya eksik prune edilmis web deploy
- Buyuk DB asset'lerinin web bundle'a girmesi
- Browser cache / service worker'in eski bundle'i tutmasi
- Desktop breakpoint'i yuksek oldugu icin bazi tarayicilarda masaustu layout'un gec devreye girmesi
Zorunlu:
- Production deploy'da her zaman
deploy_web_firebase.ps1kullan. firebase.jsonignore kurallarini koru.- Web'de
USE_LOCAL_STATIC_CONTENT=falsekalmali. - Canli deploy sonrasi eski service worker/cache temizlenmeli.
Yuksek etkili:
- Web'e lokal sqlite DB asset'lerini hic cikarmayacak bir build stratejisine gec.
pubspec.yamlasset listesini platform bazli ayrisma mantigina yaklastir.firebase deployoncesi prune edilmeyen bundle yayinlamayi operasyonel olarak yasakla.
Orta etkili:
main.dart.js,canvaskit/*ve statik assetler icin daha bilincli cache stratejisi degerlendir.- Chrome Performance panel ile
network waterfall + scripting + rasterprofili alin. - Web'de sadece gerekli ekranlar ilk anda acilsin; agir ozellikler lazy acilsin.
UI/UX etkili ama ikincil:
- Desktop breakpoint istenirse
1200yerine1024veya960seviyesine cekilebilir. - Bu degisiklik performansi degil, masaustu duzenin daha erken devreye girmesini iyilestirir.
Bu turda buyuk gecici klasorler ve loglar temizlendi:
build/.dart_tool/temp/temp_supabase_pkg/.firebase/__pycache__/
Kalici smoke ciktisi artik artifacts/live_smoke altinda tutulur.





