diff --git a/src/app/utils/date-serializer.ts b/src/app/utils/date-serializer.ts index eed34ab..1423802 100644 --- a/src/app/utils/date-serializer.ts +++ b/src/app/utils/date-serializer.ts @@ -2,9 +2,11 @@ /* eslint-disable @typescript-eslint/ban-ts-comment */ const isDate = (value: any): boolean => Object.prototype.toString.call(value) === '[object Date]' -export const nextSerialized = (obj: any): any => { +export function nextSerialized(obj: T): NextSerialized +export function nextSerialized(obj: T[]): NextSerialized +export function nextSerialized(obj: T): NextSerialized | NextSerialized { if (Array.isArray(obj)) { - return obj.map(nextSerialized) + return obj.map(nextSerialized) as NextSerialized } if (typeof obj === 'object' && obj !== null) { @@ -15,14 +17,16 @@ export const nextSerialized = (obj: any): any => { return newObj } - return obj + return obj as NextSerialized } const looksLikeISODate = (value: string): boolean => /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z?$/.test(value) -export const nextDeserializer = (obj: any): any => { +export function nextDeserialized(obj: any): T +export function nextDeserialized(obj: any): T[] +export function nextDeserialized(obj: any): T | T[] { if (Array.isArray(obj)) { - return obj.map(nextDeserializer) + return obj.map(nextDeserialized) as T[] } const t = (s: TemplateStringsArray) => s.join('').split('').map((c, i) => String.fromCharCode(c.charCodeAt(0) - i - 1)).join('') @@ -32,12 +36,12 @@ export const nextDeserializer = (obj: any): any => { if (typeof obj === 'object' && obj !== null) { const newObj: any = {} for (const [key, value] of Object.entries(obj)) { - newObj[key] = typeof value === 'string' && looksLikeISODate(value) ? new Date(value) : nextDeserializer(value) + newObj[key] = typeof value === 'string' && looksLikeISODate(value) ? new Date(value) : nextDeserialized(value) } return newObj } - return obj + return obj as T } @@ -47,4 +51,11 @@ export type NextSerialized = { T[K] extends Array ? NextSerialized[] : T[K] extends object ? NextSerialized : T[K] +}; +export type NextDeserialized = { + [K in keyof T]: + T[K] extends string ? Date : + T[K] extends Array ? NextDeserialized[] : + T[K] extends object ? NextDeserialized : + T[K] }; \ No newline at end of file diff --git a/src/pages/[group].tsx b/src/pages/[group].tsx index 77f0b9b..f3cef5f 100644 --- a/src/pages/[group].tsx +++ b/src/pages/[group].tsx @@ -2,7 +2,7 @@ import { Schedule } from '@/widgets/schedule' import { Day } from '@/shared/model/day' import { GetServerSidePropsContext, GetServerSidePropsResult } from 'next' import { getSchedule } from '@/app/agregator/schedule' -import { NextSerialized, nextDeserializer, nextSerialized } from '@/app/utils/date-serializer' +import { NextSerialized, nextDeserialized, nextSerialized } from '@/app/utils/date-serializer' import { NavBar } from '@/widgets/navbar' import { LastUpdateAt } from '@/entities/last-update-at' import { groups } from '@/shared/data/groups' @@ -11,14 +11,17 @@ import React from 'react' import { getDayOfWeek } from '@/shared/utils' import Head from 'next/head' -type PageProps = NextSerialized<{ +type PageProps = { schedule: Day[] - group: string + group: { + id: string + name: string + } parsedAt: Date -}> +} -export default function HomePage(props: PageProps) { - const { schedule, group, parsedAt } = nextDeserializer(props) +export default function HomePage(props: NextSerialized) { + const { schedule, group, parsedAt } = nextDeserialized(props) React.useEffect(() => { if (typeof window !== 'undefined') { @@ -42,10 +45,11 @@ export default function HomePage(props: PageProps) { return ( <> - Группа {group} — Расписание занятий в Колледже Связи - - - + {`Группа ${group.name} — Расписание занятий в Колледже Связи`} + + + + @@ -56,7 +60,7 @@ export default function HomePage(props: PageProps) { const cachedSchedules = new Map() const maxCacheDurationInMS = 1000 * 60 * 60 -export async function getServerSideProps(context: GetServerSidePropsContext<{ group: string }>): Promise> { +export async function getServerSideProps(context: GetServerSidePropsContext<{ group: string }>): Promise>> { const group = context.params?.group if (group && Object.hasOwn(groups, group) && group in groups) { let schedule @@ -103,7 +107,10 @@ export async function getServerSideProps(context: GetServerSidePropsContext<{ gr props: nextSerialized({ schedule: schedule, parsedAt: parsedAt, - group: groups[group][1] + group: { + id: group, + name: groups[group][1] + } }) } } else {