55 lines
1.6 KiB
TypeScript
55 lines
1.6 KiB
TypeScript
import { PLANS, type PlanId } from "./usageMeter";
|
||
|
||
export type PlanRightsCopy = {
|
||
headline: string;
|
||
/** 比價卡上 4~5 條短權益 */
|
||
bullets: string[];
|
||
/** 結帳頁:你會得到 */
|
||
rights: string[];
|
||
/** 結帳頁:額度 */
|
||
quota: string[];
|
||
notes: string[];
|
||
};
|
||
|
||
type TFn = (key: string, params?: Record<string, string | number>) => string;
|
||
|
||
/** 購買/比價用文案(用量首頁不堆字)— 由 i18n keys 組成 */
|
||
export function getPlanRights(id: PlanId, t: TFn): PlanRightsCopy {
|
||
const p = PLANS[id];
|
||
const caps = {
|
||
copy: p.soft_caps.ai_copy,
|
||
research: p.soft_caps.ai_research,
|
||
search: p.soft_caps.web_search,
|
||
image: p.soft_caps.ai_image,
|
||
};
|
||
return {
|
||
headline: t(`plan.${id}.headline`),
|
||
bullets: [
|
||
t(`plan.${id}.bullet1`, { n: p.monthly_credits }),
|
||
t(`plan.${id}.bullet2`),
|
||
t(`plan.${id}.bullet3`),
|
||
t(`plan.${id}.bullet4`),
|
||
],
|
||
rights: [
|
||
t(`plan.${id}.right1`),
|
||
t(`plan.${id}.right2`),
|
||
t(`plan.${id}.right3`),
|
||
],
|
||
quota: [
|
||
t(`plan.${id}.quota1`, { n: p.monthly_credits, price: p.price_label }),
|
||
t(`plan.${id}.quota2`, caps),
|
||
],
|
||
notes: [t(`plan.${id}.note1`), t(`plan.${id}.note2`)],
|
||
};
|
||
}
|
||
|
||
export function planCtaLabel(current: PlanId, target: PlanId, t: TFn): string {
|
||
if (current === target) return t("plan.cta.current");
|
||
const order: PlanId[] = ["free", "starter", "pro"];
|
||
const a = order.indexOf(current);
|
||
const b = order.indexOf(target);
|
||
if (b > a) return t("plan.cta.upgrade");
|
||
if (b < a) return t("plan.cta.downgrade");
|
||
return t("plan.cta.switch");
|
||
}
|