import { createContext } from "react"; import { EventBus } from "../plugins/eventBus"; import type { IAppContext, TAppRenderModes } from "../types/app/index"; import type { TBaseSizes } from "../types/components/index"; import type { TLocalisationLanguages, TLocalisationSource } from "../types/localisation"; /** * Глобальный контекст для приложения */ const globalCtx = createContext({ isSSR: typeof window === "undefined", mode: (process.env?.RENDER_MODE as TAppRenderModes) ?? "CSR", // for future updates }); const appNSVariable = "_APP_NAMESPACE"; /** * Корневой класс для библиотеки компонентов */ const dsMainClass = "deUI"; /** * Набор глобальных утилитарных классов по-умолчанию */ const stateClasses = { domReady: "isDomReady", pageLoaded: "isPageLoaded", touchscreen: "isTouchscreen", mobileDevice: "isMobileDevice", active: "isActive", inactive: "isInactive", disabled: "isDisabled", show: "isShow", visible: "isVisible", invisible: "isInvisible", hide: "isHide", error: "isError", success: "isSuccess", valid: "isValid", invalid: "isInvalid", visuallyHidden: "isVisuallyHidden", loading: "isLoading", computed: "isComputed", translated: "isTranslated", translationLoading: "isTranslationLoading", translationError: "isTranslationError", }; /** * Всплывающие события форм */ const formBubbles = { formValid: "form::valid", formInvalid: "form::invalid", formSuccess: "form::successful", formError: "form::error", formSending: "form::sending", formNeedsConfirm: "form::needsConfirm", inputInvalid: "form::invalidInput", inputValid: "form::validInput", inputClear: "form::inputClear", }; /** * Всплывающие события локализации */ const localisationBubbles = { localisationReady: "localisation::ready", localisationError: "localisation::error", localisationMiss: "localisation::miss", localisationChange: "localisation::change", }; /** * Базовые размеры */ const defaultSizes: TBaseSizes[] = [ "auto", "small", "medium", "large", "max" ]; /** * Набор стандартных ключей валидации */ const defaultErrorsKeys = { empty: "emptyInput", invalid: "invalidInput", valid: "validInput", }; /** * Наименование события успешной загрузки асинхронного контента */ const contentLoadedEventName = "contentLoaded"; /** * Экземпляр вызова шины событий */ const EventBusInstance = new EventBus(); /** * Запросы @media */ const mediaQueries = { mobileMinimum: "max-width: 375px", mobileSmall: "max-width: 640px", mobile: "max-width: 767px", mobileAbove: "min-width: 768px", tabletMinimum: "max-width: 768px", tabletSmall: "max-width: 920px", tabletMedium: "max-width: 1024px", tablet: "max-width: 1280px", tabletAbove: "min-width: 1281px", desktopMinimum: "max-width: 1320px", desktopSmall: "max-width: 1366px", desktopAboveSmall: "min-width: 1367px", desktopMedium: "max-width: 1480px", desktopAboveMedium: "min-width: 1481px", desktopLarge: "max-width: 1820px", desktopAboveLarge: "min-width: 1821px", desktop: "max-width: 1920px", desktopAbove: "min-width: 1921px", }; /** * Стандартный объект локализации */ const defaultLocales: TLocalisationSource = { select: { loading: [ "Загрузка...", "Loading..." ], noOptions: [ "Нет доступных опций", "No options available" ], noMatches: [ "Ничего не найдено", "Nothing found" ], selectedValues: [ "Выбрано {{current, number}} из {{total, number}}", "Selected {{current, number}} from {{total, number}}", ], }, filesUploader: { unknownFile: [ "Без названия", "Unknown file" ], megaByte: [ "МБ", "MB" ], allTypes: [ "Все типы файлов", "All types of file" ], specificTypes: [ ({ isMultiple }: { isMultiple: boolean; }) => `Тип${isMultiple ? "ы" : ""} файл${isMultiple ? "ов" : "а"}: {{types, string}}`, ({ isMultiple }: { isMultiple: boolean; }) => `File type${isMultiple ? "s" : ""}: {{types, string}}`, ], actionText: [ ({ isMultiple }: { isMultiple: boolean; }) => `Перетащите файл${isMultiple ? "ы" : ""} или загрузите`, ({ isMultiple }: { isMultiple: boolean; }) => `Drop file${isMultiple ? "s" : ""} or upload it`, ], maxSize: [ ({ isMultiple, maxSizeType }: { isMultiple: boolean; maxSizeType: "all" | "every"; }) => { if (maxSizeType === "all") { return `Общий размер файл${isMultiple ? "ов" : "а"}: не более {{maxSize, string}} МБ`; } return `Размер каждого файла: не более {{maxSize, string}} МБ`; }, ({ isMultiple, maxSizeType }: { isMultiple: boolean; maxSizeType: "all" | "every"; }) => { if (maxSizeType === "all") { return `Total size of file${isMultiple ? "s" : ""}: no more than {{maxSize, string}} MB`; } return `Size of each file: no more than {{maxSize, string}} MB`; }, ], maxLength: [ ({ isMultiple }: { isMultiple: boolean; }) => `Максимальное количество файлов: не более {{maxFiles, string}}`, ({ isMultiple }: { isMultiple: boolean; }) => `Maximum number of files: no more than {{maxFiles, string}}`, ], errorText: [ ({ isMultiple }: { isMultiple: boolean; }) => `Файл${isMultiple ? "ы" : ""} не соответствуют требованиям: некорректное количество, размер или формат`, ({ isMultiple }: { isMultiple: boolean; }) => `File${isMultiple ? "s" : ""} do not meet the requirements: invalid number, size or format`, ], }, datePicker: { january: [ "Январь", "January" ], february: [ "Февраль", "February" ], march: [ "Март", "March" ], april: [ "Апрель", "April" ], may: [ "Май", "May" ], june: [ "Июнь", "June" ], july: [ "Июль", "July" ], august: [ "Август", "August" ], september: [ "Сентябрь", "September" ], october: [ "Октябрь", "October" ], november: [ "Ноябрь", "November" ], december: [ "Декабрь", "December" ], year: [ "Год", "Year" ], month: [ "Месяц", "Month" ], time: [ "Время", "Time" ], }, forms: { invalidInput: [ "Неверно", "Invalid" ], emptyInput: [ "Поле не заполнено", "Field not filled" ], validInput: [ "Поле корректно", "Field is valid" ], invalidCheckbox: [ "Не установлен выбор", "Choice not set" ], invalidRadio: [ "Не выбрано значение", "No value selected" ], invalidFile: [ "Не указан файл", "No file selected" ], invalidEmail: [ "Не указан email", "Email is invalid" ], }, modals: { successTitle: [ "Успешно", "Success" ], errorTitle: [ "Что-то пошло не так", "Something went wrong" ], confirmTitle: [ "Подтвердите действие", "Please confirm action" ], closeBtn: [ "Закрыть", "Close" ], confirmBtn: [ "Подтвердить", "Submit" ], cancelBtn: [ "Отменить", "Cancel" ], nextBtn: [ "Далее", "Next" ], prevBtn: [ "Назад", "Prev" ], defaultError: [ "Пожалуйста, попробуйте позже", "Please try again later" ], defaultSuccess: [ "Пожалуйста, ожидайте обратной связи", "Please wait for feedback" ], }, }; /** * Стандартные ключи языков */ const defaultLangKeys: TLocalisationLanguages = [ "ru", "en" ]; const constants = { dsMainClass, globalCtx, defaultLocales, defaultLangKeys, stateClasses, formBubbles, localisationBubbles, defaultSizes, defaultErrorsKeys, appNSVariable, contentLoadedEventName, EventBusInstance, mediaQueries, }; export { constants };