Skip to content
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
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -46,5 +46,8 @@ next-env.d.ts

# Local Materials
.agents-feature-md

# Document
docs


5 changes: 5 additions & 0 deletions apps/lms/app/lms/learner/chat/[conversationId]/loading.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import { LearnerMessagesSkeleton } from "@/features/learner-messages/components/LearnerMessagesSkeleton";

export default function LearnerConversationLoading() {
return <LearnerMessagesSkeleton />;
}
16 changes: 16 additions & 0 deletions apps/lms/app/lms/learner/chat/[conversationId]/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import type { Metadata } from "next";
import { LearnerMessagesScreen } from "@/features/learner-messages/components/LearnerMessagesScreen";

export const metadata: Metadata = {
title: "Cuộc trò chuyện | BeeWise Learner",
description: "Trao đổi với gia sư theo lớp học.",
};

export default async function LearnerConversationPage({
params,
}: {
params: Promise<{ conversationId: string }>;
}) {
const { conversationId } = await params;
return <LearnerMessagesScreen conversationId={conversationId} />;
}
5 changes: 5 additions & 0 deletions apps/lms/app/lms/learner/chat/loading.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import { LearnerMessagesSkeleton } from "@/features/learner-messages/components/LearnerMessagesSkeleton";

export default function LearnerMessagesLoading() {
return <LearnerMessagesSkeleton />;
}
11 changes: 11 additions & 0 deletions apps/lms/app/lms/learner/chat/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import type { Metadata } from "next";
import { LearnerMessagesScreen } from "@/features/learner-messages/components/LearnerMessagesScreen";

export const metadata: Metadata = {
title: "Tin nhắn với gia sư | BeeWise Learner",
description: "Trao đổi với gia sư theo từng lớp học.",
};

export default function LearnerMessagesPage() {
return <LearnerMessagesScreen />;
}
5 changes: 5 additions & 0 deletions apps/lms/app/lms/learner/exercises/[exerciseId]/loading.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import { ExerciseSkeleton } from "@/features/learner-exercises/components/ExerciseSkeleton";

export default function LearnerExerciseLoading() {
return <ExerciseSkeleton />;
}
16 changes: 16 additions & 0 deletions apps/lms/app/lms/learner/exercises/[exerciseId]/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import type { Metadata } from "next";
import { ExerciseWorkspaceScreen } from "@/features/learner-exercises/components/ExerciseWorkspaceScreen";

export const metadata: Metadata = {
title: "Luyện tập | BeeWise Learner",
description: "Làm bài và xem lại lời giải theo từng buổi học.",
};

export default async function LearnerExercisePage({
params,
}: {
params: Promise<{ exerciseId: string }>;
}) {
const { exerciseId } = await params;
return <ExerciseWorkspaceScreen exerciseId={exerciseId} />;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import { ExerciseSkeleton } from "@/features/learner-exercises/components/ExerciseSkeleton";

export default function LearnerExerciseSessionsLoading() {
return <ExerciseSkeleton />;
}
15 changes: 15 additions & 0 deletions apps/lms/app/lms/learner/exercises/classes/[classId]/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import type { Metadata } from "next";
import { ExerciseSessionSelectionScreen } from "@/features/learner-exercises/components/ExerciseSessionSelectionScreen";

export const metadata: Metadata = {
title: "Buổi học | BeeWise Learner",
};

export default async function LearnerExerciseSessionsPage({
params,
}: {
params: Promise<{ classId: string }>;
}) {
const { classId } = await params;
return <ExerciseSessionSelectionScreen classId={classId} />;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import { ExerciseSkeleton } from "@/features/learner-exercises/components/ExerciseSkeleton";

export default function LearnerSessionExercisesLoading() {
return <ExerciseSkeleton />;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import type { Metadata } from "next";
import { ExerciseLibraryScreen } from "@/features/learner-exercises/components/ExerciseLibraryScreen";

export const metadata: Metadata = {
title: "Bài tập buổi học | BeeWise Learner",
};

export default async function LearnerSessionExercisesPage({
params,
}: {
params: Promise<{ classId: string; sessionId: string }>;
}) {
const { classId, sessionId } = await params;
return <ExerciseLibraryScreen classId={classId} sessionId={sessionId} />;
}
5 changes: 5 additions & 0 deletions apps/lms/app/lms/learner/exercises/loading.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import { ExerciseSkeleton } from "@/features/learner-exercises/components/ExerciseSkeleton";

export default function LearnerExercisesLoading() {
return <ExerciseSkeleton />;
}
11 changes: 11 additions & 0 deletions apps/lms/app/lms/learner/exercises/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import type { Metadata } from "next";
import { ExerciseClassSelectionScreen } from "@/features/learner-exercises/components/ExerciseClassSelectionScreen";

export const metadata: Metadata = {
title: "Làm bài tập | BeeWise Learner",
description: "Luyện tập sau buổi học với bài tập từ gia sư.",
};

export default function LearnerExercisesPage() {
return <ExerciseClassSelectionScreen />;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import { LearnerMaterialsSkeleton } from "@/features/learner-materials/components/LearnerMaterialsSkeleton";

export default function LearnerClassMaterialsLoading() {
return <LearnerMaterialsSkeleton />;
}
10 changes: 10 additions & 0 deletions apps/lms/app/lms/learner/materials/classes/[classId]/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import { ClassSessionsScreen } from "@/features/learner-materials/components/ClassSessionsScreen";

export default async function LearnerClassMaterialsPage({
params,
}: {
params: Promise<{ classId: string }>;
}) {
const { classId } = await params;
return <ClassSessionsScreen classId={classId} />;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import { LearnerMaterialsSkeleton } from "@/features/learner-materials/components/LearnerMaterialsSkeleton";

export default function LearnerSessionMaterialsLoading() {
return <LearnerMaterialsSkeleton />;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import { SessionMaterialsScreen } from "@/features/learner-materials/components/SessionMaterialsScreen";

export default async function LearnerSessionMaterialsPage({
params,
}: {
params: Promise<{ classId: string; sessionId: string }>;
}) {
const { classId, sessionId } = await params;
return <SessionMaterialsScreen classId={classId} sessionId={sessionId} />;
}
5 changes: 5 additions & 0 deletions apps/lms/app/lms/learner/materials/loading.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import { LearnerMaterialsSkeleton } from "@/features/learner-materials/components/LearnerMaterialsSkeleton";

export default function LearnerMaterialsLoading() {
return <LearnerMaterialsSkeleton />;
}
9 changes: 9 additions & 0 deletions apps/lms/app/lms/learner/materials/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import { ClassLibraryScreen } from "@/features/learner-materials/components/ClassLibraryScreen";

export const metadata = {
title: "Kho tài liệu | BeeWise Learner",
};

export default function LearnerMaterialsPage() {
return <ClassLibraryScreen />;
}
15 changes: 15 additions & 0 deletions apps/lms/app/lms/learner/schedule/loading.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
function Skeleton({ className }: { className: string }) {
return <div className={`animate-pulse rounded-xl bg-[#DCE8FB]/70 ${className}`} />;
}

export default function LearnerScheduleLoading() {
return (
<div className="min-h-full bg-[#F8FAFC]">
<div className="mx-auto max-w-[1400px] space-y-5 px-4 py-6 sm:px-6 lg:px-8 lg:py-8">
<div className="space-y-3"><Skeleton className="h-9 w-64 max-w-full" /><Skeleton className="h-4 w-[520px] max-w-full" /></div>
<Skeleton className="h-16 w-full rounded-2xl" />
<div className="grid grid-cols-1 gap-5 xl:grid-cols-[minmax(0,1fr)_340px]"><Skeleton className="h-[620px] w-full rounded-2xl" /><Skeleton className="h-[520px] w-full rounded-2xl" /></div>
</div>
</div>
);
}
12 changes: 12 additions & 0 deletions apps/lms/app/lms/learner/schedule/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import type { Metadata } from "next";
import { LearnerScheduleScreen } from "@/features/learner-schedule/components/LearnerScheduleScreen";

export const metadata: Metadata = {
title: "Lịch học của tôi | BeeWise LMS",
description: "Theo dõi lịch học và các buổi học sắp tới trên BeeWise LMS.",
};

export default function LearnerSchedulePage() {
return <LearnerScheduleScreen />;
}

5 changes: 5 additions & 0 deletions apps/lms/app/lms/learner/tuition-fee/[classId]/loading.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import { TuitionFeeSkeleton } from "@/features/learner-tuition-fee/components/TuitionFeeSkeleton";

export default function LearnerTuitionClassLoading() {
return <TuitionFeeSkeleton />;
}
16 changes: 16 additions & 0 deletions apps/lms/app/lms/learner/tuition-fee/[classId]/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import type { Metadata } from "next";
import { TuitionClassDetailScreen } from "@/features/learner-tuition-fee/components/TuitionClassDetailScreen";

export const metadata: Metadata = {
title: "Chi tiết học phí | BeeWise Learner",
description: "Theo dõi phân bổ học phí theo từng buổi học.",
};

export default async function LearnerTuitionClassPage({
params,
}: {
params: Promise<{ classId: string }>;
}) {
const { classId } = await params;
return <TuitionClassDetailScreen classId={classId} />;
}
5 changes: 5 additions & 0 deletions apps/lms/app/lms/learner/tuition-fee/loading.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import { TuitionFeeSkeleton } from "@/features/learner-tuition-fee/components/TuitionFeeSkeleton";

export default function LearnerTuitionFeeLoading() {
return <TuitionFeeSkeleton />;
}
11 changes: 11 additions & 0 deletions apps/lms/app/lms/learner/tuition-fee/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import type { Metadata } from "next";
import { TuitionFeeScreen } from "@/features/learner-tuition-fee/components/TuitionFeeScreen";

export const metadata: Metadata = {
title: "Theo dõi học phí | BeeWise Learner",
description: "Theo dõi học phí đã thanh toán theo lớp học.",
};

export default function LearnerTuitionFeePage() {
return <TuitionFeeScreen />;
}
33 changes: 33 additions & 0 deletions apps/lms/app/lms/tutor/earnings/loading.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
function SkeletonBlock({ className }: { className: string }) {
return <div className={`animate-pulse rounded-xl bg-[#DCE8FB]/70 ${className}`} />;
}

export default function EarningsLoading() {
return (
<div className="min-h-full bg-[#F8FAFC]" aria-label="Đang tải dữ liệu thu nhập">
<div className="mx-auto max-w-[1400px] space-y-5 px-4 py-6 sm:px-6 lg:px-8 lg:py-8">
<div className="space-y-3">
<SkeletonBlock className="h-6 w-52" />
<SkeletonBlock className="h-9 w-72 max-w-full" />
<SkeletonBlock className="h-4 w-[520px] max-w-full" />
</div>
<div className="grid grid-cols-1 gap-3 sm:grid-cols-2 xl:grid-cols-4">
{[0, 1, 2, 3].map((item) => (
<div key={item} className="rounded-2xl border border-border bg-white p-5">
<SkeletonBlock className="h-4 w-28" />
<SkeletonBlock className="mt-4 h-8 w-36" />
<SkeletonBlock className="mt-3 h-3 w-24" />
</div>
))}
</div>
<div className="rounded-2xl border border-border bg-white p-4">
<SkeletonBlock className="h-10 w-full" />
</div>
<div className="grid grid-cols-1 gap-5 xl:grid-cols-[minmax(0,1fr)_340px]">
<SkeletonBlock className="h-[520px] w-full rounded-2xl" />
<SkeletonBlock className="h-[420px] w-full rounded-2xl" />
</div>
</div>
</div>
);
}
12 changes: 12 additions & 0 deletions apps/lms/app/lms/tutor/earnings/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import type { Metadata } from "next";
import { EarningsDashboard } from "@/features/tutor-earnings/components/EarningsDashboard";

export const metadata: Metadata = {
title: "Thu nhập & Thanh toán | BeeWise LMS",
description: "Theo dõi thu nhập và trạng thái quyết toán dành cho gia sư BeeWise.",
};

export default function TutorEarningsPage() {
return <EarningsDashboard />;
}

14 changes: 2 additions & 12 deletions apps/lms/app/lms/tutor/materials/[lessonId]/preview/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,20 +5,10 @@ export const metadata = {
title: "Bản xem trước tài liệu | BeeWise Tutor",
};

// Next.js App Router dynamic route props
interface PageProps {
params: Promise<{ lessonId: string }>;
}

export default async function PreviewPage({ params }: PageProps) {
const resolvedParams = await params;

export default function PreviewPage() {
return (
<div className="container mx-auto p-4 md:p-6 h-full max-h-screen">
<SplitPreview
data={MOCK_AI_RESPONSE}
lessonId={resolvedParams.lessonId}
/>
<SplitPreview data={MOCK_AI_RESPONSE} />
</div>
);
}
15 changes: 15 additions & 0 deletions apps/lms/app/lms/tutor/materials/learner/[learnerId]/loading.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
function Skeleton({ className }: { className: string }) {
return <div className={`animate-pulse rounded-xl bg-[#DCE8FB]/70 ${className}`} />;
}

export default function LearnerMaterialsLoading() {
return (
<div className="min-h-full bg-[#F8FAFC]">
<div className="mx-auto max-w-[1400px] space-y-5 px-4 py-6 sm:px-6 lg:px-8 lg:py-8">
<Skeleton className="h-5 w-40" />
<Skeleton className="h-28 w-full rounded-2xl" />
<div className="grid grid-cols-1 gap-5 xl:grid-cols-[minmax(0,1fr)_350px]"><Skeleton className="h-[520px] w-full rounded-2xl" /><Skeleton className="h-[480px] w-full rounded-2xl" /></div>
</div>
</div>
);
}
16 changes: 16 additions & 0 deletions apps/lms/app/lms/tutor/materials/learner/[learnerId]/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import type { Metadata } from "next";
import { LearnerMaterialsScreen } from "@/features/tutor-materials/components/LearnerMaterialsScreen";

export const metadata: Metadata = {
title: "Thư viện học viên | BeeWise Tutor",
};

interface PageProps {
params: Promise<{ learnerId: string }>;
}

export default async function LearnerMaterialsPage({ params }: PageProps) {
const { learnerId } = await params;
return <LearnerMaterialsScreen learnerId={learnerId} />;
}

18 changes: 18 additions & 0 deletions apps/lms/app/lms/tutor/materials/loading.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
function Skeleton({ className }: { className: string }) {
return <div className={`animate-pulse rounded-xl bg-[#DCE8FB]/70 ${className}`} />;
}

export default function MaterialsLoading() {
return (
<div className="min-h-full bg-[#F8FAFC]">
<div className="mx-auto max-w-[1400px] space-y-5 px-4 py-6 sm:px-6 lg:px-8 lg:py-8">
<div className="space-y-3"><Skeleton className="h-9 w-72 max-w-full" /><Skeleton className="h-4 w-[520px] max-w-full" /></div>
<Skeleton className="h-16 w-full rounded-2xl" />
<div className="rounded-2xl border border-border bg-white p-4">
<Skeleton className="h-7 w-48" />
<div className="mt-5 space-y-3">{[0, 1, 2, 3].map((item) => <Skeleton key={item} className="h-20 w-full" />)}</div>
</div>
</div>
</div>
);
}
9 changes: 2 additions & 7 deletions apps/lms/app/lms/tutor/materials/page.tsx
Original file line number Diff line number Diff line change
@@ -1,14 +1,9 @@
import React from "react";
import { MaterialsTable } from "@/features/tutor-materials/components/MaterialsTable";
import { TutorMaterialsScreen } from "@/features/tutor-materials/components/TutorMaterialsScreen";

export const metadata = {
title: "Quản lý tài liệu | BeeWise Tutor",
};

export default function TutorMaterialsPage() {
return (
<div className="container mx-auto p-1 md:p-2 max-w-6xl">
<MaterialsTable />
</div>
);
return <TutorMaterialsScreen />;
}
Loading
Loading