Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
85 commits
Select commit Hold shift + click to select a range
15eaf05
Add login page
karreemm Oct 26, 2025
54e8b9d
Add Register Route
karreemm Oct 29, 2025
71139ba
update the toast close icon dir to match the selected lang
karreemm Oct 30, 2025
990a9d0
update the context code
karreemm Oct 30, 2025
e3bc1ab
Update the Setup and the Folder Stracture
karreemm Nov 4, 2025
0e7f718
Add Remember me checkbox
karreemm Nov 4, 2025
94f9aa0
Regestiration Integration Almost DONE ^_^
karreemm Nov 10, 2025
f5d4fd4
Update README.md
karreemm Nov 10, 2025
ec4e173
remove unwanted code from the API Client
karreemm Nov 11, 2025
b907a25
Merge branch 'Sprint01-registeration-Integration' of https://github.c…
karreemm Nov 11, 2025
78cf485
Enhance the calender component
karreemm Nov 11, 2025
28a1de0
Fix a issue issue with the phone updating
karreemm Nov 12, 2025
04340f9
refactor type files and add a common type folder
karreemm Nov 12, 2025
acb366f
fix remember me checkbox issue
karreemm Nov 12, 2025
5ababd3
remove unwanted code
karreemm Nov 12, 2025
de5c4f1
Add middleware layer to protect the routes
karreemm Nov 27, 2025
a85cfb7
Add Navbar with the new brand name
karreemm Nov 30, 2025
431358c
refactor some code, add the Footer, edit the layout.
karreemm Dec 9, 2025
3fb7fca
update website metadata
karreemm Dec 13, 2025
d15d84b
code Refactoring and Engance dual lang system to be more stable
karreemm Jan 27, 2026
06297c0
Fix translation issues
karreemm Jan 27, 2026
2943c8f
enhance fille stracture
karreemm Jan 27, 2026
fc4ac6e
Implement user profile picture upload and deletion functionality
karreemm Jan 27, 2026
61b8c7e
Fix Auth bug
karreemm Jan 29, 2026
b74b630
finalize super admin locales and add skeleton components
karreemm Jan 29, 2026
0a97476
fix refresh token issues
karreemm Jan 29, 2026
0bdf55f
fix logout issues
karreemm Jan 30, 2026
90af343
Add Doctor Signup
karreemm Jan 30, 2026
d503d62
fix small UI issue in doctor signup
karreemm Jan 30, 2026
a0158a8
refactor FileUploadField to improve file handling and simplify click …
karreemm Jan 30, 2026
fac2d78
Add initial Home page
karreemm Jan 30, 2026
b5ee79e
fix responsive issues and add expansion toggler to the sidebar
karreemm Jan 30, 2026
6ed4c42
Implement admin dashboard with doctors management features and locali…
salahmohamed03 Jan 30, 2026
81f4d3b
Merge branch 'doctor-account' into dev
karreemm Jan 30, 2026
d1c9674
Refactor translation system
karreemm Feb 1, 2026
495d246
show doctor certificates in the doctor details card
karreemm Feb 1, 2026
aa9358a
add doctor certificates to be shown into the admin dashboard
karreemm Feb 1, 2026
f4bc39e
Update branding to HoloCura
karreemm Feb 2, 2026
6bb4168
Implement Doctor dashboard intially
karreemm Feb 5, 2026
1b81edd
Add doctor vacation - FIRST VERSION
karreemm Feb 7, 2026
a24a816
add clinics tab into the superadmin dashboard
karreemm Feb 7, 2026
4db5226
Add clinic tab with verification mechanism to the admin dashboard
karreemm Feb 7, 2026
4c02891
enhance admin doctor confirmation
karreemm Feb 7, 2026
57388c8
fix translation bug into the superadmin dashboard
karreemm Feb 7, 2026
1b189aa
Enhance Vacation UI and functionality
karreemm Feb 8, 2026
7791d2a
Merge branch 'doctor-account' into dev
karreemm Feb 8, 2026
b743f1e
fix schedule bug
karreemm Feb 8, 2026
1874fca
fix schedule bug into schedule tab
karreemm Feb 8, 2026
a3364ee
Merge branch 'dev' into doctor-account
karreemm Feb 8, 2026
72335a9
add image cropping feature to the image uploader
karreemm Feb 8, 2026
a664245
Add Clinics page
karreemm Feb 10, 2026
edb719a
feat: add update profile and change password functionality and Develo…
karreemm Feb 12, 2026
7772428
Add breadcrumbs to the sidebar and include the photo_url in the login…
karreemm Feb 12, 2026
8c06643
Finalize first version of the patient account
karreemm Feb 14, 2026
192ada7
feat: interactive background
salahmohamed03 Feb 17, 2026
62613c3
refact: remove debrecated syntax
salahmohamed03 Feb 17, 2026
f089ba2
Interactive background (#1)
salahmohamed03 Feb 19, 2026
2d2eecd
fix resizing canva
salahmohamed03 Feb 19, 2026
39d9cde
Merge branch 'interactive-background' into dev
salahmohamed03 Feb 19, 2026
62ff4ad
enhance appointment functionality
karreemm Feb 26, 2026
8ed8d11
Merge branch 'patient-account' into dev
karreemm Feb 26, 2026
4ce2d6b
Add join as a nurse
karreemm Feb 26, 2026
f150e53
Add nurse Dashboard
karreemm Feb 26, 2026
3ca21d6
finalize nures feature
karreemm Mar 5, 2026
ce0962c
add availability_type to DoctorJoinForm validation schema
salahmohamed03 Mar 5, 2026
d80c4f3
Merge branch 'nurse-account' into dev
karreemm Mar 6, 2026
66675c4
socket.io init
karreemm Mar 7, 2026
f758342
enhance admin and superadmin dashboards
karreemm Mar 7, 2026
b613ed4
enhance admin and superadmin components
karreemm Mar 7, 2026
9ce4a80
enhance today appointment card
karreemm Mar 7, 2026
5c31e14
add the nurses tab into doctor dashboard
karreemm Mar 8, 2026
1c7c079
enhance nurses table layout in doctor dashboard
karreemm Mar 8, 2026
d4cc81e
Add logs for socket init
karreemm Mar 13, 2026
944d3fc
First version of the meeting feature
karreemm Mar 15, 2026
970bae3
Add medical history tab for the patient
karreemm Mar 20, 2026
624c26b
Fix agora static import issue
karreemm Mar 20, 2026
8330689
Enhance medical record UI
karreemm Mar 21, 2026
48fba91
Enhance Medical history UI
karreemm Mar 21, 2026
4c2ee97
Enhance settings route
karreemm Mar 21, 2026
15c032b
enhance queue card UI and add dummy data for the nurse
karreemm Mar 23, 2026
7d9c2b2
Remove auto-update from axios package
karreemm Apr 19, 2026
098d9ae
Enhance online coslutation workflow and cover some edge cases
karreemm Apr 24, 2026
e0ad4f5
Fix time issues due to zone convertion
karreemm Jun 28, 2026
0459715
Fix SOAP analysis CORS issue
karreemm Jun 30, 2026
5de0b68
enhance translation keys for SOAP
karreemm Jun 30, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
6 changes: 6 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -39,3 +39,9 @@ yarn-error.log*
# typescript
*.tsbuildinfo
next-env.d.ts

# Swagger Files
.yaml
.yml
swagger-output.json

2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1 +1 @@
GP Frontend
# GP Frontend
20 changes: 20 additions & 0 deletions app/(pages)/(admins)/admin-dashboard/clinics/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
"use client";

import { Sidebar } from "@/components/layout/Sidebar";
import { ClinicListContainer } from "@/features/admins/admin";
import { Shield } from "lucide-react";
import { navigationItems } from "@/constants/AdminNavigationItems";

export default function ClinicsPage() {
return (
<Sidebar
titleNameKey="admin"
titleIcon={Shield}
navigationItems={navigationItems}
translationNamespace="admin"
dashboardHref="/admin-dashboard"
>
<ClinicListContainer />
</Sidebar>
);
}
20 changes: 20 additions & 0 deletions app/(pages)/(admins)/admin-dashboard/doctors/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
"use client";

import { Sidebar } from "@/components/layout/Sidebar";
import { Users } from "lucide-react";
import { navigationItems } from "@/constants/AdminNavigationItems";
import { DoctorListContainer } from "@/features/admins/admin/components/doctors/DoctorListContainer";

export default function AdminDashboardPage() {
return (
<Sidebar
titleNameKey="admin"
titleIcon={Users}
navigationItems={navigationItems}
translationNamespace="admin"
dashboardHref="/admin-dashboard"
>
<DoctorListContainer />
</Sidebar>
);
}
20 changes: 20 additions & 0 deletions app/(pages)/(admins)/admin-dashboard/nurses/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
"use client";

import { Sidebar } from "@/components/layout/Sidebar";
import { Users } from "lucide-react";
import { navigationItems } from "@/constants/AdminNavigationItems";
import { NurseListContainer } from "@/features/admins/admin/components/nurses/NurseListContainer";

export default function AdminNursesPage() {
return (
<Sidebar
titleNameKey="admin"
titleIcon={Users}
navigationItems={navigationItems}
translationNamespace="admin"
dashboardHref="/admin-dashboard"
>
<NurseListContainer />
</Sidebar>
);
}
20 changes: 20 additions & 0 deletions app/(pages)/(admins)/admin-dashboard/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
"use client";

import { Sidebar } from "@/components/layout/Sidebar";
import { Users } from "lucide-react";
import { navigationItems } from "@/constants/AdminNavigationItems";
import { DashboardContainer } from "@/features/admins/admin/components/dashboard/DashboardContainer";

export default function AdminDashboardPage() {
return (
<Sidebar
titleNameKey="admin"
titleIcon={Users}
navigationItems={navigationItems}
translationNamespace="admin"
dashboardHref="/admin-dashboard"
>
<DashboardContainer />
</Sidebar>
);
}
21 changes: 21 additions & 0 deletions app/(pages)/(admins)/superadmin-dashboard/admins/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
"use client";

import { Sidebar } from "@/components/layout/Sidebar";
import { AdminListContainer } from "@/features/admins/super-admin";
import { Users} from "lucide-react";
import { navigationItems } from "@/constants/superAdminNavigationItems";

export default function AdminsPage() {

return (
<Sidebar
titleNameKey="superAdmin"
titleIcon={Users}
navigationItems={navigationItems}
translationNamespace="superAdmin"
dashboardHref="/superadmin-dashboard"
>
<AdminListContainer />
</Sidebar>
);
}
20 changes: 20 additions & 0 deletions app/(pages)/(admins)/superadmin-dashboard/clinics/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
"use client";

import { Sidebar } from "@/components/layout/Sidebar";
import { ClinicListContainer } from "@/features/admins/super-admin";
import { Users } from "lucide-react";
import { navigationItems } from "@/constants/superAdminNavigationItems";

export default function ClinicsPage() {
return (
<Sidebar
titleNameKey="superAdmin"
titleIcon={Users}
navigationItems={navigationItems}
translationNamespace="superAdmin"
dashboardHref="/superadmin-dashboard"
>
<ClinicListContainer />
</Sidebar>
);
}
21 changes: 21 additions & 0 deletions app/(pages)/(admins)/superadmin-dashboard/doctors/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
"use client";

import { Sidebar } from "@/components/layout/Sidebar";
import { DoctorListContainer } from "@/features/admins/super-admin";
import { Users } from "lucide-react";
import { navigationItems } from "@/constants/superAdminNavigationItems";

export default function DoctorsPage() {

return (
<Sidebar
titleNameKey="superAdmin"
titleIcon={Users}
navigationItems={navigationItems}
translationNamespace="superAdmin"
dashboardHref="/superadmin-dashboard"
>
<DoctorListContainer />
</Sidebar>
);
}
20 changes: 20 additions & 0 deletions app/(pages)/(admins)/superadmin-dashboard/nurses/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
"use client";

import { Sidebar } from "@/components/layout/Sidebar";
import { Users } from "lucide-react";
import { navigationItems } from "@/constants/superAdminNavigationItems";
import { NurseListContainer } from "@/features/admins/super-admin/components/nurse/NurseListContainer";

export default function SuperAdminNursesPage() {
return (
<Sidebar
titleNameKey="superAdmin"
titleIcon={Users}
navigationItems={navigationItems}
translationNamespace="superAdmin"
dashboardHref="/superadmin-dashboard"
>
<NurseListContainer />
</Sidebar>
);
}
20 changes: 20 additions & 0 deletions app/(pages)/(admins)/superadmin-dashboard/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
"use client";

import { Sidebar } from "@/components/layout/Sidebar";
import { Users } from "lucide-react";
import { navigationItems } from "@/constants/superAdminNavigationItems";
import { DashboardContainer } from "@/features/admins/super-admin/components/dashboard/DashboardContainer";

export default function SuperAdminDashboardPage() {
return (
<Sidebar
titleNameKey="superAdmin"
titleIcon={Users}
navigationItems={navigationItems}
translationNamespace="superAdmin"
dashboardHref="/superadmin-dashboard"
>
<DashboardContainer />
</Sidebar>
);
}
76 changes: 76 additions & 0 deletions app/(pages)/(auth)/complete-profile/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
"use client";

import { CompleteProfileContainer } from "@/features/auth/complete-profile/components/CompleteProfileContainer";
import { CompleteProfilePresentational } from "@/features/auth/complete-profile/components/CompleteProfilePresentational";
import { useEffect, useState } from "react";
import { useAuthFlowStore } from "@/stores/useAuthFlowStore";
import { useAuthSync } from "@/hooks/useAuthSync";
import { getCurrentUser } from "@/features/dashboards/dashboard/api/dashboard.api";

export default function CompleteProfilePage() {
const [isLoading, setIsLoading] = useState(true);
const signupMethod = useAuthFlowStore((state) => state.signupMethod);
const { user, updateAuthState } = useAuthSync();

useEffect(() => {
const initializeUser = async () => {
const cookies = document.cookie;
const hasAuthCookie =
cookies.includes("Authorization=") || cookies.includes("RefreshToken=");
const hasUserStateCookie = cookies.includes("UserState=");

if (hasAuthCookie && !hasUserStateCookie) {
try {
const userData = await getCurrentUser();
updateAuthState(userData);

setTimeout(() => {
window.location.reload();
}, 100);
return;
} catch (error) {
console.error("Failed:", error);
}
}

if (!user || !user.email) {
try {
const userData = await getCurrentUser();
updateAuthState(userData);

setTimeout(() => {
const cookies = document.cookie.split(";");
const userStateCookie = cookies.find((c) =>
c.trim().startsWith("UserState="),
);
console.log("🍪 UserState cookie:", userStateCookie);
}, 50);
} catch (error) {
console.error("Failed:", error);
}
}
setIsLoading(false);
};

initializeUser();
}, [user, updateAuthState]);

if (isLoading) {
return (
<div className="flex min-h-screen items-center justify-center">
<div className="h-8 w-8 animate-spin rounded-full border-4 border-primary border-t-transparent" />
</div>
);
}

const requirePhone = signupMethod === "google" || !user?.phone;

return (
<CompleteProfileContainer
userPhone={user?.phone || null}
requirePhone={requirePhone}
>
{(props) => <CompleteProfilePresentational {...props} />}
</CompleteProfileContainer>
);
}
14 changes: 14 additions & 0 deletions app/(pages)/(auth)/forgot-password/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
"use client";

import {
ForgotPasswordContainer,
ForgotPasswordPresentational,
} from "@/features/auth/password";

export default function ForgotPasswordPage() {
return (
<ForgotPasswordContainer>
{(props) => <ForgotPasswordPresentational {...props} />}
</ForgotPasswordContainer>
);
}
39 changes: 39 additions & 0 deletions app/(pages)/(auth)/google-callback/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
"use client";

import { useEffect } from "react";
import { useRouter } from "next/navigation";
import { getCurrentUser } from "@/features/dashboards/dashboard/api/dashboard.api";
import { useAuthSync } from "@/hooks/useAuthSync";

export default function GoogleCallbackPage() {
const router = useRouter();
const { updateAuthState } = useAuthSync();

useEffect(() => {
const handleGoogleCallback = async () => {
try {
const userData = await getCurrentUser();
updateAuthState(userData);

await new Promise((resolve) => setTimeout(resolve, 100));

window.location.href = "/complete-profile";
} catch (error) {
console.error("Failed:", error);
router.push("/login");
}
};

handleGoogleCallback();
}, [router, updateAuthState]);

return (
<div className="flex min-h-screen items-center justify-center">
<div className="text-center">
<div className="mb-4 h-12 w-12 animate-spin rounded-full border-4 border-primary border-t-transparent mx-auto"></div>
<p className="text-lg font-medium">Completing Google Sign In...</p>
<p className="text-sm text-muted-foreground mt-2">Please wait...</p>
</div>
</div>
);
}
35 changes: 35 additions & 0 deletions app/(pages)/(auth)/login/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
"use client";

import { useEffect } from "react";
import { LoginContainer } from "@/features/auth/login/components/LoginContainer";
import { LoginPresentational } from "@/features/auth/login/components/LoginPresentational";
import { useUserStore } from "@/stores/useUserStore";

export default function LoginPage() {

const clearUser = useUserStore((state) => state.clearUser);

useEffect(() => {
const userStorage = localStorage.getItem('user-storage');
if (userStorage) {
try {
const parsed = JSON.parse(userStorage);
if (parsed?.state?.user) {
localStorage.removeItem('user-storage');
document.cookie = "UserState=; path=/; expires=Thu, 01 Jan 1970 00:00:00 GMT";
clearUser();
}
} catch (error) {
console.error("Error parsing user storage:", error);
}
}
}, [clearUser]);

return (
<>
<LoginContainer>
{(props) => <LoginPresentational {...props} />}
</LoginContainer>
</>
);
}
12 changes: 12 additions & 0 deletions app/(pages)/(auth)/register/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
"use client";

import { RegisterContainer } from "@/features/auth/register/components/RegisterContainer";
import { RegisterPresentational } from "@/features/auth/register/components/RegisterPresentational";

export default function RegisterPage() {
return (
<RegisterContainer>
{(props) => <RegisterPresentational {...props} />}
</RegisterContainer>
);
}
Loading
Loading