<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: David</title>
    <description>The latest articles on DEV Community by David (@ayobami).</description>
    <link>https://dev.to/ayobami</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F362912%2Fd6efcf61-5d71-4634-b172-073eebecca98.png</url>
      <title>DEV Community: David</title>
      <link>https://dev.to/ayobami</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ayobami"/>
    <language>en</language>
    <item>
      <title>Chrome removing third party cookies</title>
      <dc:creator>David</dc:creator>
      <pubDate>Sat, 29 Jun 2024 21:41:08 +0000</pubDate>
      <link>https://dev.to/ayobami/chrome-removing-third-party-cookies-42g0</link>
      <guid>https://dev.to/ayobami/chrome-removing-third-party-cookies-42g0</guid>
      <description>&lt;p&gt;I was working on authentication and when I inspected my cookie in my client and I saw this warning from google chrome [insert image here] that 3rd party cookies are been deprecated and will be blocked in the future. They are working to stop 3rd party tracking via cookies &lt;a href="https://blog.google/products/chrome/privacy-sandbox-tracking-protection/" rel="noopener noreferrer"&gt;google blog&lt;/a&gt; thereby creating tracking protection.In my case I was hosting the backend and the frontend on separate servers. The frontend is hosted on vercel, while the backend on render, so when the backend sends the cookie to the client since they are not on the same server hence different domain &lt;a href="https://web.dev/articles/same-site-same-origin" rel="noopener noreferrer"&gt;an article explaining&lt;/a&gt;, the cookie will be treated as a 3rd party cookie. &lt;/p&gt;

&lt;h5&gt;
  
  
  Cookie prefix
&lt;/h5&gt;

&lt;p&gt;The solution I implemented was from reading mdn documentation &lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Cookies" rel="noopener noreferrer"&gt;mdn_doc&lt;/a&gt;. I added a prefix &lt;code&gt;__Host-&lt;/code&gt; to the cookie name. &lt;code&gt;__Host-&lt;/code&gt; is called a cookie prefix. There are two types; &lt;code&gt;__Host-&lt;/code&gt; and &lt;code&gt;__Secure-&lt;/code&gt;.&lt;br&gt;
a. &lt;code&gt;__Host-&lt;/code&gt; means that the cookie is domain-locked, when you set a cookie with this header prefix it is accepted if it's marked with the &lt;code&gt;Secrue&lt;/code&gt; attribute, was sent from a secure origin &lt;code&gt;https&lt;/code&gt;, does not include a &lt;code&gt;Domain&lt;/code&gt; attribute and has the &lt;code&gt;Path&lt;/code&gt; set to &lt;code&gt;'/'&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;So my code looks like this now. After modifying my cookie options, the warning did not show again because.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;cookieOptions&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;maxAge&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;24&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// 30 days&lt;/span&gt;
    &lt;span class="na"&gt;httpOnly&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// prevents client scripts from accessing the cookie&lt;/span&gt;
    &lt;span class="na"&gt;secure&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;NODE_ENV&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;production&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// the cookie should be sent over secure https connection&lt;/span&gt;
    &lt;span class="na"&gt;sameSite&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;NODE_ENV&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;development&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Lax&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;None&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cookie&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;NODE_ENV&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;development&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;sage_warehouse_token&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;__Host-sage_warehouse_token&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;refreshToken&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nx"&gt;cookieOptions&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;header&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Authorization&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;accessToken&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If anyone encountered this same issue I would love to know how they resolved it, I am learning backend development with &lt;code&gt;express.js&lt;/code&gt;, which is fun. I am currently working on an e-commerce application to solidify my knowledge as I learn new concepts.  &lt;/p&gt;

&lt;p&gt;If you are interested in learning backend development and you don't want to do it alone you can checkout &lt;a href="https://hng.tech/internship" rel="noopener noreferrer"&gt;HNG&lt;/a&gt; where you will participate in tasks with peers and ask for help from mentors as you go along in your tech journey, they also have a  &lt;a href="https://hng.tech/premium" rel="noopener noreferrer"&gt;premium version&lt;/a&gt; where you can earn a certificate and it also comes with some perks.&lt;/p&gt;

</description>
      <category>node</category>
      <category>webdev</category>
      <category>beginners</category>
      <category>tutorial</category>
    </item>
    <item>
      <title># Create a simple Date Range Picker in React.</title>
      <dc:creator>David</dc:creator>
      <pubDate>Fri, 26 May 2023 04:00:00 +0000</pubDate>
      <link>https://dev.to/ayobami/-create-a-simple-date-range-picker-in-react-1l3m</link>
      <guid>https://dev.to/ayobami/-create-a-simple-date-range-picker-in-react-1l3m</guid>
      <description>&lt;p&gt;&lt;a href="https://www.loom.com/share/a9fe99bd0062435c931148b1374a0676" rel="noopener noreferrer"&gt;video&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Instantiate a new project&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$ npm create vite@latest&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Configure the app with the following:-&lt;/p&gt;

&lt;p&gt;Project name: calendar-app&lt;/p&gt;

&lt;p&gt;Framework: React&lt;/p&gt;

&lt;p&gt;Variant: JavaScript&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
$ cd calendar-app

$ npm install

$ npm run dev

# to start the development server 
#open the development server in your browser
# mine is at http://localhost:5173/

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Open your newly created app in your preferred editor.&lt;br&gt;
For vs-code users in the project directory run &lt;code&gt;$ code .&lt;/code&gt; it will open your application in vs-code.&lt;br&gt;
  Remove all unneccasary files from the scaffolded project and your project should look like the screenshot below&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#app.js

import './App.css'



function App() {

  return &amp;lt;&amp;gt;welcome&amp;lt;/&amp;gt;

}

export default App
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd0citmqmmgo0sjd4qpuh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd0citmqmmgo0sjd4qpuh.png" alt="first-screen" width="800" height="430"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For our project we will be making use of the &lt;strong&gt;  react-date-range package &lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;from your   app/directory  run&lt;/p&gt;

&lt;p&gt;&lt;code&gt;npm i react-date-range&lt;/code&gt; &lt;a href="https://github.com/hypeserver/react-date-range" rel="noopener noreferrer"&gt;react-date-range&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;this will add the package to your app dependencies.&lt;/p&gt;

&lt;p&gt;we would also be using the date-fns package so&lt;/p&gt;

&lt;p&gt;from your terminal again run&lt;/p&gt;

&lt;p&gt;&lt;code&gt;npm install date-fns&lt;/code&gt; &lt;a href="https://date-fns.org/" rel="noopener noreferrer"&gt;date-fns&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Inside your &lt;code&gt;/src&lt;/code&gt; directory create a folder called &lt;em&gt;components&lt;/em&gt;, inside the &lt;em&gt;components&lt;/em&gt; folder, create an empty file &lt;code&gt;singleCalendar.jsx&lt;/code&gt;, you can do all these from the bash terminal.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ cd src &amp;amp;&amp;amp; mkdir components
$ cd components &amp;amp;&amp;amp; touch singleCalendar.jsx

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;open the new file &lt;code&gt;singleCalendar.jsx&lt;/code&gt; and import the &lt;code&gt;&amp;lt;DateRange /&amp;gt;&lt;/code&gt; component&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { DateRange } from 'react-date-range'

export const SingleCalendar = () =&amp;gt; {

  return (

    &amp;lt;div&amp;gt;

      &amp;lt;DateRange /&amp;gt;

    &amp;lt;/div&amp;gt;

  )

}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;then import the  SingleCalandar  into &lt;code&gt;App.jsx&lt;/code&gt; your code should look like this&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import './App.css'

import { SingleCalendar } from './components/singleCalendar'

function App() {
  return (
    &amp;lt;div&amp;gt;
      &amp;lt;SingleCalendar /&amp;gt;
    &amp;lt;/div&amp;gt;
  )
}

export default App

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next, we would import css from 'react-date-range' for styling. Add the following code to your &lt;code&gt;main.jsx&lt;/code&gt; file&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import 'react-date-range/dist/styles.css'
import 'react-date-range/dist/theme/default.css'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;You can remove all the default styling that comes with Vite.&lt;/p&gt;

&lt;p&gt;When you are importing styles for a component, you should put the styles in the topmost component, so that you can use the same styles across other places in your app.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Your &lt;code&gt;main.jsx&lt;/code&gt; should look like this&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
import React from 'react'

import ReactDOM from 'react-dom/client'

import App from './App.jsx'

import './index.css'

//Add styles for the calendar app

import 'react-date-range/dist/styles.css' // main style file
import 'react-date-range/dist/theme/default.css'

ReactDOM.createRoot(document.getElementById('root')).render(

  &amp;lt;React.StrictMode&amp;gt;

    &amp;lt;App /&amp;gt;

  &amp;lt;/React.StrictMode&amp;gt;

)

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8agpuq3xvyme2ne8w23n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8agpuq3xvyme2ne8w23n.png" alt="https://res.cloudinary.com/diggungrj/image/upload/v1683865345/calendar-initial_oyjmxj.png" width="800" height="314"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Good job getting here so far 👏&lt;/p&gt;

&lt;p&gt;Let's add a container where our calendar result will be viewed, we would be using an input element to store the calendar value.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
import { DateRange } from 'react-date-range'

export const SingleCalendar = () =&amp;gt; {

  return (

 &amp;lt;div className='container'&amp;gt;

      &amp;lt;DateRange className='calendarStyle' /&amp;gt;

      &amp;lt;div&amp;gt;

        &amp;lt;input type='text' className='single-calendar-input' /&amp;gt;

      &amp;lt;/div&amp;gt;

    &amp;lt;/div&amp;gt;

  )

}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6fwa2j8mazwjhj3g22bg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6fwa2j8mazwjhj3g22bg.png" alt="https://res.cloudinary.com/diggungrj/image/upload/v1683865344/calendar-input-initial_fihtyd.png" width="800" height="314"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then let us style the input container,&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;create a calendar icon&lt;/li&gt;
&lt;li&gt;style the input container&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;create a  calendaricon  file and the add the following jsx to the file.&lt;br&gt;
&lt;em&gt;I copied this code from &lt;a href="https://heroicons.com/" rel="noopener noreferrer"&gt;heroicons&lt;/a&gt;&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;export const CalendarIcon = () =&amp;gt; {
  return (
    &amp;lt;svg
      xmlns='http://www.w3.org/2000/svg'
      fill='none'
      viewBox='0 0 24 24'
      strokeWidth={1.5}
      stroke='currentColor'
      className='w-6 h-6'
    &amp;gt;
      &amp;lt;path
        strokeLinecap='round'
        strokeLinejoin='round'
        d='M6.75 3v2.25M17.25 3v2.25M3 18.75V7.5a2.25 2.25 0 012.25-2.25h13.5A2.25 2.25 0 0121 7.5v11.25m-18 0A2.25 2.25 0 005.25 21h13.5A2.25 2.25 0 0021 18.75m-18 0v-7.5A2.25 2.25 0 015.25 9h13.5A2.25 2.25 0 0121 11.25v7.5m-9-6h.008v.008H12v-.008zM12 15h.008v.008H12V15zm0 2.25h.008v.008H12v-.008zM9.75 15h.008v.008H9.75V15zm0 2.25h.008v.008H9.75v-.008zM7.5 15h.008v.008H7.5V15zm0 2.25h.008v.008H7.5v-.008zm6.75-4.5h.008v.008h-.008v-.008zm0 2.25h.008v.008h-.008V15zm0 2.25h.008v.008h-.008v-.008zm2.25-4.5h.008v.008H16.5v-.008zm0 2.25h.008v.008H16.5V15z'
      /&amp;gt;
    &amp;lt;/svg&amp;gt;
  )
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;next, add the css style  &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt; note: I have included some classes in the styles for some elements that have not been created  yet.&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
#  index.css

*,
*::after,
*::before {
  box-sizing: border-box;
  margin: 0;
  padding: 0;
}

html {
  font-size: 62.5%;
}

.wrapper {
  display: flex;
  justify-content: center;
  align-items: center;
}

.container {
  padding: 5rem;
}

.calendarStyle {
  border: 1px solid #eee;
  font-family: poppins;
  border-radius: 1.5rem;
  z-index: 999;
  position: relative;
  background-color: #fff;
}

.icon {
  height: 1.6rem;
  width: 2rem;
}

input {
  height: 100%;
  width: 90%;
  border: none;
  outline: none;
}

.single-calendar-input {
  height: 4rem;
  width: 35rem;
  border-radius: 0.5rem;
  border: 1px solid #ddd;
  padding: 0 10px;
  font-weight: 500;
  color: #686868;
  margin-bottom: 1rem;
  display: flex;
  align-items: center;
}

.element-container {
  position: relative;
}

.dropdown {
  position: absolute;
  top: 50px;
  left: 0px;
}

.dropdown.active {
  opacity: 1;
  visibility: visible;
  transform: translateY(0);
  transition: 500ms ease;
}

.dropdown.inactive {
  opacity: 0;
  visibility: hidden;
  transform: translateY(-20px);
  transition: 500ms ease;
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And also update the singleCalendar component,&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { DateRange } from 'react-date-range'
import { CalendarIcon } from '../assets/calendaricon'

export const SingleCalendar = () =&amp;gt; {
  return (
 &amp;lt;div className='container'&amp;gt;
      &amp;lt;div&amp;gt;
        &amp;lt;div className='single-calendar-input'&amp;gt;
          &amp;lt;input type='text' /&amp;gt;
          &amp;lt;div className='icon'&amp;gt;
            &amp;lt;CalendarIcon /&amp;gt;
          &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;
      &amp;lt;/div&amp;gt;
      &amp;lt;DateRange className='calendarStyle' /&amp;gt;   
    &amp;lt;/div&amp;gt;
  )
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your page should look like this now&lt;/p&gt;

&lt;p&gt;Nice job so far 👍&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7crhrybz7rq6y51upkzl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7crhrybz7rq6y51upkzl.png" alt="screen2" width="800" height="430"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Let's start working on the functionalities
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  we handle the calendar value with useState&lt;/li&gt;
&lt;li&gt;  we will handle the date format&lt;/li&gt;
&lt;li&gt;  we will set an event listener on the input to open the calendar when clicked&lt;/li&gt;
&lt;li&gt;  we will close the calendar when any part of our page is clicked apart from the calendar component&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Handle the calendar state
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
# singleCalendar.jsx

import { useState } from 'react'

import { DateRange } from 'react-date-range'

import { CalendarIcon } from '../assets/calendaricon'


export const SingleCalendar = () =&amp;gt; {

  const [state, setState] = useState([

    {

      startDate: new Date(),

      endDate: new Date(),

      key: 'selection',

    },

  ])


  return (

    &amp;lt;div className='container'&amp;gt;

      &amp;lt;DateRange

        className='calendarStyle'

        onChange={(item) =&amp;gt; setState([item.selection])}

        ranges={state}

        showSelectionPreview={false}

        editableDateInputs={false}

        showMonthAndYearPickers={false}

        showDateDisplay={false}

        rangeColors={['#4C988E', '#4C988E', '#000000']}

        direction='horizontal'

      /&amp;gt;

      &amp;lt;div className='single-calendar-input'&amp;gt;

        &amp;lt;input type='text' /&amp;gt;

        &amp;lt;div className='icon'&amp;gt;

          &amp;lt;CalendarIcon /&amp;gt;

        &amp;lt;/div&amp;gt;

      &amp;lt;/div&amp;gt;

    &amp;lt;/div&amp;gt;

  )

}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;if you &lt;code&gt;console.log({state})&lt;/code&gt; you will see an array of your current selected date range.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc8d7kead9grvxwifdu1k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc8d7kead9grvxwifdu1k.png" alt="screen-3" width="800" height="430"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Next, we will set an event listener on the input to open the calendar when the input element is clicked
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;hide the calendar component&lt;/li&gt;
&lt;li&gt;show the calendar component when I click on the input element&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let's go,&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
# singleCalendar.jsx

import { useState } from 'react'

import { DateRange } from 'react-date-range'

import { CalendarIcon } from '../assets/calendaricon'



export const SingleCalendar = () =&amp;gt; {

  const [open, setOpen] = useState(false)

  const [state, setState] = useState([

    {

      startDate: new Date(),

      endDate: new Date(),

      key: 'selection',

    },

  ])



  console.log({ state })



  return (

    &amp;lt;div className='container'&amp;gt;

      &amp;lt;div className='element-container'&amp;gt;

        &amp;lt;div className={`dropdown ${open ? 'active' : 'inactive'}`}&amp;gt;

          &amp;lt;DateRange

            className='calendarStyle'

            onChange={(item) =&amp;gt; setState([item.selection])}

            ranges={state}

            showSelectionPreview={false}

            editableDateInputs={false}

            showMonthAndYearPickers={false}

            showDateDisplay={false}

            rangeColors={['#4C988E', '#4C988E', '#000000']}

            direction='horizontal'

          /&amp;gt;

        &amp;lt;/div&amp;gt;

        &amp;lt;div className='single-calendar-input'&amp;gt;

          &amp;lt;input type='text' readOnly onClick={() =&amp;gt; setOpen(!open)} /&amp;gt;

          &amp;lt;div className='icon'&amp;gt;

            &amp;lt;CalendarIcon /&amp;gt;

          &amp;lt;/div&amp;gt;

        &amp;lt;/div&amp;gt;

      &amp;lt;/div&amp;gt;

    &amp;lt;/div&amp;gt;

  )

}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your app should now be hidden and will toggle the visible/hidden state when the input element is clicked.&lt;/p&gt;

&lt;h3&gt;
  
  
  Show the value of the &lt;code&gt;DateRange&lt;/code&gt; state in the input element
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
import { useState } from 'react'

import { DateRange } from 'react-date-range'

export const SingleCalendar = () =&amp;gt; {

  const [open, setOpen] = useState(false)

  const [state, setState] = useState([

    {

      startDate: new Date(),

      endDate: new Date(),

      key: 'selection',

    },

  ])

  return (

    &amp;lt;div className='container'&amp;gt;

      &amp;lt;div className='element-container'&amp;gt;

        &amp;lt;input

          type='text'

          className='single-calendar-input'

          onClick={() =&amp;gt; {

            setOpen(!open)

          }}

++          readOnly

++          value={`${state[0].startDate} - ${state[0].endDate}`}

        /&amp;gt;

        &amp;lt;div className={`dropdown ${open ? 'active' : 'inactive'}`}&amp;gt;

          &amp;lt;DateRange

            className='calendarStyle'

            onChange={(item) =&amp;gt; setState([item.selection])}

            ranges={state}

            showSelectionPreview={false}

            editableDateInputs={false}

            showMonthAndYearPickers={false}

            showDateDisplay={false}

            rangeColors={['#4C988E', '#4C988E', '#000000']}

            direction='horizontal'

          /&amp;gt;

        &amp;lt;/div&amp;gt;

      &amp;lt;/div&amp;gt;

    &amp;lt;/div&amp;gt;

  )

}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;You will see the unformatted date value inside the input element&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcci4iaqe2veebopjl65m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcci4iaqe2veebopjl65m.png" alt="https://res.cloudinary.com/diggungrj/image/upload/v1683865344/calendar-5_h83fhc.png" width="800" height="372"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Format the date inside the input element
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
import { useState, useEffect } from 'react'

import { DateRange } from 'react-date-range'

import { CalendarIcon } from '../assets/calendaricon'

import { format } from 'date-fns'



export const SingleCalendar = () =&amp;gt; {

  const [open, setOpen] = useState(false)

  const [state, setState] = useState([

    {

      startDate: new Date(),

      endDate: new Date(),

      key: 'selection',

    },

  ])


  const [formatDate, setFormatDate] = useState({

    startDate: new Date(),



    endDate: new Date(),

  })


  useEffect(() =&amp;gt; {

    setFormatDate((prev) =&amp;gt; {

      return {

        ...prev,



        startDate: format(state[0].startDate, 'dd/MM/yyyy'),



        endDate: format(state[0].endDate, 'dd/MM/yyyy'),

      }

    })

  }, [state])


  // console.log({ state })

  return (

    &amp;lt;div className='container'&amp;gt;

      &amp;lt;div className='element-container'&amp;gt;

        &amp;lt;div className={`dropdown ${open ? 'active' : 'inactive'}`}&amp;gt;

          &amp;lt;DateRange

            className='calendarStyle'

            onChange={(item) =&amp;gt; setState([item.selection])}

            ranges={state}

            showSelectionPreview={false}

            editableDateInputs={false}

            showMonthAndYearPickers={false}

            showDateDisplay={false}

            rangeColors={['#4C988E', '#4C988E', '#000000']}

            direction='horizontal'

          /&amp;gt;

        &amp;lt;/div&amp;gt;

        &amp;lt;div className='single-calendar-input'&amp;gt;

          &amp;lt;input

            type='text'

            readOnly

            onClick={() =&amp;gt; setOpen(!open)}

            value={`${formatDate.startDate}-${formatDate.endDate}`}

          /&amp;gt;

          &amp;lt;div className='icon'&amp;gt;

            &amp;lt;CalendarIcon /&amp;gt;

          &amp;lt;/div&amp;gt;

        &amp;lt;/div&amp;gt;

      &amp;lt;/div&amp;gt;

    &amp;lt;/div&amp;gt;
  )
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;you may be wondering why I did not use the format method directly inside my component, the reason is because of an error caused by using format method inside the input element to directly format the value but it will throw an  &lt;a href="https://stackoverflow.com/questions/73602690/uncaught-error-minified-react-error-425-help-me" rel="noopener noreferrer"&gt;error&lt;/a&gt; . &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiuqmxxlwqn9ivej2m9kg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiuqmxxlwqn9ivej2m9kg.png" alt="https://res.cloudinary.com/diggungrj/image/upload/v1683865344/calendar-6_lcuyis.png" width="800" height="378"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Finally, handle click outside so that when I click outside the component or the body of the page the calendar will close
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
# singleCalendar.jsx

import { useState, useEffect, useRef } from 'react'

import { DateRange } from 'react-date-range'

import { CalendarIcon } from '../assets/calendaricon'

import { format } from 'date-fns'



export const SingleCalendar = () =&amp;gt; {

  const [open, setOpen] = useState(false)

  const [state, setState] = useState([

    {

      startDate: new Date(),

      endDate: new Date(),

      key: 'selection',

    },

  ])


  const [formatDate, setFormatDate] = useState({

    startDate: new Date(),

    endDate: new Date(),

  })

  useEffect(() =&amp;gt; {

    setFormatDate((prev) =&amp;gt; {

      return {

        ...prev,



        startDate: format(state[0].startDate, 'dd/MM/yyyy'),



        endDate: format(state[0].endDate, 'dd/MM/yyyy'),

      }

    })

  }, [state])



  // console.log({ state })



  // handle click outside

  const calendarRef = useRef()



  useEffect(() =&amp;gt; {

    const handler = (e) =&amp;gt; {

      if (!calendarRef?.current.contains(e.target)) {

        setOpen(false)

      }

    }



    document.addEventListener('mousedown', handler)



    return () =&amp;gt; {

      document.removeEventListener('mousedown', handler)

    }

  })



  return (

    &amp;lt;div className='container'&amp;gt;

      &amp;lt;div className='element-container' ref={calendarRef}&amp;gt;

        &amp;lt;div className={`dropdown ${open ? 'active' : 'inactive'}`}&amp;gt;

          &amp;lt;DateRange

            className='calendarStyle'

            onChange={(item) =&amp;gt; setState([item.selection])}

            ranges={state}

            showSelectionPreview={false}

            editableDateInputs={false}

            showMonthAndYearPickers={false}

            showDateDisplay={false}

            rangeColors={['#4C988E', '#4C988E', '#000000']}

            direction='horizontal'

          /&amp;gt;

        &amp;lt;/div&amp;gt;



        &amp;lt;div className='single-calendar-input'&amp;gt;

          &amp;lt;input

            type='text'

            readOnly

            onClick={() =&amp;gt; setOpen(!open)}

            value={`${formatDate.startDate}-${formatDate.endDate}`}

          /&amp;gt;

          &amp;lt;div className='icon'&amp;gt;

            &amp;lt;CalendarIcon /&amp;gt;

          &amp;lt;/div&amp;gt;

        &amp;lt;/div&amp;gt;

      &amp;lt;/div&amp;gt;

    &amp;lt;/div&amp;gt;

  )

}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The complete source code can be found &lt;a href="https://github.com/davieoba/calendar-app" rel="noopener noreferrer"&gt;here&lt;/a&gt;&lt;/p&gt;

</description>
      <category>react</category>
      <category>webdev</category>
      <category>reactdaterange</category>
      <category>beginners</category>
    </item>
  </channel>
</rss>
