146 lines
4.8 KiB
JavaScript
146 lines
4.8 KiB
JavaScript
import { formatMoney, formatTrafficGb } from "./formatters.js";
|
|
|
|
export function planKey(plan) {
|
|
return (
|
|
plan?.id ||
|
|
`${plan?.tariff_key || "legacy"}:${plan?.sale_mode || "subscription"}:${plan?.months || plan?.traffic_gb || ""}`
|
|
);
|
|
}
|
|
|
|
export function buildTariffCatalog(planList) {
|
|
const byKey = new Map();
|
|
for (const plan of planList || []) {
|
|
const key = String(plan?.tariff_key || planKey(plan) || "").trim();
|
|
if (!key) continue;
|
|
const entry = byKey.get(key) || {
|
|
key,
|
|
title: plan?.tariff_name || plan?.title || key,
|
|
description: plan?.description || "",
|
|
billing_model:
|
|
plan?.billing_model ||
|
|
(plan?.sale_mode === "traffic_package" || plan?.sale_mode === "traffic"
|
|
? "traffic"
|
|
: "period"),
|
|
monthly_gb: Number(plan?.monthly_gb || 0),
|
|
traffic_packages: [],
|
|
plans_count: 0,
|
|
};
|
|
if (!entry.description && plan?.description) entry.description = plan.description;
|
|
if (!entry.monthly_gb && Number(plan?.monthly_gb || 0) > 0)
|
|
entry.monthly_gb = Number(plan.monthly_gb);
|
|
const trafficGb = Number(plan?.traffic_gb || 0);
|
|
if (trafficGb > 0) entry.traffic_packages.push(trafficGb);
|
|
entry.plans_count += 1;
|
|
byKey.set(key, entry);
|
|
}
|
|
return Array.from(byKey.values());
|
|
}
|
|
|
|
export function activeTariffName(sub, planList) {
|
|
const direct = String(sub?.tariff_name || "").trim();
|
|
if (direct) return direct;
|
|
const key = String(sub?.tariff_key || "").trim();
|
|
if (!key) return "";
|
|
const plan = (planList || []).find((item) => item?.tariff_key === key);
|
|
return String(plan?.tariff_name || plan?.title || key).trim();
|
|
}
|
|
|
|
export function priceLabel(plan, methodId = "") {
|
|
if (
|
|
String(methodId || "")
|
|
.toLowerCase()
|
|
.includes("stars") &&
|
|
Number(plan?.stars_price || 0) > 0
|
|
) {
|
|
return `${Number(plan.stars_price)} ⭐`;
|
|
}
|
|
return formatMoney(plan?.price || 0, plan?.currency);
|
|
}
|
|
|
|
export function tariffLimitLabel(tariff, { t }) {
|
|
if (!tariff) return "";
|
|
if (String(tariff.billing_model || "") === "traffic") {
|
|
const values = (tariff.traffic_packages || [])
|
|
.filter((value) => Number(value) > 0)
|
|
.sort((a, b) => a - b);
|
|
if (!values.length) return t("wa_tariff_model_traffic");
|
|
const min = values[0];
|
|
const max = values[values.length - 1];
|
|
return min === max ? formatTrafficGb(min) : `${formatTrafficGb(min)} - ${formatTrafficGb(max)}`;
|
|
}
|
|
if (Number(tariff.monthly_gb || 0) > 0) return formatTrafficGb(tariff.monthly_gb);
|
|
return t("wa_unlimited_traffic");
|
|
}
|
|
|
|
export function actionKey(action) {
|
|
return `${action?.mode || ""}:${action?.months || ""}:${action?.traffic_gb || ""}:${action?.price || ""}`;
|
|
}
|
|
|
|
function formatMonthsForClient(value, { t, termUnitLabel }) {
|
|
const months = Number(value || 0);
|
|
if (months === 12) return t("wa_plan_one_year");
|
|
return t("wa_sub_term_value_unit", {
|
|
value: String(months),
|
|
unit: termUnitLabel(months, "month"),
|
|
});
|
|
}
|
|
|
|
export function planDisplayTitle(plan, { trafficMode, t }) {
|
|
if (plan?.tariff_key) {
|
|
return plan?.tariff_name || plan?.title || plan?.tariff_key;
|
|
}
|
|
if (trafficMode || plan?.sale_mode === "traffic") {
|
|
return plan?.title || formatTrafficGb(plan?.traffic_gb || plan?.months);
|
|
}
|
|
const months = Number(plan?.months || 0);
|
|
if (months === 12) return t("wa_plan_one_year");
|
|
return plan?.title || "";
|
|
}
|
|
|
|
export function planSubtitle(plan, { t, termUnitLabel }) {
|
|
if (!plan?.tariff_key) return "";
|
|
if (plan?.subtitle) return plan.subtitle;
|
|
if (
|
|
plan?.sale_mode === "traffic_package" ||
|
|
plan?.sale_mode === "topup" ||
|
|
plan?.sale_mode === "premium_topup" ||
|
|
plan?.billing_model === "traffic"
|
|
) {
|
|
return formatTrafficGb(plan?.traffic_gb || plan?.months);
|
|
}
|
|
return formatMonthsForClient(plan?.months, { t, termUnitLabel });
|
|
}
|
|
|
|
export function planUnitHint(plan, { trafficMode, selectedMethod, t }) {
|
|
if (
|
|
trafficMode ||
|
|
plan?.sale_mode === "traffic" ||
|
|
plan?.sale_mode === "traffic_package" ||
|
|
plan?.sale_mode === "topup" ||
|
|
plan?.sale_mode === "premium_topup"
|
|
) {
|
|
const gb = Number(plan?.traffic_gb || plan?.months || 0);
|
|
if (!gb) return "";
|
|
if (
|
|
String(selectedMethod || "")
|
|
.toLowerCase()
|
|
.includes("stars") &&
|
|
Number(plan?.stars_price || 0) > 0
|
|
) {
|
|
return `${Number(plan.stars_price / gb).toFixed(0)} ⭐${t("wa_per_gb_short")}`;
|
|
}
|
|
return `${formatMoney(Number(plan?.price || 0) / gb, plan?.currency)}${t("wa_per_gb_short")}`;
|
|
}
|
|
const months = Number(plan?.months || 0);
|
|
if (!months || months <= 1) return "";
|
|
if (
|
|
String(selectedMethod || "")
|
|
.toLowerCase()
|
|
.includes("stars") &&
|
|
Number(plan?.stars_price || 0) > 0
|
|
) {
|
|
return `${Number(plan.stars_price / months).toFixed(0)} ⭐${t("wa_per_month_short")}`;
|
|
}
|
|
return `${formatMoney(Number(plan?.price || 0) / months, plan?.currency)}${t("wa_per_month_short")}`;
|
|
}
|