diff --git a/prisma/migrations/20251210105812_init/migration.sql b/prisma/migrations/20251210105812_init/migration.sql new file mode 100644 index 0000000..7e0dd7e --- /dev/null +++ b/prisma/migrations/20251210105812_init/migration.sql @@ -0,0 +1,120 @@ +-- CreateTable +CREATE TABLE "pairs" ( + "id" SERIAL NOT NULL, + "locale1" VARCHAR(10) NOT NULL, + "locale2" VARCHAR(10) NOT NULL, + "text1" TEXT NOT NULL, + "text2" TEXT NOT NULL, + "ipa1" TEXT, + "ipa2" TEXT, + "folder_id" INTEGER NOT NULL, + "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updated_at" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "pairs_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "folders" ( + "id" SERIAL NOT NULL, + "name" TEXT NOT NULL, + "user_id" TEXT NOT NULL, + "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updated_at" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "folders_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "user" ( + "id" TEXT NOT NULL, + "name" TEXT NOT NULL, + "email" TEXT NOT NULL, + "emailVerified" BOOLEAN NOT NULL DEFAULT false, + "image" TEXT, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "user_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "session" ( + "id" TEXT NOT NULL, + "expiresAt" TIMESTAMP(3) NOT NULL, + "token" TEXT NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + "ipAddress" TEXT, + "userAgent" TEXT, + "userId" TEXT NOT NULL, + + CONSTRAINT "session_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "account" ( + "id" TEXT NOT NULL, + "accountId" TEXT NOT NULL, + "providerId" TEXT NOT NULL, + "userId" TEXT NOT NULL, + "accessToken" TEXT, + "refreshToken" TEXT, + "idToken" TEXT, + "accessTokenExpiresAt" TIMESTAMP(3), + "refreshTokenExpiresAt" TIMESTAMP(3), + "scope" TEXT, + "password" TEXT, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "account_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "verification" ( + "id" TEXT NOT NULL, + "identifier" TEXT NOT NULL, + "value" TEXT NOT NULL, + "expiresAt" TIMESTAMP(3) NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "verification_pkey" PRIMARY KEY ("id") +); + +-- CreateIndex +CREATE INDEX "pairs_folder_id_idx" ON "pairs"("folder_id"); + +-- CreateIndex +CREATE UNIQUE INDEX "pairs_folder_id_locale1_locale2_text1_key" ON "pairs"("folder_id", "locale1", "locale2", "text1"); + +-- CreateIndex +CREATE INDEX "folders_user_id_idx" ON "folders"("user_id"); + +-- CreateIndex +CREATE UNIQUE INDEX "user_email_key" ON "user"("email"); + +-- CreateIndex +CREATE INDEX "session_userId_idx" ON "session"("userId"); + +-- CreateIndex +CREATE UNIQUE INDEX "session_token_key" ON "session"("token"); + +-- CreateIndex +CREATE INDEX "account_userId_idx" ON "account"("userId"); + +-- CreateIndex +CREATE INDEX "verification_identifier_idx" ON "verification"("identifier"); + +-- AddForeignKey +ALTER TABLE "pairs" ADD CONSTRAINT "pairs_folder_id_fkey" FOREIGN KEY ("folder_id") REFERENCES "folders"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "folders" ADD CONSTRAINT "folders_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "session" ADD CONSTRAINT "session_userId_fkey" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "account" ADD CONSTRAINT "account_userId_fkey" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/src/components/LanguageSettings.tsx b/src/components/LanguageSettings.tsx index 67c0187..3936f80 100644 --- a/src/components/LanguageSettings.tsx +++ b/src/components/LanguageSettings.tsx @@ -4,6 +4,7 @@ import IMAGES from "@/config/images"; import IconClick from "./IconClick"; import { useState } from "react"; import LightButton from "./buttons/LightButton"; +import GhostButton from "./buttons/GhostButton"; export default function LanguageSettings() { const [showLanguageMenu, setShowLanguageMenu] = useState(false); @@ -26,18 +27,18 @@ export default function LanguageSettings() { {showLanguageMenu && (
- setLocale("en-US")} > English - - + setLocale("zh-CN")} > 中文 - +
)} diff --git a/src/components/Navbar.tsx b/src/components/Navbar.tsx index d4f2409..38d6349 100644 --- a/src/components/Navbar.tsx +++ b/src/components/Navbar.tsx @@ -6,6 +6,7 @@ import LanguageSettings from "./LanguageSettings"; import { auth } from "@/auth"; import { headers } from "next/headers"; import { getTranslations } from "next-intl/server"; +import GhostButton from "./buttons/GhostButton"; export async function Navbar() { const t = await getTranslations("navbar"); @@ -15,14 +16,14 @@ export async function Navbar() { return (
- + {t("title")} - - + + - -
- +
+ @@ -32,29 +33,29 @@ export async function Navbar() { width={24} height={24} /> - + - + {t("folders")} - - + + - + { (() => { return session && - {t("profile")} - || {t("sign_in")}; + {t("profile")} + || {t("sign_in")}; })() } - {t("about")} - {t("about")} + {t("sourceCode")} - +
); diff --git a/src/components/buttons/GhostButton.tsx b/src/components/buttons/GhostButton.tsx new file mode 100644 index 0000000..a6ef6b7 --- /dev/null +++ b/src/components/buttons/GhostButton.tsx @@ -0,0 +1,27 @@ +import Link from "next/link"; + +export type ButtonType = "button" | "submit" | "reset" | undefined; + +export default function GhostButton({ + onClick, + className, + children, + type = "button", + href +}: { + onClick?: () => void; + className?: string; + children?: React.ReactNode; + type?: ButtonType; + href?: string; +}) { + return ( + + ); +}