mirror of
https://github.com/rzmk/learnhouse.git
synced 2025-12-19 04:19:25 +00:00
Update project dependencies to React 19 and Next.js 15, including TypeScript type adjustments and async parameter handling across multiple components
107 lines
3.4 KiB
TypeScript
107 lines
3.4 KiB
TypeScript
export const dynamic = 'force-dynamic'
|
|
import { Metadata } from 'next'
|
|
import { getUriWithOrg } from '@services/config/config'
|
|
import { getOrgCourses } from '@services/courses/courses'
|
|
import Link from 'next/link'
|
|
import { getOrganizationContextInfo } from '@services/organizations/orgs'
|
|
import GeneralWrapperStyled from '@components/Objects/StyledElements/Wrappers/GeneralWrapper'
|
|
import TypeOfContentTitle from '@components/Objects/StyledElements/Titles/TypeOfContentTitle'
|
|
import CourseThumbnail from '@components/Objects/Thumbnails/CourseThumbnail'
|
|
import CollectionThumbnail from '@components/Objects/Thumbnails/CollectionThumbnail'
|
|
import AuthenticatedClientElement from '@components/Security/AuthenticatedClientElement'
|
|
import NewCourseButton from '@components/Objects/StyledElements/Buttons/NewCourseButton'
|
|
import NewCollectionButton from '@components/Objects/StyledElements/Buttons/NewCollectionButton'
|
|
import ContentPlaceHolderIfUserIsNotAdmin from '@components/Objects/ContentPlaceHolder'
|
|
import { getOrgCollections } from '@services/courses/collections'
|
|
import { getServerSession } from 'next-auth'
|
|
import { nextAuthOptions } from 'app/auth/options'
|
|
import { getOrgThumbnailMediaDirectory } from '@services/media/media'
|
|
import LandingClassic from '@components/Landings/LandingClassic'
|
|
import LandingCustom from '@components/Landings/LandingCustom'
|
|
|
|
type MetadataProps = {
|
|
params: Promise<{ orgslug: string }>
|
|
searchParams: Promise<{ [key: string]: string | string[] | undefined }>
|
|
}
|
|
|
|
export async function generateMetadata(props: MetadataProps): Promise<Metadata> {
|
|
const params = await props.params;
|
|
// Get Org context information
|
|
const org = await getOrganizationContextInfo(params.orgslug, {
|
|
revalidate: 0,
|
|
tags: ['organizations'],
|
|
})
|
|
|
|
// SEO
|
|
return {
|
|
title: `Home — ${org.name}`,
|
|
description: org.description,
|
|
robots: {
|
|
index: true,
|
|
follow: true,
|
|
nocache: true,
|
|
googleBot: {
|
|
index: true,
|
|
follow: true,
|
|
'max-image-preview': 'large',
|
|
},
|
|
},
|
|
openGraph: {
|
|
title: `Home — ${org.name}`,
|
|
description: org.description,
|
|
type: 'website',
|
|
images: [
|
|
{
|
|
url: getOrgThumbnailMediaDirectory(org?.org_uuid, org?.thumbnail_image),
|
|
width: 800,
|
|
height: 600,
|
|
alt: org.name,
|
|
},
|
|
],
|
|
},
|
|
}
|
|
}
|
|
|
|
const OrgHomePage = async (params: any) => {
|
|
const orgslug = (await params.params).orgslug
|
|
const session = await getServerSession(nextAuthOptions)
|
|
const access_token = session?.tokens?.access_token
|
|
const courses = await getOrgCourses(
|
|
orgslug,
|
|
{ revalidate: 0, tags: ['courses'] },
|
|
access_token ? access_token : null
|
|
)
|
|
const org = await getOrganizationContextInfo(orgslug, {
|
|
revalidate: 0,
|
|
tags: ['organizations'],
|
|
})
|
|
const org_id = org.id
|
|
const collections = await getOrgCollections(
|
|
org.id,
|
|
access_token ? access_token : null,
|
|
{ revalidate: 0, tags: ['courses'] }
|
|
)
|
|
|
|
// Check if custom landing is enabled
|
|
const hasCustomLanding = org.config?.config?.landing?.enabled
|
|
|
|
return (
|
|
<div className="w-full">
|
|
{hasCustomLanding ? (
|
|
<LandingCustom
|
|
landing={org.config.config.landing}
|
|
orgslug={orgslug}
|
|
/>
|
|
) : (
|
|
<LandingClassic
|
|
courses={courses}
|
|
collections={collections}
|
|
orgslug={orgslug}
|
|
org_id={org_id}
|
|
/>
|
|
)}
|
|
</div>
|
|
)
|
|
}
|
|
|
|
export default OrgHomePage
|