Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 13 additions & 17 deletions src/BeforeClip.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,33 +10,29 @@ interface BeforeClipProps {
source: ImageSource | number;
contentFit?: ImageProps["contentFit"];
imageProps?: PassThroughImageProps;
measuredWidth: number;
layoutContainerWidth: number;
splitPx: DerivedValue<number>;
beforeLabel?: string;
}

export function BeforeClip(props: BeforeClipProps) {
const { measuredWidth, splitPx, source, contentFit, imageProps, beforeLabel } = props;
const { layoutContainerWidth, splitPx, source, contentFit, imageProps, beforeLabel } = props;

const clipStyle = useAnimatedStyle(() => ({ width: splitPx.get() }));

return (
<Animated.View style={[styles.clip, clipStyle]}>
{measuredWidth > 0 && (
<>
<Image
{...imageProps}
accessible={false}
source={source}
contentFit={contentFit}
style={[styles.leftImage, { width: measuredWidth }]}
/>
{beforeLabel && (
<View style={{ width: measuredWidth }}>
<Label text={beforeLabel} alignSelf="flex-start" testID="before-label" />
</View>
)}
</>
<Image
{...imageProps}
accessible={false}
source={source}
contentFit={contentFit}
style={[styles.leftImage, { width: layoutContainerWidth }]}
/>
{beforeLabel && (
<View style={{ width: layoutContainerWidth }}>
<Label text={beforeLabel} alignSelf="flex-start" testID="before-label" />
</View>
)}
</Animated.View>
);
Expand Down
10 changes: 5 additions & 5 deletions src/ImageComparisonSlider.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -74,16 +74,16 @@ export function ImageComparisonSlider({
afterLabel,
}: ImageComparisonSliderProps) {
const {
measuredWidth,
containerWidth,
layoutContainerWidth,
sharedContainerWidth,
splitPercent,
splitRatio,
pan,
onLayoutWidth,
onAccessibilityAction,
} = useComparisonSlider(initialPosition, enabled);

const splitPx = useDerivedValue(() => splitRatio.get() * containerWidth.get());
const splitPx = useDerivedValue(() => splitRatio.get() * sharedContainerWidth.get());

return (
<GestureDetector gesture={pan}>
Expand All @@ -107,13 +107,13 @@ export function ImageComparisonSlider({
style={styles.fullImage}
/>
{afterLabel && enabled && <Label text={afterLabel} testID="after-label" />}
{enabled && (
{enabled && layoutContainerWidth > 0 && (
<BeforeClip
source={before}
contentFit={contentFit}
imageProps={beforeImageProps}
splitPx={splitPx}
measuredWidth={measuredWidth}
layoutContainerWidth={layoutContainerWidth}
beforeLabel={beforeLabel}
/>
)}
Expand Down
4 changes: 2 additions & 2 deletions src/createSliderPan.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ const PAN_ACTIVE_OFFSET_X = [-0, 0] as [activeOffsetXStart: number, activeOffset
const PAN_FAIL_OFFSET_Y = [-18, 18] as [failOffsetYStart: number, failOffsetYEnd: number];

export function createSliderPan(
containerWidth: SharedValue<number>,
sharedContainerWidth: SharedValue<number>,
splitRatio: SharedValue<number>,
enabled: boolean,
) {
Expand All @@ -16,7 +16,7 @@ export function createSliderPan(
.activeOffsetX(PAN_ACTIVE_OFFSET_X)
.failOffsetY(PAN_FAIL_OFFSET_Y)
.onUpdate((e) => {
const width = containerWidth.get();
const width = sharedContainerWidth.get();
if (width <= 0) return;

const nextRatio = clampNextRatio(e.x, width, EDGE_MARGIN);
Expand Down
22 changes: 11 additions & 11 deletions src/useComparisonSlider.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@ import { createSliderPan } from "./createSliderPan";
import { clampInitialRatio, clampNextRatio, EDGE_MARGIN, ratioToPercent } from "./utils";

export function useComparisonSlider(initialPosition: number, enabled: boolean) {
const [measuredWidth, setMeasuredWidth] = useState(0);
const containerWidth = useSharedValue(0);
const [layoutContainerWidth, setLayoutContainerWidth] = useState(0);
const sharedContainerWidth = useSharedValue(0);

const initialRatio = clampInitialRatio(initialPosition);
const initialPercent = ratioToPercent(initialRatio);
Expand All @@ -18,10 +18,10 @@ export function useComparisonSlider(initialPosition: number, enabled: boolean) {
(width: number) => {
if (width <= 0) return;

containerWidth.set(width);
setMeasuredWidth(width);
sharedContainerWidth.set(width);
setLayoutContainerWidth(width);
},
[containerWidth],
[sharedContainerWidth],
);

const onAccessibilityAction = useCallback(
Expand All @@ -32,22 +32,22 @@ export function useComparisonSlider(initialPosition: number, enabled: boolean) {
if (actionName !== "increment" && actionName !== "decrement") return;

const nextRatio = clampNextRatio(
(splitRatio.get() + (actionName === "increment" ? 0.05 : -0.05)) * measuredWidth,
measuredWidth,
(splitRatio.get() + (actionName === "increment" ? 0.05 : -0.05)) * layoutContainerWidth,
layoutContainerWidth,
EDGE_MARGIN,
);

splitRatio.set(nextRatio);
setSplitPercent(ratioToPercent(nextRatio));
},
[enabled, measuredWidth, splitRatio],
[enabled, layoutContainerWidth, splitRatio],
);

const pan = createSliderPan(containerWidth, splitRatio, enabled);
const pan = createSliderPan(sharedContainerWidth, splitRatio, enabled);

return {
measuredWidth,
containerWidth,
layoutContainerWidth,
sharedContainerWidth,
splitPercent,
splitRatio,
pan,
Expand Down
Loading