Repository: ohcnetwork/care_fe
Pull request #11884: Fix: Hide Login Banner on landing page on patient is logged in 
Author: login: AdityaJ2305
Labels: name: needs review
name: Tested
Created: 2025-04-11T20:21:14Z | Merged: 2025-04-15T22:46:20Z

## Proposed Changes

- Fixes #11715
- Hide Login Banner on landing page on patient is logged in 
- Header with button called home redirecting to home page of patient and sign out dropdown 
- Dashboard text to Home

https://github.com/user-attachments/assets/7bdeaf4d-15aa-473e-9cf4-b94258d87e4f
<img width="1437" alt="Screenshot 2025-04-12 at 1 51 02 AM" src="https://github.com/user-attachments/assets/342c0beb-3aef-44d3-b416-f86f13cccc38" />


@ohcnetwork/care-fe-code-reviewers

## Merge Checklist

- [ ] Add specs that demonstrate bug / test a new feature.
- [ ] Update [product documentation](https://docs.ohc.network).
- [x] Ensure that UI text is kept in I18n files.
- [x] Prep screenshot or demo video for changelog entry, and attach it to issue.
- [x] Request for Peer Reviews
- [x] Completion of QA in Mobile Devices
- [x] Completion of QA in Desktop Devices


<!-- This is an auto-generated comment: release notes by coderabbit.ai -->

## Summary by CodeRabbit

- **New Features**
	- Updated the login header button label to clearly direct users to the home section.
	- Enhanced the landing page by introducing dynamic rendering based on user authentication. Authenticated users now see a header with navigation options and a sign-out feature, while visitors are presented with distinct login choices.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->

Linked issue #11715: Landing Page: hide login banner when user is logged in
**Describe the bug**
When logged in as a patient, the Dashboard SVG icon in the sidebar remains visible even when the user is already on the Dashboard page. Clicking this icon not only redirects to the Home page (/) but also logs out the current user, requiring them to log in again to regain access.

**To Reproduce**
Steps to reproduce the behavior :

1.Log in as a patient.
2.Navigate to the Dashboard page.
3.Observe that the Dashboard SVG icon is still visible in the sidebar.
4.Click on the Dashboard SVG icon.
5.Notice that the application redirects to the Home page (/) and the user is logged out, requiring re-authentication.


**Expected behavior**

- The Dashboard SVG icon should be hidden when the user is already on the Dashboard page to prevent redundant navigation options.
- If the icon remains, clicking it should not log out the user or redirect them to the Home page (/) but should either do nothing or refresh the Patient Dashboard.


**Desktop (please complete the following information):**

- OS: Windows 11 Home 
- Browser : chrome 
- Version : 3.0.5 (frontend version)


**Additional context**

- This issue occurs specifically for patients; other user roles may need verification.
- The navigation link for the Dashboard SVG icon may be incorrectly configured, leading to unintended redirection and session termination.
- The Dashboard SVG icon is redundant when already on the Dashboard page and should ideally be hidden to enhance user experience.


---

### 🚨 DO NOT EDIT BELOW THIS LINE 🚨

### Instructions for Requesting Assignment:

To request assignment, please clearly outline your solution and timeline by commenting on the issue using the format below:

**Describe your solution clearly:**

 The issue comprises two main problems:

- The Dashboard SVG icon should be hidden when the user is already on the Dashboard page to prevent unnecessary navigation options.
- The Dashboard SVG icon's navigation link should be corrected to ensure it does not log out the user or redirect to the Home page (/) but instead remains on or refreshes the Patient Dashboard.



**Proposed Solution:**

- Modify the sidebar component to conditionally render the Dashboard SVG icon only when the user is not on the Dashboard page.
- Update the SVG icon's navigation link to correctly point to /patient-dashboard or ensure it does not perform any action if the user is already on the Dashboard page.
- Investigate and address the cause of the session termination when the icon is clicked, ensuring that clicking the icon does not log out the user.
- Conduct thorough testing to confirm that the navigation functions correctly for patients and does not adversely affect other user roles.

**Expected Timeline:**
- End date: 5/3/2025



> 🚨 Your assignment may be unassigned if there is no activity or progress within the stated timeline unless communicated clearly and agreed upon.

Linked issue comments: user: login: DannySoundarajD
created_at: 2025-04-03T17:05:38Z
body: assign me this issue as i am already working on it

author_association: NONE
user: login: Jacobjeevan
created_at: 2025-04-03T17:12:36Z
body: (1) Redirection is fine, that's expected behavior
(2) It doesn't log out the user, just that authenticated state isn't kept track in landing page.

In this case, we would want to hide everything below the search bar section in landing page when user is logged in (check the logic in LoginHeader to detect if user is logged in or not in a public route).

Above only applies for patient user. 

You can use similar logic for detecting a staff login (check AuthUserProvider).
author_association: CONTRIBUTOR
user: login: DannySoundarajD
created_at: 2025-04-04T18:17:42Z
body: Hey the the issues is now resolved

author_association: NONE
user: login: AdityaJ2305
created_at: 2025-04-10T20:49:10Z
body: Hey Team, May I take this up ?
@rithviknishad @Jacobjeevan 
author_association: MEMBER

Diff:
diff --git a/src/components/Common/LoginHeader.tsx b/src/components/Common/LoginHeader.tsx
index 5370b1da8c5..35b59beca9e 100644
--- a/src/components/Common/LoginHeader.tsx
+++ b/src/components/Common/LoginHeader.tsx
@@ -42,7 +42,7 @@ export const LoginHeader = () => {
             className="text-sm font-medium hover:bg-gray-100 px-6"
             onClick={() => navigate("/patient/home")}
           >
-            {t("dashboard")}
+            {t("home")}
           </Button>
           <DropdownMenu>
             <DropdownMenuTrigger asChild>
diff --git a/src/pages/Landing/LandingPage.tsx b/src/pages/Landing/LandingPage.tsx
index 6ab3412e90a..0b45f120088 100644
--- a/src/pages/Landing/LandingPage.tsx
+++ b/src/pages/Landing/LandingPage.tsx
@@ -1,5 +1,6 @@
 import careConfig from "@careConfig";
 import { useQuery } from "@tanstack/react-query";
+import dayjs from "dayjs";
 import { navigate } from "raviger";
 import { useEffect, useRef, useState } from "react";
 import { Trans, useTranslation } from "react-i18next";
@@ -13,9 +14,22 @@ import {
   CommandGroup,
   CommandItem,
 } from "@/components/ui/command";
+import {
+  DropdownMenu,
+  DropdownMenuContent,
+  DropdownMenuItem,
+  DropdownMenuTrigger,
+} from "@/components/ui/dropdown-menu";
+
+import { Avatar } from "@/components/Common/Avatar";
+
+import { usePatientSignOut } from "@/hooks/usePatientSignOut";
+
+import { LocalStorageKeys } from "@/common/constants";
 
 import query from "@/Utils/request/query";
 import { PaginatedResponse } from "@/Utils/request/types";
+import { TokenData } from "@/types/auth/otp";
 import { Organization } from "@/types/organization/organization";
 import organizationApi from "@/types/organization/organizationApi";
 
@@ -27,7 +41,15 @@ export function LandingPage() {
   const [isOpen, setIsOpen] = useState(false);
   const [selectedOrganization, setSelectedOrganization] =
     useState<Organization | null>(null);
+  const signOut = usePatientSignOut();
+  const tokenData: TokenData = JSON.parse(
+    localStorage.getItem(LocalStorageKeys.patientTokenKey) || "{}",
+  );
 
+  const isLoggedIn =
+    tokenData.token &&
+    Object.keys(tokenData).length > 0 &&
+    dayjs(tokenData.createdAt).isAfter(dayjs().subtract(14, "minutes"));
   const { data: organizationsResponse } = useQuery<
     PaginatedResponse<Organization>
   >({
@@ -50,7 +72,6 @@ export function LandingPage() {
     : "unknown";
 
   const inputRef = useRef<HTMLInputElement>(null);
-
   const handleSearchChange = (e: React.ChangeEvent<HTMLInputElement>) => {
     const query = e.target.value;
     setSearchQuery(query);
@@ -104,6 +125,38 @@ export function LandingPage() {
   return (
     <div className="min-h-screen flex flex-col p-5">
       {/* Main Content  */}
+      {isLoggedIn && (
+        <header className="w-full">
+          <div className="flex justify-end items-center gap-2">
+            <Button
+              variant="ghost"
+              className="text-sm font-medium hover:bg-gray-100 px-6"
+              onClick={() => navigate("/patient/home")}
+            >
+              {t("home")}
+            </Button>
+            <DropdownMenu>
+              <DropdownMenuTrigger asChild>
+                <Button variant="ghost" size="icon">
+                  <Avatar name={"User"} className="size-7 rounded-full" />
+                </Button>
+              </DropdownMenuTrigger>
+              <DropdownMenuContent align="end">
+                <DropdownMenuItem className="text-xs text-gray-500">
+                  <span className="font-medium">{tokenData.phoneNumber}</span>
+                </DropdownMenuItem>
+                <DropdownMenuItem
+                  className="text-red-600 focus:text-red-600 cursor-pointer"
+                  onClick={signOut}
+                >
+                  <CareIcon icon="l-signout" className="mr-2 size-4" />
+                  {t("sign_out")}
+                </DropdownMenuItem>
+              </DropdownMenuContent>
+            </DropdownMenu>
+          </div>
+        </header>
+      )}
       <main className="lg:flex-1 flex flex-col items-center justify-center py-4 md:py-8">
         {/* Logo Section */}
         <div className="w-full flex flex-col items-center mt-2 md:mt-0">
@@ -222,50 +275,55 @@ export function LandingPage() {
         </div>
 
         {/* Login Section */}
-        <div className="w-full max-w-[620px] flex flex-col items-center justify-center bg-gray-100 p-4 rounded-lg">
-          <div className="text-sm font-medium mb-4 md:mb-6 text-center">
-            {t("login_already_registered")}
-          </div>
-          <div className="grid grid-cols-1 md:grid-cols-2 gap-3 md:gap-4 w-full max-w-full justify-center">
-            <div className="flex flex-col items-center justify-center gap-5 p-3 rounded-xl shadow-sm bg-white hover:shadow-md transition-all bg-[url('/images/staff_background.png')] bg-auto bg-center bg-no-repeat">
-              <div className="rounded-full bg-green-100 m-2 p-1 aspect-square flex justify-center items-center border-2 border-white shadow-sm">
-                <CareIcon
-                  icon="d-health-worker"
-                  className="size-8 text-green-700"
-                />
-              </div>
-              <div className="flex flex-col items-center">
-                <Button
-                  variant="outline"
-                  className="w-full text-xs md:text-sm border border-primary-600 text-primary-700 hover:text-primary-800 font-semibold"
-                  onClick={() => navigate(`/login?mode=staff`)}
-                >
-                  {t("staff_login")}
-                </Button>
-                <p className="text-xs mt-2 w-full text-center">
-                  {t("staff_login_description")}
-                </p>
-              </div>
+        {!isLoggedIn && (
+          <div className="w-full max-w-[620px] flex flex-col items-center justify-center bg-gray-100 p-4 rounded-lg">
+            <div className="text-sm font-medium mb-4 md:mb-6 text-center">
+              {t("login_already_registered")}
             </div>
-            <div className="flex flex-col items-center justify-center gap-5 p-3 rounded-xl shadow-sm bg-white hover:shadow-md transition-all bg-[url('/images/patient_background.png')] bg-auto bg-center bg-no-repeat">
-              <div className="rounded-full bg-indigo-100 m-2 p-1 aspect-square flex justify-center items-center border-2 border-white shadow-sm">
-                <CareIcon icon="d-patient" className="size-8 text-indigo-700" />
+            <div className="grid grid-cols-1 md:grid-cols-2 gap-3 md:gap-4 w-full max-w-full justify-center">
+              <div className="flex flex-col items-center justify-center gap-5 p-3 rounded-xl shadow-sm bg-white hover:shadow-md transition-all bg-[url('/images/staff_background.png')] bg-auto bg-center bg-no-repeat">
+                <div className="rounded-full bg-green-100 m-2 p-1 aspect-square flex justify-center items-center border-2 border-white shadow-sm">
+                  <CareIcon
+                    icon="d-health-worker"
+                    className="size-8 text-green-700"
+                  />
+                </div>
+                <div className="flex flex-col items-center">
+                  <Button
+                    variant="outline"
+                    className="w-full text-xs md:text-sm border border-primary-600 text-primary-700 hover:text-primary-800 font-semibold"
+                    onClick={() => navigate(`/login?mode=staff`)}
+                  >
+                    {t("staff_login")}
+                  </Button>
+                  <p className="text-xs mt-2 w-full text-center">
+                    {t("staff_login_description")}
+                  </p>
+                </div>
               </div>
-              <div className="flex flex-col items-center">
-                <Button
-                  variant="outline"
-                  className="w-full text-xs md:text-sm border border-primary-600 text-primary-700 hover:text-primary-800 font-semibold"
-                  onClick={() => navigate(`/login?mode=patient`)}
-                >
-                  {t("patient_login")}
-                </Button>
-                <p className="text-xs mt-2 w-full text-center">
-                  {t("patient_login_description")}
-                </p>
+              <div className="flex flex-col items-center justify-center gap-5 p-3 rounded-xl shadow-sm bg-white hover:shadow-md transition-all bg-[url('/images/patient_background.png')] bg-auto bg-center bg-no-repeat">
+                <div className="rounded-full bg-indigo-100 m-2 p-1 aspect-square flex justify-center items-center border-2 border-white shadow-sm">
+                  <CareIcon
+                    icon="d-patient"
+                    className="size-8 text-indigo-700"
+                  />
+                </div>
+                <div className="flex flex-col items-center">
+                  <Button
+                    variant="outline"
+                    className="w-full text-xs md:text-sm border border-primary-600 text-primary-700 hover:text-primary-800 font-semibold"
+                    onClick={() => navigate(`/login?mode=patient`)}
+                  >
+                    {t("patient_login")}
+                  </Button>
+                  <p className="text-xs mt-2 w-full text-center">
+                    {t("patient_login_description")}
+                  </p>
+                </div>
               </div>
             </div>
           </div>
-        </div>
+        )}
       </main>
     </div>
   );


Reviews:
user: login: coderabbitai[bot]
body: **Actionable comments posted: 1**

<details>
<summary>🧹 Nitpick comments (1)</summary><blockquote>

<details>
<summary>src/pages/Landing/LandingPage.tsx (1)</summary><blockquote>

`44-52`: **Login state management looks good but consider extracting the logic.**

The token validation and login state management are correctly implemented. However, this exact logic is duplicated in the LoginHeader component, which could lead to maintenance issues.


Consider extracting this login state logic into a custom hook to avoid duplication:

```diff
+// In a new file, e.g., src/hooks/usePatientLoginState.ts
+import dayjs from "dayjs";
+import { LocalStorageKeys } from "@/common/constants";
+import { TokenData } from "@/types/auth/otp";
+
+export const usePatientLoginState = () => {
+  const tokenData: TokenData = JSON.parse(
+    localStorage.getItem(LocalStorageKeys.patientTokenKey) || "{}"
+  );
+
+  const isLoggedIn =
+    tokenData.token &&
+    Object.keys(tokenData).length > 0 &&
+    dayjs(tokenData.createdAt).isAfter(dayjs().subtract(14, "minutes"));
+
+  return { tokenData, isLoggedIn };
+};
```

Then in both components:

```diff
-const tokenData: TokenData = JSON.parse(
-  localStorage.getItem(LocalStorageKeys.patientTokenKey) || "{}"
-);
-
-const isLoggedIn =
-  tokenData.token &&
-  Object.keys(tokenData).length > 0 &&
-  dayjs(tokenData.createdAt).isAfter(dayjs().subtract(14, "minutes"));
+const { tokenData, isLoggedIn } = usePatientLoginState();
```

</blockquote></details>

</blockquote></details>

<details>
<summary>📜 Review details</summary>

**Configuration used: CodeRabbit UI**
**Review profile: CHILL**
**Plan: Pro**

<details>
<summary>📥 Commits</summary>

Reviewing files that changed from the base of the PR and between cc0db9d6ff06f618e846958b653f6219989fc96e and aa208ff3b22b16382db60950a5ca4e86d6c7a2cd.

</details>

<details>
<summary>📒 Files selected for processing (2)</summary>

* `src/components/Common/LoginHeader.tsx` (1 hunks)
* `src/pages/Landing/LandingPage.tsx` (5 hunks)

</details>

<details>
<summary>🧰 Additional context used</summary>

<details>
<summary>🧬 Code Graph Analysis (1)</summary>

<details>
<summary>src/pages/Landing/LandingPage.tsx (3)</summary><blockquote>

<details>
<summary>src/hooks/usePatientSignOut.ts (1)</summary>

* `usePatientSignOut` (10-20)

</details>
<details>
<summary>src/types/auth/otp.ts (1)</summary>

* `TokenData` (1-5)

</details>
<details>
<summary>src/common/constants.tsx (1)</summary>

* `LocalStorageKeys` (19-24)

</details>

</blockquote></details>

</details>

</details>

<details>
<summary>⏰ Context from checks skipped due to timeout of 90000ms (1)</summary>

* GitHub Check: cypress-run (1)

</details>

<details>
<summary>🔇 Additional comments (3)</summary><blockquote>

<details>
<summary>src/components/Common/LoginHeader.tsx (1)</summary>

`45-45`: **Label change from "dashboard" to "home" looks good.**

This label change aligns with the PR objective to update text on the dashboard to read "Home" when a patient is logged in. It provides more intuitive navigation terminology for users.

</details>
<details>
<summary>src/pages/Landing/LandingPage.tsx (2)</summary>

`3-3`: **Imports added correctly for the new functionality.**

The new imports support the login state management feature and user interface components needed for the header shown to logged-in users.



Also applies to: 17-22, 24-26, 28-28, 32-32

---

`278-278`: **Good conditional rendering of login section.**

The login section is now correctly only displayed when the user is not logged in, which aligns with the PR objective to hide the login banner when a patient is logged in.



Also applies to: 326-326

</details>

</blockquote></details>

</details>

<!-- This is an auto-generated comment by CodeRabbit for review status -->
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-11T20:25:48Z
user: login: AdityaJ2305
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-04-11T20:27:20Z
user: login: coderabbitai[bot]
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-11T20:28:52Z
user: login: Jacobjeevan
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-04-14T05:47:15Z

Review comments:
diff_hunk: @@ -104,6 +125,38 @@ export function LandingPage() {
   return (
     <div className="min-h-screen flex flex-col p-5">
       {/* Main Content  */}
+      {isLoggedIn && (
+        <header className="w-full">
+          <div className="flex justify-end items-center gap-2">
+            <Button
+              variant="ghost"
+              className="text-sm font-medium hover:bg-gray-100 px-6"
+              onClick={() => navigate("/patient/home")}
+            >
+              {t("home")}
+            </Button>
+            <DropdownMenu>
+              <DropdownMenuTrigger asChild>
+                <Button variant="ghost" size="icon">
+                  <Avatar name={"User"} className="size-7 rounded-full" />
+                </Button>
+              </DropdownMenuTrigger>
+              <DropdownMenuContent align="end">
+                <DropdownMenuItem className="text-xs text-gray-500">
+                  <span className="font-medium">{tokenData.phoneNumber}</span>
+                </DropdownMenuItem>
+                <DropdownMenuItem
+                  className="text-red-600 focus:text-red-600 cursor-pointer"
+                  onClick={signOut}
+                >
+                  <CareIcon icon="l-signout" className="mr-2 size-4" />
+                  {t("sign_out")}
+                </DropdownMenuItem>
+              </DropdownMenuContent>
+            </DropdownMenu>
+          </div>
+        </header>
path: src/pages/Landing/LandingPage.tsx
user: login: coderabbitai[bot]
body: _🛠️ Refactor suggestion_

**Consider reusing the LoginHeader component.**

This header implementation duplicates much of the functionality already present in the LoginHeader component. Both components have the same button that navigates to the home page and display user information in a dropdown.


Instead of duplicating this code, consider reusing the LoginHeader component:

```diff
-{isLoggedIn && (
-  <header className="w-full">
-    <div className="flex justify-end items-center gap-2">
-      <Button
-        variant="ghost"
-        className="text-sm font-medium hover:bg-gray-100 px-6"
-        onClick={() => navigate("/patient/home")}
-      >
-        {t("home")}
-      </Button>
-      <DropdownMenu>
-        <DropdownMenuTrigger asChild>
-          <Button variant="ghost" size="icon">
-            <Avatar name={"User"} className="size-7 rounded-full" />
-          </Button>
-        </DropdownMenuTrigger>
-        <DropdownMenuContent align="end">
-          <DropdownMenuItem className="text-xs text-gray-500">
-            <span className="font-medium">{tokenData.phoneNumber}</span>
-          </DropdownMenuItem>
-          <DropdownMenuItem
-            className="text-red-600 focus:text-red-600 cursor-pointer"
-            onClick={signOut}
-          >
-            <CareIcon icon="l-signout" className="mr-2 size-4" />
-            {t("sign_out")}
-          </DropdownMenuItem>
-        </DropdownMenuContent>
-      </DropdownMenu>
-    </div>
-  </header>
-)}
+<LoginHeader />
```

This would reduce code duplication and make maintenance easier, as changes only need to be made in one place.


<!-- suggestion_start -->

<details>
<summary>📝 Committable suggestion</summary>

> ‼️ **IMPORTANT**
> Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

`````suggestion
      <LoginHeader />
`````

</details>

<!-- suggestion_end -->

<!-- This is an auto-generated reply by CodeRabbit -->
created_at: 2025-04-11T20:25:47Z
author_association: CONTRIBUTOR
diff_hunk: @@ -104,6 +125,38 @@ export function LandingPage() {
   return (
     <div className="min-h-screen flex flex-col p-5">
       {/* Main Content  */}
+      {isLoggedIn && (
+        <header className="w-full">
+          <div className="flex justify-end items-center gap-2">
+            <Button
+              variant="ghost"
+              className="text-sm font-medium hover:bg-gray-100 px-6"
+              onClick={() => navigate("/patient/home")}
+            >
+              {t("home")}
+            </Button>
+            <DropdownMenu>
+              <DropdownMenuTrigger asChild>
+                <Button variant="ghost" size="icon">
+                  <Avatar name={"User"} className="size-7 rounded-full" />
+                </Button>
+              </DropdownMenuTrigger>
+              <DropdownMenuContent align="end">
+                <DropdownMenuItem className="text-xs text-gray-500">
+                  <span className="font-medium">{tokenData.phoneNumber}</span>
+                </DropdownMenuItem>
+                <DropdownMenuItem
+                  className="text-red-600 focus:text-red-600 cursor-pointer"
+                  onClick={signOut}
+                >
+                  <CareIcon icon="l-signout" className="mr-2 size-4" />
+                  {t("sign_out")}
+                </DropdownMenuItem>
+              </DropdownMenuContent>
+            </DropdownMenu>
+          </div>
+        </header>
path: src/pages/Landing/LandingPage.tsx
user: login: AdityaJ2305
body: The landingpage already has the Sign banner, so we can’t have it again with login header
created_at: 2025-04-11T20:27:19Z
author_association: MEMBER
diff_hunk: @@ -104,6 +125,38 @@ export function LandingPage() {
   return (
     <div className="min-h-screen flex flex-col p-5">
       {/* Main Content  */}
+      {isLoggedIn && (
+        <header className="w-full">
+          <div className="flex justify-end items-center gap-2">
+            <Button
+              variant="ghost"
+              className="text-sm font-medium hover:bg-gray-100 px-6"
+              onClick={() => navigate("/patient/home")}
+            >
+              {t("home")}
+            </Button>
+            <DropdownMenu>
+              <DropdownMenuTrigger asChild>
+                <Button variant="ghost" size="icon">
+                  <Avatar name={"User"} className="size-7 rounded-full" />
+                </Button>
+              </DropdownMenuTrigger>
+              <DropdownMenuContent align="end">
+                <DropdownMenuItem className="text-xs text-gray-500">
+                  <span className="font-medium">{tokenData.phoneNumber}</span>
+                </DropdownMenuItem>
+                <DropdownMenuItem
+                  className="text-red-600 focus:text-red-600 cursor-pointer"
+                  onClick={signOut}
+                >
+                  <CareIcon icon="l-signout" className="mr-2 size-4" />
+                  {t("sign_out")}
+                </DropdownMenuItem>
+              </DropdownMenuContent>
+            </DropdownMenu>
+          </div>
+        </header>
path: src/pages/Landing/LandingPage.tsx
user: login: coderabbitai[bot]
body: 

<!-- <agentComponentType>chat-answer</agentComponentType> -->

<!-- <rawResChunk><answer><details>
<summary>🧩 Analysis chain</summary>

```
import { navigate } from "raviger";
import { useTranslation } from "react-i18next";

import { DropdownMenu, DropdownMenuContent, DropdownMenuTrigger } from "@/components/ui/dropdown-menu";
import { Button } from "@/components/ui/button";

import { useAuthContext } from "@/context/AuthStateContext";

import { HomeButton } from "./HomeButton";
import { Avatar } from "./Avatar";
import { SignCompact } from "./SignCompact";

export const LoginHeader = () => {
  const { t } = useTranslation();
  const { user, signOut, authenticated } = useAuthContext();
  const patientName = user?.alt_full_name ? user.alt_full_name : null;

  return (
    <div className="flex justify-between w-full mb-5">
      <HomeButton onClick={() => navigate("/")} />
      {authenticated ? (
        <div className="flex items-center gap-2">
          <Button
            variant="ghost"
            className="text-sm font-medium hover:bg-gray-100 px-6"
            onClick={() => navigate("/dashboard")}
          >
            {t("home")}
          </Button>
          <div className="mx-1">
            <SignCompact />
          </div>
          <DropdownMenu>
            <DropdownMenuTrigger asChild>
              <Button variant="ghost" size="icon">
                <Avatar name={patientName || "User"} className="size-7 rounded-full" />
              </Button>
            </DropdownMenuTrigger>
            <DropdownMenuContent align="end">{user && <User />}</DropdownMenuContent>
          </DropdownMenu>
        </div>
      ) : (
        <Button
          variant="outline"
          className="text-sm"
          onClick={() => navigate("/login")}
        >
          {t("login")}
        </Button>
      )}
    </div>
  );
};

const User = () => {
  const { t } = useTranslation();
  const { user, signOut } = useAuthContext();

  return (
    <>
      <div className="flex items-center gap-3 p-2 pb-0">
        <div className="flex flex-col gap-1">
          <p className="text-sm font-medium">{user?.username}</p>
        </div>
      </div>
      <div className="p-2">
        <Button
          onClick={signOut}
          variant="destructive"
          className="w-full text-xs justify-start h-7"
        >
          {t("sign_out")}
        </Button>
      </div>
    </>
  );
};
```



@AdityaJ2305 You're absolutely right. After examining the LoginHeader component, I see that it uses a different authentication mechanism (AuthContext) and includes the SignCompact component which would be redundant in the LandingPage. It also has different navigation targets and displays different user information.

Your current implementation is more appropriate for this specific use case since it's tailored for the patient flow with token-based authentication. Thanks for the clarification.



---

🏁 Script executed:
```
#!/bin/bash
# Examine the LoginHeader component
cat src/components/Common/LoginHeader.tsx
```

Length of output: 2740

---



</details>

@AdityaJ2305 I see that now! After looking at the current LoginHeader component, I understand your point better. The LoginHeader also renders a "Sign In" button when the user is not logged in, which would conflict with your existing login section at the bottom of the LandingPage.

Your implementation makes sense since you only want to show the header when the user is logged in, without the additional sign-in option that comes with the LoginHeader component. This avoids duplicating login UI elements on the page.

---

<details>
<summary>🧬 Code Graph Analysis Results</summary>

### Relevant Code Snippets

#### 1. `src/types/auth/otp.ts` (Lines 1-5)
```typescript
export interface TokenData {
  token: string;
  phoneNumber: string;
  createdAt: string;
}
```
- **Description**: Defines the `TokenData` interface which includes properties for `token`, `phoneNumber`, and `createdAt`. This is relevant for understanding the authentication state in the `LandingPage` component.

#### 2. `src/common/constants.tsx` (Lines 19-24)
```typescript
export const LocalStorageKeys = {
  accessToken: "care_access_token",
  refreshToken: "care_refresh_token",
  patientTokenKey: "care_patient_token",
  loginPreference: "care_login_preference",
};
```
- **Description**: Exports constants for local storage keys used in the application. The `patientTokenKey` is particularly relevant as it is used to retrieve the token data in the `LandingPage`.

#### 3. `src/Utils/request/types.ts` (Lines 71-74)
```typescript
export interface PaginatedResponse<TItem> {
  count: number;
  results: TItem[];
}
```
- **Description**: Defines a generic interface for paginated responses, which includes a count of items and an array of results. This is relevant for the `organizationsResponse` in the `LandingPage`.

#### 4. `src/types/organization/organization.ts` (Lines 23-36)
```typescript
export interface Organization {
  id: string;
  name: string;
  description?: string;
  org_type: org_type;
  level_cache: number;
  has_children: boolean;
  active: boolean;
  parent?: OrganizationParent;
  created_at: string;
  updated_at: string;
  metadata: Metadata | null;
  permissions: string[];
}
```
- **Description**: Defines the `Organization` interface, which includes various properties related to an organization. This is relevant for the organizations being queried and displayed in the `LandingPage`.

#### 5. `src/hooks/usePatientSignOut.ts` (Lines 10-20)
```typescript
export const usePatientSignOut = () => {
  const signOut = useCallback(async () => {
    localStorage.removeItem(LocalStorageKeys.patientTokenKey);
    localStorage.removeItem("selectedPatient");

    const redirectURL = getRedirectURL();
    navigate(redirectURL ? `/login?redirect=${redirectURL}` : "/login");
  }, []);

  return signOut;
};
```
- **Description**: A custom hook that provides a `signOut` function to handle patient sign-out. It removes the patient token from local storage and navigates to the login page. This is relevant for the sign-out functionality in the `LandingPage`.

#### 6. `src/Utils/request/query.ts` (Lines 74-81)
```typescript
export default function query<Route extends ApiRoute<unknown, unknown>>(
  route: Route,
  options?: ApiCallOptions<Route>,
) {
  return ({ signal }: { signal: AbortSignal }) => {
    return callApi(route, { ...options, signal });
  };
}
```
- **Description**: A utility function for making API calls with support for aborting requests. This is relevant for the `useQuery` hook in the `LandingPage` that fetches organizations.

#### 7. `src/components/ui/button.tsx` (Line 84)
```
Button
```
- **Description**: Represents a button component used throughout the application, including in the `LandingPage`.

#### 8. `src/components/Common/Avatar.tsx` (Line 101)
```
Avatar
```
- **Description**: Represents an avatar component used in the user interface, specifically for displaying user information in the `LandingPage`.

#### 9. `src/components/ui/command.tsx` (Lines 147-153)
```
Command
CommandEmpty
CommandGroup
CommandItem
```
- **Description**: These components are used for creating a command palette or dropdown menu, which is relevant for the organization selection feature in the `LandingPage`.

#### 10. `src/components/ui/dropdown-menu.tsx` (Lines 188-191)
```
DropdownMenu
DropdownMenuTrigger
DropdownMenuContent
DropdownMenuItem
```
- **Description**: These components are used to create a dropdown menu for user actions in the `LandingPage`, particularly for the user profile and sign-out options.

This collection of snippets provides context and functionality relevant to the `LandingPage` component and its handling of user authentication and organization selection.

</details>


---

<details>
<summary>✏️ Learnings added</summary>

```
Learnt from: AdityaJ2305
PR: ohcnetwork/care_fe#11884
File: src/pages/Landing/LandingPage.tsx:128-158
Timestamp: 2025-04-11T20:28:51.027Z
Learning: The LoginHeader component uses the AuthContext for authentication and includes the SignCompact component, making it incompatible with the token-based authentication flow used in the LandingPage. The custom header implementation in LandingPage is specifically designed for patient authentication with different navigation targets (/patient/home vs /dashboard) and different user information display.
```

---

```
Learnt from: AdityaJ2305
PR: ohcnetwork/care_fe#11884
File: src/pages/Landing/LandingPage.tsx:128-158
Timestamp: 2025-04-11T20:28:51.028Z
Learning: The LoginHeader component includes both logged-in UI (with home button and dropdown) and logged-out UI (with sign-in button). When integrating authentication headers in pages that already have login sections (like LandingPage), custom header implementations may be needed to avoid duplicate login UI elements.
```

> Note: Learnings are effective only in the context of similar code segments. To apply general coding guidelines, please configure [review instructions](https://docs.coderabbit.ai/guides/review-instructions). You can manage existing learnings in the [app](https://app.coderabbit.ai/learnings).

</details></answer></rawResChunk> -->

<!-- This is an auto-generated reply by CodeRabbit -->
created_at: 2025-04-11T20:28:52Z
author_association: CONTRIBUTOR

PR comments:
user: login: coderabbitai[bot]
created_at: 2025-04-11T20:21:23Z
body: <!-- This is an auto-generated comment: summarize by coderabbit.ai -->
<!-- walkthrough_start -->

## Walkthrough
This pull request updates two components. In the LoginHeader component, the button label is changed from "dashboard" to "home". In the LandingPage component, a new login state management feature is added. The component now imports the dayjs library for token time validation, uses the usePatientSignOut hook, and conditionally renders a header with navigation options if the user’s token exists and is within a 14-minute validity window. Otherwise, it displays a login section.

## Changes

| File(s)                                    | Change Summary                                                                                                                                                                              |
| ------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `src/components/…/LoginHeader.tsx`         | Updated the button label from `{t("dashboard")}` to `{t("home")}`.                                                                                                                          |
| `src/pages/…/LandingPage.tsx`               | Added login state management by importing dayjs, integrating usePatientSignOut, creating `tokenData` and `isLoggedIn`, and conditionally rendering UI components based on login status. |

## Sequence Diagram(s)
```mermaid
sequenceDiagram
    participant User
    participant LandingPage
    participant LocalStorage
    participant dayjs

    User->>LandingPage: Navigate to landing page
    LandingPage->>LocalStorage: Retrieve token from local storage
    LocalStorage-->>LandingPage: Return token
    LandingPage->>dayjs: Validate token creation time
    alt Token is valid (within 14 minutes)
        LandingPage->>User: Render logged-in header with navigation options
    else Token is invalid or missing
        LandingPage->>User: Render login section for staff and patients
    end
```

## Assessment against linked issues

| Objective                                                                                         | Addressed | Explanation                                                                                       |
| ------------------------------------------------------------------------------------------------- | --------- | ------------------------------------------------------------------------------------------------- |
| Hide login banner when user is logged in (#11715)                                                 | ✅        |                                                                                                   |
| Prevent Dashboard SVG icon from logging out or redirecting incorrectly when on the Dashboard page (#11715) | ❌        | The changes update the button text but do not alter the SVG icon’s display or behavior.           |

## Poem
> I hopped through lines of code with glee,  
> Changing labels from "dashboard" to "home" for all to see.  
> I added token checks with a swift little bounce,  
> Ensuring the right view is rendered to count.  
> In this coder's warren, each change makes me cheer—  
> A rabbit’s happy hop, bringing bright updates near!  
> 🥕🐇  


<!-- walkthrough_end -->

<!-- announcements_start -->

> [!TIP]
> <details>
> <summary>⚡💬 Agentic Chat (Pro Plan, General Availability)</summary>
> 
> - We're introducing multi-step agentic chat in review comments and issue comments, within and outside of PR's. This feature enhances review and issue discussions with the CodeRabbit agentic chat by enabling advanced interactions, including the ability to create pull requests directly from comments and add commits to existing pull requests.
> 
> </details>

<!-- announcements_end -->
<!-- internal state start -->


<!-- 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 -->

<!-- internal state end -->
<!-- finishing_touch_checkbox_start -->

<details>
<summary>✨ Finishing Touches</summary>

- [ ] <!-- {"checkboxId": "7962f53c-55bc-4827-bfbf-6a18da830691"} --> 📝 Generate Docstrings

</details>

<!-- finishing_touch_checkbox_end -->
<!-- tips_start -->

---

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

<details>
<summary>❤️ Share</summary>

- [X](https://twitter.com/intent/tweet?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A&url=https%3A//coderabbit.ai)
- [Mastodon](https://mastodon.social/share?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A%20https%3A%2F%2Fcoderabbit.ai)
- [Reddit](https://www.reddit.com/submit?title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&text=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code.%20Check%20it%20out%3A%20https%3A//coderabbit.ai)
- [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fcoderabbit.ai&mini=true&title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&summary=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code)

</details>

<details>
<summary>🪧 Tips</summary>

### Chat

There are 3 ways to chat with [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=ohcnetwork/care_fe&utm_content=11884):

- Review comments: Directly reply to a review comment made by CodeRabbit. Example:
  - `I pushed a fix in commit <commit_id>, please review it.`
  - `Generate unit testing code for this file.`
  - `Open a follow-up GitHub issue for this discussion.`
- Files and specific lines of code (under the "Files changed" tab): Tag `@coderabbitai` in a new review comment at the desired location with your query. Examples:
  - `@coderabbitai generate unit testing code for this file.`
  -	`@coderabbitai modularize this function.`
- PR comments: Tag `@coderabbitai` in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
  - `@coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.`
  - `@coderabbitai read src/utils.ts and generate unit testing code.`
  - `@coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.`
  - `@coderabbitai help me debug CodeRabbit configuration file.`

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

### CodeRabbit Commands (Invoked using PR comments)

- `@coderabbitai pause` to pause the reviews on a PR.
- `@coderabbitai resume` to resume the paused reviews.
- `@coderabbitai review` to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
- `@coderabbitai full review` to do a full review from scratch and review all the files again.
- `@coderabbitai summary` to regenerate the summary of the PR.
- `@coderabbitai generate docstrings` to [generate docstrings](https://docs.coderabbit.ai/finishing-touches/docstrings) for this PR.
- `@coderabbitai resolve` resolve all the CodeRabbit review comments.
- `@coderabbitai plan` to trigger planning for file edits and PR creation.
- `@coderabbitai configuration` to show the current CodeRabbit configuration for the repository.
- `@coderabbitai help` to get help.

### Other keywords and placeholders

- Add `@coderabbitai ignore` anywhere in the PR description to prevent this PR from being reviewed.
- Add `@coderabbitai summary` to generate the high-level summary at a specific location in the PR description.
- Add `@coderabbitai` anywhere in the PR title to generate the title automatically.

### CodeRabbit Configuration File (`.coderabbit.yaml`)

- You can programmatically configure CodeRabbit by adding a `.coderabbit.yaml` file to the root of your repository.
- Please see the [configuration documentation](https://docs.coderabbit.ai/guides/configure-coderabbit) for more information.
- If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: `# yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json`

### Documentation and Community

- Visit our [Documentation](https://docs.coderabbit.ai) for detailed information on how to use CodeRabbit.
- Join our [Discord Community](http://discord.gg/coderabbit) to get help, request features, and share feedback.
- Follow us on [X/Twitter](https://twitter.com/coderabbitai) for updates and announcements.

</details>

<!-- tips_end -->
author_association: CONTRIBUTOR
user: login: netlify[bot]
created_at: 2025-04-11T20:21:32Z
body: ### <span aria-hidden="true">✅</span> Deploy Preview for *care-ohc* ready!


|  Name | Link |
|:-:|------------------------|
|<span aria-hidden="true">🔨</span> Latest commit | f64516c44622a6d1d63546284653e4f47605054e |
|<span aria-hidden="true">🔍</span> Latest deploy log | https://app.netlify.com/sites/care-ohc/deploys/67fc150949c4e50008d70d38 |
|<span aria-hidden="true">😎</span> Deploy Preview | [https://deploy-preview-11884.preview.ohc.network](https://deploy-preview-11884.preview.ohc.network) |
|<span aria-hidden="true">📱</span> Preview on mobile | <details><summary> Toggle QR Code... </summary><br /><br />![QR Code](https://app.netlify.com/qr-code/eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1cmwiOiJodHRwczovL2RlcGxveS1wcmV2aWV3LTExODg0LnByZXZpZXcub2hjLm5ldHdvcmsifQ.cqmvAZAiYKMSAslUYQ5uyA1De0juqhd5KPDRn-etGMA)<br /><br />_Use your smartphone camera to open QR code link._</details> |
---
<!-- [care-ohc Preview](https://deploy-preview-11884.preview.ohc.network) -->
_To edit notification comments on pull requests, go to your [Netlify site configuration](https://app.netlify.com/sites/care-ohc/configuration/notifications#deploy-webhooks)._
author_association: NONE
user: login: github-actions[bot]
created_at: 2025-04-15T22:46:29Z
body: @AdityaJ2305 Your efforts have helped advance digital healthcare and TeleICU systems. :rocket: Thank you for taking the time out to make CARE better. We hope you continue to innovate and contribute; your impact is immense! :raised_hands:
author_association: NONE