Ramazan ayında kullanıcılara iftara kalan süreyi anlık olarak gösteren, konum bazlı web uygulaması.
- ⏰ Gerçek Zamanlı Geri Sayım: İftara kalan saat, dakika ve saniye
- 📍 Otomatik Konum Tespiti: Tarayıcı geolocation API ile otomatik konum
- 🗺️ Manuel Konum Seçimi: Ülke > Şehir > İlçe dropdown seçimi
- 🔔 Push Notifications: Tarayıcı kapalı olsa bile bildirim (1 saat, 30 dk, 10 dk)
- 🎨 Modern Tasarım: Glassmorphism efektli dark theme
- 📱 Responsive: Tüm cihazlarda mükemmel çalışır
- ⚡ Hızlı: Minimal bağımlılık, hızlı yükleme
- 💾 Akıllı Cache: 30 günlük veri cache'lenir
- 🌐 PWA: Progressive Web App desteği
- Frontend: Vanilla JavaScript (ES6+)
- Styling: Tailwind CSS (CDN)
- Font: Plus Jakarta Sans (Google Fonts)
- API: ezanvakti.emushaf.net (Python proxy ile)
- CORS Proxy: Python HTTP server (development + production)
- PWA: Service Worker + Web Push API
- Backend: Netlify Serverless Functions + Scheduled Functions
- Push: web-push library (VAPID)
iftarakalan/
├── index.html # Ana HTML dosyası
├── manifest.json # PWA manifest
├── sw.js # Service Worker (push notifications)
├── proxy_server.py # CORS proxy server (development)
├── package.json # Dependencies (web-push)
├── js/
│ ├── api.js # API entegrasyonu (proxy kullanıyor)
│ ├── location.js # Konum yönetimi
│ ├── countdown.js # Geri sayım mantığı
│ ├── storage.js # LocalStorage yönetimi
│ ├── notifications.js # Push notification manager
│ └── app.js # Ana uygulama
├── netlify/
│ └── functions/
│ ├── proxy.js # CORS proxy (production)
│ ├── vapid-public-key.js # VAPID key endpoint
│ ├── save-subscription.js # Subscription kaydetme
│ ├── remove-subscription.js # Subscription silme
│ └── scheduler.js # Cron job (bildirim gönderme)
├── scripts/
│ └── generate-vapid.js # VAPID key generator
├── memory-bank/ # Proje dokümantasyonu
├── PUSH_NOTIFICATIONS.md # Push notifications kılavuzu
└── README.md
- Python 3.x (proxy server için - development)
- Node.js 18+ (push notifications için)
- Modern web browser (Service Worker desteği)
- Projeyi klonlayın:
git clone <repo-url>
cd iftarakalan- Dependencies yükleyin:
npm install- CORS Proxy Server'ı başlatın (ZORUNLU):
python3 proxy_server.pyServer şu mesajı gösterecek:
🚀 Proxy server başlatıldı: http://localhost:8081
📡 Proxy endpoint: http://localhost:8081/api/proxy?url=TARGET_URL
- Tarayıcıda açın:
http://localhost:8081
ezanvakti.emushaf.net API'si CORS (Cross-Origin Resource Sharing) başlıkları sağlamıyor. Bu yüzden browser'dan direkt API çağrısı yapılamaz. Proxy server bu sorunu çözer:
Browser → Proxy (CORS headers ekler) → emushaf API → Proxy → Browser
Not: Production deployment için Netlify Functions veya Vercel Edge Functions kullanılmalı.
- Uygulamayı açın
- Tarayıcı konum izni isteğine "İzin Ver" deyin
- Geri sayım otomatik başlar
- Konum izni reddedilirse veya "Konum Değiştir" butonuna tıklayın
- Ülke, Şehir ve İlçe seçin
- Geri sayım başlar
Detaylı kılavuz: PUSH_NOTIFICATIONS.md
# 1. Supabase hesabı aç: https://supabase.com
# 2. New project oluştur
# 3. SQL Editor'da çalıştır:
CREATE TABLE subscriptions (
id SERIAL PRIMARY KEY,
endpoint TEXT UNIQUE NOT NULL,
subscription JSONB NOT NULL,
location JSONB,
settings JSONB,
created_at TIMESTAMP DEFAULT NOW(),
updated_at TIMESTAMP DEFAULT NOW()
);
CREATE INDEX idx_endpoint ON subscriptions(endpoint);
# 4. Settings → API → Keys kopyalanpm install
npm run generate-vapidSUPABASE_URL=https://xxx.supabase.co
SUPABASE_KEY=eyJxxx...
VAPID_PUBLIC_KEY=BEl62iUYg...
VAPID_PRIVATE_KEY=bdSiNzUhU...
CRON_SECRET_TOKEN=your-secret-token
Detaylı kılavuz: CRON_SETUP.md
# 1. Cron-job.org hesabı aç
# 2. Create cronjob:
# URL: https://iftarakalan.com/api/send-notifications
# Schedule: Every 1 minute
# Headers: x-auth-token: <CRON_SECRET_TOKEN>git push origin mainSafari'de localhost:8081 üzerinde geolocation çalışmaz (HTTPS gereksinimi). İki seçenek:
- Manuel Konum Seç (önerilen - development için)
- HTTPS'te Test Et (production'da çalışır -
https://iftarakalan.com)
Detaylı bilgi: DEPLOYMENT.md - Safari Özel Notlar
Uygulama ezanvakti.emushaf.net API'sini CORS proxy üzerinden kullanır:
// Development
GET http://localhost:8081/api/proxy?url=https://ezanvakti.emushaf.net/ulkeler
GET http://localhost:8081/api/proxy?url=https://ezanvakti.emushaf.net/sehirler/2
GET http://localhost:8081/api/proxy?url=https://ezanvakti.emushaf.net/ilceler/{sehirId}
GET http://localhost:8081/api/proxy?url=https://ezanvakti.emushaf.net/vakitler/{ilceId}- ✅ 81 Türkiye şehri başarıyla yükleniyor
- ✅ Tüm ilçeler dinamik olarak yükleniyor
- ✅ 30 günlük namaz vakitleri alınıyor
- ✅ Cache sistemi çalışıyor
- ✅ İftar saati:
Aksamfield'ı kullanılıyor
- LocalStorage kullanılır
- Prayer times: 30 gün cache
- Konum bilgisi: Persistent
- Günlük otomatik güncelleme
- Renk Paleti: Emerald Green (#34d399)
- Tema: Dark mode default
- Efektler: Glassmorphism, backdrop blur
- Tipografi: Plus Jakarta Sans
- Geolocation timeout → manuel fallback
- Manuel konum seçimi (81 şehir + tüm ilçeler)
- API entegrasyonu (proxy üzerinden)
- 30 günlük veri çekimi
- Dropdown'ların dinamik doldurulması
- LocalStorage cache sistemi
- Geolocation izin verildi senaryosu
- Countdown doğruluğu (gerçek zamanlı)
- Offline senaryo
- Cross-browser (Safari, Firefox)
- Mobile devices
- Performance metrics
# 1. GitHub'a push et
git add .
git commit -m "Initial commit"
git push origin main
# 2. Netlify'a bağlan
# https://netlify.com → "Import from GitHub" → Repo seç → Deploy!
# 3. Domain bağla (opsiyonel)
# Netlify Dashboard → Domain settings → Custom domain ekle👉 DEPLOYMENT.md - Adım adım tüm süreç!
- ✅ Otomatik SSL/HTTPS
- ✅ Serverless functions (proxy dahil!)
- ✅ CDN (dünya çapında hızlı yükleme)
- ✅ Custom domain desteği
- ✅ Continuous deployment (git push = auto deploy)
- ✅ Deploy previews (PR'lar için)
- 📦 Supabase PostgreSQL: Sınırsız kullanıcı desteği
- 🔄 Persistent Storage: Subscriptions kalıcı olarak saklanır
- 👥 Çok Kullanıcı: Her kullanıcı kendi tercihlerini seçer
- ⏰ Cron-job.org: Ücretsiz cron servisi (her dakika)
- ✅ ±1 Dakika Tolerans: Bildirimler kesin zamanda gelir
- 🧪 Test Modları: TEST_NOTIFICATIONS, TEST_IFTAR_TIME
Production'da proxy server gereklidir. Seçenekler:
- Function dosyası oluştur:
// netlify/functions/proxy.js
exports.handler = async (event) => {
const targetUrl = event.queryStringParameters.url;
try {
const response = await fetch(targetUrl);
const data = await response.json();
return {
statusCode: 200,
headers: {
'Access-Control-Allow-Origin': '*',
'Content-Type': 'application/json'
},
body: JSON.stringify(data)
};
} catch (error) {
return {
statusCode: 500,
body: JSON.stringify({ error: error.message })
};
}
};- api.js'i güncelle:
PROXY_URL: "/.netlify/functions/proxy"- Deploy:
netlify deploy --prod- Function dosyası:
// api/proxy.js
export default async function handler(req, res) {
const { url } = req.query;
const response = await fetch(url);
const data = await response.json();
res.setHeader('Access-Control-Allow-Origin', '*');
res.json(data);
}- Deploy:
vercel --prodRailway, Render, Fly.io üzerinde proxy_server.py'yi deploy edin.
Progressive Web App özellikleri eklenecek:
- Service Worker
- Offline support
- Add to Home Screen
- Push notifications
- Fork edin
- Feature branch oluşturun (
git checkout -b feature/AmazingFeature) - Commit edin (
git commit -m 'Add some AmazingFeature') - Push edin (
git push origin feature/AmazingFeature) - Pull Request açın
Bu proje MIT lisansı altında lisanslanmıştır.
Made with ❤️ for Ramadan
- Diğer namaz vakitleri
-
Bildirim sistemi✅ Tamamlandı (v2.0) - Widget desteği
- Çoklu dil desteği
- Dark/Light theme toggle
- Mobil uygulama (Capacitor)
- Favori konumlar
- Database entegrasyonu (subscriptions için)
Sorularınız için issue açabilirsiniz.
Not: Bu uygulama Ramazan ayında kullanım için tasarlanmıştır.