Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import type { Metadata } from "next"
import { getLevel, getSchool } from "@/components/groups/constants"
import { GroupsResult } from "@/components/groups/groups-result"
import { getLevel, getSchool } from "@/components/wizard/constants"
import { humanizeSlug } from "@/utils/labels"

export const dynamic = "force-dynamic"
Expand Down
13 changes: 9 additions & 4 deletions src/app/groups/didattica/[school]/[level]/page.tsx
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
import type { Metadata } from "next"
import { getLevel, getSchool } from "@/components/groups/constants"
import { CourseStep } from "@/components/groups/course-step"
import type { CourseSearchParams } from "@/components/groups/types"
import { getLevel, getSchool } from "@/components/wizard/constants"
import { CourseStep } from "@/components/wizard/course-step"
import type { CourseSearchParams } from "@/components/wizard/types"
import { createStepHref } from "@/utils/step-href"

export const dynamic = "force-dynamic"

const stepHref = createStepHref("/groups/didattica")

export async function generateMetadata({
params,
}: {
Expand All @@ -30,5 +33,7 @@ export default async function DidatticaCoursePage({
}) {
const { school, level } = await params
const { campus, lang } = await searchParams
return <CourseStep school={school} level={level} campus={campus} lang={lang} />
return (
<CourseStep school={school} level={level} campus={campus} lang={lang} landingHref="/groups" stepHref={stepHref} />
)
}
9 changes: 6 additions & 3 deletions src/app/groups/didattica/[school]/page.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
import type { Metadata } from "next"
import { getSchool } from "@/components/groups/constants"
import { LevelStep } from "@/components/groups/level-step"
import { getSchool } from "@/components/wizard/constants"
import { LevelStep } from "@/components/wizard/level-step"
import { createStepHref } from "@/utils/step-href"

const stepHref = createStepHref("/groups/didattica")

export async function generateMetadata({ params }: { params: Promise<{ school: string }> }): Promise<Metadata> {
const { school: schoolSlug } = await params
Expand All @@ -15,5 +18,5 @@ export async function generateMetadata({ params }: { params: Promise<{ school: s

export default async function DidatticaLevelPage({ params }: { params: Promise<{ school: string }> }) {
const { school } = await params
return <LevelStep school={school} />
return <LevelStep school={school} landingHref="/groups" stepHref={stepHref} />
}
7 changes: 5 additions & 2 deletions src/app/groups/didattica/page.tsx
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
import type { Metadata } from "next"
import { SchoolStep } from "@/components/groups/school-step"
import { SchoolStep } from "@/components/wizard/school-step"
import { createStepHref } from "@/utils/step-href"

const stepHref = createStepHref("/groups/didattica")

export const metadata: Metadata = {
title: "Gruppi Didattici",
description: "Trova i gruppi Telegram e WhatsApp del tuo corso di studi, partendo dalla tua scuola.",
}

export default function DidatticaWizard() {
return <SchoolStep />
return <SchoolStep caption="Troviamo il tuo gruppo partendo dalla base!" landingHref="/groups" stepHref={stepHref} />
}
33 changes: 33 additions & 0 deletions src/app/guides/corso/[school]/[level]/[course]/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
import type { Metadata } from "next"
import { GuidesResult } from "@/components/guides/guides-result"
import { getLevel, getSchool } from "@/components/wizard/constants"
import { humanizeSlug } from "@/utils/labels"

export const dynamic = "force-dynamic"

export async function generateMetadata({
params,
}: {
params: Promise<{ school: string; level: string; course: string }>
}): Promise<Metadata> {
const { school: schoolSlug, level: levelSlug, course } = await params
const school = getSchool(schoolSlug)
const level = getLevel(schoolSlug, levelSlug)
if (!school || !level) return {}

const courseName = humanizeSlug(course)

return {
title: `${courseName} - Guide`,
description: `Guide per ${courseName}, ${level.name} alla ${school.name}.`,
}
}

export default async function GuidesResultPage({
params,
}: {
params: Promise<{ school: string; level: string; course: string }>
}) {
const { school, level, course } = await params
return <GuidesResult school={school} level={level} course={course} />
}
39 changes: 39 additions & 0 deletions src/app/guides/corso/[school]/[level]/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
import type { Metadata } from "next"
import { getLevel, getSchool } from "@/components/wizard/constants"
import { CourseStep } from "@/components/wizard/course-step"
import type { CourseSearchParams } from "@/components/wizard/types"
import { createStepHref } from "@/utils/step-href"

export const dynamic = "force-dynamic"

const stepHref = createStepHref("/guides/corso")

export async function generateMetadata({
params,
}: {
params: Promise<{ school: string; level: string }>
}): Promise<Metadata> {
const { school: schoolSlug, level: levelSlug } = await params
const school = getSchool(schoolSlug)
const level = getLevel(schoolSlug, levelSlug)
if (!school || !level) return {}

return {
title: `${level.name} - ${school.name}`,
description: `Trova le guide del tuo corso di ${level.name.toLowerCase()} alla ${school.name}.`,
}
}

export default async function GuidesCoursePage({
params,
searchParams,
}: {
params: Promise<{ school: string; level: string }>
searchParams: Promise<CourseSearchParams>
}) {
const { school, level } = await params
const { campus, lang } = await searchParams
return (
<CourseStep school={school} level={level} campus={campus} lang={lang} landingHref="/guides" stepHref={stepHref} />
)
}
22 changes: 22 additions & 0 deletions src/app/guides/corso/[school]/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import type { Metadata } from "next"
import { getSchool } from "@/components/wizard/constants"
import { LevelStep } from "@/components/wizard/level-step"
import { createStepHref } from "@/utils/step-href"

const stepHref = createStepHref("/guides/corso")

export async function generateMetadata({ params }: { params: Promise<{ school: string }> }): Promise<Metadata> {
const { school: schoolSlug } = await params
const school = getSchool(schoolSlug)
if (!school) return {}

return {
title: school.name,
description: `Trova le guide della ${school.name}.`,
}
}

export default async function GuidesLevelPage({ params }: { params: Promise<{ school: string }> }) {
const { school } = await params
return <LevelStep school={school} landingHref="/guides" stepHref={stepHref} />
}
14 changes: 14 additions & 0 deletions src/app/guides/corso/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import type { Metadata } from "next"
import { SchoolStep } from "@/components/wizard/school-step"
import { createStepHref } from "@/utils/step-href"

const stepHref = createStepHref("/guides/corso")

export const metadata: Metadata = {
title: "Guide del tuo Corso",
description: "Trova le guide del tuo corso di studi, partendo dalla tua scuola.",
}

export default function GuidesCorsoWizard() {
return <SchoolStep caption="Troviamo la tua guida partendo dalla base!" landingHref="/guides" stepHref={stepHref} />
}
11 changes: 11 additions & 0 deletions src/app/guides/generali/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import type { Metadata } from "next"
import { GeneralGuides } from "@/components/guides/general-guides"

export const metadata: Metadata = {
title: "Guide Generali",
description: "Le guide generali del Politecnico di Milano.",
}

export default function GuidesGeneraliPage() {
return <GeneralGuides />
}
55 changes: 55 additions & 0 deletions src/app/guides/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
import type { Metadata } from "next"
import { FiBook, FiFileText } from "react-icons/fi"
import { CardIcon } from "@/components/card-icon"

const guides = [
{
title: "Guide Generali",
caption: "Informazioni utili su segreterie, servizi, immatricolazione e vita al Politecnico.",
href: "/guides/generali",
icon: FiFileText,
cta: "Esplora",
},
{
title: "Guide del tuo Corso",
caption: "Piani di studio, esami e tutto ciò che riguarda il tuo corso di studi.",
href: "/guides/corso",
icon: FiBook,
cta: "Inizia",
},
] as const

export const metadata: Metadata = {
title: "Guide",
description: "Esplora le guide del Politecnico di Milano, da quelle generali a quelle del tuo corso di studi.",
}

export default function GuidesHome() {
return (
<main className="w-full">
<div className="flex min-h-svh flex-col items-center gap-16 px-6 py-64 md:gap-20 md:py-49">
<div className="flex w-full flex-col items-center gap-5 text-center">
<h2 className="typo-display-large md:typo-display-extralarge w-fit bg-linear-to-b from-text-primary to-text-secondary bg-clip-text py-4 text-transparent md:py-14">
Guide
</h2>
</div>

<div className="flex w-full flex-col items-center justify-center gap-4 md:flex-row md:gap-13">
{guides.map((guide) => (
<CardIcon
key={guide.title}
title={guide.title}
description={guide.caption}
href={guide.href}
icon={guide.icon}
cta={guide.cta}
align="start"
className="w-full max-w-108"
size="compact"
/>
))}
</div>
</div>
</main>
)
}
6 changes: 4 additions & 2 deletions src/components/groups/groups-result.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import Link from "next/link"
import { notFound } from "next/navigation"
import { FiArrowLeft, FiX } from "react-icons/fi"
import { CardCourseGroup } from "@/components/card-course-group"
import { getLevel, getSchool } from "@/components/groups/constants"
import { getLevel, getSchool } from "@/components/wizard/constants"
import { getVisibleGroups } from "@/queries/groups"
import type { VisibleGroup } from "@/queries/types"
import {
Expand All @@ -17,7 +17,9 @@ import {
schoolLabel,
} from "@/utils/labels"
import { mergeGroupsByTitle } from "@/utils/merge-groups"
import { stepHref } from "../../utils/step-href"
import { createStepHref } from "@/utils/step-href"

const stepHref = createStepHref("/groups/didattica")

function GroupSection({ title, groups }: { title: string; groups: VisibleGroup[] }) {
const merged = mergeGroupsByTitle(groups)
Expand Down
2 changes: 1 addition & 1 deletion src/components/groups/report/missing-link/index.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
"use client"

import { useEffect, useRef, useState } from "react"
import { getLevel, getSchool } from "@/components/groups/constants"
import { getLevel, getSchool } from "@/components/wizard/constants"
import { getCoursesForLevel } from "@/queries/groups"
import type { MissingGroupLinkReportInput } from "@/queries/types"
import { courseLabel, humanizeSlug, levelLabel, schoolLabel } from "@/utils/labels"
Expand Down
2 changes: 1 addition & 1 deletion src/components/groups/report/missing-link/level-step.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { CardPathSelection } from "@/components/card-path-selection"
import { getLevelsForSchool } from "@/components/groups/constants"
import { Button } from "@/components/ui/button"
import { DialogDescription, DialogFooter, DialogHeader } from "@/components/ui/dialog"
import { getLevelsForSchool } from "@/components/wizard/constants"

export function LevelStep({
schoolName,
Expand Down
2 changes: 1 addition & 1 deletion src/components/groups/report/missing-link/school-step.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { DEFAULT_SCHOOL_ICON, SCHOOL_ICONS, SCHOOLS } from "@/components/groups/constants"
import { SelectableCardIcon } from "@/components/groups/report/selectable-card-icon"
import { DialogDescription, DialogHeader } from "@/components/ui/dialog"
import { DEFAULT_SCHOOL_ICON, SCHOOL_ICONS, SCHOOLS } from "@/components/wizard/constants"

export function SchoolStep({ onBack, onSelect }: { onBack: () => void; onSelect: (schoolSlug: string) => void }) {
return (
Expand Down
26 changes: 26 additions & 0 deletions src/components/guides/constants.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
export const LOREM_GUIDES = [
{
value: "lorem-ipsum-dolor-sit-amet",
trigger: "Lorem ipsum dolor sit amet",
content:
"Consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.",
},
{
value: "ut-enim-ad-minim-veniam",
trigger: "Ut enim ad minim veniam",
content:
"Quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium.",
},
{
value: "duis-aute-irure-dolor",
trigger: "Duis aute irure dolor",
content:
"In reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt.",
},
{
value: "excepteur-sint-occaecat",
trigger: "Excepteur sint occaecat",
content:
"Cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt.",
},
]
Comment thread
BIA3IA marked this conversation as resolved.
39 changes: 39 additions & 0 deletions src/components/guides/general-guides.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
import Link from "next/link"
import { FiArrowLeft, FiX } from "react-icons/fi"
import AccordionList from "@/components/accordion-list"
import { LOREM_GUIDES } from "@/components/guides/constants"

export function GeneralGuides() {
return (
<main className="mx-auto flex min-h-svh w-full min-w-0 max-w-7xl flex-col gap-8 px-6 py-52 md:gap-0">
<header className="relative flex flex-col items-center gap-1 md:static md:flex-row md:items-center md:gap-4">
<Link
href="/guides"
replace
aria-label="Indietro"
className="absolute top-0 left-0 grid size-10 shrink-0 place-items-center rounded-full bg-white/60 md:static"
>
<FiArrowLeft className="size-5" />
</Link>
<div className="flex min-w-0 flex-col items-center gap-1 text-center md:flex-1">
<h1 className="typo-title-large md:typo-display-medium text-text-primary">Guide Generali</h1>
</div>
<Link
href="/guides"
aria-label="Chiudi"
className="absolute top-0 right-0 grid size-10 shrink-0 place-items-center rounded-full bg-white/60 md:static"
>
<FiX className="size-5" />
</Link>
</header>

{LOREM_GUIDES.length > 0 ? (
<AccordionList items={LOREM_GUIDES} className="md:mt-25.75" />
Comment thread
BIA3IA marked this conversation as resolved.
) : (
<p className="typo-body-medium text-center text-text-secondary md:mt-16.25">
Nessuna guida disponibile al momento.
</p>
)}
</main>
)
}
Loading
Loading