diff --git a/apps/web/api/ius/query.ts b/apps/web/api/ius/query.ts index 4976b09..068df80 100644 --- a/apps/web/api/ius/query.ts +++ b/apps/web/api/ius/query.ts @@ -17,3 +17,9 @@ export async function getMetaData(params: t.Request) { return api.get(url).then((res) => res as t.ResponseMetaData); } + +export async function getConfig(params: t.Request) { + const url = `/${params.slug}/config`; + + return api.get(url).then((res) => res as t.ResponseConfig); +} diff --git a/apps/web/api/ius/types.ts b/apps/web/api/ius/types.ts index 3610c8c..9666c7e 100644 --- a/apps/web/api/ius/types.ts +++ b/apps/web/api/ius/types.ts @@ -12,3 +12,4 @@ export type MetaObject = { export type Request = { searchParams: any; slug: string }; export type ResponseGetData = Record; export type ResponseMetaData = Record; +export type ResponseConfig = { title: string }; diff --git a/apps/web/app/favicon.ico b/apps/web/app/favicon.ico deleted file mode 100644 index 718d6fe..0000000 Binary files a/apps/web/app/favicon.ico and /dev/null differ diff --git a/apps/web/app/ius/[slug]/page.tsx b/apps/web/app/ius/[slug]/page.tsx index 2762689..beaa47f 100644 --- a/apps/web/app/ius/[slug]/page.tsx +++ b/apps/web/app/ius/[slug]/page.tsx @@ -1,12 +1,27 @@ import * as apiIUS from '@/api/ius/query'; import type { Request } from '@/api/ius/types'; import { Form } from '@/components/Form'; +import type { Metadata } from 'next'; type Props = { params: { slug: string }; searchParams: { [key: string]: string | string[] | undefined }; }; +export async function generateMetadata({ params, searchParams }: Props): Promise { + const { title } = await apiIUS.getConfig({ searchParams, ...params }); + const text = `${title} | Эволюция`; + + return { + description: text, + openGraph: { + description: text, + title: text, + }, + title: text, + }; +} + export default async function Page(props: Props) { const data = await getData({ searchParams: props.searchParams, diff --git a/apps/web/app/layout.tsx b/apps/web/app/layout.tsx index 14de0b8..cdda1c8 100644 --- a/apps/web/app/layout.tsx +++ b/apps/web/app/layout.tsx @@ -7,13 +7,39 @@ import { Content, Header } from 'ui'; const inter = Inter({ subsets: ['latin'] }); export const metadata: Metadata = { - description: 'Generated by create next app', - title: 'Create Next App', + description: 'External | Эволюция', + icons: { + apple: '/apple-touch-icon.png', + icon: '/favicon.ico', + other: [ + { + rel: 'icon', + sizes: '32x32', + type: 'image/png', + url: '/favicon-32x32.png', + }, + { + rel: 'icon', + sizes: '16x16', + type: 'image/png', + url: '/favicon-16x16.png', + }, + { + rel: 'mask-icon', + url: '/safari-pinned-tab.svg', + }, + ], + }, + title: 'External | Эволюция', }; export default function RootLayout({ children }: { readonly children: React.ReactNode }) { return ( + + + +
diff --git a/apps/web/app/manifest.ts b/apps/web/app/manifest.ts new file mode 100644 index 0000000..2caf2cc --- /dev/null +++ b/apps/web/app/manifest.ts @@ -0,0 +1,25 @@ +import type { MetadataRoute } from 'next'; + +export default function manifest(): MetadataRoute.Manifest { + return { + background_color: '#fff', + description: 'External | Эволюция', + display: 'standalone', + icons: [ + { + sizes: '192x192', + src: '/android-chrome-192x192.png', + type: 'image/png', + }, + { + sizes: '512x512', + src: '/android-chrome-512x512.png', + type: 'image/png', + }, + ], + name: 'External | Эволюция', + short_name: 'External | Эволюция', + start_url: '/', + theme_color: '#fff', + }; +} diff --git a/apps/web/next.config.js b/apps/web/next.config.js index 03695a8..576def3 100644 --- a/apps/web/next.config.js +++ b/apps/web/next.config.js @@ -1,8 +1,18 @@ +const fs = require('fs'); const envSchema = require('./config/schema/env'); const urls = require('./constants/urls'); const env = envSchema.parse(process.env); +const favicons = fs.readdirSync('./public/favicon/prod'); +const faviconSubPath = env.USE_DEV_COLORS ? '/favicon/dev' : '/favicon/prod'; +function buildFaviconRewrite(source) { + return { + destination: String.prototype.concat(faviconSubPath, source), + source, + }; +} + /** @type {import('next').NextConfig} */ const nextConfig = { reactStrictMode: true, @@ -13,6 +23,7 @@ const nextConfig = { destination: env.URL_IUS_DIRECT + '/:path', source: urls.URL_IUS_PROXY + '/:path', }, + ...favicons.map((fileName) => buildFaviconRewrite(`/${fileName}`)), ]; }, }; diff --git a/apps/web/public/favicon/dev/android-chrome-192x192.png b/apps/web/public/favicon/dev/android-chrome-192x192.png new file mode 100644 index 0000000..46a9c6a Binary files /dev/null and b/apps/web/public/favicon/dev/android-chrome-192x192.png differ diff --git a/apps/web/public/favicon/dev/android-chrome-512x512.png b/apps/web/public/favicon/dev/android-chrome-512x512.png new file mode 100644 index 0000000..2d9ab30 Binary files /dev/null and b/apps/web/public/favicon/dev/android-chrome-512x512.png differ diff --git a/apps/web/public/favicon/dev/apple-touch-icon.png b/apps/web/public/favicon/dev/apple-touch-icon.png new file mode 100644 index 0000000..ce0dac0 Binary files /dev/null and b/apps/web/public/favicon/dev/apple-touch-icon.png differ diff --git a/apps/web/public/favicon/dev/favicon-16x16.png b/apps/web/public/favicon/dev/favicon-16x16.png new file mode 100644 index 0000000..5cdc6f1 Binary files /dev/null and b/apps/web/public/favicon/dev/favicon-16x16.png differ diff --git a/apps/web/public/favicon/dev/favicon-32x32.png b/apps/web/public/favicon/dev/favicon-32x32.png new file mode 100644 index 0000000..ec8a1fb Binary files /dev/null and b/apps/web/public/favicon/dev/favicon-32x32.png differ diff --git a/apps/web/public/favicon/dev/favicon.ico b/apps/web/public/favicon/dev/favicon.ico new file mode 100644 index 0000000..98c9d16 Binary files /dev/null and b/apps/web/public/favicon/dev/favicon.ico differ diff --git a/apps/web/public/favicon/dev/safari-pinned-tab.svg b/apps/web/public/favicon/dev/safari-pinned-tab.svg new file mode 100644 index 0000000..8215a5a --- /dev/null +++ b/apps/web/public/favicon/dev/safari-pinned-tab.svg @@ -0,0 +1,32 @@ + + + + +Created by potrace 1.14, written by Peter Selinger 2001-2017 + + + + + + diff --git a/apps/web/public/favicon/prod/android-chrome-192x192.png b/apps/web/public/favicon/prod/android-chrome-192x192.png new file mode 100644 index 0000000..2fab82b Binary files /dev/null and b/apps/web/public/favicon/prod/android-chrome-192x192.png differ diff --git a/apps/web/public/favicon/prod/android-chrome-512x512.png b/apps/web/public/favicon/prod/android-chrome-512x512.png new file mode 100644 index 0000000..1c09769 Binary files /dev/null and b/apps/web/public/favicon/prod/android-chrome-512x512.png differ diff --git a/apps/web/public/favicon/prod/apple-touch-icon.png b/apps/web/public/favicon/prod/apple-touch-icon.png new file mode 100644 index 0000000..1d6b1cb Binary files /dev/null and b/apps/web/public/favicon/prod/apple-touch-icon.png differ diff --git a/apps/web/public/favicon/prod/favicon-16x16.png b/apps/web/public/favicon/prod/favicon-16x16.png new file mode 100644 index 0000000..7551e2c Binary files /dev/null and b/apps/web/public/favicon/prod/favicon-16x16.png differ diff --git a/apps/web/public/favicon/prod/favicon-32x32.png b/apps/web/public/favicon/prod/favicon-32x32.png new file mode 100644 index 0000000..3d0a600 Binary files /dev/null and b/apps/web/public/favicon/prod/favicon-32x32.png differ diff --git a/apps/web/public/favicon/prod/favicon.ico b/apps/web/public/favicon/prod/favicon.ico new file mode 100644 index 0000000..bd956e2 Binary files /dev/null and b/apps/web/public/favicon/prod/favicon.ico differ diff --git a/apps/web/public/favicon/prod/safari-pinned-tab.svg b/apps/web/public/favicon/prod/safari-pinned-tab.svg new file mode 100644 index 0000000..20e305b --- /dev/null +++ b/apps/web/public/favicon/prod/safari-pinned-tab.svg @@ -0,0 +1,48 @@ + + + + +Created by potrace 1.14, written by Peter Selinger 2001-2017 + + + + + +