OGP meta tags and SEO optimization
This commit is contained in:
2
public/robots.txt
Normal file
2
public/robots.txt
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
User-agent: *
|
||||||
|
Disallow:
|
||||||
@@ -9,14 +9,16 @@ import { groups } from '@/shared/data/groups'
|
|||||||
import crypto from 'crypto'
|
import crypto from 'crypto'
|
||||||
import React from 'react'
|
import React from 'react'
|
||||||
import { getDayOfWeek } from '@/shared/utils'
|
import { getDayOfWeek } from '@/shared/utils'
|
||||||
|
import Head from 'next/head'
|
||||||
|
|
||||||
type PageProps = NextSerialized<{
|
type PageProps = NextSerialized<{
|
||||||
schedule: Day[]
|
schedule: Day[]
|
||||||
|
group: string
|
||||||
parsedAt: Date
|
parsedAt: Date
|
||||||
}>
|
}>
|
||||||
|
|
||||||
export default function HomePage(props: PageProps) {
|
export default function HomePage(props: PageProps) {
|
||||||
const { schedule, parsedAt } = nextDeserializer(props)
|
const { schedule, group, parsedAt } = nextDeserializer(props)
|
||||||
|
|
||||||
React.useEffect(() => {
|
React.useEffect(() => {
|
||||||
if (typeof window !== 'undefined') {
|
if (typeof window !== 'undefined') {
|
||||||
@@ -39,6 +41,12 @@ export default function HomePage(props: PageProps) {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
|
<Head>
|
||||||
|
<title>Группа {group} — Расписание занятий в Колледже Связи</title>
|
||||||
|
<meta name="description" content={`Расписание занятий группы ${group} на неделю в Колледже Связи ПГУТИ. Расписание пар, материалы для подготовки и изменения в расписании.`} />
|
||||||
|
<meta property="og:title" content={`Группа ${group} — Расписание занятий в Колледже Связи`} />
|
||||||
|
<meta property="og:description" content={`Расписание занятий группы ${group} на неделю в Колледже Связи ПГУТИ. Расписание пар, материалы для подготовки и изменения в расписании.`} />
|
||||||
|
</Head>
|
||||||
<NavBar />
|
<NavBar />
|
||||||
<LastUpdateAt date={parsedAt} />
|
<LastUpdateAt date={parsedAt} />
|
||||||
<Schedule days={schedule} />
|
<Schedule days={schedule} />
|
||||||
@@ -94,7 +102,8 @@ export async function getServerSideProps(context: GetServerSidePropsContext<{ gr
|
|||||||
return {
|
return {
|
||||||
props: nextSerialized({
|
props: nextSerialized({
|
||||||
schedule: schedule,
|
schedule: schedule,
|
||||||
parsedAt: parsedAt
|
parsedAt: parsedAt,
|
||||||
|
group: groups[group][1]
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -4,8 +4,7 @@ export default function Document() {
|
|||||||
return (
|
return (
|
||||||
<Html lang="ru">
|
<Html lang="ru">
|
||||||
<Head>
|
<Head>
|
||||||
<title>Расписание в Колледже Связи</title>
|
<meta property="og:site_name" content="Расписание занятий в Колледже связи ПГУТИ" />
|
||||||
<meta name="description" content={'Расписание группы на неделю. Самый удобный и лучший сайт для просмотра расписания КС ПГУТИ.'} />
|
|
||||||
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png" />
|
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png" />
|
||||||
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png" />
|
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png" />
|
||||||
<link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png" />
|
<link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png" />
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ const CardTitle = React.forwardRef<
|
|||||||
HTMLParagraphElement,
|
HTMLParagraphElement,
|
||||||
React.HTMLAttributes<HTMLHeadingElement>
|
React.HTMLAttributes<HTMLHeadingElement>
|
||||||
>(({ className, ...props }, ref) => (
|
>(({ className, ...props }, ref) => (
|
||||||
<h3
|
<span
|
||||||
ref={ref}
|
ref={ref}
|
||||||
className={cn(
|
className={cn(
|
||||||
"text-2xl font-semibold leading-none tracking-tight",
|
"text-2xl font-semibold leading-none tracking-tight",
|
||||||
|
|||||||
@@ -25,13 +25,13 @@ export function Day({ day }: {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="flex flex-col gap-3 md:gap-5">
|
<div className="flex flex-col gap-3 md:gap-5">
|
||||||
<h1 className={cx('scroll-m-20 text-2xl md:text-4xl font-extrabold tracking-tight lg:text-5xl', { 'text-[hsl(var(--grayed-out))]': dayPassed })} id={getDayOfWeek(day.date)}>
|
<h2 className={cx('scroll-m-20 text-2xl md:text-4xl font-extrabold tracking-tight lg:text-5xl', { 'text-[hsl(var(--grayed-out))]': dayPassed })} id={getDayOfWeek(day.date)}>
|
||||||
{dayOfWeek} <span className={cx('ml-3', { 'text-border': !dayPassed })}>{Intl.DateTimeFormat('ru-RU', {
|
{dayOfWeek} <span className={cx('ml-3', { 'text-border': !dayPassed })}>{Intl.DateTimeFormat('ru-RU', {
|
||||||
day: 'numeric',
|
day: 'numeric',
|
||||||
month: 'long',
|
month: 'long',
|
||||||
// year: 'numeric'
|
// year: 'numeric'
|
||||||
}).format(day.date)}</span>
|
}).format(day.date)}</span>
|
||||||
</h1>
|
</h2>
|
||||||
<div>
|
<div>
|
||||||
<div className='overflow-auto md:snap-x md:snap-proximity md:-translate-x-16 md:w-[calc(100%+8rem)] scrollbar-hide'>
|
<div className='overflow-auto md:snap-x md:snap-proximity md:-translate-x-16 md:w-[calc(100%+8rem)] scrollbar-hide'>
|
||||||
<div className="flex flex-col md:flex-row gap-4 w-full md:w-max">
|
<div className="flex flex-col md:flex-row gap-4 w-full md:w-max">
|
||||||
|
|||||||
Reference in New Issue
Block a user