527 lines
15 KiB
JavaScript
527 lines
15 KiB
JavaScript
const WINDOWS_95_THEME = {
|
|
key: "windows95",
|
|
names: { ru: "Windows 95", en: "Windows 95" },
|
|
enabled: true,
|
|
default: false,
|
|
css_file: "style.css",
|
|
assets_version: 9,
|
|
tokens: {
|
|
color_scheme: "light",
|
|
style_preset: "win95",
|
|
},
|
|
};
|
|
|
|
const ASCII_THEME = {
|
|
key: "ascii",
|
|
names: { ru: "ASCII", en: "ASCII" },
|
|
enabled: true,
|
|
default: false,
|
|
css_file: "style.css",
|
|
tokens: {
|
|
color_scheme: "dark",
|
|
style_preset: "ascii",
|
|
},
|
|
};
|
|
|
|
export const DEV_MOCK = {
|
|
config: {
|
|
title: "/minishop",
|
|
primaryColor: "#00fe7a",
|
|
logoUrl: "",
|
|
logoUseEmoji: false,
|
|
logoEmoji: "🫥",
|
|
logoEmojiFont: "system",
|
|
faviconUrl: "",
|
|
faviconUseCustom: false,
|
|
apiBase: "/api",
|
|
adminJsAsset: "subscription_webapp_admin.js",
|
|
adminCssAsset: "subscription_webapp_admin.css",
|
|
supportUrl: "https://t.me/support",
|
|
privacyPolicyUrl: "https://example.com/privacy",
|
|
userAgreementUrl: "https://example.com/agreement",
|
|
currency: "RUB",
|
|
language: "ru",
|
|
emailAuthEnabled: true,
|
|
telegramLoginBotUsername: "preview_bot",
|
|
telegramLoginBotId: 1234567890,
|
|
telegramOAuthClientId: 1234567890,
|
|
telegramOAuthRequestAccess: ["write"],
|
|
appVersion: "dev+local",
|
|
appRepositoryUrl: "https://github.com/3252a8/remnawave-minishop",
|
|
themesCatalog: {
|
|
default_theme: "dark",
|
|
themes: [
|
|
{
|
|
key: "dark",
|
|
names: { ru: "Тёмная", en: "Dark" },
|
|
enabled: true,
|
|
default: true,
|
|
tokens: {
|
|
color_scheme: "dark",
|
|
accent: "#00fe7a",
|
|
bg: "#03070b",
|
|
panel: "#111820",
|
|
text: "#f2f7f4",
|
|
muted: "#a9b4b0",
|
|
},
|
|
},
|
|
{
|
|
key: "light",
|
|
names: { ru: "Светлая", en: "Light" },
|
|
enabled: true,
|
|
default: false,
|
|
css_file: "style.css",
|
|
tokens: {
|
|
color_scheme: "light",
|
|
},
|
|
},
|
|
WINDOWS_95_THEME,
|
|
ASCII_THEME,
|
|
],
|
|
},
|
|
},
|
|
data: {
|
|
ok: true,
|
|
user: {
|
|
id: 100200300,
|
|
username: "username",
|
|
email: "user@example.com",
|
|
email_verified: true,
|
|
password_auth_enabled: false,
|
|
telegram_id: 100200300,
|
|
telegram_linked: true,
|
|
telegram_photo_url: "",
|
|
first_name: "Preview",
|
|
language_code: "ru",
|
|
is_admin: true,
|
|
},
|
|
subscription: {
|
|
active: true,
|
|
status: "ACTIVE",
|
|
remaining_text: "25 д. 8 ч.",
|
|
end_date_text: "24.05.2026",
|
|
days_left: 25,
|
|
config_link: "https://sub.example.com/sub/preview-token",
|
|
connect_url: "https://sub.example.com/connect/preview-token",
|
|
traffic_used: "18.4 GB",
|
|
traffic_limit: "100 GB",
|
|
traffic_used_bytes: 19756849561,
|
|
traffic_limit_bytes: 107374182400,
|
|
premium_used: "32.0 GB",
|
|
premium_limit: "50.0 GB",
|
|
premium_used_bytes: 34359738368,
|
|
premium_limit_bytes: 53687091200,
|
|
premium_baseline_bytes: 53687091200,
|
|
premium_topup_balance_bytes: 0,
|
|
premium_is_limited: false,
|
|
premium_title: "Premium-серверы",
|
|
premium_node_labels: ["Premium NL-1", "Premium DE-1"],
|
|
can_topup_regular_traffic: true,
|
|
can_topup_premium_traffic: true,
|
|
max_devices: 5,
|
|
},
|
|
devices: {
|
|
ok: true,
|
|
enabled: true,
|
|
current_devices: 3,
|
|
max_devices: 5,
|
|
max_devices_label: "5",
|
|
devices: [
|
|
{
|
|
index: 1,
|
|
display_name: "iPhone 15 Pro",
|
|
platform_label: "iOS 18.4",
|
|
user_agent: "Streisand/1.6 CFNetwork",
|
|
created_at_text: "28.04.2026 16:12",
|
|
hwid_short: "A1B2C3D4...98FA01",
|
|
token: "preview-device-1",
|
|
can_disconnect: true,
|
|
},
|
|
{
|
|
index: 2,
|
|
display_name: "MacBook Air",
|
|
platform_label: "macOS 15.4",
|
|
user_agent: "Happ/3.1.0",
|
|
created_at_text: "29.04.2026 09:40",
|
|
hwid_short: "F0E1D2C3...44AB22",
|
|
token: "preview-device-2",
|
|
can_disconnect: true,
|
|
},
|
|
{
|
|
index: 3,
|
|
display_name: "Android Phone",
|
|
platform_label: "Android 15",
|
|
user_agent: "v2rayNG/1.9.35",
|
|
created_at_text: "30.04.2026 07:55",
|
|
hwid_short: "778899AA...BCDD10",
|
|
token: "preview-device-3",
|
|
can_disconnect: true,
|
|
},
|
|
],
|
|
},
|
|
plans: [
|
|
{ months: 1, price: 290, currency: "RUB", title: "1 месяц" },
|
|
{ months: 3, price: 790, currency: "RUB", title: "3 месяца" },
|
|
{ months: 6, price: 1490, currency: "RUB", title: "6 месяцев" },
|
|
{ months: 12, price: 2690, currency: "RUB", title: "12 месяцев" },
|
|
],
|
|
payment_methods: [
|
|
{ id: "yookassa", name: "Карта", icon: "CreditCard" },
|
|
{ id: "platega_sbp", name: "Telegram Pay", icon: "CreditCard" },
|
|
{ id: "cryptopay", name: "Криптовалюта", icon: "Bitcoin" },
|
|
{ id: "freekassa", name: "Другие способы", icon: "Smartphone" },
|
|
],
|
|
referral: {
|
|
code: "ABCD1234",
|
|
bot_link: "https://t.me/preview_bot?start=ref_uABCD1234",
|
|
webapp_link: "https://minishop.app/ref/ABCD1234",
|
|
invited_count: 4,
|
|
purchased_count: 2,
|
|
welcome_bonus_days: 3,
|
|
one_bonus_per_referee: false,
|
|
bonus_details: [
|
|
{ months: 1, title: "1 месяц", inviter_days: 14, friend_days: 7 },
|
|
{ months: 3, title: "3 месяца", inviter_days: 21, friend_days: 14 },
|
|
{ months: 6, title: "6 месяцев", inviter_days: 31, friend_days: 21 },
|
|
{ months: 12, title: "12 месяцев", inviter_days: 62, friend_days: 31 },
|
|
],
|
|
},
|
|
themes_catalog: {
|
|
default_theme: "dark",
|
|
themes: [
|
|
{
|
|
key: "dark",
|
|
names: { ru: "Тёмная", en: "Dark" },
|
|
enabled: true,
|
|
tokens: {
|
|
color_scheme: "dark",
|
|
accent: "#00fe7a",
|
|
bg: "#03070b",
|
|
panel: "#111820",
|
|
text: "#f2f7f4",
|
|
muted: "#a9b4b0",
|
|
},
|
|
},
|
|
{
|
|
key: "light",
|
|
names: { ru: "Светлая", en: "Light" },
|
|
enabled: true,
|
|
css_file: "style.css",
|
|
tokens: {
|
|
color_scheme: "light",
|
|
},
|
|
},
|
|
WINDOWS_95_THEME,
|
|
ASCII_THEME,
|
|
],
|
|
},
|
|
settings: {
|
|
support_url: "https://t.me/support",
|
|
traffic_mode: false,
|
|
my_devices_enabled: false,
|
|
user_hwid_device_limit: 5,
|
|
trial_enabled: true,
|
|
trial_available: true,
|
|
trial_duration_days: 5,
|
|
trial_traffic_limit_gb: 10,
|
|
trial_traffic_strategy: "NO_RESET",
|
|
subscription_purchase_description:
|
|
"Покупая или продлевая подписку, вы получаете доступ к VPN/прокси-сервису, который помогает защищать ваше соединение и поддерживать стабильный доступ к сети.",
|
|
email_auth_enabled: true,
|
|
},
|
|
},
|
|
};
|
|
|
|
export function applyPreviewMock(kind) {
|
|
const mode = String(kind || "")
|
|
.trim()
|
|
.toLowerCase();
|
|
|
|
const themeKeys = new Set((DEV_MOCK.config.themesCatalog.themes || []).map((theme) => theme.key));
|
|
if (themeKeys.has(mode)) {
|
|
DEV_MOCK.config.themesCatalog.default_theme = mode;
|
|
DEV_MOCK.data.themes_catalog.default_theme = mode;
|
|
for (const theme of DEV_MOCK.config.themesCatalog.themes || []) {
|
|
theme.default = theme.key === mode;
|
|
}
|
|
for (const theme of DEV_MOCK.data.themes_catalog.themes || []) {
|
|
theme.default = theme.key === mode;
|
|
}
|
|
return;
|
|
}
|
|
|
|
if (mode === "traffic") {
|
|
DEV_MOCK.data.settings.traffic_mode = true;
|
|
DEV_MOCK.data.settings.trial_available = false;
|
|
DEV_MOCK.data.subscription = {
|
|
...DEV_MOCK.data.subscription,
|
|
active: true,
|
|
status: "ACTIVE",
|
|
remaining_text: "Навсегда",
|
|
end_date_text: "01.01.2099 00:00",
|
|
days_left: 26000,
|
|
traffic_used: "18.4 GB",
|
|
traffic_limit: "100 GB",
|
|
traffic_used_bytes: 19756849561,
|
|
traffic_limit_bytes: 107374182400,
|
|
traffic_limit_strategy: "NO_RESET",
|
|
};
|
|
DEV_MOCK.data.plans = [
|
|
{
|
|
months: 10,
|
|
traffic_gb: 10,
|
|
price: 199,
|
|
currency: "RUB",
|
|
title: "10 GB",
|
|
sale_mode: "traffic",
|
|
},
|
|
{
|
|
months: 50,
|
|
traffic_gb: 50,
|
|
price: 799,
|
|
currency: "RUB",
|
|
title: "50 GB",
|
|
sale_mode: "traffic",
|
|
},
|
|
{
|
|
months: 100,
|
|
traffic_gb: 100,
|
|
price: 1390,
|
|
currency: "RUB",
|
|
title: "100 GB",
|
|
sale_mode: "traffic",
|
|
},
|
|
{
|
|
months: 300,
|
|
traffic_gb: 300,
|
|
price: 3490,
|
|
currency: "RUB",
|
|
title: "300 GB",
|
|
sale_mode: "traffic",
|
|
},
|
|
];
|
|
} else if (mode === "tariffs") {
|
|
DEV_MOCK.data.settings.traffic_mode = false;
|
|
DEV_MOCK.data.subscription = {
|
|
...DEV_MOCK.data.subscription,
|
|
tariff_key: "standard",
|
|
tariff_name: "Стандарт",
|
|
tariff_description: "100 GB каждый месяц",
|
|
billing_model: "period",
|
|
traffic_limit_strategy: "MONTH",
|
|
};
|
|
DEV_MOCK.data.plans = [
|
|
{
|
|
id: "standard:period:1",
|
|
tariff_key: "standard",
|
|
tariff_name: "Стандарт",
|
|
billing_model: "period",
|
|
sale_mode: "subscription",
|
|
months: 1,
|
|
price: 150,
|
|
currency: "RUB",
|
|
title: "Стандарт",
|
|
subtitle: "1 месяц",
|
|
description: "100 GB каждый месяц",
|
|
monthly_gb: 100,
|
|
},
|
|
{
|
|
id: "standard:period:3",
|
|
tariff_key: "standard",
|
|
tariff_name: "Стандарт",
|
|
billing_model: "period",
|
|
sale_mode: "subscription",
|
|
months: 3,
|
|
price: 400,
|
|
currency: "RUB",
|
|
title: "Стандарт",
|
|
subtitle: "3 месяца",
|
|
description: "100 GB каждый месяц",
|
|
monthly_gb: 100,
|
|
},
|
|
{
|
|
id: "business:period:1",
|
|
tariff_key: "business",
|
|
tariff_name: "Бизнес",
|
|
billing_model: "period",
|
|
sale_mode: "subscription",
|
|
months: 1,
|
|
price: 350,
|
|
currency: "RUB",
|
|
title: "Бизнес",
|
|
subtitle: "1 месяц",
|
|
description: "300 GB и приоритетные серверы",
|
|
monthly_gb: 300,
|
|
},
|
|
{
|
|
id: "traffic:traffic:50",
|
|
tariff_key: "traffic",
|
|
tariff_name: "Трафик",
|
|
billing_model: "traffic",
|
|
sale_mode: "traffic_package",
|
|
months: 50,
|
|
traffic_gb: 50,
|
|
price: 799,
|
|
currency: "RUB",
|
|
title: "Трафик",
|
|
subtitle: "50 GB",
|
|
description: "Пакет без срока действия",
|
|
},
|
|
];
|
|
DEV_MOCK.data.tariff_change_options = {
|
|
ok: true,
|
|
current: {
|
|
tariff_key: "standard",
|
|
title: "Стандарт",
|
|
description: "100 GB каждый месяц",
|
|
billing_model: "period",
|
|
},
|
|
targets: [
|
|
{
|
|
tariff_key: "business",
|
|
title: "Бизнес",
|
|
description: "300 GB и приоритетные серверы",
|
|
billing_model: "period",
|
|
monthly_gb: 300,
|
|
actions: [
|
|
{
|
|
mode: "recalc_days",
|
|
kind: "free",
|
|
title: "recalc_days",
|
|
days_after: 10,
|
|
remaining_days: 25,
|
|
},
|
|
{ mode: "paid_diff", kind: "payment", title: "paid_diff", price: 190, currency: "RUB" },
|
|
],
|
|
},
|
|
{
|
|
tariff_key: "traffic",
|
|
title: "Трафик",
|
|
description: "Пакеты без срока действия",
|
|
billing_model: "traffic",
|
|
actions: [
|
|
{
|
|
mode: "convert_days_to_gb",
|
|
kind: "free",
|
|
title: "convert_days_to_gb",
|
|
converted_gb: 18,
|
|
remaining_days: 25,
|
|
},
|
|
{
|
|
mode: "buy_package",
|
|
kind: "payment",
|
|
title: "+50 GB",
|
|
traffic_gb: 50,
|
|
price: 799,
|
|
currency: "RUB",
|
|
},
|
|
],
|
|
},
|
|
],
|
|
};
|
|
DEV_MOCK.data.topup_options = {
|
|
ok: true,
|
|
tariff_key: "standard",
|
|
tariff_name: "Стандарт",
|
|
traffic_percent: 86,
|
|
warning_levels: [85, 90, 95],
|
|
plans: [
|
|
{
|
|
id: "standard:topup:10",
|
|
tariff_key: "standard",
|
|
tariff_name: "Стандарт",
|
|
sale_mode: "topup",
|
|
traffic_gb: 10,
|
|
months: 10,
|
|
price: 99,
|
|
currency: "RUB",
|
|
title: "10 GB",
|
|
subtitle: "Стандарт",
|
|
},
|
|
{
|
|
id: "standard:topup:50",
|
|
tariff_key: "standard",
|
|
tariff_name: "Стандарт",
|
|
sale_mode: "topup",
|
|
traffic_gb: 50,
|
|
months: 50,
|
|
price: 399,
|
|
currency: "RUB",
|
|
title: "50 GB",
|
|
subtitle: "Стандарт",
|
|
},
|
|
{
|
|
id: "standard:topup:200",
|
|
tariff_key: "standard",
|
|
tariff_name: "Стандарт",
|
|
sale_mode: "topup",
|
|
traffic_gb: 200,
|
|
months: 200,
|
|
price: 1299,
|
|
currency: "RUB",
|
|
title: "200 GB",
|
|
subtitle: "Стандарт",
|
|
},
|
|
],
|
|
};
|
|
DEV_MOCK.data.device_topup_options = {
|
|
ok: true,
|
|
tariff_key: "standard",
|
|
tariff_name: "Стандарт",
|
|
current_limit: 5,
|
|
plans: [
|
|
{
|
|
id: "standard:hwid:1",
|
|
tariff_key: "standard",
|
|
tariff_name: "Стандарт",
|
|
sale_mode: "hwid_devices",
|
|
device_count: 1,
|
|
months: 1,
|
|
price: 99,
|
|
currency: "RUB",
|
|
title: "+1",
|
|
subtitle: "Стандарт",
|
|
},
|
|
{
|
|
id: "standard:hwid:3",
|
|
tariff_key: "standard",
|
|
tariff_name: "Стандарт",
|
|
sale_mode: "hwid_devices",
|
|
device_count: 3,
|
|
months: 3,
|
|
price: 249,
|
|
currency: "RUB",
|
|
title: "+3",
|
|
subtitle: "Стандарт",
|
|
},
|
|
],
|
|
};
|
|
} else if (mode === "devices") {
|
|
DEV_MOCK.data.settings.my_devices_enabled = true;
|
|
DEV_MOCK.data.subscription = {
|
|
...DEV_MOCK.data.subscription,
|
|
active: true,
|
|
max_devices: 5,
|
|
};
|
|
} else if (mode === "trial") {
|
|
DEV_MOCK.data.settings.traffic_mode = false;
|
|
DEV_MOCK.data.settings.trial_enabled = true;
|
|
DEV_MOCK.data.settings.trial_available = true;
|
|
DEV_MOCK.data.settings.trial_duration_days = 5;
|
|
DEV_MOCK.data.settings.trial_traffic_limit_gb = 10;
|
|
DEV_MOCK.data.subscription = {
|
|
active: false,
|
|
status: "INACTIVE",
|
|
remaining_text: "Подписка не активна",
|
|
end_date_text: "",
|
|
days_left: 0,
|
|
config_link: null,
|
|
connect_url: null,
|
|
traffic_used: "0 B",
|
|
traffic_limit: "10 GB",
|
|
traffic_used_bytes: 0,
|
|
traffic_limit_bytes: 10737418240,
|
|
};
|
|
}
|
|
}
|