docs: add comprehensive Stripe billing guide
All checks were successful
Deploy to Production / Build and Deploy (push) Successful in 4s
All checks were successful
Deploy to Production / Build and Deploy (push) Successful in 4s
Covers architecture, configuration steps, user flows, API routes, webhooks, pricing, testing with Stripe CLI, production checklist, and troubleshooting.
This commit is contained in:
@@ -32,12 +32,12 @@ export function GeneralSettingsClient({ initialSettings }: GeneralSettingsClient
|
||||
if (value === 'auto') {
|
||||
localStorage.removeItem('user-language')
|
||||
document.cookie = 'user-language=;path=/;max-age=0'
|
||||
toast.success(t('settings.languageAuto') || 'Language set to Auto')
|
||||
toast.success(t('settings.languageAuto'))
|
||||
} else {
|
||||
localStorage.setItem('user-language', value)
|
||||
document.cookie = `user-language=${value};path=/;max-age=${60 * 60 * 24 * 365};samesite=lax`
|
||||
setContextLanguage(value as any)
|
||||
toast.success(t('profile.languageUpdateSuccess') || 'Language updated')
|
||||
toast.success(t('profile.languageUpdateSuccess'))
|
||||
}
|
||||
setTimeout(() => router.refresh(), 300)
|
||||
}
|
||||
@@ -45,19 +45,19 @@ export function GeneralSettingsClient({ initialSettings }: GeneralSettingsClient
|
||||
const handleEmailNotificationsChange = async (enabled: boolean) => {
|
||||
setEmailNotifications(enabled)
|
||||
await updateAISettings({ emailNotifications: enabled })
|
||||
toast.success(t('settings.settingsSaved') || 'Saved')
|
||||
toast.success(t('settings.settingsSaved'))
|
||||
}
|
||||
|
||||
const handleDesktopNotificationsChange = async (enabled: boolean) => {
|
||||
setDesktopNotifications(enabled)
|
||||
await updateAISettings({ desktopNotifications: enabled })
|
||||
toast.success(t('settings.settingsSaved') || 'Saved')
|
||||
toast.success(t('settings.settingsSaved'))
|
||||
}
|
||||
|
||||
const handleAutoSaveChange = async (enabled: boolean) => {
|
||||
setAutoSave(enabled)
|
||||
await updateAISettings({ autoSave: enabled })
|
||||
toast.success(t('settings.settingsSaved') || 'Saved')
|
||||
toast.success(t('settings.settingsSaved'))
|
||||
}
|
||||
|
||||
return (
|
||||
@@ -89,21 +89,21 @@ export function GeneralSettingsClient({ initialSettings }: GeneralSettingsClient
|
||||
className="w-full bg-white/50 dark:bg-black/40 border border-border rounded-xl px-5 py-3.5 text-sm outline-none focus:ring-1 ring-brand-accent/20 appearance-none cursor-pointer transition-all hover:bg-white dark:hover:bg-black/60 text-ink font-medium"
|
||||
>
|
||||
<option value="auto">{t('profile.autoDetect')}</option>
|
||||
<option value="en">English</option>
|
||||
<option value="fr">Français</option>
|
||||
<option value="es">Español</option>
|
||||
<option value="de">Deutsch</option>
|
||||
<option value="fa">فارسی</option>
|
||||
<option value="it">Italiano</option>
|
||||
<option value="pt">Português</option>
|
||||
<option value="ru">Русский</option>
|
||||
<option value="zh">中文</option>
|
||||
<option value="ja">日本語</option>
|
||||
<option value="ko">한국어</option>
|
||||
<option value="ar">العربية</option>
|
||||
<option value="hi">हिन्दी</option>
|
||||
<option value="nl">Nederlands</option>
|
||||
<option value="pl">Polski</option>
|
||||
<option value="en">{t('languages.en')}</option>
|
||||
<option value="fr">{t('languages.fr')}</option>
|
||||
<option value="es">{t('languages.es')}</option>
|
||||
<option value="de">{t('languages.de')}</option>
|
||||
<option value="fa">{t('languages.fa')}</option>
|
||||
<option value="it">{t('languages.it')}</option>
|
||||
<option value="pt">{t('languages.pt')}</option>
|
||||
<option value="ru">{t('languages.ru')}</option>
|
||||
<option value="zh">{t('languages.zh')}</option>
|
||||
<option value="ja">{t('languages.ja')}</option>
|
||||
<option value="ko">{t('languages.ko')}</option>
|
||||
<option value="ar">{t('languages.ar')}</option>
|
||||
<option value="hi">{t('languages.hi')}</option>
|
||||
<option value="nl">{t('languages.nl')}</option>
|
||||
<option value="pl">{t('languages.pl')}</option>
|
||||
</select>
|
||||
<div className="absolute right-5 top-1/2 -translate-y-1/2 pointer-events-none opacity-40 text-concrete">
|
||||
<svg width="10" height="6" viewBox="0 0 10 6" fill="none">
|
||||
@@ -159,8 +159,8 @@ export function GeneralSettingsClient({ initialSettings }: GeneralSettingsClient
|
||||
|
||||
<div className="flex items-center justify-between pt-6">
|
||||
<div className="space-y-1">
|
||||
<p className="text-xs font-bold text-ink">{t('settings.autoSave') || 'Auto-Save'}</p>
|
||||
<p className="text-[10px] text-concrete leading-relaxed">{t('settings.autoSaveDesc') || 'Sauvegarder automatiquement les modifications'}</p>
|
||||
<p className="text-xs font-bold text-ink">{t('settings.autoSave')}</p>
|
||||
<p className="text-[10px] text-concrete leading-relaxed">{t('settings.autoSaveDesc')}</p>
|
||||
</div>
|
||||
<label className="relative inline-flex items-center cursor-pointer">
|
||||
<input
|
||||
|
||||
Reference in New Issue
Block a user