convert /documents/privacy to .mdx
This commit is contained in:
parent
03145534a1
commit
13d85436a7
6
apps/web/app/(documents)/privacy/layout.tsx
Normal file
6
apps/web/app/(documents)/privacy/layout.tsx
Normal file
@ -0,0 +1,6 @@
|
||||
import { DocumentsLayout } from '@/components/documents/layout';
|
||||
import { type PropsWithChildren } from 'react';
|
||||
|
||||
export default function Layout({ children }: Readonly<PropsWithChildren>) {
|
||||
return <DocumentsLayout title="Политика конфиденциальности">{children}</DocumentsLayout>;
|
||||
}
|
||||
137
apps/web/app/(documents)/privacy/page.mdx
Normal file
137
apps/web/app/(documents)/privacy/page.mdx
Normal file
@ -0,0 +1,137 @@
|
||||
import { SupportLink } from '@/components/documents/support-link';
|
||||
import { env } from '@/config/env';
|
||||
|
||||
export const metadata = {
|
||||
title: 'Политика конфиденциальности',
|
||||
description:
|
||||
'Политика конфиденциальности бота / мини-приложения «Запишись.онлайн» (@zapishis_online_bot)',
|
||||
};
|
||||
|
||||
# Политика конфиденциальности бота / мини-приложения «Запишись.онлайн» (@zapishis_online_bot)
|
||||
|
||||
## 1. Термины и определения
|
||||
|
||||
1. **Telegram** – Telegram Messenger Inc. (платформа, на которой работает бот и мини-приложение).
|
||||
2. **Платформа** – экосистема ботов и мини-приложений Telegram.
|
||||
3. **Разработчик** – физическое лицо, самозанятый, владелец и оператор сервиса «Запишись.онлайн» (@zapishis_online_bot) (далее — «Разработчик»).
|
||||
4. **Сторонний сервис** – бот/мини-приложение Разработчика, предоставляемое в Платформе.
|
||||
5. **Пользователь** – лицо, использующее Сторонний сервис через свою учетную запись Telegram (далее — «Вы»).
|
||||
6. **Политика** – настоящий документ, регулирующий отношения между Разработчиком и Пользователем в части сбора и обработки персональных данных.
|
||||
|
||||
## 2. Общие положения
|
||||
|
||||
2.1. Настоящая Политика регулирует исключительно отношения между Разработчиком и Пользователем. Она не заменяет и не изменяет Политику конфиденциальности Telegram: [https://telegram.org/privacy](https://telegram.org/privacy).
|
||||
|
||||
2.2. Разработчик соблюдает применимые требования платформы Telegram к конфиденциальности и защите данных.
|
||||
|
||||
2.3. Использование Сервиса Пользователем и/или активация платного доступа означает согласие Пользователя с условиями настоящей Политики.
|
||||
|
||||
2.4. Если Вы не согласны с условиями Политики — прекратите использование Сервиса.
|
||||
|
||||
## 3. Отказ от ответственности
|
||||
|
||||
3.1. Сторонний сервис является независимым приложением и не поддерживается, не одобряется и не аффилирован с Telegram (за исключением использования API и инфраструктуры Telegram).
|
||||
|
||||
3.2. Разработчик вправе изменять настоящую Политику — изменения вступают в силу с момента их публикации. Вы обязаны самостоятельно отслеживать обновления.
|
||||
|
||||
3.3. Используя Сервис, Вы подтверждаете, что ознакомлены и согласны с условиями использования Telegram для ботов и мини-приложений:
|
||||
[https://telegram.org/tos/bots](https://telegram.org/tos/bots), [https://telegram.org/tos/mini-apps](https://telegram.org/tos/mini-apps).
|
||||
|
||||
3.4. Вы гарантируете, что используете Сервис в соответствии с действующим законодательством и обладаете правом взаимодействовать с ним (например, достигли возраста, необходимого для использования услуг).
|
||||
|
||||
3.5. Вы обязуетесь предоставлять точную и актуальную информацию, если Сервис запрашивает её.
|
||||
|
||||
3.6. Любая информация, которую Вы делаете общедоступной самостоятельно (через профиль Telegram, публичные сообщения и т.п.), может стать доступна другим пользователям и не подпадает под защиту настоящей Политики в части конфиденциальности этой общедоступной информации.
|
||||
|
||||
## 4. Сбор персональных данных
|
||||
|
||||
4.1. Telegram по умолчанию предоставляет сторонним сервисам ограниченный набор данных о Пользователе — подробнее: [https://telegram.org/privacy#6-bot-messages](https://telegram.org/privacy#6-bot-messages).
|
||||
|
||||
4.2. Сторонний сервис может дополнительно получать данные, которые Вы передаёте в чате бота или в мини-приложении (например, контакт, телефон), если Вы явно их отправляете.
|
||||
|
||||
4.3. В случае мини-приложения дополнительно могут передаваться данные в соответствии с правилами мини-приложений Telegram: [https://telegram.org/tos/mini-apps#4-privacy](https://telegram.org/tos/mini-apps#4-privacy).
|
||||
|
||||
4.4. Сторонний сервис может собирать также анонимную статистику использования (диагностика, события взаимодействия), не связываемую напрямую с персоной.
|
||||
|
||||
4.5. Пользователь может передавать данные третьих лиц (например, контактные данные клиентов или мастеров) для использования в Сервисе. При этом пользователь гарантирует, что эти лица дали согласие на обработку их персональных данных в рамках Сервиса.
|
||||
|
||||
## 5. Какие данные мы собираем и как используем
|
||||
|
||||
5.1. Разработчик запрашивает, собирает и обрабатывает только те данные, которые необходимы для корректной работы функций Сервиса, в частности:
|
||||
|
||||
- Telegram ID и (опционально) отображаемое имя пользователя;
|
||||
- телефон, только если Вы предоставили его добровольно (например, при регистрации);
|
||||
- данные о заказах: дата/время, описание заказа, статус;
|
||||
- информация о факте покупки Pro-доступа: период доступа, тип покупки (детали платёжной транзакции обрабатывает платёжный оператор — ЮKassa);
|
||||
|
||||
5.2. Цели обработки:
|
||||
|
||||
- предоставление и поддержка работы Сервиса (создание заказов, напоминания, управление доступом);
|
||||
- подтверждение и учет оплат (взаимодействие с платёжным оператором для актуализации статуса доступа);
|
||||
- реализация реферальной программы (хранение связей «кто пригласил/кого пригласили»);
|
||||
- анализ использования и улучшение сервиса;
|
||||
- выполнение юридических обязательств (хранение информации о транзакциях и др.);
|
||||
|
||||
> **Важно:** детальные платёжные данные (реквизиты карт и т.д.) не хранятся у Разработчика — их обрабатывает платёжный оператор (ЮKassa) и Telegram-платежный бот.
|
||||
|
||||
## 6. Передача данных третьим лицам
|
||||
|
||||
6.1. Разработчик не передаёт персональные данные третьим лицам, за исключением следующих случаев:
|
||||
|
||||
- платёжному оператору (ЮKassa) и связанным службам для обработки платежей;
|
||||
- Telegram как платформе для функционирования бота и мини-приложения;
|
||||
- в случае необходимости — исполнителям, оказывающим техническую поддержку, при условии подписания ими обязательств о конфиденциальности;
|
||||
- если передача требуется по закону (запросы уполномоченных органов и т.п.);
|
||||
|
||||
6.2. Разработчик не продаёт и не передаёт персональные данные для рекламных целей третьим лицам без Вашего отдельного согласия.
|
||||
|
||||
## 7. Защита и хранение данных
|
||||
|
||||
7.1. Разработчик применяет разумные технические и организационные меры для защиты персональных данных (использование надежного VPS, ограничения доступа, резервное копирование и т.п.).
|
||||
|
||||
7.2. Доступ к персональным данным имеет только Разработчик (и/или доверенные исполнители технической поддержки при необходимости).
|
||||
|
||||
7.3. Данные хранятся на серверах, указанных Разработчиком. Если используются внешние сервисы/облачные хранилища — это будет указано в соответствующих местах Политики или сообщения при сборе данных.
|
||||
|
||||
## 8. Права и обязанности сторон
|
||||
|
||||
8.1. Права Разработчика:
|
||||
|
||||
- вносить изменения в Политику с публикацией новой версии;
|
||||
- ограничивать доступ к API/сервису при подозрении в злоупотреблениях;
|
||||
- запросить подтверждение личности при необходимости обработки привилегированных запросов;
|
||||
|
||||
8.2. Обязанности Разработчика:
|
||||
|
||||
- обеспечивать доступность Политики и исполнять её условия;
|
||||
- обрабатывать законные запросы пользователей о доступе, изменении или удалении данных в разумные сроки (не позднее 30 дней, если иное не установлено законом);
|
||||
- соблюдать применимое законодательство о защите персональных данных;
|
||||
|
||||
8.3. Права Пользователя:
|
||||
|
||||
- запросить копию своих персональных данных, хранящихся у Разработчика;
|
||||
- потребовать исправления неточных данных;
|
||||
- потребовать удаления персональных данных в пределах, допустимых законом (с сохранением данных, необходимых для выполнения юридических обязательств, например, по учёту платежей);
|
||||
- отозвать согласие на обработку персональных данных, если такое согласие предоставлялось добровольно;
|
||||
- подать жалобу в уполномоченные органы по защите персональных данных, если считает, что его права нарушены;
|
||||
|
||||
8.4. Обязанности Пользователя:
|
||||
|
||||
- предоставлять точную и актуальную информацию;
|
||||
- не использовать Сервис в нарушении законодательства и условий Telegram.
|
||||
|
||||
## 9. Реклама и использование данных для аналитики
|
||||
|
||||
9.1. На текущем этапе Разработчик не использует персональные данные для демонстрации таргетированной рекламы третьих лиц без явного согласия Пользователя.
|
||||
|
||||
9.2. Разработчик может собирать агрегированную (анонимную) статистику использования Сервиса для улучшения функционала.
|
||||
|
||||
## 10. Изменения Политики
|
||||
|
||||
10.1. Разработчик вправе вносить изменения в настоящую Политику. Все изменения публикуются на этой странице и вступают в силу с момента публикации.
|
||||
|
||||
## 11. Контакты
|
||||
|
||||
Если у Вас есть вопросы по Политике конфиденциальности или запросы в отношении персональных данных, пожалуйста, свяжитесь с Разработчиком:
|
||||
|
||||
- **Telegram:** <SupportLink/>
|
||||
@ -1,266 +0,0 @@
|
||||
import { Container } from '@/components/layout';
|
||||
import { PageHeader } from '@/components/navigation';
|
||||
import { env } from '@/config/env';
|
||||
|
||||
export default function PrivacyPolicyPage() {
|
||||
return (
|
||||
<>
|
||||
<PageHeader title="Политика конфиденциальности" />
|
||||
<Container className="prose prose-neutral md:prose-lg dark:prose-invert max-w-none">
|
||||
<h1 className="text-2xl font-bold">
|
||||
Политика конфиденциальности бота / мини-приложения «Запишись.онлайн»
|
||||
(@zapishis_online_bot)
|
||||
</h1>
|
||||
|
||||
<h2 className="text-2xl font-semibold">1. Термины и определения</h2>
|
||||
<ol>
|
||||
<li>
|
||||
<strong>Telegram</strong> – Telegram Messenger Inc. (платформа, на которой работает бот
|
||||
и мини-приложение).
|
||||
</li>
|
||||
<li>
|
||||
<strong>Платформа</strong> – экосистема ботов и мини-приложений Telegram.
|
||||
</li>
|
||||
<li>
|
||||
<strong>Разработчик</strong> – физическое лицо, самозанятый, владелец и оператор сервиса
|
||||
«Запишись.онлайн» (@zapishis_online_bot) (далее — «Разработчик»).
|
||||
</li>
|
||||
<li>
|
||||
<strong>Сторонний сервис</strong> – бот/мини-приложение Разработчика, предоставляемое в
|
||||
Платформе.
|
||||
</li>
|
||||
<li>
|
||||
<strong>Пользователь</strong> – лицо, использующее Сторонний сервис через свою учетную
|
||||
запись Telegram (далее — «Вы»).
|
||||
</li>
|
||||
<li>
|
||||
<strong>Политика</strong> – настоящий документ, регулирующий отношения между
|
||||
Разработчиком и Пользователем в части сбора и обработки персональных данных.
|
||||
</li>
|
||||
</ol>
|
||||
|
||||
<h2 className="text-2xl font-semibold">2. Общие положения</h2>
|
||||
<p>
|
||||
2.1. Настоящая Политика регулирует исключительно отношения между Разработчиком и
|
||||
Пользователем. Она не заменяет и не изменяет Политику конфиденциальности Telegram:{' '}
|
||||
<a href="https://telegram.org/privacy">https://telegram.org/privacy</a>.
|
||||
</p>
|
||||
<p>
|
||||
2.2. Разработчик соблюдает применимые требования платформы Telegram к конфиденциальности и
|
||||
защите данных.
|
||||
</p>
|
||||
<p>
|
||||
2.3. Использование Сервиса Пользователем и/или активация платного доступа означает
|
||||
согласие Пользователя с условиями настоящей Политики.
|
||||
</p>
|
||||
<p>2.4. Если Вы не согласны с условиями Политики — прекратите использование Сервиса.</p>
|
||||
|
||||
<h2 className="text-2xl font-semibold">3. Отказ от ответственности</h2>
|
||||
<p>
|
||||
3.1. Сторонний сервис является независимым приложением и не поддерживается, не одобряется
|
||||
и не аффилирован с Telegram (за исключением использования API и инфраструктуры Telegram).
|
||||
</p>
|
||||
<p>
|
||||
3.2. Разработчик вправе изменять настоящую Политику — изменения вступают в силу с момента
|
||||
их публикации. Вы обязаны самостоятельно отслеживать обновления.
|
||||
</p>
|
||||
<p>
|
||||
3.3. Используя Сервис, Вы подтверждаете, что ознакомлены и согласны с условиями
|
||||
использования Telegram для ботов и мини-приложений:{' '}
|
||||
<a href="https://telegram.org/tos/bots">https://telegram.org/tos/bots</a>,{' '}
|
||||
<a href="https://telegram.org/tos/mini-apps">https://telegram.org/tos/mini-apps</a>.
|
||||
</p>
|
||||
<p>
|
||||
3.4. Вы гарантируете, что используете Сервис в соответствии с действующим
|
||||
законодательством и обладаете правом взаимодействовать с ним (например, достигли возраста,
|
||||
необходимого для использования услуг).
|
||||
</p>
|
||||
<p>
|
||||
3.5. Вы обязуетесь предоставлять точную и актуальную информацию, если Сервис запрашивает
|
||||
её.
|
||||
</p>
|
||||
<p>
|
||||
3.6. Любая информация, которую Вы делаете общедоступной самостоятельно (через профиль
|
||||
Telegram, публичные сообщения и т.п.), может стать доступна другим пользователям и не
|
||||
подпадает под защиту настоящей Политики в части конфиденциальности этой общедоступной
|
||||
информации.
|
||||
</p>
|
||||
|
||||
<h2 className="text-2xl font-semibold">4. Сбор персональных данных</h2>
|
||||
<p>
|
||||
4.1. Telegram по умолчанию предоставляет сторонним сервисам ограниченный набор данных о
|
||||
Пользователе — подробнее:{' '}
|
||||
<a href="https://telegram.org/privacy#6-bot-messages">
|
||||
https://telegram.org/privacy#6-bot-messages
|
||||
</a>
|
||||
.
|
||||
</p>
|
||||
<p>
|
||||
4.2. Сторонний сервис может дополнительно получать данные, которые Вы передаёте в чате
|
||||
бота или в мини-приложении (например, контакт, телефон), если Вы явно их отправляете.
|
||||
</p>
|
||||
<p>
|
||||
4.3. В случае мини-приложения дополнительно могут передаваться данные в соответствии с
|
||||
правилами мини-приложений Telegram:{' '}
|
||||
<a href="https://telegram.org/tos/mini-apps#4-privacy">
|
||||
https://telegram.org/tos/mini-apps#4-privacy
|
||||
</a>
|
||||
.
|
||||
</p>
|
||||
<p>
|
||||
4.4. Сторонний сервис может собирать также анонимную статистику использования
|
||||
(диагностика, события взаимодействия), не связываемую напрямую с персоной.
|
||||
</p>
|
||||
<p>
|
||||
4.5. Пользователь может передавать данные третьих лиц (например, контактные данные
|
||||
клиентов или мастеров) для использования в Сервисе. При этом пользователь гарантирует, что
|
||||
эти лица дали согласие на обработку их персональных данных в рамках Сервиса.
|
||||
</p>
|
||||
|
||||
<h2 className="text-2xl font-semibold">5. Какие данные мы собираем и как используем</h2>
|
||||
<p>
|
||||
5.1. Разработчик запрашивает, собирает и обрабатывает только те данные, которые необходимы
|
||||
для корректной работы функций Сервиса, в частности:
|
||||
</p>
|
||||
<ul>
|
||||
<li>Telegram ID и (опционально) отображаемое имя пользователя;</li>
|
||||
<li>телефон, только если Вы предоставили его добровольно (например, при регистрации);</li>
|
||||
<li>данные о заказах: дата/время, описание заказа, статус;</li>
|
||||
<li>
|
||||
информация о факте покупки Pro-доступа: период доступа, тип покупки (детали платёжной
|
||||
транзакции обрабатывает платёжный оператор — ЮKassa).
|
||||
</li>
|
||||
</ul>
|
||||
<p>5.2. Цели обработки:</p>
|
||||
<ul>
|
||||
<li>
|
||||
предоставление и поддержка работы Сервиса (создание заказов, напоминания, управление
|
||||
доступом);
|
||||
</li>
|
||||
<li>
|
||||
подтверждение и учет оплат (взаимодействие с платёжным оператором для актуализации
|
||||
статуса доступа);
|
||||
</li>
|
||||
<li>
|
||||
реализация реферальной программы (хранение связей «кто пригласил/кого пригласили»);
|
||||
</li>
|
||||
<li>анализ использования и улучшение сервиса;</li>
|
||||
<li>выполнение юридических обязательств (хранение информации о транзакциях и др.).</li>
|
||||
</ul>
|
||||
<p className="note">
|
||||
Важно: детальные платёжные данные (реквизиты карт и т.д.) не хранятся у Разработчика — их
|
||||
обрабатывает платёжный оператор (ЮKassa) и Telegram-платежный бот.
|
||||
</p>
|
||||
|
||||
<h2 className="text-2xl font-semibold">6. Передача данных третьим лицам</h2>
|
||||
<p>
|
||||
6.1. Разработчик не передаёт персональные данные третьим лицам, за исключением следующих
|
||||
случаев:
|
||||
</p>
|
||||
<ul>
|
||||
<li>платёжному оператору (ЮKassa) и связанным службам для обработки платежей;</li>
|
||||
<li>Telegram как платформе для функционирования бота и мини-приложения;</li>
|
||||
<li>
|
||||
в случае необходимости — исполнителям, оказывающим техническую поддержку, при условии
|
||||
подписания ими обязательств о конфиденциальности;
|
||||
</li>
|
||||
<li>если передача требуется по закону (запросы уполномоченных органов и т.п.).</li>
|
||||
</ul>
|
||||
<p>
|
||||
6.2. Разработчик не продаёт и не передаёт персональные данные для рекламных целей третьим
|
||||
лицам без Вашего отдельного согласия.
|
||||
</p>
|
||||
|
||||
<h2 className="text-2xl font-semibold">7. Защита и хранение данных</h2>
|
||||
<p>
|
||||
7.1. Разработчик применяет разумные технические и организационные меры для защиты
|
||||
персональных данных (использование надежного VPS, ограничения доступа, резервное
|
||||
копирование и т.п.).
|
||||
</p>
|
||||
<p>
|
||||
7.2. Доступ к персональным данным имеет только Разработчик (и/или доверенные исполнители
|
||||
технической поддержки при необходимости).
|
||||
</p>
|
||||
<p>
|
||||
7.3. Данные хранятся на серверах, указанных Разработчиком. Если используются внешние
|
||||
сервисы/облачные хранилища — это будет указано в соответствующих местах Политики или
|
||||
сообщения при сборе данных.
|
||||
</p>
|
||||
|
||||
<h2 className="text-2xl font-semibold">8. Права и обязанности сторон</h2>
|
||||
<p>8.1. Права Разработчика:</p>
|
||||
<ul>
|
||||
<li>вносить изменения в Политику с публикацией новой версии;</li>
|
||||
<li>ограничивать доступ к API/сервису при подозрении в злоупотреблениях;</li>
|
||||
<li>
|
||||
запросить подтверждение личности при необходимости обработки привилегированных запросов.
|
||||
</li>
|
||||
</ul>
|
||||
<p>8.2. Обязанности Разработчика:</p>
|
||||
<ul>
|
||||
<li>обеспечивать доступность Политики и исполнять её условия;</li>
|
||||
<li>
|
||||
обрабатывать законные запросы пользователей о доступе, изменении или удалении данных в
|
||||
разумные сроки (не позднее 30 дней, если иное не установлено законом);
|
||||
</li>
|
||||
<li>соблюдать применимое законодательство о защите персональных данных.</li>
|
||||
</ul>
|
||||
<p>8.3. Права Пользователя:</p>
|
||||
<ul>
|
||||
<li>запросить копию своих персональных данных, хранящихся у Разработчика;</li>
|
||||
<li>потребовать исправления неточных данных;</li>
|
||||
<li>
|
||||
потребовать удаления персональных данных в пределах, допустимых законом (с сохранением
|
||||
данных, необходимых для выполнения юридических обязательств, например, по учёту
|
||||
платежей);
|
||||
</li>
|
||||
<li>
|
||||
отозвать согласие на обработку персональных данных, если такое согласие предоставлялось
|
||||
добровольно;
|
||||
</li>
|
||||
<li>
|
||||
подать жалобу в уполномоченные органы по защите персональных данных, если считает, что
|
||||
его права нарушены.
|
||||
</li>
|
||||
</ul>
|
||||
<p>8.4. Обязанности Пользователя:</p>
|
||||
<ul>
|
||||
<li>предоставлять точную и актуальную информацию;</li>
|
||||
<li>не использовать Сервис в нарушении законодательства и условий Telegram.</li>
|
||||
</ul>
|
||||
|
||||
<h2 className="text-2xl font-semibold">9. Реклама и использование данных для аналитики</h2>
|
||||
<p>
|
||||
9.1. На текущем этапе Разработчик не использует персональные данные для демонстрации
|
||||
таргетированной рекламы третьих лиц без явного согласия Пользователя.
|
||||
</p>
|
||||
<p>
|
||||
9.2. Разработчик может собирать агрегированную (анонимную) статистику использования
|
||||
Сервиса для улучшения функционала.
|
||||
</p>
|
||||
|
||||
<h2 className="text-2xl font-semibold">10. Изменения Политики</h2>
|
||||
<p>
|
||||
10.1. Разработчик вправе вносить изменения в настоящую Политику. Все изменения публикуются
|
||||
на этой странице и вступают в силу с момента публикации.
|
||||
</p>
|
||||
|
||||
<h2 className="text-2xl font-semibold">11. Контакты</h2>
|
||||
<p>
|
||||
Если у Вас есть вопросы по Политике конфиденциальности или запросы в отношении
|
||||
персональных данных, пожалуйста, свяжитесь с Разработчиком:
|
||||
</p>
|
||||
<ul>
|
||||
<li>
|
||||
Telegram:{' '}
|
||||
<strong>
|
||||
<a href={env.SUPPORT_TELEGRAM_URL}>{env.SUPPORT_TELEGRAM_URL}</a>
|
||||
</strong>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<div className="h-10" />
|
||||
</Container>
|
||||
</>
|
||||
);
|
||||
}
|
||||
@ -2,11 +2,9 @@ import { AuthProvider } from '@/providers/auth';
|
||||
import { ErrorProvider } from '@/providers/error';
|
||||
import { QueryProvider } from '@/providers/query';
|
||||
import { ThemeProvider } from '@/providers/theme-provider';
|
||||
import { I18nProvider } from '@/utils/i18n/provider';
|
||||
import '@repo/ui/globals.css';
|
||||
import { cn } from '@repo/ui/lib/utils';
|
||||
import { type Metadata } from 'next';
|
||||
import { getLocale } from 'next-intl/server';
|
||||
import { Inter } from 'next/font/google';
|
||||
import { type PropsWithChildren } from 'react';
|
||||
|
||||
@ -17,19 +15,15 @@ export const metadata: Metadata = {
|
||||
};
|
||||
|
||||
export default async function RootLayout({ children }: Readonly<PropsWithChildren>) {
|
||||
const locale = await getLocale();
|
||||
|
||||
return (
|
||||
<html lang={locale}>
|
||||
<html lang="ru">
|
||||
<body className={cn(inter.className, 'flex min-h-screen flex-col bg-app-background')}>
|
||||
<ErrorProvider>
|
||||
<I18nProvider>
|
||||
<ThemeProvider>
|
||||
<AuthProvider>
|
||||
<QueryProvider>{children}</QueryProvider>
|
||||
</AuthProvider>
|
||||
</ThemeProvider>
|
||||
</I18nProvider>
|
||||
<ThemeProvider>
|
||||
<AuthProvider>
|
||||
<QueryProvider>{children}</QueryProvider>
|
||||
</AuthProvider>
|
||||
</ThemeProvider>
|
||||
</ErrorProvider>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
18
apps/web/components/documents/layout.tsx
Normal file
18
apps/web/components/documents/layout.tsx
Normal file
@ -0,0 +1,18 @@
|
||||
import { Container } from '@/components/layout';
|
||||
import { PageHeader } from '@/components/navigation';
|
||||
import { type PropsWithChildren } from 'react';
|
||||
|
||||
export function DocumentsLayout({
|
||||
children,
|
||||
title,
|
||||
}: Readonly<PropsWithChildren> & { readonly title: string }) {
|
||||
return (
|
||||
<>
|
||||
<PageHeader title={title} />
|
||||
<Container className="prose prose-neutral md:prose-lg dark:prose-invert max-w-none">
|
||||
{children}
|
||||
</Container>
|
||||
<div className="h-10" />
|
||||
</>
|
||||
);
|
||||
}
|
||||
9
apps/web/components/documents/support-link.tsx
Normal file
9
apps/web/components/documents/support-link.tsx
Normal file
@ -0,0 +1,9 @@
|
||||
import { env } from '@/config/env';
|
||||
|
||||
export function SupportLink() {
|
||||
return (
|
||||
<a href={env.SUPPORT_TELEGRAM_URL} rel="noreferrer" target="_blank">
|
||||
{env.SUPPORT_TELEGRAM_URL}
|
||||
</a>
|
||||
);
|
||||
}
|
||||
55
apps/web/mdx-components.tsx
Normal file
55
apps/web/mdx-components.tsx
Normal file
@ -0,0 +1,55 @@
|
||||
import { type MDXComponents } from 'mdx/types';
|
||||
import Image from 'next/image';
|
||||
import Link from 'next/link';
|
||||
|
||||
/**
|
||||
* Этот объект определяет, какие React-компоненты
|
||||
* будут использоваться для рендеринга MDX-тегов (<a>, <h1>, <p> и т.д.)
|
||||
* и какие кастомные компоненты будут доступны прямо в MDX.
|
||||
*/
|
||||
const components: MDXComponents = {
|
||||
// 🔗 Заменяем стандартные <a> на <Link> Next.js
|
||||
a: ({ children, href = '', ...props }) => {
|
||||
// внутренние ссылки → через <Link>
|
||||
if (href.startsWith('/')) {
|
||||
return (
|
||||
<Link href={href} {...props}>
|
||||
{children}
|
||||
</Link>
|
||||
);
|
||||
}
|
||||
|
||||
// внешние ссылки → target="_blank"
|
||||
return (
|
||||
<a href={href} rel="noopener noreferrer" target="_blank" {...props}>
|
||||
{children}
|
||||
</a>
|
||||
);
|
||||
},
|
||||
|
||||
h1: ({ children }) => <h1 className="text-2xl font-bold">{children}</h1>,
|
||||
|
||||
h2: ({ children }) => <h2 className="text-2xl font-bold">{children}</h2>,
|
||||
|
||||
// 🖼 Обработка картинок через next/image
|
||||
img: (props) => (
|
||||
<Image
|
||||
{...props}
|
||||
alt={props.alt || ''}
|
||||
className="my-4 rounded-xl"
|
||||
height={props.height ? Number(props.height) : 600}
|
||||
width={props.width ? Number(props.width) : 800}
|
||||
/>
|
||||
),
|
||||
};
|
||||
|
||||
/**
|
||||
* Эта функция вызывается автоматически при рендере MDX.
|
||||
* Через неё Next.js App Router объединяет глобальные и локальные MDX-компоненты.
|
||||
*/
|
||||
export function useMDXComponents(componentsArgument: MDXComponents): MDXComponents {
|
||||
return {
|
||||
...components,
|
||||
...componentsArgument, // позволяет переопределять внутри MDX
|
||||
};
|
||||
}
|
||||
@ -1,12 +1,16 @@
|
||||
import createNextIntlPlugin from 'next-intl/plugin';
|
||||
import createMDX from '@next/mdx';
|
||||
|
||||
const withNextIntl = createNextIntlPlugin('./utils/i18n/i18n.ts');
|
||||
|
||||
const nextConfig = withNextIntl({
|
||||
const nextConfig = createMDX({
|
||||
extension: /\.mdx?$/u,
|
||||
})({
|
||||
eslint: {
|
||||
ignoreDuringBuilds: true,
|
||||
},
|
||||
experimental: {
|
||||
mdxRs: true,
|
||||
},
|
||||
output: 'standalone',
|
||||
pageExtensions: ['js', 'jsx', 'ts', 'tsx', 'md', 'mdx'],
|
||||
reactStrictMode: true,
|
||||
transpilePackages: ['@repo/ui'],
|
||||
});
|
||||
|
||||
@ -14,6 +14,9 @@
|
||||
"test:e2e": "playwright test"
|
||||
},
|
||||
"dependencies": {
|
||||
"@mdx-js/loader": "^3.1.1",
|
||||
"@mdx-js/react": "^3.1.1",
|
||||
"@next/mdx": "^15.5.5",
|
||||
"@playwright/test": "^1.49.1",
|
||||
"@repo/graphql": "workspace:*",
|
||||
"@repo/typescript-config": "workspace:*",
|
||||
@ -22,9 +25,10 @@
|
||||
"@tanstack/react-query": "^5.64.1",
|
||||
"@telegram-apps/sdk-react": "^2.0.19",
|
||||
"@testing-library/react": "^16.1.0",
|
||||
"@types/mdx": "^2.0.13",
|
||||
"@types/node": "catalog:",
|
||||
"@types/react-dom": "catalog:",
|
||||
"@types/react": "catalog:",
|
||||
"@types/react-dom": "catalog:",
|
||||
"@vitejs/plugin-react": "^4.3.4",
|
||||
"autoprefixer": "catalog:",
|
||||
"dayjs": "catalog:",
|
||||
@ -32,14 +36,13 @@
|
||||
"graphql": "catalog:",
|
||||
"jsdom": "^25.0.1",
|
||||
"lucide-react": "catalog:",
|
||||
"next-auth": "^4.24.11",
|
||||
"next-intl": "^3.26.0",
|
||||
"next-themes": "^0.4.4",
|
||||
"next": "^15.5.0",
|
||||
"next-auth": "^4.24.11",
|
||||
"next-themes": "^0.4.4",
|
||||
"postcss": "catalog:",
|
||||
"radashi": "catalog:",
|
||||
"react-dom": "catalog:",
|
||||
"react": "catalog:",
|
||||
"react-dom": "catalog:",
|
||||
"tailwindcss": "catalog:",
|
||||
"typescript": "catalog:",
|
||||
"use-debounce": "^10.0.4",
|
||||
|
||||
@ -1,10 +0,0 @@
|
||||
export const defaultLocale = 'ru';
|
||||
|
||||
export const timeZone = 'Europe/Moscow';
|
||||
|
||||
export const locales = [defaultLocale, 'ru'] as const;
|
||||
|
||||
export const localesMap = [
|
||||
{ key: 'en', title: 'English' },
|
||||
{ key: 'ru', title: 'Русский' },
|
||||
];
|
||||
@ -1,18 +0,0 @@
|
||||
import { defaultLocale, locales } from './config';
|
||||
import { getLocale } from './locale';
|
||||
import { type Locale } from './types';
|
||||
import { getRequestConfig } from 'next-intl/server';
|
||||
|
||||
const requestConfig = getRequestConfig(async () => {
|
||||
const locale = (await getLocale()) as Locale;
|
||||
|
||||
return {
|
||||
locale,
|
||||
messages:
|
||||
locale === defaultLocale || !locales.includes(locale)
|
||||
? (await import(`@/public/locales/${defaultLocale}.json`)).default
|
||||
: (await import(`@/public/locales/${locale}.json`)).default,
|
||||
};
|
||||
});
|
||||
|
||||
export default requestConfig;
|
||||
@ -1,20 +0,0 @@
|
||||
// use server is required
|
||||
'use server';
|
||||
|
||||
import { defaultLocale } from './config';
|
||||
import { type Locale } from './types';
|
||||
import { cookies } from 'next/headers';
|
||||
|
||||
// In this example the locale is read from a cookie. You could alternatively
|
||||
// also read it from a database, backend service, or any other source.
|
||||
const COOKIE_NAME = 'NEXT_LOCALE';
|
||||
|
||||
const getLocale = async () => {
|
||||
return (await cookies()).get(COOKIE_NAME)?.value || defaultLocale;
|
||||
};
|
||||
|
||||
const setLocale = async (locale?: string) => {
|
||||
(await cookies()).set(COOKIE_NAME, (locale as Locale) || defaultLocale);
|
||||
};
|
||||
|
||||
export { getLocale, setLocale };
|
||||
@ -1,14 +0,0 @@
|
||||
/* eslint-disable canonical/id-match */
|
||||
import { timeZone } from './config';
|
||||
import { NextIntlClientProvider } from 'next-intl';
|
||||
import { getMessages } from 'next-intl/server';
|
||||
import { type PropsWithChildren } from 'react';
|
||||
|
||||
export async function I18nProvider({ children }: Readonly<PropsWithChildren>) {
|
||||
const messages = await getMessages();
|
||||
return (
|
||||
<NextIntlClientProvider messages={messages} timeZone={timeZone}>
|
||||
{children}
|
||||
</NextIntlClientProvider>
|
||||
);
|
||||
}
|
||||
@ -1,5 +0,0 @@
|
||||
import { type locales } from './config';
|
||||
|
||||
type Locale = (typeof locales)[number];
|
||||
|
||||
export type { Locale };
|
||||
@ -5,7 +5,7 @@ const config = {
|
||||
content: [
|
||||
'./pages/**/*.{ts,tsx}',
|
||||
'./components/**/*.{ts,tsx}',
|
||||
'./app/**/*.{ts,tsx}',
|
||||
'./app/**/*.{ts,tsx,mdx}',
|
||||
'./src/**/*.{ts,tsx}',
|
||||
'../../packages/ui/src/**/*.{ts,tsx}',
|
||||
],
|
||||
|
||||
1128
pnpm-lock.yaml
generated
1128
pnpm-lock.yaml
generated
File diff suppressed because it is too large
Load Diff
Loading…
x
Reference in New Issue
Block a user