diff --git a/apps/sale/features/tutor-profile/components/TutorOwnProfileScreen.tsx b/apps/sale/features/tutor-profile/components/TutorOwnProfileScreen.tsx
new file mode 100644
index 0000000..c380373
--- /dev/null
+++ b/apps/sale/features/tutor-profile/components/TutorOwnProfileScreen.tsx
@@ -0,0 +1,91 @@
+import Link from "next/link";
+import { Pencil } from "lucide-react";
+import { Button } from "@workspace/ui/components/ui/button";
+import { mockTutorProfile } from "../types/mockTutorProfile";
+import { TutorBioSection } from "./TutorBioSection";
+import { TutorCertificates } from "./TutorCertificates";
+import { TutorEducationAchievements } from "./TutorEducationAchievements";
+import { TutorFeedback } from "./TutorFeedback";
+import { TutorHero } from "./TutorHero";
+import { TutorIntroVideo } from "./TutorIntroVideo";
+import { TutorTeachingHistory } from "./TutorTeachingHistory";
+import { TutorTeachingMethods } from "./TutorTeachingMethods";
+
+function TutorOwnProfileSummary() {
+ return (
+
+ );
+}
+
+export function TutorOwnProfileScreen() {
+ return (
+
+
+
+
Hồ sơ gia sư
+
+ Hồ sơ của tôi
+
+
+ Đây là nội dung đang được hiển thị với học viên trên BeeWise.
+
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/apps/sale/features/tutor-profile/types/mockTutorProfile.ts b/apps/sale/features/tutor-profile/types/mockTutorProfile.ts
index 4da9097..41ea8dc 100644
--- a/apps/sale/features/tutor-profile/types/mockTutorProfile.ts
+++ b/apps/sale/features/tutor-profile/types/mockTutorProfile.ts
@@ -24,7 +24,8 @@ export interface TeachingHistoryItem {
export interface CertificateItem {
title: string;
type: string;
- status: string;
+ imageUrl?: string;
+ status?: string;
description: string;
}
@@ -32,6 +33,7 @@ export interface TutorProfileData {
id: string;
displayName: string;
avatarUrl: string;
+ videoUrl?: string;
headline: string;
shortIntro: string;
university: string;
@@ -62,6 +64,7 @@ export const mockTutorProfile: TutorProfileData = {
id: "nguyen-minh-anh",
displayName: "Nguyễn Minh Anh",
avatarUrl: "/images/Tutor/1.png",
+ videoUrl: "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
headline: "Gia sư Toán lớp 6-12, tập trung nền tảng và sự tự tin khi làm bài",
shortIntro:
"Giúp học sinh hiểu bản chất, sửa lỗi sai thường gặp và có lộ trình ôn tập rõ ràng sau mỗi buổi học.",
@@ -75,7 +78,7 @@ export const mockTutorProfile: TutorProfileData = {
onlineStatus: "Đang nhận học sinh mới",
subjects: ["Toán 6-9", "Toán 10-12"],
specializations: ["Củng cố mất gốc", "Luyện thi vào 10"],
- teachingModes: ["Online", "Tại nhà"],
+ teachingModes: ["Online & tại nhà"],
area: "Thủ Đức, TP. Hồ Chí Minh",
hourlyRate: "120.000đ/giờ",
availability: [
@@ -134,24 +137,28 @@ export const mockTutorProfile: TutorProfileData = {
{
title: "Thông tin sinh viên",
type: "Xác minh học vấn",
+ imageUrl: "/images/certs/1.png",
status: "Đã xác minh",
description: "BeeWise đã kiểm tra trạng thái học tập ở mức công khai.",
},
{
title: "Thành tích Toán học",
type: "Minh chứng thành tích",
- status: "Đã duyệt",
+ imageUrl: "/images/certs/2.png",
+ status: "Đã xác minh",
description: "Tóm tắt thành tích học thuật, không hiển thị tài liệu gốc.",
},
{
title: "Kết quả học tập",
type: "Tóm tắt học tập",
- status: "Đã duyệt",
+ imageUrl: "/images/certs/3.png",
+ status: "Đã rà soát",
description: "Thông tin học tập được trình bày ở dạng an toàn công khai.",
},
{
title: "Kinh nghiệm gia sư",
type: "Xác nhận hoạt động",
+ imageUrl: "/images/certs/4.png",
status: "Đã duyệt",
description: "Hoạt động giảng dạy được rà soát và tóm tắt ngắn gọn.",
},
diff --git a/apps/sale/next.config.ts b/apps/sale/next.config.ts
index a9bd400..b57985b 100644
--- a/apps/sale/next.config.ts
+++ b/apps/sale/next.config.ts
@@ -17,6 +17,26 @@ const nextConfig: NextConfig = {
protocol: "https",
hostname: "res.cloudinary.com",
},
+ {
+ protocol: "https",
+ hostname: "demo.invalid",
+ },
+ {
+ protocol: "https",
+ hostname: "images.unsplash.com",
+ },
+ {
+ protocol: "https",
+ hostname: "lh3.googleusercontent.com",
+ },
+ {
+ protocol: "https",
+ hostname: "avatars.githubusercontent.com",
+ },
+ {
+ protocol: "https",
+ hostname: "api.dicebear.com",
+ },
],
},
async rewrites() {
diff --git a/apps/staff/features/auth/components/AuthLayout.tsx b/apps/staff/features/auth/components/AuthLayout.tsx
index 601ac91..767de35 100644
--- a/apps/staff/features/auth/components/AuthLayout.tsx
+++ b/apps/staff/features/auth/components/AuthLayout.tsx
@@ -20,22 +20,6 @@ export function AuthLayout({ children }: AuthLayoutProps) {
=6.9.0"
}
},
- "node_modules/@emnapi/wasi-threads": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.3.tgz",
- "integrity": "sha512-ELEBe8PsLvvJ6QMr0zLt8ffvOHW/dc1m3CEzNMg7aJUv3bMaoDtw2TXyDAwkYBuroxxuHEwhRTLJSe5sya547g==",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "tslib": "^2.4.0"
- }
- },
"node_modules/@eslint-community/eslint-utils": {
"version": "4.9.1",
"resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz",
@@ -3307,6 +3296,51 @@
"node": ">=14.0.0"
}
},
+ "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/wasi-threads": {
+ "version": "1.2.2",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@napi-rs/wasm-runtime": {
+ "version": "1.1.4",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@tybys/wasm-util": "^0.10.1"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/Brooooooklyn"
+ },
+ "peerDependencies": {
+ "@emnapi/core": "^1.7.1",
+ "@emnapi/runtime": "^1.7.1"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@tybys/wasm-util": {
+ "version": "0.10.2",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/tslib": {
+ "version": "2.8.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "0BSD",
+ "optional": true
+ },
"node_modules/@tailwindcss/oxide-win32-arm64-msvc": {
"version": "4.3.2",
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.3.2.tgz",
diff --git a/packages/core/configs/navbar.ts b/packages/core/configs/navbar.ts
index 957ff58..8100c3b 100644
--- a/packages/core/configs/navbar.ts
+++ b/packages/core/configs/navbar.ts
@@ -102,15 +102,17 @@ export function resolveNavbarState({
}
const guestMenu: NavbarItem[] = [
- { label: "Gia sư", href: "/tutors" },
- { label: "Cộng đồng", href: "/community" },
+ { label: "Gia sư 1:1", href: "/tutors" },
+ { label: "Tìm lớp", href: "/classes" },
+ // { label: "Cộng đồng", href: "/community" },
{ label: "Trở thành gia sư", href: "/tutor-guide" },
{ label: "Về chúng tôi", href: "/about-us" },
];
const learnerMenu: NavbarItem[] = [
{ label: "Tìm gia sư", href: "/tutors" },
- { label: "Cộng đồng", href: "/community" },
+ { label: "Tìm lớp", href: "/classes" },
+ // { label: "Cộng đồng", href: "/community" },
{ label: "Tin nhắn", href: "/learner/messages", badgeKey: "unreadChatCount" },
{ label: "Lịch sử kết nối", href: "/connections" },
{ label: "Gia sư yêu thích", href: "/favorite-tutors" },
@@ -122,7 +124,7 @@ const tutorOnboardingMenu: NavbarItem[] = [
const tutorApprovedMenu: NavbarItem[] = [
{ label: "Trang chủ", href: "/tutor/home" },
- { label: "Cộng đồng", href: "/community" },
+ // { label: "Cộng đồng", href: "/community" },
{ label: "Hồ sơ của tôi", href: "/tutor/profile" },
{ label: "Tin nhắn", href: "/tutor/messages", badgeKey: "unreadChatCount" },
{ label: "Lịch rảnh", href: "/tutor/availability" },
diff --git a/packages/core/configs/navigation.ts b/packages/core/configs/navigation.ts
index a9ca3f2..1e91650 100644
--- a/packages/core/configs/navigation.ts
+++ b/packages/core/configs/navigation.ts
@@ -18,6 +18,7 @@ import {
Receipt,
LucideIcon,
NotebookPen,
+ UsersRound,
} from "lucide-react";
export interface NavItem {
@@ -94,7 +95,7 @@ export const navigationConfig: RoleNavigation = {
groupName: "Tổng Quan",
items: [
{
- title: "Dashboard",
+ title: "Tổng Quan",
url: "/lms/tutor/dashboard",
icon: LayoutDashboard,
},
@@ -155,6 +156,11 @@ export const navigationConfig: RoleNavigation = {
url: "/consultant/workspace",
icon: MessageCircle,
},
+ {
+ title: "Yêu Cầu Kết Nối",
+ url: "/consultant/connection-requests",
+ icon: UsersRound,
+ },
],
},
{
diff --git a/packages/ui/components/layout/Header.tsx b/packages/ui/components/layout/Header.tsx
index b487464..ce35023 100644
--- a/packages/ui/components/layout/Header.tsx
+++ b/packages/ui/components/layout/Header.tsx
@@ -63,7 +63,9 @@ export function Header({
const storeIsAuthenticated = useAuthStore((state) => state.isAuthenticated);
const storeIsAuthLoading = useAuthStore((state) => state.isAuthLoading);
const openDrawer = useNotificationDrawerStore((state) => state.openDrawer);
- const drawerUnreadCount = useNotificationDrawerStore((state) => state.unreadCount);
+ const drawerUnreadCount = useNotificationDrawerStore(
+ (state) => state.unreadCount,
+ );
const { mutate: logout } = useLogout();
const user = previewUser !== undefined ? previewUser : storeUser;
const isAuthenticated =
@@ -86,7 +88,7 @@ export function Header({
: user?.lmsAccessEnabled === true;
const unreadNotificationCount = Math.max(
0,
- drawerUnreadCount || (user?.unreadNotificationCount ?? 0)
+ drawerUnreadCount || (user?.unreadNotificationCount ?? 0),
);
const unreadChatCount = Math.max(0, user?.unreadChatCount ?? 0);
const displayName = getDisplayName(user);
@@ -213,7 +215,7 @@ export function Header({
/>
- Cộng Đồng Gia Sư Beewise
+ {isAuthenticated ? "BeeWise" : "Cộng Đồng Gia Sư Beewise"}
@@ -258,7 +260,14 @@ export function Header({
aria-label="Thông báo"
className="relative hidden h-8 w-8 items-center justify-center rounded-full text-white/80 transition-colors hover:bg-white/10 hover:text-accent focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent md:inline-flex"
>
-
0 && "animate-pulse text-accent")} aria-hidden="true" />
+ 0 &&
+ "animate-pulse text-accent",
+ )}
+ aria-hidden="true"
+ />
{unreadNotificationCount > 0 && (
{unreadNotificationCount}