# Navbar Links, Dropdowns & React Icons

## Navbar Enhancement and Adding More Features

### 1. Convert Static Links to Next.js Link Components

#### a. Import the Link Component

* At the top of your Navbar file (e.g., <mark style="color:orange;">`components/Navbar.jsx`</mark>), import Link from Next.js:

  ```jsx
  import Link from 'next/link';
  ```

#### b. Replace `<a>` Tags with `<Link>`

* Locate all anchor tags in your <mark style="color:orange;">Navbar</mark> markup.
* For each link, change the opening tag from `<a href="/somepage.html">` to:

  ```jsx
  <Link href="/somepage">
    <a>Some Page</a>
  </Link>
  ```
* **Example:**\
  Replace the logo link:

  ```jsx
  <Link href="/">
    <a className="flex flex-shrink-0 items-center">
      <img className="h-10 w-auto" src="/images/logo-white.png" alt="PropertyPulse" />
      <span className="hidden md:block text-white text-2xl font-bold ml-2">PropertyPulse</span>
    </a>
  </Link>
  ```
* Update all other links similarly (e.g., Home, Properties, Add Property, Messages, Profile, etc.) ensuring you remove the "<mark style="color:red;">.html</mark>" extension for a cleaner URL structure.

***

### 2. Integrate React Icons for Stylish Visuals

#### a. Install React Icons Package

* Open your terminal and run:

  ```bash
  npm install react-icons
  ```

#### b. Import the Required Icon(s)

* In your Navbar component, import the desired icon from the React Icons library. For example, to import the Google icon:

  ```jsx
  import { FaGoogle } from 'react-icons/fa';
  ```

#### c. Replace <mark style="color:yellow;">Font Awesome CDN Markup</mark> with <mark style="color:orange;">React Icons</mark>

* Locate the section where the Google icon is referenced (previously using an `<i>` tag).

```jsx
// before 
<i className="fa-brands fa-google text-white mr-2"></i>
```

* Replace it with the React icon component:

  ```jsx
  // after
  <FaGoogle className="text-white mr-2" />
  ```
* This provides a more React-friendly, customizable icon without relying on an external CDN.

***

### 3. Implement Dropdown Menus with React State

#### a. Mark the Component as a Client Component

* Since dropdown menus require interactivity (state management and event handling), add the `"use client"` directive at the top of your <mark style="color:orange;">Navbar file</mark>:

  ```jsx
  "use client";
  ```

#### b. Import React Hooks

* Import <mark style="color:orange;">`useState`</mark> from React:

  ```jsx
  // component/Navbar.jsx
  import { useState } from 'react';
  ```

#### c. Create State for Dropdowns

* Inside your Navbar component function, create two state variables—one for the mobile menu and one for the profile dropdown:

  ```jsx
  //components/Navbar.jsx
  ...
  export default function Navbar() {

    const [isMobileMenuOpen, setIsMobileMenuOpen] = useState(false);
    const [isProfileMenuOpen, setIsProfileMenuOpen] = useState(false);
    
    return (
    ...
  ```

#### d. Toggle Dropdown Visibility with onClick

* For the mobile menu button, add an <mark style="color:orange;">`onClick`</mark> event that toggles the state:

  ```jsx
  <button
    type="button"
    id="mobile-dropdown-button"
    onClick={() => setIsMobileMenuOpen(prev => !prev)}
    className="relative inline-flex items-center justify-center rounded-md p-2 text-gray-400 hover:bg-gray-700 hover:text-white focus:outline-none focus:ring-2 focus:ring-inset focus:ring-white"
    aria-controls="mobile-menu"
    aria-expanded={isMobileMenuOpen}
  >
    <span className="sr-only">Open main menu</span>
    {/* SVG icon here */}
  </button>
  ```
* For the <mark style="color:orange;">profile dropdown button</mark> (the one with the profile image), add a similar toggle:

  ```jsx
  <button
    type="button"
    onClick={() => setIsProfileMenuOpen(prev => !prev)}
    className="relative flex rounded-full bg-gray-800 text-sm focus:outline-none focus:ring-2 focus:ring-white focus:ring-offset-2 focus:ring-offset-gray-800"
    id="user-menu-button"
    aria-expanded={isProfileMenuOpen}
    aria-haspopup="true"
  >
    <span className="sr-only">Open user menu</span>
    <img className="h-8 w-8 rounded-full" src="/images/profile.png" alt="User Profile" />
  </button>
  ```

#### e. Conditionally Render Dropdown Menus

* Wrap the dropdown menus in a conditional render block. For example, for the mobile menu:

  ```jsx
  //{/* <!-- Mobile menu, show/hide based on menu state. --> */}
   
  {isMobileMenuOpen && (
    <div id="mobile-menu" className="block">
      {/* Mobile menu links go here */}
    </div>
  )}
  ```
* Similarly, for the profile dropdown:

  <pre class="language-jsx"><code class="lang-jsx"><strong>// {/* &#x3C;!-- Profile hide/show dropdown --> */}
  </strong>
  <strong>{isProfileMenuOpen &#x26;&#x26; (
  </strong>  &#x3C;div
      id="user-menu"
      className="absolute right-0 z-10 mt-2 w-48 origin-top-right rounded-md bg-white py-1 shadow-lg ring-1 ring-black ring-opacity-5"
      role="menu"
      aria-orientation="vertical"
      aria-labelledby="user-menu-button"
    >
      &#x3C;Link href="/profile">
        &#x3C;a className="block px-4 py-2 text-sm text-gray-700" role="menuitem">Your Profile&#x3C;/a>
      &#x3C;/Link>
      &#x3C;Link href="/saved-properties">
        &#x3C;a className="block px-4 py-2 text-sm text-gray-700" role="menuitem">Saved Properties&#x3C;/a>
      &#x3C;/Link>
      &#x3C;button className="block w-full text-left px-4 py-2 text-sm text-gray-700" role="menuitem">
        Sign Out
      &#x3C;/button>
    &#x3C;/div>
  )}
  </code></pre>

***

### 4. Testing and Finalizing

#### a. Save and Test

* Save your changes and run your development server:

  ```bash
  npm run dev
  ```
* Open <http://localhost:3000> to verify:
  * The links navigate without full page reloads.
  * The React icons (e.g., FaGoogle) appear as expected.
  * Dropdown menus toggle when clicking the mobile menu button and the profile image.

#### b. Debug Any Issues

* Check the browser console for errors (e.g., JSX attribute warnings, state issues).
* Adjust CSS classes and component structure as needed to match your desired aesthetics.

***

### Recap

* **Link Conversion:** Replaced HTML anchor tags with Next.js’s `<Link>` for smoother client-side navigation.
* **React Icons:** Installed and imported react-icons to replace the external Font Awesome CDN.
* **Dropdown Menus:** Added interactive dropdowns for mobile and profile sections using React’s state hook and conditional rendering.
* **Testing:** Verified the functionality in development mode and ensured no errors occur.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://reactjs.koida.tech/backend-frameworks-next.js/hands-on-practice-2/navbar-links-dropdowns-and-react-icons.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
