diff --git a/astro/src/components/blogs/BlogIndex.astro b/astro/src/components/blogs/BlogIndex.astro new file mode 100644 index 0000000..4c4ad3f --- /dev/null +++ b/astro/src/components/blogs/BlogIndex.astro @@ -0,0 +1,9 @@ +--- +interface Props { + page: BlogIndex; +} + +const { page } = Astro.props; +--- + +
Blog Index
diff --git a/astro/src/components/projects/ProjectIndex.astro b/astro/src/components/projects/ProjectIndex.astro new file mode 100644 index 0000000..34dcd2c --- /dev/null +++ b/astro/src/components/projects/ProjectIndex.astro @@ -0,0 +1,9 @@ +--- +interface Props { + page: ProjectIndex; +} + +const { page } = Astro.props; +--- + +
Project Index
diff --git a/astro/src/content/pages/pages.ts b/astro/src/content/pages/pages.ts index f35ab48..f8d0c05 100644 --- a/astro/src/content/pages/pages.ts +++ b/astro/src/content/pages/pages.ts @@ -287,6 +287,7 @@ export function dataToPage(pageRecord: any): WebPage { let page: WebPage = { type: "Webpage", + exists: true, id: pageRecord["id"], lastModified: lastModified, url: pageRecord["url"], @@ -330,5 +331,25 @@ export async function getWebpage(route: string): Promise { route: route }); - return dataToPage(result["Pages"][0]); + if (result["Pages"].length === 0) { + return { + type: "Webpage", + exists: false + }; + } + + const page = dataToPage(result["Pages"][0]); + + if (!page.exists) { + return { + type: "Webpage", + exists: false + }; + } + + return { + ...page, + type: "Webpage", + exists: true + } } diff --git a/astro/src/layouts/WebpageLayout.astro b/astro/src/layouts/WebpageLayout.astro index 80a680f..127c269 100644 --- a/astro/src/layouts/WebpageLayout.astro +++ b/astro/src/layouts/WebpageLayout.astro @@ -2,6 +2,11 @@ import '@/styles/global.css'; import { getSettings } from "@/content/settings/settings"; +interface Props { + settings: WebpageLayoutProps; +} + +const pageSettings = Astro.props.settings.searchEngine; const settings = await getSettings(); --- @@ -9,45 +14,43 @@ const settings = await getSettings(); - + - {settings.website.titleTemplate.replaceAll("%T", "")} + {settings.website.titleTemplate.replaceAll("%T", pageSettings.title)} - + - + - - - + + - - - + + - + @@ -59,6 +62,6 @@ const settings = await getSettings(); - + diff --git a/astro/src/lib/pages.ts b/astro/src/lib/pages.ts index 695e962..fb46cf4 100644 --- a/astro/src/lib/pages.ts +++ b/astro/src/lib/pages.ts @@ -61,7 +61,10 @@ export async function getPage(settings: GlobalSettings, route: string): Promise< return { route: route, pageType: "ProjectIndex", - page: null + page: { + type: "ProjectIndex", + pageNumber: params["page"] !== undefined ? Number(params["page"]) : 1 + } }; } // Project Post @@ -163,14 +166,34 @@ export async function getPage(settings: GlobalSettings, route: string): Promise< } }; } + // Regular webpage else if (regexToRoute({ template: "/", allowPagination: false }).regex.test(route) || regexToRoute({ template: "/%R", allowPagination: false }).regex.test(route)) { const webpageContent = await getWebpage(route); + + if (webpageContent === null || !webpageContent.exists) { + return { + route: route, + pageType: "Webpage", + page: { + type: "Webpage", + exists: false + } + } + } return { route: route, pageType: "Webpage", - page: webpageContent + page: { + type: "Webpage", + exists: true, + id: webpageContent.id, + lastModified: webpageContent.lastModified, + url: webpageContent.url, + searchEngine: webpageContent.searchEngine, + components: webpageContent.components + } }; } else { diff --git a/astro/src/pages/[...route].astro b/astro/src/pages/[...route].astro index cbcf8f9..8fad759 100644 --- a/astro/src/pages/[...route].astro +++ b/astro/src/pages/[...route].astro @@ -3,27 +3,169 @@ import { getAllRoutesList } from "@/lib/routing"; import { getPage } from "@/lib/pages"; import { getSettings } from "@/content/settings/settings" import WebpageLayout from "@/layouts/WebpageLayout.astro"; +import BlogIndex from "@/components/blogs/BlogIndex.astro"; +import ProjectIndex from "@/components/projects/ProjectIndex.astro"; export async function getStaticPaths() { const settings = await getSettings(); const pages = await getAllRoutesList(settings); - console.log(pages); - let routes: any[] = []; pages.forEach((page) => { routes.push({ params: { route: page } }); - }) + }); return routes; } const settings = await getSettings(); -const routes = await getAllRoutesList(settings); -const page = await getPage(settings, "/album/2026/mirai-nexus-2026/6c0e4453ab"); +const page = await getPage(settings, Astro.url.pathname); + +if (page === null) { + return new Response("Page not found.", { + status: 404, + statusText: "Not Found" + }); +} --- - -

Test

-
+{ page.pageType === "Webpage" && ( + + +
Webpage
+
+
+) } + +{ page.pageType === "BlogIndex" && ( + + + + + +) } + +{ page?.pageType === "BlogPost" && ( + + + BlogPost + + +) } + +{ page.pageType === "ProjectIndex" && ( + + + + + +) } + +{ page.pageType === "ProjectPost" && ( + + +
ProjectPost
+
+
+) } + +{ page.pageType === "PhotoCategoryIndex" && ( + + +
PhotoCategoryIndex
+
+
+) } + +{ page.pageType === "Photo" && ( + + +
Photo
+
+
+) } diff --git a/astro/src/types/layouts/webpageLayout.d.ts b/astro/src/types/layouts/webpageLayout.d.ts new file mode 100644 index 0000000..1b562c4 --- /dev/null +++ b/astro/src/types/layouts/webpageLayout.d.ts @@ -0,0 +1,3 @@ +type WebpageLayoutProps = { + searchEngine: SearchEngine; +} diff --git a/astro/src/types/pages/page.d.ts b/astro/src/types/pages/page.d.ts index 0b93884..a6b9c55 100644 --- a/astro/src/types/pages/page.d.ts +++ b/astro/src/types/pages/page.d.ts @@ -1,13 +1,18 @@ -type WebPage = { - type: "Webpage"; +type WebPage = + | { + type: "Webpage"; + exists: false; + } + | { + type: "Webpage"; + exists: true; - id: string; - lastModified: Date; - - url: string; - searchEngine: SearchEngine; - components: WebpageComponent[]; -} + id: string; + lastModified: Date; + url: string; + searchEngine: SearchEngine; + components: WebpageComponent[]; + }; type WebpageComponent = ContactComponent | @@ -28,13 +33,14 @@ type PageRegexMatchProps = { allowPagination: boolean; } -type PageType = { - route: string; - pageType: "Webpage" | "BlogIndex" | "BlogPost" | - "ProjectIndex" | "ProjectPost" | "PhotoCategoryIndex" | - "PhotoCategory" | "PhotoAlbum" | "Photo"; - page: WebPage | BlogPost | ProjectPost | BlogIndex | - ProjectIndex | PhotoCategoryIndex | PhotoCategory | - PhotoAlbum | PhotoPage | null; -} - +type PageType = + | { pageType: "Webpage"; page: WebPage; route: string } + | { pageType: "BlogIndex"; page: BlogIndex; route: string } + | { pageType: "BlogPost"; page: BlogPost; route: string } + | { pageType: "ProjectIndex"; page: ProjectIndex; route: string } + | { pageType: "ProjectPost"; page: ProjectPost; route: string } + | { pageType: "PhotoCategoryIndex"; page: PhotoCategoryIndex; route: string } + | { pageType: "PhotoCategory"; page: PhotoCategory; route: string } + | { pageType: "PhotoAlbum"; page: PhotoAlbum; route: string } + | { pageType: "Photo"; page: PhotoPage; route: string } + | { pageType: "Unknown"; page: null; route: string };