Files
musicland/src/components/Overlay.js
T
Philip Cesar Garay f007b1f213 Fix Task: #92
2025-09-09 18:16:30 +08:00

81 lines
2.2 KiB
JavaScript

import React from "react";
import { Platform, Pressable, StyleSheet } from "react-native";
import { AnimatePresence, Motion } from "@legendapp/motion";
import { BlurView } from "expo-blur";
import { Portal } from "@gorhom/portal";
import useLayoutType from "../hooks/useLayoutType";
import { Palette, Style } from "../styles";
import { defaultBlurIntensity } from "../styles/Style";
const Overlay = ({
isVisible,
setIsVisible,
blurIntensity = null,
children,
contentContainerStyle = {},
hasPortal = true,
}) => {
const { isNative } = useLayoutType();
const ContentContainerView = hasPortal ? Portal : React.Fragment;
return (
<ContentContainerView>
<AnimatePresence>
{isVisible ? (
<Motion.View
key="overlay"
initial={{ opacity: 0 }}
animate={{ opacity: 1 }}
exit={{ opacity: 0 }}
transition={{
type: "tween",
duration: 500,
}}
style={{
position: isNative ? "absolute" : "fixed",
...StyleSheet.absoluteFillObject,
backgroundColor: Palette.ultraLightBlack,
flex: 1,
...Style.containerCenter,
}}
>
<BlurView
intensity={blurIntensity || isNative ? defaultBlurIntensity : 15}
tint="dark"
style={{
width: "100%",
height: "100%",
...Style.containerCenter,
...StyleSheet.absoluteFillObject,
...contentContainerStyle,
}}
// experimentalBlurMethod={
// Platform.OS !== "ios" ? "dimezisBlurView" : "none"
// }
>
<Pressable
style={{
...StyleSheet.absoluteFillObject,
}}
onPress={() => {
console.log("overlay pressed");
setIsVisible?.(false);
}}
/>
{children}
</BlurView>
</Motion.View>
) : null}
</AnimatePresence>
</ContentContainerView>
);
};
export default Overlay;