Refacto Select component to use parent state
This commit is contained in:
		
							parent
							
								
									7c8fb24d67
								
							
						
					
					
						commit
						4c7d7231e3
					
				| @ -1,6 +1,8 @@ | ||||
| import { useEffect, useState } from "react"; | ||||
| import { Dispatch, SetStateAction, useState } from "react"; | ||||
| 
 | ||||
| export type SelectProps = { | ||||
|   setState: Dispatch<SetStateAction<number>>; | ||||
|   state: number; | ||||
|   options: SelectOption[]; | ||||
|   selected?: number; | ||||
|   allowEmpty?: boolean; | ||||
| @ -14,21 +16,8 @@ export type SelectOption = { | ||||
| }; | ||||
| 
 | ||||
| export default function Select(props: SelectProps): JSX.Element { | ||||
|   const [selected, setSelected] = useState( | ||||
|     props.selected ? props.selected : props.allowEmpty ? -1 : 0 | ||||
|   ); | ||||
|   const [opened, setOpened] = useState(false); | ||||
| 
 | ||||
|   useEffect(() => { | ||||
|     if (props.onChange) { | ||||
|       if (selected >= 0) { | ||||
|         props.onChange(props.options[selected].name); | ||||
|       } else { | ||||
|         props.onChange(""); | ||||
|       } | ||||
|     } | ||||
|   }, [props, selected]); | ||||
| 
 | ||||
|   return ( | ||||
|     <div | ||||
|       className={`relative transition-[filter] ${ | ||||
| @ -41,11 +30,11 @@ export default function Select(props: SelectProps): JSX.Element { | ||||
|         }`}
 | ||||
|       > | ||||
|         <p onClick={() => setOpened(!opened)} className="w-full"> | ||||
|           {selected === -1 ? "—" : props.options[selected].label} | ||||
|           {props.state === -1 ? "—" : props.options[props.state].label} | ||||
|         </p> | ||||
|         {selected >= 0 && props.allowEmpty && ( | ||||
|         {props.state >= 0 && props.allowEmpty && ( | ||||
|           <span | ||||
|             onClick={() => setSelected(-1)} | ||||
|             onClick={() => props.setState(-1)} | ||||
|             className="material-icons !text-xs" | ||||
|           > | ||||
|             close | ||||
| @ -62,14 +51,14 @@ export default function Select(props: SelectProps): JSX.Element { | ||||
|       > | ||||
|         {props.options.map((option, index) => ( | ||||
|           <> | ||||
|             {index !== selected && ( | ||||
|             {index !== props.state && ( | ||||
|               <div | ||||
|                 className="bg-light hover:bg-mid transition-colors cursor-pointer p-1 last-of-type:rounded-b-[1em]" | ||||
|                 key={option.name} | ||||
|                 id={option.name} | ||||
|                 onClick={() => { | ||||
|                   setOpened(false); | ||||
|                   setSelected(index); | ||||
|                   props.setState(index); | ||||
|                 }} | ||||
|               > | ||||
|                 {option.label} | ||||
|  | ||||
| @ -33,8 +33,8 @@ export default function Library(props: LibraryProps): JSX.Element { | ||||
|   const langui = props.langui.websiteInterfaces.data[0].attributes; | ||||
| 
 | ||||
|   const [showSubitems, setShowSubitems] = useState<boolean>(false); | ||||
|   const [sortingMethod, setSortingMethod] = useState<string>("title"); | ||||
|   const [groupingMethod, setGroupingMethod] = useState<string>(""); | ||||
|   const [sortingMethod, setSortingMethod] = useState<number>(0); | ||||
|   const [groupingMethod, setGroupingMethod] = useState<number>(-1); | ||||
| 
 | ||||
|   const [filteredItems, setFilteredItems] = useState< | ||||
|     LibraryProps["libraryItems"]["libraryItems"]["data"] | ||||
| @ -45,7 +45,7 @@ export default function Library(props: LibraryProps): JSX.Element { | ||||
|   >(sortBy(groupingMethod, filteredItems)); | ||||
| 
 | ||||
|   const [groups, setGroups] = useState<GroupLibraryItems>( | ||||
|     getGroups("", sortedItems) | ||||
|     getGroups(groupingMethod, sortedItems) | ||||
|   ); | ||||
| 
 | ||||
|   useEffect(() => { | ||||
| @ -79,7 +79,8 @@ export default function Library(props: LibraryProps): JSX.Element { | ||||
|             { name: "type", label: "Type" }, | ||||
|             { name: "releaseYear", label: "Release year" }, | ||||
|           ]} | ||||
|           onChange={setGroupingMethod} | ||||
|           state={groupingMethod} | ||||
|           setState={setGroupingMethod} | ||||
|           allowEmpty | ||||
|         /> | ||||
|       </div> | ||||
| @ -90,10 +91,11 @@ export default function Library(props: LibraryProps): JSX.Element { | ||||
|           className="w-full" | ||||
|           options={[ | ||||
|             { name: "title", label: "Title" }, | ||||
|             { name: "releaseDate", label: "Release date" }, | ||||
|             { name: "price", label: "Price" }, | ||||
|             { name: "releaseDate", label: "Release date" }, | ||||
|           ]} | ||||
|           onChange={setSortingMethod} | ||||
|           state={sortingMethod} | ||||
|           setState={setSortingMethod} | ||||
|         /> | ||||
|       </div> | ||||
| 
 | ||||
| @ -153,14 +155,14 @@ export const getStaticProps: GetStaticProps = async (context) => { | ||||
| }; | ||||
| 
 | ||||
| function getGroups( | ||||
|   groupByType: string, | ||||
|   groupByType: number, | ||||
|   items: LibraryProps["libraryItems"]["libraryItems"]["data"] | ||||
| ): GroupLibraryItems { | ||||
|   switch (groupByType) { | ||||
|     case "category": | ||||
|     case 0: | ||||
|       return new Map(); | ||||
| 
 | ||||
|     case "type": | ||||
|     case 1: | ||||
|       const groupType: GroupLibraryItems = new Map(); | ||||
|       groupType.set("Audio", []); | ||||
|       groupType.set("Game", []); | ||||
| @ -212,7 +214,7 @@ function getGroups( | ||||
|       }); | ||||
|       return groupType; | ||||
| 
 | ||||
|     case "releaseYear": | ||||
|     case 2: | ||||
|       const years: number[] = []; | ||||
|       items.map((item) => { | ||||
|         if (item.attributes.release_date) { | ||||
| @ -266,11 +268,11 @@ function filterItems( | ||||
| } | ||||
| 
 | ||||
| function sortBy( | ||||
|   orderByType: string, | ||||
|   orderByType: number, | ||||
|   items: LibraryProps["libraryItems"]["libraryItems"]["data"] | ||||
| ): LibraryProps["libraryItems"]["libraryItems"]["data"] { | ||||
|   switch (orderByType) { | ||||
|     case "title": | ||||
|     case 0: | ||||
|       return [...items].sort((a, b) => { | ||||
|         const titleA = prettyinlineTitle( | ||||
|           "", | ||||
| @ -284,13 +286,13 @@ function sortBy( | ||||
|         ); | ||||
|         return titleA.localeCompare(titleB); | ||||
|       }); | ||||
|     case "price": | ||||
|     case 1: | ||||
|       return [...items].sort((a, b) => { | ||||
|         const priceA = a.attributes.price ? a.attributes.price.amount : 99999; | ||||
|         const priceB = b.attributes.price ? b.attributes.price.amount : 99999; | ||||
|         return priceA - priceB; | ||||
|       }); | ||||
|     case "releaseDate": | ||||
|     case 2: | ||||
|       return [...items].sort((a, b) => { | ||||
|         const dateA = | ||||
|           a.attributes.release_date !== null | ||||
| @ -302,6 +304,7 @@ function sortBy( | ||||
|             : "9999"; | ||||
|         return dateA.localeCompare(dateB); | ||||
|       }); | ||||
|     default: | ||||
|       return items; | ||||
|   } | ||||
|   return items; | ||||
| } | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 DrMint
						DrMint