> For the complete documentation index, see [llms.txt](https://reactjs.koida.tech/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://reactjs.koida.tech/backend-frameworks-next.js/hands-on-practice-2/navbar-links-dropdowns-and-react-icons.md).

# 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.
