const WINDOWS_95_THEME = { key: "windows95", names: { ru: "Windows 95", en: "Windows 95" }, enabled: true, default: false, css_file: "style.css", 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", 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, 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", 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, }; } }