simplify Stack dropdown generation significantly

This commit is contained in:
Abi Raja 2024-01-09 06:35:17 -08:00
parent b8bce72d23
commit a8b562e392
2 changed files with 40 additions and 83 deletions

View File

@ -1,3 +1,4 @@
import React from "react";
import { import {
Select, Select,
SelectContent, SelectContent,
@ -5,56 +6,22 @@ import {
SelectItem, SelectItem,
SelectTrigger, SelectTrigger,
} from "./ui/select"; } from "./ui/select";
import { GeneratedCodeConfig } from "../types"; import { GeneratedCodeConfig, STACK_DESCRIPTION } from "../types";
import { Badge } from "./ui/badge"; import { Badge } from "./ui/badge";
function generateDisplayComponent(config: GeneratedCodeConfig) { function generateDisplayComponent(stack: GeneratedCodeConfig) {
switch (config) { const stackComponents = STACK_DESCRIPTION[stack].components;
case GeneratedCodeConfig.HTML_TAILWIND:
return ( return (
<div> <div>
<span className="font-semibold">HTML</span> +{" "} {stackComponents.map((component, index) => (
<span className="font-semibold">Tailwind</span> <React.Fragment key={index}>
<span className="font-semibold">{component}</span>
{index < stackComponents.length - 1 && " + "}
</React.Fragment>
))}
</div> </div>
); );
case GeneratedCodeConfig.REACT_TAILWIND:
return (
<div>
<span className="font-semibold">React</span> +{" "}
<span className="font-semibold">Tailwind</span>
</div>
);
case GeneratedCodeConfig.BOOTSTRAP:
return (
<div>
<span className="font-semibold">Bootstrap</span>
</div>
);
case GeneratedCodeConfig.IONIC_TAILWIND:
return (
<div>
<span className="font-semibold">Ionic</span> +{" "}
<span className="font-semibold">Tailwind</span>
</div>
);
case GeneratedCodeConfig.VUE_TAILWIND:
return (
<div>
<span className="font-semibold">Vue</span> +{" "}
<span className="font-semibold">Tailwind</span>
</div>
);
case GeneratedCodeConfig.SVG:
return (
<div>
<span className="font-semibold">SVG</span>
</div>
);
default: {
const exhaustiveCheck: never = config;
throw new Error(`Unhandled case: ${exhaustiveCheck}`);
}
}
} }
interface Props { interface Props {
@ -88,39 +55,18 @@ function OutputSettingsSection({
</SelectTrigger> </SelectTrigger>
<SelectContent> <SelectContent>
<SelectGroup> <SelectGroup>
<SelectItem value={GeneratedCodeConfig.HTML_TAILWIND}> {Object.values(GeneratedCodeConfig).map((stack) => (
{generateDisplayComponent(GeneratedCodeConfig.HTML_TAILWIND)} <SelectItem value={stack}>
</SelectItem>
<SelectItem value={GeneratedCodeConfig.REACT_TAILWIND}>
{generateDisplayComponent(GeneratedCodeConfig.REACT_TAILWIND)}
</SelectItem>
<SelectItem value={GeneratedCodeConfig.BOOTSTRAP}>
{generateDisplayComponent(GeneratedCodeConfig.BOOTSTRAP)}
</SelectItem>
<SelectItem value={GeneratedCodeConfig.VUE_TAILWIND}>
<div className="flex items-center"> <div className="flex items-center">
{generateDisplayComponent(GeneratedCodeConfig.VUE_TAILWIND)} {generateDisplayComponent(stack)}
<Badge className="ml-2" variant="secondary"> {STACK_DESCRIPTION[stack].inBeta && (
Beta
</Badge>
</div>
</SelectItem>
<SelectItem value={GeneratedCodeConfig.IONIC_TAILWIND}>
<div className="flex items-center">
{generateDisplayComponent(GeneratedCodeConfig.IONIC_TAILWIND)}
<Badge className="ml-2" variant="secondary">
Beta
</Badge>
</div>
</SelectItem>
<SelectItem value={GeneratedCodeConfig.SVG}>
<div className="flex items-center">
{generateDisplayComponent(GeneratedCodeConfig.SVG)}
<Badge className="ml-2" variant="secondary"> <Badge className="ml-2" variant="secondary">
Beta Beta
</Badge> </Badge>
)}
</div> </div>
</SelectItem> </SelectItem>
))}
</SelectGroup> </SelectGroup>
</SelectContent> </SelectContent>
</Select> </Select>

View File

@ -3,16 +3,27 @@ export enum EditorTheme {
COBALT = "cobalt", COBALT = "cobalt",
} }
// Keep in sync with backend (prompts.py) // Keep in sync with backend (prompts/types.py)
export enum GeneratedCodeConfig { export enum GeneratedCodeConfig {
HTML_TAILWIND = "html_tailwind", HTML_TAILWIND = "html_tailwind",
REACT_TAILWIND = "react_tailwind", REACT_TAILWIND = "react_tailwind",
VUE_TAILWIND = "vue_tailwind",
BOOTSTRAP = "bootstrap", BOOTSTRAP = "bootstrap",
VUE_TAILWIND = "vue_tailwind",
IONIC_TAILWIND = "ionic_tailwind", IONIC_TAILWIND = "ionic_tailwind",
SVG = "svg", SVG = "svg",
} }
export const STACK_DESCRIPTION: {
[key in GeneratedCodeConfig]: { components: string[]; inBeta: boolean };
} = {
html_tailwind: { components: ["HTML", "Tailwind"], inBeta: false },
react_tailwind: { components: ["React", "Tailwind"], inBeta: false },
bootstrap: { components: ["Bootstrap"], inBeta: false },
vue_tailwind: { components: ["Vue", "Tailwind"], inBeta: true },
ionic_tailwind: { components: ["Ionic", "Tailwind"], inBeta: true },
svg: { components: ["SVG"], inBeta: true },
};
export interface Settings { export interface Settings {
openAiApiKey: string | null; openAiApiKey: string | null;
openAiBaseURL: string | null; openAiBaseURL: string | null;