# Глобальная инициализация debug globalThis.log = debug.log # Главный файл приложения log '🚀 Инициализация приложения Браер-Колор' # Загрузка конфигурации config = require 'app/config' DataTypes = require 'app/types/data' EventTypes = require 'app/types/events' # Инициализация глобальных переменных globalThis.renderFns = require 'pug.json' globalThis.stylFns = require 'styl.json' # Сервисы (пока заглушки) PouchDBService = init: -> Promise.resolve() getDocument: -> Promise.resolve(null) saveToRemote: -> Promise.resolve() DomainService = init: -> Promise.resolve() loadDomainSettings: -> Promise.resolve(null) getAvailableDomains: -> [] # Мета-теги document.head.insertAdjacentHTML 'beforeend', '' document.head.insertAdjacentHTML 'beforeend', '' document.head.insertAdjacentHTML 'beforeend', 'Браер-Колор - Интернет-магазин лакокрасочной продукции' # Добавление глобальных стилей if stylFns['app/index.styl'] styleElement = document.createElement('style') styleElement.type = 'text/css' styleElement.textContent = stylFns['app/index.styl'] document.head.appendChild(styleElement) else log '⚠️ Глобальные стили не найдены' # Создание Vue приложения app = Vue.createApp({ data: -> { theme: localStorage.getItem('theme') or config.defaultTheme companyName: config.companyName loading: false currentDomain: window.location.hostname currentDomainSettings: null availableDomains: [] languages: config.languages currentLanguage: localStorage.getItem('language') or config.defaultLanguage user: null cartItems: [] notifications: [] } computed: isAdmin: -> @user?.role == 'admin' domainConfig: -> DomainService.getDomainConfig?(@currentDomain) or {} methods: # Управление темой toggleTheme: -> @theme = if @theme == 'light' then 'dark' else 'light' localStorage.setItem 'theme', @theme document.documentElement.classList.toggle 'dark' @$emit EventTypes.THEME_CHANGED, @theme log '🎨 Тема изменена:', @theme # Управление языком setLanguage: (lang) -> if @languages.includes lang @currentLanguage = lang localStorage.setItem 'language', @currentLanguage @$emit EventTypes.LANGUAGE_CHANGED, lang log '🌐 Язык изменен:', lang else log '⚠️ Язык не поддерживается:', lang # Смена домена changeDomain: (domain) -> log '🌐 Смена домена на:', domain @currentDomain = domain @loadDomainData() # Переход в корзину goToCart: -> @$router.push '/cart' log '🛒 Переход в корзину' # Загрузка настроек домена loadDomainData: -> log '📡 Загрузка настроек домена:', @currentDomain DomainService.loadDomainSettings(@currentDomain) .then (settings) => @currentDomainSettings = settings document.title = settings?.companyName or @companyName log '✅ Настройки домена загружены', settings .catch (error) => log '⚠️ Настройки домена не найдены, используются значения по умолчанию' @currentDomainSettings = new DataTypes.DomainSettings() @currentDomainSettings.companyName = @companyName # Управление корзиной updateCart: (items) -> @cartItems = items localStorage.setItem 'cart', JSON.stringify(items) @$emit EventTypes.CART_UPDATE, items log '🛒 Корзина обновлена:', items.length, 'товаров' # Уведомления showNotification: (message, type = 'info') -> notification = { id: Date.now(), message, type, visible: true, timestamp: new Date() } @notifications.push notification log '📢 Показано уведомление:', message setTimeout (=> notification.visible = false setTimeout (=> @notifications = @notifications.filter (n) -> n.id != notification.id ), 300 ), 5000 # Закрытие уведомления closeNotification: (id) -> @notifications = @notifications.filter (notification) -> notification.id != id log '📢 Уведомление закрыто:', id # Загрузка пользователя loadUserData: -> userData = localStorage.getItem 'user' if userData try @user = JSON.parse userData log '👤 Пользователь загружен:', @user.username catch error log '❌ Ошибка загрузки пользователя:', error @user = null else @user = null # Загрузка корзины loadCartData: -> cartData = localStorage.getItem 'cart' if cartData try @cartItems = JSON.parse cartData log '🛒 Корзина загружена:', @cartItems.length, 'товаров' catch error log '❌ Ошибка загрузки корзины:', error @cartItems = [] else @cartItems = [] # Инициализация приложения initializeApp: -> log '🔧 Начало инициализации приложения' @loading = true # Инициализация темы if @theme == 'dark' document.documentElement.classList.add 'dark' log '🌙 Темная тема активирована' else log '☀️ Светлая тема активирована' # Последовательная инициализация сервисов Promise.resolve() .then => log '📦 Инициализация PouchDB...' PouchDBService.init() .then => log '🌐 Инициализация DomainService...' DomainService.init() .then => log '📡 Получение доступных доменов...' @availableDomains = DomainService.getAvailableDomains() .then => @loadDomainData() .then => @loadUserData() .then => @loadCartData() .then => log '✅ Приложение успешно инициализировано' @showNotification('Приложение готово к работе', 'success') .catch (error) => log '❌ Ошибка инициализации приложения:', error @showNotification('Ошибка загрузки приложения', 'error') .finally => @loading = false mounted: -> await @initializeApp() # Рендер функция из Pug render: (new Function '_ctx', '_cache', globalThis.renderFns['app/index.pug'])() }) Router = require 'app/router/index.coffee' # Регистрация глобальных компонентов app.component('ui-button', require 'app/components/UI/Button/index.coffee') app.component('notification-container', require 'app/components/UI/Notification/index.coffee') app.component('app-loader', require 'app/components/UI/AppLoader/index.coffee') app.component('multilevel-menu', require 'app/components/Domain/MultilevelMenu/index.coffee') app.component('theme-toggle', require 'app/components/UI/ThemeToggle/index.coffee') app.component('language-toggle', require 'app/components/UI/LanguageToggle/index.coffee') app.component('cart-widget', require 'app/components/Domain/CartWidget/index.coffee') # Подключение роутера app.use Router # Глобальная обработка ошибок Vue app.config.errorHandler = (err, vm, info) -> log '💥 Vue ошибка:', err, info console.error('Vue ошибка:', err, info) # Глобальная обработка предупреждений app.config.warnHandler = (msg, vm, trace) -> log '⚠️ Vue предупреждение:', msg, trace # Монтирование приложения try app.mount('body') log '✅ Приложение успешно смонтировано' catch error log '❌ Ошибка монтирования приложения:', error console.error('Ошибка монтирования:', error)