Files
netrunner-landing/lib/README.md
T
2026-07-02 23:13:24 +07:00

47 lines
3.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# `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")`).