vernova/resources/js/app.js
2026-07-26 19:58:27 +03:30

63 lines
1.7 KiB
JavaScript

import Alpine from 'alpinejs';
import axios from 'axios';
window.Alpine = Alpine;
Alpine.store('app', {
sidebarOpen: window.innerWidth >= 768,
darkMode: localStorage.getItem('darkMode') === 'true',
mobileMenuOpen: false,
toggleSidebar() {
this.sidebarOpen = !this.sidebarOpen;
},
toggleDarkMode() {
this.darkMode = !this.darkMode;
localStorage.setItem('darkMode', this.darkMode);
document.documentElement.classList.toggle('dark', this.darkMode);
},
toggleMobileMenu() {
this.mobileMenuOpen = !this.mobileMenuOpen;
},
});
Alpine.data('dropdown', () => ({
open: false,
toggle() { this.open = !this.open; },
close() { this.open = false; },
}));
Alpine.data('confirmDialog', () => ({
showing: false,
message: '',
onConfirm: null,
show(message, onConfirm) {
this.message = message;
this.onConfirm = onConfirm;
this.showing = true;
},
confirm() {
if (this.onConfirm) this.onConfirm();
this.showing = false;
},
cancel() { this.showing = false; },
}));
Alpine.data('toast', () => ({
toasts: [],
add(message, type = 'success', duration = 3000) {
const id = Date.now();
this.toasts.push({ id, message, type });
setTimeout(() => { this.toasts = this.toasts.filter(t => t.id !== id); }, duration);
},
}));
axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';
axios.defaults.headers.common['Accept'] = 'application/json';
axios.defaults.headers.common['X-Locale'] = document.documentElement.lang || 'fa';
const token = document.querySelector('meta[name="csrf-token"]');
if (token) axios.defaults.headers.common['X-CSRF-TOKEN'] = token.content;
Alpine.start();