mirror of
https://github.com/massbug/judge4c.git
synced 2025-05-18 07:16:34 +00:00
feat(workspace): pass editorLanguageConfigs to LanguageSelector and WorkspaceEditorHeader
This commit is contained in:
parent
4dbf6d774b
commit
ee4020f50f
@ -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 />
|
||||||
</>
|
</>
|
||||||
)
|
);
|
||||||
}
|
}
|
||||||
|
@ -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} />
|
||||||
|
@ -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>
|
||||||
);
|
);
|
||||||
|
Loading…
Reference in New Issue
Block a user