# Глобальная инициализация 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
# Загрузка настроек домена
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
# Загрузка пользователя
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', renderFns['app/index.pug'])()
})
# Глобальная обработка ошибок 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
# Регистрация глобальных компонентов (заглушки)
app.component('RouterView', { template: 'Router View
' })
app.component('RouterLink', {
props: ['to'],
template: ''
})
# Монтирование приложения
try
app.mount('body')
log '✅ Приложение успешно смонтировано'
catch error
log '❌ Ошибка монтирования приложения:', error
console.error('Ошибка монтирования:', error)