Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(sheet): trigger close action when sheet is fully closed #2563

Closed
wants to merge 2 commits into from
Closed
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
18 changes: 13 additions & 5 deletions packages/sheet/src/SheetImplementationCustom.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ export const SheetImplementationCustom = themeable(
setMaxContentSize,
maxSnapPoint,
} = providerProps
const { open, controller, isHidden } = state
const { initialOpen: open, controller, isHidden } = state

const sheetRef = useRef<View>(null)
const ref = useComposedRefs(forwardedRef, sheetRef)
Expand Down Expand Up @@ -199,10 +199,18 @@ export const SheetImplementationCustom = themeable(
return
}

animatedNumber.setValue(toValue, {
type: 'spring',
...animationConfig,
})
animatedNumber.setValue(
toValue,
{
type: 'spring',
...animationConfig,
},
position === -1
? () => {
state.setOpen(false)
}
: undefined
)
})

useIsomorphicLayoutEffect(() => {
Expand Down
1 change: 0 additions & 1 deletion packages/sheet/src/createSheet.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,6 @@ export function createSheet<
// @ts-ignore
<Overlay
{...props}
debug="verbose"
onPress={composeEventHandlers(
props.onPress,
context.dismissOnOverlayPress
Expand Down
9 changes: 9 additions & 0 deletions packages/sheet/src/useSheetOpenState.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import { useControllableState } from '@tamagui/use-controllable-state'

import type { SheetProps } from './types'
import { useSheetController } from './useSheetController'
import { useEffect, useState } from 'react'

export const useSheetOpenState = (props: SheetProps) => {
const { isHidden, controller } = useSheetController()
Expand All @@ -11,6 +12,8 @@ export const useSheetOpenState = (props: SheetProps) => {
props.onOpenChange?.(val)
}

const [initialOpen, setInitialOpen] = useState(controller?.open ?? props.open)

const [open, setOpen] = useControllableState({
prop: controller?.open ?? props.open,
defaultProp: props.defaultOpen ?? false,
Expand All @@ -19,11 +22,17 @@ export const useSheetOpenState = (props: SheetProps) => {
transition: true,
})

useEffect(() => {
setInitialOpen(open)
}, [open])

return {
open,
setOpen,
isHidden,
controller,
initialOpen,
setInitialOpen,
}
}

Expand Down
26 changes: 16 additions & 10 deletions packages/sheet/src/useSheetProviderProps.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -39,26 +39,31 @@ export function useSheetProviderProps(
// lets set -1 to be always the "open = false" position
const [position_, setPositionImmediate] = useControllableState({
prop: props.position,
defaultProp: props.defaultPosition || (state.open ? 0 : -1),
defaultProp: props.defaultPosition || (state.initialOpen ? 0 : -1),
onChange: props.onPositionChange,
strategy: 'most-recent-wins',
transition: true,
})

const position = state.open === false ? -1 : position_
const position = state.initialOpen === false ? -1 : position_

const { open } = state
const { initialOpen } = state

const setPosition = useCallback(
(next: number) => {
// close on dismissOnSnapToBottom (and set position so it animates)
if (props.dismissOnSnapToBottom && next === snapPoints.length - 1) {
state.setOpen(false)
state.setInitialOpen(false)
} else {
setPositionImmediate(next)
}
},
[props.dismissOnSnapToBottom, snapPoints.length, setPositionImmediate, state.setOpen]
[
props.dismissOnSnapToBottom,
snapPoints.length,
setPositionImmediate,
state.initialOpen,
]
)

if (process.env.NODE_ENV === 'development') {
Expand Down Expand Up @@ -115,12 +120,12 @@ export function useSheetProviderProps(
}

// reset position to fully open on re-open after dismissOnSnapToBottom
if (open && props.dismissOnSnapToBottom && position === snapPoints.length - 1) {
if (initialOpen && props.dismissOnSnapToBottom && position === snapPoints.length - 1) {
setPositionImmediate(0)
}

// open must set position
const shouldSetPositionOpen = open && position < 0
const shouldSetPositionOpen = initialOpen && position < 0
useEffect(() => {
if (shouldSetPositionOpen) {
setPosition(0)
Expand All @@ -143,7 +148,8 @@ export function useSheetProviderProps(
scrollLock: false,
}))

const removeScrollEnabled = props.forceRemoveScrollEnabled ?? (open && props.modal)
const removeScrollEnabled =
props.forceRemoveScrollEnabled ?? (initialOpen && props.modal)

const maxSnapPoint = snapPoints[0]
const screenSize =
Expand All @@ -157,8 +163,8 @@ export function useSheetProviderProps(
removeScrollEnabled,
scrollBridge,
modal: !!props.modal,
open: state.open,
setOpen: state.setOpen,
open: state.initialOpen,
setOpen: state.setInitialOpen,
hidden: !!state.isHidden,
contentRef,
handleRef,
Expand Down
20 changes: 10 additions & 10 deletions packages/sheet/types/SheetContext.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,8 @@ export declare const SheetProvider: {
removeScrollEnabled: boolean | undefined;
scrollBridge: import("./types").ScrollBridge;
modal: boolean;
open: boolean;
setOpen: import("react").Dispatch<import("react").SetStateAction<boolean>>;
open: boolean | undefined;
setOpen: import("react").Dispatch<import("react").SetStateAction<boolean | undefined>>;
hidden: boolean;
contentRef: import("react").RefObject<import("@tamagui/web").TamaguiElement>;
handleRef: import("react").RefObject<import("@tamagui/web").TamaguiElement>;
Expand All @@ -42,8 +42,8 @@ export declare const SheetProvider: {
removeScrollEnabled: boolean | undefined;
scrollBridge: import("./types").ScrollBridge;
modal: boolean;
open: boolean;
setOpen: import("react").Dispatch<import("react").SetStateAction<boolean>>;
open: boolean | undefined;
setOpen: import("react").Dispatch<import("react").SetStateAction<boolean | undefined>>;
hidden: boolean;
contentRef: import("react").RefObject<import("@tamagui/web").TamaguiElement>;
handleRef: import("react").RefObject<import("@tamagui/web").TamaguiElement>;
Expand Down Expand Up @@ -71,8 +71,8 @@ export declare const SheetProvider: {
removeScrollEnabled: boolean | undefined;
scrollBridge: import("./types").ScrollBridge;
modal: boolean;
open: boolean;
setOpen: import("react").Dispatch<import("react").SetStateAction<boolean>>;
open: boolean | undefined;
setOpen: import("react").Dispatch<import("react").SetStateAction<boolean | undefined>>;
hidden: boolean;
contentRef: import("react").RefObject<import("@tamagui/web").TamaguiElement>;
handleRef: import("react").RefObject<import("@tamagui/web").TamaguiElement>;
Expand All @@ -98,8 +98,8 @@ export declare const SheetProvider: {
removeScrollEnabled: boolean | undefined;
scrollBridge: import("./types").ScrollBridge;
modal: boolean;
open: boolean;
setOpen: import("react").Dispatch<import("react").SetStateAction<boolean>>;
open: boolean | undefined;
setOpen: import("react").Dispatch<import("react").SetStateAction<boolean | undefined>>;
hidden: boolean;
contentRef: import("react").RefObject<import("@tamagui/web").TamaguiElement>;
handleRef: import("react").RefObject<import("@tamagui/web").TamaguiElement>;
Expand All @@ -124,8 +124,8 @@ export declare const SheetProvider: {
removeScrollEnabled: boolean | undefined;
scrollBridge: import("./types").ScrollBridge;
modal: boolean;
open: boolean;
setOpen: import("react").Dispatch<import("react").SetStateAction<boolean>>;
open: boolean | undefined;
setOpen: import("react").Dispatch<import("react").SetStateAction<boolean | undefined>>;
hidden: boolean;
contentRef: import("react").RefObject<import("@tamagui/web").TamaguiElement>;
handleRef: import("react").RefObject<import("@tamagui/web").TamaguiElement>;
Expand Down
4 changes: 2 additions & 2 deletions packages/sheet/types/useSheet.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@ export declare const useSheet: () => {
removeScrollEnabled: boolean | undefined;
scrollBridge: import("./types").ScrollBridge;
modal: boolean;
open: boolean;
setOpen: import("react").Dispatch<import("react").SetStateAction<boolean>>;
open: boolean | undefined;
setOpen: import("react").Dispatch<import("react").SetStateAction<boolean | undefined>>;
hidden: boolean;
contentRef: import("react").RefObject<import("@tamagui/web").TamaguiElement>;
handleRef: import("react").RefObject<import("@tamagui/web").TamaguiElement>;
Expand Down
2 changes: 2 additions & 0 deletions packages/sheet/types/useSheetOpenState.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ export declare const useSheetOpenState: (props: SheetProps) => {
setOpen: import("react").Dispatch<import("react").SetStateAction<boolean>>;
isHidden: boolean | undefined;
controller: import("./useSheetController").SheetControllerContextValue | null;
initialOpen: boolean | undefined;
setInitialOpen: import("react").Dispatch<import("react").SetStateAction<boolean | undefined>>;
};
export type SheetOpenState = ReturnType<typeof useSheetOpenState>;
//# sourceMappingURL=useSheetOpenState.d.ts.map
4 changes: 2 additions & 2 deletions packages/sheet/types/useSheetProviderProps.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@ export declare function useSheetProviderProps(props: SheetProps, state: SheetOpe
removeScrollEnabled: boolean | undefined;
scrollBridge: ScrollBridge;
modal: boolean;
open: boolean;
setOpen: React.Dispatch<React.SetStateAction<boolean>>;
open: boolean | undefined;
setOpen: React.Dispatch<React.SetStateAction<boolean | undefined>>;
hidden: boolean;
contentRef: React.RefObject<TamaguiElement>;
handleRef: React.RefObject<TamaguiElement>;
Expand Down
Loading