Files
musicland/src/components/BottomSheetContainer.js
T
Philip Cesar Garay 84fc719a10 update
2025-07-31 21:25:33 +08:00

88 lines
2.2 KiB
JavaScript

import React, { useState, useCallback, useEffect } from "react";
import { Keyboard, StyleSheet } from "react-native";
import { AnimatePresence, Motion } from "@legendapp/motion";
import { useKeyboard } from "@react-native-community/hooks";
import BottomSheet from "./BottomSheet";
import { Palette } from "../styles";
import useLayoutType from "../hooks/useLayoutType";
export default ({
children,
bottomSheetRef,
snapPoints = ["25%", "50%"],
handleStyle = {},
...rest
}) => {
const [currentSnapPointIndex, setCurrentSnapPointIndex] = useState(0);
const { keyboardShown = false } = useKeyboard();
const { isWeb } = useLayoutType();
const handleSheetChanges = useCallback((index) => {
setCurrentSnapPointIndex(index);
if (index <= 0) {
Keyboard.dismiss();
}
}, []);
useEffect(() => {
if (bottomSheetRef.current && !isWeb && currentSnapPointIndex > 0) {
if (keyboardShown) {
bottomSheetRef.current.expand();
} else {
bottomSheetRef.current.snapToIndex(1);
}
}
}, [keyboardShown]);
return (
<>
<AnimatePresence>
{currentSnapPointIndex > 0 ? (
<Motion.Pressable
style={{ ...StyleSheet.absoluteFill }}
onPress={() => bottomSheetRef?.current?.close()}
>
<Motion.View
key={"A"}
style={{
flex: 1,
backgroundColor: Palette.black,
}}
initial={{ opacity: 0 }}
animate={{ opacity: 0.9 }}
exit={{ opacity: 0 }}
transition={{
default: {
type: "spring",
},
opacity: {
type: "timing",
},
}}
></Motion.View>
</Motion.Pressable>
) : null}
</AnimatePresence>
<BottomSheet
ref={bottomSheetRef}
snapPoints={snapPoints}
handleStyle={{
backgroundColor: Palette.darkPurple,
...handleStyle,
}}
handleIndicatorStyle={{ backgroundColor: Palette.primary }}
style={{ zIndex: 100 }}
onChange={handleSheetChanges}
{...rest}
>
{children}
</BottomSheet>
</>
);
};