Modern ve responsive bir su sipariş uygulaması. React ile geliştirilmiş, sepet sistemi ve servis saatleri özelliklerine sahiptir.
- Responsive Design: Mobil-first yaklaşımla tasarlanmış
- Sepet Sistemi: Ürünleri sepete ekleme, miktar ayarlama
- Modal Menü: Ana ürünler için alt kategoriler
- WhatsApp Entegrasyonu: Direkt WhatsApp üzerinden sipariş
- Servis Saatleri: Belirli saatlerde sipariş alma
- İlk Ziyaret Mesajı: localStorage ile takip edilen karşılama
- Scroll İndikatörleri: Sayfa kaydırma yönlendirmesi
# Repoyu klonlayın
git clone [repo-url]
# Proje dizinine gidin
cd suapp
# Bağımlılıkları yükleyin
npm install
# Geliştirme sunucusunu başlatın
npm startUygulamanın servis saatleri src/config/serviceHours.js dosyasından yönetilir.
Uygulamanın minimum sipariş tutarı src/config/orderLimits.js dosyasından yönetilir.
Damacana ürünlerinin sipariş saatleri src/config/damacanaLimits.js dosyasından yönetilir.
export const SERVICE_HOURS = {
// Servis başlangıç saati (24 saat formatında)
startHour: 9,
startMinute: 0,
// Servis bitiş saati (24 saat formatında)
endHour: 22,
endMinute: 0,
// Hafta içi servis (Pazartesi-Cuma)
weekdaysEnabled: true,
// Hafta sonu servis (Cumartesi-Pazar)
weekendsEnabled: true,
// Özel kapalı günler
closedDates: [
'2024-01-01', // Yılbaşı
'2024-12-25', // Noel
],
// Test modu (geliştirme için)
testMode: false
};- Otomatik Kontrol: Sistem her dakika servis durumunu kontrol eder
- Sipariş Butonu: Servis saatleri dışında gri olur ve 🚫 emojisi gösterir
- Gerçek Zamanlı: Sayfa yenilenmeden otomatik güncellenir
- Esnek Konfigürasyon: Saat, gün ve özel tarih ayarları
export const SERVICE_HOURS = {
startHour: 9,
startMinute: 0,
endHour: 18,
endMinute: 0,
weekdaysEnabled: true,
weekendsEnabled: false,
closedDates: [],
testMode: false
};export const SERVICE_HOURS = {
startHour: 0,
startMinute: 0,
endHour: 23,
endMinute: 59,
weekdaysEnabled: true,
weekendsEnabled: true,
closedDates: [],
testMode: false
};export const SERVICE_HOURS = {
// ... diğer ayarlar
testMode: true // Bu ayar diğer tüm kontrolleri devre dışı bırakır
};Belirli günlerde servisi kapatmak için closedDates dizisini kullanın:
closedDates: [
'2024-01-01', // Yılbaşı
'2024-04-23', // 23 Nisan
'2024-05-01', // İşçi Bayramı
'2024-05-19', // 19 Mayıs
'2024-07-15', // Demokrasi Bayramı
'2024-08-30', // Zafer Bayramı
'2024-10-29', // Cumhuriyet Bayramı
]src/config/orderLimits.js dosyasından minimum sipariş tutarını ayarlayabilirsiniz:
export const ORDER_LIMITS = {
// Minimum sipariş tutarı (TL)
minimumOrderAmount: 40,
// Minimum tutar kontrolü aktif mi?
minimumOrderEnabled: true,
// Minimum tutara ulaşmadığında gösterilecek mesaj
minimumOrderMessage: "Minimum sepet tutarı {amount} TL'dir",
// Maksimum sipariş tutarı (isteğe bağlı - null = sınır yok)
maximumOrderAmount: null,
// Maksimum tutar aşıldığında gösterilecek mesaj
maximumOrderMessage: "Maksimum sipariş tutarı {amount} TL'dir"
};// 50 TL minimum yapmak için
export const ORDER_LIMITS = {
minimumOrderAmount: 50,
minimumOrderEnabled: true,
// ...
};
// Minimum tutarı tamamen kapatmak için
export const ORDER_LIMITS = {
minimumOrderEnabled: false,
// ...
};// 500 TL maksimum sipariş için
export const ORDER_LIMITS = {
minimumOrderAmount: 40,
maximumOrderAmount: 500,
// ...
};src/config/damacanaLimits.js dosyasından damacana sipariş saatlerini ayarlayabilirsiniz:
export const DAMACANA_LIMITS = {
// Damacana siparişlerinin kabul edildiği son saat (24 saat formatında)
cutoffHour: 19,
cutoffMinute: 0,
// Damacana siparişlerinin kabul edilmeye başladığı saat (ertesi gün)
startHour: 13,
startMinute: 0,
// Damacana saat sınırı aktif mi?
enabled: true,
// Saat sınırı aşıldığında gösterilecek mesaj
cutoffMessage: "Damacana siparişleri saat {cutoffTime}'dan sonra ve {startTime}'a kadar alınmamaktadır",
// Test modu (true olursa saat sınırı devre dışı)
testMode: false,
// Damacana ürünlerini tanımlayan ID pattern'i (1 ile bitenler: 11, 21, 31...)
damacanaIdPattern: /1$/,
// Hafta sonu farklı saat (isteğe bağlı)
weekendCutoffHour: 18, // Hafta sonu 1 saat erken
weekendCutoffMinute: 0,
weekendStartHour: 13, // Hafta sonu başlangıç saati
weekendStartMinute: 0,
weekendEnabled: false // false olursa hafta sonu aynı saat
};// 20:00'a kadar damacana siparişi için
export const DAMACANA_LIMITS = {
cutoffHour: 20,
cutoffMinute: 0,
enabled: true
};
// Damacana saat sınırını kapatmak için
export const DAMACANA_LIMITS = {
enabled: false
};
// Test modunda (saat sınırı yok)
export const DAMACANA_LIMITS = {
testMode: true
};// Hafta içi 19:00, hafta sonu 18:00
export const DAMACANA_LIMITS = {
cutoffHour: 19, // Hafta içi
weekendCutoffHour: 18, // Hafta sonu
weekendEnabled: true
};
// Hafta sonu aynı saat
export const DAMACANA_LIMITS = {
weekendEnabled: false // Hafta sonu da 19:00
};- ID kontrolü: 1 ile biten ürünler (11, 21, 31...) damacana olarak tanınır
- Sipariş saatleri: 13:00 - 19:00 arası (gece yarısını geçen kısıtlama)
- 19:00'dan sonra ve 13:00'a kadar:
- Damacana kartları gri olur ve tıklanamaz
- "Damacana siparişleri saat 19:00'dan sonra ve 13:00'a kadar alınmamaktadır" mesajı
- Sepette damacana varsa sipariş butonu gri olur
- GECEYARISINDAN SONRA DA sınırlama devam eder
- 13:00'dan 19:00'a kadar: Normal sipariş, kartlar tıklanabilir
- Diğer ürünler: Saat sınırından etkilenmez
- Gece yarısı geçişi: Sistem saat 19:00'dan sonra başlayan kısıtlamayı ertesi günün 13:00'ına kadar sürdürür
- Sürekli denetim: Sayfa yenilenmeden gerçek zamanlı kontrol yapar
- Sepet tutarı kontrol edilir: Her ürün ekleme/çıkarma işleminde
- 40 TL altındaysa: Sipariş butonu gri olur ve "Minimum sepet tutarı 40 TL'dir" yazar
- Alt bilgi gösterilir: "Şu anki sepet: 25.00 TL"
- 40 TL ve üstündeyse: Normal yeşil sipariş butonu görünür
Şu anki servis durumunu kontrol eder.
import { isServiceOpen } from './config/serviceHours';
const isOpen = isServiceOpen(); // true/falseServis saatlerini formatlanmış string olarak döndürür.
import { getServiceHoursText } from './config/serviceHours';
const hours = getServiceHoursText(); // "09:00 - 22:00"Sipariş tutarının geçerli olup olmadığını kontrol eder.
import { validateOrderAmount } from './config/orderLimits';
const result = validateOrderAmount(35);
// { isValid: false, message: "Minimum sepet tutarı 40 TL'dir" }Bir sonraki açılış zamanını hesaplar.
import { getNextServiceTime } from './config/serviceHours';
const nextOpen = getNextServiceTime(); // Date objesiÜrünler src/data/products.js dosyasında tanımlanır:
export const PRODUCTS = [
{
id: 1,
name: "Ana Ürün",
price: "25 TL",
image: null, // Resim yolu
imagePlaceholder: "💧", // Emoji placeholder
whatsappMessage: "Mesaj şablonu",
subProducts: [
{
id: 11,
name: "Alt Ürün 1",
price: "15 TL",
// ...
}
]
}
];WhatsApp ayarları src/config/whatsapp.js dosyasından yönetilir:
export const WHATSAPP_CONFIG = {
phoneNumber: "905551234567", // WhatsApp numarası
defaultMessage: "Merhaba, sipariş vermek istiyorum"
};Ana CSS dosyası: src/App.css
- Mobile-first yaklaşım
- 768px breakpoint
- Touch-friendly butonlar
npm run build# Build dosyalarını oluştur
npm run build
# Statik sunucu ile test et
npx serve -s buildBu proje MIT lisansı altında lisanslanmıştır.
- Fork edin
- Feature branch oluşturun (
git checkout -b feature/amazing-feature) - Commit edin (
git commit -m 'Add amazing feature') - Push edin (
git push origin feature/amazing-feature) - Pull Request açın
Header'ın sol tarafında görünecek logo için:
- Logo dosyasını ekleyin:
public/images/logo.pngolarak kaydedin - Desteklenen formatlar: PNG, JPG, SVG (PNG önerilen)
- Boyut önerileri:
- Genişlik: 150-250px
- Yükseklik: 40-60px
- Şeffaf arkaplan (PNG) önerilen
public/
├── images/
│ ├── logo.png ← Ana logo dosyası
│ ├── [email protected] ← Retina ekranlar için (opsiyonel)
│ └── logo.svg ← SVG format (opsiyonel)
Logo henüz eklenmemişse:
- Text fallback: "Bİ DOLU İÇECEK" yazısı görünür
- Otomatik geçiş: Logo yüklenemezse text'e geçer
- Responsive: Mobilde küçük, desktop'ta büyük
Logo path'ini değiştirmek için src/App.js dosyasında:
<img
src="/images/logo.png" // Logo path'ini buradan değiştirin
alt="Bİ DOLU İÇECEK Logo"
className="header-logo"
/>Header'daki sol daireye (🎥) tıklandığında açılacak tanıtım videosu için:
- Video klasörü oluşturun:
public/videos/klasörünü oluşturun - Video dosyasını ekleyin:
public/videos/tanitim-video.mp4olarak kaydedin - Video konfigürasyonu:
src/data/socialMedia.jsdosyasında:
{
id: 1,
name: "Tanıtım Videosu",
type: "video",
videoUrl: "/videos/tanitim-video.mp4", // Video path'ini buraya ekleyin
icon: "/images/video-icon.png", // Video ikonu (opsiyonel)
iconPlaceholder: "🎥",
target: "modal"
}- MP4 (önerilen): En yaygın desteklenen format
- WebM: Modern tarayıcılar için alternatif
- OGV: Eski tarayıcı desteği için
- Otomatik oynatma: Video modal açıldığında başlar
- Kontroller: Oynat/durdur, ses, tam ekran
- Responsive: Mobil ve desktop uyumlu
- Poster resmi:
public/images/video-poster.jpg(opsiyonel)
- Maksimum boyut: 50MB (performans için)
- Çözünürlük: 1920x1080 (Full HD) önerilen
- Aspect ratio: 16:9 (video modal otomatik ayarlar)
public/
├── videos/
│ ├── tanitim-video.mp4
│ ├── tanitim-video.webm (opsiyonel)
│ └── ...
├── images/
│ ├── video-poster.jpg (opsiyonel)
│ ├── video-icon.png (opsiyonel)
│ └── ...
Video henüz eklenmemişse:
- Placeholder görünümü: "Video Yakında Eklenecek" mesajı
- Mavi gradient arkaplan: Profesyonel görünüm
- Video ikonu: 🎥 emojisi ile görsel ipucu
Sorular için: [iletişim bilgisi]