47 lines
3.7 KiB
Markdown
47 lines
3.7 KiB
Markdown
# `lib/` — общие модули и утилиты
|
||
|
||
## `pb.ts`
|
||
|
||
Синглтон-клиент PocketBase (headless CMS проекта) и типы для его коллекций.
|
||
Различает серверный и клиентский URL: на сервере (SSR/ISR) используется
|
||
`PB_INTERNAL_URL` — внутренний адрес PocketBase в докер-сети, в браузере —
|
||
публичный `NEXT_PUBLIC_PB_URL`. На сервере дополнительно отключена автоотмена
|
||
запросов (`pb.autoCancellation(false)`), т.к. PocketBase SDK по умолчанию отменяет
|
||
параллельные одинаковые запросы, что ломает параллельный SSR/ISR-рендеринг разных
|
||
страниц. В браузере глушится специфичная ошибка "the request was autocancelled" в
|
||
консоли, чтобы не пугать разработчика ложным шумом. Экспортирует типы записей
|
||
(`PBPost`, `PBFaq`, `PBDownload`) и хелперы `getPbImage`/`getPbFileUrl` для сборки
|
||
прямых URL на файлы, хранящиеся в PocketBase. Используй этот модуль в любом месте,
|
||
где нужно прочитать данные из CMS (посты, FAQ, тарифы, платформы загрузки,
|
||
комментарии гостевой книги, документы).
|
||
|
||
## `dictionaries.ts`
|
||
|
||
Динамическая загрузка JSON-словарей `dictionaries/en.json` / `dictionaries/ru.json`
|
||
по коду локали через `getDictionary(locale)`, с фоллбеком на `en`, если локаль не
|
||
распознана. Помечен `import "server-only"` — импортировать его можно только из
|
||
серверных компонентов (`page.tsx`, `layout.tsx`); это специально предотвращает
|
||
попадание словарей целиком в клиентский JS-бандл. Клиентские компоненты получают
|
||
уже нужный кусок словаря как проп (`dict={dict.hero}` и т.п.), а не читают его сами.
|
||
|
||
## `IDict.ts`
|
||
|
||
TypeScript-интерфейс `Dictionary`, описывающий форму JSON-словарей (секции nav,
|
||
hero, features, pricing, faq, blog, footer, download, terminal, loading, notFound,
|
||
nodes, guestbook, auth, docs, speedtest). Используй его для типизации пропа `dict`
|
||
в любом компоненте, который получает переведённые строки, — и для проверки, что
|
||
`en.json`/`ru.json` синхронизированы между собой по набору ключей.
|
||
|
||
## `document.ts`
|
||
|
||
Интерфейс `PBDocument` для коллекции документов раздела `/docs` ("хранилища"
|
||
документации в хакерском стиле): категории `Core`/`Security`/`Network`/`Legal`/`All`
|
||
и статусы `Encrypted`/`Public`/`Dynamic`/`Internal`, которые определяют бейдж и цвет
|
||
карточки документа в `docs-client.tsx`.
|
||
|
||
## `utils.ts`
|
||
|
||
Единственный хелпер `cn()` — объединение классов Tailwind с учётом конфликтов
|
||
(`clsx` + `tailwind-merge`), стандартный паттерн из shadcn/ui. Используй его вместо
|
||
шаблонных строк везде, где className собирается условно (например, `cn(base, isActive && "text-primary")`).
|