184 lines
5.3 KiB
TypeScript
184 lines
5.3 KiB
TypeScript
import { useEffect, useMemo, useState } from "react";
|
|
import Playground from "../../../components/containers/playground";
|
|
import { Braces, Code, CodeXml, PencilRuler } from "lucide-react";
|
|
import { TestCase } from "../../../lib/playground";
|
|
import Button from "@ui/button";
|
|
import { cn } from "@/lib/utils";
|
|
import { CodeEditorFile } from "@/components/containers/code-editor";
|
|
import ThemeSelector from "@/components/containers/theme-selector";
|
|
|
|
const initialBody = `
|
|
<pre id="print-area"></pre>
|
|
`;
|
|
|
|
const initialInitScript = `
|
|
const printAreaEl = document.getElementById("print-area");
|
|
function print(...args) {
|
|
printAreaEl.innerHTML += args.map(String).join('');
|
|
}
|
|
`;
|
|
|
|
const initialScript = `
|
|
let a = 4;
|
|
|
|
// Hasil dari 'a' dikali 2
|
|
let b = a * 2;
|
|
|
|
// Hasil dari penjumlahan a dan b
|
|
let c = // lengkapi disini
|
|
|
|
// Fungsi untuk menambahkan dua bilangan
|
|
function tambah(a, b) {
|
|
// lengkapi disini
|
|
}
|
|
|
|
for (let i=0; i<=5; i++) {
|
|
for (let j=0; j<=i; j++) {
|
|
print('*');
|
|
}
|
|
print('\\n');
|
|
}
|
|
`;
|
|
|
|
const initialStyle = `
|
|
body {
|
|
padding: 1rem;
|
|
}
|
|
|
|
button {
|
|
background: #f5f5f5;
|
|
border: 1px solid #f5f5f5;
|
|
padding: 0.5rem 1rem;
|
|
border-radius: 0.5rem;
|
|
cursor: pointer;
|
|
display: block;
|
|
}
|
|
|
|
button:hover {
|
|
background: #e5e5e5;
|
|
}
|
|
`;
|
|
|
|
const LearnViewPage = () => {
|
|
const files: CodeEditorFile[] = useMemo(() => {
|
|
return [
|
|
{
|
|
uri: "body.html",
|
|
// title: "HTML",
|
|
// icon: CodeXml,
|
|
lang: "html",
|
|
content: initialBody,
|
|
hidden: true,
|
|
},
|
|
{
|
|
uri: "init.js",
|
|
icon: Braces,
|
|
lang: "javascript",
|
|
content: initialInitScript,
|
|
hidden: true,
|
|
},
|
|
{
|
|
uri: "script.js",
|
|
title: "Script",
|
|
icon: Braces,
|
|
lang: "javascript",
|
|
content: initialScript,
|
|
pinned: true,
|
|
},
|
|
// {
|
|
// uri: "style.css",
|
|
// title: "Style",
|
|
// icon: PencilRuler,
|
|
// lang: "css",
|
|
// content: initialStyle,
|
|
// },
|
|
];
|
|
}, []);
|
|
|
|
const tests: TestCase[] = [
|
|
{
|
|
name: "Hasil dari b = a x 2",
|
|
test: "b",
|
|
expected: 8,
|
|
},
|
|
{
|
|
name: "Hasil dari c = a + b",
|
|
test: "c",
|
|
expected: 12,
|
|
},
|
|
{
|
|
name: "Hasil 1 + 2",
|
|
test: "tambah(1, 2)",
|
|
expected: 3,
|
|
},
|
|
];
|
|
|
|
return (
|
|
<div className="flex flex-row items-stretch h-screen overflow-hidden">
|
|
<aside className="w-[250px] bg-base-100 fixed top-0 left-0 h-full z-10 -translate-x-full md:static md:translate-x-0">
|
|
Sidebar
|
|
<ThemeSelector
|
|
className="absolute left-4 bottom-4"
|
|
position="top"
|
|
align="default"
|
|
/>
|
|
</aside>
|
|
|
|
<main className="flex-1 bg-base-100 overflow-y-auto">
|
|
<article className="p-4 md:p-8 prose">
|
|
<h1>Lorem Ipsum</h1>
|
|
<p>
|
|
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam
|
|
laoreet suscipit pretium. Nunc vehicula interdum condimentum.
|
|
Maecenas vitae enim dui. Vestibulum luctus tincidunt nisl et
|
|
molestie. Mauris sollicitudin velit consectetur ante porttitor, quis
|
|
commodo justo porta. Integer vestibulum ante urna, et fringilla
|
|
lorem faucibus egestas. Nunc laoreet mollis blandit. Fusce ut mauris
|
|
nibh. Sed orci dolor, fringilla a magna quis, aliquam imperdiet
|
|
purus. Nullam tellus sapien, luctus non volutpat non, venenatis eu
|
|
purus. Etiam elit arcu, dapibus nec pulvinar eu, blandit sed lacus.
|
|
Aliquam euismod id ligula in blandit.
|
|
</p>
|
|
|
|
<p>
|
|
In vel vulputate dolor. Duis bibendum viverra ex, sit amet molestie
|
|
dui pulvinar quis. Donec varius dictum orci. Donec sollicitudin quam
|
|
eu massa ullamcorper porta. In sed ex mauris. Vestibulum ante ipsum
|
|
primis in faucibus orci luctus et ultrices posuere cubilia curae;
|
|
Nunc ultrices, enim a porttitor feugiat, leo nisl venenatis enim, in
|
|
pretium velit leo quis purus. Quisque eget sapien sem. Pellentesque
|
|
hendrerit, sapien ac sodales vestibulum, massa nulla sollicitudin
|
|
neque, vitae condimentum metus leo nec magna. Aliquam sit amet
|
|
porttitor leo. Morbi a massa nec magna ultrices efficitur et
|
|
vulputate nunc. Aliquam id convallis nisl.
|
|
</p>
|
|
|
|
<p>
|
|
Praesent efficitur quis dui nec sagittis. Vestibulum finibus
|
|
vulputate nisi a ultricies. Quisque auctor nunc ut felis placerat,
|
|
eget scelerisque sapien rhoncus. Suspendisse sollicitudin sed lacus
|
|
in mattis. Duis ut egestas arcu. Integer convallis consequat dolor.
|
|
Nulla tincidunt sem nunc, rutrum congue eros ornare euismod. Quisque
|
|
vitae massa risus. Sed sodales facilisis iaculis. Etiam interdum
|
|
massa sit amet purus consequat finibus at sit amet mauris.
|
|
Vestibulum dapibus velit sit amet mauris lobortis, ut scelerisque
|
|
nulla lacinia. Donec quis dictum leo, id luctus mi.
|
|
</p>
|
|
</article>
|
|
</main>
|
|
|
|
<Playground
|
|
className="flex-1"
|
|
files={files}
|
|
tests={tests}
|
|
persistId="test"
|
|
// showHiddenFiles
|
|
// showLogs={false}
|
|
// preview
|
|
/>
|
|
</div>
|
|
);
|
|
};
|
|
|
|
export default LearnViewPage;
|