diff --git a/app/(content)/(home)/home/page.tsx b/app/(content)/(home)/home/page.tsx index 12366adac23f67ac0db40f112755bc22d1130473..d159dec93d31a425d2d95cafcdb5c7c75e31e0e3 100644 --- a/app/(content)/(home)/home/page.tsx +++ b/app/(content)/(home)/home/page.tsx @@ -2,6 +2,8 @@ import { CreateGweet } from "@/components/create-gweet/components/create-gweet" import { GlobalLayout } from "@/components/global-layout" import { Gweets } from "@/components/gweets/components/gweets" import ScrollToTop from "@/components/scroll-to-top" +import { Trends } from "@/components/trends/components/trends" +import { Card } from "@/components/ui/card" export default async function HomePage() { return ( @@ -17,6 +19,11 @@ export default async function HomePage() { </div> </> } + sideContent={ + <Card className="p-5 bg-secondary"> + <Trends /> + </Card> + } /> ) } \ No newline at end of file diff --git a/app/(content)/(home)/trends/page.tsx b/app/(content)/(home)/trends/page.tsx new file mode 100644 index 0000000000000000000000000000000000000000..9238f2fc52b06323d37faf8f958ad282e3774bf5 --- /dev/null +++ b/app/(content)/(home)/trends/page.tsx @@ -0,0 +1,23 @@ +import { BackHeader } from "@/components/back-header" +import { GlobalLayout } from "@/components/global-layout" +import { Trends } from "@/components/trends/components/trends" +import { Card } from "@/components/ui/card" + +export default async function TrendsPage() { + return ( + <GlobalLayout + mainContent={ + <Card className="w-full overflow-hidden"> + <div className="p-3"> + <BackHeader> + <h1 className="font-bold">Trends</h1> + </BackHeader> + </div> + <div className="px-5"> + <Trends title="" /> + </div> + </Card> + } + /> + ) +} \ No newline at end of file diff --git a/app/(content)/(user)/[userid]/followers/page.tsx b/app/(content)/(user)/[userid]/(profile)/followers/page.tsx similarity index 100% rename from app/(content)/(user)/[userid]/followers/page.tsx rename to app/(content)/(user)/[userid]/(profile)/followers/page.tsx diff --git a/app/(content)/(user)/[userid]/following/page.tsx b/app/(content)/(user)/[userid]/(profile)/following/page.tsx similarity index 100% rename from app/(content)/(user)/[userid]/following/page.tsx rename to app/(content)/(user)/[userid]/(profile)/following/page.tsx diff --git a/app/(content)/(user)/[userid]/likes/page.tsx b/app/(content)/(user)/[userid]/(profile)/likes/page.tsx similarity index 100% rename from app/(content)/(user)/[userid]/likes/page.tsx rename to app/(content)/(user)/[userid]/(profile)/likes/page.tsx diff --git a/app/(content)/(user)/[userid]/page.tsx b/app/(content)/(user)/[userid]/(profile)/page.tsx similarity index 100% rename from app/(content)/(user)/[userid]/page.tsx rename to app/(content)/(user)/[userid]/(profile)/page.tsx diff --git a/app/api/gweets/[id]/route.ts b/app/api/gweets/[id]/route.ts index 9f04b89a40fa5cc9a8c4d8549fa15b2cf85069cc..a9c706539844ac3becd0dc6549fb977d1e65391d 100644 --- a/app/api/gweets/[id]/route.ts +++ b/app/api/gweets/[id]/route.ts @@ -26,7 +26,14 @@ export async function GET(request: Request, { params }: { params: { id: string } id, }, include: { - author: true, + author: { + select: { + id: true, + username: true, + name: true, + image: true, + }, + }, likes: { include: { user: { @@ -74,6 +81,16 @@ export async function GET(request: Request, { params }: { params: { id: string } createdAt: "desc", }, }, + comment: { + include: { + author: { + select: { + id: true, + username: true, + }, + }, + }, + }, allComments: true, }, }) diff --git a/app/api/gweets/route.ts b/app/api/gweets/route.ts index c81cb02134a503a98735e3710da9549d4bcd4f24..cf5ae7257c9c264516e04c3eb90afe5d57ace20a 100644 --- a/app/api/gweets/route.ts +++ b/app/api/gweets/route.ts @@ -18,6 +18,23 @@ export async function GET(request: Request) { const cursor = cursorQuery ? { id: cursorQuery } : undefined try { + // if (type === "threads") { + // const gweet = await db.gweet.findUnique({ + // where: { + // id, + // }, + // }) + + // let thread = [] + // if (cursorQuery === undefined) { + // if (gweet && gweet.replyToGweetId) thread = await fetchThread(gweet.replyToGweetId) + // } + + // // logic correct TODO + // const prevId = thread.length < 4 ? undefined : thread[thread.length - 1].id + // return NextResponse.json({ gweets: thread, prevId }) + // } + const gweets = await db.gweet.findMany({ skip, take, @@ -56,7 +73,14 @@ export async function GET(request: Request) { }, include: { - author: true, + author: { + select: { + id: true, + username: true, + name: true, + image: true, + }, + }, likes: true, media: true, regweets: true, @@ -68,6 +92,16 @@ export async function GET(request: Request) { }, }, + comment: { + include: { + author: { + select: { + id: true, + username: true, + }, + }, + }, + }, allComments: true, allQuotes: true, }, @@ -155,7 +189,6 @@ export async function POST(request: Request) { return NextResponse.json(created_gweet, { status: 200 }) } catch (error: any) { - console.log(error) return NextResponse.json( { message: "Something went wrong", @@ -208,4 +241,46 @@ export async function DELETE(request: Request) { }, { status: error.errorCode || 500 }, ) } -} \ No newline at end of file +} + +// function to get gweet thread from comment +// async function fetchThread(gweetId: string): Promise<any[]> { +// let thread = [] +// const gweet = await db.gweet.findUnique({ +// where: { +// id: gweetId, +// }, +// include: { +// author: { +// select: { +// id: true, +// username: true, +// name: true, +// image: true, +// }, +// }, +// likes: true, +// media: true, +// regweets: true, + +// quote: { +// include: { +// author: true, +// media: true, +// }, +// }, + +// allComments: true, +// allQuotes: true, +// }, +// }) + +// thread.push(gweet) + +// if (gweet?.replyToGweetId) { +// const replyToGweet = await fetchThread(gweet.replyToGweetId) +// thread.unshift(...replyToGweet) +// } + +// return thread +// } \ No newline at end of file diff --git a/app/api/hashtags/route.ts b/app/api/hashtags/route.ts index f909da1ab2779d11294a5689703aab246d15d2eb..b4ffb8ef97ebee57128b889e83ab2264d6c5aefe 100644 --- a/app/api/hashtags/route.ts +++ b/app/api/hashtags/route.ts @@ -18,7 +18,7 @@ export async function GET() { } export async function POST(request: Request) { - const { hashtags } = await request.json() + const hashtags = await request.json() const hashtagsSchema = z.array(z.string()) diff --git a/components/create-gweet/components/create-gweet.tsx b/components/create-gweet/components/create-gweet.tsx index 134413b1e4cbdcdb827f309ff4be3f21a5669734..1b00d96b7bdea89719c80e5a0293f12f4302f4bf 100644 --- a/components/create-gweet/components/create-gweet.tsx +++ b/components/create-gweet/components/create-gweet.tsx @@ -52,7 +52,7 @@ export const CreateGweet = ({ const imageUploadRef = useRef<HTMLInputElement>(null) const { data: session } = useSession() - const { isLoading, mutate, data } = useCreateGweet() + const { isLoading, mutate } = useCreateGweet() const form = useForm<z.infer<typeof FormSchema>>({ resolver: zodResolver(FormSchema), @@ -207,6 +207,7 @@ export const CreateGweet = ({ type="file" accept="image/*" multiple + max={4} onChange={(e) => chooseImages(e, setChosenImages)} ref={imageUploadRef} disabled={isLoading || !session.user} diff --git a/components/gweets/components/gweet-author.tsx b/components/gweets/components/gweet-author.tsx index 1b1c66aafb836d3b8ded9ab8754e31211f093c84..92a05ae268c69aaff78f53de78938b9cc7ebd9a3 100644 --- a/components/gweets/components/gweet-author.tsx +++ b/components/gweets/components/gweet-author.tsx @@ -6,16 +6,25 @@ import { GweetOptions } from "./gweet-options" export const GweetAuthor = ({ gweet }: { gweet: IGweet }) => { return ( <div className="flex items-center"> - <Link href={`/${gweet.author.username}`}> + <Link + href={`/${gweet.author.username}`} + onClick={(e) => { + e.stopPropagation() + }}> <UserAvatar user={{ username: gweet.author.username, image: gweet.author.image }} className="h-10 w-10" /> </Link> - <div className="flex flex-col ml-3"> + <Link + className="flex flex-col ml-3" + href={`/${gweet.author.username}`} + onClick={(e) => { + e.stopPropagation() + }}> <span className="font-bold">{gweet.author.name}</span> - <span className="text-sky-500 text-sm">@{gweet.author.username}</span> - </div> + <span className="text-sky-500 text-sm hover:underline">@{gweet.author.username}</span> + </Link> <div className="ml-auto"> <GweetOptions gweet={gweet} /> diff --git a/components/gweets/components/gweet-details.tsx b/components/gweets/components/gweet-details.tsx index 87a3c8b8ca22eb7e10aef04a62b35fcc1dd2145a..110c6f0c33996dca685d26eaf3c1f2319557368a 100644 --- a/components/gweets/components/gweet-details.tsx +++ b/components/gweets/components/gweet-details.tsx @@ -3,15 +3,16 @@ import { CreateGweetWrapper } from "@/components/create-gweet/components/create-gweet-wrapper" import LoadingItem from "@/components/loading-item" import { TryAgain } from "@/components/try-again" -import { Card } from "@/components/ui/card" import { Separator } from "@/components/ui/separator" -import Image from "next/image" +import Link from "next/link" import { usePathname } from "next/navigation" import { useGweet } from "../hooks/use-gweet" import { Comments } from "./comments" import { GweetActions } from "./gweet-actions" import { GweetAuthor } from "./gweet-author" import { GweetCreationDate } from "./gweet-creation-date" +import { GweetMedia } from "./gweet-media" +// import { Thread } from "./thread" export const GweetDetails = () => { // TODO use params @@ -33,38 +34,29 @@ export const GweetDetails = () => { } return ( - <> + <div> + {/* TODO needs handling of all gweets above and under the gweet */} + {/* <Thread gweetId={gweet?.id} /> */} <div className="flex flex-col space-y-3 px-3 pt-3"> + {gweet?.replyToGweetId && ( + <div> + <span className="text-muted-foreground">Replying to </span> + <Link + href={`/${gweet?.comment.author.username}`} + className="text-sky-500 hover:underline z-10" + onClick={(e) => { + e.stopPropagation() + }}> + @{gweet?.comment.author.username} + </Link> + </div> + )} <GweetAuthor gweet={gweet} /> - {/* TODO needs handling of all gweets above and under the gweet */} - <div className="flex flex-col space-y-3"> {gweet.content && <h1 className="break-words">{gweet.content}</h1>} - {/* TODO make own component */} - {gweet.media.length > 0 && ( - <div className={`grid object-cover h-[600px] ${gweet.media.length === 1 ? "grid-cols-1" - : gweet.media.length === 2 ? "grid-cols-2 gap-3" - : gweet.media.length === 3 || 4 ? "grid-cols-2 grid-rows-2 gap-3" - : "" - }`} - > - {gweet.media.map((image, i) => { - const isFirstImage = gweet.media.length === 3 && i === 0 - return ( - <Card key={i} className={`relative max-h-[600px] overflow-hidden ${isFirstImage ? "row-span-2" : ""}`}> - <Image - src={image.url as string} - alt="gweet image" - fill - className="object-cover rounded-lg" - /> - </Card> - ) - })} - </div> - )} + {gweet.media.length > 0 && (<GweetMedia gweet={gweet} />)} {/* TODO */} {/* {gweet?.quotedGweet && <QuotedGweet gweet={gweet?.quotedGweet} />} */} @@ -83,6 +75,6 @@ export const GweetDetails = () => { </div> <Separator className="h-1 mb-3" /> <Comments gweetId={gweet?.id} /> - </> + </div> ) } \ No newline at end of file diff --git a/components/gweets/components/gweet-media.tsx b/components/gweets/components/gweet-media.tsx new file mode 100644 index 0000000000000000000000000000000000000000..85576906404fb7afd7609f16db8d9c16e618f625 --- /dev/null +++ b/components/gweets/components/gweet-media.tsx @@ -0,0 +1,28 @@ +import { Card } from "@/components/ui/card" +import Image from "next/image" +import { IGweet } from "../types" + +export const GweetMedia = ({ gweet }: { gweet: IGweet }) => { + return ( + <div className={`grid object-cover h-[600px] ${gweet.media.length === 1 ? "grid-cols-1" + : gweet.media.length === 2 ? "grid-cols-2 gap-3" + : gweet.media.length === 3 || 4 ? "grid-cols-2 grid-rows-2 gap-3" + : "" + }`} + > + {gweet.media.map((image, i) => { + const isFirstImage = gweet.media.length === 3 && i === 0 + return ( + <Card key={i} className={`relative max-h-[600px] overflow-hidden ${isFirstImage ? "row-span-2" : ""}`}> + <Image + src={image.url as string} + alt="gweet image" + fill + className="object-cover rounded-lg" + /> + </Card> + ) + })} + </div> + ) +} \ No newline at end of file diff --git a/components/gweets/components/gweet.tsx b/components/gweets/components/gweet.tsx index 63e119d9dcca06956753399ee50899b5c0cb1d67..40f1f27eb695af5deea42ebd913e2f55b40c8c4b 100644 --- a/components/gweets/components/gweet.tsx +++ b/components/gweets/components/gweet.tsx @@ -1,11 +1,11 @@ import { buttonVariants } from "@/components/ui/button" -import { Card } from "@/components/ui/card" import { UserAvatar } from "@/components/user-avatar" import { cn, formatTimeElapsed } from "@/lib/utils" -import Image from "next/image" +import Link from "next/link" import { useRouter } from "next/navigation" import { IGweet } from "../types" import { GweetActions } from "./gweet-actions" +import { GweetMedia } from "./gweet-media" import { GweetOptions } from "./gweet-options" export const Gweet = ({ gweet }: { gweet: IGweet }) => { @@ -17,37 +17,45 @@ export const Gweet = ({ gweet }: { gweet: IGweet }) => { onClick={() => router.push(`/${gweet.author.username}/status/${gweet.id}`)} className={cn(buttonVariants({ variant: "ghost" }), "flex flex-col flex-grow h-auto w-full text-left cursor-pointer items-start p-3 space-y-3")} > - {/* TODO replyto */} - {/* <div className=""> {gweet?.replyToGweetId && ( - <div className=""> - <span className="">Replying to</span> - <button - onClick={(e) => { - e.stopPropagation(); - router.push(`/${gweet?.author.username}`); - }} - className="" - > - @{gweet?.author.username} - </button> - </div> + <div> + <span className="text-muted-foreground">Replying to </span> + <Link + href={`/${gweet?.comment.author.username}`} + className="text-sky-500 hover:underline z-10" + onClick={(e) => { + e.stopPropagation() + }}> + @{gweet?.comment.author.username} + </Link> + </div> )} - </div> */} - <div className="flex flex-row h-auto w-full"> - <UserAvatar - user={{ username: gweet.author.username, image: gweet.author.image }} - className="h-10 w-10" - /> + <div className="flex flex-row h-auto w-full"> + <Link + href={`/${gweet.author.username}`} + onClick={(e) => { + e.stopPropagation() + }}> + <UserAvatar + user={{ username: gweet.author.username, image: gweet.author.image }} + className="h-10 w-10" + /> + </Link> <div className="flex flex-col flex-grow space-y-3 ml-3 w-1"> <div className="flex items-start"> <div className="flex space-x-2 flex-grow"> - <h1 className="font-bold">{gweet.author.name}</h1> - <h1 className="text-sky-500 text-sm"> - @{gweet.author.username} - </h1> + <Link + className="flex space-x-2 hover:underline decoration-muted-foreground" + href={`/${gweet.author.username}`} + onClick={(e) => { e.stopPropagation() }} + > + <h1 className="font-bold">{gweet.author.name}</h1> + <h1 className="text-sky-500 text-sm"> + @{gweet.author.username} + </h1> + </Link> <span>·</span> <h1 className="text-gray-500 text-sm"> {formatTimeElapsed(gweet.createdAt)} @@ -62,28 +70,7 @@ export const Gweet = ({ gweet }: { gweet: IGweet }) => { <div className="flex flex-col flex-grow space-y-3 w-full"> {gweet.content && <h1 className="break-words">{gweet.content}</h1>} - {gweet.media.length > 0 && ( - <div className={`grid object-cover h-[600px] ${gweet.media.length === 1 ? "grid-cols-1" - : gweet.media.length === 2 ? "grid-cols-2 gap-3" - : gweet.media.length === 3 || 4 ? "grid-cols-2 grid-rows-2 gap-3" - : "" - }`} - > - {gweet.media.map((image, i) => { - const isFirstImage = gweet.media.length === 3 && i === 0 - return ( - <Card key={i} className={`relative max-h-[600px] overflow-hidden ${isFirstImage ? "row-span-2" : ""}`}> - <Image - src={image.url as string} - alt="gweet image" - fill - className="object-cover rounded-lg" - /> - </Card> - ) - })} - </div> - )} + {gweet.media.length > 0 && (<GweetMedia gweet={gweet} />)} {/* TODO */} {/* {quoted_gweet && <QuotedGweet gweet={quoted_gweet} />} */} diff --git a/components/gweets/components/infinite-gweets.tsx b/components/gweets/components/infinite-gweets.tsx index 7631f820e597a8f04d538cd8f24d8d30321ab035..2e8f73dd51094bb4dec000cd790196a93c6f4341 100644 --- a/components/gweets/components/infinite-gweets.tsx +++ b/components/gweets/components/infinite-gweets.tsx @@ -13,23 +13,34 @@ export const InfiniteGweets = ({ isFetchingNextPage, fetchNextPage, hasNextPage, + isFetchingPreviousPage, + fetchPreviousPage, + hasPreviousPage, }: { gweets: IInfiniteGweets isSuccess: boolean | undefined - isFetchingNextPage: boolean | undefined - fetchNextPage: () => Promise<any> | void - hasNextPage: boolean | undefined + isFetchingNextPage?: boolean | undefined + fetchNextPage?: () => Promise<any> | void + hasNextPage?: boolean | undefined + isFetchingPreviousPage?: boolean | undefined + fetchPreviousPage?: () => Promise<any> | void + hasPreviousPage?: boolean | undefined }) => { const { ref, inView } = useInView() useEffect(() => { if (inView && hasNextPage) { - fetchNextPage() + if (fetchNextPage) fetchNextPage() } - }, [inView, hasNextPage, fetchNextPage]) + if (inView && hasPreviousPage) { + if (fetchPreviousPage) fetchPreviousPage() + } + }, [inView, hasNextPage, fetchNextPage, hasPreviousPage, fetchPreviousPage]) return ( <> + {/* {isFetchingPreviousPage && <LoadingItem />} */} + {isSuccess && gweets?.pages?.map((page) => { return page?.gweets?.map((gweet, index) => ( diff --git a/components/gweets/components/thread.tsx b/components/gweets/components/thread.tsx new file mode 100644 index 0000000000000000000000000000000000000000..84c28243969cc328b51e58fc6f35ee114e7a8cfa --- /dev/null +++ b/components/gweets/components/thread.tsx @@ -0,0 +1,39 @@ +import { TryAgain } from "@/components/try-again" + +import LoadingItem from "@/components/loading-item" +import { useGweets } from "../hooks/use-gweets" +import { InfiniteGweets } from "./infinite-gweets" + +export const Thread = ({ gweetId }: { gweetId: string }) => { + const { + data: threads, + isLoading, + isError, + fetchPreviousPage, + hasPreviousPage, + isFetchingPreviousPage, + isSuccess, + } = useGweets({ + queryKey: ["gweets", gweetId, "threads"], + type: "threads", + id: gweetId, + }) + + if (isLoading) { + return <LoadingItem /> + } + + if (isError) { + return <TryAgain /> + } + + return ( + <InfiniteGweets + gweets={threads} + fetchPreviousPage={fetchPreviousPage} + hasPreviousPage={hasPreviousPage} + isFetchingPreviousPage={isFetchingPreviousPage} + isSuccess={isSuccess} + /> + ) +} \ No newline at end of file diff --git a/components/gweets/hooks/use-gweets.ts b/components/gweets/hooks/use-gweets.ts index 56ec73f5988e4c9a856d0426100b5e63f6e8dca4..5035ae1b711ad4ecc7f45e3ede7749b5154ed5c6 100644 --- a/components/gweets/hooks/use-gweets.ts +++ b/components/gweets/hooks/use-gweets.ts @@ -20,11 +20,13 @@ export const useGweets = ({ type, id, }), - { getNextPageParam: (lastPage) => { return lastPage?.nextId ?? false }, + // getPreviousPageParam: (firstPage) => { + // return firstPage?.prevId ?? false + // }, refetchOnWindowFocus: false, }, ) diff --git a/components/gweets/types/index.ts b/components/gweets/types/index.ts index 21ae5a08268488bc6e72663cc6dbafee0aed9a42..9964c6a0501155c4b53a7c7b634d42135b822305 100644 --- a/components/gweets/types/index.ts +++ b/components/gweets/types/index.ts @@ -12,6 +12,7 @@ export interface IGweet extends Gweet { likes: ILike[] media: IMedia[] regweets: IRegweet[] + comment: IGweet allQuotes: IGweet[] allComments: IGweet[] } @@ -30,6 +31,10 @@ export interface IRegweet extends Regweet { } export interface IInfiniteGweets { - pages: { gweets: IGweet[]; nextId?: string | undefined }[] + pages: { + gweets: IGweet[] + nextId?: string | undefined + prevId?: string | undefined + }[] pageParams: any -} +} \ No newline at end of file diff --git a/components/nav-header.tsx b/components/nav-header.tsx index cc3262ed9ad0136853676c9dc3a03e96f2135384..fa9c7da9b6056ce35429edd5c8c94a279148163c 100644 --- a/components/nav-header.tsx +++ b/components/nav-header.tsx @@ -21,7 +21,7 @@ export const Header = ({ user }: { user: User | undefined }) => { <SearchInput className="p-3 w-3/6 2xl:w-2/6" /> - {user && + {user ? <div className={cn(buttonVariants({ variant: "ghost", size: "logo" }))}> <UserAccountDropdown user={{ @@ -31,6 +31,8 @@ export const Header = ({ user }: { user: User | undefined }) => { }} /> </div> + : + <span className="w-12" /> } </div> </header> diff --git a/components/trends/api/get-hashtags.ts b/components/trends/api/get-hashtags.ts index a669ceebb094a342d705963f8647b5f3dfd1b977..d70c90a99b03115ffcf346eae8adf0ccfcf63867 100644 --- a/components/trends/api/get-hashtags.ts +++ b/components/trends/api/get-hashtags.ts @@ -5,4 +5,4 @@ export const getHashtags = async () => { } catch (error: any) { return error.response.data } -} +} \ No newline at end of file diff --git a/components/trends/api/post-hashtags.ts b/components/trends/api/post-hashtags.ts index e372faa2f8f3aa2a2578ca4a6974885f7fb0befb..d5c069439d1242b38631a609efb93e11d79ffa0d 100644 --- a/components/trends/api/post-hashtags.ts +++ b/components/trends/api/post-hashtags.ts @@ -9,4 +9,4 @@ export const postHashtags = async (hashtags: string[]) => { } catch (error: any) { return error.response.data } -} +} \ No newline at end of file diff --git a/components/trends/api/retrieve-hashtags-from-gweet.ts b/components/trends/api/retrieve-hashtags-from-gweet.ts index f8e54755008d7a19630ef390c71dde61dcd38f59..4c4aa88f2f2bd219aa6f363234fe357f7edecd24 100644 --- a/components/trends/api/retrieve-hashtags-from-gweet.ts +++ b/components/trends/api/retrieve-hashtags-from-gweet.ts @@ -1,4 +1,4 @@ export const retrieveHashtagsFromGweet = (text: string): string[] | null => { const hashtags = text.match(/#\w+/gi) return hashtags ? hashtags.map((hashtag) => hashtag.slice(1)) : null -} +} \ No newline at end of file diff --git a/components/trends/components/trend.tsx b/components/trends/components/trend.tsx index 0e3f734a55e93d26fee4c3bac49855dd0ef7c6da..2ce19c9b8c18a64ec4a0bc9d7c194a5f1e8b7f2c 100644 --- a/components/trends/components/trend.tsx +++ b/components/trends/components/trend.tsx @@ -1,26 +1,21 @@ "use client" -import { useRouter } from "next/navigation" +import Link from "next/link" import { iTrendProps } from "../types" export const Trend = ({ ranking = 1, title, gweets = 1 }: iTrendProps) => { - const router = useRouter() - return ( - <div - onClick={() => { router.push(`/search?query=${title.toLowerCase()}`) }} - className="flex justify-between items-center p-1 cursor-pointer hover:bg-trends-hover active:bg-trends-active"> - <div className="p-2"> - <div className="flex items-center gap-2 text-tertiary"> - <span>{ranking}</span> - <span className="w-2 h-2 bg-tertiary rounded-full"></span> - <span>Trending</span> - </div> - <div className="text-secondary font-medium">{title}</div> - <div className="text-tertiary"> - {gweets} {gweets === 1 ? "gweet" : "gweets"} - </div> + <Link + href={`/search?query=${title.toLowerCase()}`} + className="flex flex-col justify-between hover:bg-accent active:bg-accent rounded-lg p-1"> + + <div className="text-xs text-muted-foreground"> + {ranking} · Trending + </div> + <div>#{title}</div> + <div className="text-xs text-muted-foreground"> + {gweets} {gweets === 1 ? "gweet" : "gweets"} </div> - </div> + </Link> ) } \ No newline at end of file diff --git a/components/trends/components/trends.tsx b/components/trends/components/trends.tsx index 9ea7fe56585aaf9950caf6b7f72019e4aa125add..2d1eb6d2fa78da22239916ba36f01593b90954b2 100644 --- a/components/trends/components/trends.tsx +++ b/components/trends/components/trends.tsx @@ -1,7 +1,9 @@ -import Link from "next/link" +"use client" -import { Icons } from "@/components/icons" +import LoadingItem from "@/components/loading-item" import { TryAgain } from "@/components/try-again" +import { Card } from "@/components/ui/card" +import Link from "next/link" import { useHashtags } from "../hooks/use-hashtags" import { Trend } from "./trend" @@ -11,36 +13,24 @@ export const Trends = ({ title = "Trends" }: { title?: string }) => { if (hashtags && hashtags?.length <= 0) return null return ( - <div className=""> + <div className="space-y-5 flex flex-col"> + {title && <h1 className="font-bold p-1">{title}</h1>} {isLoading ? ( - <div className=""> - <Icons.spinner className="h-4 w-4 animate-spin" /> - </div> + <LoadingItem /> ) : isError ? ( - <div className=""> - <TryAgain /> - </div> - ) : ( - <> - <div className=""> - <h1 className="">{title}</h1> - {isSuccess && - hashtags?.map((hashtag, index) => { - return ( - <Trend - key={hashtag.id} - ranking={index + 1} - title={hashtag.text} - gweets={hashtag.score} - /> - ) - })} - </div> - <button className=""> - <Link href={`trends`}>Show more</Link> - </button> - </> - )} + <TryAgain /> + ) : isSuccess && + hashtags?.map((hashtag, index) => { + return ( + <Trend + key={hashtag.id} + ranking={index + 1} + title={hashtag.text} + gweets={hashtag.score} + /> + ) + })} + {title && <Link href={"/trends"} className="self-end hover:bg-accent p-1 rounded-lg">See more</Link>} </div> ) -} +} \ No newline at end of file diff --git a/components/trends/hooks/use-hashtags.ts b/components/trends/hooks/use-hashtags.ts index 18ea7d3fa36fb427ca2ca9845da552f8f58c5497..61e7396980302da7a407195424015c0c946655fe 100644 --- a/components/trends/hooks/use-hashtags.ts +++ b/components/trends/hooks/use-hashtags.ts @@ -1,3 +1,5 @@ +"use client" + import { useQuery, useQueryClient } from "@tanstack/react-query" import { getHashtags } from "../api/get-hashtags" @@ -17,4 +19,4 @@ export const useHashtags = () => { }, }, ) -} +} \ No newline at end of file diff --git a/components/ui/tabs.tsx b/components/ui/tabs.tsx new file mode 100644 index 0000000000000000000000000000000000000000..aa148135b1ecd7b36ce2a66a5cb5002aa8c0136b --- /dev/null +++ b/components/ui/tabs.tsx @@ -0,0 +1,55 @@ +"use client" + +import * as TabsPrimitive from "@radix-ui/react-tabs" +import * as React from "react" + +import { cn } from "@/lib/utils" + +const Tabs = TabsPrimitive.Root + +const TabsList = React.forwardRef< + React.ElementRef<typeof TabsPrimitive.List>, + React.ComponentPropsWithoutRef<typeof TabsPrimitive.List> +>(({ className, ...props }, ref) => ( + <TabsPrimitive.List + ref={ref} + className={cn( + "inline-flex h-10 items-center justify-center rounded-md bg-muted p-1 text-muted-foreground", + className + )} + {...props} + /> +)) +TabsList.displayName = TabsPrimitive.List.displayName + +const TabsTrigger = React.forwardRef< + React.ElementRef<typeof TabsPrimitive.Trigger>, + React.ComponentPropsWithoutRef<typeof TabsPrimitive.Trigger> +>(({ className, ...props }, ref) => ( + <TabsPrimitive.Trigger + ref={ref} + className={cn( + "inline-flex items-center justify-center whitespace-nowrap rounded-sm px-3 py-1.5 text-sm font-medium ring-offset-background transition-all focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:bg-background data-[state=active]:text-foreground data-[state=active]:shadow-sm", + className + )} + {...props} + /> +)) +TabsTrigger.displayName = TabsPrimitive.Trigger.displayName + +const TabsContent = React.forwardRef< + React.ElementRef<typeof TabsPrimitive.Content>, + React.ComponentPropsWithoutRef<typeof TabsPrimitive.Content> +>(({ className, ...props }, ref) => ( + <TabsPrimitive.Content + ref={ref} + className={cn( + "mt-2 ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2", + className + )} + {...props} + /> +)) +TabsContent.displayName = TabsPrimitive.Content.displayName + +export { Tabs, TabsContent, TabsList, TabsTrigger } diff --git a/components/user-auth-form.tsx b/components/user-auth-form.tsx index cf72bafca2796f70ed1d8e1ce73109dbcaf304ce..21a0d035f98ffca9d1a140cb8837476d7fd1fb98 100644 --- a/components/user-auth-form.tsx +++ b/components/user-auth-form.tsx @@ -97,6 +97,7 @@ export function UserAuthForm({ type, className, ...props }: UserAuthFormProps) { } router.push("/home") + router.refresh() if (type === "signup") { return toast({ diff --git a/package-lock.json b/package-lock.json index 34208e00d95e3cc4a6b56f8b65223fbca1d99ca5..53f161a7a9f5b13a5384ba2c661c6c751d7ce495 100644 --- a/package-lock.json +++ b/package-lock.json @@ -22,6 +22,7 @@ "@radix-ui/react-select": "^1.2.2", "@radix-ui/react-separator": "^1.0.3", "@radix-ui/react-slot": "^1.0.2", + "@radix-ui/react-tabs": "^1.0.4", "@radix-ui/react-toast": "^1.1.4", "@t3-oss/env-nextjs": "^0.6.0", "@tanstack/react-query": "^4.29.19", @@ -29,9 +30,9 @@ "bcrypt": "^5.1.0", "class-variance-authority": "^0.6.1", "clsx": "^1.2.1", - "dayjs": "^1.11.8", - "lucide-react": "^0.257.0", - "next": "^13.4.7", + "dayjs": "^1.11.9", + "lucide-react": "^0.258.0", + "next": "^13.4.8", "next-auth": "^4.22.1", "next-themes": "^0.2.1", "normalize-diacritics": "^4.0.0", @@ -57,9 +58,9 @@ "@types/react-dom": "^18.2.6", "autoprefixer": "10.4.14", "eslint": "^8.44.0", - "eslint-config-next": "^13.4.7", - "jest": "^29.5.0", - "jest-environment-jsdom": "^29.5.0", + "eslint-config-next": "^13.4.8", + "jest": "^29.6.0", + "jest-environment-jsdom": "^29.6.0", "postcss": "8.4.24", "prisma": "^4.16.2", "tailwindcss": "3.3.2", @@ -150,35 +151,35 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.5.tgz", - "integrity": "sha512-4Jc/YuIaYqKnDDz892kPIledykKg12Aw1PYX5i/TY28anJtacvM1Rrr8wbieB9GfEJwlzqT0hUEao0CxEebiDA==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.6.tgz", + "integrity": "sha512-29tfsWTq2Ftu7MXmimyC0C5FDZv5DYxOZkh3XD3+QW4V/BYuv/LyEsjj3c0hqedEaDt6DBfDvexMKU8YevdqFg==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.5.tgz", - "integrity": "sha512-SBuTAjg91A3eKOvD+bPEz3LlhHZRNu1nFOVts9lzDJTXshHTjII0BAtDS3Y2DAkdZdDKWVZGVwkDfc4Clxn1dg==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.6.tgz", + "integrity": "sha512-HPIyDa6n+HKw5dEuway3vVAhBboYCtREBMp+IWeseZy6TFtzn6MHkCH2KKYUOC/vKKwgSMHQW4htBOrmuRPXfw==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.22.5", "@babel/generator": "^7.22.5", - "@babel/helper-compilation-targets": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.6", "@babel/helper-module-transforms": "^7.22.5", - "@babel/helpers": "^7.22.5", - "@babel/parser": "^7.22.5", + "@babel/helpers": "^7.22.6", + "@babel/parser": "^7.22.6", "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.5", + "@babel/traverse": "^7.22.6", "@babel/types": "^7.22.5", + "@nicolo-ribaudo/semver-v6": "^6.3.3", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", - "json5": "^2.2.2", - "semver": "^6.3.0" + "json5": "^2.2.2" }, "engines": { "node": ">=6.9.0" @@ -210,16 +211,16 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.5.tgz", - "integrity": "sha512-Ji+ywpHeuqxB8WDxraCiqR0xfhYjiDE/e6k7FuIaANnoOFxAHskHChz4vA1mJC9Lbm01s1PVAGhQY4FUKSkGZw==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.6.tgz", + "integrity": "sha512-534sYEqWD9VfUm3IPn2SLcH4Q3P86XL+QvqdC7ZsFrzyyPF3T4XGiVghF6PTYNdWg6pXuoqXxNQAhbYeEInTzA==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.22.5", + "@babel/compat-data": "^7.22.6", "@babel/helper-validator-option": "^7.22.5", - "browserslist": "^4.21.3", - "lru-cache": "^5.1.1", - "semver": "^6.3.0" + "@nicolo-ribaudo/semver-v6": "^6.3.3", + "browserslist": "^4.21.9", + "lru-cache": "^5.1.1" }, "engines": { "node": ">=6.9.0" @@ -315,9 +316,9 @@ } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.5.tgz", - "integrity": "sha512-thqK5QFghPKWLhAV321lxF95yCg2K3Ob5yw+M3VHWfdia0IkPXUtoLH8x/6Fh486QUvzhb8YOWHChTVen2/PoQ==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", "dev": true, "dependencies": { "@babel/types": "^7.22.5" @@ -354,13 +355,13 @@ } }, "node_modules/@babel/helpers": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.5.tgz", - "integrity": "sha512-pSXRmfE1vzcUIDFQcSGA5Mr+GxBV9oiRKDuDxXvWQQBCh8HoIjs/2DlDB7H8smac1IVrB9/xdXj2N3Wol9Cr+Q==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.6.tgz", + "integrity": "sha512-YjDs6y/fVOYFV8hAf1rxd1QvR9wJe1pDBZ2AREKq/SDayfPzgk0PBnVuTCE5X1acEpMMNOVUqoe+OwiZGJ+OaA==", "dev": true, "dependencies": { "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.5", + "@babel/traverse": "^7.22.6", "@babel/types": "^7.22.5" }, "engines": { @@ -453,9 +454,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.5.tgz", - "integrity": "sha512-DFZMC9LJUG9PLOclRC32G63UXwzqS2koQC8dkx+PLdmt1xSePYpbT/NbsrJy8Q/muXz7o/h/d4A7Fuyixm559Q==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.6.tgz", + "integrity": "sha512-EIQu22vNkceq3LbjAq7knDf/UmtI2qbcNI8GRBlijez6TpQLvSodJPYfydQmNA5buwkxxxa/PVI44jjYZ+/cLw==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -667,9 +668,9 @@ } }, "node_modules/@babel/traverse": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.5.tgz", - "integrity": "sha512-7DuIjPgERaNo6r+PZwItpjCZEa5vyw4eJGufeLxrPdBXBoLcCJCIasvK6pK/9DVNrLZTLFhUGqaC6X/PA007TQ==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.6.tgz", + "integrity": "sha512-53CijMvKlLIDlOTrdWiHileRddlIiwUIyCKqYa7lYnnPldXCG5dUSN38uT0cA6i7rHWNKJLH0VU/Kxdr1GzB3w==", "dev": true, "dependencies": { "@babel/code-frame": "^7.22.5", @@ -677,8 +678,8 @@ "@babel/helper-environment-visitor": "^7.22.5", "@babel/helper-function-name": "^7.22.5", "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.5", - "@babel/parser": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.22.6", "@babel/types": "^7.22.5", "debug": "^4.1.0", "globals": "^11.1.0" @@ -947,16 +948,16 @@ } }, "node_modules/@jest/console": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.5.0.tgz", - "integrity": "sha512-NEpkObxPwyw/XxZVLPmAGKE89IQRp4puc6IQRPru6JKd1M3fW9v1xM1AnzIJE65hbCkzQAdnL8P47e9hzhiYLQ==", + "version": "29.6.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.6.0.tgz", + "integrity": "sha512-anb6L1yg7uPQpytNVA5skRaXy3BmrsU8icRhTVNbWdjYWDDfy8M1Kq5HIVRpYoABdbpqsc5Dr+jtu4+qWRQBiQ==", "dev": true, "dependencies": { - "@jest/types": "^29.5.0", + "@jest/types": "^29.6.0", "@types/node": "*", "chalk": "^4.0.0", - "jest-message-util": "^29.5.0", - "jest-util": "^29.5.0", + "jest-message-util": "^29.6.0", + "jest-util": "^29.6.0", "slash": "^3.0.0" }, "engines": { @@ -980,16 +981,16 @@ } }, "node_modules/@jest/core": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.5.0.tgz", - "integrity": "sha512-28UzQc7ulUrOQw1IsN/kv1QES3q2kkbl/wGslyhAclqZ/8cMdB5M68BffkIdSJgKBUt50d3hbwJ92XESlE7LiQ==", + "version": "29.6.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.6.0.tgz", + "integrity": "sha512-5dbMHfY/5R9m8NbgmB3JlxQqooZ/ooPSOiwEQZZ+HODwJTbIu37seVcZNBK29aMdXtjvTRB3f6LCvkKq+r8uQA==", "dev": true, "dependencies": { - "@jest/console": "^29.5.0", - "@jest/reporters": "^29.5.0", - "@jest/test-result": "^29.5.0", - "@jest/transform": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/console": "^29.6.0", + "@jest/reporters": "^29.6.0", + "@jest/test-result": "^29.6.0", + "@jest/transform": "^29.6.0", + "@jest/types": "^29.6.0", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", @@ -997,20 +998,20 @@ "exit": "^0.1.2", "graceful-fs": "^4.2.9", "jest-changed-files": "^29.5.0", - "jest-config": "^29.5.0", - "jest-haste-map": "^29.5.0", - "jest-message-util": "^29.5.0", + "jest-config": "^29.6.0", + "jest-haste-map": "^29.6.0", + "jest-message-util": "^29.6.0", "jest-regex-util": "^29.4.3", - "jest-resolve": "^29.5.0", - "jest-resolve-dependencies": "^29.5.0", - "jest-runner": "^29.5.0", - "jest-runtime": "^29.5.0", - "jest-snapshot": "^29.5.0", - "jest-util": "^29.5.0", - "jest-validate": "^29.5.0", - "jest-watcher": "^29.5.0", + "jest-resolve": "^29.6.0", + "jest-resolve-dependencies": "^29.6.0", + "jest-runner": "^29.6.0", + "jest-runtime": "^29.6.0", + "jest-snapshot": "^29.6.0", + "jest-util": "^29.6.0", + "jest-validate": "^29.6.0", + "jest-watcher": "^29.6.0", "micromatch": "^4.0.4", - "pretty-format": "^29.5.0", + "pretty-format": "^29.6.0", "slash": "^3.0.0", "strip-ansi": "^6.0.0" }, @@ -1043,12 +1044,12 @@ } }, "node_modules/@jest/core/node_modules/pretty-format": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", - "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", + "version": "29.6.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.0.tgz", + "integrity": "sha512-XH+D4n7Ey0iSR6PdAnBs99cWMZdGsdKrR33iUHQNr79w1szKTCIZDVdXuccAsHVwDBp0XeWPfNEoaxP9EZgRmQ==", "dev": true, "dependencies": { - "@jest/schemas": "^29.4.3", + "@jest/schemas": "^29.6.0", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, @@ -1075,37 +1076,37 @@ "dev": true }, "node_modules/@jest/environment": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.5.0.tgz", - "integrity": "sha512-5FXw2+wD29YU1d4I2htpRX7jYnAyTRjP2CsXQdo9SAM8g3ifxWPSV0HnClSn71xwctr0U3oZIIH+dtbfmnbXVQ==", + "version": "29.6.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.6.0.tgz", + "integrity": "sha512-bUZLYUxYlUIsslBbxII0fq0kr1+friI3Gty+cRLmocGB1jdcAHs7FS8QdCDqedE8q4DZE1g/AJHH6OJZBLGGsg==", "dev": true, "dependencies": { - "@jest/fake-timers": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/fake-timers": "^29.6.0", + "@jest/types": "^29.6.0", "@types/node": "*", - "jest-mock": "^29.5.0" + "jest-mock": "^29.6.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.5.0.tgz", - "integrity": "sha512-PueDR2HGihN3ciUNGr4uelropW7rqUfTiOn+8u0leg/42UhblPxHkfoh0Ruu3I9Y1962P3u2DY4+h7GVTSVU6g==", + "version": "29.6.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.6.0.tgz", + "integrity": "sha512-a7pISPW28Q3c0/pLwz4mQ6tbAI+hc8/0CJp9ix6e9U4dQ6TiHQX82CT5DV5BMWaw8bFH4E6zsfZxXdn6Ka23Bw==", "dev": true, "dependencies": { - "expect": "^29.5.0", - "jest-snapshot": "^29.5.0" + "expect": "^29.6.0", + "jest-snapshot": "^29.6.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect-utils": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.5.0.tgz", - "integrity": "sha512-fmKzsidoXQT2KwnrwE0SQq3uj8Z763vzR8LnLBwC2qYWEFpjX8daRsk6rHUM1QvNlEW/UJXNXm59ztmJJWs2Mg==", + "version": "29.6.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.6.0.tgz", + "integrity": "sha512-LLSQQN7oypMSETKoPWpsWYVKJd9LQWmSDDAc4hUQ4JocVC7LAMy9R3ZMhlnLwbcFvQORZnZR7HM893Px6cJhvA==", "dev": true, "dependencies": { "jest-get-type": "^29.4.3" @@ -1115,49 +1116,49 @@ } }, "node_modules/@jest/fake-timers": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.5.0.tgz", - "integrity": "sha512-9ARvuAAQcBwDAqOnglWq2zwNIRUDtk/SCkp/ToGEhFv5r86K21l+VEs0qNTaXtyiY0lEePl3kylijSYJQqdbDg==", + "version": "29.6.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.6.0.tgz", + "integrity": "sha512-nuCU46AsZoskthWSDS2Aj6LARgyNcp5Fjx2qxsO/fPl1Wp1CJ+dBDqs0OkEcJK8FBeV/MbjH5efe79M2sHcV+A==", "dev": true, "dependencies": { - "@jest/types": "^29.5.0", + "@jest/types": "^29.6.0", "@sinonjs/fake-timers": "^10.0.2", "@types/node": "*", - "jest-message-util": "^29.5.0", - "jest-mock": "^29.5.0", - "jest-util": "^29.5.0" + "jest-message-util": "^29.6.0", + "jest-mock": "^29.6.0", + "jest-util": "^29.6.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/globals": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.5.0.tgz", - "integrity": "sha512-S02y0qMWGihdzNbUiqSAiKSpSozSuHX5UYc7QbnHP+D9Lyw8DgGGCinrN9uSuHPeKgSSzvPom2q1nAtBvUsvPQ==", + "version": "29.6.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.6.0.tgz", + "integrity": "sha512-IQQ3hZ2D/hwEwXSMv5GbfhzdH0nTQR3KPYxnuW6gYWbd6+7/zgMz7Okn6EgBbNtJNONq03k5EKA6HqGyzRbpeg==", "dev": true, "dependencies": { - "@jest/environment": "^29.5.0", - "@jest/expect": "^29.5.0", - "@jest/types": "^29.5.0", - "jest-mock": "^29.5.0" + "@jest/environment": "^29.6.0", + "@jest/expect": "^29.6.0", + "@jest/types": "^29.6.0", + "jest-mock": "^29.6.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/reporters": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.5.0.tgz", - "integrity": "sha512-D05STXqj/M8bP9hQNSICtPqz97u7ffGzZu+9XLucXhkOFBqKcXe04JLZOgIekOxdb73MAoBUFnqvf7MCpKk5OA==", + "version": "29.6.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.6.0.tgz", + "integrity": "sha512-dWEq4HI0VvHcAD6XTtyBKKARLytyyWPIy1SvGOcU91106MfvHPdxZgupFwVHd8TFpZPpA3SebYjtwS5BUS76Rw==", "dev": true, "dependencies": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.5.0", - "@jest/test-result": "^29.5.0", - "@jest/transform": "^29.5.0", - "@jest/types": "^29.5.0", - "@jridgewell/trace-mapping": "^0.3.15", + "@jest/console": "^29.6.0", + "@jest/test-result": "^29.6.0", + "@jest/transform": "^29.6.0", + "@jest/types": "^29.6.0", + "@jridgewell/trace-mapping": "^0.3.18", "@types/node": "*", "chalk": "^4.0.0", "collect-v8-coverage": "^1.0.0", @@ -1169,9 +1170,9 @@ "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.5.0", - "jest-util": "^29.5.0", - "jest-worker": "^29.5.0", + "jest-message-util": "^29.6.0", + "jest-util": "^29.6.0", + "jest-worker": "^29.6.0", "slash": "^3.0.0", "string-length": "^4.0.1", "strip-ansi": "^6.0.0", @@ -1206,24 +1207,24 @@ } }, "node_modules/@jest/schemas": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz", - "integrity": "sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==", + "version": "29.6.0", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.0.tgz", + "integrity": "sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ==", "dev": true, "dependencies": { - "@sinclair/typebox": "^0.25.16" + "@sinclair/typebox": "^0.27.8" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/source-map": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.4.3.tgz", - "integrity": "sha512-qyt/mb6rLyd9j1jUts4EQncvS6Yy3PM9HghnNv86QBlV+zdL2inCdK1tuVlL+J+lpiw2BI67qXOrX3UurBqQ1w==", + "version": "29.6.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.0.tgz", + "integrity": "sha512-oA+I2SHHQGxDCZpbrsCQSoMLb3Bz547JnM+jUr9qEbuw0vQlWZfpPS7CO9J7XiwKicEz9OFn/IYoLkkiUD7bzA==", "dev": true, "dependencies": { - "@jridgewell/trace-mapping": "^0.3.15", + "@jridgewell/trace-mapping": "^0.3.18", "callsites": "^3.0.0", "graceful-fs": "^4.2.9" }, @@ -1232,13 +1233,13 @@ } }, "node_modules/@jest/test-result": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.5.0.tgz", - "integrity": "sha512-fGl4rfitnbfLsrfx1uUpDEESS7zM8JdgZgOCQuxQvL1Sn/I6ijeAVQWGfXI9zb1i9Mzo495cIpVZhA0yr60PkQ==", + "version": "29.6.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.6.0.tgz", + "integrity": "sha512-9qLb7xITeyWhM4yatn2muqfomuoCTOhv0QV9i7XiIyYi3QLfnvPv5NeJp5u0PZeutAOROMLKakOkmoAisOr3YQ==", "dev": true, "dependencies": { - "@jest/console": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/console": "^29.6.0", + "@jest/types": "^29.6.0", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" }, @@ -1247,14 +1248,14 @@ } }, "node_modules/@jest/test-sequencer": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.5.0.tgz", - "integrity": "sha512-yPafQEcKjkSfDXyvtgiV4pevSeyuA6MQr6ZIdVkWJly9vkqjnFfcfhRQqpD5whjoU8EORki752xQmjaqoFjzMQ==", + "version": "29.6.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.6.0.tgz", + "integrity": "sha512-HYCS3LKRQotKWj2mnA3AN13PPevYZu8MJKm12lzYojpJNnn6kI/3PWmr1At/e3tUu+FHQDiOyaDVuR4EV3ezBw==", "dev": true, "dependencies": { - "@jest/test-result": "^29.5.0", + "@jest/test-result": "^29.6.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.5.0", + "jest-haste-map": "^29.6.0", "slash": "^3.0.0" }, "engines": { @@ -1262,22 +1263,22 @@ } }, "node_modules/@jest/transform": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.5.0.tgz", - "integrity": "sha512-8vbeZWqLJOvHaDfeMuoHITGKSz5qWc9u04lnWrQE3VyuSw604PzQM824ZeX9XSjUCeDiE3GuxZe5UKa8J61NQw==", + "version": "29.6.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.6.0.tgz", + "integrity": "sha512-bhP/KxPo3e322FJ0nKAcb6WVK76ZYyQd1lWygJzoSqP8SYMSLdxHqP4wnPTI4WvbB8PKPDV30y5y7Tya4RHOBA==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", - "@jest/types": "^29.5.0", - "@jridgewell/trace-mapping": "^0.3.15", + "@jest/types": "^29.6.0", + "@jridgewell/trace-mapping": "^0.3.18", "babel-plugin-istanbul": "^6.1.1", "chalk": "^4.0.0", "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.5.0", + "jest-haste-map": "^29.6.0", "jest-regex-util": "^29.4.3", - "jest-util": "^29.5.0", + "jest-util": "^29.6.0", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", @@ -1304,12 +1305,12 @@ } }, "node_modules/@jest/types": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.5.0.tgz", - "integrity": "sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog==", + "version": "29.6.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.0.tgz", + "integrity": "sha512-8XCgL9JhqbJTFnMRjEAO+TuW251+MoMd5BSzLiE3vvzpQ8RlBxy8NoyNkDhs3K3OL3HeVinlOl9or5p7GTeOLg==", "dev": true, "dependencies": { - "@jest/schemas": "^29.4.3", + "@jest/schemas": "^29.6.0", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", @@ -1404,23 +1405,23 @@ } }, "node_modules/@next/env": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/env/-/env-13.4.7.tgz", - "integrity": "sha512-ZlbiFulnwiFsW9UV1ku1OvX/oyIPLtMk9p/nnvDSwI0s7vSoZdRtxXNsaO+ZXrLv/pMbXVGq4lL8TbY9iuGmVw==" + "version": "13.4.8", + "resolved": "https://registry.npmjs.org/@next/env/-/env-13.4.8.tgz", + "integrity": "sha512-twuSf1klb3k9wXI7IZhbZGtFCWvGD4wXTY2rmvzIgVhXhs7ISThrbNyutBx3jWIL8Y/Hk9+woytFz5QsgtcRKQ==" }, "node_modules/@next/eslint-plugin-next": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-13.4.7.tgz", - "integrity": "sha512-ANEPltxzXbyyG7CvqxdY4PmeM5+RyWdAJGufTHnU+LA/i3J6IDV2r8Z4onKwskwKEhwqzz5lMaSYGGXLyHX+mg==", + "version": "13.4.8", + "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-13.4.8.tgz", + "integrity": "sha512-cmfVHpxWjjcETFt2WHnoFU6EmY69QcPJRlRNAooQlNe53Ke90vg1Ci/dkPffryJZaxxiRziP9bQrV8lDVCn3Fw==", "dev": true, "dependencies": { "glob": "7.1.7" } }, "node_modules/@next/swc-darwin-arm64": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.4.7.tgz", - "integrity": "sha512-VZTxPv1b59KGiv/pZHTO5Gbsdeoxcj2rU2cqJu03btMhHpn3vwzEK0gUSVC/XW96aeGO67X+cMahhwHzef24/w==", + "version": "13.4.8", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.4.8.tgz", + "integrity": "sha512-MSFplVM4dTWOuKAUv0XR9gY7AWtMSBu9os9f+kp+s5rWhM1I2CdR3obFttd6366nS/W/VZxbPM5oEIdlIa46zA==", "cpu": [ "arm64" ], @@ -1433,9 +1434,9 @@ } }, "node_modules/@next/swc-darwin-x64": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.4.7.tgz", - "integrity": "sha512-gO2bw+2Ymmga+QYujjvDz9955xvYGrWofmxTq7m70b9pDPvl7aDFABJOZ2a8SRCuSNB5mXU8eTOmVVwyp/nAew==", + "version": "13.4.8", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.4.8.tgz", + "integrity": "sha512-Reox+UXgonon9P0WNDE6w85DGtyBqGitl/ryznOvn6TvfxEaZIpTgeu3ZrJLU9dHSMhiK7YAM793mE/Zii2/Qw==", "cpu": [ "x64" ], @@ -1448,9 +1449,9 @@ } }, "node_modules/@next/swc-linux-arm64-gnu": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.4.7.tgz", - "integrity": "sha512-6cqp3vf1eHxjIDhEOc7Mh/s8z1cwc/l5B6ZNkOofmZVyu1zsbEM5Hmx64s12Rd9AYgGoiCz4OJ4M/oRnkE16/Q==", + "version": "13.4.8", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.4.8.tgz", + "integrity": "sha512-kdyzYvAYtqQVgzIKNN7e1rLU8aZv86FDSRqPlOkKZlvqudvTO0iohuTPmnEEDlECeBM6qRPShNffotDcU/R2KA==", "cpu": [ "arm64" ], @@ -1463,9 +1464,9 @@ } }, "node_modules/@next/swc-linux-arm64-musl": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.4.7.tgz", - "integrity": "sha512-T1kD2FWOEy5WPidOn1si0rYmWORNch4a/NR52Ghyp4q7KyxOCuiOfZzyhVC5tsLIBDH3+cNdB5DkD9afpNDaOw==", + "version": "13.4.8", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.4.8.tgz", + "integrity": "sha512-oWxx4yRkUGcR81XwbI+T0zhZ3bDF6V1aVLpG+C7hSG50ULpV8gC39UxVO22/bv93ZlcfMY4zl8xkz9Klct6dpQ==", "cpu": [ "arm64" ], @@ -1478,9 +1479,9 @@ } }, "node_modules/@next/swc-linux-x64-gnu": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.4.7.tgz", - "integrity": "sha512-zaEC+iEiAHNdhl6fuwl0H0shnTzQoAoJiDYBUze8QTntE/GNPfTYpYboxF5LRYIjBwETUatvE0T64W6SKDipvg==", + "version": "13.4.8", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.4.8.tgz", + "integrity": "sha512-anhtvuO6eE9YRhYnaEGTfbpH3L5gT/9qPFcNoi6xS432r/4DAtpJY8kNktqkTVevVIC/pVumqO8tV59PR3zbNg==", "cpu": [ "x64" ], @@ -1493,9 +1494,9 @@ } }, "node_modules/@next/swc-linux-x64-musl": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.4.7.tgz", - "integrity": "sha512-X6r12F8d8SKAtYJqLZBBMIwEqcTRvUdVm+xIq+l6pJqlgT2tNsLLf2i5Cl88xSsIytBICGsCNNHd+siD2fbWBA==", + "version": "13.4.8", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.4.8.tgz", + "integrity": "sha512-aR+J4wWfNgH1DwCCBNjan7Iumx0lLtn+2/rEYuhIrYLY4vnxqSVGz9u3fXcgUwo6Q9LT8NFkaqK1vPprdq+BXg==", "cpu": [ "x64" ], @@ -1508,9 +1509,9 @@ } }, "node_modules/@next/swc-win32-arm64-msvc": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.4.7.tgz", - "integrity": "sha512-NPnmnV+vEIxnu6SUvjnuaWRglZzw4ox5n/MQTxeUhb5iwVWFedolPFebMNwgrWu4AELwvTdGtWjqof53AiWHcw==", + "version": "13.4.8", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.4.8.tgz", + "integrity": "sha512-OWBKIrJwQBTqrat0xhxEB/jcsjJR3+diD9nc/Y8F1mRdQzsn4bPsomgJyuqPVZs6Lz3K18qdIkvywmfSq75SsQ==", "cpu": [ "arm64" ], @@ -1523,9 +1524,9 @@ } }, "node_modules/@next/swc-win32-ia32-msvc": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.4.7.tgz", - "integrity": "sha512-6Hxijm6/a8XqLQpOOf/XuwWRhcuc/g4rBB2oxjgCMuV9Xlr2bLs5+lXyh8w9YbAUMYR3iC9mgOlXbHa79elmXw==", + "version": "13.4.8", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.4.8.tgz", + "integrity": "sha512-agiPWGjUndXGTOn4ChbKipQXRA6/UPkywAWIkx7BhgGv48TiJfHTK6MGfBoL9tS6B4mtW39++uy0wFPnfD0JWg==", "cpu": [ "ia32" ], @@ -1538,9 +1539,9 @@ } }, "node_modules/@next/swc-win32-x64-msvc": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.4.7.tgz", - "integrity": "sha512-sW9Yt36Db1nXJL+mTr2Wo0y+VkPWeYhygvcHj1FF0srVtV+VoDjxleKtny21QHaG05zdeZnw2fCtf2+dEqgwqA==", + "version": "13.4.8", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.4.8.tgz", + "integrity": "sha512-UIRKoByVKbuR6SnFG4JM8EMFlJrfEGuUQ1ihxzEleWcNwRMMiVaCj1KyqfTOW8VTQhJ0u8P1Ngg6q1RwnIBTtw==", "cpu": [ "x64" ], @@ -1552,6 +1553,15 @@ "node": ">= 10" } }, + "node_modules/@nicolo-ribaudo/semver-v6": { + "version": "6.3.3", + "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/semver-v6/-/semver-v6-6.3.3.tgz", + "integrity": "sha512-3Yc1fUTs69MG/uZbJlLSI3JISMn2UV2rg+1D/vROUqZyh3l6iYHCs7GMp+M40ZD7yOdDbYjJcU1oTJhrc+dGKg==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -2331,6 +2341,36 @@ } } }, + "node_modules/@radix-ui/react-tabs": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.0.4.tgz", + "integrity": "sha512-egZfYY/+wRNCflXNHx+dePvnz9FbmssDTJBtgRfDY7e8SE5oIo3Py2eCB1ckAbh1Q7cQ/6yJZThJ++sgbxibog==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.1", + "@radix-ui/react-context": "1.0.1", + "@radix-ui/react-direction": "1.0.1", + "@radix-ui/react-id": "1.0.1", + "@radix-ui/react-presence": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-roving-focus": "1.0.4", + "@radix-ui/react-use-controllable-state": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, "node_modules/@radix-ui/react-toast": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/@radix-ui/react-toast/-/react-toast-1.1.4.tgz", @@ -2526,9 +2566,9 @@ "dev": true }, "node_modules/@sinclair/typebox": { - "version": "0.25.24", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz", - "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==", + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", "dev": true }, "node_modules/@sinonjs/commons": { @@ -3444,12 +3484,12 @@ } }, "node_modules/babel-jest": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.5.0.tgz", - "integrity": "sha512-mA4eCDh5mSo2EcA9xQjVTpmbbNk32Zb3Q3QFQsNhaK56Q+yoXowzFodLux30HRgyOho5rsQ6B0P9QpMkvvnJ0Q==", + "version": "29.6.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.6.0.tgz", + "integrity": "sha512-Jj8Bq2yKsk11XLk06Nm8SdvYkAcecH+GuhxB8DnK5SncjHnJ88TQjSnGgE7jpajpnSvz9DZ6X8hXrDkD/6/TPQ==", "dev": true, "dependencies": { - "@jest/transform": "^29.5.0", + "@jest/transform": "^29.6.0", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.1.1", "babel-preset-jest": "^29.5.0", @@ -4042,9 +4082,9 @@ } }, "node_modules/dayjs": { - "version": "1.11.8", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.8.tgz", - "integrity": "sha512-LcgxzFoWMEPO7ggRv1Y2N31hUf2R0Vj7fuy/m+Bg1K8rr+KAs1AEy4y9jd5DXe8pbHgX+srkHNS7TH6Q6ZhYeQ==" + "version": "1.11.9", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.9.tgz", + "integrity": "sha512-QvzAURSbQ0pKdIye2txOzNaHmxtUBXerpY0FJsFXUMKbIZeFm5ht1LS/jFsrncjnmtv8HsG0W2g6c0zUjZWmpA==" }, "node_modules/debug": { "version": "4.3.4", @@ -4662,12 +4702,12 @@ } }, "node_modules/eslint-config-next": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-13.4.7.tgz", - "integrity": "sha512-+IRAyD0+J1MZaTi9RQMPUfr6Q+GCZ1wOkK6XM52Vokh7VI4R6YFGOFzdkEFHl4ZyIX4FKa5vcwUP2WscSFNjNQ==", + "version": "13.4.8", + "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-13.4.8.tgz", + "integrity": "sha512-2hE0b6lHuhtHBX8VgEXi8v4G8PVrPUBMOSLCTq8qtcQ2qQOX7+uBOLK2kU4FD2qDZzyXNlhmuH+WLT5ptY4XLA==", "dev": true, "dependencies": { - "@next/eslint-plugin-next": "13.4.7", + "@next/eslint-plugin-next": "13.4.8", "@rushstack/eslint-patch": "^1.1.3", "@typescript-eslint/parser": "^5.42.0", "eslint-import-resolver-node": "^0.3.6", @@ -5089,16 +5129,17 @@ } }, "node_modules/expect": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.5.0.tgz", - "integrity": "sha512-yM7xqUrCO2JdpFo4XpM82t+PJBFybdqoQuJLDGeDX2ij8NZzqRHyu3Hp188/JX7SWqud+7t4MUdvcgGBICMHZg==", + "version": "29.6.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.6.0.tgz", + "integrity": "sha512-AV+HaBtnDJ2YEUhPPo25HyUHBLaetM+y/Dq6pEC8VPQyt1dK+k8MfGkMy46djy2bddcqESc1kl4/K1uLWSfk9g==", "dev": true, "dependencies": { - "@jest/expect-utils": "^29.5.0", + "@jest/expect-utils": "^29.6.0", + "@types/node": "*", "jest-get-type": "^29.4.3", - "jest-matcher-utils": "^29.5.0", - "jest-message-util": "^29.5.0", - "jest-util": "^29.5.0" + "jest-matcher-utils": "^29.6.0", + "jest-message-util": "^29.6.0", + "jest-util": "^29.6.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -6291,15 +6332,15 @@ } }, "node_modules/jest": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.5.0.tgz", - "integrity": "sha512-juMg3he2uru1QoXX078zTa7pO85QyB9xajZc6bU+d9yEGwrKX6+vGmJQ3UdVZsvTEUARIdObzH68QItim6OSSQ==", + "version": "29.6.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.6.0.tgz", + "integrity": "sha512-do1J9gGrQ68E4UfMz/4OM71p9qCqQxu32N/9ZfeYFSSlx0uUOuxeyZxtJZNaUTW12ZA11ERhmBjBhy1Ho96R4g==", "dev": true, "dependencies": { - "@jest/core": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/core": "^29.6.0", + "@jest/types": "^29.6.0", "import-local": "^3.0.2", - "jest-cli": "^29.5.0" + "jest-cli": "^29.6.0" }, "bin": { "jest": "bin/jest.js" @@ -6330,28 +6371,28 @@ } }, "node_modules/jest-circus": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.5.0.tgz", - "integrity": "sha512-gq/ongqeQKAplVxqJmbeUOJJKkW3dDNPY8PjhJ5G0lBRvu0e3EWGxGy5cI4LAGA7gV2UHCtWBI4EMXK8c9nQKA==", + "version": "29.6.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.6.0.tgz", + "integrity": "sha512-LtG45qEKhse2Ws5zNR4DnZATReLGQXzBZGZnJ0DU37p6d4wDhu41vvczCQ3Ou+llR6CRYDBshsubV7H4jZvIkw==", "dev": true, "dependencies": { - "@jest/environment": "^29.5.0", - "@jest/expect": "^29.5.0", - "@jest/test-result": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/environment": "^29.6.0", + "@jest/expect": "^29.6.0", + "@jest/test-result": "^29.6.0", + "@jest/types": "^29.6.0", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", "dedent": "^0.7.0", "is-generator-fn": "^2.0.0", - "jest-each": "^29.5.0", - "jest-matcher-utils": "^29.5.0", - "jest-message-util": "^29.5.0", - "jest-runtime": "^29.5.0", - "jest-snapshot": "^29.5.0", - "jest-util": "^29.5.0", + "jest-each": "^29.6.0", + "jest-matcher-utils": "^29.6.0", + "jest-message-util": "^29.6.0", + "jest-runtime": "^29.6.0", + "jest-snapshot": "^29.6.0", + "jest-util": "^29.6.0", "p-limit": "^3.1.0", - "pretty-format": "^29.5.0", + "pretty-format": "^29.6.0", "pure-rand": "^6.0.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" @@ -6377,12 +6418,12 @@ } }, "node_modules/jest-circus/node_modules/pretty-format": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", - "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", + "version": "29.6.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.0.tgz", + "integrity": "sha512-XH+D4n7Ey0iSR6PdAnBs99cWMZdGsdKrR33iUHQNr79w1szKTCIZDVdXuccAsHVwDBp0XeWPfNEoaxP9EZgRmQ==", "dev": true, "dependencies": { - "@jest/schemas": "^29.4.3", + "@jest/schemas": "^29.6.0", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, @@ -6409,21 +6450,21 @@ "dev": true }, "node_modules/jest-cli": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.5.0.tgz", - "integrity": "sha512-L1KcP1l4HtfwdxXNFCL5bmUbLQiKrakMUriBEcc1Vfz6gx31ORKdreuWvmQVBit+1ss9NNR3yxjwfwzZNdQXJw==", + "version": "29.6.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.6.0.tgz", + "integrity": "sha512-WvZIaanK/abkw6s01924DQ2QLwM5Q4Y4iPbSDb9Zg6smyXGqqcPQ7ft9X8D7B0jICz312eSzM6UlQNxuZJBrMw==", "dev": true, "dependencies": { - "@jest/core": "^29.5.0", - "@jest/test-result": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/core": "^29.6.0", + "@jest/test-result": "^29.6.0", + "@jest/types": "^29.6.0", "chalk": "^4.0.0", "exit": "^0.1.2", "graceful-fs": "^4.2.9", "import-local": "^3.0.2", - "jest-config": "^29.5.0", - "jest-util": "^29.5.0", - "jest-validate": "^29.5.0", + "jest-config": "^29.6.0", + "jest-util": "^29.6.0", + "jest-validate": "^29.6.0", "prompts": "^2.0.1", "yargs": "^17.3.1" }, @@ -6459,31 +6500,31 @@ } }, "node_modules/jest-config": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.5.0.tgz", - "integrity": "sha512-kvDUKBnNJPNBmFFOhDbm59iu1Fii1Q6SxyhXfvylq3UTHbg6o7j/g8k2dZyXWLvfdKB1vAPxNZnMgtKJcmu3kA==", + "version": "29.6.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.6.0.tgz", + "integrity": "sha512-fKA4jM91PDqWVkMpb1FVKxIuhg3hC6hgaen57cr1rRZkR96dCatvJZsk3ik7/GNu9ERj9wgAspOmyvkFoGsZhA==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.5.0", - "@jest/types": "^29.5.0", - "babel-jest": "^29.5.0", + "@jest/test-sequencer": "^29.6.0", + "@jest/types": "^29.6.0", + "babel-jest": "^29.6.0", "chalk": "^4.0.0", "ci-info": "^3.2.0", "deepmerge": "^4.2.2", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-circus": "^29.5.0", - "jest-environment-node": "^29.5.0", + "jest-circus": "^29.6.0", + "jest-environment-node": "^29.6.0", "jest-get-type": "^29.4.3", "jest-regex-util": "^29.4.3", - "jest-resolve": "^29.5.0", - "jest-runner": "^29.5.0", - "jest-util": "^29.5.0", - "jest-validate": "^29.5.0", + "jest-resolve": "^29.6.0", + "jest-runner": "^29.6.0", + "jest-util": "^29.6.0", + "jest-validate": "^29.6.0", "micromatch": "^4.0.4", "parse-json": "^5.2.0", - "pretty-format": "^29.5.0", + "pretty-format": "^29.6.0", "slash": "^3.0.0", "strip-json-comments": "^3.1.1" }, @@ -6520,12 +6561,12 @@ } }, "node_modules/jest-config/node_modules/pretty-format": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", - "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", + "version": "29.6.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.0.tgz", + "integrity": "sha512-XH+D4n7Ey0iSR6PdAnBs99cWMZdGsdKrR33iUHQNr79w1szKTCIZDVdXuccAsHVwDBp0XeWPfNEoaxP9EZgRmQ==", "dev": true, "dependencies": { - "@jest/schemas": "^29.4.3", + "@jest/schemas": "^29.6.0", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, @@ -6552,15 +6593,15 @@ "dev": true }, "node_modules/jest-diff": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.5.0.tgz", - "integrity": "sha512-LtxijLLZBduXnHSniy0WMdaHjmQnt3g5sa16W4p0HqukYTTsyTW3GD1q41TyGl5YFXj/5B2U6dlh5FM1LIMgxw==", + "version": "29.6.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.6.0.tgz", + "integrity": "sha512-ZRm7cd2m9YyZ0N3iMyuo1iUiprxQ/MFpYWXzEEj7hjzL3WnDffKW8192XBDcrAI8j7hnrM1wed3bL/oEnYF/8w==", "dev": true, "dependencies": { "chalk": "^4.0.0", "diff-sequences": "^29.4.3", "jest-get-type": "^29.4.3", - "pretty-format": "^29.5.0" + "pretty-format": "^29.6.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -6583,12 +6624,12 @@ } }, "node_modules/jest-diff/node_modules/pretty-format": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", - "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", + "version": "29.6.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.0.tgz", + "integrity": "sha512-XH+D4n7Ey0iSR6PdAnBs99cWMZdGsdKrR33iUHQNr79w1szKTCIZDVdXuccAsHVwDBp0XeWPfNEoaxP9EZgRmQ==", "dev": true, "dependencies": { - "@jest/schemas": "^29.4.3", + "@jest/schemas": "^29.6.0", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, @@ -6627,16 +6668,16 @@ } }, "node_modules/jest-each": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.5.0.tgz", - "integrity": "sha512-HM5kIJ1BTnVt+DQZ2ALp3rzXEl+g726csObrW/jpEGl+CDSSQpOJJX2KE/vEg8cxcMXdyEPu6U4QX5eruQv5hA==", + "version": "29.6.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.6.0.tgz", + "integrity": "sha512-d0Jem4RBAlFUyV6JSXPSHVUpNo5RleSj+iJEy1G3+ZCrzHDjWs/1jUfrbnJKHdJdAx5BCEce/Ju379WqHhQk4w==", "dev": true, "dependencies": { - "@jest/types": "^29.5.0", + "@jest/types": "^29.6.0", "chalk": "^4.0.0", "jest-get-type": "^29.4.3", - "jest-util": "^29.5.0", - "pretty-format": "^29.5.0" + "jest-util": "^29.6.0", + "pretty-format": "^29.6.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -6659,12 +6700,12 @@ } }, "node_modules/jest-each/node_modules/pretty-format": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", - "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", + "version": "29.6.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.0.tgz", + "integrity": "sha512-XH+D4n7Ey0iSR6PdAnBs99cWMZdGsdKrR33iUHQNr79w1szKTCIZDVdXuccAsHVwDBp0XeWPfNEoaxP9EZgRmQ==", "dev": true, "dependencies": { - "@jest/schemas": "^29.4.3", + "@jest/schemas": "^29.6.0", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, @@ -6691,18 +6732,18 @@ "dev": true }, "node_modules/jest-environment-jsdom": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-29.5.0.tgz", - "integrity": "sha512-/KG8yEK4aN8ak56yFVdqFDzKNHgF4BAymCx2LbPNPsUshUlfAl0eX402Xm1pt+eoG9SLZEUVifqXtX8SK74KCw==", + "version": "29.6.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-29.6.0.tgz", + "integrity": "sha512-/cOhoyv+uMbOh4nQPyqtkPas/uUxr5AbK6TPqMMFyj1qEJURY78RhqgBjOFIX02+Lvu5V0RWLq2qKY1dHubFOQ==", "dev": true, "dependencies": { - "@jest/environment": "^29.5.0", - "@jest/fake-timers": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/environment": "^29.6.0", + "@jest/fake-timers": "^29.6.0", + "@jest/types": "^29.6.0", "@types/jsdom": "^20.0.0", "@types/node": "*", - "jest-mock": "^29.5.0", - "jest-util": "^29.5.0", + "jest-mock": "^29.6.0", + "jest-util": "^29.6.0", "jsdom": "^20.0.0" }, "engines": { @@ -6718,17 +6759,17 @@ } }, "node_modules/jest-environment-node": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.5.0.tgz", - "integrity": "sha512-ExxuIK/+yQ+6PRGaHkKewYtg6hto2uGCgvKdb2nfJfKXgZ17DfXjvbZ+jA1Qt9A8EQSfPnt5FKIfnOO3u1h9qw==", + "version": "29.6.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.6.0.tgz", + "integrity": "sha512-BOf5Q2/nFCdBOnyBM5c5/6DbdQYgc+0gyUQ8l8qhUAB8O7pM+4QJXIXJsRZJaxd5SHV6y5VArTVhOfogoqcP8Q==", "dev": true, "dependencies": { - "@jest/environment": "^29.5.0", - "@jest/fake-timers": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/environment": "^29.6.0", + "@jest/fake-timers": "^29.6.0", + "@jest/types": "^29.6.0", "@types/node": "*", - "jest-mock": "^29.5.0", - "jest-util": "^29.5.0" + "jest-mock": "^29.6.0", + "jest-util": "^29.6.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -6744,20 +6785,20 @@ } }, "node_modules/jest-haste-map": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.5.0.tgz", - "integrity": "sha512-IspOPnnBro8YfVYSw6yDRKh/TiCdRngjxeacCps1cQ9cgVN6+10JUcuJ1EabrgYLOATsIAigxA0rLR9x/YlrSA==", + "version": "29.6.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.6.0.tgz", + "integrity": "sha512-dY1DKufptj7hcJSuhpqlYPGcnN3XjlOy/g0jinpRTMsbb40ivZHiuIPzeminOZkrek8C+oDxC54ILGO3vMLojg==", "dev": true, "dependencies": { - "@jest/types": "^29.5.0", + "@jest/types": "^29.6.0", "@types/graceful-fs": "^4.1.3", "@types/node": "*", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", "graceful-fs": "^4.2.9", "jest-regex-util": "^29.4.3", - "jest-util": "^29.5.0", - "jest-worker": "^29.5.0", + "jest-util": "^29.6.0", + "jest-worker": "^29.6.0", "micromatch": "^4.0.4", "walker": "^1.0.8" }, @@ -6769,13 +6810,13 @@ } }, "node_modules/jest-leak-detector": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.5.0.tgz", - "integrity": "sha512-u9YdeeVnghBUtpN5mVxjID7KbkKE1QU4f6uUwuxiY0vYRi9BUCLKlPEZfDGR67ofdFmDz9oPAy2G92Ujrntmow==", + "version": "29.6.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.6.0.tgz", + "integrity": "sha512-JdV6EZOPxHR1gd6ccxjNowuROkT2jtGU5G/g58RcJX1xe5mrtLj0g6/ZkyMoXF4cs+tTkHMFX6pcIrB1QPQwCw==", "dev": true, "dependencies": { "jest-get-type": "^29.4.3", - "pretty-format": "^29.5.0" + "pretty-format": "^29.6.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -6794,12 +6835,12 @@ } }, "node_modules/jest-leak-detector/node_modules/pretty-format": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", - "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", + "version": "29.6.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.0.tgz", + "integrity": "sha512-XH+D4n7Ey0iSR6PdAnBs99cWMZdGsdKrR33iUHQNr79w1szKTCIZDVdXuccAsHVwDBp0XeWPfNEoaxP9EZgRmQ==", "dev": true, "dependencies": { - "@jest/schemas": "^29.4.3", + "@jest/schemas": "^29.6.0", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, @@ -6814,15 +6855,15 @@ "dev": true }, "node_modules/jest-matcher-utils": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.5.0.tgz", - "integrity": "sha512-lecRtgm/rjIK0CQ7LPQwzCs2VwW6WAahA55YBuI+xqmhm7LAaxokSB8C97yJeYyT+HvQkH741StzpU41wohhWw==", + "version": "29.6.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.6.0.tgz", + "integrity": "sha512-oSlqfGN+sbkB2Q5um/zL7z80w84FEAcLKzXBZIPyRk2F2Srg1ubhrHVKW68JCvb2+xKzAeGw35b+6gciS24PHw==", "dev": true, "dependencies": { "chalk": "^4.0.0", - "jest-diff": "^29.5.0", + "jest-diff": "^29.6.0", "jest-get-type": "^29.4.3", - "pretty-format": "^29.5.0" + "pretty-format": "^29.6.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -6845,12 +6886,12 @@ } }, "node_modules/jest-matcher-utils/node_modules/pretty-format": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", - "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", + "version": "29.6.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.0.tgz", + "integrity": "sha512-XH+D4n7Ey0iSR6PdAnBs99cWMZdGsdKrR33iUHQNr79w1szKTCIZDVdXuccAsHVwDBp0XeWPfNEoaxP9EZgRmQ==", "dev": true, "dependencies": { - "@jest/schemas": "^29.4.3", + "@jest/schemas": "^29.6.0", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, @@ -6877,18 +6918,18 @@ "dev": true }, "node_modules/jest-message-util": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.5.0.tgz", - "integrity": "sha512-Kijeg9Dag6CKtIDA7O21zNTACqD5MD/8HfIV8pdD94vFyFuer52SigdC3IQMhab3vACxXMiFk+yMHNdbqtyTGA==", + "version": "29.6.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.6.0.tgz", + "integrity": "sha512-mkCp56cETbpoNtsaeWVy6SKzk228mMi9FPHSObaRIhbR2Ujw9PqjW/yqVHD2tN1bHbC8ol6h3UEo7dOPmIYwIA==", "dev": true, "dependencies": { "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.5.0", + "@jest/types": "^29.6.0", "@types/stack-utils": "^2.0.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "micromatch": "^4.0.4", - "pretty-format": "^29.5.0", + "pretty-format": "^29.6.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" }, @@ -6913,12 +6954,12 @@ } }, "node_modules/jest-message-util/node_modules/pretty-format": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", - "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", + "version": "29.6.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.0.tgz", + "integrity": "sha512-XH+D4n7Ey0iSR6PdAnBs99cWMZdGsdKrR33iUHQNr79w1szKTCIZDVdXuccAsHVwDBp0XeWPfNEoaxP9EZgRmQ==", "dev": true, "dependencies": { - "@jest/schemas": "^29.4.3", + "@jest/schemas": "^29.6.0", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, @@ -6945,14 +6986,14 @@ "dev": true }, "node_modules/jest-mock": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.5.0.tgz", - "integrity": "sha512-GqOzvdWDE4fAV2bWQLQCkujxYWL7RxjCnj71b5VhDAGOevB3qj3Ovg26A5NI84ZpODxyzaozXLOh2NCgkbvyaw==", + "version": "29.6.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.6.0.tgz", + "integrity": "sha512-2Pb7R2w24Q0aUVn+2/vdRDL6CqGqpheDZy7zrXav8FotOpSGw/4bS2hyVoKHMEx4xzOn6EyCAGwc5czWxXeN7w==", "dev": true, "dependencies": { - "@jest/types": "^29.5.0", + "@jest/types": "^29.6.0", "@types/node": "*", - "jest-util": "^29.5.0" + "jest-util": "^29.6.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -6985,17 +7026,17 @@ } }, "node_modules/jest-resolve": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.5.0.tgz", - "integrity": "sha512-1TzxJ37FQq7J10jPtQjcc+MkCkE3GBpBecsSUWJ0qZNJpmg6m0D9/7II03yJulm3H/fvVjgqLh/k2eYg+ui52w==", + "version": "29.6.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.6.0.tgz", + "integrity": "sha512-+hrpY4LzAONoZA/rvB6rnZLkOSA6UgJLpdCWrOZNSgGxWMumzRLu7dLUSCabAHzoHIDQ9qXfr3th1zYNJ0E8sQ==", "dev": true, "dependencies": { "chalk": "^4.0.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.5.0", + "jest-haste-map": "^29.6.0", "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.5.0", - "jest-validate": "^29.5.0", + "jest-util": "^29.6.0", + "jest-validate": "^29.6.0", "resolve": "^1.20.0", "resolve.exports": "^2.0.0", "slash": "^3.0.0" @@ -7005,13 +7046,13 @@ } }, "node_modules/jest-resolve-dependencies": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.5.0.tgz", - "integrity": "sha512-sjV3GFr0hDJMBpYeUuGduP+YeCRbd7S/ck6IvL3kQ9cpySYKqcqhdLLC2rFwrcL7tz5vYibomBrsFYWkIGGjOg==", + "version": "29.6.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.6.0.tgz", + "integrity": "sha512-eOfPog9K3hJdJk/3i6O6bQhXS+3uXhMDkLJGX+xmMPp7T1d/zdcFofbDnHgNoEkhD/mSimC5IagLEP7lpLLu/A==", "dev": true, "dependencies": { "jest-regex-util": "^29.4.3", - "jest-snapshot": "^29.5.0" + "jest-snapshot": "^29.6.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -7034,30 +7075,30 @@ } }, "node_modules/jest-runner": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.5.0.tgz", - "integrity": "sha512-m7b6ypERhFghJsslMLhydaXBiLf7+jXy8FwGRHO3BGV1mcQpPbwiqiKUR2zU2NJuNeMenJmlFZCsIqzJCTeGLQ==", + "version": "29.6.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.6.0.tgz", + "integrity": "sha512-4fZuGV2lOxS2BiqEG9/AI8E6O+jo+QZjMVcgi1x5E6aDql0Gd/EFIbUQ0pSS09y8cya1vJB/qC2xsE468jqtSg==", "dev": true, "dependencies": { - "@jest/console": "^29.5.0", - "@jest/environment": "^29.5.0", - "@jest/test-result": "^29.5.0", - "@jest/transform": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/console": "^29.6.0", + "@jest/environment": "^29.6.0", + "@jest/test-result": "^29.6.0", + "@jest/transform": "^29.6.0", + "@jest/types": "^29.6.0", "@types/node": "*", "chalk": "^4.0.0", "emittery": "^0.13.1", "graceful-fs": "^4.2.9", "jest-docblock": "^29.4.3", - "jest-environment-node": "^29.5.0", - "jest-haste-map": "^29.5.0", - "jest-leak-detector": "^29.5.0", - "jest-message-util": "^29.5.0", - "jest-resolve": "^29.5.0", - "jest-runtime": "^29.5.0", - "jest-util": "^29.5.0", - "jest-watcher": "^29.5.0", - "jest-worker": "^29.5.0", + "jest-environment-node": "^29.6.0", + "jest-haste-map": "^29.6.0", + "jest-leak-detector": "^29.6.0", + "jest-message-util": "^29.6.0", + "jest-resolve": "^29.6.0", + "jest-runtime": "^29.6.0", + "jest-util": "^29.6.0", + "jest-watcher": "^29.6.0", + "jest-worker": "^29.6.0", "p-limit": "^3.1.0", "source-map-support": "0.5.13" }, @@ -7082,31 +7123,31 @@ } }, "node_modules/jest-runtime": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.5.0.tgz", - "integrity": "sha512-1Hr6Hh7bAgXQP+pln3homOiEZtCDZFqwmle7Ew2j8OlbkIu6uE3Y/etJQG8MLQs3Zy90xrp2C0BRrtPHG4zryw==", - "dev": true, - "dependencies": { - "@jest/environment": "^29.5.0", - "@jest/fake-timers": "^29.5.0", - "@jest/globals": "^29.5.0", - "@jest/source-map": "^29.4.3", - "@jest/test-result": "^29.5.0", - "@jest/transform": "^29.5.0", - "@jest/types": "^29.5.0", + "version": "29.6.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.6.0.tgz", + "integrity": "sha512-5FavYo3EeXLHIvnJf+r7Cj0buePAbe4mzRB9oeVxDS0uVmouSBjWeGgyRjZkw7ArxOoZI8gO6f8SGMJ2HFlwwg==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.6.0", + "@jest/fake-timers": "^29.6.0", + "@jest/globals": "^29.6.0", + "@jest/source-map": "^29.6.0", + "@jest/test-result": "^29.6.0", + "@jest/transform": "^29.6.0", + "@jest/types": "^29.6.0", "@types/node": "*", "chalk": "^4.0.0", "cjs-module-lexer": "^1.0.0", "collect-v8-coverage": "^1.0.0", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.5.0", - "jest-message-util": "^29.5.0", - "jest-mock": "^29.5.0", + "jest-haste-map": "^29.6.0", + "jest-message-util": "^29.6.0", + "jest-mock": "^29.6.0", "jest-regex-util": "^29.4.3", - "jest-resolve": "^29.5.0", - "jest-snapshot": "^29.5.0", - "jest-util": "^29.5.0", + "jest-resolve": "^29.6.0", + "jest-snapshot": "^29.6.0", + "jest-util": "^29.6.0", "slash": "^3.0.0", "strip-bom": "^4.0.0" }, @@ -7131,34 +7172,32 @@ } }, "node_modules/jest-snapshot": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.5.0.tgz", - "integrity": "sha512-x7Wolra5V0tt3wRs3/ts3S6ciSQVypgGQlJpz2rsdQYoUKxMxPNaoHMGJN6qAuPJqS+2iQ1ZUn5kl7HCyls84g==", + "version": "29.6.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.6.0.tgz", + "integrity": "sha512-H3kUE9NwWDEDoutcOSS921IqdlkdjgnMdj1oMyxAHNflscdLc9dB8OudZHV6kj4OHJxbMxL8CdI5DlwYrs4wQg==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", "@babel/generator": "^7.7.2", "@babel/plugin-syntax-jsx": "^7.7.2", "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/traverse": "^7.7.2", "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.5.0", - "@jest/transform": "^29.5.0", - "@jest/types": "^29.5.0", - "@types/babel__traverse": "^7.0.6", + "@jest/expect-utils": "^29.6.0", + "@jest/transform": "^29.6.0", + "@jest/types": "^29.6.0", "@types/prettier": "^2.1.5", "babel-preset-current-node-syntax": "^1.0.0", "chalk": "^4.0.0", - "expect": "^29.5.0", + "expect": "^29.6.0", "graceful-fs": "^4.2.9", - "jest-diff": "^29.5.0", + "jest-diff": "^29.6.0", "jest-get-type": "^29.4.3", - "jest-matcher-utils": "^29.5.0", - "jest-message-util": "^29.5.0", - "jest-util": "^29.5.0", + "jest-matcher-utils": "^29.6.0", + "jest-message-util": "^29.6.0", + "jest-util": "^29.6.0", "natural-compare": "^1.4.0", - "pretty-format": "^29.5.0", - "semver": "^7.3.5" + "pretty-format": "^29.6.0", + "semver": "^7.5.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -7181,12 +7220,12 @@ } }, "node_modules/jest-snapshot/node_modules/pretty-format": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", - "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", + "version": "29.6.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.0.tgz", + "integrity": "sha512-XH+D4n7Ey0iSR6PdAnBs99cWMZdGsdKrR33iUHQNr79w1szKTCIZDVdXuccAsHVwDBp0XeWPfNEoaxP9EZgRmQ==", "dev": true, "dependencies": { - "@jest/schemas": "^29.4.3", + "@jest/schemas": "^29.6.0", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, @@ -7213,12 +7252,12 @@ "dev": true }, "node_modules/jest-util": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.5.0.tgz", - "integrity": "sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ==", + "version": "29.6.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.6.0.tgz", + "integrity": "sha512-S0USx9YwcvEm4pQ5suisVm/RVxBmi0GFR7ocJhIeaCuW5AXnAnffXbaVKvIFodyZNOc9ygzVtTxmBf40HsHXaA==", "dev": true, "dependencies": { - "@jest/types": "^29.5.0", + "@jest/types": "^29.6.0", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", @@ -7246,17 +7285,17 @@ } }, "node_modules/jest-validate": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.5.0.tgz", - "integrity": "sha512-pC26etNIi+y3HV8A+tUGr/lph9B18GnzSRAkPaaZJIE1eFdiYm6/CewuiJQ8/RlfHd1u/8Ioi8/sJ+CmbA+zAQ==", + "version": "29.6.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.6.0.tgz", + "integrity": "sha512-MLTrAJsb1+W7svbeZ+A7pAnyXMaQrjvPDKCy7OlfsfB6TMVc69v7WjUWfiR6r3snULFWZASiKgvNVDuATta1dg==", "dev": true, "dependencies": { - "@jest/types": "^29.5.0", + "@jest/types": "^29.6.0", "camelcase": "^6.2.0", "chalk": "^4.0.0", "jest-get-type": "^29.4.3", "leven": "^3.1.0", - "pretty-format": "^29.5.0" + "pretty-format": "^29.6.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -7291,12 +7330,12 @@ } }, "node_modules/jest-validate/node_modules/pretty-format": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", - "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", + "version": "29.6.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.0.tgz", + "integrity": "sha512-XH+D4n7Ey0iSR6PdAnBs99cWMZdGsdKrR33iUHQNr79w1szKTCIZDVdXuccAsHVwDBp0XeWPfNEoaxP9EZgRmQ==", "dev": true, "dependencies": { - "@jest/schemas": "^29.4.3", + "@jest/schemas": "^29.6.0", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, @@ -7323,18 +7362,18 @@ "dev": true }, "node_modules/jest-watcher": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.5.0.tgz", - "integrity": "sha512-KmTojKcapuqYrKDpRwfqcQ3zjMlwu27SYext9pt4GlF5FUgB+7XE1mcCnSm6a4uUpFyQIkb6ZhzZvHl+jiBCiA==", + "version": "29.6.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.6.0.tgz", + "integrity": "sha512-LdsQqFNX60mRdRRe+zsELnYRH1yX6KL+ukbh+u6WSQeTheZZe1TlLJNKRQiZ7e0VbvMkywmMWL/KV35noOJCcw==", "dev": true, "dependencies": { - "@jest/test-result": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/test-result": "^29.6.0", + "@jest/types": "^29.6.0", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "emittery": "^0.13.1", - "jest-util": "^29.5.0", + "jest-util": "^29.6.0", "string-length": "^4.0.1" }, "engines": { @@ -7358,13 +7397,13 @@ } }, "node_modules/jest-worker": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.5.0.tgz", - "integrity": "sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA==", + "version": "29.6.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.6.0.tgz", + "integrity": "sha512-oiQHH1SnKmZIwwPnpOrXTq4kHBk3lKGY/07DpnH0sAu+x7J8rXlbLDROZsU6vy9GwB0hPiZeZpu6YlJ48QoKcA==", "dev": true, "dependencies": { "@types/node": "*", - "jest-util": "^29.5.0", + "jest-util": "^29.6.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, @@ -7629,9 +7668,9 @@ } }, "node_modules/lucide-react": { - "version": "0.257.0", - "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.257.0.tgz", - "integrity": "sha512-iP/RIvOhB8hI+AeocKXBleP9NopM1MgQbwB8hCfNdxYqJrQreJCsEvBtmXb3SS92kxwEGWp6ikJ0XQ6hqaYsdA==", + "version": "0.258.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.258.0.tgz", + "integrity": "sha512-3evnpKadBrjLr2HHJ66eDZ1y0vPS6pm8NiNDaLqhddUUyJGnA+lfDPZfbVkuAFq7Xaa1TEy7Sg17sM7mHpMKrA==", "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0" } @@ -7839,11 +7878,11 @@ "dev": true }, "node_modules/next": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/next/-/next-13.4.7.tgz", - "integrity": "sha512-M8z3k9VmG51SRT6v5uDKdJXcAqLzP3C+vaKfLIAM0Mhx1um1G7MDnO63+m52qPdZfrTFzMZNzfsgvm3ghuVHIQ==", + "version": "13.4.8", + "resolved": "https://registry.npmjs.org/next/-/next-13.4.8.tgz", + "integrity": "sha512-lxUjndYKjZHGK3CWeN2RI+/6ni6EUvjiqGWXAYPxUfGIdFGQ5XoisrqAJ/dF74aP27buAfs8MKIbIMMdxjqSBg==", "dependencies": { - "@next/env": "13.4.7", + "@next/env": "13.4.8", "@swc/helpers": "0.5.1", "busboy": "1.6.0", "caniuse-lite": "^1.0.30001406", @@ -7859,15 +7898,15 @@ "node": ">=16.8.0" }, "optionalDependencies": { - "@next/swc-darwin-arm64": "13.4.7", - "@next/swc-darwin-x64": "13.4.7", - "@next/swc-linux-arm64-gnu": "13.4.7", - "@next/swc-linux-arm64-musl": "13.4.7", - "@next/swc-linux-x64-gnu": "13.4.7", - "@next/swc-linux-x64-musl": "13.4.7", - "@next/swc-win32-arm64-msvc": "13.4.7", - "@next/swc-win32-ia32-msvc": "13.4.7", - "@next/swc-win32-x64-msvc": "13.4.7" + "@next/swc-darwin-arm64": "13.4.8", + "@next/swc-darwin-x64": "13.4.8", + "@next/swc-linux-arm64-gnu": "13.4.8", + "@next/swc-linux-arm64-musl": "13.4.8", + "@next/swc-linux-x64-gnu": "13.4.8", + "@next/swc-linux-x64-musl": "13.4.8", + "@next/swc-win32-arm64-msvc": "13.4.8", + "@next/swc-win32-ia32-msvc": "13.4.8", + "@next/swc-win32-x64-msvc": "13.4.8" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", diff --git a/package.json b/package.json index a31794d8ae6d8d9e4f8c555fba4141985ab3114e..446bedae67af6c569c577e18ec5b20a8bb805b20 100644 --- a/package.json +++ b/package.json @@ -28,6 +28,7 @@ "@radix-ui/react-select": "^1.2.2", "@radix-ui/react-separator": "^1.0.3", "@radix-ui/react-slot": "^1.0.2", + "@radix-ui/react-tabs": "^1.0.4", "@radix-ui/react-toast": "^1.1.4", "@t3-oss/env-nextjs": "^0.6.0", "@tanstack/react-query": "^4.29.19", @@ -35,9 +36,9 @@ "bcrypt": "^5.1.0", "class-variance-authority": "^0.6.1", "clsx": "^1.2.1", - "dayjs": "^1.11.8", - "lucide-react": "^0.257.0", - "next": "^13.4.7", + "dayjs": "^1.11.9", + "lucide-react": "^0.258.0", + "next": "^13.4.8", "next-auth": "^4.22.1", "next-themes": "^0.2.1", "normalize-diacritics": "^4.0.0", @@ -63,9 +64,9 @@ "@types/react-dom": "^18.2.6", "autoprefixer": "10.4.14", "eslint": "^8.44.0", - "eslint-config-next": "^13.4.7", - "jest": "^29.5.0", - "jest-environment-jsdom": "^29.5.0", + "eslint-config-next": "^13.4.8", + "jest": "^29.6.0", + "jest-environment-jsdom": "^29.6.0", "postcss": "8.4.24", "prisma": "^4.16.2", "tailwindcss": "3.3.2", @@ -75,4 +76,4 @@ "semver": "^7.5.3", "optionator": "^0.9.3" } -} \ No newline at end of file +} diff --git a/prisma/schema.prisma b/prisma/schema.prisma index aa9abd8775d257c5569035756c7a059e57ea4e6b..9deaae8759c1e6d52d9ef69b7caa4e9be0174f0d 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -1,175 +1,176 @@ generator client { - provider = "prisma-client-js" - binaryTargets = ["native", "debian-openssl-3.0.x", "linux-arm64-openssl-1.1.x", "rhel-openssl-1.0.x"] + provider = "prisma-client-js" + binaryTargets = ["native", "debian-openssl-3.0.x", "linux-arm64-openssl-1.1.x", "rhel-openssl-1.0.x"] } datasource db { - provider = "postgresql" - url = env("DATABASE_URL") + provider = "postgresql" + url = env("DATABASE_URL") } model Account { - id String @id @default(cuid()) - userId String @unique - type String - provider String - providerAccountId String - refresh_token String? @db.Text - access_token String? @db.Text - expires_at Int? - token_type String? - scope String? - id_token String? @db.Text - session_state String? - - user User @relation(fields: [userId], references: [id], onDelete: Cascade) - - @@unique([provider, providerAccountId]) - @@map("accounts") + id String @id @default(cuid()) + userId String @unique + type String + provider String + providerAccountId String + refresh_token String? @db.Text + access_token String? @db.Text + expires_at Int? + token_type String? + scope String? + id_token String? @db.Text + session_state String? + + user User @relation(fields: [userId], references: [id], onDelete: Cascade) + + @@unique([provider, providerAccountId]) + @@map("accounts") } model Session { - id String @id @default(cuid()) - sessionToken String @unique - userId String @unique - expires DateTime + id String @id @default(cuid()) + sessionToken String @unique + userId String @unique + expires DateTime - user User @relation(fields: [userId], references: [id], onDelete: Cascade) + user User @relation(fields: [userId], references: [id], onDelete: Cascade) - @@map("sessions") + @@map("sessions") } model VerificationToken { - identifier String - token String @unique - expires DateTime + identifier String + token String @unique + expires DateTime - @@unique([identifier, token]) - @@map("verification_tokens") + @@unique([identifier, token]) + @@map("verification_tokens") } enum UserRole { - ADMIN - USER + ADMIN + USER } model User { - id String @id @default(cuid()) - name String - username String? @unique - email String? @unique - emailVerified DateTime? @map("email_verified") - password String? - image String? - banner String? - bio String? - website String? - location String? - private Boolean @default(false) - role UserRole @default(USER) - createdAt DateTime @default(now()) @map("created_at") - updatedAt DateTime @default(now()) @map("updated_at") - - favGameList Int[] - planningGameList Int[] - playingGameList Int[] - finishedGameList Int[] - - accounts Account[] - sessions Session[] - gweets Gweet[] - regweets Regweet[] - likes Like[] - - following Follows[] @relation("following") - followers Follows[] @relation("follower") - - @@map("users") + id String @id @default(cuid()) + name String + username String? @unique + email String? @unique + emailVerified DateTime? @map("email_verified") + password String? + image String? + banner String? + bio String? + website String? + location String? + private Boolean @default(false) + role UserRole @default(USER) + createdAt DateTime @default(now()) @map("created_at") + updatedAt DateTime @default(now()) @map("updated_at") + + favGameList Int[] + planningGameList Int[] + playingGameList Int[] + finishedGameList Int[] + + accounts Account[] + sessions Session[] + gweets Gweet[] + regweets Regweet[] + likes Like[] + + following Follows[] @relation("following") + followers Follows[] @relation("follower") + + @@map("users") } model Follows { - followerId String - followingId String - createdAt DateTime @default(now()) @map("created_at") + followerId String + followingId String + createdAt DateTime @default(now()) @map("created_at") - follower User @relation("following", fields: [followerId], references: [id]) - following User @relation("follower", fields: [followingId], references: [id]) + follower User @relation("following", fields: [followerId], references: [id]) + following User @relation("follower", fields: [followingId], references: [id]) - @@id([followerId, followingId]) - @@map("follows") + @@id([followerId, followingId]) + @@map("follows") } model Gweet { - id String @id @default(cuid()) - authorId String @map("user_id") - content String - createdAt DateTime @default(now()) @map("created_at") - updatedAt DateTime @default(now()) @map("updated_at") - - replyToGweetId String? @map("reply_to_gweet_id") - quoteGweetId String? @map("quote_gweet_id") - - regweets Regweet[] - media Media[] - likes Like[] - - author User @relation(fields: [authorId], references: [id], onDelete: Cascade) - comment Gweet? @relation("gweet_comment", fields: [replyToGweetId], references: [id]) - allComments Gweet[] @relation("gweet_comment") - quote Gweet? @relation("gweet_quote", fields: [quoteGweetId], references: [id]) - allQuotes Gweet[] @relation("gweet_quote") - - @@map("gweets") + id String @id @default(cuid()) + authorId String @map("user_id") + content String + createdAt DateTime @default(now()) @map("created_at") + updatedAt DateTime @default(now()) @map("updated_at") + + replyToGweetId String? @map("reply_to_gweet_id") + quoteGweetId String? @map("quote_gweet_id") + // conversationId String? @map("conversation_id") // for recreating the whole thread + + regweets Regweet[] + media Media[] + likes Like[] + + author User @relation(fields: [authorId], references: [id], onDelete: Cascade) + comment Gweet? @relation("gweet_comment", fields: [replyToGweetId], references: [id]) + allComments Gweet[] @relation("gweet_comment") + quote Gweet? @relation("gweet_quote", fields: [quoteGweetId], references: [id]) + allQuotes Gweet[] @relation("gweet_quote") + + @@map("gweets") } enum MediaTypes { - IMAGE - VIDEO - GIF + IMAGE + VIDEO + GIF } model Media { - id String @id @default(cuid()) - url String - key String @unique - type MediaTypes @default(IMAGE) - gweetId String @map("gweet_id") + id String @id @default(cuid()) + url String + key String @unique + type MediaTypes @default(IMAGE) + gweetId String @map("gweet_id") - gweet Gweet? @relation(fields: [gweetId], references: [id], onDelete: Cascade) + gweet Gweet? @relation(fields: [gweetId], references: [id], onDelete: Cascade) - @@map("media") + @@map("media") } model Like { - id String @id @default(cuid()) - gweetId String @map("gweet_id") - userId String @map("user_id") - createdAt DateTime @default(now()) @map("created_at") + id String @id @default(cuid()) + gweetId String @map("gweet_id") + userId String @map("user_id") + createdAt DateTime @default(now()) @map("created_at") - user User @relation(fields: [userId], references: [id], onDelete: Cascade) - gweet Gweet @relation(fields: [gweetId], references: [id], onDelete: Cascade) + user User @relation(fields: [userId], references: [id], onDelete: Cascade) + gweet Gweet @relation(fields: [gweetId], references: [id], onDelete: Cascade) - @@map("likes") + @@map("likes") } model Regweet { - id String @id @default(cuid()) - gweetId String @map("gweet_id") - userId String @map("user_id") - createdAt DateTime @default(now()) @map("created_at") + id String @id @default(cuid()) + gweetId String @map("gweet_id") + userId String @map("user_id") + createdAt DateTime @default(now()) @map("created_at") - user User @relation(fields: [userId], references: [id]) - gweet Gweet @relation(fields: [gweetId], references: [id], onDelete: Cascade) + user User @relation(fields: [userId], references: [id]) + gweet Gweet @relation(fields: [gweetId], references: [id], onDelete: Cascade) - @@map("regweets") + @@map("regweets") } model Hashtag { - id String @id @default(cuid()) - text String - hashtag String @unique - score Int @default(1) - createdAt DateTime @default(now()) @map("created_at") + id String @id @default(cuid()) + text String + hashtag String @unique + score Int @default(1) + createdAt DateTime @default(now()) @map("created_at") - @@map("hashtags") + @@map("hashtags") }