cleanup and add a raw page
All checks were successful
Deploy App / docker (ubuntu-latest) (push) Successful in 1m4s
All checks were successful
Deploy App / docker (ubuntu-latest) (push) Successful in 1m4s
This commit is contained in:
parent
a733af62db
commit
f185270a5b
@ -1,76 +1,27 @@
|
|||||||
import React, { cache, ReactElement } from "react";
|
import React, { ReactElement } from "react";
|
||||||
import { ActionMenu } from "@/app/components/action-menu";
|
import { ActionMenu } from "@/app/components/action-menu";
|
||||||
import { Metadata } from "next";
|
import { Metadata } from "next";
|
||||||
import moment from "moment";
|
import moment from "moment";
|
||||||
import { notFound } from "next/navigation";
|
import { notFound } from "next/navigation";
|
||||||
import { CodeBlock } from "@/app/components/code-block";
|
import { CodeBlock } from "@/app/components/code-block";
|
||||||
import { detectLanguage } from "@/app/common/lang-detection/detection";
|
|
||||||
import { Button } from "@/app/components/ui/button";
|
import { Button } from "@/app/components/ui/button";
|
||||||
import Link from "next/link";
|
import Link from "next/link";
|
||||||
|
import {
|
||||||
type PasteProps = {
|
generatePasteMetadata,
|
||||||
params: {
|
getPaste,
|
||||||
id: string;
|
type Paste,
|
||||||
};
|
} from "@/app/common/pastes";
|
||||||
};
|
import { PastePageProps } from "@/app/types/paste-page";
|
||||||
|
|
||||||
type Paste = {
|
|
||||||
/**
|
|
||||||
* The paste content.
|
|
||||||
*/
|
|
||||||
content: string;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The date the paste was created.
|
|
||||||
*/
|
|
||||||
created: string;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The detected language of the paste.
|
|
||||||
*/
|
|
||||||
language: string;
|
|
||||||
};
|
|
||||||
|
|
||||||
const getPaste = cache(async (id: string) => {
|
|
||||||
const response: Response = await fetch(
|
|
||||||
`${process.env.NEXT_PUBLIC_API_ENDPOINT}/${id}`,
|
|
||||||
{
|
|
||||||
next: {
|
|
||||||
revalidate: 300, // Keep this response cached for 5 minutes
|
|
||||||
},
|
|
||||||
},
|
|
||||||
);
|
|
||||||
const json = await response.json();
|
|
||||||
|
|
||||||
if (json.code && json.message) {
|
|
||||||
return undefined;
|
|
||||||
}
|
|
||||||
return {
|
|
||||||
content: json.content,
|
|
||||||
created: json.created,
|
|
||||||
language: await detectLanguage(json.content),
|
|
||||||
};
|
|
||||||
}) as (id: string) => Promise<Paste | undefined>;
|
|
||||||
|
|
||||||
export async function generateMetadata({
|
export async function generateMetadata({
|
||||||
params: { id },
|
params: { id },
|
||||||
}: PasteProps): Promise<Metadata> {
|
}: PastePageProps): Promise<Metadata> {
|
||||||
const data: Paste | undefined = await getPaste(id);
|
return generatePasteMetadata(id);
|
||||||
if (data == undefined) {
|
|
||||||
return {
|
|
||||||
description: "Not found",
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
|
||||||
title: `Paste - ${id}.${data.language}`,
|
|
||||||
description: `Click to view the paste.`,
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export default async function Paste({
|
export default async function Paste({
|
||||||
params: { id },
|
params: { id },
|
||||||
}: PasteProps): Promise<ReactElement> {
|
}: PastePageProps): Promise<ReactElement> {
|
||||||
const data: Paste | undefined = await getPaste(id);
|
const data: Paste | undefined = await getPaste(id);
|
||||||
|
|
||||||
if (data == undefined) {
|
if (data == undefined) {
|
||||||
@ -87,6 +38,9 @@ export default async function Paste({
|
|||||||
<Link href={"/"}>
|
<Link href={"/"}>
|
||||||
<Button>New</Button>
|
<Button>New</Button>
|
||||||
</Link>
|
</Link>
|
||||||
|
<Link href={`/raw/${id}`}>
|
||||||
|
<Button>Raw</Button>
|
||||||
|
</Link>
|
||||||
</ActionMenu>
|
</ActionMenu>
|
||||||
|
|
||||||
<div className="absolute right-0 bottom-0 text-right p-1.5">
|
<div className="absolute right-0 bottom-0 text-right p-1.5">
|
||||||
|
@ -17,6 +17,10 @@ export default function Home(): ReactElement {
|
|||||||
async function createPaste() {
|
async function createPaste() {
|
||||||
// Ignore empty pastes, we don't want to save them
|
// Ignore empty pastes, we don't want to save them
|
||||||
if (!value || value.length == 0) {
|
if (!value || value.length == 0) {
|
||||||
|
toast({
|
||||||
|
title: "Paste",
|
||||||
|
description: "Paste is empty",
|
||||||
|
});
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
45
src/app/(pages)/raw/[id]/page.tsx
Normal file
45
src/app/(pages)/raw/[id]/page.tsx
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
import React, { ReactElement } from "react";
|
||||||
|
import { ActionMenu } from "@/app/components/action-menu";
|
||||||
|
import { Metadata } from "next";
|
||||||
|
import { notFound } from "next/navigation";
|
||||||
|
import { Button } from "@/app/components/ui/button";
|
||||||
|
import Link from "next/link";
|
||||||
|
import {
|
||||||
|
generatePasteMetadata,
|
||||||
|
getPaste,
|
||||||
|
type Paste,
|
||||||
|
} from "@/app/common/pastes";
|
||||||
|
import { PastePageProps } from "@/app/types/paste-page";
|
||||||
|
|
||||||
|
export async function generateMetadata({
|
||||||
|
params: { id },
|
||||||
|
}: PastePageProps): Promise<Metadata> {
|
||||||
|
return generatePasteMetadata(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default async function Paste({
|
||||||
|
params: { id },
|
||||||
|
}: PastePageProps): Promise<ReactElement> {
|
||||||
|
const data: Paste | undefined = await getPaste(id);
|
||||||
|
|
||||||
|
if (data == undefined) {
|
||||||
|
return notFound();
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className="relative h-full">
|
||||||
|
<ActionMenu>
|
||||||
|
<Link href={"/"}>
|
||||||
|
<Button>New</Button>
|
||||||
|
</Link>
|
||||||
|
<Link href={`/${id}`}>
|
||||||
|
<Button>Formated</Button>
|
||||||
|
</Link>
|
||||||
|
</ActionMenu>
|
||||||
|
|
||||||
|
<div className="p-1 hljs !bg-transparent text-sm">
|
||||||
|
<code>{data.content}</code>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
63
src/app/common/pastes.ts
Normal file
63
src/app/common/pastes.ts
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
import { cache } from "react";
|
||||||
|
import { detectLanguage } from "@/app/common/lang-detection/detection";
|
||||||
|
import { Metadata } from "next";
|
||||||
|
|
||||||
|
export type Paste = {
|
||||||
|
/**
|
||||||
|
* The paste content.
|
||||||
|
*/
|
||||||
|
content: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The date the paste was created.
|
||||||
|
*/
|
||||||
|
created: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The detected language of the paste.
|
||||||
|
*/
|
||||||
|
language: string;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fetches a paste from the API.
|
||||||
|
*/
|
||||||
|
export const getPaste = cache(async (id: string) => {
|
||||||
|
const response: Response = await fetch(
|
||||||
|
`${process.env.NEXT_PUBLIC_API_ENDPOINT}/${id}`,
|
||||||
|
{
|
||||||
|
next: {
|
||||||
|
revalidate: 300, // Keep this response cached for 5 minutes
|
||||||
|
},
|
||||||
|
},
|
||||||
|
);
|
||||||
|
const json = await response.json();
|
||||||
|
|
||||||
|
if (json.code && json.message) {
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
content: json.content,
|
||||||
|
created: json.created,
|
||||||
|
language: await detectLanguage(json.content),
|
||||||
|
};
|
||||||
|
}) as (id: string) => Promise<Paste | undefined>;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generates metadata for a paste.
|
||||||
|
*
|
||||||
|
* @param id The ID of the paste.
|
||||||
|
*/
|
||||||
|
export async function generatePasteMetadata(id: string): Promise<Metadata> {
|
||||||
|
const data: Paste | undefined = await getPaste(id);
|
||||||
|
if (data == undefined) {
|
||||||
|
return {
|
||||||
|
description: "Not found",
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
title: `Paste - ${id}.${data.language}`,
|
||||||
|
description: `Click to view the paste.`,
|
||||||
|
};
|
||||||
|
}
|
5
src/app/types/paste-page.ts
Normal file
5
src/app/types/paste-page.ts
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
export type PastePageProps = {
|
||||||
|
params: {
|
||||||
|
id: string;
|
||||||
|
};
|
||||||
|
};
|
Reference in New Issue
Block a user