Files
remnawave-minishop/frontend/src/lib/webapp/tariffs.js
T

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")}`;
}