Files
bedolaga-cabinet/src/components/admin/constants.ts
Fringg 4b982175d7 feat(payments): способ оплаты cisPay
Регистрация нового провайдера пополнения (api.cispay.app, карта и СБП)
во фронтенде: метка в METHOD_LABELS, иконка, узел настроек
payments_cispay и локали ru/en/zh/fa.

Бэкенд отдаёт метод динамически, поэтому страницы статистики и транзакций
подхватывают его автоматически через METHOD_LABELS и PaymentMethodIcon.
2026-07-19 17:38:32 +03:00

298 lines
8.9 KiB
TypeScript

import { ThemeColors, DEFAULT_THEME_COLORS } from '../../types/theme';
// Tree sidebar types
export interface TreeSubItem {
id: string;
categories: string[];
}
export interface TreeGroup {
id: string;
icon: string;
children: TreeSubItem[];
}
export interface SpecialItem {
id: string;
icon?: string;
iconType?: 'star' | null;
}
export interface SettingsTreeConfig {
specialItems: SpecialItem[];
groups: TreeGroup[];
}
// Hierarchical settings tree — all 61 backend category keys mapped into 7 groups
export const SETTINGS_TREE: SettingsTreeConfig = {
specialItems: [
{ id: 'favorites', iconType: 'star' },
{ id: 'branding', icon: '🎨' },
{ id: 'theme', icon: '🌈' },
{ id: 'analytics', icon: '📊' },
{ id: 'buttons', icon: '📱' },
],
groups: [
{
id: 'payments',
icon: '💳',
children: [
{ id: 'payments_general', categories: ['PAYMENT', 'PAYMENT_VERIFICATION'] },
{ id: 'payments_stars', categories: ['TELEGRAM'] },
{ id: 'payments_yookassa', categories: ['YOOKASSA'] },
{ id: 'payments_cryptobot', categories: ['CRYPTOBOT'] },
{ id: 'payments_cloudpayments', categories: ['CLOUDPAYMENTS'] },
{ id: 'payments_freekassa', categories: ['FREEKASSA'] },
{ id: 'payments_kassa_ai', categories: ['KASSA_AI'] },
{ id: 'payments_platega', categories: ['PLATEGA'] },
{ id: 'payments_pal24', categories: ['PAL24'] },
{ id: 'payments_heleket', categories: ['HELEKET'] },
{ id: 'payments_mulenpay', categories: ['MULENPAY'] },
{ id: 'payments_tribute', categories: ['TRIBUTE'] },
{ id: 'payments_wata', categories: ['WATA'] },
{ id: 'payments_riopay', categories: ['RIOPAY'] },
{ id: 'payments_severpay', categories: ['SEVERPAY'] },
{ id: 'payments_paypear', categories: ['PAYPEAR'] },
{ id: 'payments_rollypay', categories: ['ROLLYPAY'] },
{ id: 'payments_aurapay', categories: ['AURAPAY'] },
{ id: 'payments_etoplatezhi', categories: ['ETOPLATEZHI'] },
{ id: 'payments_antilopay', categories: ['ANTILOPAY'] },
{ id: 'payments_jupiter', categories: ['JUPITER'] },
{ id: 'payments_cispay', categories: ['CISPAY'] },
{ id: 'payments_donut', categories: ['DONUT'] },
{ id: 'payments_lava', categories: ['LAVA'] },
{ id: 'payments_apple_iap', categories: ['APPLE_IAP'] },
],
},
{
id: 'subscriptions',
icon: '📦',
children: [
{ id: 'subs_core', categories: ['SUBSCRIPTIONS_CORE'] },
{ id: 'subs_trial', categories: ['TRIAL'] },
{ id: 'subs_pricing', categories: ['SUBSCRIPTION_PRICES'] },
{ id: 'subs_periods', categories: ['PERIODS'] },
{ id: 'subs_traffic', categories: ['TRAFFIC', 'TRAFFIC_PACKAGES'] },
{ id: 'subs_simple', categories: ['SIMPLE_SUBSCRIPTION'] },
{ id: 'subs_autopay', categories: ['AUTOPAY'] },
],
},
{
id: 'interface',
icon: '🖥️',
children: [
{
id: 'iface_general',
categories: ['INTERFACE', 'INTERFACE_BRANDING', 'INTERFACE_SUBSCRIPTION'],
},
{ id: 'iface_connect', categories: ['CONNECT_BUTTON'] },
{ id: 'iface_miniapp', categories: ['MINIAPP'] },
{ id: 'iface_happ', categories: ['HAPP'] },
{ id: 'iface_widget', categories: ['TELEGRAM_WIDGET'] },
{ id: 'iface_oidc', categories: ['TELEGRAM_OIDC'] },
{ id: 'iface_skip', categories: ['SKIP'] },
{ id: 'iface_additional', categories: ['ADDITIONAL'] },
],
},
{
id: 'users',
icon: '👥',
children: [
{ id: 'users_support', categories: ['SUPPORT'] },
{ id: 'users_referral', categories: ['REFERRAL'] },
{ id: 'users_channel', categories: ['CHANNEL'] },
{ id: 'users_localization', categories: ['LOCALIZATION', 'TIMEZONE'] },
{ id: 'users_moderation', categories: ['MODERATION', 'BAN_NOTIFICATIONS'] },
],
},
{
id: 'notifications',
icon: '🔔',
children: [
{ id: 'notif_user', categories: ['NOTIFICATIONS', 'WEBHOOK_NOTIFICATIONS'] },
{ id: 'notif_admin', categories: ['ADMIN_NOTIFICATIONS'] },
{ id: 'notif_reports', categories: ['ADMIN_REPORTS'] },
],
},
{
id: 'database',
icon: '🗄️',
children: [
{ id: 'db_general', categories: ['DATABASE'] },
{ id: 'db_postgres', categories: ['POSTGRES'] },
{ id: 'db_sqlite', categories: ['SQLITE'] },
{ id: 'db_redis', categories: ['REDIS'] },
],
},
{
id: 'system',
icon: '⚙️',
children: [
{ id: 'sys_core', categories: ['CORE', 'DEBUG'] },
{ id: 'sys_remnawave', categories: ['REMNAWAVE'] },
{ id: 'sys_webapi', categories: ['WEB_API', 'EXTERNAL_ADMIN'] },
{ id: 'sys_webhook', categories: ['WEBHOOK'] },
{ id: 'sys_server', categories: ['SERVER_STATUS'] },
{ id: 'sys_monitoring', categories: ['MONITORING'] },
{ id: 'sys_maintenance', categories: ['MAINTENANCE'] },
{ id: 'sys_backup', categories: ['BACKUP'] },
{ id: 'sys_version', categories: ['VERSION'] },
{ id: 'sys_logging', categories: ['LOG'] },
],
},
],
};
// Helper: find which group and sub-item a backend category key belongs to
export function findTreeLocation(
categoryKey: string,
): { groupId: string; subItemId: string } | null {
for (const group of SETTINGS_TREE.groups) {
for (const child of group.children) {
if (child.categories.includes(categoryKey)) {
return { groupId: group.id, subItemId: child.id };
}
}
}
return null;
}
// Helper: get all backend category keys for a given sub-item id
export function getCategoriesForSubItem(subItemId: string): string[] {
for (const group of SETTINGS_TREE.groups) {
const child = group.children.find((c) => c.id === subItemId);
if (child) return child.categories;
}
return [];
}
// Theme preset type
export interface ThemePreset {
id: string;
colors: ThemeColors;
}
// Theme presets
export const THEME_PRESETS: ThemePreset[] = [
{ id: 'standard', colors: DEFAULT_THEME_COLORS },
{
id: 'ocean',
colors: {
accent: '#0ea5e9',
darkBackground: '#0c1222',
darkSurface: '#1e293b',
darkText: '#f1f5f9',
darkTextSecondary: '#94a3b8',
lightBackground: '#e0f2fe',
lightSurface: '#f0f9ff',
lightText: '#0c4a6e',
lightTextSecondary: '#0369a1',
success: '#22c55e',
warning: '#f59e0b',
error: '#ef4444',
},
},
{
id: 'forest',
colors: {
accent: '#22c55e',
darkBackground: '#0a1a0f',
darkSurface: '#14532d',
darkText: '#f0fdf4',
darkTextSecondary: '#86efac',
lightBackground: '#dcfce7',
lightSurface: '#f0fdf4',
lightText: '#14532d',
lightTextSecondary: '#166534',
success: '#22c55e',
warning: '#f59e0b',
error: '#ef4444',
},
},
{
id: 'sunset',
colors: {
accent: '#f97316',
darkBackground: '#1c1009',
darkSurface: '#2d1a0e',
darkText: '#fff7ed',
darkTextSecondary: '#fdba74',
lightBackground: '#ffedd5',
lightSurface: '#fff7ed',
lightText: '#7c2d12',
lightTextSecondary: '#c2410c',
success: '#22c55e',
warning: '#f59e0b',
error: '#ef4444',
},
},
{
id: 'violet',
colors: {
accent: '#a855f7',
darkBackground: '#0f0a1a',
darkSurface: '#1e1b2e',
darkText: '#faf5ff',
darkTextSecondary: '#c4b5fd',
lightBackground: '#f3e8ff',
lightSurface: '#faf5ff',
lightText: '#581c87',
lightTextSecondary: '#7e22ce',
success: '#22c55e',
warning: '#f59e0b',
error: '#ef4444',
},
},
{
id: 'rose',
colors: {
accent: '#f43f5e',
darkBackground: '#1a0a10',
darkSurface: '#2d1520',
darkText: '#fff1f2',
darkTextSecondary: '#fda4af',
lightBackground: '#ffe4e6',
lightSurface: '#fff1f2',
lightText: '#881337',
lightTextSecondary: '#be123c',
success: '#22c55e',
warning: '#f59e0b',
error: '#ef4444',
},
},
{
id: 'midnight',
colors: {
accent: '#6366f1',
darkBackground: '#030712',
darkSurface: '#111827',
darkText: '#f9fafb',
darkTextSecondary: '#9ca3af',
lightBackground: '#e5e7eb',
lightSurface: '#f3f4f6',
lightText: '#111827',
lightTextSecondary: '#4b5563',
success: '#22c55e',
warning: '#f59e0b',
error: '#ef4444',
},
},
{
id: 'turquoise',
colors: {
accent: '#14b8a6',
darkBackground: '#0a1614',
darkSurface: '#134e4a',
darkText: '#f0fdfa',
darkTextSecondary: '#5eead4',
lightBackground: '#ccfbf1',
lightSurface: '#f0fdfa',
lightText: '#134e4a',
lightTextSecondary: '#0f766e',
success: '#22c55e',
warning: '#f59e0b',
error: '#ef4444',
},
},
];