refactor(desktop): 라이선스 UI 빅뱅 — 키 입력 제거, 구독 기반 전환

- LicenseTab/LicenseModal: LemonSqueezy 키 입력 삭제, Payple 구독 UI로 전환
- useLicenseState 훅: 라이선스+클라우드 인증 공용 상태 관리 추출
- PREMIUM_MODEL_LIMITS: 3곳 중복 → @d3ro/core/constants 단일 소스
- i18n: LemonSqueezy 전용 키 18개 삭제, 구독 관련 키 13개 추가 (12 locale)
- DashboardPage: dashboard.model* → license.model* 키 통일
This commit is contained in:
윤찬 2026-04-12 19:54:04 +09:00
parent 68881bf0d0
commit 996def683b
17 changed files with 633 additions and 537 deletions

View file

@ -50,6 +50,30 @@ export const AUDIO_FORMAT = {
BYTES_PER_SAMPLE: 2
} as const
/** Premium 모델별 쿼터 한도 (LicenseService QUOTA_LIMITS, 서버 quota.ts와 동기) */
export interface PremiumModelQuota {
readonly model: string
readonly i18nKey: string
readonly limit: number // -1 = 무제한
readonly period: 'daily' | 'weekly'
}
export const PREMIUM_MODEL_LIMITS: Record<'free' | 'pro' | 'pro_plus', readonly PremiumModelQuota[]> = {
free: [
{ model: 'llm_haiku', i18nKey: 'license.modelHaiku', limit: 250, period: 'weekly' },
],
pro: [
{ model: 'llm_haiku', i18nKey: 'license.modelHaiku', limit: 1500, period: 'daily' },
{ model: 'llm_sonnet', i18nKey: 'license.modelSonnet', limit: 300, period: 'daily' },
{ model: 'llm_opus', i18nKey: 'license.modelOpus', limit: 50, period: 'daily' },
],
pro_plus: [
{ model: 'llm_haiku', i18nKey: 'license.modelHaiku', limit: -1, period: 'daily' },
{ model: 'llm_sonnet', i18nKey: 'license.modelSonnet', limit: 1500, period: 'daily' },
{ model: 'llm_opus', i18nKey: 'license.modelOpus', limit: 300, period: 'daily' },
],
} as const
/** 윈도우 크기 */
export const WINDOW_SIZE = {
MAIN: { width: 1104, height: 816 },

View file

@ -40,12 +40,6 @@
"dashboard.backendLocal": "Lokal (Ollama)",
"dashboard.backendPremium": "Premium (Claude)",
"dashboard.loginRequired": "Anmeldung erforderlich",
"dashboard.premiumQuota": "Premium-Kontingent",
"dashboard.modelHaiku": "Haiku",
"dashboard.modelSonnet": "Sonnet",
"dashboard.modelOpus": "Opus",
"dashboard.quotaWeekly": "Wöchentlich",
"dashboard.quotaDaily": "Täglich",
"history.title": "Transkriptionsverlauf",
"history.search": "Suchen...",
"history.entries": "{{count}} Einträge",

View file

@ -39,12 +39,6 @@
"dashboard.backendLocal": "Local (Ollama)",
"dashboard.backendPremium": "Premium (Claude)",
"dashboard.loginRequired": "Login Required",
"dashboard.premiumQuota": "Premium Quota",
"dashboard.modelHaiku": "Haiku",
"dashboard.modelSonnet": "Sonnet",
"dashboard.modelOpus": "Opus",
"dashboard.quotaWeekly": "Weekly",
"dashboard.quotaDaily": "Daily",
"history.title": "Transcription History",
"history.search": "Search...",
"history.entries": "{{count}} entries",
@ -283,24 +277,11 @@
"license.free": "FREE",
"license.pro": "PRO",
"license.proPlus": "PRO+",
"license.activate": "Activate License",
"license.deactivate": "Deactivate",
"license.keyPlaceholder": "Enter license key...",
"license.activating": "Activating...",
"license.activated": "Activated",
"license.activateError": "Activation failed: {{message}}",
"license.deactivated": "Deactivated",
"license.machineId": "Machine ID",
"license.activatedAt": "Activated At",
"license.manageLicense": "Manage License",
"license.subscribe": "Subscribe",
"license.upgrade": "Upgrade",
"license.currentPlan": "Current Plan",
"license.proPlan": "Pro — ₩9,900/mo",
"license.proPlusPlan": "Pro+ — ₩29,900/mo",
"license.paymentPending": "Payment integration coming soon (Payple)",
"license.upgradeTitle": "Upgrade to Pro",
"license.upgradeDesc": "Unlock all features",
"license.quotaUsed": "{{used}}/{{limit}} used",
"license.quotaUnlimited": "Unlimited",
"license.tierComparison": "Tier Comparison",
@ -340,7 +321,6 @@
"license.proPlus.required": "PRO+ Required",
"license.included": "Included",
"license.notIncluded": "Not included",
"license.keyLabel": "License Key",
"license.quotaExceeded.title": "You've used all your daily {{feature}}",
"license.quotaExceeded.desc": "Upgrade to Pro for unlimited usage",
"license.tierRequired.title": "{{feature}} is a {{tier}} feature",
@ -360,6 +340,19 @@
"license.unlimited": "Unlimited",
"license.locked": "Locked",
"license.nav": "License",
"license.signInRequired": "Sign in to manage your subscription",
"license.signInToUpgrade": "Sign in to upgrade",
"license.subscriptionActive": "Subscription active",
"license.subscriptionManage": "Manage subscription",
"license.upgradeToProDesc": "Unlock Premium AI models, cloud sync, and more",
"license.currentPlanActive": "Your current plan",
"license.openBillingPage": "Open billing page",
"license.premiumQuota": "Premium Quota",
"license.modelHaiku": "Haiku",
"license.modelSonnet": "Sonnet",
"license.modelOpus": "Opus",
"license.quotaWeekly": "weekly",
"license.quotaDaily": "daily",
"fileTranscription.title": "File Transcription",
"fileTranscription.dropZone": "Drop audio/video file here",
"fileTranscription.dropZoneHint": "Supports MP3, WAV, M4A, MP4, MKV, WEBM",

View file

@ -40,12 +40,6 @@
"dashboard.backendLocal": "Local (Ollama)",
"dashboard.backendPremium": "Premium (Claude)",
"dashboard.loginRequired": "Inicio de sesión requerido",
"dashboard.premiumQuota": "Cuota Premium",
"dashboard.modelHaiku": "Haiku",
"dashboard.modelSonnet": "Sonnet",
"dashboard.modelOpus": "Opus",
"dashboard.quotaWeekly": "Semanal",
"dashboard.quotaDaily": "Diario",
"history.title": "Historial de transcripciones",
"history.search": "Buscar...",
"history.entries": "{{count}} entradas",

View file

@ -40,12 +40,6 @@
"dashboard.backendLocal": "Local (Ollama)",
"dashboard.backendPremium": "Premium (Claude)",
"dashboard.loginRequired": "Connexion requise",
"dashboard.premiumQuota": "Quota Premium",
"dashboard.modelHaiku": "Haiku",
"dashboard.modelSonnet": "Sonnet",
"dashboard.modelOpus": "Opus",
"dashboard.quotaWeekly": "Hebdomadaire",
"dashboard.quotaDaily": "Journalier",
"history.title": "Historique des transcriptions",
"history.search": "Rechercher...",
"history.entries": "{{count}} entrées",

View file

@ -40,12 +40,6 @@
"dashboard.backendLocal": "ローカル (Ollama)",
"dashboard.backendPremium": "プレミアム (Claude)",
"dashboard.loginRequired": "ログインが必要",
"dashboard.premiumQuota": "プレミアムクォータ",
"dashboard.modelHaiku": "Haiku",
"dashboard.modelSonnet": "Sonnet",
"dashboard.modelOpus": "Opus",
"dashboard.quotaWeekly": "週間",
"dashboard.quotaDaily": "日間",
"history.title": "文字起こし履歴",
"history.search": "検索...",
"history.entries": "{{count}}件",

View file

@ -40,12 +40,6 @@
"dashboard.backendLocal": "로컬 (Ollama)",
"dashboard.backendPremium": "프리미엄 (Claude)",
"dashboard.loginRequired": "로그인 필요",
"dashboard.premiumQuota": "프리미엄 쿼터",
"dashboard.modelHaiku": "Haiku",
"dashboard.modelSonnet": "Sonnet",
"dashboard.modelOpus": "Opus",
"dashboard.quotaWeekly": "주간",
"dashboard.quotaDaily": "일간",
"history.title": "전사 기록",
"history.search": "검색...",
"history.entries": "{{count}}건",
@ -284,24 +278,11 @@
"license.free": "FREE",
"license.pro": "PRO",
"license.proPlus": "PRO+",
"license.activate": "라이선스 활성화",
"license.deactivate": "비활성화",
"license.keyPlaceholder": "라이선스 키 입력...",
"license.activating": "활성화 중...",
"license.activated": "활성화 완료",
"license.activateError": "활성화 실패: {{message}}",
"license.deactivated": "비활성화 완료",
"license.machineId": "기기 ID",
"license.activatedAt": "활성화 일시",
"license.manageLicense": "라이선스 관리",
"license.subscribe": "구독하기",
"license.upgrade": "업그레이드",
"license.currentPlan": "현재 구독 중",
"license.proPlan": "Pro — ₩9,900/월",
"license.proPlusPlan": "Pro+ — ₩29,900/월",
"license.paymentPending": "결제 연동 준비 중 (Payple)",
"license.upgradeTitle": "Pro로 업그레이드",
"license.upgradeDesc": "모든 기능을 잠금 해제하세요",
"license.quotaUsed": "{{used}}/{{limit}} 사용",
"license.quotaUnlimited": "무제한",
"license.tierComparison": "등급 비교",
@ -341,7 +322,6 @@
"license.proPlus.required": "PRO+ 필요",
"license.included": "포함",
"license.notIncluded": "미포함",
"license.keyLabel": "라이선스 키",
"license.quotaExceeded.title": "오늘의 {{feature}}을(를) 모두 사용했습니다",
"license.quotaExceeded.desc": "Pro로 업그레이드하면 무제한으로 사용할 수 있습니다",
"license.tierRequired.title": "{{feature}}은(는) {{tier}} 기능입니다",
@ -361,6 +341,19 @@
"license.unlimited": "무제한",
"license.locked": "잠금",
"license.nav": "라이선스",
"license.signInRequired": "구독을 관리하려면 로그인하세요",
"license.signInToUpgrade": "로그인 후 업그레이드",
"license.subscriptionActive": "구독 활성",
"license.subscriptionManage": "구독 관리",
"license.upgradeToProDesc": "프리미엄 AI 모델, 클라우드 동기화 등 모든 기능을 사용하세요",
"license.currentPlanActive": "현재 구독 중",
"license.openBillingPage": "결제 페이지 열기",
"license.premiumQuota": "프리미엄 쿼터",
"license.modelHaiku": "Haiku",
"license.modelSonnet": "Sonnet",
"license.modelOpus": "Opus",
"license.quotaWeekly": "주간",
"license.quotaDaily": "일간",
"fileTranscription.title": "파일 전사",
"fileTranscription.dropZone": "오디오/비디오 파일을 여기에 드래그하세요",
"fileTranscription.dropZoneHint": "MP3, WAV, M4A, MP4, MKV, WEBM 지원",

View file

@ -40,12 +40,6 @@
"dashboard.backendLocal": "Local (Ollama)",
"dashboard.backendPremium": "Premium (Claude)",
"dashboard.loginRequired": "Login necessário",
"dashboard.premiumQuota": "Cota Premium",
"dashboard.modelHaiku": "Haiku",
"dashboard.modelSonnet": "Sonnet",
"dashboard.modelOpus": "Opus",
"dashboard.quotaWeekly": "Semanal",
"dashboard.quotaDaily": "Diário",
"history.title": "Histórico de transcrições",
"history.search": "Pesquisar...",
"history.entries": "{{count}} entradas",

View file

@ -40,12 +40,6 @@
"dashboard.backendLocal": "Локальный (Ollama)",
"dashboard.backendPremium": "Премиум (Claude)",
"dashboard.loginRequired": "Требуется вход",
"dashboard.premiumQuota": "Премиум квота",
"dashboard.modelHaiku": "Haiku",
"dashboard.modelSonnet": "Sonnet",
"dashboard.modelOpus": "Opus",
"dashboard.quotaWeekly": "Недельная",
"dashboard.quotaDaily": "Дневная",
"history.title": "История транскрипций",
"history.search": "Поиск...",
"history.entries": "{{count}} записей",

View file

@ -40,12 +40,6 @@
"dashboard.backendLocal": "ภายในเครื่อง (Ollama)",
"dashboard.backendPremium": "พรีเมียม (Claude)",
"dashboard.loginRequired": "ต้องเข้าสู่ระบบ",
"dashboard.premiumQuota": "โควต้าพรีเมียม",
"dashboard.modelHaiku": "Haiku",
"dashboard.modelSonnet": "Sonnet",
"dashboard.modelOpus": "Opus",
"dashboard.quotaWeekly": "รายสัปดาห์",
"dashboard.quotaDaily": "รายวัน",
"history.title": "ประวัติการถอดความ",
"history.search": "ค้นหา...",
"history.entries": "{{count}} รายการ",

View file

@ -40,12 +40,6 @@
"dashboard.backendLocal": "Cục bộ (Ollama)",
"dashboard.backendPremium": "Cao cấp (Claude)",
"dashboard.loginRequired": "Cần đăng nhập",
"dashboard.premiumQuota": "Hạn mức Premium",
"dashboard.modelHaiku": "Haiku",
"dashboard.modelSonnet": "Sonnet",
"dashboard.modelOpus": "Opus",
"dashboard.quotaWeekly": "Hàng tuần",
"dashboard.quotaDaily": "Hàng ngày",
"history.title": "Lịch sử phiên âm",
"history.search": "Tìm kiếm...",
"history.entries": "{{count}} mục",

View file

@ -40,12 +40,6 @@
"dashboard.backendLocal": "本機 (Ollama)",
"dashboard.backendPremium": "進階 (Claude)",
"dashboard.loginRequired": "需要登入",
"dashboard.premiumQuota": "進階配額",
"dashboard.modelHaiku": "Haiku",
"dashboard.modelSonnet": "Sonnet",
"dashboard.modelOpus": "Opus",
"dashboard.quotaWeekly": "每週",
"dashboard.quotaDaily": "每日",
"history.title": "轉錄歷史",
"history.search": "搜尋...",
"history.entries": "{{count}}筆",

View file

@ -40,12 +40,6 @@
"dashboard.backendLocal": "本地 (Ollama)",
"dashboard.backendPremium": "高级 (Claude)",
"dashboard.loginRequired": "需要登录",
"dashboard.premiumQuota": "高级配额",
"dashboard.modelHaiku": "Haiku",
"dashboard.modelSonnet": "Sonnet",
"dashboard.modelOpus": "Opus",
"dashboard.quotaWeekly": "每周",
"dashboard.quotaDaily": "每日",
"history.title": "转录历史",
"history.search": "搜索...",
"history.entries": "{{count}}条",