created server side code for landing page
continuous-integration/drone/push Build is failing
Details
continuous-integration/drone/push Build is failing
Details
parent
d7553617b8
commit
7c458c179f
@ -0,0 +1,15 @@
|
|||||||
|
import Landing from "@models/landing";
|
||||||
|
|
||||||
|
import { readLandingJson } from "@utils/landing";
|
||||||
|
|
||||||
|
const getLanding = async (): Promise<Landing> => {
|
||||||
|
return await readLandingJson();
|
||||||
|
};
|
||||||
|
|
||||||
|
export default async function Page() {
|
||||||
|
const landing = await getLanding();
|
||||||
|
|
||||||
|
return <div>{/* <Button color="primary">Click me</Button> */}</div>;
|
||||||
|
}
|
||||||
|
|
||||||
|
export const revalidate = 3600;
|
@ -0,0 +1,30 @@
|
|||||||
|
"use client";
|
||||||
|
|
||||||
|
import { Link, Spacer } from "@nextui-org/react";
|
||||||
|
|
||||||
|
// Error components must be Client Components
|
||||||
|
import { useEffect } from "react";
|
||||||
|
|
||||||
|
export default function Error({
|
||||||
|
error,
|
||||||
|
reset
|
||||||
|
}: {
|
||||||
|
error: Error & { digest?: string };
|
||||||
|
reset: () => void;
|
||||||
|
}) {
|
||||||
|
useEffect(() => {
|
||||||
|
console.error(error);
|
||||||
|
}, [error]);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className="container min-h-screen text-center">
|
||||||
|
<p className="text-3xl">Something went loading the page!</p>
|
||||||
|
<p className="text-xl">{error.toString()}</p>
|
||||||
|
<div>
|
||||||
|
<Link href="#" onClick={() => reset()}>
|
||||||
|
Try again
|
||||||
|
</Link>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
@ -1,11 +0,0 @@
|
|||||||
"use client";
|
|
||||||
|
|
||||||
import { Button } from "@nextui-org/react";
|
|
||||||
|
|
||||||
export default function Page() {
|
|
||||||
return (
|
|
||||||
<div>
|
|
||||||
<Button color="primary">Click me</Button>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
|
@ -0,0 +1,11 @@
|
|||||||
|
import z from "zod";
|
||||||
|
|
||||||
|
import { OwnerModel } from "./owner";
|
||||||
|
|
||||||
|
export const LandingModel = z.object({
|
||||||
|
owner: OwnerModel
|
||||||
|
});
|
||||||
|
|
||||||
|
export type Landing = z.infer<typeof LandingModel>;
|
||||||
|
|
||||||
|
export default Landing;
|
@ -0,0 +1,17 @@
|
|||||||
|
import z from "zod";
|
||||||
|
|
||||||
|
export const OwnerModel = z.object({
|
||||||
|
fullName: z.string(),
|
||||||
|
name: z.string(),
|
||||||
|
description: z.string(),
|
||||||
|
avatar: z.string().optional(),
|
||||||
|
contact: z.object({
|
||||||
|
email: z.string().email(),
|
||||||
|
linkedin: z.string().url(),
|
||||||
|
git: z.string().url()
|
||||||
|
})
|
||||||
|
});
|
||||||
|
|
||||||
|
export type Owner = z.infer<typeof OwnerModel>;
|
||||||
|
|
||||||
|
export default Owner;
|
@ -1,3 +1,25 @@
|
|||||||
@tailwind base;
|
@tailwind base;
|
||||||
@tailwind components;
|
@tailwind components;
|
||||||
@tailwind utilities;
|
@tailwind utilities;
|
||||||
|
|
||||||
|
.container {
|
||||||
|
display: flex;
|
||||||
|
min-width: 100%;
|
||||||
|
flex-direction: column;
|
||||||
|
justify-content: center;
|
||||||
|
|
||||||
|
@media screen and (width >=600px) {
|
||||||
|
padding-right: 1rem;
|
||||||
|
padding-left: 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media screen and (width >=800px) {
|
||||||
|
padding-right: 4rem;
|
||||||
|
padding-left: 4rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media screen and (width >=1200px) {
|
||||||
|
padding-right: 16rem;
|
||||||
|
padding-left: 16rem;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,2 @@
|
|||||||
|
export const landingJsonLocation =
|
||||||
|
process.env.LANDING_JSON_LOCATION ?? "/app/landing.json";
|
@ -0,0 +1,9 @@
|
|||||||
|
import { stat } from "fs-extra";
|
||||||
|
|
||||||
|
const fileExists = async (fileName: string): Promise<boolean> => {
|
||||||
|
return await stat(fileName)
|
||||||
|
.then(() => true)
|
||||||
|
.catch(() => false);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default fileExists;
|
@ -0,0 +1,25 @@
|
|||||||
|
import { readJson } from "fs-extra";
|
||||||
|
|
||||||
|
import Landing, { LandingModel } from "@models/landing";
|
||||||
|
|
||||||
|
import { landingJsonLocation } from "@utils/constants";
|
||||||
|
import exists from "@utils/fileExists";
|
||||||
|
|
||||||
|
export const readLandingJson = async (): Promise<Landing> => {
|
||||||
|
const location = landingJsonLocation;
|
||||||
|
|
||||||
|
const fileExists = await exists(location);
|
||||||
|
|
||||||
|
if (!fileExists) {
|
||||||
|
throw new Error(`Could not find landing json file at: ${location}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
const rawJson: unknown = await readJson(location);
|
||||||
|
|
||||||
|
const landingResult = LandingModel.safeParse(rawJson);
|
||||||
|
|
||||||
|
if (!landingResult.success)
|
||||||
|
throw new Error(`Failed to parse landing json: ${landingResult.error}`);
|
||||||
|
|
||||||
|
return landingResult.data;
|
||||||
|
};
|
Loading…
Reference in new issue