Skip to content

Commit

Permalink
put knowledge in context
Browse files Browse the repository at this point in the history
  • Loading branch information
shawnmclean committed Jan 6, 2025
1 parent ba9ce0b commit b28fe13
Show file tree
Hide file tree
Showing 4 changed files with 50 additions and 37 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
"use client";

import type { SelectKnowledgeSchema } from "@sovoli/db/schema";
import { createContext, useContext } from "react";

export const KnowledgeContext = createContext<SelectKnowledgeSchema | null>(
null,
);

export const useKnowledge = () => {
const context = useContext(KnowledgeContext);
if (!context) {
throw new Error("useKnowledge must be used within a KnowledgeProvider");
}
return context;
};

export const KnowledgeProvider = ({
children,
knowledge,
}: {
children: React.ReactNode;
knowledge: SelectKnowledgeSchema;
}) => {
return <KnowledgeContext value={knowledge}>{children}</KnowledgeContext>;
};
23 changes: 16 additions & 7 deletions apps/sovoli.com/src/app/[username]/[slug]/layout.tsx
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
import { permanentRedirect } from "next/navigation";
import { notFound, permanentRedirect } from "next/navigation";

import { Navbar } from "~/components/navbar/Navbar";
import { KnowledgeNavbarAppLinks } from "./components/KnowledgeNavbarAppLinks";
import { KnowledgeSubmenu } from "./components/KnowledgeSubmenu";
import { KnowledgeProvider } from "./context/KnowledgeContext";
import { preload, retreiveKnowledgeBySlug } from "./lib/getKnowledge";

interface Props {
Expand All @@ -22,26 +23,34 @@ export default async function Layout({ params, children }: Props) {
searchParams: { page: 1, pageSize: 30 },
});

const { knowledge } = await retreiveKnowledgeBySlug({
const response = await retreiveKnowledgeBySlug({
params: { slug, username },
searchParams: { page: 1, pageSize: 30 },
});

if (!response) return notFound();

if (response.knowledge.id === slug && response.knowledge.slug) {
return permanentRedirect(`/${username}/${response.knowledge.slug}`);
}

return (
<div>
<Navbar AppLinks={<KnowledgeNavbarAppLinks knowledge={knowledge} />} />
<KnowledgeProvider knowledge={response.knowledge}>
<Navbar
AppLinks={<KnowledgeNavbarAppLinks knowledge={response.knowledge} />}
/>

<main>
<div className="mb-4 flex w-full flex-col">
<KnowledgeSubmenu
username={knowledge.User?.username ?? ""}
slug={knowledge.slug ?? ""}
username={response.knowledge.User?.username ?? ""}
slug={response.knowledge.slug ?? ""}
/>
</div>
<div className="mx-auto flex max-w-7xl flex-col justify-between gap-4 p-4 md:flex-row">
<div className="w-full">{children}</div>
</div>
</main>
</div>
</KnowledgeProvider>
);
}
36 changes: 7 additions & 29 deletions apps/sovoli.com/src/app/[username]/[slug]/lib/getKnowledge.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,6 @@ import { cache } from "react";

import "server-only";

import { notFound, permanentRedirect } from "next/navigation";

import { auth } from "~/core/auth";
import { getKnowledgeBySlug } from "./getKnowledgeService";

Expand All @@ -23,32 +21,12 @@ export const retreiveKnowledgeBySlug = cache(
}: GetnowledgeOptions) => {
const session = await auth();

// see: https://stackoverflow.com/questions/76191324/next-13-4-error-next-redirect-in-api-routes
let redirectPath: string | null = null;
try {
const knowledgeResponse = await getKnowledgeBySlug({
username: username,
authUserId: session?.user?.id,
slugOrId: slug,
page,
pageSize,
});

if (
knowledgeResponse.knowledge.id === slug &&
knowledgeResponse.knowledge.slug
) {
redirectPath = `/${username}/${knowledgeResponse.knowledge.slug}`;
}

return knowledgeResponse;
} catch (e) {
console.log(JSON.stringify(e, null, 2));
return notFound();
} finally {
if (redirectPath) {
permanentRedirect(redirectPath);
}
}
return await getKnowledgeBySlug({
username: username,
authUserId: session?.user?.id,
slugOrId: slug,
page,
pageSize,
});
},
);
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ export async function getKnowledgeBySlug({
where: and(usernameFilter, privacyFilter, slugFilter),
})) as SelectKnowledgeSchema | undefined;

if (!knowledgeResult) throw Error("Knowledge not found");
if (!knowledgeResult) return null;

const mediaAssetsSubquery = db.$with("media_assets_subquery").as(
db
Expand Down

0 comments on commit b28fe13

Please sign in to comment.