Skip to content

Commit 740ce7d

Browse files
Make long select menus searchable
1 parent e8f22e2 commit 740ce7d

File tree

6 files changed

+310
-337
lines changed

6 files changed

+310
-337
lines changed

components/Editor.tsx

Lines changed: 23 additions & 156 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,7 @@ import Editor from "@monaco-editor/react";
33
import axios from "axios";
44
import { Button } from "@/components/ui/button";
55
import { Input } from "@/components/ui/input";
6-
import {
7-
Select,
8-
SelectContent,
9-
SelectGroup,
10-
SelectItem,
11-
SelectLabel,
12-
SelectTrigger,
13-
SelectValue,
14-
} from "@/components/ui/select";
6+
import { Combobox } from "@/components/bc_ui/combobox";
157
import {
168
ContextMenu,
179
ContextMenuContent,
@@ -32,119 +24,10 @@ import { useTranslation } from "next-i18next";
3224
import JavaScriptConsole from "@/components/JSConsole";
3325
import { generateAIName } from "@/utils/aiName";
3426
import { translateCodeAI } from "@/utils/aiTranslate";
27+
import codeLangOptions from "@/utils/codeLangs";
3528

3629
const DEFAULT_LANGUAGE = "html";
3730

38-
const languageOptions = [
39-
"auto",
40-
"html",
41-
"javascript",
42-
"typescript",
43-
"python",
44-
"java",
45-
"c",
46-
"cpp",
47-
"csharp",
48-
"php",
49-
"css",
50-
"scss",
51-
"less",
52-
"markdown",
53-
"json",
54-
"yaml",
55-
"xml",
56-
"bash",
57-
"sql",
58-
"go",
59-
"rust",
60-
"dart",
61-
"kotlin",
62-
"swift",
63-
"ruby",
64-
"objective-c",
65-
"perl",
66-
"powershell",
67-
"r",
68-
"scala",
69-
"shellscript",
70-
"vb",
71-
"lua",
72-
"fsharp",
73-
"groovy",
74-
"ini",
75-
"latex",
76-
"matlab",
77-
"pascal",
78-
"plaintext",
79-
"pug",
80-
"restructuredtext",
81-
"vhdl",
82-
"vue",
83-
"coffeescript",
84-
"dockerfile",
85-
"graphql",
86-
"handlebars",
87-
"mips",
88-
"razor",
89-
"redis",
90-
"solidity",
91-
];
92-
93-
const langIndex: { [key: string]: string } = {
94-
auto: "Auto",
95-
html: "HTML",
96-
javascript: "JavaScript",
97-
python: "Python",
98-
java: "Java",
99-
c: "C",
100-
cpp: "C++",
101-
csharp: "C#",
102-
php: "PHP",
103-
css: "CSS",
104-
scss: "SCSS",
105-
less: "LESS",
106-
markdown: "Markdown",
107-
json: "JSON",
108-
yaml: "YAML",
109-
xml: "XML",
110-
bash: "Bash",
111-
sql: "SQL",
112-
go: "Go",
113-
rust: "Rust",
114-
dart: "Dart",
115-
kotlin: "Kotlin",
116-
swift: "Swift",
117-
ruby: "Ruby",
118-
"objective-c": "Objective-C",
119-
perl: "Perl",
120-
powershell: "PowerShell",
121-
r: "R",
122-
scala: "Scala",
123-
shellscript: "ShellScript",
124-
vb: "VB",
125-
lua: "Lua",
126-
fsharp: "F#",
127-
groovy: "Groovy",
128-
ini: "INI",
129-
latex: "LaTeX",
130-
matlab: "MATLAB",
131-
pascal: "Pascal",
132-
plaintext: "Plain Text",
133-
pug: "Pug",
134-
restructuredtext: "reStructuredText",
135-
vhdl: "VHDL",
136-
vue: "Vue",
137-
coffeescript: "CoffeeScript",
138-
dockerfile: "Dockerfile",
139-
graphql: "GraphQL",
140-
handlebars: "Handlebars",
141-
mips: "MIPS",
142-
razor: "Razor",
143-
redis: "Redis",
144-
solidity: "Solidity",
145-
typescript: "TypeScript",
146-
};
147-
14831
const getStoredDefaultLanguage = () => {
14932
if (typeof window === "undefined" || !localStorage.getItem("defaultLanguage"))
15033
return "javascript";
@@ -166,7 +49,7 @@ const CodeEditor = ({
16649
const [defaultLanguage, setDefaultLanguage] = useState(
16750
getStoredDefaultLanguage()
16851
);
169-
const [language, setLanguage] = useState(DEFAULT_LANGUAGE);
52+
const [codeLanguage, setCodeLanguage] = useState(DEFAULT_LANGUAGE);
17053
const [name, setName] = useState(`${t("untitled") || "Untitled"}`);
17154
const [showPreview, setShowPreview] = useState(true);
17255
const [saveSuccess, setSaveSuccess] = useState("");
@@ -191,15 +74,15 @@ const CodeEditor = ({
19174
.then((response) => {
19275
const project = response.data;
19376
setCode(project.code);
194-
setLanguage(project.language);
77+
setCodeLanguage(project.language);
19578
setName(project?.name || `${t("untitled")}`);
19679
})
19780
.finally(() => {
19881
setIsLoading(false);
19982
});
20083
} else {
20184
setCode("");
202-
setLanguage(defaultLanguage);
85+
setCodeLanguage(defaultLanguage);
20386
setName(`${t("untitled")}`);
20487
}
20588
}, [selectedProject, defaultLanguage, t]);
@@ -249,17 +132,17 @@ const CodeEditor = ({
249132
await axios.put(`/api/projects/${selectedProject.id}`, {
250133
name,
251134
code,
252-
language,
135+
language: codeLanguage,
253136
});
254137
} else {
255138
const response = await axios.post("/api/projects", {
256139
name,
257140
code,
258-
language,
141+
language: codeLanguage,
259142
});
260143
const project = await response.data;
261144
if (!project) return;
262-
setSelectedProject({ ...project, code, language, name });
145+
setSelectedProject({ ...project, code, language: codeLanguage, name });
263146
}
264147
refreshProjects();
265148
setSaveSuccess("Saved");
@@ -361,33 +244,17 @@ const CodeEditor = ({
361244
</ContextMenuContent>
362245
</ContextMenu>
363246
</div>
364-
<Select
365-
value={language}
366-
onValueChange={(value) => setLanguage(value)}
247+
<Combobox
248+
value={codeLanguage}
249+
onValueChange={(value) => setCodeLanguage(value)}
367250
disabled={isLoading}
368-
>
369-
<SelectTrigger className="w-fit text-black dark:text-white dark:border-gray-700 dark:bg-gray-800">
370-
<SelectValue placeholder="Language" />
371-
</SelectTrigger>
372-
<SelectContent className="dark:bg-gray-800 dark:border-gray-700">
373-
<SelectGroup>
374-
<SelectLabel className="dark:text-white dark:bg-gray-800">
375-
{t("language")}
376-
</SelectLabel>
377-
{languageOptions.map((lang) => (
378-
<SelectItem
379-
className="dark:text-white dark:bg-gray-800 dark:hover:bg-gray-700 dark:hover:text-white"
380-
key={lang}
381-
value={lang}
382-
>
383-
{langIndex[lang] || lang}
384-
</SelectItem>
385-
))}
386-
</SelectGroup>
387-
</SelectContent>
388-
</Select>
251+
placeholder="Language"
252+
options={codeLangOptions}
253+
className="w-fit text-black dark:text-white dark:border-gray-700 dark:bg-gray-800"
254+
label="Language"
255+
/>
389256

390-
{/* <Button
257+
{/* <Button
391258
onClick={translateProject}
392259
size={"icon"}
393260
disabled={isSaving || isLoading}
@@ -436,11 +303,11 @@ const CodeEditor = ({
436303
<Button
437304
onClick={() => setShowPreview(!showPreview)}
438305
disabled={
439-
(language !== "html" && language !== "javascript") || isLoading
306+
(codeLanguage !== "html" && codeLanguage !== "javascript") || isLoading
440307
}
441308
className="w-10 p-2 sm:w-fit sm:p-4"
442309
>
443-
{language === "html" || language === "javascript" ? (
310+
{codeLanguage === "html" || codeLanguage === "javascript" ? (
444311
showPreview ? (
445312
<>
446313
<EyeOff className="inline-block" />{" "}
@@ -478,25 +345,25 @@ const CodeEditor = ({
478345
<Editor
479346
height={
480347
showPreview &&
481-
(language === "html" || language === "javascript")
348+
(codeLanguage === "html" || codeLanguage === "javascript")
482349
? "50%"
483350
: "100%"
484351
}
485352
className="dark:invert"
486353
width="100%"
487-
language={language}
354+
language={codeLanguage}
488355
value={code}
489356
onChange={(value) => setCode(value || "")}
490357
//theme={(darkMode ? "vs-dark" : "vs-light") as any}
491358
theme="vs-light"
492359
/>
493-
{showPreview && language === "html" && (
360+
{showPreview && codeLanguage === "html" && (
494361
<iframe
495362
srcDoc={code}
496363
className="w-full h-1/2 border-t dark:border-gray-700"
497364
/>
498365
)}
499-
{showPreview && language === "javascript" && (
366+
{showPreview && codeLanguage === "javascript" && (
500367
<JavaScriptConsole code={code} />
501368
)}
502369
</>

0 commit comments

Comments
 (0)