feat: enhance billing error handling and upgrade prompts

- Updated error codes in the error-codes enum to better reflect billing scenarios, introducing BILLING_PLAN_QUOTA_EXCEEDED and BILLING_STORAGE_QUOTA_EXCEEDED.
- Modified the PhotoAssetService and BillingPlanService to throw specific BizExceptions for storage and plan quota exceedances.
- Implemented a new BillingUpgradeModal to prompt users for upgrades based on error categories.
- Enhanced error handling in photo upload and sync actions to present upgrade prompts when necessary.
- Updated localization files to include new strings for upgrade prompts in both English and Chinese.

Signed-off-by: Innei <tukon479@gmail.com>
This commit is contained in:
Innei
2025-12-10 15:36:52 +08:00
parent 883fd37e53
commit 9229ad63dd
11 changed files with 269 additions and 24 deletions

View File

@@ -549,6 +549,10 @@
"plan.toast.missing-portal-account": "Subscription account not found. Please try again later.",
"plan.toast.missing-portal-url": "Portal link is unavailable. Please try again later.",
"plan.toast.portal-failure": "Unable to open subscription portal. Please try again later.",
"plan.upgrade-modal.action.later": "Maybe later",
"plan.upgrade-modal.action.upgrade": "Go to plans",
"plan.upgrade-modal.description": "Uploads and sync need a higher subscription. Upgrade your plan to continue.",
"plan.upgrade-modal.title": "Upgrade required",
"schema-form.secret.helper": "For security, provide a new value only when updating.",
"schema-form.secret.hide": "Hide",
"schema-form.secret.show": "Show",

View File

@@ -497,6 +497,10 @@
"plan.toast.missing-portal-account": "找不到订阅账户,请稍后再试。",
"plan.toast.missing-portal-url": "Creem 未返回订阅管理地址,请稍后再试。",
"plan.toast.portal-failure": "无法打开订阅管理,请稍后再试。",
"plan.upgrade-modal.action.later": "稍后再说",
"plan.upgrade-modal.action.upgrade": "去升级",
"plan.upgrade-modal.description": "当前上传或同步已触达套餐上限,请前往订阅页面升级后继续。",
"plan.upgrade-modal.title": "升级订阅以继续",
"schema-form.secret.helper": "出于安全考虑,仅在更新时填写新的值。",
"schema-form.secret.hide": "隐藏",
"schema-form.secret.show": "显示",