Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Majhcc/issue26 #27

Merged
merged 5 commits into from
Jan 20, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions components/Collapse.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { Course } from "../utils/types.ts";
import CourseCard from "./CourseCard.tsx";

export default function Collapse(
{ title, courses, completed }: { title: string; courses: Course[]; completed: string[] },
{ title, courses }: { title: string; courses: Course[]; },
) {
return (
<div class="collapse collapse-arrow bg-base-300">
Expand All @@ -12,7 +12,7 @@ export default function Collapse(
</div>
<div class="collapse-content flex flex-col">
{courses.map((course) => (
<CourseCard isDone={completed ? completed.includes(course.slug.replace("\\", "/")) : false} key={course.slug} course={course} />
<CourseCard key={course.slug} course={course} />
))}
</div>
</div>
Expand Down
8 changes: 4 additions & 4 deletions components/CourseCard.tsx
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import { Course } from "../utils/types.ts";
import { Course } from "@/utils/types.ts";

import ProgressCheck from "./ProgressCheck.tsx";
import ProgressCheck from "@/islands/ProgressCheck.tsx"

export default function CourseCard(props: { course: Course; isDone: boolean }) {
export default function CourseCard(props: { course: Course}) {
const { course } = props;
return (
<a
Expand All @@ -12,7 +12,7 @@ export default function CourseCard(props: { course: Course; isDone: boolean }) {
style={{ order: course.order }}
>
<h3 class="text-gray-500 font-bold flex gap-1 items-center">
<ProgressCheck isDone={props.isDone} />
<ProgressCheck slug={props.course.slug} />
{course.title}
</h3>
</a>
Expand Down
16 changes: 5 additions & 11 deletions components/Courses.tsx
Original file line number Diff line number Diff line change
@@ -1,22 +1,20 @@
import { getNumberOfCourses } from "../utils/course.ts";
import { Course, CourseGroup } from "../utils/types.ts";
import { getNumberOfCourses } from "@/utils/course.ts";
import { Course, CourseGroup } from "@/utils/types.ts";

import Collapse from "./Collapse.tsx";
import CourseCard from "./CourseCard.tsx";
import ProgressPageSplit from "./ProgressPageSplit.tsx";
import ProgressSection from "@/islands/ProgressSection.tsx";

export default function Courses(
{ courses, completed }: {
{ courses }: {
courses: (Course | CourseGroup)[];
completed: string[];
},
) {
const total = getNumberOfCourses(courses);
return (
<>
<div className="py-2 bg-base-300 p-4 rounded-md">
<ProgressPageSplit
completed={completed.length}
<ProgressSection
total={total}
/>
</div>
Expand All @@ -32,7 +30,6 @@ export default function Courses(
return (
<div key={index} class="mt-1">
<Collapse
completed={completed}
title={course.label}
courses={course.courses}
/>
Expand All @@ -44,9 +41,6 @@ export default function Courses(
<div key={course.slug}>
<CourseCard
course={course}
isDone={completed
? completed.includes(course.slug.replace("\\", "/"))
: false}
/>
</div>
);
Expand Down
7 changes: 2 additions & 5 deletions components/Drawer.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import CourseCard from "./CourseCard.tsx";
import IconLayoutSidebarLeftCollapse from "https://deno.land/x/[email protected]/tsx/layout-sidebar-left-collapse.tsx";

export default function Drawer(
{ courses, completed }: { courses: (Course | CourseGroup)[], completed: string[] },
{ courses }: { courses: (Course | CourseGroup)[] },
) {
return (
<div class="drawer">
Expand Down Expand Up @@ -35,17 +35,14 @@ export default function Drawer(
if ("courses" in course) {
return (
<Collapse
completed={completed}
title={course.label || "بدون عنوان"}
courses={course.courses}
/>
);
} else {
return (
<li key={course.slug}>
<CourseCard course={course} isDone={completed
? completed.includes(course.slug.replace("\\", "/"))
: false} />
<CourseCard course={course} />
</li>
);
}
Expand Down
3 changes: 1 addition & 2 deletions components/Nav.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ import ThemeToggle from "../islands/ThemeToggle.tsx";
import Drawer from "./Drawer.tsx";

export default function NavBar(
{ completed }: { completed: string[] },
) {
return (
<nav class="bg-base-300 w-full py-4 px-4 flex items-center gap-4 border-b-2 nav">
Expand Down Expand Up @@ -32,7 +31,7 @@ export default function NavBar(
</div>
<div class="flex gap-2 items-center">
<ThemeToggle />
<Drawer courses={cache.courses} completed={completed} />
<Drawer courses={cache.courses} />
</div>
</nav>
);
Expand Down
8 changes: 0 additions & 8 deletions components/ProgressCheck.tsx

This file was deleted.

14 changes: 0 additions & 14 deletions components/ProgressPageSplit.tsx

This file was deleted.

1 change: 1 addition & 0 deletions deno.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
"lint": { "rules": { "tags": ["fresh", "recommended"] } },
"exclude": ["**/_fresh/*"],
"imports": {
"@/": "./",
"$fresh/": "https://deno.land/x/[email protected]/",
"preact": "https://esm.sh/[email protected]",
"preact/": "https://esm.sh/[email protected]/",
Expand Down
10 changes: 6 additions & 4 deletions fresh.gen.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,13 @@
import * as $_slug_ from "./routes/[...slug].tsx";
import * as $_404 from "./routes/_404.tsx";
import * as $_layout from "./routes/_layout.tsx";
import * as $_middleware from "./routes/_middleware.ts";
import * as $about from "./routes/about.tsx";
import * as $api_test_finsh from "./routes/api/test/finsh.ts";
import * as $group_slug_ from "./routes/group/[slug].tsx";
import * as $index from "./routes/index.tsx";
import * as $Editor from "./islands/Editor.tsx";
import * as $ProgressBar from "./islands/ProgressBar.tsx";
import * as $ProgressCheck from "./islands/ProgressCheck.tsx";
import * as $ProgressSection from "./islands/ProgressSection.tsx";
import * as $ThemeToggle from "./islands/ThemeToggle.tsx";
import * as $Toast from "./islands/Toast.tsx";
import * as $signals_store from "./islands/signals/store.ts";
Expand All @@ -22,14 +23,15 @@ const manifest = {
"./routes/[...slug].tsx": $_slug_,
"./routes/_404.tsx": $_404,
"./routes/_layout.tsx": $_layout,
"./routes/_middleware.ts": $_middleware,
"./routes/about.tsx": $about,
"./routes/api/test/finsh.ts": $api_test_finsh,
"./routes/group/[slug].tsx": $group_slug_,
"./routes/index.tsx": $index,
},
islands: {
"./islands/Editor.tsx": $Editor,
"./islands/ProgressBar.tsx": $ProgressBar,
"./islands/ProgressCheck.tsx": $ProgressCheck,
"./islands/ProgressSection.tsx": $ProgressSection,
"./islands/ThemeToggle.tsx": $ThemeToggle,
"./islands/Toast.tsx": $Toast,
"./islands/signals/store.ts": $signals_store,
Expand Down
53 changes: 22 additions & 31 deletions islands/Editor.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { useEffect, useState } from "preact/hooks";
import { useToast } from "./useToast.ts";

import { newPassSignal } from "./signals/store.ts"
interface EditorProps {
preCode: string;
testingCode: string;
Expand Down Expand Up @@ -36,7 +36,7 @@ export default function Editor(props: EditorProps) {
window.editor.setValue("");
setOutput("");
}
async function handleCodeTest() {
function handleCodeTest() {
setTesting(true);
const code: string = window.editor.getValue() || "";
if (props.testingCode === "") {
Expand All @@ -49,7 +49,6 @@ export default function Editor(props: EditorProps) {
setTesting(false);
return;
}

// deno-lint-ignore prefer-const
let isPass = false;
// deno-lint-ignore prefer-const
Expand All @@ -58,40 +57,32 @@ export default function Editor(props: EditorProps) {
eval(props.testingCode);
if (isPass) {
let courseSlug: string;
// THIS FOR DEV MODE ONLY IT WILL BE REMOVED IN PRODUCTION
// if (props.slug.includes("/")) {
// courseSlug = props.slug.split("/")[0] + "\\" + props.slug.split("/")[1]
// } else {
// courseSlug = props.slug;
// }
courseSlug = props.slug;
const res = await fetch("/api/test/finsh", {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({
courseslug: courseSlug,
}),
});
if (!res.ok) {
showToast({
msg: "لم يتم تسجيل الاختبارات",
type: "error",
});
setTesting(false);
return;
const passedCourses = localStorage.getItem("passedCourses");
// check if there are a value in the local storage
if (passedCourses) {
const passedCoursesArray = JSON.parse(passedCourses);
// check if the course is already passed if not add it to the array and if yes do nothing
if (!passedCoursesArray.includes(courseSlug)) {
passedCoursesArray.push(courseSlug);
localStorage.setItem(
"passedCourses",
JSON.stringify(passedCoursesArray),
);
}
} else {
showToast({
msg: "تم تجاوز الاختبارات بنجاح",
type: "success",
});
localStorage.setItem("passedCourses", JSON.stringify([courseSlug]));
}
showToast({
msg: "تم تجاوز الاختبارات بنجاح",
type: "success",
});
newPassSignal.value = newPassSignal.value + 1;
setTesting(false);
return;
} else {
showToast({
msg: msg,
msg,
type: "error",
});
setTesting(false);
Expand Down Expand Up @@ -178,7 +169,7 @@ export default function Editor(props: EditorProps) {
className={" bg-base-300 overflow-y-scroll rounded-box p-4 mb-2 grow " +
(isError ? "text-error" : "")}
>
{output}
{output}
</pre>
</div>
</>
Expand Down
File renamed without changes.
20 changes: 20 additions & 0 deletions islands/ProgressCheck.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import IconCircleCheckFilled from "https://deno.land/x/[email protected]/tsx/circle-check-filled.tsx";
import IconCircle from "https://deno.land/x/[email protected]/tsx/circle.tsx";
import { useEffect, useState } from "preact/hooks";
import { newPassSignal } from "./signals/store.ts";
export default function ProgressCheck(props: {slug : string}) {
const [isPassed, setIsPassed] = useState<boolean>(false);
useEffect(() => {
const passedTEXT = localStorage.getItem("passedCourses");
let passed: string[] = [];
if (passedTEXT) {
passed = JSON.parse(passedTEXT);
}
if (passed.includes(props.slug.replace("\\", "/"))) {
setIsPassed(true);
}
}, [newPassSignal.value]);
return isPassed
? <IconCircleCheckFilled aria-hidden="true" class="h-4 w-4" />
: <IconCircle aria-hidden="true" class="h-4 w-4" />;
}
24 changes: 24 additions & 0 deletions islands/ProgressSection.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import { useEffect, useState } from "preact/hooks";
import ProgressBar from "./ProgressBar.tsx";

export default function ProgressSection(
props: { total: number; className?: string },
) {
const [completed, setCompleted] = useState(0);
useEffect(() => {
const passedTEXT = localStorage.getItem("passedCourses");
let passed: string[] = [];
if (passedTEXT) {
passed = JSON.parse(passedTEXT);
}
setCompleted(passed.length);
}, []);
return (
<div class={"flex-col py-2 " + props?.className}>
<h2 className="text-xl font-bold pb-2">تقدمك في إنجاز الدروس</h2>
<ProgressBar
progress={Math.floor((completed / props.total) * 100)}
/>
</div>
);
}
3 changes: 2 additions & 1 deletion islands/signals/store.ts
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
import { signal } from "@preact/signals";
export const ToastSignal = signal({ show: false, message: "", type: "" });
export const ToastSignal = signal({ show: false, message: "", type: "" });
export const newPassSignal = signal(0);
6 changes: 1 addition & 5 deletions routes/_layout.tsx
Original file line number Diff line number Diff line change
@@ -1,14 +1,10 @@
import { FreshContext, Handlers, type PageProps } from "$fresh/server.ts";
import { getCookies } from "$std/http/mod.ts";
import NavBar from "../components/Nav.tsx";
import Toast from "../islands/Toast.tsx";
import { getStudent } from "../utils/KV.ts";
import { populateCache } from "../utils/course-cache.ts";

populateCache();
export default async function Layout(req: Request, ctx: FreshContext) {
const session = getCookies(req.headers)["sessionId"] ?? "";
const completed = (await getStudent(session))?.completedCourses ?? [];
return (
// Don't delete data-theme="dracula", used for defult theme and styles
<html dir="rtl" lang="ar" data-theme="dracula">
Expand All @@ -30,7 +26,7 @@ export default async function Layout(req: Request, ctx: FreshContext) {
</head>
<body>
<div class="h-screen">
<NavBar completed={completed} />
<NavBar />
<ctx.Component />
<Toast />
</div>
Expand Down
24 changes: 0 additions & 24 deletions routes/_middleware.ts

This file was deleted.

Loading