From d2ff34d3b6589d2c79778eb809a3b7556bb6d3a7 Mon Sep 17 00:00:00 2001 From: Janis Date: Tue, 7 Feb 2023 13:45:40 +0100 Subject: [PATCH] refactor --- .gitignore | 8 +- .prettierrc | 2 +- README.md | 4 + .../articles/editor/[articleId]/layout.tsx | 3 - app/admin/articles/page.tsx | 13 - .../categories/editor/[categoryId]/layout.tsx | 3 - .../categories/editor/[categoryId]/page.tsx | 179 - app/admin/categories/page.tsx | 11 - app/admin/page.tsx | 10 - .../[categoryName]/[articleName]/head.tsx | 13 - .../[categoryName]/[articleName]/layout.tsx | 3 - .../[categoryName]/[articleName]/page.tsx | 73 - app/head.tsx | 7 - app/layout.tsx | 27 - app/page.tsx | 3 - app/testing/typography/page.tsx | 21 - components/AdminControl.tsx | 97 - components/AdminNav.tsx | 6 +- components/ContentTable.tsx | 47 +- components/Footer.tsx | 2 +- components/Gallery.tsx | 27 - components/ImageUpload.tsx | 32 - components/Markdown.tsx | 16 +- components/Nav.tsx | 242 +- components/Sidebar.tsx | 48 +- lib/prisma.ts | 34 +- manager/fetchManager.ts | 88 - next.config.js | 4 +- package-lock.json | 7837 ++--------------- package.json | 49 +- pages/_app.tsx | 21 + pages/_document.tsx | 14 + .../admin/editor/article/[articleId].tsx | 201 +- pages/admin/editor/category/[categoryId].tsx | 186 + pages/api/articles/[articleId].ts | 59 +- pages/api/articles/index.ts | 94 +- pages/api/articles/name/[articleName].ts | 39 - pages/api/categories/[categoryId].ts | 46 +- pages/api/categories/index.ts | 60 +- pages/api/categories/name/[categoryName].ts | 29 - pages/api/search.ts | 31 - .../[categoryName]/[articleName]/index.tsx | 86 + .../articles/[categoryName]/index.tsx | 45 +- .../page.tsx => pages/articles/index.tsx | 29 +- pages/index.tsx | 18 + .../20230122141410_contentable/migration.sql | 40 - .../20230122141436_contenttable/migration.sql | 2 - .../migration.sql | 65 +- .../20230207114149_no_image/migration.sql | 17 + prisma/schema.prisma | 16 +- storage/backup/serial | 1 - ...1e5d95754125963f16653b5f6650_exiftool.json | 26 - ...5754125963f16653b5f6650_100x100_center.jpg | Bin 3874 -> 0 bytes ...95754125963f16653b5f6650_1280x1024_fit.jpg | Bin 194348 -> 0 bytes ...95754125963f16653b5f6650_1920x1200_fit.jpg | Bin 270421 -> 0 bytes ...5754125963f16653b5f6650_224x224_center.jpg | Bin 14815 -> 0 bytes ...d95754125963f16653b5f6650_224x224_left.jpg | Bin 14474 -> 0 bytes ...95754125963f16653b5f6650_224x224_right.jpg | Bin 15228 -> 0 bytes ...e5d95754125963f16653b5f6650_3x3_resize.png | Bin 102 -> 0 bytes ...5754125963f16653b5f6650_500x500_center.jpg | Bin 61930 -> 0 bytes ...d95754125963f16653b5f6650_50x50_center.jpg | Bin 1717 -> 0 bytes ...5d95754125963f16653b5f6650_720x720_fit.jpg | Bin 72609 -> 0 bytes storage/config/hub.yml | 6 - storage/config/settings.yml | 62 - storage/serial | 1 - .../2023/02/20230205_172502_28541355.yml | 16 - styles/modules/AdminControl.module.scss | 12 - styles/modules/AdminNav.module.scss | 1 + tsconfig.json | 16 +- types/api.ts | 8 +- 70 files changed, 1388 insertions(+), 8768 deletions(-) delete mode 100644 app/admin/articles/editor/[articleId]/layout.tsx delete mode 100644 app/admin/articles/page.tsx delete mode 100644 app/admin/categories/editor/[categoryId]/layout.tsx delete mode 100644 app/admin/categories/editor/[categoryId]/page.tsx delete mode 100644 app/admin/categories/page.tsx delete mode 100644 app/admin/page.tsx delete mode 100644 app/articles/[categoryName]/[articleName]/head.tsx delete mode 100644 app/articles/[categoryName]/[articleName]/layout.tsx delete mode 100644 app/articles/[categoryName]/[articleName]/page.tsx delete mode 100644 app/head.tsx delete mode 100644 app/layout.tsx delete mode 100644 app/page.tsx delete mode 100644 app/testing/typography/page.tsx delete mode 100644 components/AdminControl.tsx delete mode 100644 components/Gallery.tsx delete mode 100644 components/ImageUpload.tsx delete mode 100644 manager/fetchManager.ts create mode 100644 pages/_app.tsx create mode 100644 pages/_document.tsx rename app/admin/articles/editor/[articleId]/page.tsx => pages/admin/editor/article/[articleId].tsx (58%) create mode 100644 pages/admin/editor/category/[categoryId].tsx delete mode 100644 pages/api/articles/name/[articleName].ts delete mode 100644 pages/api/categories/name/[categoryName].ts delete mode 100644 pages/api/search.ts create mode 100644 pages/articles/[categoryName]/[articleName]/index.tsx rename app/articles/[categoryName]/page.tsx => pages/articles/[categoryName]/index.tsx (53%) rename app/articles/page.tsx => pages/articles/index.tsx (52%) create mode 100644 pages/index.tsx delete mode 100644 prisma/migrations/20230122141410_contentable/migration.sql delete mode 100644 prisma/migrations/20230122141436_contenttable/migration.sql rename prisma/migrations/{20230107035654_init => 20230207082211_init}/migration.sql (51%) create mode 100644 prisma/migrations/20230207114149_no_image/migration.sql delete mode 100644 storage/backup/serial delete mode 100644 storage/cache/json/d/0/3/d036a457124b1e5d95754125963f16653b5f6650_exiftool.json delete mode 100644 storage/cache/thumbnails/d/0/3/d036a457124b1e5d95754125963f16653b5f6650_100x100_center.jpg delete mode 100644 storage/cache/thumbnails/d/0/3/d036a457124b1e5d95754125963f16653b5f6650_1280x1024_fit.jpg delete mode 100644 storage/cache/thumbnails/d/0/3/d036a457124b1e5d95754125963f16653b5f6650_1920x1200_fit.jpg delete mode 100644 storage/cache/thumbnails/d/0/3/d036a457124b1e5d95754125963f16653b5f6650_224x224_center.jpg delete mode 100644 storage/cache/thumbnails/d/0/3/d036a457124b1e5d95754125963f16653b5f6650_224x224_left.jpg delete mode 100644 storage/cache/thumbnails/d/0/3/d036a457124b1e5d95754125963f16653b5f6650_224x224_right.jpg delete mode 100644 storage/cache/thumbnails/d/0/3/d036a457124b1e5d95754125963f16653b5f6650_3x3_resize.png delete mode 100644 storage/cache/thumbnails/d/0/3/d036a457124b1e5d95754125963f16653b5f6650_500x500_center.jpg delete mode 100644 storage/cache/thumbnails/d/0/3/d036a457124b1e5d95754125963f16653b5f6650_50x50_center.jpg delete mode 100644 storage/cache/thumbnails/d/0/3/d036a457124b1e5d95754125963f16653b5f6650_720x720_fit.jpg delete mode 100644 storage/config/hub.yml delete mode 100644 storage/config/settings.yml delete mode 100644 storage/serial delete mode 100644 storage/sidecar/2023/02/20230205_172502_28541355.yml delete mode 100644 styles/modules/AdminControl.module.scss diff --git a/.gitignore b/.gitignore index 6ab2567..37165c5 100644 --- a/.gitignore +++ b/.gitignore @@ -4,7 +4,7 @@ /node_modules /.pnp .pnp.js -/copy + # testing /coverage @@ -18,9 +18,7 @@ # misc .DS_Store *.pem - -/docker_data/postgres/ - +#! .env # debug npm-debug.log* yarn-debug.log* @@ -36,5 +34,3 @@ yarn-error.log* # typescript *.tsbuildinfo next-env.d.ts - -.vscode diff --git a/.prettierrc b/.prettierrc index 054d599..6a990e9 100644 --- a/.prettierrc +++ b/.prettierrc @@ -1,5 +1,5 @@ { "tabWidth": 2, "useTabs": false, - "printWidth": 120 + "printWidth": 180 } diff --git a/README.md b/README.md index c87e042..965a122 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,8 @@ First, run the development server: npm run dev # or yarn dev +# or +pnpm dev ``` Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. @@ -18,6 +20,8 @@ You can start editing the page by modifying `pages/index.tsx`. The page auto-upd The `pages/api` directory is mapped to `/api/*`. Files in this directory are treated as [API routes](https://nextjs.org/docs/api-routes/introduction) instead of React pages. +This project uses [`next/font`](https://nextjs.org/docs/basic-features/font-optimization) to automatically optimize and load Inter, a custom Google Font. + ## Learn More To learn more about Next.js, take a look at the following resources: diff --git a/app/admin/articles/editor/[articleId]/layout.tsx b/app/admin/articles/editor/[articleId]/layout.tsx deleted file mode 100644 index 5ffca51..0000000 --- a/app/admin/articles/editor/[articleId]/layout.tsx +++ /dev/null @@ -1,3 +0,0 @@ -export default async function AdminArticleEditorLayout({ children }) { - return
{children}
; -} diff --git a/app/admin/articles/page.tsx b/app/admin/articles/page.tsx deleted file mode 100644 index 18b024d..0000000 --- a/app/admin/articles/page.tsx +++ /dev/null @@ -1,13 +0,0 @@ -"use client"; - -import React from "react"; - -export default function AdminArticlesPage() { - return ( -
-

Page to manage articles

- create new article
-

List of existing articles

-
- ); -} diff --git a/app/admin/categories/editor/[categoryId]/layout.tsx b/app/admin/categories/editor/[categoryId]/layout.tsx deleted file mode 100644 index 5c0796f..0000000 --- a/app/admin/categories/editor/[categoryId]/layout.tsx +++ /dev/null @@ -1,3 +0,0 @@ -export default async function AdminCategoriesEditorLayout({ children }) { - return
{children}
; -} diff --git a/app/admin/categories/editor/[categoryId]/page.tsx b/app/admin/categories/editor/[categoryId]/page.tsx deleted file mode 100644 index 21e0aa6..0000000 --- a/app/admin/categories/editor/[categoryId]/page.tsx +++ /dev/null @@ -1,179 +0,0 @@ -"use client"; -import React, { useRef, useState } from "react"; -import styles from "../../../../../styles/modules/CategoryEditor.module.scss"; -import { Prisma } from "@prisma/client"; -import "../../../../../styles/inputs.scss"; -import "../../../../../styles/buttons.scss"; -import { formatTextToUrlName } from "../../../../../utils"; -import { isValidText } from "../../../../../validators"; -import { CreateCategory, UpdateCategory } from "../../../../../types/api"; -import urlJoin from "url-join"; -import { useRouter } from "next/navigation"; -import { useEffect } from "react"; -import { apiUrl } from "../../../../../global"; - -type CategoryWithSvg = Prisma.CategoryGetPayload<{ include: { svg: true } }>; - -export default function AdminCategoriesEditor({ params }: { params: { categoryId: string } }) { - const router = useRouter(); - const [title, setTitle] = useState(""); - const [color, setColor] = useState(""); - const [svgViewbox, setSvgViewbox] = useState(""); - const [svgPath, setSvgPath] = useState(""); - - const titleRef = useRef(null); - const colorRef = useRef(null); - const svgViewboxRef = useRef(null); - const svgPathRef = useRef(null); - const errorTextRef = useRef(null); - function handleFormChange() { - setTitle(titleRef.current.value); - setColor(colorRef.current.value); - setSvgPath(svgPathRef.current.value); - setSvgViewbox(svgViewboxRef.current.value); - } - - async function handleResponse(res: Response) { - const json = await res.json(); - errorTextRef.current.innerText = json.error ?? ""; - if (json.success) { - router.push(urlJoin(`/articles/`)); - } - } - - async function updateCategory() { - console.log("Update category"); - const payload: UpdateCategory = { - title: titleRef.current.value, - color: colorRef.current.value, - svg: { - path: svgPathRef.current.value, - viewbox: svgViewboxRef.current.value, - }, - }; - console.log(payload); - - await fetch(`/api/categories/${params.categoryId.toString()}`, { - method: "PUT", - headers: { - Accept: "application/json", - "Content-Type": "application/json", - }, - cache: "no-cache", - body: JSON.stringify(payload), - }) - .then(handleResponse) - .catch(console.error); - } - - async function createCategory() { - console.log("Create category"); - const payload: CreateCategory = { - title: titleRef.current.value, - color: colorRef.current.value, - svg: { - path: svgPathRef.current.value, - viewbox: svgViewboxRef.current.value, - }, - }; - console.log(payload); - - await fetch("/api/categories/", { - method: "POST", - headers: { - Accept: "application/json", - "Content-Type": "application/json", - }, - cache: "no-cache", - body: JSON.stringify(payload), - }) - .then(handleResponse) - .catch(console.error); - } - - useEffect(() => { - const fetchExistingCategory = async () => { - const result: Response = await fetch(urlJoin(apiUrl, `categories/${params.categoryId}`), { - cache: "no-cache", - }); - - const category = await result.json(); - console.log(category); - if (category.code == "404") { - router.push(urlJoin(`/admin/categories/editor/0`)); - } else { - titleRef.current.value = category.title; - colorRef.current.value = category.color; - svgPathRef.current.value = category.svg.path; - svgPathRef.current.value = category.svg.viewbox; - - setTitle(category.title); - setColor(category.color); - setSvgPath(category.svg.path); - setSvgViewbox(category.svg.viewbox); - } - }; - - if (params.categoryId != "0") { - fetchExistingCategory().catch((err) => { - console.log(err); - }); - } - }, []); - - return ( -
-

{params.categoryId == "0" ? "Create new category" : "Update category"}

-
-

- -
-
-
- -
- - -
-
- -
- - -
-
- -
- - -
-
-
-
- ); -} diff --git a/app/admin/categories/page.tsx b/app/admin/categories/page.tsx deleted file mode 100644 index 3b6f97a..0000000 --- a/app/admin/categories/page.tsx +++ /dev/null @@ -1,11 +0,0 @@ -import React from "react"; - -export default function AdminCategoriesPage() { - return ( -
-

Page to manage categories

- create new category
-

List of existing category

-
- ); -} diff --git a/app/admin/page.tsx b/app/admin/page.tsx deleted file mode 100644 index 8400b9b..0000000 --- a/app/admin/page.tsx +++ /dev/null @@ -1,10 +0,0 @@ -import React from "react"; - -export default function AdminPage() { - return ( -
-

AdminPage to manage explainegy

- articles categories
-
- ); -} diff --git a/app/articles/[categoryName]/[articleName]/head.tsx b/app/articles/[categoryName]/[articleName]/head.tsx deleted file mode 100644 index 45950b4..0000000 --- a/app/articles/[categoryName]/[articleName]/head.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import { Article } from "@prisma/client"; -import { FetchManager } from "../../../../manager/fetchManager"; - -export default async function ArticleHead({ params }: { params: { articleName: string; categoryName: string } }) { - const articleName: string = params.articleName; - const article: Article = await FetchManager.Article.getByName(articleName); - return ( - <> - {article?.title} - - - ); -} diff --git a/app/articles/[categoryName]/[articleName]/layout.tsx b/app/articles/[categoryName]/[articleName]/layout.tsx deleted file mode 100644 index 547720c..0000000 --- a/app/articles/[categoryName]/[articleName]/layout.tsx +++ /dev/null @@ -1,3 +0,0 @@ -export default function ArticleLayout({ children }) { - return
{children}
; -} diff --git a/app/articles/[categoryName]/[articleName]/page.tsx b/app/articles/[categoryName]/[articleName]/page.tsx deleted file mode 100644 index 7f15275..0000000 --- a/app/articles/[categoryName]/[articleName]/page.tsx +++ /dev/null @@ -1,73 +0,0 @@ -import ContentTable from "../../../../components/ContentTable"; -import Sidebar from "../../../../components/Sidebar"; -import styles from "../../../../styles/modules/Article.module.scss"; -import Image from "next/image"; -import Markdown from "../../../../components/Markdown"; -import { ArticleWithIncludes, FetchManager } from "../../../../manager/fetchManager"; -import { formatTextToUrlName } from "../../../../utils"; - -//* MAIN -export default async function ArticlePage({ - params, -}: { - params: { articleName: string; categoryName: string; test: string }; -}) { - const articleName: string = formatTextToUrlName(params.articleName); - const article: ArticleWithIncludes = await FetchManager.Article.getByName(articleName); - - const dateUpdated: Date = new Date(article.dateUpdated); - const dateCreated: Date = new Date(article.dateCreated); - const dateOptions: Intl.DateTimeFormatOptions = { month: "long", day: "numeric", year: "numeric" }; - const markdown: string = article?.markdown ?? ""; - - console.log(params.test); - return ( -
- -
-
-

- {`Published on ${dateCreated.toLocaleDateString("en-US", dateOptions)}`} -
- {dateUpdated > dateCreated ? `Updated on ${dateUpdated.toLocaleDateString("en-US", dateOptions)}` : ""} -

- -

{article?.title}

- - {article?.image?.alt -

{article?.introduction}

-
- -
- -
- ); -} - -export async function generateStaticParams() { - // Fetchmanager does not work here - const articles: ArticleWithIncludes[] = await FetchManager.Article.list(false); - - return await Promise.all( - articles.map(async (article) => ({ - categoryName: article.category?.name ?? "", - articleName: article.name ?? "", - })) - ); -} - -export function getServerSideProps() { - console.log("-----------------------------------"); - return { test: "weird test" }; -} diff --git a/app/head.tsx b/app/head.tsx deleted file mode 100644 index 34c8670..0000000 --- a/app/head.tsx +++ /dev/null @@ -1,7 +0,0 @@ -export default async function RootHead() { - return ( - <> - - - ); -} diff --git a/app/layout.tsx b/app/layout.tsx deleted file mode 100644 index c5c21dc..0000000 --- a/app/layout.tsx +++ /dev/null @@ -1,27 +0,0 @@ -import "../styles/globals.scss"; -import "../styles/variables_colors.scss"; -import "../styles/variables.scss"; -import Link from "next/link"; -import Footer from "../components/Footer"; -import Nav from "../components/Nav"; -import { FetchManager } from "../manager/fetchManager"; -import AdminNav from "../components/AdminNav"; -import AdminControl from "../components/AdminControl"; - -export default async function RootLayout({ children }: { children: React.ReactNode }) { - return ( - - - - -
-
-
{children}
-