chore: upgrade React and Next.js to latest versions

Update project dependencies to React 19 and Next.js 15, including TypeScript type adjustments and async parameter handling across multiple components
This commit is contained in:
swve 2025-03-11 12:50:56 +01:00
parent 81c4190b00
commit 63be0f0ff3
28 changed files with 2781 additions and 2878 deletions

View file

@ -3,12 +3,12 @@ import LoginClient from './login'
import { Metadata } from 'next' import { Metadata } from 'next'
type MetadataProps = { type MetadataProps = {
params: { orgslug: string } params: Promise<{ orgslug: string }>
searchParams: { [key: string]: string | string[] | undefined } searchParams: Promise<{ [key: string]: string | string[] | undefined }>
} }
export async function generateMetadata(params: MetadataProps): Promise<Metadata> { export async function generateMetadata(params: MetadataProps): Promise<Metadata> {
const orgslug = params.searchParams.orgslug const orgslug = (await params.searchParams).orgslug
//const orgslug = params.orgslug //const orgslug = params.orgslug
// Get Org context information // Get Org context information
@ -23,7 +23,7 @@ export async function generateMetadata(params: MetadataProps): Promise<Metadata>
} }
const Login = async (params: MetadataProps) => { const Login = async (params: MetadataProps) => {
const orgslug = params.searchParams.orgslug const orgslug = (await params.searchParams).orgslug
const org = await getOrganizationContextInfo(orgslug, { const org = await getOrganizationContextInfo(orgslug, {
revalidate: 0, revalidate: 0,
tags: ['organizations'], tags: ['organizations'],

View file

@ -5,14 +5,14 @@ import { Suspense } from 'react'
import PageLoading from '@components/Objects/Loaders/PageLoading' import PageLoading from '@components/Objects/Loaders/PageLoading'
type MetadataProps = { type MetadataProps = {
params: { orgslug: string; courseid: string } params: Promise<{ orgslug: string; courseid: string }>
searchParams: { [key: string]: string | string[] | undefined } searchParams: Promise<{ [key: string]: string | string[] | undefined }>
} }
export async function generateMetadata( export async function generateMetadata(
params params
: MetadataProps): Promise<Metadata> { : MetadataProps): Promise<Metadata> {
const orgslug = params.searchParams.orgslug const orgslug = (await params.searchParams).orgslug
// Get Org context information // Get Org context information
const org = await getOrganizationContextInfo(orgslug, { const org = await getOrganizationContextInfo(orgslug, {
revalidate: 0, revalidate: 0,
@ -25,7 +25,7 @@ export async function generateMetadata(
} }
const SignUp = async (params: any) => { const SignUp = async (params: any) => {
const orgslug = params.searchParams.orgslug const orgslug = (await params.searchParams).orgslug
const org = await getOrganizationContextInfo(orgslug, { const org = await getOrganizationContextInfo(orgslug, {
revalidate: 0, revalidate: 0,
tags: ['organizations'], tags: ['organizations'],

View file

@ -1,3 +1,4 @@
import { default as React } from 'react' import { default as React } from 'react'
import dynamic from 'next/dynamic' import dynamic from 'next/dynamic'
import { getCourseMetadata } from '@services/courses/courses' import { getCourseMetadata } from '@services/courses/courses'
@ -8,17 +9,16 @@ import EditorOptionsProvider from '@components/Contexts/Editor/EditorContext'
import AIEditorProvider from '@components/Contexts/AI/AIEditorContext' import AIEditorProvider from '@components/Contexts/AI/AIEditorContext'
import { nextAuthOptions } from 'app/auth/options' import { nextAuthOptions } from 'app/auth/options'
import { getServerSession } from 'next-auth' import { getServerSession } from 'next-auth'
const EditorWrapper = dynamic(() => import('@components/Objects/Editor/EditorWrapper'), { ssr: false }) import EditorWrapper from '@components/Objects/Editor/EditorWrapper'
type MetadataProps = { type MetadataProps = {
params: { orgslug: string; courseid: string; activityid: string } params: Promise<{ orgslug: string; courseid: string; activityid: string }>
searchParams: { [key: string]: string | string[] | undefined } searchParams: Promise<{ [key: string]: string | string[] | undefined }>
} }
export async function generateMetadata({ export async function generateMetadata(props: MetadataProps): Promise<Metadata> {
params, const params = await props.params;
}: MetadataProps): Promise<Metadata> {
const session = await getServerSession(nextAuthOptions) const session = await getServerSession(nextAuthOptions)
const access_token = session?.tokens?.access_token const access_token = session?.tokens?.access_token
// Get Org context information // Get Org context information
@ -37,8 +37,8 @@ export async function generateMetadata({
const EditActivity = async (params: any) => { const EditActivity = async (params: any) => {
const session = await getServerSession(nextAuthOptions) const session = await getServerSession(nextAuthOptions)
const access_token = session?.tokens?.access_token const access_token = session?.tokens?.access_token
const activityuuid = params.params.activityuuid const activityuuid = (await params.params).activityuuid
const courseid = params.params.courseid const courseid = (await params.params).courseid
const courseInfo = await getCourseMetadata( const courseInfo = await getCourseMetadata(
courseid, courseid,
{ revalidate: 0, tags: ['courses'] }, { revalidate: 0, tags: ['courses'] },

View file

@ -31,7 +31,6 @@ export default function RootLayout({
animate="enter" // Animated state to variants.enter animate="enter" // Animated state to variants.enter
exit="exit" // Exit state (used later) to variants.exit exit="exit" // Exit state (used later) to variants.exit
transition={{ type: 'linear' }} // Set the transition to linear transition={{ type: 'linear' }} // Set the transition to linear
className=""
> >
{children} {children}
</motion.main> </motion.main>

View file

@ -9,13 +9,12 @@ import { getServerSession } from 'next-auth'
import Link from 'next/link' import Link from 'next/link'
type MetadataProps = { type MetadataProps = {
params: { orgslug: string; courseid: string; collectionid: string } params: Promise<{ orgslug: string; courseid: string; collectionid: string }>
searchParams: { [key: string]: string | string[] | undefined } searchParams: Promise<{ [key: string]: string | string[] | undefined }>
} }
export async function generateMetadata({ export async function generateMetadata(props: MetadataProps): Promise<Metadata> {
params, const params = await props.params;
}: MetadataProps): Promise<Metadata> {
const session = await getServerSession(nextAuthOptions) const session = await getServerSession(nextAuthOptions)
const access_token = session?.tokens?.access_token const access_token = session?.tokens?.access_token
@ -55,13 +54,13 @@ export async function generateMetadata({
const CollectionPage = async (params: any) => { const CollectionPage = async (params: any) => {
const session = await getServerSession(nextAuthOptions) const session = await getServerSession(nextAuthOptions)
const access_token = session?.tokens?.access_token const access_token = session?.tokens?.access_token
const org = await getOrganizationContextInfo(params.params.orgslug, { const org = await getOrganizationContextInfo((await params.params).orgslug, {
revalidate: 1800, revalidate: 1800,
tags: ['organizations'], tags: ['organizations'],
}) })
const orgslug = params.params.orgslug const orgslug = (await params.params).orgslug
const col = await getCollectionById( const col = await getCollectionById(
params.params.collectionid, (await params.params).collectionid,
access_token ? access_token : null, access_token ? access_token : null,
{ revalidate: 0, tags: ['collections'] } { revalidate: 0, tags: ['collections'] }
) )

View file

@ -14,13 +14,12 @@ import { getOrgThumbnailMediaDirectory } from '@services/media/media'
import ContentPlaceHolderIfUserIsNotAdmin from '@components/Objects/ContentPlaceHolder' import ContentPlaceHolderIfUserIsNotAdmin from '@components/Objects/ContentPlaceHolder'
type MetadataProps = { type MetadataProps = {
params: { orgslug: string; courseid: string } params: Promise<{ orgslug: string; courseid: string }>
searchParams: { [key: string]: string | string[] | undefined } searchParams: Promise<{ [key: string]: string | string[] | undefined }>
} }
export async function generateMetadata({ export async function generateMetadata(props: MetadataProps): Promise<Metadata> {
params, const params = await props.params;
}: MetadataProps): Promise<Metadata> {
// Get Org context information // Get Org context information
const org = await getOrganizationContextInfo(params.orgslug, { const org = await getOrganizationContextInfo(params.orgslug, {
revalidate: 0, revalidate: 0,
@ -60,7 +59,7 @@ export async function generateMetadata({
const CollectionsPage = async (params: any) => { const CollectionsPage = async (params: any) => {
const session = await getServerSession(nextAuthOptions) const session = await getServerSession(nextAuthOptions)
const access_token = session?.tokens?.access_token const access_token = session?.tokens?.access_token
const orgslug = params.params.orgslug const orgslug = (await params.params).orgslug
const org = await getOrganizationContextInfo(orgslug, { const org = await getOrganizationContextInfo(orgslug, {
revalidate: 1800, revalidate: 1800,
tags: ['organizations'], tags: ['organizations'],

View file

@ -461,7 +461,7 @@ function ActivityChapterDropdown(props: {
<div className="relative" ref={dropdownRef}> <div className="relative" ref={dropdownRef}>
<button <button
onClick={toggleDropdown} onClick={toggleDropdown}
className="flex items-center justify-center bg-white nice-shadow p-2.5 rounded-full" className="flex items-center justify-center bg-white nice-shadow p-2.5 rounded-full cursor-pointer"
aria-label="View all activities" aria-label="View all activities"
title="View all activities" title="View all activities"
> >
@ -469,12 +469,12 @@ function ActivityChapterDropdown(props: {
</button> </button>
{isOpen && ( {isOpen && (
<div className={`absolute z-50 mt-2 ${isMobile ? 'left-0 w-[90vw] sm:w-80' : 'left-0 w-80'} max-h-[70vh] overflow-y-auto bg-white rounded-lg shadow-xl border border-gray-200 py-2 animate-in fade-in duration-200`}> <div className={`absolute z-50 mt-2 ${isMobile ? 'left-0 w-[90vw] sm:w-80' : 'left-0 w-80'} max-h-[70vh] cursor-pointer overflow-y-auto bg-white rounded-lg shadow-xl border border-gray-200 py-2 animate-in fade-in duration-200`}>
<div className="px-4 py-2 border-b border-gray-100 flex justify-between items-center"> <div className="px-4 py-2 border-b border-gray-100 flex justify-between items-center">
<h3 className="font-bold text-gray-800">Course Content</h3> <h3 className="font-bold text-gray-800">Course Content</h3>
<button <button
onClick={() => setIsOpen(false)} onClick={() => setIsOpen(false)}
className="text-gray-500 hover:text-gray-700 p-1 rounded-full hover:bg-gray-100" className="text-gray-500 hover:text-gray-700 p-1 rounded-full hover:bg-gray-100 cursor-pointer"
> >
<X size={18} /> <X size={18} />
</button> </button>
@ -630,7 +630,7 @@ function ActivityNavigation(props: {
<> <>
<button <button
onClick={() => navigateToActivity(prevActivity)} onClick={() => navigateToActivity(prevActivity)}
className={`flex items-center space-x-1.5 p-2 rounded-md transition-all duration-200 ${ className={`flex items-center space-x-1.5 p-2 rounded-md transition-all duration-200 cursor-pointer ${
prevActivity prevActivity
? 'text-gray-700' ? 'text-gray-700'
: 'opacity-50 text-gray-400 cursor-not-allowed' : 'opacity-50 text-gray-400 cursor-not-allowed'
@ -649,7 +649,7 @@ function ActivityNavigation(props: {
<button <button
onClick={() => navigateToActivity(nextActivity)} onClick={() => navigateToActivity(nextActivity)}
className={`flex items-center space-x-1.5 p-2 rounded-md transition-all duration-200 ${ className={`flex items-center space-x-1.5 p-2 rounded-md transition-all duration-200 cursor-pointer ${
nextActivity nextActivity
? 'text-gray-700' ? 'text-gray-700'
: 'opacity-50 text-gray-400 cursor-not-allowed' : 'opacity-50 text-gray-400 cursor-not-allowed'
@ -672,7 +672,7 @@ function ActivityNavigation(props: {
<div className="justify-self-start"> <div className="justify-self-start">
<button <button
onClick={() => navigateToActivity(prevActivity)} onClick={() => navigateToActivity(prevActivity)}
className={`flex items-center space-x-1.5 px-3.5 py-2 rounded-md transition-all duration-200 ${ className={`flex items-center space-x-1.5 px-3.5 py-2 rounded-md transition-all duration-200 cursor-pointer ${
prevActivity prevActivity
? 'bg-white nice-shadow text-gray-700' ? 'bg-white nice-shadow text-gray-700'
: 'bg-gray-100 text-gray-400 cursor-not-allowed' : 'bg-gray-100 text-gray-400 cursor-not-allowed'
@ -697,7 +697,7 @@ function ActivityNavigation(props: {
<div className="justify-self-end"> <div className="justify-self-end">
<button <button
onClick={() => navigateToActivity(nextActivity)} onClick={() => navigateToActivity(nextActivity)}
className={`flex items-center space-x-1.5 px-3.5 py-2 rounded-md transition-all duration-200 ${ className={`flex items-center space-x-1.5 px-3.5 py-2 rounded-md transition-all duration-200 cursor-pointer ${
nextActivity nextActivity
? 'bg-white nice-shadow text-gray-700' ? 'bg-white nice-shadow text-gray-700'
: 'bg-gray-100 text-gray-400 cursor-not-allowed' : 'bg-gray-100 text-gray-400 cursor-not-allowed'

View file

@ -7,13 +7,12 @@ import { getServerSession } from 'next-auth'
import { nextAuthOptions } from 'app/auth/options' import { nextAuthOptions } from 'app/auth/options'
type MetadataProps = { type MetadataProps = {
params: { orgslug: string; courseuuid: string; activityid: string } params: Promise<{ orgslug: string; courseuuid: string; activityid: string }>
searchParams: { [key: string]: string | string[] | undefined } searchParams: Promise<{ [key: string]: string | string[] | undefined }>
} }
export async function generateMetadata({ export async function generateMetadata(props: MetadataProps): Promise<Metadata> {
params, const params = await props.params;
}: MetadataProps): Promise<Metadata> {
const session = await getServerSession(nextAuthOptions) const session = await getServerSession(nextAuthOptions)
const access_token = session?.tokens?.access_token const access_token = session?.tokens?.access_token
@ -60,9 +59,9 @@ export async function generateMetadata({
const ActivityPage = async (params: any) => { const ActivityPage = async (params: any) => {
const session = await getServerSession(nextAuthOptions) const session = await getServerSession(nextAuthOptions)
const access_token = session?.tokens?.access_token const access_token = session?.tokens?.access_token
const activityid = params.params.activityid const activityid = (await params.params).activityid
const courseuuid = params.params.courseuuid const courseuuid = (await params.params).courseuuid
const orgslug = params.params.orgslug const orgslug = (await params.params).orgslug
const course_meta = await getCourseMetadata( const course_meta = await getCourseMetadata(
courseuuid, courseuuid,

View file

@ -8,13 +8,12 @@ import { nextAuthOptions } from 'app/auth/options'
import { getServerSession } from 'next-auth' import { getServerSession } from 'next-auth'
type MetadataProps = { type MetadataProps = {
params: { orgslug: string; courseuuid: string } params: Promise<{ orgslug: string; courseuuid: string }>
searchParams: { [key: string]: string | string[] | undefined } searchParams: Promise<{ [key: string]: string | string[] | undefined }>
} }
export async function generateMetadata({ export async function generateMetadata(props: MetadataProps): Promise<Metadata> {
params, const params = await props.params;
}: MetadataProps): Promise<Metadata> {
const session = await getServerSession(nextAuthOptions) const session = await getServerSession(nextAuthOptions)
const access_token = session?.tokens?.access_token const access_token = session?.tokens?.access_token
@ -67,8 +66,8 @@ export async function generateMetadata({
} }
const CoursePage = async (params: any) => { const CoursePage = async (params: any) => {
const courseuuid = params.params.courseuuid const courseuuid = (await params.params).courseuuid
const orgslug = params.params.orgslug const orgslug = (await params.params).orgslug
const session = await getServerSession(nextAuthOptions) const session = await getServerSession(nextAuthOptions)
const access_token = session?.tokens?.access_token const access_token = session?.tokens?.access_token
const course_meta = await getCourseMetadata( const course_meta = await getCourseMetadata(

View file

@ -8,13 +8,12 @@ import { getOrgCourses } from '@services/courses/courses'
import { getOrgThumbnailMediaDirectory } from '@services/media/media' import { getOrgThumbnailMediaDirectory } from '@services/media/media'
type MetadataProps = { type MetadataProps = {
params: { orgslug: string } params: Promise<{ orgslug: string }>
searchParams: { [key: string]: string | string[] | undefined } searchParams: Promise<{ [key: string]: string | string[] | undefined }>
} }
export async function generateMetadata({ export async function generateMetadata(props: MetadataProps): Promise<Metadata> {
params, const params = await props.params;
}: MetadataProps): Promise<Metadata> {
// Get Org context information // Get Org context information
const org = await getOrganizationContextInfo(params.orgslug, { const org = await getOrganizationContextInfo(params.orgslug, {
revalidate: 0, revalidate: 0,
@ -53,7 +52,7 @@ export async function generateMetadata({
} }
const CoursesPage = async (params: any) => { const CoursesPage = async (params: any) => {
const orgslug = params.params.orgslug const orgslug = (await params.params).orgslug
const org = await getOrganizationContextInfo(orgslug, { const org = await getOrganizationContextInfo(orgslug, {
revalidate: 1800, revalidate: 1800,
tags: ['organizations'], tags: ['organizations'],

View file

@ -1,16 +1,22 @@
'use client' 'use client';
import { use } from "react";
import '@styles/globals.css' import '@styles/globals.css'
import { SessionProvider } from 'next-auth/react' import { SessionProvider } from 'next-auth/react'
import Watermark from '@components/Objects/Watermark' import Watermark from '@components/Objects/Watermark'
import { OrgMenu } from '@components/Objects/Menus/OrgMenu' import { OrgMenu } from '@components/Objects/Menus/OrgMenu'
export default function RootLayout({ export default function RootLayout(
children, props: {
params, children: React.ReactNode
}: { params: Promise<any>
children: React.ReactNode }
params: any ) {
}) { const params = use(props.params);
const {
children
} = props;
return ( return (
<> <>
<SessionProvider> <SessionProvider>

View file

@ -20,13 +20,12 @@ import LandingClassic from '@components/Landings/LandingClassic'
import LandingCustom from '@components/Landings/LandingCustom' import LandingCustom from '@components/Landings/LandingCustom'
type MetadataProps = { type MetadataProps = {
params: { orgslug: string } params: Promise<{ orgslug: string }>
searchParams: { [key: string]: string | string[] | undefined } searchParams: Promise<{ [key: string]: string | string[] | undefined }>
} }
export async function generateMetadata({ export async function generateMetadata(props: MetadataProps): Promise<Metadata> {
params, const params = await props.params;
}: MetadataProps): Promise<Metadata> {
// Get Org context information // Get Org context information
const org = await getOrganizationContextInfo(params.orgslug, { const org = await getOrganizationContextInfo(params.orgslug, {
revalidate: 0, revalidate: 0,
@ -64,7 +63,7 @@ export async function generateMetadata({
} }
const OrgHomePage = async (params: any) => { const OrgHomePage = async (params: any) => {
const orgslug = params.params.orgslug const orgslug = (await params.params).orgslug
const session = await getServerSession(nextAuthOptions) const session = await getServerSession(nextAuthOptions)
const access_token = session?.tokens?.access_token const access_token = session?.tokens?.access_token
const courses = await getOrgCourses( const courses = await getOrgCourses(

View file

@ -6,13 +6,12 @@ import { getServerSession } from 'next-auth'
import { nextAuthOptions } from 'app/auth/options' import { nextAuthOptions } from 'app/auth/options'
type MetadataProps = { type MetadataProps = {
params: { orgslug: string } params: Promise<{ orgslug: string }>
searchParams: { [key: string]: string | string[] | undefined } searchParams: Promise<{ [key: string]: string | string[] | undefined }>
} }
export async function generateMetadata({ export async function generateMetadata(props: MetadataProps): Promise<Metadata> {
params, const params = await props.params;
}: MetadataProps): Promise<Metadata> {
const session = await getServerSession(nextAuthOptions) const session = await getServerSession(nextAuthOptions)
const access_token = session?.tokens?.access_token const access_token = session?.tokens?.access_token
// Get Org context information // Get Org context information
@ -28,7 +27,7 @@ export async function generateMetadata({
} }
const TrailPage = async (params: any) => { const TrailPage = async (params: any) => {
let orgslug = params.params.orgslug let orgslug = (await params.params).orgslug
return ( return (
<div> <div>

View file

@ -1,6 +1,6 @@
'use client' 'use client'
import { getUriWithOrg } from '@services/config/config' import { getUriWithOrg } from '@services/config/config'
import React from 'react' import React, { use } from 'react';
import { CourseProvider } from '../../../../../../../../components/Contexts/CourseContext' import { CourseProvider } from '../../../../../../../../components/Contexts/CourseContext'
import Link from 'next/link' import Link from 'next/link'
import { CourseOverviewTop } from '@components/Dashboard/Misc/CourseOverviewTop' import { CourseOverviewTop } from '@components/Dashboard/Misc/CourseOverviewTop'
@ -16,7 +16,8 @@ export type CourseOverviewParams = {
subpage: string subpage: string
} }
function CourseOverviewPage({ params }: { params: CourseOverviewParams }) { function CourseOverviewPage(props: { params: Promise<CourseOverviewParams> }) {
const params = use(props.params);
function getEntireCourseUUID(courseuuid: string) { function getEntireCourseUUID(courseuuid: string) {
// add course_ to uuid // add course_ to uuid
return `course_${courseuuid}` return `course_${courseuuid}`

View file

@ -7,13 +7,12 @@ import { getServerSession } from 'next-auth'
import { getOrgCourses } from '@services/courses/courses' import { getOrgCourses } from '@services/courses/courses'
type MetadataProps = { type MetadataProps = {
params: { orgslug: string } params: Promise<{ orgslug: string }>
searchParams: { [key: string]: string | string[] | undefined } searchParams: Promise<{ [key: string]: string | string[] | undefined }>
} }
export async function generateMetadata({ export async function generateMetadata(props: MetadataProps): Promise<Metadata> {
params, const params = await props.params;
}: MetadataProps): Promise<Metadata> {
// Get Org context information // Get Org context information
const org = await getOrganizationContextInfo(params.orgslug, { const org = await getOrganizationContextInfo(params.orgslug, {
revalidate: 1800, revalidate: 1800,
@ -44,7 +43,7 @@ export async function generateMetadata({
} }
async function CoursesPage(params: any) { async function CoursesPage(params: any) {
const orgslug = params.params.orgslug const orgslug = (await params.params).orgslug
const org = await getOrganizationContextInfo(orgslug, { const org = await getOrganizationContextInfo(orgslug, {
revalidate: 1800, revalidate: 1800,
tags: ['organizations'], tags: ['organizations'],

View file

@ -6,13 +6,18 @@ export const metadata: Metadata = {
title: 'LearnHouse Dashboard', title: 'LearnHouse Dashboard',
} }
function DashboardLayout({ async function DashboardLayout(
children, props: {
params, children: React.ReactNode
}: { params: Promise<any>
children: React.ReactNode }
params: any ) {
}) { const params = await props.params;
const {
children
} = props;
return ( return (
<> <>
<ClientAdminLayout <ClientAdminLayout

View file

@ -3,7 +3,7 @@ import BreadCrumbs from '@components/Dashboard/Misc/BreadCrumbs'
import { getUriWithOrg } from '@services/config/config' import { getUriWithOrg } from '@services/config/config'
import { ImageIcon, Info, LockIcon, SearchIcon, TextIcon, LucideIcon, Share2Icon, LayoutDashboardIcon } from 'lucide-react' import { ImageIcon, Info, LockIcon, SearchIcon, TextIcon, LucideIcon, Share2Icon, LayoutDashboardIcon } from 'lucide-react'
import Link from 'next/link' import Link from 'next/link'
import React, { useEffect } from 'react' import React, { useEffect, use } from 'react';
import { motion } from 'framer-motion' import { motion } from 'framer-motion'
import OrgEditGeneral from '@components/Dashboard/Pages/Org/OrgEditGeneral/OrgEditGeneral' import OrgEditGeneral from '@components/Dashboard/Pages/Org/OrgEditGeneral/OrgEditGeneral'
import OrgEditImages from '@components/Dashboard/Pages/Org/OrgEditImages/OrgEditImages' import OrgEditImages from '@components/Dashboard/Pages/Org/OrgEditImages/OrgEditImages'
@ -49,7 +49,8 @@ function TabLink({ tab, isActive, orgslug }: {
) )
} }
function OrgPage({ params }: { params: OrgParams }) { function OrgPage(props: { params: Promise<OrgParams> }) {
const params = use(props.params);
const [H1Label, setH1Label] = React.useState('') const [H1Label, setH1Label] = React.useState('')
const [H2Label, setH2Label] = React.useState('') const [H2Label, setH2Label] = React.useState('')

View file

@ -1,5 +1,5 @@
'use client' 'use client'
import React from 'react' import React, { use } from 'react';
import { motion } from 'framer-motion' import { motion } from 'framer-motion'
import BreadCrumbs from '@components/Dashboard/Misc/BreadCrumbs' import BreadCrumbs from '@components/Dashboard/Misc/BreadCrumbs'
import Link from 'next/link' import Link from 'next/link'
@ -17,11 +17,12 @@ export type PaymentsParams = {
orgslug: string orgslug: string
} }
function PaymentsPage({ params }: { params: PaymentsParams }) { function PaymentsPage(props: { params: Promise<PaymentsParams> }) {
const params = use(props.params);
const session = useLHSession() as any const session = useLHSession() as any
const org = useOrg() as any const org = useOrg() as any
const subpage = params.subpage || 'customers' const subpage = params.subpage || 'customers'
const isPaymentsEnabled = useFeatureFlag({ const isPaymentsEnabled = useFeatureFlag({
path: ['features', 'payments', 'enabled'], path: ['features', 'payments', 'enabled'],
defaultValue: false defaultValue: false

View file

@ -1,5 +1,5 @@
'use client' 'use client'
import React, { useEffect } from 'react' import React, { useEffect, use } from 'react';
import { motion } from 'framer-motion' import { motion } from 'framer-motion'
import UserEditGeneral from '@components/Dashboard/Pages/UserAccount/UserEditGeneral/UserEditGeneral' import UserEditGeneral from '@components/Dashboard/Pages/UserAccount/UserEditGeneral/UserEditGeneral'
import UserEditPassword from '@components/Dashboard/Pages/UserAccount/UserEditPassword/UserEditPassword' import UserEditPassword from '@components/Dashboard/Pages/UserAccount/UserEditPassword/UserEditPassword'
@ -14,7 +14,8 @@ export type SettingsParams = {
orgslug: string orgslug: string
} }
function SettingsPage({ params }: { params: SettingsParams }) { function SettingsPage(props: { params: Promise<SettingsParams> }) {
const params = use(props.params);
const session = useLHSession() as any const session = useLHSession() as any
useEffect(() => {}, [session]) useEffect(() => {}, [session])

View file

@ -1,5 +1,5 @@
'use client' 'use client'
import React, { useEffect } from 'react' import React, { useEffect, use } from 'react';
import { motion } from 'framer-motion' import { motion } from 'framer-motion'
import Link from 'next/link' import Link from 'next/link'
import { useMediaQuery } from 'usehooks-ts' import { useMediaQuery } from 'usehooks-ts'
@ -18,7 +18,8 @@ export type SettingsParams = {
orgslug: string orgslug: string
} }
function UsersSettingsPage({ params }: { params: SettingsParams }) { function UsersSettingsPage(props: { params: Promise<SettingsParams> }) {
const params = use(props.params);
const session = useLHSession() as any const session = useLHSession() as any
const org = useOrg() as any const org = useOrg() as any
const [H1Label, setH1Label] = React.useState('') const [H1Label, setH1Label] = React.useState('')

View file

@ -1,17 +1,23 @@
'use client' 'use client';
import { use } from "react";
import { OrgProvider } from '@components/Contexts/OrgContext' import { OrgProvider } from '@components/Contexts/OrgContext'
import NextTopLoader from 'nextjs-toploader'; import NextTopLoader from 'nextjs-toploader';
import Toast from '@components/Objects/StyledElements/Toast/Toast' import Toast from '@components/Objects/StyledElements/Toast/Toast'
import '@styles/globals.css' import '@styles/globals.css'
import Onboarding from '@components/Objects/Onboarding/Onboarding'; import Onboarding from '@components/Objects/Onboarding/Onboarding';
export default function RootLayout({ export default function RootLayout(
children, props: {
params, children: React.ReactNode
}: { params: Promise<any>
children: React.ReactNode }
params: any ) {
}) { const params = use(props.params);
const {
children
} = props;
return ( return (
<div> <div>
<OrgProvider orgslug={params.orgslug}> <OrgProvider orgslug={params.orgslug}>

View file

@ -70,7 +70,7 @@ function UserEditGeneral() {
toast.success('Profile Updated Successfully', { duration: 4000 }) toast.success('Profile Updated Successfully', { duration: 4000 })
// Show message about logging in with new email // Show message about logging in with new email
toast((t) => ( toast((t: any) => (
<div className="flex items-center gap-2"> <div className="flex items-center gap-2">
<span>Please login again with your new email: {newEmail}</span> <span>Please login again with your new email: {newEmail}</span>
</div> </div>

View file

@ -33,7 +33,7 @@ function UserEditPassword() {
// Show success message and notify about logout // Show success message and notify about logout
toast.success('Password updated successfully', { duration: 4000 }) toast.success('Password updated successfully', { duration: 4000 })
toast((t) => ( toast((t: any) => (
<div className="flex items-center gap-2"> <div className="flex items-center gap-2">
<span>Please login again with your new password</span> <span>Please login again with your new password</span>
</div> </div>

View file

@ -1,5 +1,5 @@
'use client' 'use client'
import { default as React } from 'react' import { default as React, type JSX } from 'react';
import Editor from './Editor' import Editor from './Editor'
import { updateActivity } from '@services/courses/activities' import { updateActivity } from '@services/courses/activities'
import { toast } from 'react-hot-toast' import { toast } from 'react-hot-toast'
@ -7,8 +7,6 @@ import Toast from '@components/Objects/StyledElements/Toast/Toast'
import { OrgProvider } from '@components/Contexts/OrgContext' import { OrgProvider } from '@components/Contexts/OrgContext'
import { useLHSession } from '@components/Contexts/LHSessionContext' import { useLHSession } from '@components/Contexts/LHSessionContext'
interface EditorWrapperProps { interface EditorWrapperProps {
content: string content: string
activity: any activity: any

View file

@ -4,7 +4,7 @@ import { styled } from '@stitches/react'
import { blackA } from '@radix-ui/colors' import { blackA } from '@radix-ui/colors'
import { Info } from 'lucide-react' import { Info } from 'lucide-react'
const FormLayout = (props: any, onSubmit: any) => ( const FormLayout: React.FC<{ children: React.ReactNode; onSubmit: (e: any) => void }> = (props) => (
<FormRoot className="h-fit" onSubmit={props.onSubmit}> <FormRoot className="h-fit" onSubmit={props.onSubmit}>
{props.children} {props.children}
</FormRoot> </FormRoot>

View file

@ -23,7 +23,7 @@ export default function StyledComponentsRegistry({
return ( return (
<StyleSheetManager sheet={styledComponentsStyleSheet.instance}> <StyleSheetManager sheet={styledComponentsStyleSheet.instance}>
{children as React.ReactChild} {children as React.ReactElement<any> | number | string}
</StyleSheetManager> </StyleSheetManager>
) );
} }

View file

@ -3,7 +3,7 @@
"version": "0.1.0", "version": "0.1.0",
"private": true, "private": true,
"scripts": { "scripts": {
"dev": "next dev --turbo", "dev": "next dev --turbopack",
"dev-https": "next dev --experimental-https -p 443", "dev-https": "next dev --experimental-https -p 443",
"build": "next build", "build": "next build",
"start": "next start", "start": "next start",
@ -13,92 +13,99 @@
"dependencies": { "dependencies": {
"@emoji-mart/data": "^1.2.1", "@emoji-mart/data": "^1.2.1",
"@emoji-mart/react": "^1.1.1", "@emoji-mart/react": "^1.1.1",
"@icons-pack/react-simple-icons": "^10.1.0", "@icons-pack/react-simple-icons": "^10.2.0",
"@radix-ui/colors": "^0.1.9", "@radix-ui/colors": "^0.1.9",
"@radix-ui/react-aspect-ratio": "^1.1.0", "@radix-ui/react-aspect-ratio": "^1.1.2",
"@radix-ui/react-dialog": "^1.1.2", "@radix-ui/react-dialog": "^1.1.6",
"@radix-ui/react-dropdown-menu": "^2.1.2", "@radix-ui/react-dropdown-menu": "^2.1.6",
"@radix-ui/react-form": "^0.0.3", "@radix-ui/react-form": "^0.0.3",
"@radix-ui/react-icons": "^1.3.1", "@radix-ui/react-icons": "^1.3.2",
"@radix-ui/react-label": "^2.1.0", "@radix-ui/react-label": "^2.1.2",
"@radix-ui/react-select": "^2.1.2", "@radix-ui/react-select": "^2.1.6",
"@radix-ui/react-slot": "^1.1.0", "@radix-ui/react-slot": "^1.1.2",
"@radix-ui/react-switch": "^1.1.1", "@radix-ui/react-switch": "^1.1.3",
"@radix-ui/react-tabs": "^1.1.1", "@radix-ui/react-tabs": "^1.1.3",
"@radix-ui/react-toggle": "^1.1.0", "@radix-ui/react-toggle": "^1.1.2",
"@radix-ui/react-toggle-group": "^1.1.0", "@radix-ui/react-toggle-group": "^1.1.2",
"@radix-ui/react-tooltip": "^1.1.3", "@radix-ui/react-tooltip": "^1.1.8",
"@sentry/nextjs": "^9.1.0", "@sentry/nextjs": "^9.5.0",
"@sentry/utils": "^8.35.0", "@sentry/utils": "^8.55.0",
"@stitches/react": "^1.2.8", "@stitches/react": "^1.2.8",
"@tanstack/react-table": "^8.20.5", "@tanstack/react-table": "^8.21.2",
"@tiptap/core": "^2.9.1", "@tiptap/core": "^2.11.5",
"@tiptap/extension-code-block-lowlight": "^2.9.1", "@tiptap/extension-code-block-lowlight": "^2.11.5",
"@tiptap/extension-table": "^2.9.1", "@tiptap/extension-table": "^2.11.5",
"@tiptap/extension-table-cell": "^2.9.1", "@tiptap/extension-table-cell": "^2.11.5",
"@tiptap/extension-table-header": "^2.9.1", "@tiptap/extension-table-header": "^2.11.5",
"@tiptap/extension-table-row": "^2.9.1", "@tiptap/extension-table-row": "^2.11.5",
"@tiptap/extension-youtube": "^2.9.1", "@tiptap/extension-youtube": "^2.11.5",
"@tiptap/html": "^2.9.1", "@tiptap/html": "^2.11.5",
"@tiptap/pm": "^2.9.1", "@tiptap/pm": "^2.11.5",
"@tiptap/react": "^2.9.1", "@tiptap/react": "^2.11.5",
"@tiptap/starter-kit": "^2.9.1", "@tiptap/starter-kit": "^2.11.5",
"@types/dompurify": "^3.0.5", "@types/dompurify": "^3.2.0",
"@types/randomcolor": "^0.5.9", "@types/randomcolor": "^0.5.9",
"avvvatars-react": "^0.4.2", "avvvatars-react": "^0.4.2",
"class-variance-authority": "^0.7.0", "class-variance-authority": "^0.7.1",
"clsx": "^2.1.1", "clsx": "^2.1.1",
"currency-codes": "^2.2.0", "currency-codes": "^2.2.0",
"dayjs": "^1.11.13", "dayjs": "^1.11.13",
"dompurify": "^3.2.4", "dompurify": "^3.2.4",
"emblor": "^1.4.7", "emblor": "^1.4.7",
"formik": "^2.4.6", "formik": "^2.4.6",
"framer-motion": "^10.18.0", "framer-motion": "^12.4.12",
"get-youtube-id": "^1.0.1", "get-youtube-id": "^1.0.1",
"highlight.js": "^11.10.0", "highlight.js": "^11.11.1",
"katex": "^0.16.21", "katex": "^0.16.21",
"lowlight": "^3.1.0", "lowlight": "^3.3.0",
"lucide-react": "^0.453.0", "lucide-react": "^0.453.0",
"next": "14.2.23", "next": "15.2.2",
"next-auth": "^4.24.10", "next-auth": "^4.24.11",
"nextjs-toploader": "^1.6.12", "nextjs-toploader": "^1.6.12",
"prosemirror-state": "^1.4.3", "prosemirror-state": "^1.4.3",
"randomcolor": "^0.6.2", "randomcolor": "^0.6.2",
"re-resizable": "^6.10.0", "re-resizable": "^6.11.2",
"react": "^18.3.1", "react": "19.0.0",
"react-beautiful-dnd": "^13.1.1", "react-beautiful-dnd": "^13.1.1",
"react-confetti": "^6.1.0", "react-confetti": "^6.4.0",
"react-dom": "^18.3.1", "react-dom": "19.0.0",
"react-hot-toast": "^2.4.1", "react-hot-toast": "^2.5.2",
"react-katex": "^3.0.1", "react-katex": "^3.0.1",
"react-spinners": "^0.13.8", "react-spinners": "^0.13.8",
"react-youtube": "^10.1.0", "react-youtube": "^10.1.0",
"require-in-the-middle": "^7.5.2",
"sharp": "^0.33.5", "sharp": "^0.33.5",
"styled-components": "^6.1.13", "styled-components": "^6.1.15",
"swr": "^2.2.5", "swr": "^2.3.3",
"tailwind-merge": "^2.5.4", "tailwind-merge": "^2.6.0",
"tailwind-scrollbar": "^3.1.0", "tailwind-scrollbar": "^3.1.0",
"tailwindcss-animate": "^1.0.7", "tailwindcss-animate": "^1.0.7",
"unsplash-js": "^7.0.19", "unsplash-js": "^7.0.19",
"usehooks-ts": "^3.1.0", "usehooks-ts": "^3.1.1",
"uuid": "^9.0.1", "uuid": "^9.0.1",
"yup": "^1.4.0" "yup": "^1.6.1"
}, },
"devDependencies": { "devDependencies": {
"@tailwindcss/postcss": "^4.0.12", "@tailwindcss/postcss": "^4.0.12",
"@types/node": "20.12.2", "@types/node": "20.12.2",
"@types/react": "18.2.74", "@types/react": "19.0.10",
"@types/react-beautiful-dnd": "^13.1.8", "@types/react-beautiful-dnd": "^13.1.8",
"@types/react-dom": "18.2.23", "@types/react-dom": "19.0.4",
"@types/react-katex": "^3.0.4", "@types/react-katex": "^3.0.4",
"@types/react-transition-group": "^4.4.11", "@types/react-transition-group": "^4.4.12",
"@types/styled-components": "^5.1.34", "@types/styled-components": "^5.1.34",
"@types/uuid": "^9.0.8", "@types/uuid": "^9.0.8",
"eslint": "^8.57.1", "eslint": "^8.57.1",
"eslint-config-next": "^14.2.16", "eslint-config-next": "15.2.1",
"eslint-plugin-unused-imports": "^3.2.0", "eslint-plugin-unused-imports": "^3.2.0",
"postcss": "^8.4.47", "postcss": "^8.5.3",
"tailwindcss": "^4.0.12", "tailwindcss": "^4.0.12",
"typescript": "5.4.4" "typescript": "5.4.4"
},
"pnpm": {
"overrides": {
"@types/react": "19.0.10",
"@types/react-dom": "19.0.4"
}
} }
} }

5301
apps/web/pnpm-lock.yaml generated

File diff suppressed because it is too large Load diff