Skip to content

Commit

Permalink
Fix initial position of Slider
Browse files Browse the repository at this point in the history
  • Loading branch information
TomasSlama committed Oct 3, 2024
1 parent ada392b commit 7ba8dfd
Show file tree
Hide file tree
Showing 4 changed files with 28 additions and 20 deletions.
24 changes: 10 additions & 14 deletions packages/base/Slider/src/Slider/Slider.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
// import type { ComponentProps } from 'react'
import React, { forwardRef, useEffect, useRef } from 'react'
import React, { forwardRef, useRef } from 'react'
import { Slider as MUIBaseSlider } from '@mui/base/Slider'
import { useCombinedRefs, useOnScreen } from '@toptal/picasso-utils'
import { twJoin, twMerge } from '@toptal/picasso-tailwind-merge'
Expand Down Expand Up @@ -66,7 +66,7 @@ export const Slider = forwardRef<HTMLElement, Props>(function Slider(
marks,
value,
defaultValue = 0,
tooltip: externalTooltip = 'off',
tooltip = 'off',
tooltipFormat,
step,
disabled,
Expand All @@ -82,15 +82,8 @@ export const Slider = forwardRef<HTMLElement, Props>(function Slider(
'data-private': dataPrivate,
'data-testid': dataTestid,
} = props
const [tooltip, setTooltip] = React.useState('off')
const containerRef = useRef<HTMLDivElement>(null)
const sliderRef = useCombinedRefs<HTMLElement>(ref, useRef<HTMLElement>(null))
const { isPartiallyOverlapped, handleValueLabelOnRender } = useLabelOverlap({
value,
})

const isThumbHidden =
hideThumbOnEmpty && (typeof value === 'undefined' || value === null)

// The rootMargin is not working correctly in the storybooks iframe
// To test properly we can open the iframe in new window
Expand All @@ -100,11 +93,14 @@ export const Slider = forwardRef<HTMLElement, Props>(function Slider(
threshold: 1,
})

useEffect(() => {
if (containerRef.current) {
setTooltip(externalTooltip)
}
}, [externalTooltip])
const { isPartiallyOverlapped, handleValueLabelOnRender } = useLabelOverlap({
value,
// until IntersectionObserver starts observing the element, we don't render the tooltip
isTooltipRendered: isObserved,
})

const isThumbHidden =
hideThumbOnEmpty && (typeof value === 'undefined' || value === null)

return (
<div
Expand Down
18 changes: 15 additions & 3 deletions packages/base/Slider/src/Slider/hooks/use-label-overlap.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,21 @@ import { useCallback, useEffect, useState } from 'react'

import { checkOverlap } from '../../utils'

export const useLabelOverlap = ({ value }: { value?: number | number[] }) => {
export const useLabelOverlap = ({
value,
isTooltipRendered,
}: {
value?: number | number[]
isTooltipRendered: boolean
}) => {
const [isPartiallyOverlapped, setIsPartiallyOverlapped] = useState(false)
const [valueLabels, setValueLabels] = useState<RefObject<HTMLSpanElement>[]>(
[]
)
const isRangeSlider = Array.isArray(value)

useEffect(() => {
if (!isRangeSlider) {
if (!isRangeSlider || !isTooltipRendered) {
return
}
const isFullyOverlaped = value[0] === value[1]
Expand All @@ -31,7 +37,13 @@ export const useLabelOverlap = ({ value }: { value?: number | number[] }) => {
})
)
}
}, [value, isRangeSlider, isPartiallyOverlapped, valueLabels])
}, [
value,
isRangeSlider,
isPartiallyOverlapped,
valueLabels,
isTooltipRendered,
])

const handleValueLabelOnRender = useCallback(
(index: number, labelRef: RefObject<HTMLSpanElement>) => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ const SliderValueLabel = ({
})
)
// we need to recalculate on value change to get new rect
}, [isOverlaped, index, xPlacement, value, tooltip])
}, [isOverlaped, index, xPlacement, value])

return (
<span
Expand Down
4 changes: 2 additions & 2 deletions packages/base/Utils/src/utils/useOnScreen/use-on-screen.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,14 +13,14 @@ const useOnScreen = ({
rootMargin,
threshold,
}: UseOnScreenProps) => {
const [isOnScreen, setIntersecting] = useState(false)
const [isOnScreen, setIsOnScreen] = useState(false)
const [isObserved, setObserved] = useState(false)

const observer = useMemo(
() =>
new IntersectionObserver(
([entry]) => {
setIntersecting(entry.isIntersecting)
setIsOnScreen(entry.isIntersecting)
setObserved(true)
},
{
Expand Down

0 comments on commit 7ba8dfd

Please sign in to comment.