Skip to content

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/cart loader misafir sepetini DB ile birleştirip çerezi temizler.

Kullanılan fonksiyonlar:

  • parseGuestCartCookie(cookieHeader) — server loader’larda Cookie header’dan misafir sepetini okur.
  • readGuestCartFromDocument() — client tarafında document.cookie üzerinden okur.
  • isCourseInGuestCart(courseId) / isBundleInGuestCart(bundleId) — hızlı kontrol.
  • addGuestCartItem(item) / removeGuestCartItem(id) — çereze yaz/sil.

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ı:

  • clsx ile class’ları birleştirir
  • tailwind-merge ile Tailwind class çakışmalarını çözer

Örnek:

cn("px-4", "px-8") // "px-8" (son class öncelikli)

Fonksiyon: formatPrice(amount: number, currency: string, locale?: string)

Amaç: Para birimine göre fiyat formatlar.

Parametreler:

ParametreTipAçıklama
amountnumberTutar (sayısal değer, örn: 99.99)
currencystringPara birimi kodu ('usd', 'try', 'eur', vb.)
localestringOpsiyonel 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"
// Euro
formatPrice(99.99, 'eur', 'de-DE'); // "99,99 €"

İç Yapı:

  • Intl.NumberFormat API kullanılır
  • Currency ve locale’e göre otomatik formatlama

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)

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'); // true
shouldIncludeLang('/admin/users'); // false
shouldIncludeLang('/api/graphql'); // false

Kural: Admin (/admin) ve API (/api) route’ları dil prefix’i içermez.


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)

Dosya: app/lib/streak.ts

Fonksiyonlar:

  • getStreakData(userId, db) — Kullanıcının streak bilgilerini getirir
  • getWeeklyActivity(userId, db) — Haftalık aktivite verilerini getirir
  • recordLearningActivity(userId, minutes, db) — Öğrenme aktivitesini kaydeder
  • useStreakFreeze(userId, db) — Streak freeze kullanımını kontrol eder

Detaylar: Streak Sistemi sayfasına bakın.


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.


Dosya: app/lib/bunny-video-status.ts

Fonksiyonlar:

  • fetchBunnyVideoStatus(libraryId, videoId, apiKey) — Video durumunu çeker
  • getBunnyVideoStatusKind(status) — Durum kodunu “processing” | “ready” | “error” olarak döndürür

Detaylar: Video Altyazıları sayfasına bakın.


Dosya: app/lib/bunny.ts

Fonksiyonlar:

  • uploadCaption(libraryId, videoId, langCode, vttContent, apiKey) — Video altyazısı yükler
  • deleteCaption(libraryId, videoId, langCode, apiKey) — Video altyazısı siler
  • listCaptions(libraryId, videoId, apiKey) — Video altyazılarını listeler

Detaylar: Video Altyazıları sayfasına bakın.


Dosya: app/lib/coupon-engine.ts

Fonksiyonlar:

  • validateCoupon(code, courseId, db) — Kupon kodunu doğrular ve geçerliliğini kontrol eder
  • calculateDiscountedPrice(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.


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.


Dosya: app/lib/notifications.ts

Fonksiyonlar:

  • createNotification(userId, type, data, db) — Kullanıcı için bildirim oluşturur
  • getNotificationLangForUser(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.


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/red
  • new_enrollment, new_review — Yeni kayıt/yorum
  • payout_completed, payout_rejected — Ödeme durumu
  • certificate_ready — Sertifika hazır
  • Ve diğerleri…

Dosya: app/lib/notification-ui-strings.ts

Fonksiyonlar:

  • getNotificationUIStrings(lang) — UI için bildirim metinlerini getirir
  • getDateLocale(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'

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' }, ...]

  • app/lib/utils.ts — Genel utility fonksiyonları
  • app/lib/i18n-utils.ts — i18n yardımcı fonksiyonları
  • app/lib/streak.ts — Streak yönetimi
  • app/lib/video-security.ts — Video güvenliği
  • app/lib/bunny-video-status.ts — Bunny video durumu
  • app/lib/bunny.ts — Bunny CDN/Stream API
  • app/lib/coupon-engine.ts — Kupon motoru
  • app/lib/exchange-rates.ts — Döviz kurları
  • app/lib/notifications.ts — Bildirim sistemi
  • app/lib/notification-messages.ts — Bildirim mesaj şablonları
  • app/lib/notification-ui-strings.ts — Bildirim UI metinleri
  • app/lib/stripe-countries.ts — Stripe destekli ülkeler