summaryrefslogtreecommitdiff
path: root/src/components/Flashcard/SyllableModal.tsx
diff options
context:
space:
mode:
Diffstat (limited to 'src/components/Flashcard/SyllableModal.tsx')
-rw-r--r--src/components/Flashcard/SyllableModal.tsx110
1 files changed, 110 insertions, 0 deletions
diff --git a/src/components/Flashcard/SyllableModal.tsx b/src/components/Flashcard/SyllableModal.tsx
new file mode 100644
index 0000000..a00fd10
--- /dev/null
+++ b/src/components/Flashcard/SyllableModal.tsx
@@ -0,0 +1,110 @@
+// This is a Server Component
+import React from "react";
+import db from "@/lib/db";
+import {
+ Card,
+ CardHeader,
+ CardDescription,
+ CardContent,
+ CardFooter,
+ CardTitle,
+} from "@/components/ui/card";
+import { NLP } from "sortug-ai";
+import {
+ BookOpen,
+ Volume2,
+ Link as LinkIcon,
+ ChevronDown,
+ ChevronUp,
+ Search,
+ Info,
+ MessageSquareQuote,
+ Tags,
+ ListTree,
+ Lightbulb,
+} from "lucide-react";
+import {
+ Example,
+ SubSense,
+ RelatedEntry,
+ Sense,
+ WordData,
+} from "@/zoom/logic/types";
+import { isTonal } from "@/lib/lang/utils";
+
+type WordProps = { text: string; lang: string };
+export default async function (props: WordProps) {
+ const { text, lang } = props;
+ const data = db.fetchWordBySpelling(text, lang);
+
+ if (!data) return <p>oh...</p>;
+ console.log(data.senses[0]);
+ return (
+ <Card className="overflow-y-scroll max-h-[80vh]">
+ <CardHeader>
+ <CardTitle>
+ <h1 className="text-5xl">{text}</h1>
+ </CardTitle>
+ <CardDescription>
+ <IpaDisplay ipaEntries={data.ipa} />
+ </CardDescription>
+ </CardHeader>
+ <CardContent>
+ {isTonal(text) ? <Tones {...props} /> : <NotTones {...props} />}
+ </CardContent>
+ <CardFooter></CardFooter>
+ </Card>
+ );
+ // return (
+ // <div className="p-6">
+ // <h3 className="mb-2 text-2xl font-bold">{word}</h3>
+ // <p className="mb-1 text-xl text-green-600">${word.}</p>
+ // <p className="text-gray-700">{word}</p>
+ // <p className="mt-4 text-xs text-gray-500">
+ // Content rendered on the server at: {new Date().toLocaleTimeString()}
+ // </p>
+ // </div>
+ // );
+}
+
+// Helper component for IPA display
+const IpaDisplay = ({
+ ipaEntries,
+}: {
+ ipaEntries: Array<{ ipa: string; tags?: string[] }>;
+}) => {
+ if (!ipaEntries || ipaEntries.length === 0) return null;
+ return (
+ <div className="flex items-center space-x-2 flex-wrap">
+ {ipaEntries.map((entry, index) => {
+ const tags = entry.tags ? entry.tags : [];
+ return (
+ <span key={index} className="text-lg text-blue-600 font-serif">
+ {entry.ipa}{" "}
+ {tags.length > 0 && (
+ <span className="text-xs text-gray-500">({tags.join(", ")})</span>
+ )}
+ </span>
+ );
+ })}
+ <button
+ className="p-1 text-blue-500 hover:text-blue-700 transition-colors"
+ title="Pronounce"
+ // onClick={() => {
+ // /* Pronunciation logic would be client-side or a server roundtrip for audio file. */ alert(
+ // "Pronunciation feature not implemented for server component.",
+ // );
+ // }}
+ >
+ <Volume2 size={20} />
+ </button>
+ </div>
+ );
+};
+
+function Tones({ text, lang }: WordProps) {
+ return <div></div>;
+}
+function NotTones({ text, lang }: WordProps) {
+ return <div></div>;
+}