diff --git a/src/app/(app)/problems/[id]/@workspace/@editor/layout.tsx b/src/app/(app)/problems/[id]/@workspace/@editor/layout.tsx index 36c8a63..abbe23c 100644 --- a/src/app/(app)/problems/[id]/@workspace/@editor/layout.tsx +++ b/src/app/(app)/problems/[id]/@workspace/@editor/layout.tsx @@ -1,3 +1,4 @@ +import WorkspaceEditorHeader from "@/features/playground/workspace/editor/header"; import WorkspaceEditorFooter from "@/features/playground/workspace/editor/footer"; interface WorkspaceEditorLayoutProps { @@ -9,6 +10,7 @@ export default function WorkspaceEditorLayout({ }: WorkspaceEditorLayoutProps) { return (
+
{children}
diff --git a/src/app/(app)/problems/[id]/@workspace/@editor/page.tsx b/src/app/(app)/problems/[id]/@workspace/@editor/page.tsx new file mode 100644 index 0000000..453b337 --- /dev/null +++ b/src/app/(app)/problems/[id]/@workspace/@editor/page.tsx @@ -0,0 +1,5 @@ +import CodeEditor from "@/components/code-editor"; + +export default function WorkspaceEditorPage() { + return ; +} diff --git a/src/features/playground/workspace/editor/components/copy-button.tsx b/src/features/playground/workspace/editor/components/copy-button.tsx new file mode 100644 index 0000000..375c21c --- /dev/null +++ b/src/features/playground/workspace/editor/components/copy-button.tsx @@ -0,0 +1,70 @@ +"use client"; + +import { + Tooltip, + TooltipContent, + TooltipProvider, + TooltipTrigger, +} from "@/components/ui/tooltip"; +import { cn } from "@/lib/utils"; +import { useState } from "react"; +import { Check, Copy } from "lucide-react"; +import { Button } from "@/components/ui/button"; +import { useCodeEditorStore } from "@/store/useCodeEditorStore"; + +export default function CopyButton() { + const [copied, setCopied] = useState(false); + const { editor } = useCodeEditorStore(); + + const handleCopy = async () => { + try { + await navigator.clipboard.writeText(editor?.getValue() || ""); + setCopied(true); + setTimeout(() => setCopied(false), 1500); + } catch (err) { + console.error("Failed to copy text: ", err); + } + }; + + return ( + + + + + + + Click to Copy + + + + ); +} diff --git a/src/features/playground/workspace/editor/components/format-button.tsx b/src/features/playground/workspace/editor/components/format-button.tsx new file mode 100644 index 0000000..8179069 --- /dev/null +++ b/src/features/playground/workspace/editor/components/format-button.tsx @@ -0,0 +1,38 @@ +"use client"; + +import { + Tooltip, + TooltipContent, + TooltipProvider, + TooltipTrigger, +} from "@/components/ui/tooltip"; +import { Paintbrush } from "lucide-react"; +import { Button } from "@/components/ui/button"; +import { useCodeEditorStore } from "@/store/useCodeEditorStore"; + +export default function FormatButton() { + const { editor } = useCodeEditorStore(); + + return ( + + + + + + + Format Code + + + + ); +} diff --git a/src/features/playground/workspace/editor/components/language-selector.tsx b/src/features/playground/workspace/editor/components/language-selector.tsx new file mode 100644 index 0000000..b149344 --- /dev/null +++ b/src/features/playground/workspace/editor/components/language-selector.tsx @@ -0,0 +1,47 @@ +"use client"; + +import { + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, +} from "@/components/ui/select"; +import { getPath } from "@/lib/utils"; +import { EditorLanguage } from "@prisma/client"; +import { Skeleton } from "@/components/ui/skeleton"; +import LanguageServerConfig from "@/config/language-server"; +import { EditorLanguageConfig } from "@/config/editor-language"; +import { useCodeEditorStore } from "@/store/useCodeEditorStore"; + +export default function LanguageSelector() { + const { hydrated, language, setLanguage, setPath, setLspConfig } = useCodeEditorStore(); + + if (!hydrated) { + return ; + } + + const handleValueChange = (lang: EditorLanguage) => { + setLanguage(lang); + setPath(getPath(lang)); + setLspConfig(LanguageServerConfig[lang]); + }; + + return ( + + ); +} diff --git a/src/features/playground/workspace/editor/components/redo-button.tsx b/src/features/playground/workspace/editor/components/redo-button.tsx new file mode 100644 index 0000000..ba28031 --- /dev/null +++ b/src/features/playground/workspace/editor/components/redo-button.tsx @@ -0,0 +1,38 @@ +"use client"; + +import { + Tooltip, + TooltipContent, + TooltipProvider, + TooltipTrigger, +} from "@/components/ui/tooltip"; +import { Redo2 } from "lucide-react"; +import { Button } from "@/components/ui/button"; +import { useCodeEditorStore } from "@/store/useCodeEditorStore"; + +export default function RedoButton() { + const { editor } = useCodeEditorStore(); + + return ( + + + + + + + Redo Code + + + + ); +} diff --git a/src/features/playground/workspace/editor/components/reset-button.tsx b/src/features/playground/workspace/editor/components/reset-button.tsx new file mode 100644 index 0000000..9c09037 --- /dev/null +++ b/src/features/playground/workspace/editor/components/reset-button.tsx @@ -0,0 +1,51 @@ +"use client"; + +import { + Tooltip, + TooltipContent, + TooltipProvider, + TooltipTrigger, +} from "@/components/ui/tooltip"; +import { RotateCcw } from "lucide-react"; +import { Button } from "@/components/ui/button"; +import { useCodeEditorStore } from "@/store/useCodeEditorStore"; +import { TEMP_DEFAULT_EDITOR_VALUE } from "@/config/problem/value"; + +export default function ResetButton() { + const { editor, language } = useCodeEditorStore(); + return ( + + + + + + + Reset Code + + + + ); +} diff --git a/src/features/playground/workspace/editor/components/undo-button.tsx b/src/features/playground/workspace/editor/components/undo-button.tsx new file mode 100644 index 0000000..21e607f --- /dev/null +++ b/src/features/playground/workspace/editor/components/undo-button.tsx @@ -0,0 +1,38 @@ +"use client"; + +import { + Tooltip, + TooltipContent, + TooltipProvider, + TooltipTrigger, +} from "@/components/ui/tooltip"; +import { Undo2 } from "lucide-react"; +import { Button } from "@/components/ui/button"; +import { useCodeEditorStore } from "@/store/useCodeEditorStore"; + +export default function UndoButton() { + const { editor } = useCodeEditorStore(); + + return ( + + + + + + + Undo Code + + + + ); +} diff --git a/src/features/playground/workspace/editor/header.tsx b/src/features/playground/workspace/editor/header.tsx new file mode 100644 index 0000000..e142540 --- /dev/null +++ b/src/features/playground/workspace/editor/header.tsx @@ -0,0 +1,36 @@ +import { cn } from "@/lib/utils"; +import CopyButton from "./components/copy-button"; +import RedoButton from "./components/redo-button"; +import UndoButton from "./components/undo-button"; +import ResetButton from "./components/reset-button"; +import FormatButton from "./components/format-button"; +import LanguageSelector from "./components/language-selector"; + +interface WorkspaceEditorHeaderProps { + className?: string; +} + +export default function WorkspaceEditorHeader({ + className, + ...props +}: WorkspaceEditorHeaderProps) { + return ( +
+
+
+ +
+
+ + + + + +
+
+
+ ); +}