155 lines
3.9 KiB
JavaScript
155 lines
3.9 KiB
JavaScript
import {defineStore} from "pinia";
|
|
import {apiGet, apiPost} from "@/utils/http.js";
|
|
import {toastBus} from "@/utils/toastHelper.js";
|
|
import {md5} from "js-md5";
|
|
|
|
export const useSettingsStore = defineStore('settings', {
|
|
state: () => ({
|
|
isLoading: false,
|
|
error: null,
|
|
originalItemsHash: null,
|
|
|
|
items: {
|
|
app: {
|
|
app_enabled: true,
|
|
app_name: '',
|
|
app_icon: null,
|
|
theme_light: 'light',
|
|
theme_dark: 'dark',
|
|
app_debug: false,
|
|
privacy_policy_link: null,
|
|
image_aspect_ratio: '1:1',
|
|
image_crop_algorithm: 'cover',
|
|
},
|
|
|
|
telegram: {
|
|
mini_app_url: '',
|
|
bot_token: '',
|
|
chat_id: '',
|
|
owner_notification_template: '',
|
|
customer_notification_template: '',
|
|
},
|
|
|
|
metrics: {
|
|
yandex_metrika_enabled: false,
|
|
yandex_metrika_counter: '',
|
|
},
|
|
|
|
store: {
|
|
enable_store: true,
|
|
feature_coupons: true,
|
|
feature_vouchers: true,
|
|
},
|
|
|
|
orders: {
|
|
order_default_status_id: 1,
|
|
},
|
|
|
|
texts: {
|
|
text_no_more_products: '',
|
|
text_empty_cart: '',
|
|
text_order_created_success: '',
|
|
zero_price_text: '',
|
|
},
|
|
|
|
sliders: {
|
|
mainpage_slider: {
|
|
is_enabled: false,
|
|
effect: "slide",
|
|
pagination: true,
|
|
scrollbar: false,
|
|
free_mode: false,
|
|
space_between: 30,
|
|
autoplay: false,
|
|
loop: false,
|
|
slides: [],
|
|
},
|
|
},
|
|
|
|
mainpage_blocks: [],
|
|
|
|
forms: {
|
|
checkout: {
|
|
alias: '',
|
|
friendly_name: '',
|
|
is_custom: false,
|
|
schema: [],
|
|
}
|
|
},
|
|
|
|
pulse: {
|
|
api_key: '',
|
|
batch_size: 50,
|
|
},
|
|
|
|
cron: {
|
|
mode: 'disabled',
|
|
},
|
|
},
|
|
}),
|
|
|
|
getters: {
|
|
app_icon_preview: (state) => {
|
|
if (!state.items.app.app_icon) return '/image/cache/no_image-100x100.png';
|
|
const extIndex = state.items.app.app_icon.lastIndexOf('.');
|
|
const ext = state.items.app.app_icon.substring(extIndex);
|
|
const filename = state.items.app.app_icon.substring(0, extIndex);
|
|
return `/image/cache/${filename}-100x100${ext}`;
|
|
},
|
|
hasUnsavedChanges: (state) => {
|
|
if (!state.originalItemsHash) return false;
|
|
return md5(JSON.stringify(state.items)) !== state.originalItemsHash;
|
|
},
|
|
},
|
|
|
|
actions: {
|
|
async fetchSettings() {
|
|
this.isLoading = true;
|
|
this.error = null;
|
|
const response = await apiGet('getSettingsForm');
|
|
if (response.success) {
|
|
this.items = {
|
|
...this.items,
|
|
...response.data,
|
|
};
|
|
// Сохраняем хеш исходного состояния после загрузки
|
|
this.originalItemsHash = md5(JSON.stringify(this.items));
|
|
} else {
|
|
this.error = 'Возникли проблемы при загрузке настроек.';
|
|
}
|
|
this.isLoading = false;
|
|
},
|
|
|
|
async saveSettings() {
|
|
this.isLoading = true;
|
|
const settings = this.transformSettingsToStore(this.items);
|
|
const response = await apiPost('saveSettingsForm', settings);
|
|
|
|
if (response.success === true) {
|
|
toastBus.emit('show', {
|
|
severity: 'success',
|
|
summary: 'Готово!',
|
|
detail: 'Настройки сохранены.',
|
|
life: 2000,
|
|
});
|
|
// Обновляем хеш исходного состояния после успешного сохранения
|
|
this.originalItemsHash = md5(JSON.stringify(this.items));
|
|
} else {
|
|
toastBus.emit('show', {
|
|
severity: 'error',
|
|
summary: 'Ошибка',
|
|
detail: 'Возникли проблемы при сохранении настроек на сервере.',
|
|
life: 2000,
|
|
});
|
|
}
|
|
|
|
|
|
this.isLoading = false;
|
|
},
|
|
|
|
transformSettingsToStore(items) {
|
|
return items;
|
|
},
|
|
},
|
|
});
|