Files
vidconf/frontend/src/components/layout/AppFooter.tsx
Max Ronzhin b6f57384b0 feat(ui): общий футер на всех страницах, кроме комнаты
`AppFooter` — версия инстанса из публичного `/api/health` (не требует
авторизации, поэтому работает и на экранах входа; поля `version` может не
быть — тогда версия не показывается) плюс копирайт с ТЕКУЩИМ годом и
ссылкой на профиль автора.

Подключён во все раскладки: `page-shell` (календарь, админка, профиль, мои
конференции), `AuthLayout` (вход, регистрация, подтверждение email),
`join-shell` и `lobby-shell`. В комнате конференции футера нет — там
полноэкранное видео.

Прежний футер админки (`.admin-footer`) удалён вместе со стилем — дубля не
осталось. В брендовой панели экранов auth строка «© 2026 VidConf ·
self-hosted» ужата до «self-hosted»: год там был захардкожен, а два
копирайта на одном экране — дубль.
2026-07-27 01:31:52 +03:00

35 lines
2.0 KiB
TypeScript
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.
import { useQuery } from '@tanstack/react-query'
import { getHealth } from '@/api/health'
import '@/styles/footer.css'
/**
* Общий футер приложения: версия инстанса и копирайт со ссылкой на автора.
*
* Ставится на всех страницах, КРОМЕ комнаты конференции (`RoomPage`) — там
* полноэкранное видео и тулбар, футеру места нет. Раскладок в приложении
* несколько (`page-shell`, `AuthLayout`, `join-shell`, `lobby-shell`), поэтому
* компонент рендерит только собственный `<footer>`, а привязку к конкретной
* раскладке делает CSS (см. `styles/footer.css`).
*
* Версия — из публичного `GET /api/health` (авторизации не требует, годится и
* для экранов входа). Поле `version` опционально: если backend его не отдал,
* версию просто не показываем (см. `HealthOut.version`). Ключ запроса тот же
* `['health']`, что и у админки, — react-query отдаст общий закэшированный
* результат, лишнего запроса не будет.
*
* Год — текущий, из `Date` (не захардкожен): страница живёт в браузере
* пользователя и не должна устаревать 1 января.
*/
export function AppFooter() {
const { data: health } = useQuery({ queryKey: ['health'], queryFn: getHealth, retry: false })
return (
<footer className="app-footer">
VidConf{health?.version ? ` · v${health.version}` : ''} · © {new Date().getFullYear()} · by{' '}
<a href="https://github.com/MaxRonzhin" target="_blank" rel="noopener">
MaxRonzhin
</a>
</footer>
)
}