Utils ve Helper Functions
Paylaşılan yardımcı fonksiyonlar: cn (className merge), formatPrice, i18n utils ve diğer utility fonksiyonları.
Achidemy projesinde paylaşılan yardımcı fonksiyonlar app/lib/utils.ts, app/lib/i18n-utils.ts ve misafir sepeti için app/lib/guest-cart.ts dosyalarında bulunur. Bu fonksiyonlar component’ler ve route’lar arasında tekrar kullanılır.
Guest Cart Helpers (app/lib/guest-cart.ts)
Section titled “Guest Cart Helpers (app/lib/guest-cart.ts)”Misafir kullanıcıların sepete ekledikleri ürünler veritabanı yerine tarayıcı çerezi ile tutulur.
- Cookie adı:
guest_cart - Item tipi:
{ id: string, type: "course" | "bundle" } - Senkron: UI tarafı
window.dispatchEvent(new CustomEvent("cartUpdated"))ile Navbar/kartlar gibi bileşenleri günceller; giriş sonrası/:lang/cartloader misafir sepetini DB ile birleştirip çerezi temizler.
Kullanılan fonksiyonlar:
parseGuestCartCookie(cookieHeader)— server loader’lardaCookieheader’dan misafir sepetini okur.readGuestCartFromDocument()— client tarafındadocument.cookieüzerinden okur.isCourseInGuestCart(courseId)/isBundleInGuestCart(bundleId)— hızlı kontrol.addGuestCartItem(item)/removeGuestCartItem(id)— çereze yaz/sil.
Utils (app/lib/utils.ts)
Section titled “Utils (app/lib/utils.ts)”cn (ClassName Merge)
Section titled “cn (ClassName Merge)”Fonksiyon: cn(...inputs: ClassValue[])
Amaç: Tailwind CSS class’larını birleştirir ve çakışmaları çözer.
Kullanım:
import { cn } from '~/lib/utils';
// Basit kullanım<div className={cn("px-4 py-2", "bg-blue-500")}> Content</div>
// Conditional classes<div className={cn( "px-4 py-2", isActive && "bg-blue-500", isDisabled && "opacity-50")}> Content</div>
// Props ile birleştirme<div className={cn("base-classes", className)}> Content</div>İç Yapı:
clsxile class’ları birleştirirtailwind-mergeile Tailwind class çakışmalarını çözer
Örnek:
cn("px-4", "px-8") // "px-8" (son class öncelikli)formatPrice
Section titled “formatPrice”Fonksiyon: formatPrice(amount: number, currency: string, locale?: string)
Amaç: Para birimine göre fiyat formatlar.
Parametreler:
| Parametre | Tip | Açıklama |
|---|---|---|
amount | number | Tutar (sayısal değer, örn: 99.99) |
currency | string | Para birimi kodu ('usd', 'try', 'eur', vb.) |
locale | string | Opsiyonel locale (varsayılan: 'tr-TR') |
Dönüş Değeri: Formatlanmış fiyat string’i
Kullanım:
import { formatPrice } from '~/lib/utils';
// Türk LirasıformatPrice(99.99, 'try', 'tr-TR'); // "₺99,99"
// ABD DolarıformatPrice(99.99, 'usd', 'en-US'); // "$99.99"
// EuroformatPrice(99.99, 'eur', 'de-DE'); // "99,99 €"İç Yapı:
Intl.NumberFormatAPI kullanılır- Currency ve locale’e göre otomatik formatlama
i18n Utils (app/lib/i18n-utils.ts)
Section titled “i18n Utils (app/lib/i18n-utils.ts)”getLangFromPath
Section titled “getLangFromPath”Fonksiyon: getLangFromPath(pathname: string): SupportedLanguage
Amaç: Path’den dil kodunu çıkarır.
Kullanım:
import { getLangFromPath } from '~/lib/i18n-utils';
getLangFromPath('/tr/courses'); // 'tr'getLangFromPath('/en/courses'); // 'en'getLangFromPath('/courses'); // 'en' (varsayılan)shouldIncludeLang
Section titled “shouldIncludeLang”Fonksiyon: shouldIncludeLang(pathname: string): boolean
Amaç: Path’in dil prefix’i içerip içermediğini kontrol eder.
Kullanım:
import { shouldIncludeLang } from '~/lib/i18n-utils';
shouldIncludeLang('/tr/courses'); // trueshouldIncludeLang('/admin/users'); // falseshouldIncludeLang('/api/graphql'); // falseKural: Admin (/admin) ve API (/api) route’ları dil prefix’i içermez.
addLangToPath
Section titled “addLangToPath”Fonksiyon: addLangToPath(path: string, lang: SupportedLanguage): string
Amaç: Path’e dil kodunu ekler.
Kullanım:
import { addLangToPath } from '~/lib/i18n-utils';
addLangToPath('/courses', 'tr'); // '/tr/courses'addLangToPath('/courses', 'en'); // '/en/courses'addLangToPath('/admin/users', 'tr'); // '/admin/users' (değişmez)Diğer Helper Functions
Section titled “Diğer Helper Functions”Streak Utilities
Section titled “Streak Utilities”Dosya: app/lib/streak.ts
Fonksiyonlar:
getStreakData(userId, db)— Kullanıcının streak bilgilerini getirirgetWeeklyActivity(userId, db)— Haftalık aktivite verilerini getirirrecordLearningActivity(userId, minutes, db)— Öğrenme aktivitesini kaydederuseStreakFreeze(userId, db)— Streak freeze kullanımını kontrol eder
Detaylar: Streak Sistemi sayfasına bakın.
Video Security
Section titled “Video Security”Dosya: app/lib/video-security.ts
Fonksiyon: generateSignedVideoUrl(videoId, libraryId, securityKey, expirationSeconds)
Amaç: Bunny CDN için imzalı video URL’i üretir.
Detaylar: Video Altyazıları sayfasına bakın.
Bunny Video Status
Section titled “Bunny Video Status”Dosya: app/lib/bunny-video-status.ts
Fonksiyonlar:
fetchBunnyVideoStatus(libraryId, videoId, apiKey)— Video durumunu çekergetBunnyVideoStatusKind(status)— Durum kodunu “processing” | “ready” | “error” olarak döndürür
Detaylar: Video Altyazıları sayfasına bakın.
Bunny CDN/Stream API
Section titled “Bunny CDN/Stream API”Dosya: app/lib/bunny.ts
Fonksiyonlar:
uploadCaption(libraryId, videoId, langCode, vttContent, apiKey)— Video altyazısı yüklerdeleteCaption(libraryId, videoId, langCode, apiKey)— Video altyazısı silerlistCaptions(libraryId, videoId, apiKey)— Video altyazılarını listeler
Detaylar: Video Altyazıları sayfasına bakın.
Coupon Engine
Section titled “Coupon Engine”Dosya: app/lib/coupon-engine.ts
Fonksiyonlar:
validateCoupon(code, courseId, db)— Kupon kodunu doğrular ve geçerliliğini kontrol edercalculateDiscountedPrice(originalPrice, coupon)— İndirimli fiyatı hesaplar
Kullanım:
import { validateCoupon, calculateDiscountedPrice } from '~/lib/coupon-engine';
const coupon = await validateCoupon('SUMMER20', courseId, db);if (coupon.valid) { const discountedPrice = calculateDiscountedPrice(99.99, coupon.coupon);}Detaylar: Kupon Sistemi sayfasına bakın.
Exchange Rates
Section titled “Exchange Rates”Dosya: app/lib/exchange-rates.ts
Fonksiyonlar:
fetchExchangeRates(baseCurrency, env)— Döviz kurlarını API’den çeker (KV cache ile)convertCurrency(amount, from, to, rates)— Para birimi dönüşümü yapar
Kullanım:
import { fetchExchangeRates, convertCurrency } from '~/lib/exchange-rates';
const rates = await fetchExchangeRates('USD', env);const tryAmount = convertCurrency(100, 'USD', 'TRY', rates);Detaylar: Döviz Kurları sayfasına bakın.
Notifications
Section titled “Notifications”Dosya: app/lib/notifications.ts
Fonksiyonlar:
createNotification(userId, type, data, db)— Kullanıcı için bildirim oluştururgetNotificationLangForUser(userId, db)— Kullanıcının tercih ettiği dili getirir
Kullanım:
import { createNotification } from '~/lib/notifications';
await createNotification(userId, 'course_approved', { courseTitle: 'React 101' }, db);Detaylar: Bildirim Sistemi sayfasına bakın.
Notification Messages
Section titled “Notification Messages”Dosya: app/lib/notification-messages.ts
Amaç: Tüm bildirim tipleri için dil bazlı başlık ve mesaj şablonları sağlar.
Desteklenen Diller: tr, en, de, es, fr, ja
Bildirim Tipleri:
course_approved,course_rejected— Kurs onay/rednew_enrollment,new_review— Yeni kayıt/yorumpayout_completed,payout_rejected— Ödeme durumucertificate_ready— Sertifika hazır- Ve diğerleri…
Notification UI Strings
Section titled “Notification UI Strings”Dosya: app/lib/notification-ui-strings.ts
Fonksiyonlar:
getNotificationUIStrings(lang)— UI için bildirim metinlerini getirirgetDateLocale(lang)— Tarih formatı için locale döndürür
Kullanım:
import { getNotificationUIStrings, getDateLocale } from '~/lib/notification-ui-strings';
const strings = getNotificationUIStrings('tr');const locale = getDateLocale('tr'); // 'tr-TR'Stripe Countries
Section titled “Stripe Countries”Dosya: app/lib/stripe-countries.ts
Amaç: Stripe Connect destekli ülkeler listesini sağlar. Eğitmen onboarding’de ülke seçimi için kullanılır.
Kullanım:
import { STRIPE_SUPPORTED_COUNTRIES } from '~/lib/stripe-countries';
// [{ code: 'US', name: 'United States' }, { code: 'TR', name: 'Turkey' }, ...]İlgili Dosyalar
Section titled “İlgili Dosyalar”app/lib/utils.ts— Genel utility fonksiyonlarıapp/lib/i18n-utils.ts— i18n yardımcı fonksiyonlarıapp/lib/streak.ts— Streak yönetimiapp/lib/video-security.ts— Video güvenliğiapp/lib/bunny-video-status.ts— Bunny video durumuapp/lib/bunny.ts— Bunny CDN/Stream APIapp/lib/coupon-engine.ts— Kupon motoruapp/lib/exchange-rates.ts— Döviz kurlarıapp/lib/notifications.ts— Bildirim sistemiapp/lib/notification-messages.ts— Bildirim mesaj şablonlarıapp/lib/notification-ui-strings.ts— Bildirim UI metinleriapp/lib/stripe-countries.ts— Stripe destekli ülkeler