Skip to content

Commit a8b176c

Browse files
[feat 🐱‍🏍] execute website 🚀
1 parent f616eb0 commit a8b176c

4 files changed

Lines changed: 60 additions & 148 deletions

File tree

websites/src/app/_components/code-editor.tsx

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,12 @@ import { Card, CardContent } from '@/components/ui/card';
66
import { Badge } from '@/components/ui/badge';
77
import { Loader2 } from 'lucide-react';
88
import { LANGUAGE_MAP, SAMPLE_CODE } from '@/constants';
9+
import { Language } from '@/@types';
910

1011
interface CodeEditorProps {
1112
value: string;
1213
onChange: (value: string) => void;
13-
language: string;
14+
language: Language;
1415
height?: string;
1516
readOnly?: boolean;
1617
}
@@ -19,7 +20,7 @@ export function CodeEditor({
1920
value,
2021
onChange,
2122
language,
22-
height = '400px',
23+
height = '300px',
2324
readOnly = false,
2425
}: CodeEditorProps) {
2526
const { theme } = useTheme();
@@ -30,10 +31,10 @@ export function CodeEditor({
3031

3132
const editorOptions = {
3233
minimap: { enabled: false },
33-
fontSize: 14,
34+
fontSize: 16,
3435
lineNumbers: 'on' as const,
3536
roundedSelection: false,
36-
scrollBeyondLastLine: false,
37+
scrollBeyondLastLine: true,
3738
automaticLayout: true,
3839
tabSize: 2,
3940
insertSpaces: true,
@@ -67,16 +68,16 @@ export function CodeEditor({
6768
<div className="w-3 h-3 rounded-full bg-green-400"></div>
6869
</div>
6970
<span className="text-sm font-medium text-slate-600">
70-
{language}.
71-
{LANGUAGE_MAP[language] === 'cpp'
71+
{language}
72+
{/* {LANGUAGE_MAP[language] === 'cpp'
7273
? 'cpp'
7374
: LANGUAGE_MAP[language] === 'python'
7475
? 'py'
7576
: LANGUAGE_MAP[language] === 'javascript'
7677
? 'js'
7778
: LANGUAGE_MAP[language] === 'typescript'
7879
? 'ts'
79-
: LANGUAGE_MAP[language]}
80+
: LANGUAGE_MAP[language]} */}
8081
</span>
8182
</div>
8283
<Badge variant="secondary" className="text-xs">
@@ -88,7 +89,9 @@ export function CodeEditor({
8889
<Editor
8990
height={height}
9091
language={LANGUAGE_MAP[language] || 'plaintext'}
91-
value={value || SAMPLE_CODE[language] || '// Start coding here...'}
92+
value={value ?? '// Start coding here...'}
93+
defaultLanguage={LANGUAGE_MAP[language]}
94+
saveViewState={false}
9295
onChange={handleEditorChange}
9396
theme={theme === 'dark' ? 'vs-dark' : 'vs'}
9497
options={editorOptions}

websites/src/app/page.tsx

Lines changed: 19 additions & 128 deletions
Original file line numberDiff line numberDiff line change
@@ -25,14 +25,7 @@ import { SUPPORTED_LANGUAGES } from '@/constants/language';
2525
import { CodeEditor } from './_components/code-editor';
2626
import { OutputViewer } from './_components/output-viewer';
2727
import { executeCodeAction } from './_actions/execute';
28-
import { Language } from '@/@types';
29-
30-
interface ExecutionResult {
31-
status: 'success' | 'error' | 'running';
32-
output: string;
33-
executionTime: number;
34-
language: string;
35-
}
28+
import { ExecutionResult, Language } from '@/@types';
3629

3730
export default function ExecuteMePlatform() {
3831
const [selectedLanguage, setSelectedLanguage] = useState<Language>('python');
@@ -42,28 +35,6 @@ export default function ExecuteMePlatform() {
4235
useState<ExecutionResult | null>(null);
4336
const [isExecuting, setIsExecuting] = useState(false);
4437

45-
const handleFileUpload = (event: React.ChangeEvent<HTMLInputElement>) => {
46-
const file = event.target.files?.[0];
47-
if (file) {
48-
setUploadedFile(file);
49-
const reader = new FileReader();
50-
reader.onload = (e) => {
51-
const content = e.target?.result as string;
52-
setCode(content);
53-
};
54-
reader.readAsText(file);
55-
56-
// Auto-detect language from file extension
57-
const extension = file.name.split('.').pop();
58-
const detectedLanguage = SUPPORTED_LANGUAGES.find(
59-
(lang) => lang.extension === `.${extension}`
60-
);
61-
if (detectedLanguage) {
62-
setSelectedLanguage(detectedLanguage.value as Language);
63-
}
64-
}
65-
};
66-
6738
const executeCode = async () => {
6839
if (!code.trim()) {
6940
return;
@@ -99,26 +70,6 @@ export default function ExecuteMePlatform() {
9970
}
10071
};
10172

102-
const copyOutput = () => {
103-
if (executionResult?.output) {
104-
navigator.clipboard.writeText(executionResult.output);
105-
}
106-
};
107-
108-
const downloadOutput = () => {
109-
if (executionResult?.output) {
110-
const blob = new Blob([executionResult.output], { type: 'text/plain' });
111-
const url = URL.createObjectURL(blob);
112-
const a = document.createElement('a');
113-
a.href = url;
114-
a.download = `output_${Date.now()}.txt`;
115-
document.body.appendChild(a);
116-
a.click();
117-
document.body.removeChild(a);
118-
URL.revokeObjectURL(url);
119-
}
120-
};
121-
12273
return (
12374
<div className="min-h-screen bg-gradient-to-br from-slate-50 to-slate-100 p-4">
12475
<div className="max-w-7xl mx-auto">
@@ -143,21 +94,18 @@ export default function ExecuteMePlatform() {
14394
<div className="grid lg:grid-cols-2 gap-6">
14495
{/* Code Input Section */}
14596
<Card className="h-fit">
146-
<CardHeader>
147-
<CardTitle className="flex items-center gap-2">
148-
<Code2 className="w-5 h-5" />
149-
Code Editor
150-
</CardTitle>
151-
<CardDescription>
152-
Write or upload your code with full syntax highlighting
153-
</CardDescription>
154-
</CardHeader>
155-
<CardContent className="space-y-4">
97+
<CardHeader className="flex justify-between">
98+
<div>
99+
<CardTitle className="flex items-center gap-2">
100+
<Code2 className="w-5 h-5" />
101+
Code Editor
102+
</CardTitle>
103+
<CardDescription>
104+
Write or upload your code with full syntax highlighting
105+
</CardDescription>
106+
</div>
156107
{/* Language Selection */}
157108
<div className="space-y-2">
158-
<label className="text-sm font-medium">
159-
Programming Language
160-
</label>
161109
<Select
162110
value={selectedLanguage}
163111
onValueChange={(e) => setSelectedLanguage(e as Language)}
@@ -174,71 +122,14 @@ export default function ExecuteMePlatform() {
174122
</SelectContent>
175123
</Select>
176124
</div>
177-
178-
<Tabs defaultValue="editor" className="w-full">
179-
<TabsList className="grid w-full grid-cols-2">
180-
<TabsTrigger value="editor">Code Editor</TabsTrigger>
181-
<TabsTrigger value="upload">Upload File</TabsTrigger>
182-
</TabsList>
183-
184-
<TabsContent value="editor" className="space-y-4">
185-
<CodeEditor
186-
value={code}
187-
onChange={setCode}
188-
language={selectedLanguage}
189-
height="500px"
190-
/>
191-
</TabsContent>
192-
193-
<TabsContent value="upload" className="space-y-4">
194-
<div className="border-2 border-dashed border-slate-300 rounded-lg p-8 text-center hover:border-slate-400 transition-colors">
195-
<Upload className="w-12 h-12 text-slate-400 mx-auto mb-4" />
196-
<div className="space-y-2">
197-
<p className="text-sm text-slate-600">
198-
Drop your code file here or click to browse
199-
</p>
200-
<input
201-
type="file"
202-
onChange={handleFileUpload}
203-
accept={SUPPORTED_LANGUAGES.map(
204-
(l) => l.extension
205-
).join(',')}
206-
className="hidden"
207-
id="file-upload"
208-
/>
209-
<Button
210-
variant="outline"
211-
onClick={() =>
212-
document.getElementById('file-upload')?.click()
213-
}
214-
>
215-
Choose File
216-
</Button>
217-
</div>
218-
</div>
219-
220-
{uploadedFile && (
221-
<div className="flex items-center gap-2 p-3 bg-slate-50 rounded-lg">
222-
<FileText className="w-4 h-4 text-slate-500" />
223-
<span className="text-sm font-medium">
224-
{uploadedFile.name}
225-
</span>
226-
<Badge variant="secondary" className="text-xs">
227-
{(uploadedFile.size / 1024).toFixed(1)} KB
228-
</Badge>
229-
</div>
230-
)}
231-
232-
{code && (
233-
<CodeEditor
234-
value={code}
235-
onChange={setCode}
236-
language={selectedLanguage}
237-
height="400px"
238-
/>
239-
)}
240-
</TabsContent>
241-
</Tabs>
125+
</CardHeader>
126+
<CardContent className="space-y-4">
127+
<CodeEditor
128+
value={code}
129+
onChange={setCode}
130+
language={selectedLanguage}
131+
height="300px"
132+
/>
242133

243134
<Button
244135
onClick={executeCode}

websites/src/constants/language.ts

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
export const SUPPORTED_LANGUAGES = [
22
{ value: 'python', label: 'Python', extension: '.py' },
3-
{ value: 'javascript', label: 'JavaScript', extension: '.js' },
4-
{ value: 'typescript', label: 'TypeScript', extension: '.ts' },
5-
{ value: 'java', label: 'Java', extension: '.java' },
6-
{ value: 'cpp', label: 'C++', extension: '.cpp' },
7-
{ value: 'c', label: 'C', extension: '.c' },
8-
{ value: 'go', label: 'Go', extension: '.go' },
9-
{ value: 'rust', label: 'Rust', extension: '.rs' },
10-
{ value: 'php', label: 'PHP', extension: '.php' },
11-
{ value: 'ruby', label: 'Ruby', extension: '.rb' },
3+
{ value: 'nodejs', label: 'JavaScript', extension: '.js' },
4+
// { value: 'typescript', label: 'TypeScript', extension: '.ts' },
5+
// { value: 'java', label: 'Java', extension: '.java' },
6+
// { value: 'cpp', label: 'C++', extension: '.cpp' },
7+
// { value: 'c', label: 'C', extension: '.c' },
8+
// { value: 'go', label: 'Go', extension: '.go' },
9+
// { value: 'rust', label: 'Rust', extension: '.rs' },
10+
// { value: 'php', label: 'PHP', extension: '.php' },
11+
// { value: 'ruby', label: 'Ruby', extension: '.rb' },
1212
] as const;

websites/src/lib/utils.ts

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,24 @@
1-
import { clsx, type ClassValue } from "clsx"
2-
import { twMerge } from "tailwind-merge"
1+
import { clsx, type ClassValue } from 'clsx';
2+
import { twMerge } from 'tailwind-merge';
33

44
export function cn(...inputs: ClassValue[]) {
5-
return twMerge(clsx(inputs))
5+
return twMerge(clsx(inputs));
66
}
7+
8+
export const copyOutput = (output: string) => {
9+
navigator.clipboard.writeText(output);
10+
};
11+
12+
export const downloadOutput = (output: string) => {
13+
if (output) {
14+
const blob = new Blob([output], { type: 'text/plain' });
15+
const url = URL.createObjectURL(blob);
16+
const a = document.createElement('a');
17+
a.href = url;
18+
a.download = `executeme_${Date.now()}.txt`;
19+
document.body.appendChild(a);
20+
a.click();
21+
document.body.removeChild(a);
22+
URL.revokeObjectURL(url);
23+
}
24+
};

0 commit comments

Comments
 (0)