Skip to content

Commit

Permalink
fix(react): HTMLImgComparisonSliderElement object as component ref
Browse files Browse the repository at this point in the history
fix #124
  • Loading branch information
sneas committed Oct 14, 2023
1 parent b13d3f1 commit 64e0106
Showing 1 changed file with 51 additions and 41 deletions.
92 changes: 51 additions & 41 deletions packages/react/src/index.tsx
Original file line number Diff line number Diff line change
@@ -1,21 +1,21 @@
import React, {
import { type HTMLImgComparisonSliderElement } from 'img-comparison-slider';
import {
FC,
AllHTMLAttributes,
PropsWithChildren,
ChangeEventHandler,
forwardRef,
ForwardedRef,
useRef,
useEffect,
useImperativeHandle,
createElement,
} from 'react';

if (typeof document !== 'undefined') {
import('img-comparison-slider');
}

type HTMLImgComparisonSliderElement = HTMLElement & {
value: number;
handle: boolean;
hover: boolean;
direction: string;
};

type ImgComparisonSliderProps =
AllHTMLAttributes<HTMLImgComparisonSliderElement> & {
value?: number | string;
Expand All @@ -24,40 +24,50 @@ type ImgComparisonSliderProps =
direction?: string;
keyboard?: 'enabled' | 'disabled';
onSlide?: ChangeEventHandler<HTMLImgComparisonSliderElement>;
ref?: ForwardedRef<HTMLImgComparisonSliderElement>;
};

export const ImgComparisonSlider: FC<ImgComparisonSliderProps> = ({
children,
onSlide,
...props
}: PropsWithChildren<ImgComparisonSliderProps>) => {
const ref = React.createRef<HTMLImgComparisonSliderElement>();
React.useEffect(() => {
if (props.value !== undefined) {
ref.current.value = parseFloat(props.value.toString());
}
}, [props.value, ref]);
export { HTMLImgComparisonSliderElement };

export const ImgComparisonSlider: FC<ImgComparisonSliderProps> = forwardRef(
(
{
children,
onSlide,
...props
}: PropsWithChildren<ImgComparisonSliderProps>,
ref: ForwardedRef<HTMLImgComparisonSliderElement>
) => {
const sliderRef = useRef<HTMLImgComparisonSliderElement>();
useEffect(() => {
if (props.value !== undefined) {
sliderRef.current.value = parseFloat(props.value.toString());
}
}, [props.value, sliderRef]);

useEffect(() => {
if (onSlide) {
// @ts-ignore
sliderRef.current.addEventListener('slide', onSlide);
}
}, []);

React.useEffect(() => {
if (onSlide) {
// @ts-ignore
ref.current.addEventListener('slide', onSlide);
}
}, []);
useImperativeHandle(ref, () => sliderRef.current, [sliderRef]);

return React.createElement(
'img-comparison-slider',
Object.assign(
{
class: props.className ? `${props.className} rendered` : 'rendered',
// Align tabIndex between the web and React components
// this code could be removed when
// https://github.com/WICG/webcomponents/issues/762 is resolved.
tabIndex: 0,
ref,
},
props
),
children
);
};
return createElement(
'img-comparison-slider',
Object.assign(
{
class: props.className ? `${props.className} rendered` : 'rendered',
// Align tabIndex between the web and React components
// this code could be removed when
// https://github.com/WICG/webcomponents/issues/762 is resolved.
tabIndex: 0,
ref: sliderRef,
},
props
),
children
);
}
);

0 comments on commit 64e0106

Please sign in to comment.