From b8c5dd2739b72c9ed951e2f7f614fe708ad9a131 Mon Sep 17 00:00:00 2001
From: Himanshu Aggarwal <aggarwah@mcmaster.ca>
Date: Thu, 10 Mar 2022 14:53:33 -0500
Subject: [PATCH] Setup animation for dropdown; Pass filter options as props
 from parent

---
 .../components/dropdown/FilterDropdown.js     | 45 +++++++++++--------
 src/cryptometrics/pages/index.js              |  3 +-
 src/cryptometrics/styles/globals.css          | 19 ++++++++
 3 files changed, 48 insertions(+), 19 deletions(-)

diff --git a/src/cryptometrics/components/dropdown/FilterDropdown.js b/src/cryptometrics/components/dropdown/FilterDropdown.js
index 23cf356..3781d9f 100644
--- a/src/cryptometrics/components/dropdown/FilterDropdown.js
+++ b/src/cryptometrics/components/dropdown/FilterDropdown.js
@@ -3,9 +3,9 @@ import classNames from "classnames";
 import React, { useState, useEffect } from "react";
 import Button from "../button/Button";
 import { RadioInputForm } from "../radio/RadioForm";
-import { filterOptions } from "../../constants";
+import { CSSTransition } from "react-transition-group";
 
-export function FilterDropdown({ open, setOpen, addFilter }) {
+export function FilterDropdown({ filterOptions, setOpen, addFilter }) {
   const [selectedFilter, setSelectedFilter] = useState(null);
 
   const [radioValue, setRadioValue] = useState("is");
@@ -19,7 +19,7 @@ export function FilterDropdown({ open, setOpen, addFilter }) {
         ].name
       );
     }
-  }, [selectedFilter]);
+  }, [filterOptions, selectedFilter]);
 
   const onRadioChange = ({ target: { value } }) => {
     setRadioValue(value);
@@ -46,7 +46,7 @@ export function FilterDropdown({ open, setOpen, addFilter }) {
     <div className="absolute flex flex-row z-50">
       <div
         className={classNames(
-          "dark:bg-dark-600 w-48 h-max max-h-72 rounded-xl mt-2 transition-all duration-100 p-1 overflow-y-scroll shadow-lg shadow-dark-600"
+          "dark:bg-dark-600 w-56 h-max max-h-72 rounded-xl mt-2 transition-all duration-100 p-1 overflow-y-scroll shadow-lg shadow-dark-600"
         )}
       >
         {Object.keys(filterOptions).map((key) => {
@@ -62,20 +62,29 @@ export function FilterDropdown({ open, setOpen, addFilter }) {
           );
         })}
       </div>
-      {selectedFilter && (
-        <span className="ml-3">
-          <SecondaryFilterDropdown
-            open={true}
-            onSelectedFilterChange={onSelectedFilterChange}
-            radioOptions={filterOptions[selectedFilter]?.options}
-            radioValue={radioValue}
-            onRadioChange={onRadioChange}
-            inputValue={inputValue}
-            onInputChange={onInputChange}
-            onFilterAdd={onFilterAdd}
-          />
-        </span>
-      )}
+      <CSSTransition
+        in={selectedFilter}
+        classNames="secondary-dropdown"
+        timeout={300}
+        unmountOnExit
+      >
+        {selectedFilter ? (
+          <span className="ml-3">
+            <SecondaryFilterDropdown
+              open={true}
+              onSelectedFilterChange={onSelectedFilterChange}
+              radioOptions={filterOptions[selectedFilter]?.options}
+              radioValue={radioValue}
+              onRadioChange={onRadioChange}
+              inputValue={inputValue}
+              onInputChange={onInputChange}
+              onFilterAdd={onFilterAdd}
+            />
+          </span>
+        ) : (
+          <div></div>
+        )}
+      </CSSTransition>
     </div>
   );
 }
diff --git a/src/cryptometrics/pages/index.js b/src/cryptometrics/pages/index.js
index e7911cf..462f01a 100644
--- a/src/cryptometrics/pages/index.js
+++ b/src/cryptometrics/pages/index.js
@@ -20,6 +20,7 @@ import { useState } from "react";
 import useFilters from "../hooks/useFilters";
 import { Filter, FilterButton, Filters } from "../components/filters/Filter";
 import { FilterDropdown } from "../components/dropdown/FilterDropdown";
+import { filterOptions } from "../constants";
 
 export default function Home() {
   const [filters, addFilter, removeFilter] = useFilters([]);
@@ -97,9 +98,9 @@ export default function Home() {
 
                   {dropdownOpen && (
                     <FilterDropdown
-                      open={dropdownOpen}
                       setOpen={setDropdownOpen}
                       addFilter={addFilter}
+                      filterOptions={filterOptions}
                     />
                   )}
                 </div>
diff --git a/src/cryptometrics/styles/globals.css b/src/cryptometrics/styles/globals.css
index 4031aa2..11f99b4 100644
--- a/src/cryptometrics/styles/globals.css
+++ b/src/cryptometrics/styles/globals.css
@@ -24,3 +24,22 @@
 #nprogress .peg {
   box-shadow: 0 0 10px rgb(37 99 235), 0 0 5px rgb(37 99 235) !important;
 }
+
+.secondary-dropdown-enter {
+  opacity: 0;
+  transform: translateX(-50px);
+}
+.secondary-dropdown-enter-active {
+  opacity: 1;
+  transform: translateX(0);
+  transition: opacity 300ms, transform 300ms;
+}
+.secondary-dropdown-exit {
+  opacity: 1;
+}
+.secondary-dropdown-exit-active {
+  opacity: 0;
+  /* transform: scale(0.9); */
+  transform: translateX(-50px);
+  transition: opacity 300ms, transform 300ms;
+}
-- 
GitLab