/* eslint-disable react/display-name */
import { Image, Pressable, Text, View, StyleSheet } from "react-native";
import { KeyboardAwareScrollView } from "react-native-keyboard-aware-scroll-view";
import { SafeAreaView } from "react-native-safe-area-context";
import React from "reactn";
import { responsiveHeight } from "../actions/responsiveSizes.js";
import { subBadges } from "../assets";
import BaseHeader from "../components/BaseHeader";
import CreditAmount from "../components/CreditAmount";
import ConnectBtn from "../components/ConnectBtn.js";
import CoinPackModal from "../components/modal/CoinPackModal";
import NavigateHeader from "../components/NavigateHeader";
import ShareBtn from "../components/ShareBtn/ShareBtn";
import { isWeb } from "../hooks/useLayoutType.js";
import { useUserData } from "../providers/UserDataProvider";
import { Routes } from "../navigation";
import { navigate } from "../navigation/NavigationService";
import { gutters } from "../styles";
import { FONT_FAMILY } from "../styles/Fonts";
import { subscribeCoinPackModal } from "../utils/coinPackModal";
export default ({
children,
topStickyContent = null,
bottomStickyContent = null,
title = "",
rightComponent = null,
containerType = "SAFE_AREA_VIEW",
headerType = "BASE",
containerStyle = {},
headerStyle = {},
contentContainerStyle = {},
scrollEnabled = false,
onBackPressed = null,
backgroundImg = null,
headerTitleStyle = {},
hideBackButton = false,
width = undefined,
maxWidth = 1200,
shareBtn = false,
connect = false,
blurIntensity = 0,
backgroundColor = "#000",
showCoin = true,
}) => {
const { currentUID = null, currentUserData = null } = useUserData?.() || {};
const coinBalance = React.useMemo(() => {
const value = currentUserData?.coins;
if (typeof value === "number" && Number.isFinite(value)) {
return value;
}
if (typeof value === "string") {
const parsed = Number(value);
if (Number.isFinite(parsed)) {
return parsed;
}
}
return 0;
}, [currentUserData?.coins]);
const showCoinBadge = isWeb && !!currentUID && showCoin;
const [isCoinModalVisible, setCoinModalVisible] = React.useState(false);
const subscriptionBadgeSource = React.useMemo(() => {
const allowedLevels = new Set(["starter", "pro", "premium"]);
const pickLevel = (value) => {
if (typeof value !== "string") {
return null;
}
const normalized = value.trim().toLowerCase();
return normalized && allowedLevels.has(normalized) ? normalized : null;
};
const nestedSubscription =
currentUserData?.subscription &&
typeof currentUserData.subscription === "object"
? currentUserData.subscription
: null;
const stripeMetadata =
currentUserData?.stripeSubscription &&
typeof currentUserData.stripeSubscription === "object" &&
typeof currentUserData.stripeSubscription.metadata === "object"
? currentUserData.stripeSubscription.metadata
: null;
const directCandidates = [
pickLevel(currentUserData?.premiumLevel),
pickLevel(currentUserData?.subscriptionLevel),
pickLevel(currentUserData?.subscriptionPlan),
pickLevel(currentUserData?.subscriptionPack),
];
const nestedCandidates = nestedSubscription
? ["level", "plan", "pack", "type"].map((key) =>
pickLevel(nestedSubscription?.[key]),
)
: [];
const metadataCandidates = stripeMetadata
? [
"level",
"subscriptionLevel",
"subscription_level",
"pack",
"Pack",
].map((key) => pickLevel(stripeMetadata?.[key]))
: [];
const resolvedLevel = [
...directCandidates,
...nestedCandidates,
...metadataCandidates,
].find(Boolean);
return resolvedLevel ? subBadges[resolvedLevel] || null : null;
}, [currentUserData]);
const handleCoinPress = React.useCallback(() => {
if (!showCoinBadge) return;
setCoinModalVisible(true);
}, [showCoinBadge]);
const handleCloseCoinModal = React.useCallback(() => {
setCoinModalVisible(false);
}, []);
React.useEffect(() => {
if (!showCoinBadge && isCoinModalVisible) {
setCoinModalVisible(false);
}
}, [showCoinBadge, isCoinModalVisible]);
React.useEffect(() => {
const unsubscribe = subscribeCoinPackModal(() => {
if (!showCoinBadge) {
return;
}
setCoinModalVisible(true);
});
return unsubscribe;
}, [showCoinBadge]);
const PageContainer =
containerType === "SAFE_AREA_VIEW" ? SafeAreaView : View;
const ContentContainer = scrollEnabled ? KeyboardAwareScrollView : View;
const computedWidth = width ?? (isWeb ? "60%" : "100%");
const shareButtonElement = (() => {
if (!shareBtn) return null;
if (typeof React?.isValidElement === "function") {
if (React.isValidElement(shareBtn)) {
return shareBtn;
}
}
if (typeof shareBtn === "object" && !Array.isArray(shareBtn)) {
return ;
}
return ;
})();
const resolvedContainerStyle = React.useMemo(
() => StyleSheet.flatten(containerStyle) || {},
[containerStyle],
);
const resolvedHeaderStyle = React.useMemo(
() => StyleSheet.flatten(headerStyle) || {},
[headerStyle],
);
const resolvedContentContainerStyle = React.useMemo(
() => StyleSheet.flatten(contentContainerStyle) || {},
[contentContainerStyle],
);
return (
{backgroundImg ? (
) : null}
{showCoinBadge ? (
{subscriptionBadgeSource ? (
navigate(Routes.ManageSubscription)}
accessibilityRole="button"
style={{ paddingVertical: 4 }}
>
) : null}
) : null}
{headerType !== "NONE" ? (
headerType === "BASE" ? (
) : (
)
) : null}
{topStickyContent?.()}
{children}
{bottomStickyContent?.()}
{(shareButtonElement || connect) && isWeb && (
{shareButtonElement}
{connect && }
)}
);
};