feat(workspace): pass editorLanguageConfigs to LanguageSelector and WorkspaceEditorHeader

This commit is contained in:
cfngc4594 2025-03-16 14:18:14 +08:00
parent 4dbf6d774b
commit ee4020f50f
3 changed files with 27 additions and 15 deletions

View File

@ -4,7 +4,7 @@ import WorkspaceEditorHeader from "@/components/features/playground/workspace/ed
import WorkspaceEditorFooter from "@/components/features/playground/workspace/editor/components/footer"; import WorkspaceEditorFooter from "@/components/features/playground/workspace/editor/components/footer";
interface WorkspaceEditorProps { interface WorkspaceEditorProps {
params: Promise<{ id: string }> params: Promise<{ id: string }>;
} }
export default async function WorkspaceEditorPage({ export default async function WorkspaceEditorPage({
@ -19,20 +19,25 @@ export default async function WorkspaceEditorPage({
select: { select: {
language: true, language: true,
template: true, template: true,
} },
} },
} },
}); });
const editorLanguageConfigs = await prisma.editorLanguageConfig.findMany();
const templates = problem?.templates ?? []; const templates = problem?.templates ?? [];
return ( return (
<> <>
<WorkspaceEditorHeader templates={templates} /> <WorkspaceEditorHeader
templates={templates}
editorLanguageConfigs={editorLanguageConfigs}
/>
<div className="flex-1"> <div className="flex-1">
<CodeEditor problemId={id} templates={templates} /> <CodeEditor problemId={id} templates={templates} />
</div> </div>
<WorkspaceEditorFooter /> <WorkspaceEditorFooter />
</> </>
) );
} }

View File

@ -1,19 +1,21 @@
import { cn } from "@/lib/utils"; import { cn } from "@/lib/utils";
import { EditorLanguage } from "@prisma/client";
import CopyButton from "./copy-button"; import CopyButton from "./copy-button";
import RedoButton from "./redo-button"; import RedoButton from "./redo-button";
import UndoButton from "./undo-button"; import UndoButton from "./undo-button";
import ResetButton from "./reset-button"; import ResetButton from "./reset-button";
import FormatButton from "./format-button"; import FormatButton from "./format-button";
import LanguageSelector from "./language-selector"; import LanguageSelector from "./language-selector";
import { EditorLanguage, EditorLanguageConfig } from "@prisma/client";
interface WorkspaceEditorHeaderProps { interface WorkspaceEditorHeaderProps {
templates: { language: EditorLanguage; template: string }[]; templates: { language: EditorLanguage; template: string }[];
editorLanguageConfigs: EditorLanguageConfig[];
className?: string; className?: string;
} }
export default function WorkspaceEditorHeader({ export default function WorkspaceEditorHeader({
templates, templates,
editorLanguageConfigs,
className, className,
...props ...props
}: WorkspaceEditorHeaderProps) { }: WorkspaceEditorHeaderProps) {
@ -24,7 +26,7 @@ export default function WorkspaceEditorHeader({
> >
<div className="w-full flex items-center justify-between"> <div className="w-full flex items-center justify-between">
<div className="flex items-center gap-x-2"> <div className="flex items-center gap-x-2">
<LanguageSelector /> <LanguageSelector editorLanguageConfigs={editorLanguageConfigs} />
</div> </div>
<div className="flex items-center gap-x-2"> <div className="flex items-center gap-x-2">
<ResetButton templates={templates} /> <ResetButton templates={templates} />

View File

@ -8,14 +8,19 @@ import {
SelectValue, SelectValue,
} from "@/components/ui/select"; } from "@/components/ui/select";
import { getPath } from "@/lib/utils"; import { getPath } from "@/lib/utils";
import { EditorLanguage } from "@prisma/client";
import { Skeleton } from "@/components/ui/skeleton"; import { Skeleton } from "@/components/ui/skeleton";
import LanguageServerConfig from "@/config/language-server"; import LanguageServerConfig from "@/config/language-server";
import { EditorLanguageConfig } from "@/config/editor-language";
import { useCodeEditorStore } from "@/store/useCodeEditorStore"; import { useCodeEditorStore } from "@/store/useCodeEditorStore";
import { EditorLanguageIcons } from "@/config/editor-language-icons"; import { EditorLanguageIcons } from "@/config/editor-language-icons";
import { EditorLanguage, EditorLanguageConfig } from "@prisma/client";
export default function LanguageSelector() { interface LanguageSelectorProps {
editorLanguageConfigs: EditorLanguageConfig[];
}
export default function LanguageSelector({
editorLanguageConfigs,
}: LanguageSelectorProps) {
const { hydrated, language, setLanguage, setPath, setLspConfig } = const { hydrated, language, setLanguage, setPath, setLspConfig } =
useCodeEditorStore(); useCodeEditorStore();
@ -35,13 +40,13 @@ export default function LanguageSelector() {
<SelectValue placeholder="Select language" /> <SelectValue placeholder="Select language" />
</SelectTrigger> </SelectTrigger>
<SelectContent className="[&_*[role=option]>span>svg]:shrink-0 [&_*[role=option]>span>svg]:text-muted-foreground/80 [&_*[role=option]>span]:end-2 [&_*[role=option]>span]:start-auto [&_*[role=option]>span]:flex [&_*[role=option]>span]:items-center [&_*[role=option]>span]:gap-2 [&_*[role=option]]:pe-8 [&_*[role=option]]:ps-2"> <SelectContent className="[&_*[role=option]>span>svg]:shrink-0 [&_*[role=option]>span>svg]:text-muted-foreground/80 [&_*[role=option]>span]:end-2 [&_*[role=option]>span]:start-auto [&_*[role=option]>span]:flex [&_*[role=option]>span]:items-center [&_*[role=option]>span]:gap-2 [&_*[role=option]]:pe-8 [&_*[role=option]]:ps-2">
{Object.values(EditorLanguageConfig).map((langConfig) => { {editorLanguageConfigs.map((config) => {
const Icon = EditorLanguageIcons[langConfig.id]; const Icon = EditorLanguageIcons[config.language];
return ( return (
<SelectItem key={langConfig.id} value={langConfig.id}> <SelectItem key={config.language} value={config.language}>
<Icon size={16} aria-hidden="true" /> <Icon size={16} aria-hidden="true" />
<span className="truncate text-sm font-semibold mr-2"> <span className="truncate text-sm font-semibold mr-2">
{langConfig.label} {config.label}
</span> </span>
</SelectItem> </SelectItem>
); );