MotoRota, Türkiye’deki motorcular için rota planlama, sürüş kaydı ve gider/garaj takibini tek uygulamada birleştiren bir mobil platform. Calimoto ve Rever gibi küresel uygulamalar navigasyon-merkezli, pahalı ve yerel desteği zayıf; hiçbiri motorcunun gündelik gerçeğini — rota maliyeti, motor başına yakıt, bakım ve TÜVTÜRK takvimi — çözmüyor. MotoRota bu boşluğu, “navigasyon uygulaması” değil “motorcunun rota ve cüzdan defteri” olarak konumlanarak dolduruyor. Mimaride kilit karar, maliyetli turn-by-turn navigasyonu telefonun harita uygulamasına devredip yalnızca harita gösterimini üstlenmek; bu, kullanıcı başına maliyeti sıfıra indirerek freemium modeli sürdürülebilir kılıyor. Teknik temel Expo (React Native) + TypeScript ile tek kod tabanında iOS/Android, backend tarafında Supabase (PostgreSQL + Auth + Row Level Security). Güvenlik veri modeline gömülü: rotalar üçlü görünürlük (yalnızca ben / arkadaşlar / herkese açık) ve arkadaşlık ilişkisine bağlı RLS politikalarıyla korunuyor. Proje şu an çekirdek altyapısı (auth, garaj, rota planlama, gider ve sürüş kaydı) tamamlanmış halde geliştiriliyor; sırada free roam, oyunlaştırılmış profil, PostGIS tabanlı rota keşfi, premium içerik ve Türkiye’ye yönelik mağaza yayını var.
%10 uygulama ilerlemesi
Diller
TypeScript, PLpgSQL, JavaScript
Notlar
Mimari detayları düzenle
Ana dil
TypeScript
Grup sürüşü ekle: 2'li/çoklu, realtime + pil koruma modu
Grup sürüşü ekle: 2'li/çoklu, realtime + pil koruma modu Şu ana kadar rides tamamen bireyseldi; arkadaşlığın sürüşle tek ilgisi rota paylaşımıydı. Artık arkadaşlarını canlı bir sürüşe davet edebilirsin — herkesin GPS izi kendi hesabında ayrı kaydediliyor (mimari değişmedi), ama sürüş sırasında birbirinizin anlık konumunu haritada görüyorsunuz. - migrations/006_ride_sessions.sql: ride_sessions + ride_session_participants + RLS, profiles.is_premium (varsayılan false). 2'den fazla katılımcı şimdilik ücretsiz — kullanıcı kararıyla premium kapısı henüz uygulanmadı, önce özellik tam inşa edildi. Kaç oturumun hangi modda / kaç kişiyle geçtiği bu iki tablodan direkt sorgulanabilir. - hooks/useRideSessionChannel.ts: Supabase Realtime Broadcast ile DB'ye yazmadan (ephemeral) canlı konum yayını. realtime modda ~2.5sn, battery_saver'da ~60sn'de bir yayın (GPS örnekleme sıklığı değişmez, sadece paylaşım sıklığı). - hooks/useRideSessions.ts: oturum kur/davet et/katıl/reddet/ayrıl/sonlandır. - components/LiveRideModal.tsx: opsiyonel session prop — diğer katılımcıları renkli marker olarak gösterir, mod/katılımcı rozeti, kurucu sonlandırınca banner. Kaydet/Sil ile bitirince otomatik oturumdan ayrılır. lib/liveRide.tsx → startGroupRide(). - rides.tsx: "grup sürüşü kur" düğmesi (arkadaş + mod seç), bekleyen davetler banner'ı (Katıl/Reddet), Sürüş sekmesinde davet rozeti. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DND62cDv8gZq6jCMDkFS8K
Faz 4 tamamla: gider tarihi, rota noktası notu, sürüşü rota olarak kaydet
Faz 4 tamamla: gider tarihi, rota noktası notu, sürüşü rota olarak kaydet Son bir şema taraması üç eksik daha buldu: - expenses.occurred_at hiç ayarlanamıyordu (hep now()). ExpenseForm'a DateTimePicker eklendi. - route_points.note şemada vardı, hiç yazılıp okunmuyordu. Harita ekranındaki nokta düzenleme modalı artık tip seçimi + opsiyonel not alanını birlikte, ayrı bir "Kaydet" butonuyla uyguluyor (önceden tipe dokununca direkt kapanıyordu, not girme imkanı yoktu). Not, marker callout'larında gösteriliyor. - routes.source='freeroam' hiç yazılmıyordu — GPS'li bir sürüşü rotaya çevirecek yol yoktu. hooks/useRoutes.ts → useSaveRideAsRoute(): izi en fazla 30 noktaya indirger (ham iz binlerce nokta olup haritada onlarca Marker render ederek performans sorunu yaratabilirdi), yeni rota + rota noktası yazar. rides.tsx'te GPS izi olan sürüş kartlarına "Rota yap" butonu + ad/açıklama/görünürlük formu eklendi. Faz 4'te bilinen tek eksik: gerçek push bildirimi (Firebase + Supabase CLI kimlik bilgisi gerektiriyor, bu ortamda yok). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DND62cDv8gZq6jCMDkFS8K
Faz 4: gider konumu (GPS) ve profil avatarı ekle
Faz 4: gider konumu (GPS) ve profil avatarı ekle - hooks/useExpenses.ts: NewExpense'e latitude/longitude eklendi (şemada vardı, hiç yazılmıyordu). expenses.tsx formuna "konumumu kullan" butonu: GPS koordinatını kaydediyor, konum adı boşsa reverse-geocode ile otomatik dolduruyor. Liste kartında koordinat varsa dokununca harita uygulamasını açan bir konum ikonu var. - hooks/useProfile.ts: useUploadAvatar() — motor fotoğrafı akışıyla aynı desen (avatars bucket, ${userId}/avatar.ext). Profil ekranında gerçek avatar + kamera rozetiyle değiştirme; app/friends.tsx'teki tüm kullanıcı satırları da artık gerçek avatarı gösteriyor. migrations/005_avatars_storage.sql + schema.sql: avatars bucket + RLS. Gerçek push bildirimi hâlâ Firebase/Supabase CLI kimlik bilgisi bekliyor, bu ortamda tamamlanamıyor (bkz. CLAUDE.md Faz 3/4 notları). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DND62cDv8gZq6jCMDkFS8K
Uygulama geneline ikon ve dokunma/canlılık animasyonları ekle
Uygulama geneline ikon ve dokunma/canlılık animasyonları ekle Metin-ağırlıklı arayüzü @expo/vector-icons (Ionicons/MaterialCommunityIcons, Expo'nun kendi bağımlılığı) ile ikonlandırdı; tüm ekranlarda tutarlı bir his için birkaç yeniden kullanılabilir animasyon parçası eklendi. - components/AnimatedPressable.tsx (yeni): dokununca hafif küçülüp geri zıplayan Pressable sarmalayıcı; tab bar hariç hemen her buton/kart/chip'e uygulandı (native driver). - Tab bar ikonları (harita/rota/sürüş/garaj/gider/profil). - Her ekranda ekle/düzenle/sil/kaydet/vazgeç butonları + motor/rota/ kategori/görünürlük chip'leri artık ikonlu; boş durumlar da ikonlu. - LiveRideModal: kayıt sürerken HUD'da nabız gibi yanıp sönen kırmızı nokta. - StatsSummary: özet çubukları açılışta 0'dan hedef yüzdeye animasyonlu doluyor. - Giriş/kayıt ekranlarına motor ikonu + input ikonları eklendi. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DND62cDv8gZq6jCMDkFS8K
Faz 3'ü tamamlandı olarak işaretle, Faz 4 fikir listesi ekle
Faz 3'ü tamamlandı olarak işaretle, Faz 4 fikir listesi ekle Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DND62cDv8gZq6jCMDkFS8K
Rota ve sürüş kayıtlarına düzenleme (update) ekle
Rota ve sürüş kayıtlarına düzenleme (update) ekle Garaj ve Gider'de düzenleme vardı, Rotalar ve Sürüşler'de sadece ekle/sil vardı — kapatıldı. - hooks/useRoutes.ts: useUpdateRoute() (ad/açıklama/görünürlük). Rota detayında (route/[id].tsx) sahibiyse "Düzenle" butonu + modal. - hooks/useRides.ts: useUpdateRide() (motor/rota/tarih/mesafe; track_geometry hiç düzenlenmez). rides.tsx'te kart artık dokununca düzenleme formunu dolu açıyor (basılı tutma hâlâ sil); rota sonradan bağlanırsa ve kayıtta zaten gerçek GPS izi varsa was_ridden anti-cheat kontrolü burada da uygulanıyor. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DND62cDv8gZq6jCMDkFS8K
Faz 3: motor fotoğrafı, tahmini süre/yakıt, POI işaretleme, istek rozeti
Faz 3: motor fotoğrafı, tahmini süre/yakıt, POI işaretleme, istek rozeti - Motor fotoğrafı: expo-image-picker + Supabase Storage (motorcycle-photos bucket, owner-only yazma RLS). Garaj listesinde thumbnail, düzenleme formunda fotoğraf seç/değiştir + depo hacmi alanı (fuel_capacity_l tipte vardı, formda yoktu). - routes.estimated_duration_min artık kaydederken 50 km/h varsayımıyla otomatik hesaplanıp yazılıyor, rota detayında gösteriliyor. - Harita ekranında marker'a dokununca nokta tipi (waypoint/poi/fuel) seçilebiliyor + noktayı silme; tipe göre pin rengi değişiyor (rota detayında da aynı renkler). - Motor avg_consumption + fuel_capacity_l ikisi de girilmişse Garaj'da tahmini menzil; rota detayında motor seçilince tahmini yakıt (L) ve o motorun geçmiş yakıt giderlerinden çıkarılan ortalama fiyatla tahmini maliyet gösteriliyor. - Arkadaşlık isteği bildirimi: gerçek OS push'u Firebase/FCM (Android token) + Supabase Edge Function deploy'u gerektiriyor, bu ortamda yok — onun yerine Profil sekmesinde bekleyen istek sayısı rozeti eklendi (uygulama açıkken anında görülür). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DND62cDv8gZq6jCMDkFS8K
Faz 2'yi tamamlandı olarak işaretle, Faz 3 fikir listesi ekle
Faz 2'yi tamamlandı olarak işaretle, Faz 3 fikir listesi ekle migrations/003_nearby_routes.sql Supabase'de çalıştırıldı. Bilinen Faz 2 maddeleri bitti; kalan tek adım yeni APK build'i ile uçtan uca test. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DND62cDv8gZq6jCMDkFS8K
was_ridden'ı GPS kanıtına bağla, yakındaki rotalar özelliğini ekle
was_ridden'ı GPS kanıtına bağla, yakındaki rotalar özelliğini ekle - hooks/useRides.ts: was_ridden artık sadece gerçek kanıtla true oluyor — sürüş kaydında track_geometry (canlı GPS izinden, en az 5 nokta) olmalı, izin başlangıç/bitişi rotanınkine ≤2 km yakın olmalı, kaydedilen mesafe rota mesafesinin en az yarısı olmalı. Elle eklenen sürüşler (hiç GPS izi yok) hiçbir zaman bir rotayı "sürüldü" işaretleyemez. Rozet Rotalarım listesinde ve rota detayında gösteriliyor. - routes.start_point (PostGIS) hiç yazılıp okunmuyordu; useAddRoute artık ilk noktadan yazıyor. migrations/003_nearby_routes.sql mevcut rotalar için geriye dönük dolduruyor + nearby_routes(lat,lng,radius_km) RPC'sini ekliyor (ST_DWithin/ST_Distance, RLS'e tabi). useNearbyRoutes() + Rotalarım > Keşfet ekranına "Tümü / Yakınımda" alt-sekmesi eklendi. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DND62cDv8gZq6jCMDkFS8K
Rotalarım ekranına Keşfet sekmesi ekle (public/friends rotaları göster)
Rotalarım ekranına Keşfet sekmesi ekle (public/friends rotaları göster) routes.visibility RLS'de tamamdı ama başkasının paylaştığı rotayı görecek hiçbir yer yoktu. useDiscoverRoutes() kendi rotaların hariç diğer kullanıcıların (RLS'in izin verdiği public/friends) rotalarını sahip profiliyle birlikte getiriyor; routes.tsx'e "Rotalarım / Keşfet" toggle'ı eklendi. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DND62cDv8gZq6jCMDkFS8K
Arkadaşlık sistemini uygulamaya bağla, friendships RLS hatasını düzelt
Arkadaşlık sistemini uygulamaya bağla, friendships RLS hatasını düzelt Şemada friendships tablosu + RLS hazırdı ama hiç UI/hook yoktu; rota kaydetmedeki 'friends' görünürlük seçeneği de bu yüzden fiilen kullanılamaz durumdaydı. - hooks/useProfile.ts: kendi profilini okuma + kullanıcı adı güncelleme. - hooks/useFriendships.ts: arkadaş listesi + gelen/giden istekler (karşı taraf profilleri ayrı sorguyla çekilip client'ta eşleniyor, çünkü friendships FK'si profiles'a değil auth.users'a gidiyor). - app/friends.tsx: kullanıcı adına göre arama, istek gönder/kabul/reddet/ iptal/arkadaşlıktan çıkar. Profil ekranına kullanıcı adı alanı ve "Arkadaşlarım" bağlantısı eklendi. - migrations/002_friendships_rls_fix.sql + schema.sql: eski friendships_participant_all politikasının UPDATE with-check'i sadece isteği gönderen tarafa izin veriyordu, alıcı kabul edemiyordu. Dört ayrı politikaya bölündü (select/insert/update/delete). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DND62cDv8gZq6jCMDkFS8K
Faz 2 kalan maddeleri tamamla: rota detay ekranı, tarih seçici, istatistik özeti
Faz 2 kalan maddeleri tamamla: rota detay ekranı, tarih seçici, istatistik özeti - app/route/[id].tsx + useRoute(id): rota kaydını haritada (marker+polyline, fitToCoordinates) ve meta bilgilerle gösteren detay ekranı; Rotalarım listesinde karta dokununca açılıyor. - rides.tsx: sürüş eklerken YYYY-AA-GG metin girişi yerine @react-native-community/datetimepicker (Android modal / iOS inline). - components/StatsSummary.tsx: motora göre toplam km ve kategoriye göre gider dağılımını oransal çubuklarla özetleyen kart; Profil ekranına eklendi. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DND62cDv8gZq6jCMDkFS8K
Surus sekmesindeki bozuk Turkce karakterleri duzelt
Surus sekmesindeki bozuk Turkce karakterleri duzelt Onceki refactor sirasinda PowerShell Set-Content -Encoding utf8 dosyaya BOM ekleyip karakterleri yeniden kodlayinca mojibake olusmustu (u -> mojibake vb.). Mojibake tersine cevrilip dosya BOM'suz UTF-8 olarak yeniden yazildi.
Adim C+D: rotadan surus baslatma + garaj/gider duzenle-sil
Adim C+D: rotadan surus baslatma + garaj/gider duzenle-sil Adim C - planli surus = free roam: - LiveRideModal rides.tsx'ten components/'e tasindi, initialRoute prop'u alir: planli rotanin geometry'sini kesikli cizgi gosterir, navigasyon deep-link butonu ekler, kaydederken route_id otomatik baglar. - lib/liveRide.tsx: LiveRideProvider + useLiveRideUI (startFreeRoam / startWithRoute / close); modal kok layout'ta tek instance, her yerden acilir. - Rotalarim her karta "Baslat" -> startWithRoute(item). Adim D - garaj & gider duzenleme/silme: - useUpdateMotorcycle / useUpdateExpense (RLS owner update, politika degismez). - Garaj ve Gider formlari ekle/duzenle modunu paylasir (editing prop). - Kartlarda gorunur "Duzenle" + "Sil" (onayli) butonlari.
Faz 2: canli surus kaydi + sema saglamlastirma (is_public -> visibility)
Faz 2: canli surus kaydi + sema saglamlastirma (is_public -> visibility) - Canli surus: useLiveRide (GPS izi, haversine mesafe, baslat/duraklat/bitir), rides ekraninda tam ekran kayit modali; track_geometry rides'a yazilir. - Migration 001: routes.is_public -> visibility (private/friends/public), source/was_ridden/start_point kolonlari, friendships tablosu + RLS. - Kod: Route tipi + useRoutes visibility'ye tasindi; rota formuna gorunurluk secici (Sadece ben / Arkadaslar / Herkese acik), varsayilan private. - schema.sql guncel hale hizalandi. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Faz 1 tamam: rota planlama, gider ve surus karti
Faz 1 tamam: rota planlama, gider ve surus karti - useRoutes + harita ile nokta koyma (marker/Polyline), routes+route_points kaydi - Rotalarim ekrani (liste + basili-tut sil) - useExpenses + Gider ekrani (kategori/tutar/litre/motor/surus, toplam bari) - useRides + Surus ekrani (tarih/mesafe/motor/rota), gider-surus bagi - Tab bar 6 sekme (Surus + Gider eklendi) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Faz 0 + Faz 1 (auth + garaj): Expo SDK 54 iskelet, Supabase entegrasyonu
Faz 0 + Faz 1 (auth + garaj): Expo SDK 54 iskelet, Supabase entegrasyonu - Expo iskelet (kök app/ yapısı), Supabase client, react-query - Auth: kayıt/giriş/çıkış, oturum kalıcılığı, yönlendirme guard - Garaj: motor ekle/listele/sil (react-query, RLS uyumlu) - useThemeColors ile açık/koyu tema + klavye/placeholder düzeltmeleri - types/db.ts (schema.sql karşılığı), demo şablon temizliği Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>