# Глобальная инициализация 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'
# Мета-теги
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 '⚠️ Глобальные стили не найдены'
# Добавить в секцию импортов
PouchDBService = require 'app/utils/pouch'
SiteDesignDocuments = require 'app/design/site'
ProductService = require 'app/services/ProductService'
CategoryService = require 'app/services/CategoryService'
DomainService = require 'app/services/DomainService'
# Создание 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
try
# Инициализация PouchDB и сервисов
await PouchDBService.init()
log '✅ PouchDB инициализирован'
# Сохранение дизайн-документов
await SiteDesignDocuments.saveDesignDocs(PouchDBService)
log '✅ Дизайн-документы сохранены'
# Инициализация сервисов
await ProductService.init()
await CategoryService.init()
await DomainService.init()
log '✅ Все сервисы инициализированы'
# Загрузка данных
await @loadDomainData()
await @loadUserData()
await @loadCartData()
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)