140 lines
4.6 KiB
TypeScript
140 lines
4.6 KiB
TypeScript
import api from './api';
|
||
|
||
// Интерфейсы для настроек
|
||
export interface SiteSetting {
|
||
key: string;
|
||
value: any;
|
||
description?: string;
|
||
}
|
||
|
||
export interface StoreSetting {
|
||
site_name: string;
|
||
site_description: string;
|
||
contact_email: string;
|
||
contact_phone?: string;
|
||
address?: string;
|
||
social_links?: {
|
||
facebook?: string;
|
||
instagram?: string;
|
||
twitter?: string;
|
||
youtube?: string;
|
||
};
|
||
currency: string;
|
||
currency_symbol: string;
|
||
default_language: string;
|
||
available_languages: string[];
|
||
logo_url?: string;
|
||
favicon_url?: string;
|
||
primary_color?: string;
|
||
secondary_color?: string;
|
||
shipping_methods: Array<{
|
||
id: string;
|
||
name: string;
|
||
description?: string;
|
||
price: number;
|
||
is_default?: boolean;
|
||
}>;
|
||
payment_methods: Array<{
|
||
id: string;
|
||
name: string;
|
||
description?: string;
|
||
is_default?: boolean;
|
||
}>;
|
||
}
|
||
|
||
export interface LocaleData {
|
||
[key: string]: string | LocaleData;
|
||
}
|
||
|
||
// Сервис для работы с настройками магазина
|
||
const settingsService = {
|
||
// Получить настройки магазина
|
||
getStoreSettings: async (): Promise<StoreSetting | null> => {
|
||
try {
|
||
const response = await api.get<StoreSetting>('/settings/store');
|
||
return response as StoreSetting;
|
||
} catch (error) {
|
||
console.error('Ошибка при получении настроек магазина:', error);
|
||
return null;
|
||
}
|
||
},
|
||
|
||
// Обновить настройки магазина (только для админов)
|
||
updateStoreSettings: async (settings: Partial<StoreSetting>): Promise<StoreSetting | null> => {
|
||
try {
|
||
const response = await api.put<StoreSetting>('/settings/store', settings);
|
||
return response as StoreSetting;
|
||
} catch (error) {
|
||
console.error('Ошибка при обновлении настроек магазина:', error);
|
||
return null;
|
||
}
|
||
},
|
||
|
||
// Получить все настройки по группе
|
||
getSettingsByGroup: async (group: string): Promise<SiteSetting[] | null> => {
|
||
try {
|
||
const response = await api.get<SiteSetting[]>(`/settings/${group}`);
|
||
return response as SiteSetting[];
|
||
} catch (error) {
|
||
console.error(`Ошибка при получении настроек группы ${group}:`, error);
|
||
return null;
|
||
}
|
||
},
|
||
|
||
// Получить настройку по ключу
|
||
getSettingByKey: async (key: string): Promise<SiteSetting | null> => {
|
||
try {
|
||
const response = await api.get<SiteSetting>(`/settings/key/${key}`);
|
||
return response as SiteSetting;
|
||
} catch (error) {
|
||
console.error(`Ошибка при получении настройки ${key}:`, error);
|
||
return null;
|
||
}
|
||
},
|
||
|
||
// Обновить настройку (только для админов)
|
||
updateSetting: async (key: string, value: any): Promise<SiteSetting | null> => {
|
||
try {
|
||
const response = await api.put<SiteSetting>(`/settings/key/${key}`, { value });
|
||
return response as SiteSetting;
|
||
} catch (error) {
|
||
console.error(`Ошибка при обновлении настройки ${key}:`, error);
|
||
return null;
|
||
}
|
||
},
|
||
|
||
// Получить данные локализации для указанного языка
|
||
getLocale: async (lang: string): Promise<LocaleData | null> => {
|
||
try {
|
||
const response = await api.get<LocaleData>(`/settings/locales/${lang}`);
|
||
return response as LocaleData;
|
||
} catch (error) {
|
||
console.error(`Ошибка при получении локализации для языка ${lang}:`, error);
|
||
return null;
|
||
}
|
||
},
|
||
|
||
// Получить список доступных языков
|
||
getAvailableLanguages: async (): Promise<string[] | null> => {
|
||
try {
|
||
const response = await api.get<string[]>('/settings/languages');
|
||
return response as string[];
|
||
} catch (error) {
|
||
console.error('Ошибка при получении списка доступных языков:', error);
|
||
return null;
|
||
}
|
||
},
|
||
|
||
// Форматирование цены с использованием правильной валюты
|
||
formatPrice: (price: number, settings?: StoreSetting): string => {
|
||
const defaultCurrency = settings?.currency_symbol || '₽';
|
||
|
||
// Форматируем число с двумя десятичными знаками
|
||
const formattedPrice = price.toFixed(2).replace(/\.00$/, '');
|
||
|
||
// Возвращаем форматированную цену с символом валюты
|
||
return `${formattedPrice} ${defaultCurrency}`;
|
||
}
|
||
};
|
||
|
||
export default settingsService;
|