From 57860461f5458d70dcf87950d0a74c91fcb734ed Mon Sep 17 00:00:00 2001 From: David Ponce Vargas Date: Fri, 13 Sep 2024 19:14:00 -0600 Subject: [PATCH 1/2] chore: use effect to sync searchParams --- website/app/components/navbar/options.tsx | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/website/app/components/navbar/options.tsx b/website/app/components/navbar/options.tsx index 025bdd9..a3bb7b5 100644 --- a/website/app/components/navbar/options.tsx +++ b/website/app/components/navbar/options.tsx @@ -3,6 +3,7 @@ import { useSearchParams } from "@remix-run/react"; import { Input } from "@/ui/input"; import { Slider } from "@/ui/slider"; import { iconSizeParamKey, searchParamKey } from "@/data/searchParams"; +import { useEffect, useState } from "react"; interface iSearchProps { className?: string; @@ -40,7 +41,9 @@ export const Search = (props: iSearchProps) => { // 📏 Icon Size Slider: export const IconSize = () => { const [searchParams, setSearchParams] = useSearchParams(); - const iconSizeValue = searchParams.get(iconSizeParamKey) || 45; + const [iconSizeValue, setIconSizeValue] = useState( + Number(searchParams.get(iconSizeParamKey)) || 45, + ); const handleChange = (value: number[]) => { const newSearchParams = new URLSearchParams(searchParams); @@ -52,11 +55,15 @@ export const IconSize = () => { setSearchParams(newSearchParams); }; + useEffect(() => { + handleChange([iconSizeValue]); + }, [iconSizeValue]); + return ( handleChange(value)} + value={[Number(iconSizeValue)]} + onValueChange={(value) => setIconSizeValue(value[0])} max={70} min={20} step={1} From 95addde1733d2d1fa16be059b6b264bcba098ac0 Mon Sep 17 00:00:00 2001 From: David Ponce Vargas Date: Fri, 13 Sep 2024 19:14:14 -0600 Subject: [PATCH 2/2] refactor: add tooltip to Slider --- website/app/ui/slider.tsx | 75 +++++++++++++++++++++++++++++---------- 1 file changed, 56 insertions(+), 19 deletions(-) diff --git a/website/app/ui/slider.tsx b/website/app/ui/slider.tsx index b27ce84..bff0237 100644 --- a/website/app/ui/slider.tsx +++ b/website/app/ui/slider.tsx @@ -2,29 +2,66 @@ import * as SliderPrimitive from "@radix-ui/react-slider"; import { cn } from "@/utils"; -import { forwardRef } from "react"; +import { forwardRef, useEffect, useState } from "react"; +import { + Tooltip, + TooltipContent, + TooltipProvider, + TooltipTrigger, +} from "./tooltip"; const Slider = forwardRef< React.ElementRef, React.ComponentPropsWithoutRef ->(({ className, ...props }, ref) => ( - - - - - - -)); +>(({ className, ...props }, ref) => { + const [showTooltipState, setShowTooltipState] = useState(false); + const handlePointerDown = () => { + setShowTooltipState(true); + }; + + const handlePointerUp = () => { + setShowTooltipState(false); + }; + + useEffect(() => { + document.addEventListener("pointerup", handlePointerUp); + return () => { + document.removeEventListener("pointerup", handlePointerUp); + }; + }, []); + + return ( + + + + + + + + setShowTooltipState(true)} + onMouseLeave={() => setShowTooltipState(false)} + onFocus={() => setShowTooltipState(true)} + onBlur={() => setShowTooltipState(false)} + className="block h-4 w-4 rounded-full border border-zinc-200 border-zinc-900/50 bg-white shadow transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-zinc-950 disabled:pointer-events-none disabled:opacity-50 dark:border-zinc-50/50 dark:border-zinc-800 dark:bg-zinc-500 dark:focus-visible:ring-zinc-600" + /> + + + {props.value?.at(0)} + + + + + ); +}); Slider.displayName = SliderPrimitive.Root.displayName; export { Slider };