Repository: DesunTech/real-sales
Pull request #13: update
Author: login: RajdwipDesun
Created: 2025-05-20T02:54:00Z | Merged: 2025-05-20T02:58:24Z



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

- **New Features**
	- Persona cards within the selection modal are now disabled when relevant data is unavailable, preventing user interaction.

- **Bug Fixes**
	- Improved button behavior and visual feedback for disabled states in persona cards.

- **Chores**
	- Updated role titles in the ideal persona modal for clarity.
	- Moved logout functionality into the header component for streamlined user experience.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->


Diff:
diff --git a/src/common/PersonaCard.jsx b/src/common/PersonaCard.jsx
index 7c4afde..074af74 100644
--- a/src/common/PersonaCard.jsx
+++ b/src/common/PersonaCard.jsx
@@ -8,11 +8,10 @@ const PersonaCard = (props) => {
   return (
     <div className="bg-[url(../../public/assets/images/aboutus/PersonaCardImg.png)] shadow-md bg-cover bg-center bg-no-repeat w-full rounded-[10px]">
       <div
-        className={`${
-          props?.type
+        className={`${props?.type
             ? `bg-gradient-to-r from-blue-200/50 to-white/0`
             : `bg-gradient-to-r from-white/50 to-white/0`
-        } py-4 px-8 w-full flex flex-col items-start justify-between gap-4`}
+          } py-4 px-8 w-full flex flex-col items-start justify-between gap-4`}
       >
         <div className="flex flex-col items-start">
           <h2 className="lg:text-[12px] text-[10px] sora-regular text-[#060606]">
@@ -32,13 +31,9 @@ const PersonaCard = (props) => {
           </p>
         ) : (
           <BookAdemo
-            onClick={() => {
-              props?.disabled ? null : props?.onClick();
-            }}
+            onClick={() => { props?.disabled ? null : props?.onClick() }}
             BookaDemo={"SELECT"}
-            className={`!border-[#FFDE5A] ${
-              props?.disabled ? "!bg-[#06060690]" : "!bg-[#060606]"
-            } !text-[#FFDE5A] !px-5 !py-1 h-fit uppercase`}
+            className={`!border-[#FFDE5A] ${props?.disabled ? "!bg-[#0606064e]" : "!bg-[#060606]"} !text-[#FFDE5A] !px-5 !py-1 h-fit uppercase`}
           />
         )}
       </div>
diff --git a/src/common/layout/header/index.jsx b/src/common/layout/header/index.jsx
index 9916d60..3a6884c 100644
--- a/src/common/layout/header/index.jsx
+++ b/src/common/layout/header/index.jsx
@@ -14,8 +14,7 @@ import TryRealsales from "../../modals/TryRealsales";
 import LogoutIcon from '@mui/icons-material/Logout';
 import { useLogout } from "../../../hooks/useLogout";
 
-
-const Header = () => {
+const Header = (props) => {
   const router = useRouter();
   const dispatch = useDispatch();
 
@@ -56,9 +55,8 @@ const Header = () => {
               <div>
                 <Link
                   href="/"
-                  className={`text-white leading-1 hover:underline ${
-                    router?.pathname === "/" ? `underline` : ``
-                  }`}
+                  className={`text-white leading-1 hover:underline ${router?.pathname === "/" ? `underline` : ``
+                    }`}
                 >
                   Home
                 </Link>
@@ -66,9 +64,8 @@ const Header = () => {
               <div>
                 <Link
                   href="/about"
-                  className={`text-white leading-1 hover:underline ${
-                    router?.pathname === "/about" ? `underline` : ``
-                  }`}
+                  className={`text-white leading-1 hover:underline ${router?.pathname === "/about" ? `underline` : ``
+                    }`}
                 >
                   About
                 </Link>
@@ -81,9 +78,8 @@ const Header = () => {
                 >
                   Industries&nbsp;
                   <ArrowDropDownOutlinedIcon
-                    className={`${
-                      openIndustry ? `rotate-0` : `rotate-180`
-                    } transform duration-300`}
+                    className={`${openIndustry ? `rotate-0` : `rotate-180`
+                      } transform duration-300`}
                   />
                 </Link>
                 {openIndustry ? (
@@ -113,9 +109,8 @@ const Header = () => {
               <div>
                 <Link
                   href="/faq"
-                  className={`text-white leading-1 hover:underline ${
-                    router?.pathname === "/faq" ? `underline` : ``
-                  }`}
+                  className={`text-white leading-1 hover:underline ${router?.pathname === "/faq" ? `underline` : ``
+                    }`}
                 >
                   FAQ
                 </Link>
diff --git a/src/common/layout/index.jsx b/src/common/layout/index.jsx
index 5eb67ae..6eccc5b 100644
--- a/src/common/layout/index.jsx
+++ b/src/common/layout/index.jsx
@@ -121,7 +121,7 @@ const Layout = ({ children }) => {
         // dispatch(IdealPersonaValue(true));
         dispatch(ShortlistedPersonaValue(true));
       }
-    } catch (error) {}
+    } catch (error) { }
   };
 
   /**
@@ -153,17 +153,9 @@ const Layout = ({ children }) => {
 
   return (
     <div className="">
-      {/* Logout button */}
-      {/* {token !== "" && (
-        <div
-          onClick={() => useLogout()}
-          className="fixed top-[92vh] right-4 z-[100] bg-white shadow-[0px_0px_4px_0px_rgba(238,0,0,0.75)] border border-solid border-red-300 rounded-full p-1.5 hover:p-2 duration-300 cursor-pointer"
-        >
-          <PowerSettingsNewIcon className="text-red-600" />
-        </div>
-      )} */}
+
       {/* Conditional rendering of header and footer */}
-      {!isChatPage && <Header />}
+      {!isChatPage && <Header logOut={() => useLogout()} token={token} />}
       {children}
       {!isChatPage && <Footer />}
       {/* Modal components */}
diff --git a/src/common/modals/IdealPersonaModal.jsx b/src/common/modals/IdealPersonaModal.jsx
index 44acba6..5c71f8e 100644
--- a/src/common/modals/IdealPersonaModal.jsx
+++ b/src/common/modals/IdealPersonaModal.jsx
@@ -56,13 +56,13 @@ const IdealPersonaModal = ({ onNext }) => {
         {
           image: procecurementimage,
           type: "Role",
-          title: "procurement",
+          title: "procurement_manager",
           view: "Procurement",
         },
         {
           image: maintenanceimage,
           type: "Role",
-          title: "maintenance",
+          title: "maintenance_manager",
           view: "Maintenance",
         },
       ]);
diff --git a/src/common/modals/PersonaTypeModal.jsx b/src/common/modals/PersonaTypeModal.jsx
index 0febdf0..19e6eb7 100644
--- a/src/common/modals/PersonaTypeModal.jsx
+++ b/src/common/modals/PersonaTypeModal.jsx
@@ -112,6 +112,7 @@ const PersonaTypeModal = ({ onNext, personaData }) => {
                 type={Industry[0]}
               />
               <PersonaCard
+              disabled={!Industry[0]}
                 persona={persona === "Role" ? true : false}
                 disabled={!Industry[0]}
                 onClick={() =>
@@ -123,6 +124,7 @@ const PersonaTypeModal = ({ onNext, personaData }) => {
             </div>
             <div className="w-full flex lg:flex-row flex-col items-center justify-between gap-y-5 gap-x-10">
               <PersonaCard
+              disabled={!Role[0]}
                 persona={persona === "Experience" ? true : false}
                 disabled={!Role[0]}
                 // onClick={() => setPersona("Experience")}
@@ -135,6 +137,7 @@ const PersonaTypeModal = ({ onNext, personaData }) => {
                 type={Experience[0]}
               />
               <PersonaCard
+              disabled={!Experience[0]}
                 persona={persona === "Geography" ? true : false}
                 disabled={!Experience[0]}
                 // onClick={() => setPersona("Geography")}
@@ -147,6 +150,7 @@ const PersonaTypeModal = ({ onNext, personaData }) => {
             </div>
             <div className="w-full flex lg:flex-row flex-col items-center justify-between gap-y-5 gap-x-10">
               <PersonaCard
+              disabled={!Geography[0]}
                 persona={persona === "Manufacture" ? true : false}
                 disabled={!Geography[0]}
                 // onClick={() => setPersona("Manufacture")}
@@ -162,6 +166,7 @@ const PersonaTypeModal = ({ onNext, personaData }) => {
                 type={Manufacture[0]}
               />
               <PersonaCard
+              disabled={!Manufacture[0]}
                 persona={persona === "Manufacture" ? true : false}
                 disabled={!Manufacture[0]}
                 // onClick={() => setPersona("Manufacture")}


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

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

<details>
<summary>src/common/PersonaCard.jsx (2)</summary><blockquote>

`6-6`: **Remove console.log statement.**

This debug statement should be removed before pushing to production.

```diff
-  console.log(props?.type, "props_type");
```

---

`34-36`: **Approve disabled state implementation with suggestion for cleaner code.**

The disabled state implementation correctly prevents click events when the card is disabled and provides visual feedback through opacity changes. Consider using an early return pattern for improved readability.



```diff
-            onClick={() => { props?.disabled ? null : props?.onClick() }}
+            onClick={() => { 
+              if (props?.disabled) return;
+              props?.onClick();
+            }}
```

</blockquote></details>
<details>
<summary>src/common/modals/PersonaTypeModal.jsx (3)</summary><blockquote>

`66-66`: **Remove console.log statement.**

This debug statement should be removed before pushing to production.

```diff
-    console.log(personaData,Plant_size_impact, "Plant_size_impact")
```

---

`20-30`: **Clean up commented code.**

This block of commented code should either be removed if it's no longer needed or uncommented if it's required functionality.

```diff
-  // useEffect(() => {
-  //   const getRealAIPersona = async () => {
-  //     try {
-  //       let data = await Get(ai_personas);
-  //       console.log(data, "aip_data");
-  //     } catch (error) {
-  //       console.log(error);
-  //     }
-  //   };
-  //   getRealAIPersona();
-  // }, [open]);
```

---

`83-83`: **Fix typo in text content.**

There's a typo in the filter label text.

```diff
-            (Filtur your choice):
+            (Filter your choice):
```

</blockquote></details>
<details>
<summary>src/common/layout/index.jsx (1)</summary><blockquote>

`164-169`: **Consider adding loading state for the logout action**

The current implementation doesn't provide any visual feedback to the user when logout is in progress, which might lead to confusion if the API call takes time.


Consider adding a loading state to enhance user experience:

```diff
const Layout = ({ children }) => {
  // ...existing code...
  const logout = useLogout;
+  const [isLoggingOut, setIsLoggingOut] = useState(false);
  
  const handleLogout = async () => {
+    setIsLoggingOut(true);
    try {
      await logout();
      // Optional: Add user feedback on successful logout
    } catch (error) {
      console.error("Logout failed:", error);
      // Optional: Add user feedback on logout failure
+    } finally {
+      setIsLoggingOut(false);
    }
  };

  // ...existing code...
  
  return (
    <div className="">
-      {!isChatPage && <Header logOut={handleLogout} token={token} />}
+      {!isChatPage && <Header logOut={handleLogout} token={token} isLoggingOut={isLoggingOut} />}
      {children}
      {!isChatPage && <Footer />}
      {/* ...rest of the component... */}
    </div>
  );
};
```

And update the Header component to show a loading indicator when `isLoggingOut` is true.

</blockquote></details>

</blockquote></details>

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

**Configuration used: CodeRabbit UI**
**Review profile: CHILL**
**Plan: Pro**
**Cache: Disabled due to data retention organization setting**
**Knowledge Base: Disabled due to data retention organization setting**


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

Reviewing files that changed from the base of the PR and between 42b9fcbcb8210f3e78f235efe01402f833739be9 and 5e9fae77ebe18a45bc239bed7ab7cd51795669f1.

</details>

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

* `src/common/PersonaCard.jsx` (2 hunks)
* `src/common/layout/header/index.jsx` (5 hunks)
* `src/common/layout/index.jsx` (2 hunks)
* `src/common/modals/IdealPersonaModal.jsx` (1 hunks)
* `src/common/modals/PersonaTypeModal.jsx` (5 hunks)

</details>

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

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

<details>
<summary>src/common/layout/index.jsx (2)</summary><blockquote>

<details>
<summary>src/common/layout/header/index.jsx (1)</summary>

* `Header` (16-186)

</details>
<details>
<summary>src/hooks/useLogout.js (2)</summary>

* `useLogout` (11-30)
* `useLogout` (11-30)

</details>

</blockquote></details>

</details>

</details>

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

<details>
<summary>src/common/PersonaCard.jsx (1)</summary>

`11-14`: **LGTM: Improved code formatting for className.**

The simplified format for className assignment looks cleaner and more readable.

</details>
<details>
<summary>src/common/modals/PersonaTypeModal.jsx (1)</summary>

`114-165`: **LGTM: Well-implemented guided workflow with disabled states.**

The implementation creates a logical progression through persona selection by conditionally disabling cards based on previous selections. This guides users through the process in the correct order and prevents them from making selections out of sequence.

<details>
<summary>🧰 Tools</summary>

<details>
<summary>🪛 Biome (1.9.4)</summary>

[error] 115-115: Unnecessary use of boolean literals in conditional expression.

Simplify your code by directly assigning the result without using a ternary operator.
If your goal is negation, you may use the logical NOT (!) or double NOT (!!) operator for clearer and concise code.
 Check for more details about NOT operator.
Unsafe fix: Remove the conditional expression with


(lint/complexity/noUselessTernary)

---

[error] 127-127: Unnecessary use of boolean literals in conditional expression.

Simplify your code by directly assigning the result without using a ternary operator.
If your goal is negation, you may use the logical NOT (!) or double NOT (!!) operator for clearer and concise code.
 Check for more details about NOT operator.
Unsafe fix: Remove the conditional expression with


(lint/complexity/noUselessTernary)

---

[error] 139-139: Unnecessary use of boolean literals in conditional expression.

Simplify your code by directly assigning the result without using a ternary operator.
If your goal is negation, you may use the logical NOT (!) or double NOT (!!) operator for clearer and concise code.
 Check for more details about NOT operator.
Unsafe fix: Remove the conditional expression with


(lint/complexity/noUselessTernary)

---

[error] 151-151: Unnecessary use of boolean literals in conditional expression.

Simplify your code by directly assigning the result without using a ternary operator.
If your goal is negation, you may use the logical NOT (!) or double NOT (!!) operator for clearer and concise code.
 Check for more details about NOT operator.
Unsafe fix: Remove the conditional expression with


(lint/complexity/noUselessTernary)

</details>

</details>

</details>
<details>
<summary>src/common/modals/IdealPersonaModal.jsx (1)</summary>

`59-65`: **LGTM: Role title standardization.**

The update to role titles (adding "_manager" suffix) provides more specific and standardized internal identifiers while maintaining the same user-facing display labels. This improves consistency in the data model.

</details>
<details>
<summary>src/common/layout/header/index.jsx (1)</summary>

`47-102`: **LGTM: Minor formatting improvements in template literals.**

The refactored class name strings are more readable with consistent formatting.

</details>

</blockquote></details>

</details>

<!-- This is an auto-generated comment by CodeRabbit for review status -->
state: COMMENTED
author_association: NONE
submitted_at: 2025-05-20T02:57:46Z

Review comments:
diff_hunk: @@ -12,30 +12,18 @@ import { useDispatch } from "react-redux";
 import { DemoMeetingValue } from "../../../redux/OpenModal";
 import TryRealsales from "../../modals/TryRealsales";
 import LogoutIcon from '@mui/icons-material/Logout';
-import { useLogout } from "../../../hooks/useLogout";
 
-
-const Header = () => {
+const Header = (props) => {
path: src/common/layout/header/index.jsx
user: login: coderabbitai[bot]
body: _🛠️ Refactor suggestion_

**Add prop validation.**

Since the component now relies on `token` and `logOut` props, consider adding prop validation using PropTypes or destructuring with default values to prevent runtime errors.

```diff
- const Header = (props) => {
+ const Header = ({ token = "", logOut = () => {} }) => {
```

Or with PropTypes:

```javascript
import PropTypes from 'prop-types';

// After component definition:
Header.propTypes = {
  token: PropTypes.string,
  logOut: PropTypes.func
};

Header.defaultProps = {
  token: "",
  logOut: () => {}
};
```

<details>
<summary>🤖 Prompt for AI Agents</summary>

```
In src/common/layout/header/index.jsx at line 16, the Header component uses
props token and logOut but lacks prop validation. Add PropTypes import at the
top, then define Header.propTypes to specify token as a string and logOut as a
function. Also, add Header.defaultProps to provide default values for token as
an empty string and logOut as a no-op function to prevent runtime errors.
```

</details>

<!-- This is an auto-generated comment by CodeRabbit -->

✅ Addressed in commits 84ada9b to 6d46c43
created_at: 2025-05-20T02:57:45Z
author_association: NONE
diff_hunk: @@ -113,25 +98,25 @@ const Header = () => {
               <div>
                 <Link
                   href="/faq"
-                  className={`text-white leading-1 hover:underline ${
-                    router?.pathname === "/faq" ? `underline` : ``
-                  }`}
+                  className={`text-white leading-1 hover:underline ${router?.pathname === "/faq" ? `underline` : ``
+                    }`}
                 >
                   FAQ
                 </Link>
               </div>
             </ul>
           </div>
+
           {/* Call to Action Buttons */}
           <div className="header-btn hidden md:flex items-center space-x-4">
-          {token !== "" && (
-        <div
-          onClick={() => useLogout()}
-          className="border border-solid border-white rounded p-0.5 px-4 cursor-pointer text-white"
-        >
-          <LogoutIcon className="text-white" />&nbsp;Logout
-        </div>
-      )}
+            {props?.token !== "" && (
+              <div
+                onClick={() => props?.logOut()}
+                className="bg-white border border-solid border-red-300 rounded p-0.5 px-4 cursor-pointer"
+              >
+                <LogoutIcon className="text-red-600" />&nbsp;Logout
+              </div>
+            )}
path: src/common/layout/header/index.jsx
user: login: coderabbitai[bot]
body: _🛠️ Refactor suggestion_

**Enhance logout button accessibility.**

The logout button implementation works functionally but has room for improvement in terms of accessibility and semantics.

```diff
- {props?.token !== "" && (
-   <div
-     onClick={() => props?.logOut()}
-     className="bg-white border border-solid border-red-300 rounded p-0.5 px-4 cursor-pointer"
-   >
-     <LogoutIcon className="text-red-600" />&nbsp;Logout
-   </div>
- )}
+ {props?.token !== "" && (
+   <button
+     onClick={() => props?.logOut()}
+     className="bg-white border border-solid border-red-600 rounded p-0.5 px-4 flex items-center text-red-600"
+     aria-label="Logout"
+   >
+     <LogoutIcon className="text-red-600" />&nbsp;Logout
+   </button>
+ )}
```

This change:
1. Uses a semantic button element instead of a div
2. Adds aria-label for screen readers
3. Matches border and text color for consistency
4. Improves alignment with flexbox



<!-- 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
            {props?.token !== "" && (
              <button
                onClick={() => props?.logOut()}
                className="bg-white border border-solid border-red-600 rounded p-0.5 px-4 flex items-center text-red-600"
                aria-label="Logout"
              >
                <LogoutIcon className="text-red-600" />&nbsp;Logout
              </button>
            )}
```

</details>

<!-- suggestion_end -->

<details>
<summary>🤖 Prompt for AI Agents</summary>

```
In src/common/layout/header/index.jsx around lines 112 to 119, replace the div
used for the logout button with a semantic button element to improve
accessibility. Add an aria-label attribute to the button for screen readers.
Adjust the styling to ensure the border and text colors match for visual
consistency, and use flexbox for better alignment of the icon and text within
the button.
```

</details>

<!-- This is an auto-generated comment by CodeRabbit -->
created_at: 2025-05-20T02:57:45Z
author_association: NONE
diff_hunk: @@ -121,7 +123,7 @@ const Layout = ({ children }) => {
         // dispatch(IdealPersonaValue(true));
         dispatch(ShortlistedPersonaValue(true));
       }
-    } catch (error) {}
+    } catch (error) { }
path: src/common/layout/index.jsx
user: login: coderabbitai[bot]
body: _⚠️ Potential issue_

**Avoid empty catch blocks**

The empty catch block silently ignores any errors that might occur during the session creation process. This makes debugging difficult and could hide important runtime issues.


Consider adding proper error handling:

```diff
-    } catch (error) { }
+    } catch (error) {
+      console.error("Session creation failed:", error);
+      // Consider showing an error notification to the user
+    }
```


<!-- 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
    } catch (error) {
      console.error("Session creation failed:", error);
      // Consider showing an error notification to the user
    }
```

</details>

<!-- suggestion_end -->

<details>
<summary>🤖 Prompt for AI Agents</summary>

```
In src/common/layout/index.jsx at line 126, the catch block is empty, which
silently ignores errors during session creation. Update the catch block to
handle errors properly by logging the error or taking appropriate action to
ensure issues are visible and can be debugged effectively.
```

</details>

<!-- This is an auto-generated comment by CodeRabbit -->
created_at: 2025-05-20T02:57:45Z
author_association: NONE
diff_hunk: @@ -150,20 +152,19 @@ const Layout = ({ children }) => {
     // router?.push("/pricing");
   };
 
+  useEffect(() => {
+    if (window !== undefined) {
+      let getToken = localStorage.getItem("token");
+      if (getToken) {
+        setToken(getToken);
+      }
+    }
+  }, []);
 
   return (
     <div className="">
-      {/* Logout button */}
-      {/* {token !== "" && (
-        <div
-          onClick={() => useLogout()}
-          className="fixed top-[92vh] right-4 z-[100] bg-white shadow-[0px_0px_4px_0px_rgba(238,0,0,0.75)] border border-solid border-red-300 rounded-full p-1.5 hover:p-2 duration-300 cursor-pointer"
-        >
-          <PowerSettingsNewIcon className="text-red-600" />
-        </div>
-      )} */}
       {/* Conditional rendering of header and footer */}
-      {!isChatPage && <Header />}
+      {!isChatPage && <Header logOut={() => useLogout()} token={token} />}
path: src/common/layout/index.jsx
user: login: coderabbitai[bot]
body: _⚠️ Potential issue_

**Fix improper hook usage in the logOut prop**

Using `useLogout()` directly in the prop violates React's Rules of Hooks, as hooks should only be called at the top level of your component, not inside callbacks or nested functions.


Move the hook to the top level and pass a callback that uses its result:

```diff
const Layout = ({ children }) => {
  const { Get, Post } = useApi();
  const router = useRouter();
  const dispatch = useDispatch();
  const { get_auth, ai_personas, sessions } = apis;
+  const logout = useLogout;
+  
+  const handleLogout = async () => {
+    try {
+      await logout();
+      // Optional: Add user feedback on successful logout
+    } catch (error) {
+      console.error("Logout failed:", error);
+      // Optional: Add user feedback on logout failure
+    }
+  };

  // ...existing code...
  
  return (
    <div className="">
      {/* Conditional rendering of header and footer */}
-      {!isChatPage && <Header logOut={() => useLogout()} token={token} />}
+      {!isChatPage && <Header logOut={handleLogout} token={token} />}
      {/* ...rest of the component... */}
    </div>
  );
};
```


> Committable suggestion skipped: line range outside the PR's diff.

<details>
<summary>🤖 Prompt for AI Agents</summary>

```
In src/common/layout/index.jsx at line 167, the useLogout hook is incorrectly
called inside the logOut prop, violating React's Rules of Hooks. To fix this,
call useLogout() at the top level of the component to get the logout function,
then pass a callback referencing that function to the logOut prop instead of
calling the hook inline.
```

</details>

<!-- This is an auto-generated comment by CodeRabbit -->
created_at: 2025-05-20T02:57:46Z
author_association: NONE
diff_hunk: @@ -150,20 +152,19 @@ const Layout = ({ children }) => {
     // router?.push("/pricing");
   };
 
+  useEffect(() => {
+    if (window !== undefined) {
+      let getToken = localStorage.getItem("token");
+      if (getToken) {
+        setToken(getToken);
+      }
+    }
+  }, []);
 
   return (
     <div className="">
-      {/* Logout button */}
-      {/* {token !== "" && (
-        <div
-          onClick={() => useLogout()}
-          className="fixed top-[92vh] right-4 z-[100] bg-white shadow-[0px_0px_4px_0px_rgba(238,0,0,0.75)] border border-solid border-red-300 rounded-full p-1.5 hover:p-2 duration-300 cursor-pointer"
-        >
-          <PowerSettingsNewIcon className="text-red-600" />
-        </div>
-      )} */}
       {/* Conditional rendering of header and footer */}
-      {!isChatPage && <Header />}
+      {!isChatPage && <Header logOut={() => useLogout()} token={token} />}
       {children}
       {!isChatPage && <Footer />}
path: src/common/layout/index.jsx
user: login: coderabbitai[bot]
body: _💡 Verification agent_

<details>
<summary>🧩 Analysis chain</summary>

**Verify token validation after logout**

When a user logs out, you need to ensure that the token state in the Layout component is updated accordingly to reflect the logged-out state.

---

🏁 Script executed:

```shell
#!/bin/bash
# Check if the token state is updated after logout

# Look for useEffect dependencies that would re-check the token state
rg "useEffect\(.+, \[.*(token|getToken).*\]\)" --type js --type jsx src/

# Check if there's any code that updates the token state after logout
rg "setToken\(.*\)" --type js --type jsx src/
```

Length of output: 178

---

🏁 Script executed:

```shell
#!/bin/bash
# Find how token state is managed in Layout component and others

# Locate the Layout file
LAYOUT_FILE=$(fd -e jsx -e js 'src/common/layout/index\.jsx' | head -n1)

# Print the first 200 lines of the Layout file to inspect token state management
if [ -f "$LAYOUT_FILE" ]; then
  echo "---- Showing start of $LAYOUT_FILE ----"
  sed -n '1,200p' "$LAYOUT_FILE"
else
  echo "Layout file not found."
fi

# Search for useState declarations involving token across the codebase
echo "---- Searching for token useState declarations ----"
rg "useState\([^)]*token" -g "*.jsx" -g "*.js" src/ || true

# Search for any setToken references
echo "---- Searching for setToken calls ----"
rg "setToken" -g "*.jsx" -g "*.js" src/ || true

# Search for useLogout implementation to see how it handles token
echo "---- Searching for useLogout implementation ----"
rg "function useLogout" -g "*.js" -g "*.jsx" -A5 src/ || rg "const useLogout" -g "*.js" -g "*.jsx" -A5 src/ || true
```

Length of output: 1048

---

}

---

🏁 Script executed:

```shell
#!/bin/bash
# Display Layout component to inspect token management
echo "---- Layout Component Head (1–200) ----"
sed -n '1,200p' src/common/layout/index.jsx || echo "File not found: src/common/layout/index.jsx"

echo
echo "---- useEffect Hooks in Layout ----"
grep -n "useEffect" src/common/layout/index.jsx || echo "No useEffect found"

echo
echo "---- getToken and setToken Usage ----"
grep -nE "getToken|setToken" src/common/layout/index.jsx || echo "No getToken/setToken found"

echo
echo "---- useLogout Hook Implementation ----"
sed -n '1,50p' src/hooks/useLogout.js || echo "File not found: src/hooks/useLogout.js"
```

Length of output: 7888

---



</details>

**Ensure Layout clears its token state on logout**

The `Layout` component only reads `localStorage.token` once (in a `useEffect` with an empty deps array), so after calling `useLogout()` and removing the token from storage, the `token` state remains stale. Update the logout handler to also clear that state:

• In `src/common/layout/index.jsx`, add a dedicated logout callback:
```diff
- <Header logOut={() => useLogout()} token={token} />
+ const handleLogout = async () => {
+   await useLogout();
+   setToken("");
+ };
+ …
+ <Header logOut={handleLogout} token={token} />
```

• (Optional) If you need to react to token changes elsewhere, consider adding a `storage` event listener or including `token` in the deps of your effect to re-read from `localStorage`.  



> Committable suggestion skipped: line range outside the PR's diff.

<details>
<summary>🤖 Prompt for AI Agents</summary>

```
In src/common/layout/index.jsx around lines 164 to 169, the logout function
calls useLogout() but does not update the Layout component's token state,
causing it to remain stale after logout. Fix this by creating a dedicated logout
handler inside Layout that calls useLogout() and also clears the token state
(e.g., by setting the token state to null or empty). Replace the inline logout
call in the Header component with this new handler to ensure the UI reflects the
logged-out state. Optionally, consider adding a storage event listener or
updating useEffect dependencies to handle token changes from other tabs or
sources.
```

</details>

<!-- This is an auto-generated comment by CodeRabbit -->
created_at: 2025-05-20T02:57:46Z
author_association: NONE

PR comments:
user: login: vercel[bot]
created_at: 2025-05-20T02:54:04Z
body: @RajdwipDesun is attempting to deploy a commit to the **desuntech's projects** Team on [Vercel](https://vercel.com).

A member of the Team first needs to [authorize it](https://vercel.com/git/authorize?team=desuntech's%20projects&type=github&job=%7B%22headInfo%22%3A%7B%22sha%22%3A%225e9fae77ebe18a45bc239bed7ab7cd51795669f1%22%7D%2C%22id%22%3A%22QmbkkQH8RhcHBCC6WPXnprEHmwUSCJ7KGetiH4Nuik61AS%22%2C%22org%22%3A%22DesunTech%22%2C%22prId%22%3A13%2C%22repo%22%3A%22real-sales%22%7D).


author_association: NONE
user: login: coderabbitai[bot]
created_at: 2025-05-20T02:54:06Z
body: <!-- This is an auto-generated comment: summarize by coderabbit.ai -->
<!-- This is an auto-generated comment: failure by coderabbit.ai -->

> [!CAUTION]
> ## Review failed
> 
> The pull request is closed.

<!-- end of auto-generated comment: failure by coderabbit.ai -->
<!-- walkthrough_start -->

"""
## Walkthrough

The updates introduce improved disabled-state handling and visual feedback for persona selection cards, conditional rendering and logic for a logout button in the header based on authentication state, and minor adjustments to persona role titles. The logout button is now managed by the header component, receiving relevant props for logout functionality and authentication status.

## Changes

| File(s)                                                                 | Change Summary                                                                                                                                                                                                                                    |
|-------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| src/common/PersonaCard.jsx                                              | Simplified className logic; added disabled-state handling for the BookAdemo button, updating both visual style and click behavior to prevent interaction when disabled.                                                                        |
| src/common/layout/header/index.jsx                                      | Changed Header component to accept props; simplified className template literals; delegated logout button rendering and logic to Header via new props `logOut` and `token`.                                                                      |
| src/common/layout/index.jsx                                             | Removed fixed-position logout button; passed `logOut` and `token` props to Header; adjusted JSX to delegate logout handling to Header component; minor catch block formatting change.                                                            |
| src/common/modals/IdealPersonaModal.jsx                                 | Updated role titles in `idealPersonaArr` initialization: `"procurement"` → `"procurement_manager"` and `"maintenance"` → `"maintenance_manager"`.                                                                                                |
| src/common/modals/PersonaTypeModal.jsx                                  | Added `disabled` prop to multiple `PersonaCard` components, disabling them conditionally based on the falsiness of the first element in their respective persona data arrays.                                                                    |

## Sequence Diagram(s)

```mermaid
sequenceDiagram
    participant User
    participant Header
    participant Layout
    participant useLogout

    User->>Header: Clicks Logout Button (if token present)
    Header->>Layout: Calls logOut() prop
    Layout->>useLogout: Executes logout logic
    useLogout-->>Layout: Clears authentication state
    Layout-->>Header: Updates token prop (now empty)
    Header-->>User: Logout button disappears
```

```mermaid
sequenceDiagram
    participant User
    participant PersonaTypeModal
    participant PersonaCard

    loop For each persona category
        PersonaTypeModal->>PersonaCard: Renders with disabled = !data[0]
        User->>PersonaCard: Attempts click (if disabled)
        PersonaCard-->>User: Ignores click (if disabled)
    end
```

## Poem

> 🐇  
> Cards now know when to rest,  
> Logout buttons pass the test.  
> Roles renamed with care precise,  
> Disabled states—no need to think twice.  
> With every hop, the code refines,  
> In fields of logic, the rabbit shines!  
>

<!-- walkthrough_end -->
<!-- This is an auto-generated comment: all tool run failures by coderabbit.ai -->

> [!WARNING]
> There were issues while running some tools. Please review the errors and either fix the tool's configuration or disable the tool if it's a critical failure.
> 
> <details>
> <summary>🔧 ESLint</summary>
> 
> > If the error stems from missing dependencies, add them to the package.json file. For unrecoverable errors (e.g., due to private dependencies), disable the tool in the CodeRabbit configuration.
> 
> npm warn config production Use `--omit=dev` instead.
> npm error Exit handler never called!
> npm error This is an error with npm itself. Please report this error at:
> npm error   <https://github.com/npm/cli/issues>
> npm error A complete log of this run can be found in: /.npm/_logs/2025-05-20T02_58_37_885Z-debug-0.log
> 
> 
> 
> </details>

<!-- end of auto-generated comment: all tool run failures by coderabbit.ai -->
<!-- internal state start -->


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

<!-- internal state end -->
<!-- announcements_start -->

> [!NOTE]
> <details>
> <summary>⚡️ AI Code Reviews for VS Code, Cursor, Windsurf</summary>
> 
> CodeRabbit now has a plugin for VS Code, Cursor and Windsurf. This brings AI code reviews directly in the code editor. Each commit is reviewed immediately, finding bugs before the PR is raised. Seamless context handoff to your AI code agent ensures that you can easily incorporate review feedback.
> Learn more [here](http://coderabbit.ai/ide).
> 
> </details>

---

> [!NOTE]
> <details>
> <summary>⚡️ Faster reviews with caching</summary>
> 
> CodeRabbit now supports caching for code and dependencies, helping speed up reviews. This means quicker feedback, reduced wait times, and a smoother review experience overall. Cached data is encrypted and stored securely. This feature will be automatically enabled for all accounts on May 16th. To opt out, configure `Review - Disable Cache` at either the organization or repository level. If you prefer to disable all data retention across your organization, simply turn off the `Data Retention` setting under your Organization Settings.
> Enjoy the performance boost—your workflow just got faster.
> 
> </details>

<!-- announcements_end -->

---

<details>
<summary>📜 Recent review details</summary>

**Configuration used: CodeRabbit UI**
**Review profile: CHILL**
**Plan: Pro**
**Cache: Disabled due to data retention organization setting**
**Knowledge Base: Disabled due to data retention organization setting**


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

Reviewing files that changed from the base of the PR and between 5e9fae77ebe18a45bc239bed7ab7cd51795669f1 and 6d46c43022958901d7a0ea3807acee4254b29bd4.

</details>

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

* `src/common/layout/header/index.jsx` (4 hunks)
* `src/common/layout/index.jsx` (2 hunks)
* `src/common/modals/PersonaTypeModal.jsx` (5 hunks)

</details>

</details>
<!-- finishing_touch_checkbox_start -->

<details open="true">
<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=DesunTech/real-sales&utm_content=13):

- Review comments: Directly reply to a review comment made by CodeRabbit. Example:
  - `I pushed a fix in commit <commit_id>, please review it.`
  - `Explain this complex logic.`
  - `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 explain this code block.`
  -	`@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 explain its main purpose.`
  - `@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.`

### Support

Need help? Create a ticket on our [support page](https://www.coderabbit.ai/contact-us/support) for assistance with any issues or questions.

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 generate sequence diagram` to generate a sequence diagram of the changes in this PR.
- `@coderabbitai resolve` resolve all the CodeRabbit review comments.
- `@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: NONE