This commit is contained in:
janisslsm committed 2026-11-01 12:12:55 +02:00
1 parent 1781d25a15
commit 732c0ad767
33051 files changed
+2591613 -3019689

No files matched your search

@@ -0,0 +1,118 @@
// Metro module 6559 (f6560).
import { useRef, useEffect, useCallback } from "react";
import { View } from "react-native";
import { PremiumTypes } from "../../premium/PremiumConstants";
import { createStyles } from "../../../design/components/Styles/native/createStyles";
import Module712 from "../../../_bundle/Module712";
import { useYouBarSettingsCustomHeaderPaddingTop } from "../../main_tabs_v2/native/you_bar/hooks/useYouBarSettingsSafeArea";
import { useNativeStackNavigation } from "../../../design/components/Navigator/native/useNavigation.native";
import { useBuyNitroMarketingLifecycleHooks } from "./hooks/useBuyNitroMarketingLifecycleHooks";
import { useBuyNitroPlanSelection } from "./hooks/useBuyNitroPlanSelection";
import { useIsBuyNitroPurchaseBlocked } from "./hooks/useBuyNitroPurchaseLock";
import useBuyNitroListData from "./hooks/useBuyNitroListData";
import { useLocationStackFromLocationContext } from "../../app_analytics/useAnalyticsLocations";
import { usePromotionMarketingComponent } from "../../premium/hooks/usePromotionMarketingComponent";
import { MarketingComponentType } from "../../../_bundle/Module6567";
import { openBuyNitroPerkDetails } from "./components/BuyNitroPerkDetails";
import BuyNitroSectionHeader from "./components/BuyNitroSectionHeader";
import BuyNitroPerk from "./components/BuyNitroPerk";
import { FlashList } from "../../../_bundle/noop_6676";
import BuyNitroMarketingHeader from "./BuyNitroMarketingHeader";
import MarketingPageBannerTile from "../../premium/promotions/native/MarketingPageBannerTile";
import BuyNitroPlanSelector from "./components/plan_selector/BuyNitroPlanSelector";
import BuyNitroAccountCredit from "./components/BuyNitroAccountCredit";
import BuyNitroMarketingFooter from "./BuyNitroMarketingFooter";
import { BuyNitroTriggerPointEffect } from "./components/BuyNitroTriggerPointEffect";
const useStyles = createStyles({
container: {
flex: 1,
backgroundColor: Module712.colors.BACKGROUND_BASE_LOWER
},
list: {
flex: 1
},
listContent: {
paddingHorizontal: Module712.space.PX_16,
paddingBottom: Module712.space.PX_24
},
listHeader: {
gap: Module712.space.PX_24
},
sectionHeader: {
marginTop: Module712.space.PX_24,
marginBottom: Module712.space.PX_16
},
disabled: {
pointerEvents: "none"
}
});
export default function BuyNitroMarketing(props) {
let onSelectNitroTier, locationStackFromLocationContext, callback;
let onClose = props.onClose;
const applicationId = props.applicationId;
let initialLoadCompleted = props.initialLoadCompleted;
const { initialTier, onPaymentSuccess, onPaymentDismiss } = props;
onSelectNitroTier = void 0;
locationStackFromLocationContext = void 0;
callback = void 0;
const styles = useStyles();
const youBarSettingsCustomHeaderPaddingTop = useYouBarSettingsCustomHeaderPaddingTop();
const nativeStackNavigation = useNativeStackNavigation();
useBuyNitroMarketingLifecycleHooks(nativeStackNavigation, initialLoadCompleted);
const buyNitroPlanSelection = useBuyNitroPlanSelection(initialTier != null ? {
tier: initialTier,
productId: void 0
} : void 0);
const ref = useRef(buyNitroPlanSelection);
useEffect(() => {
ref.current = buyNitroPlanSelection;
}, [buyNitroPlanSelection]);
const isBuyNitroPurchaseBlocked = useIsBuyNitroPurchaseBlocked();
const buyNitroListData = useBuyNitroListData(buyNitroPlanSelection);
const onScroll = buyNitroListData.onScroll;
onSelectNitroTier = buyNitroListData.onSelectNitroTier;
const { listData, listRef } = buyNitroListData;
locationStackFromLocationContext = useLocationStackFromLocationContext();
const promotionMarketingComponent = usePromotionMarketingComponent(MarketingComponentType.MARKETING_PAGE_BANNER);
callback = useCallback((a0) => {
openBuyNitroPerkDetails(a0, {
selectedTier: ref.current.selection.tier,
selectedProductId: ref.current.selection.productId,
analyticsLocations: locationStackFromLocationContext,
applicationId,
onPaymentSuccess,
onPaymentDismiss
});
}, [locationStackFromLocationContext, applicationId, onPaymentSuccess, onPaymentDismiss]);
const props2 = {
ref: listRef,
contentContainerStyle: styles.listContent,
data: listData,
renderItem: useCallback(({ item }) => item.kind === "section-header" ? <BuyNitroSectionHeader style={styles.sectionHeader} title={item.title} titleRequiresNitroHack={item.highlightNitro === true} onPress={() => onSelectNitroTier(PremiumTypes.TIER_2)} /> : <BuyNitroPerk perk={item.perk} selectedTier={buyNitroPlanSelection.selection.tier} onOpenDetails={callback} start={item.start} end={item.end} />, [buyNitroPlanSelection.selection.tier, styles.sectionHeader, callback, onSelectNitroTier]),
keyExtractor: (a0) => a0.kind === "section-header" ? a0.id : a0.perk.id,
getItemType: (a0) => a0.kind,
ListHeaderComponent: null,
onScroll: null,
scrollEventThrottle: 16,
showsVerticalScrollIndicator: false
};
if (onClose == null) {
onClose = () => nativeStackNavigation.pop();
}
props2.ListHeaderComponent = <>
{[<BuyNitroMarketingHeader topInset={youBarSettingsCustomHeaderPaddingTop} onBackPress={onClose} selectedTier={buyNitroPlanSelection.selection.tier} />, <View style={styles.listHeader}>
{(initialLoadCompleted ? (promotionMarketingComponent == null ? void 0 : promotionMarketingComponent.properties.properties.oneofKind) === "marketingPageBanner" : initialLoadCompleted) && <MarketingPageBannerTile bannerFields={promotionMarketingComponent.properties.properties.marketingPageBanner} componentId={promotionMarketingComponent.id} analyticsPage="Marketing Page Banner Tile" style={isBuyNitroPurchaseBlocked ? styles.disabled : void 0} onPaymentSuccess={onPaymentSuccess} onPaymentDismiss={onPaymentDismiss} />}
<BuyNitroPlanSelector planSelection={buyNitroPlanSelection} />
<BuyNitroAccountCredit />
</View>]}
</>;
props2.onScroll = onScroll;
const r128 = [<View style={styles.list}>
<FlashList {...props2} />
</View>, <BuyNitroMarketingFooter planSelection={buyNitroPlanSelection} applicationId={applicationId} onPaymentSuccess={onPaymentSuccess} onPaymentDismiss={onPaymentDismiss} />, ,];
if (initialLoadCompleted) {
initialLoadCompleted = <BuyNitroTriggerPointEffect />;
}
r128[2] = initialLoadCompleted;
return <View style={styles.container}>{r128}</View>;
};
@@ -0,0 +1,19 @@
// Metro module 6510 (f6511).
import { createApexExperiment } from "../../experiments/apex/index";
const apexExperiment = createApexExperiment({
name: "2026-07-nitro-visual-ux",
kind: "user",
defaultConfig: {
enabled: false
},
variations: {
1: {
enabled: true
}
}
});
export function getMobileNitroMarketingRedesignExperiment(a0) {
return apexExperiment.getConfig({
location: a0.location
}).enabled;
}
@@ -0,0 +1,29 @@
// Metro module 12438 (f12439).
import { useMemo } from "react";
import { View, Platform } from "react-native";
import { createStyles } from "../../../design/components/Styles/native/createStyles";
import Module712 from "../../../_bundle/Module712";
import { GestureDetector, Gesture } from "../../../_bundle/Module5273";
import BuyNitroPurchaseButton from "./components/purchase_button/BuyNitroPurchaseButton";
import AnalyticsLocation from "../../app_analytics/AnalyticsLocation";
Platform;
Module712.space.PX_24;
const useStyles = createStyles({
footer: {
paddingHorizontal: Module712.space.PX_16,
paddingTop: Module712.space.PX_12,
paddingBottom: 0,
backgroundColor: Module712.colors.BACKGROUND_BASE_LOWER,
borderTopColor: Module712.colors.BORDER_SUBTLE,
borderTopWidth: 1
}
});
export default function BuyNitroMarketingFooter(props) {
const { planSelection, applicationId, onPaymentSuccess, onPaymentDismiss } = props;
const styles = useStyles();
return <GestureDetector gesture={useMemo(() => Gesture.Pan().activeOffsetY([-8, 8]), [])}>
<View style={styles.footer} collapsable={false}>
<BuyNitroPurchaseButton location={AnalyticsLocation.PREMIUM_MARKETING_FOOTER} planSelection={planSelection} applicationId={applicationId} onPaymentSuccess={onPaymentSuccess} onPaymentDismiss={onPaymentDismiss} />
</View>
</GestureDetector>;
};
@@ -0,0 +1,150 @@
// Metro module 6677 (f6678).
import { useEffect } from "react";
import { StyleSheet, View, Platform } from "react-native";
import { Gradients } from "../../colors/native/ColorConstants";
import Module712 from "../../../_bundle/Module712";
import { createStyles } from "../../../design/components/Styles/native/createStyles";
import ReanimatedRexport, { useSharedValue, withRepeat, useAnimatedStyle } from "../../reanimated/ReanimatedRexport";
import { accessibilityPreferencesSharedValue } from "../../../design/animation/reanimated/AccessibilityPreferencesSharedValue.native";
import { withTiming } from "../../../design/animation/reanimated/timing/timing";
import useTheme from "../../../hooks/useTheme";
import { ThemeTypes } from "../../../_bundle/Module6678";
import { isAndroid } from "../../../utils/PlatformUtils";
import StatusBar_android from "../../status_bar/native/components/StatusBar.android";
import BuyNitroGradient from "./components/BuyNitroGradient";
import { HorizontalGradient, VerticalGradient } from "../../../ConstantsIOS";
import FastImage from "../../../components_native/common/FastImage";
import Module6229 from "../../../_bundle/Module6229";
import Module6248 from "../../../_bundle/Module6248";
import Module4611 from "../../../_bundle/Module4611";
import { intl, t } from "../../../intl/index.native";
import Module6681 from "../../../_bundle/Module6681";
import { Text } from "../../../design/components/Text/native/Text";
import { IconButton } from "../../../design/components/Button/native/IconButton.native";
import Module6684 from "../../../_bundle/Module6684";
let __initData, __initData2;
Platform;
const PX_8 = Module712.space.PX_8;
const PX_12 = Module712.space.PX_12;
const useStyles = createStyles((a0, a1, a2) => ({
banner: {
marginHorizontal: -Module712.space.PX_16 + (a1 ? a2 ? Module712.space.PX_8 : 0 : 0),
marginTop: a1 ? a2 ? Module712.space.PX_8 : void 0 : void 0,
marginBottom: Module712.space.PX_16,
overflow: a1 ? a2 ? "hidden" : void 0 : void 0
},
background: {
...StyleSheet.absoluteFillObject,
top: a1 ? a2 ? 0 : 5 * -Module712.space.PX_192 : 5 * -Module712.space.PX_192,
color: Module712.colors.BACKGROUND_BASE_LOWER,
borderRadius: a1 ? a2 ? Module712.radii.sm : void 0 : void 0
},
clouds: {
position: "absolute",
top: -Module712.space.PX_16,
right: void 0,
left: void 0,
alignSelf: "center"
},
wumpus: {
position: "absolute",
top: a0 + Module712.space.PX_20,
right: Module712.space.PX_4
},
wumpusImage: {
height: Module712.space.PX_80 + Module712.space.PX_4
},
backButton: {
position: "absolute",
top: a0 - (a1 ? Module712.space.PX_8 : 0),
left: Module712.space.PX_8 + (a1 ? 0 : Module712.space.PX_8),
transform: [{
scaleX: -1
}]
},
content: {
alignItems: "center",
gap: Module712.space.PX_8,
paddingTop: a0 + Module712.space.PX_80 + Module712.space.PX_4,
paddingHorizontal: Module712.space.PX_16,
paddingBottom: a1 ? Module712.space.PX_24 : Module712.space.PX_32
},
fade: {
...StyleSheet.absoluteFillObject,
height: Module712.space.PX_96,
position: "absolute",
top: void 0
}
}));
__initData = {
code: "function BuyNitroMarketingHeaderTsx1(){const{floatX,floatY}=this.__closure;return{transform:[{translateX:floatX.get()},{translateY:floatY.get()}]};}"
};
__initData2 = {
code: "function BuyNitroMarketingHeaderTsx2(){const{cloudsOpacity}=this.__closure;return{opacity:cloudsOpacity.get()};}"
};
export default function BuyNitroMarketingHeader(props) {
const { topInset, onBackPress, selectedTier } = props;
const r3 = useTheme() === ThemeTypes.LIGHT;
const r2 = r3 && !isAndroid();
const styles = useStyles(topInset, r3, r2);
const color = styles.background.color;
const sharedValue = useSharedValue(0);
const sharedValue2 = useSharedValue(0);
const sharedValue3 = useSharedValue(1);
useEffect(() => {
if (!accessibilityPreferencesSharedValue.get().reduceMotion) {
sharedValue.set(withRepeat(withTiming(PX_8, {
duration: 3400
}), -1, true));
sharedValue2.set(withRepeat(withTiming(-PX_12, {
duration: 2600
}), -1, true));
sharedValue3.set(withRepeat(withTiming(0.6, {
duration: 2800
}), -1, true));
}
}, [sharedValue, sharedValue2, sharedValue3]);
const r51 = () => ({
transform: [{
translateX: sharedValue.get()
}, {
translateY: sharedValue2.get()
}]
});
r51.__closure = {
floatX: sharedValue,
floatY: sharedValue2
};
r51.__workletHash = 17204816956621;
r51.__initData = __initData;
const animatedStyle2 = useAnimatedStyle(r51);
const r59 = () => ({
opacity: sharedValue3.get()
});
r59.__closure = {
cloudsOpacity: sharedValue3
};
r59.__workletHash = 10630022886341;
r59.__initData = __initData2;
const animatedStyle = useAnimatedStyle(r59);
return <View style={styles.banner}>
{isAndroid() && <StatusBar_android barStyle="light-content" />}
<BuyNitroGradient selectedTier={selectedTier} nitroColors={Gradients.PREMIUM_TIER_2} basicColors={Gradients.PREMIUM_TIER_0} start={HorizontalGradient.START} end={HorizontalGradient.END} style={styles.background} />
<ReanimatedRexport.View style={[styles.clouds, animatedStyle]}>
<FastImage source={Module6229} resizeMode="contain" />
</ReanimatedRexport.View>
<ReanimatedRexport.View style={[styles.wumpus, animatedStyle2]}>
<FastImage style={styles.wumpusImage} source={Module6248} resizeMode="contain" />
</ReanimatedRexport.View>
{r3 ? !r3 : <Module4611 style={styles.fade} colors={[`${color}00`, color]} start={VerticalGradient.START} end={VerticalGradient.END} />}
<View style={styles.content}>
<FastImage accessible accessibilityRole="header" accessibilityLabel={intl.string(t.lpNrPu)} source={Module6681} resizeMode="contain" />
<Text variant="text-md/medium" color="text-overlay-light">
{intl.string(t.SD5MJW)}
</Text>
</View>
<View style={styles.backButton}>
<IconButton variant="secondary-overlay" accessibilityLabel={intl.string(t["13/7kX"])} icon={Module6684} size="md" onPress={onBackPress} />
</View>
</View>;
};
@@ -0,0 +1,35 @@
// Metro module 12437 (f12438).
import { memo } from "react";
import UserStore from "../../../../stores/UserStore";
import SubscriptionStore from "../../../../stores/billing/SubscriptionStore";
import EntitlementStore from "../../../../stores/game_store/EntitlementStore";
import { PREMIUM_SUBSCRIPTION_APPLICATION } from "../../../premium/PremiumConstants";
import { createStyles } from "../../../../design/components/Styles/native/createStyles";
import Module712 from "../../../../_bundle/Module712";
import { useStateFromStores } from "../../../../_bundle/Module589";
import { areSetsEqual } from "../../../../_bundle/Module1414";
import PremiumAccountCredit from "../../../premium/native/PremiumAccountCredit";
const useStyles = createStyles({
creditList: {
borderRadius: Module712.modules.mobile.TABLE_ROW_BORDER_RADIUS
}
});
const r40 = memo(function BuyNitroAccountCredit() {
const styles = useStyles();
const stateFromStores = useStateFromStores([EntitlementStore], () => {
let r7 = EntitlementStore.getForApplication(PREMIUM_SUBSCRIPTION_APPLICATION);
if (r7 == null) {
r7 = new Set();
}
return r7;
}, [], areSetsEqual);
return <PremiumAccountCredit creditListContainerStyle={styles.creditList} currentSubscription={useStateFromStores([SubscriptionStore], () => SubscriptionStore.getPremiumTypeSubscription())} entitlements={stateFromStores} hasPremiumGroup={useStateFromStores([UserStore], () => {
const currentUser = UserStore.getCurrentUser();
let r6 = currentUser == null ? void 0 : currentUser.isPremiumWithPremiumGroup();
if (r6 == null) {
r6 = false;
}
return r6;
})} />;
});
export default r40;
@@ -0,0 +1,28 @@
// Metro module 6675 (f6676).
import { PremiumTypes } from "../../../premium/PremiumConstants";
import ReanimatedRexport, { useAnimatedStyle } from "../../../reanimated/ReanimatedRexport";
import Module4611 from "../../../../_bundle/Module4611";
import * as _timing from "../../../../design/animation/reanimated/timing/timing";
import * as _timingPresets from "../../../../design/animation/reanimated/timing/timingPresets";
const AnimatedComponent = ReanimatedRexport.createAnimatedComponent(Module4611);
const __initData = {
code: "function BuyNitroGradientTsx1(){const{withTiming,selectedTier,PremiumTypes,timingStandard}=this.__closure;return{opacity:withTiming(selectedTier===PremiumTypes.TIER_0?1:0,timingStandard)};}"
};
export default function BuyNitroGradient(props) {
const { selectedTier, nitroColors, basicColors, start, end, style } = props;
const f = () => ({
opacity: _timing.withTiming(selectedTier === PremiumTypes.TIER_0 ? 1 : 0, _timingPresets.timingStandard)
});
f.__closure = {
withTiming: _timing.withTiming,
selectedTier,
PremiumTypes,
timingStandard: _timingPresets.timingStandard
};
f.__workletHash = 14014615431537;
f.__initData = __initData;
return <>
<Module4611 style={style} colors={nitroColors} start={start} end={end} />
<AnimatedComponent style={[style, useAnimatedStyle(f)]} colors={basicColors} start={start} end={end} />
</>;
};
@@ -0,0 +1,34 @@
// Metro module 6674 (f6675).
import { StyleSheet, View } from "react-native";
import { createStyles } from "../../../../design/components/Styles/native/createStyles";
import Module712 from "../../../../_bundle/Module712";
import { TableRow } from "../../../../design/components/TableRow/native/TableRow.native";
import BuyNitroGradient from "./BuyNitroGradient";
const start = {
x: 0,
y: 0
};
const end = {
x: 1,
y: 1
};
const useStyles = createStyles({
iconTile: {
width: Module712.modules.mobile.TABLE_ROW_ICON_SIZE,
height: Module712.modules.mobile.TABLE_ROW_ICON_SIZE,
borderRadius: Module712.radii.round,
alignItems: "center",
justifyContent: "center",
overflow: "hidden"
}
});
export default function BuyNitroPerk(props) {
const { Perk, selectedTier, onOpenDetails, start: start2, end: end2 } = props;
const styles = useStyles();
const disabled = Perk.disabled;
const arrow = disabled ? !disabled : Perk.detail != null;
return <TableRow label={Perk.label} subLabel={Perk.subLabel} disabled={Perk.disabled} icon={<View style={styles.iconTile}>
<BuyNitroGradient selectedTier={selectedTier} nitroColors={Perk.iconGradient} basicColors={Perk.iconGradientBasic} start={start} end={end} style={StyleSheet.absoluteFill} />
<Perk.IconComponent size="sm" color={Module712.colors.WHITE} />
</View>} arrow={arrow} onPress={arrow ? () => onOpenDetails(Perk) : void 0} start={start2} end={end2} />;
};
@@ -0,0 +1,38 @@
// Metro module 6655 (f6656).
import { memo } from "react";
import { Image as Image2 } from "react-native";
import { createStyles } from "../../../../design/components/Styles/native/createStyles";
import { useBuyNitroPlanSelection } from "../hooks/useBuyNitroPlanSelection";
import { PromoSheet } from "../../../../design/components/Sheet/native/PromoSheet.native";
import { intl } from "../../../../intl/index.native";
import { Stack } from "../../../../design/components/Stack/native/Stack.native";
import Module712 from "../../../../_bundle/Module712";
import BuyNitroPlanPriceDetails from "./BuyNitroPlanPriceDetails";
import BuyNitroPurchaseButton from "./purchase_button/BuyNitroPurchaseButton";
import AnalyticsLocation from "../../../app_analytics/AnalyticsLocation";
import ActionSheetActionCreators, { showActionSheet } from "../../../action_sheet/native/ActionSheetActionCreators";
const key = "BuyNitroPerkDetailsActionSheet";
const useStyles = createStyles({
illustration: {
width: "100%",
height: 180
}
});
let Component = memo(function({ perk, selectedTier, selectedProductId, analyticsLocations, applicationId, onPaymentSuccess, onPaymentDismiss }) {
const styles = useStyles();
const buyNitroPlanSelection = useBuyNitroPlanSelection({
tier: selectedTier,
productId: selectedProductId
});
const detail = perk.detail;
return detail == null ? null : <PromoSheet title={perk.label} description={intl.string(detail.description)} illustration={<Image2 source={detail.image} style={styles.illustration} resizeMode="contain" />} actions={<Stack spacing={Module712.space.PX_12}>
{buyNitroPlanSelection.selection.item != null && <BuyNitroPlanPriceDetails planSelection={buyNitroPlanSelection} item={buyNitroPlanSelection.selection.item} centered />}
<BuyNitroPurchaseButton planSelection={buyNitroPlanSelection} location={AnalyticsLocation.PREMIUM_MARKETING_PERK_CARD} sourceAnalyticsLocations={analyticsLocations} applicationId={applicationId} onHostSheetClose={() => ActionSheetActionCreators.hideActionSheet(key)} onPaymentSuccess={onPaymentSuccess} onPaymentDismiss={onPaymentDismiss} />
</Stack>} />;
});
export function openBuyNitroPerkDetails(a0, a1) {
showActionSheet({
content: <Component perk={a0} {...a1} />,
key
});
}
@@ -0,0 +1,74 @@
// Metro module 6659 (f6660).
import { View } from "react-native";
import IAPStore_android from "../../../../stores/native/IAPStore.android";
import { SubscriptionIntervalTypes, SubscriptionPlanInfo } from "../../../premium/PremiumConstants";
import { CurrencyCodes } from "../../../../_bundle/Module505";
import { createStyles } from "../../../../design/components/Styles/native/createStyles";
import Module712 from "../../../../_bundle/Module712";
import { useStateFromStores } from "../../../../_bundle/Module589";
import { formatPrice, formatRate } from "../../../../utils/PriceUtils";
import { Text } from "../../../../design/components/Text/native/Text";
import { intl, t } from "../../../../intl/index.native";
const useStyles = createStyles({
container: {
gap: Module712.space.PX_4
},
centeredText: {
textAlign: "center"
}
});
export default function BuyNitroPlanPriceDetails(props) {
const { planSelection, item, centered = false } = props;
const { priceStringByProductId, trialTier, discounted } = planSelection;
const styles = useStyles();
const style = centered ? styles.centeredText : void 0;
const stateFromStores = useStateFromStores([IAPStore_android], () => {
const product = IAPStore_android.getProduct(item.productId);
let r9 = product == null ? void 0 : product.currencyCode.toLowerCase();
if (!(r9 != null && r9 in CurrencyCodes)) {
r9 = CurrencyCodes.USD;
}
return r9;
});
const price = priceStringByProductId.get(item.productId);
if (trialTier != null && item.premiumTier === trialTier) {
return <View style={styles.container}>
<Text variant="text-xs/semibold" color="text-default" style={style}>
{intl.formatToPlainString(t.hXcaLT, {
price: formatPrice(0, stateFromStores, {
minimumFractionDigits: 0,
maximumFractionDigits: 0
})
})}
</Text>
{price != null && <Text variant="text-xs/medium" color="text-subtle" style={style}>
{intl.formatToPlainString(item.interval === SubscriptionIntervalTypes.YEAR ? t.ECT4A5 : t.v9QeON, {
price
})}
</Text>}
</View>;
}
if (item.productId === discounted.id && discounted.priceString != null) {
let r42 = SubscriptionPlanInfo[item.basePlanId]?.intervalCount;
if (r42 == null) {
r42 = 1;
}
const discountedPrice = formatRate(discounted.priceString, item.interval, r42);
const regularPrice = price != null ? formatRate(price, item.interval, r42) : null;
return <View style={styles.container}>
<Text variant="text-xs/semibold" color="text-default" style={style}>
{intl.formatToPlainString(t["02Gmgm"], {
discountedPrice,
numMonths: discounted.numMonths
})}
</Text>
{regularPrice != null && <Text variant="text-xs/medium" color="text-subtle" style={style}>
{intl.formatToPlainString(t["vZk+c/"], {
regularPrice,
numMonths: discounted.numMonths
})}
</Text>}
</View>;
}
return null;
};
@@ -0,0 +1,210 @@
// Metro module 6663 (f6664).
import { useRef, useEffect, useMemo } from "react";
import { useNativeCheckoutStore } from "../../../checkout/native/NativeCheckoutStore";
import { reset, setInitiatedPurchaseFromNewFlow } from "../../../premium/native/PremiumPlanPurchasedStore";
import { AnalyticEvents, AnalyticsObjectTypes, AnalyticsObjects, AnalyticsPages, AnalyticsSections } from "../../../../Constants";
import { PaymentGateways } from "../../../../_bundle/Module505";
import { useHandlePremiumPurchase } from "../../../premium/native/handlePremiumPurchase.android";
import * as _MobileWebRedirectCheckoutUtils from "../../../payments/utils/MobileWebRedirectCheckoutUtils";
import { getCustomCheckoutFlowForAnalytics } from "../../../payments/utils/MobileWebRedirectCheckoutUtils";
import PremiumUtils, { castPremiumSubscriptionAsSkuId } from "../../../../utils/PremiumUtils";
import { getPaymentFlowStepAnalyticsFields, PaymentFlowStep, getBasePurchaseFlowAnalyticsFields } from "../../../premium/native/PremiumAnalyticsUtils";
import { trackPaymentFlowStartedAnalyticsAndCTP } from "../../../experiments/trigger_points/PaymentFlowStartedTriggerPoint";
import { presentBuyNitroPurchaseSuccess } from "./BuyNitroPurchaseSuccess";
import { goToStandalonePremiumCheckoutFromMobileApp } from "../../../payments/native/utils/BillingStandaloneNativeUtils";
import AlertActionCreators from "../../../../actions/native/AlertActionCreators";
import { intl, t } from "../../../../intl/index.native";
import { getSubscriptionItemsForProduct } from "../../../premium/native/PremiumBundledPlansUtils";
import AnalyticsUtils from "../../../../utils/AnalyticsUtils";
import InvalidGooglePlayPurchase from "../../../billing/errors/InvalidGooglePlayPurchase";
import { fetchSubscriptions } from "../../../billing/actions/BillingActionCreators";
import { NitroACOMSubscriptionExperiment } from "../../../billing/native/ACOMExperiments";
import { isIOS } from "../../../../utils/PlatformUtils";
import { usePremiumTrialOffer } from "../../../premium/hooks/usePremiumTrialOffer.android";
import NativeCheckoutStoreProvider from "../../../checkout/native/stores/NativeCheckoutStoreProvider";
const BuyNitroPurchaseRunner = function BuyNitroPurchaseRunner({ item, analyticsLocations, analyticsLoadId, hasEmittedPaymentFlowStartedRef, applicationId, expectedPriceString, onExit, onOrderPriceMismatch, onHostSheetClose, onPaymentSuccess: onPaymentSuccess2, onPaymentDismiss }) {
let nativeCheckoutStore2, handlePremiumPurchase, ref;
nativeCheckoutStore2 = void 0;
handlePremiumPurchase = void 0;
ref = void 0;
const nativeCheckoutStore = useNativeCheckoutStore((a0) => a0.orderRecord);
nativeCheckoutStore2 = useNativeCheckoutStore((a0) => a0.orderRequired);
handlePremiumPurchase = useHandlePremiumPurchase();
ref = useRef(false);
useEffect(() => {
let sku_id, basePurchaseFlowAnalyticsFields, _runPurchase2;
L10: {
_runPurchase2 = function _runPurchase() {
const r9 = async () => {
let priceString, c31429_3;
let c31429_4 = 0;
L24: {
L18: {
try {
if (nativeCheckoutStore2) {
const r67 = nativeCheckoutStore == null;
let r68 = void 0;
if (!r67) {
const checkoutContextRecord = nativeCheckoutStore.checkoutContextRecord;
const r70 = checkoutContextRecord == null;
r68 = void 0;
if (!r70) {
const availablePlanForItems = checkoutContextRecord.getAvailablePlanForItems(getSubscriptionItemsForProduct(item.productId));
r68 = availablePlanForItems == null ? void 0 : availablePlanForItems.getPriceString();
}
}
priceString = r68;
if (r68 == null) {
priceString = null;
}
const r84 = priceString;
if (expectedPriceString != null && r84 != null && r84 !== expectedPriceString) {
onOrderPriceMismatch(r84);
break L18;
}
}
AnalyticsUtils.track(AnalyticEvents.PAYMENT_FLOW_STEP, getPaymentFlowStepAnalyticsFields(basePurchaseFlowAnalyticsFields, {
from_step: PaymentFlowStep.PLAN_SELECT,
to_step: PaymentFlowStep.EXTERNAL_PAYMENT,
subscription_plan_gateway_plan_id: item.productId,
sku_id
}));
c31429_4 = 1;
await handlePremiumPurchase({
productId: item.productId,
analyticsLocation: basePurchaseFlowAnalyticsFields.location,
analyticsLoadId,
analyticsLocations,
orderId: nativeCheckoutStore?.id
});
c31429_4 = 0;
(0, onExit)();
break L24;
} catch ($e) {
const r32 = $e;
let r7 = r32;
c31429_3 = r32;
if (c31429_4 !== 0) {
while (true) {
try {
const r119 = c31429_3;
c31429_4 = 0;
if (r119 instanceof InvalidGooglePlayPurchase) {
fetchSubscriptions();
AlertActionCreators.show({
title: intl.string(t["U+H+kd"]),
body: intl.string(t.F9ktNa),
hideActionSheet: true
});
}
(0, onExit)();
break L24;
} catch (r116) {
r7 = r116;
c31429_3 = r116;
if (c31429_4 === 0) {
break;
}
}
}
}
throw r7;
}
}
return void 0;
}
};
_runPurchase2 = r9;
return r9.apply(this, arguments);
};
if (!ref.current) {
if (nativeCheckoutStore2 && nativeCheckoutStore == null) {
break L10;
}
ref.current = true;
const isMobileWebRedirectCheckoutEnabled = _MobileWebRedirectCheckoutUtils.isMobileWebRedirectCheckoutEnabled();
sku_id = castPremiumSubscriptionAsSkuId(PremiumUtils.getSkuIdForPremiumType(item.premiumTier));
basePurchaseFlowAnalyticsFields = getBasePurchaseFlowAnalyticsFields({
analyticsLoadId,
analyticsLocation: {
object: AnalyticsObjects.BUTTON_CTA,
objectType: AnalyticsObjectTypes.BUY,
page: AnalyticsPages.USER_SETTINGS,
section: AnalyticsSections.SETTINGS_PREMIUM
},
analyticsLocations
});
if (!hasEmittedPaymentFlowStartedRef.current) {
hasEmittedPaymentFlowStartedRef.current = true;
trackPaymentFlowStartedAnalyticsAndCTP({
...basePurchaseFlowAnalyticsFields,
application_id: applicationId,
subscription_plan_id: item.basePlanId,
sku_id,
custom_checkout_flow: isMobileWebRedirectCheckoutEnabled ? getCustomCheckoutFlowForAnalytics() : void 0
});
}
setInitiatedPurchaseFromNewFlow({
productId: item.productId,
onPaymentSuccess: (a0) => {
if (onHostSheetClose != null) {
onHostSheetClose();
}
presentBuyNitroPurchaseSuccess(item.premiumTier);
if (onPaymentSuccess2 != null) {
onPaymentSuccess2(a0);
}
},
onPaymentDismiss
});
if (isMobileWebRedirectCheckoutEnabled) {
goToStandalonePremiumCheckoutFromMobileApp("premium_nitro_marketing_page", {
planId: item.basePlanId,
isGift: false,
loadId: analyticsLoadId
}, () => {
reset();
onExit();
if (onHostSheetClose != null) {
onHostSheetClose();
}
}, () => {
AlertActionCreators.show({
title: intl.string(t.NrBVjw),
body: intl.string(t["gD+grx"]),
hideActionSheet: true
});
onExit();
});
} else {
(function runPurchase() {
return _runPurchase2.apply(this, arguments);
})();
}
}
}
}, [nativeCheckoutStore, nativeCheckoutStore2, handlePremiumPurchase, analyticsLoadId, hasEmittedPaymentFlowStartedRef, analyticsLocations, applicationId, item, expectedPriceString, onExit, onOrderPriceMismatch, onHostSheetClose, onPaymentSuccess2, onPaymentDismiss]);
return null;
};
export default function BuyNitroPurchaseFlow(props) {
const { item: item2, analyticsLocations: analyticsLocations2, analyticsLoadId: analyticsLoadId2, hasEmittedPaymentFlowStartedRef: hasEmittedPaymentFlowStartedRef2, applicationId: applicationId2, expectedPriceString: expectedPriceString2, onExit: onExit2, onOrderPriceMismatch: onOrderPriceMismatch2, onHostSheetClose: onHostSheetClose2, onPaymentSuccess: onPaymentSuccess3, onPaymentDismiss: onPaymentDismiss2 } = props;
const enabled = NitroACOMSubscriptionExperiment.useConfig({
location: "PremiumPlanSelectionActionSheetWithOrderCTX"
}).enabled;
const paymentGateway = isIOS() ? enabled ? PaymentGateways.APPLE_ADVANCED_COMMERCE : PaymentGateways.APPLE : PaymentGateways.GOOGLE;
const r40 = isIOS() && enabled;
const premiumTrialOffer = usePremiumTrialOffer();
const subscription_trial_id = r40 ? void 0 : premiumTrialOffer?.trial_id;
const initialSubscriptionFacet = subscription_trial_id != null ? {
subscription_preview: {
subscription_trial_id
}
} : void 0;
return <NativeCheckoutStoreProvider paymentGateway={paymentGateway} orderRequired={paymentGateway === PaymentGateways.APPLE_ADVANCED_COMMERCE} skuIds={[]} defaultPlans={useMemo(() => getSubscriptionItemsForProduct(item2.productId).map((item) => ({
subscriptionPlanId: item.planId,
skuId: castPremiumSubscriptionAsSkuId(PremiumUtils.getSkuIdForPlan(item.planId)),
quantity: item.quantity
})), [item2.productId])} isGift={false} activeSubscription={null} initialSubscriptionFacet={initialSubscriptionFacet} onOrderRetryCancellation={onExit2}>
<BuyNitroPurchaseRunner item={item2} analyticsLocations={analyticsLocations2} analyticsLoadId={analyticsLoadId2} hasEmittedPaymentFlowStartedRef={hasEmittedPaymentFlowStartedRef2} applicationId={applicationId2} expectedPriceString={expectedPriceString2} onExit={onExit2} onOrderPriceMismatch={onOrderPriceMismatch2} onHostSheetClose={onHostSheetClose2} onPaymentSuccess={onPaymentSuccess3} onPaymentDismiss={onPaymentDismiss2} />
</NativeCheckoutStoreProvider>;
};
@@ -0,0 +1,9 @@
// Metro module 6664 (f6665).
import { reset } from "../../../premium/native/PremiumPlanPurchasedStore";
import { PremiumTypes } from "../../../premium/PremiumConstants";
import { intl, t } from "../../../../intl/index.native";
import { openAlert } from "../../../../design/components/AlertModal/native/useAlertStore.native";
import { AlertModal, AlertActionButton } from "../../../../design/components/AlertModal/native/AlertModal.native";
export function presentBuyNitroPurchaseSuccess(a0) {
openAlert("BuyNitroPurchaseSuccess", <AlertModal title={intl.string(t["Q+BB2w"])} content={PremiumTypes.TIER_0 === a0 ? intl.string(t["6WWrVM"]) : PremiumTypes.TIER_1 === a0 ? intl.string(t.LAAgsy) : intl.string(t.I7xNzI)} actions={<AlertActionButton variant="primary" text={intl.string(t.TkTvBz)} />} />, reset);
}
@@ -0,0 +1,16 @@
// Metro module 6673 (f6674).
import { Text } from "../../../../design/components/Text/native/Text";
const children = "Nitro";
export default function BuyNitroSectionHeader(props) {
const { style, onPress, title, titleRequiresNitroHack = false } = props;
let r22 = title;
if (titleRequiresNitroHack) {
const r12 = title.indexOf(children);
r22 = r12 !== -1 ? <>
{title.slice(0, r12)}
<Text variant="text-sm/semibold" color="text-link" accessibilityRole="link" onPress={onPress}>{children}</Text>
{title.slice(r12 + 5)}
</> : title;
}
return <Text variant="text-sm/semibold" color="text-default" accessibilityRole="header" style={style}>{r22}</Text>;
};
@@ -0,0 +1,7 @@
// Metro module 12439 (f12440).
import { useCommonTriggerPoint } from "../../../experiments/trigger_points/useCommonTriggerPoint";
import { OpenNitroTriggerPoint } from "../../../experiments/trigger_points/OpenNitroTriggerPoint";
export function BuyNitroTriggerPointEffect() {
useCommonTriggerPoint(OpenNitroTriggerPoint);
return null;
}
@@ -0,0 +1,63 @@
// Metro module 12432 (f12433).
import { View } from "react-native";
import IAPStore_android from "../../../../../stores/native/IAPStore.android";
import { EUR_TO_HRK_CONVERSION_RATE } from "../../../../payments/PaymentConstants";
import { CurrencyCodes } from "../../../../../_bundle/Module505";
import { createStyles } from "../../../../../design/components/Styles/native/createStyles";
import Module712 from "../../../../../_bundle/Module712";
import { DARK_PRIMARY_630_LIGHT_PRIMARY_230 } from "../../../../../design/migrations/native/LegacyTokens";
import { useStateFromStores } from "../../../../../_bundle/Module589";
import { useIsBuyNitroPurchaseBlocked } from "../../hooks/useBuyNitroPurchaseLock";
import { useBuyNitroPlanLabelRenderer } from "./useBuyNitroPlanLabelRenderer";
import { useBuyNitroPlanSubLabelRenderer } from "./useBuyNitroPlanSubLabelRenderer";
import BuyNitroSectionHeader from "../BuyNitroSectionHeader";
import { intl, t } from "../../../../../intl/index.native";
import BuyNitroPlanSelectorTierToggle from "./BuyNitroPlanSelectorTierToggle";
import { TableRadioGroup } from "../../../../../design/components/TableRow/native/TableRadioGroup.native";
import { TableRadioRow } from "../../../../../design/components/TableRow/native/TableRadioRow.native";
import PaymentFlowWarningMessage from "../../../../billing/native/PaymentFlowWarningMessage";
import { formatPrice } from "../../../../../utils/PriceUtils";
import { isAndroid } from "../../../../../utils/PlatformUtils";
const useStyles = createStyles({
header: {
flexDirection: "row",
alignItems: "center",
justifyContent: "space-between",
marginBottom: Module712.space.PX_8
},
hrkWarning: {
borderRadius: Module712.modules.mobile.TABLE_ROW_BORDER_RADIUS,
backgroundColor: DARK_PRIMARY_630_LIGHT_PRIMARY_230,
marginTop: Module712.space.PX_8,
overflow: "hidden"
}
});
export default function BuyNitroPlanSelector(props) {
let isBuyNitroPurchaseBlocked, buyNitroPlanLabelRenderer, buyNitroPlanSubLabelRenderer;
const planSelection = props.planSelection;
isBuyNitroPurchaseBlocked = void 0;
buyNitroPlanLabelRenderer = void 0;
buyNitroPlanSubLabelRenderer = void 0;
const { selection, items, unavailableProductIds } = planSelection;
const styles = useStyles();
const stateFromStores = useStateFromStores([IAPStore_android], () => selection.productId != null ? IAPStore_android.getProduct(selection.productId) : null);
isBuyNitroPurchaseBlocked = useIsBuyNitroPurchaseBlocked();
buyNitroPlanLabelRenderer = useBuyNitroPlanLabelRenderer();
buyNitroPlanSubLabelRenderer = useBuyNitroPlanSubLabelRenderer();
return <View>
<View style={styles.header}>
<BuyNitroSectionHeader title={intl.string(t.u95Dt4)} />
<BuyNitroPlanSelectorTierToggle selectedTier={selection.tier} setSelectedTier={selection.setTier} disabled={isBuyNitroPurchaseBlocked} />
</View>
{selection.productId != null && <TableRadioGroup hasIcons={false} value={selection.productId} onChange={selection.setProductId}>
{items.filter((item) => !unavailableProductIds.has(item.productId)).map((item) => <TableRadioRow key={item.productId} value={item.productId} label={buyNitroPlanLabelRenderer(planSelection, item)} subLabel={buyNitroPlanSubLabelRenderer(planSelection, item)} disabled={isBuyNitroPurchaseBlocked} />)}
</TableRadioGroup>}
{stateFromStores != null && stateFromStores.countryCode === "HR" && stateFromStores.currencyCode.toLowerCase() === CurrencyCodes.EUR && <View style={styles.hrkWarning}>
<PaymentFlowWarningMessage message={intl.formatToPlainString(t["9hnZoK"], {
kunaPriceWithCurrency: formatPrice(stateFromStores.price * EUR_TO_HRK_CONVERSION_RATE, CurrencyCodes.HRK, {
convertToMajorUnits: isAndroid()
})
})} />
</View>}
</View>;
};
@@ -0,0 +1,206 @@
// Metro module 12435 (f12436).
import { useEffect, useState, useRef, useLayoutEffect } from "react";
import { Pressable, View, StyleSheet } from "react-native";
import { Gradients } from "../../../../colors/native/ColorConstants";
import { PREMIUM_TYPE_DISPLAY_NAME, PremiumTypes } from "../../../../premium/PremiumConstants";
import { createStyles } from "../../../../../design/components/Styles/native/createStyles";
import Module712 from "../../../../../_bundle/Module712";
import ReanimatedRexport, { useSharedValue, withRepeat, Easing, cancelAnimation, useAnimatedStyle } from "../../../../reanimated/ReanimatedRexport";
import { withTiming } from "../../../../../design/animation/reanimated/timing/timing";
import { timingStandard } from "../../../../../design/animation/reanimated/timing/timingPresets";
import { accessibilityPreferencesSharedValue } from "../../../../../design/animation/reanimated/AccessibilityPreferencesSharedValue.native";
import Module4611 from "../../../../../_bundle/Module4611";
import { HorizontalGradient } from "../../../../../ConstantsIOS";
import { NITRO_PLAN_TIERS } from "../../hooks/useBuyNitroPlanSelection";
import { triggerHapticFeedback } from "../../../../haptics/HapticUtils.native";
import HapticFeedbackTypes from "../../../../haptics/HapticFeedbackTypes";
import { Text } from "../../../../../design/components/Text/native/Text";
import { intl, t } from "../../../../../intl/index.native";
const [r40, r41] = Gradients.PREMIUM_TIER_2;
const colors = [r40, r41, r40, r41, r40];
const locations = [0, 0.25, 0.5, 0.75, 1];
const useStyles = createStyles({
pill: {
flexDirection: "row",
alignItems: "center",
alignSelf: "flex-start",
borderRadius: Module712.radii.lg,
backgroundColor: Module712.colors.MOBILE_SEGMENTED_CONTROL_BACKGROUND,
padding: Module712.space.PX_4
},
tab: {
paddingHorizontal: Module712.space.PX_12,
paddingVertical: Module712.space.PX_4
},
indicator: {
position: "absolute",
left: 0,
borderRadius: Module712.radii.md,
backgroundColor: Module712.colors.MOBILE_SEGMENTED_CONTROL_INDICATOR_BACKGROUND,
overflow: "hidden"
},
gradientLayer: {
...StyleSheet.absoluteFillObject
},
gradientTrack: {
...StyleSheet.absoluteFillObject,
right: void 0,
width: 240
},
gradientFill: {
flex: 1
},
tabText: {
fontStyle: "italic"
}
});
const __initData = {
code: "function BuyNitroPlanSelectorTierToggleTsx1(){const{nitroProgress}=this.__closure;return{opacity:nitroProgress.get()};}"
};
const __initData2 = {
code: "function BuyNitroPlanSelectorTierToggleTsx2(){const{gradientFlowX}=this.__closure;return{transform:[{translateX:gradientFlowX.get()}]};}"
};
const __initData3 = {
code: "function BuyNitroPlanSelectorTierToggleTsx3(){const{indicatorX,indicatorWidth}=this.__closure;return{transform:[{translateX:indicatorX.get()}],width:indicatorWidth.get()};}"
};
export default function BuyNitroPlanSelectorTierToggle(props) {
let setState, c19842_5, ref2, ref3, sharedValue, sharedValue2, ref4;
let sharedValue4;
const { selectedTier, setSelectedTier, disabled } = props;
setState = void 0;
c19842_5 = void 0;
ref2 = void 0;
ref3 = void 0;
sharedValue = void 0;
sharedValue2 = void 0;
ref4 = void 0;
const styles = useStyles();
sharedValue4 = void 0;
const r4 = selectedTier !== PremiumTypes.TIER_0;
let c19843_0 = r4;
const sharedValue3 = useSharedValue(r4 ? 1 : 0);
useEffect(() => {
sharedValue3.set(withTiming(c19843_0 ? 1 : 0, timingStandard));
}, [r4, sharedValue3]);
sharedValue4 = useSharedValue(0);
useEffect(() => {
if (accessibilityPreferencesSharedValue.get().reduceMotion) {
return void 0;
}
sharedValue4.set(withRepeat(withTiming(-120, {
duration: 5000,
easing: Easing.linear
}), -1, false));
return () => cancelAnimation(sharedValue4);
}, [sharedValue4]);
const r49 = () => ({
opacity: sharedValue3.get()
});
r49.__closure = {
nitroProgress: sharedValue3
};
r49.__workletHash = 7392050192451;
r49.__initData = __initData;
const animatedStyle = useAnimatedStyle(r49);
const c = () => ({
transform: [{
translateX: sharedValue4.get()
}]
});
c.__closure = {
gradientFlowX: sharedValue4
};
c.__workletHash = 14545174926033;
c.__initData = __initData2;
const animatedStyle2 = useAnimatedStyle(c);
let state;
[state, setState] = useState({});
const r20 = state[selectedTier];
c19842_5 = r20;
ref2 = useRef(null);
ref3 = useRef(new Map());
sharedValue = useSharedValue(0);
sharedValue2 = useSharedValue(0);
ref4 = useRef(false);
useLayoutEffect(() => {
const current = ref2.current;
if (current != null) {
ref3.current.forEach((item, c30520_0) => {
item.measureLayout(current, (c31655_0, c31655_1, width, height) => {
setState((prevState) => {
const r0 = {
...prevState
};
r0[c30520_0] = {
x: c31655_0,
y: c31655_1,
width,
height
};
return r0;
});
});
});
}
}, []);
useLayoutEffect(() => {
if (c19842_5 != null) {
if (ref4.current) {
sharedValue.set(withTiming(c19842_5.x, {
duration: 220
}));
sharedValue2.set(withTiming(c19842_5.width, {
duration: 220
}));
} else {
ref4.current = true;
sharedValue.set(c19842_5.x);
sharedValue2.set(c19842_5.width);
}
}
}, [r20, sharedValue, sharedValue2]);
const k = () => ({
transform: [{
translateX: sharedValue.get()
}],
width: sharedValue2.get()
});
k.__closure = {
indicatorX: sharedValue,
indicatorWidth: sharedValue2
};
k.__workletHash = 16235876189557;
k.__initData = __initData3;
const animatedStyle3 = useAnimatedStyle(k);
return <View ref={ref2} style={styles.pill} accessibilityRole="tablist">
{r20 != null && <ReanimatedRexport.View pointerEvents="none" style={[styles.indicator, {
top: r20.y,
height: r20.height
}, animatedStyle3]}>
<ReanimatedRexport.View style={[styles.gradientLayer, animatedStyle]}>
<ReanimatedRexport.View style={[styles.gradientTrack, animatedStyle2]}>
<Module4611 colors={colors} locations={locations} start={HorizontalGradient.START} end={HorizontalGradient.END} style={styles.gradientFill} />
</ReanimatedRexport.View>
</ReanimatedRexport.View>
</ReanimatedRexport.View>}
{NITRO_PLAN_TIERS.map((item) => {
const selected = item === selectedTier;
const TIER_0 = PremiumTypes.TIER_0;
return <Pressable key={item} ref={(a0) => {
if (a0 != null) {
ref3.current.set(item, a0);
}
}} style={styles.tab} disabled={disabled} onPress={() => {
triggerHapticFeedback(HapticFeedbackTypes.SELECTION);
setSelectedTier(item);
}} accessibilityRole="tab" accessibilityState={{
selected,
disabled
}}>
<Text variant="heading-sm/extrabold" color={selected ? item !== TIER_0 ? "text-overlay-light" : "interactive-text-active" : "text-muted"} style={styles.tabText}>
{intl.string(item === PremiumTypes.TIER_0 ? t.tUbSDK : PREMIUM_TYPE_DISPLAY_NAME[item]).toUpperCase()}
</Text>
</Pressable>;
})}
</View>;
};
@@ -0,0 +1,52 @@
// Metro module 12433 (f12434).
import { useCallback } from "react";
import { View } from "react-native";
import LocaleStore from "../../../../user_settings/LocaleStore";
import { DISCOUNTS, SubscriptionPlans } from "../../../../premium/PremiumConstants";
import { createStyles } from "../../../../../design/components/Styles/native/createStyles";
import Module712 from "../../../../../_bundle/Module712";
import { useToken } from "../../../../../design/tokens/native/useToken";
import { intl, t } from "../../../../../intl/index.native";
import { formatPercent } from "../../../../../utils/NumberUtils";
import { Text } from "../../../../../design/components/Text/native/Text";
import { getIntervalString } from "../../../../../utils/PremiumUtils";
const useStyles = createStyles({
labelRow: {
flexDirection: "row",
alignItems: "center",
gap: Module712.space.PX_8
},
discountBadge: {
borderRadius: Module712.radii.lg,
backgroundColor: Module712.unsafe_rawColors.GREEN_360,
paddingVertical: 2,
paddingHorizontal: Module712.space.PX_8
},
discountBadgeText: {
textTransform: "uppercase"
}
});
export function useBuyNitroPlanLabelRenderer() {
const styles = useStyles();
const token = useToken(Module712.modules.mobile.TABLE_ROW_LABEL_TEXT_STYLE);
const token2 = useToken(Module712.modules.mobile.TABLE_ROW_LABEL_COLOR);
return useCallback(({ bogoEligible, hasDiscountOffer, trialTier, discounted }, a1) => {
const r16 = DISCOUNTS[a1.basePlanId];
const r1 = a1.productId === discounted.id && discounted.priceString != null;
const r2 = trialTier != null && a1.premiumTier === trialTier;
const r24 = r16 == null || hasDiscountOffer || r2 || bogoEligible && a1.basePlanId === SubscriptionPlans.PREMIUM_YEAR_TIER_2;
const r14 = bogoEligible && a1.basePlanId === SubscriptionPlans.PREMIUM_MONTH_TIER_2 ? intl.string(t.iQTfWx) : r1 && discounted.percentOff != null ? intl.format(t.IAybsG, {
discount: formatPercent(LocaleStore.locale, discounted.percentOff / 100)
}) : r24 ? null : intl.format(t.IAybsG, {
discount: formatPercent(LocaleStore.locale, r16 / 100)
});
return <View style={styles.labelRow}>
<Text variant={token} color={token2}>
{getIntervalString(a1.interval, false)}
</Text>
{r14 != null && <View style={styles.discountBadge}>
<Text variant="text-xs/bold" color="text-overlay-light" style={styles.discountBadgeText}>{r14}</Text>
</View>}
</View>;
}, [styles, token, token2]);
}
@@ -0,0 +1,24 @@
// Metro module 12434 (f12435).
import { useCallback } from "react";
import { PRICE_PLACEHOLDER } from "../../../../premium/PremiumConstants";
import BuyNitroPlanPriceDetails from "../BuyNitroPlanPriceDetails";
export function useBuyNitroPlanSubLabelRenderer() {
return useCallback((a0, a1) => {
let r16;
const { priceStringByProductId, trialTier, discounted } = a0;
const r0 = trialTier != null && a1.premiumTier === trialTier;
const r1 = a1.productId === discounted.id && discounted.priceString != null;
L10: {
if (!r0 && !r1) {
r16 = priceStringByProductId.get(a1.productId);
if (r16 != null) {
break L10;
}
r16 = PRICE_PLACEHOLDER;
} else {
r16 = <BuyNitroPlanPriceDetails planSelection={a0} item={a1} />;
}
}
return r16;
}, []);
}
@@ -0,0 +1,116 @@
// Metro module 6660 (f6661).
import { useRef, useState, useEffect, useCallback } from "react";
import { View } from "react-native";
import IAPStore_android from "../../../../../stores/native/IAPStore.android";
import { PremiumTypes } from "../../../../premium/PremiumConstants";
import { createStyles } from "../../../../../design/components/Styles/native/createStyles";
import AnalyticsLocation from "../../../../app_analytics/AnalyticsLocation";
import * as _MobileWebRedirectCheckoutUtils from "../../../../payments/utils/MobileWebRedirectCheckoutUtils";
import { intl, t } from "../../../../../intl/index.native";
import { isAndroid } from "../../../../../utils/PlatformUtils";
import BuyNitroPurchaseButtonCrossfadeLayer, { useBuyNitroButtonCrossfade } from "./BuyNitroPurchaseButtonCrossfadeLayer";
import useInitialValue from "../../../../../hooks/useInitialValue";
import { getNewAnalyticsLoadId } from "../../../../premium/native/PremiumAnalyticsUtils";
import { BuyNitroPurchaseLock, useIsBuyNitroPurchaseBlocked } from "../../hooks/useBuyNitroPurchaseLock";
import { useStateFromStores } from "../../../../../_bundle/Module589";
import useAnalyticsLocations from "../../../../app_analytics/useAnalyticsLocations";
import AlertActionCreators from "../../../../../actions/native/AlertActionCreators";
import { Button } from "../../../../../design/components/Button/native/Button.native";
import BuyNitroPurchaseButtonLegalDisclaimer from "./BuyNitroPurchaseButtonLegalDisclaimer";
import BuyNitroPurchaseFlow from "../BuyNitroPurchaseFlow";
const useStyles = createStyles({
container: {
width: "100%"
},
buttonStack: {
width: "100%"
},
hiddenFlow: {
position: "absolute",
width: 0,
height: 0,
overflow: "hidden",
opacity: 0
}
});
export default function BuyNitroPurchaseButton(props) {
const { planSelection, onPaymentSuccess, onPaymentDismiss, location: location2 = AnalyticsLocation.PREMIUM_MARKETING_FOOTER } = props;
let state, setState, setState2, ref, callback;
let sourceAnalyticsLocations = props.sourceAnalyticsLocations;
const { applicationId, onHostSheetClose } = props;
state = void 0;
setState = void 0;
setState2 = void 0;
ref = void 0;
callback = void 0;
const styles = useStyles();
const { selection, priceStringByProductId, applyOrderPriceOverride } = planSelection;
const isMobileWebRedirectCheckoutEnabled = _MobileWebRedirectCheckoutUtils.isMobileWebRedirectCheckoutEnabled();
const text = isMobileWebRedirectCheckoutEnabled ? intl.string(t.rylrdY) : selection.isTrial ? intl.string(isAndroid() ? t.rKD72m : t.bboTul) : selection.priceString != null ? intl.formatToPlainString(t.i4T8vz, {
rate: selection.priceString
}) : intl.string(t.uuzaAK);
const r85 = selection.item?.premiumTier === PremiumTypes.TIER_0 ? "experimental_premium-basic" : "experimental_premium-primary";
const buyNitroButtonCrossfade = useBuyNitroButtonCrossfade(r85, text);
const { outgoing, onOutgoingDone } = buyNitroButtonCrossfade;
const initialValue = useInitialValue(() => getNewAnalyticsLoadId());
const ref2 = useRef(false);
[state, setState] = useState(null);
let expectedPriceString;
[expectedPriceString, setState2] = useState(null);
ref = useRef(state);
useEffect(() => {
ref.current = state;
}, [state]);
useEffect(() => () => {
if (ref.current != null) {
BuyNitroPurchaseLock.end();
}
}, []);
const stateFromStores = useStateFromStores([IAPStore_android], () => IAPStore_android.isBusy());
let loading = state != null;
const variant = r85;
if (!loading) {
loading = stateFromStores;
}
const isBuyNitroPurchaseBlocked = useIsBuyNitroPurchaseBlocked();
const disabled = loading || isBuyNitroPurchaseBlocked || (isMobileWebRedirectCheckoutEnabled ? !isMobileWebRedirectCheckoutEnabled : selection.priceString == null);
if (sourceAnalyticsLocations == null) {
sourceAnalyticsLocations = [];
}
const analyticsLocations = useAnalyticsLocations(sourceAnalyticsLocations, location2, AnalyticsLocation.PREMIUM_PAYMENT_ACTION_SHEET).analyticsLocations;
callback = useCallback(() => {
setState(null);
setState2(null);
BuyNitroPurchaseLock.end();
}, []);
const callback2 = useCallback((a0) => {
if (selection.item != null) {
applyOrderPriceOverride(selection.item.productId, a0);
}
AlertActionCreators.show({
title: intl.string(t["2DyOxw"]),
body: intl.string(t["Xr94E+"]),
hideActionSheet: false
});
callback();
}, [selection.item, applyOrderPriceOverride, callback]);
return <View style={styles.container}>
<View style={styles.buttonStack}>
<Button text={text} variant={variant} size="lg" grow onPress={useCallback(() => {
if (selection.item != null && BuyNitroPurchaseLock.begin()) {
let r18 = priceStringByProductId.get(selection.item.productId);
if (r18 == null) {
r18 = null;
}
setState2(r18);
setState(selection.item);
}
}, [selection.item, priceStringByProductId])} loading={loading} disabled={disabled} />
{outgoing != null && <BuyNitroPurchaseButtonCrossfadeLayer key={outgoing.key} snapshot={outgoing.snapshot} onDone={onOutgoingDone} />}
</View>
{isMobileWebRedirectCheckoutEnabled ? !isMobileWebRedirectCheckoutEnabled : <BuyNitroPurchaseButtonLegalDisclaimer item={selection.item} ctaText={text} isTrial={selection.isTrial} isDiscounted={selection.isDiscounted} />}
{state != null && <View style={styles.hiddenFlow} pointerEvents="none">
<BuyNitroPurchaseFlow item={state} analyticsLocations={analyticsLocations} analyticsLoadId={initialValue} hasEmittedPaymentFlowStartedRef={ref2} applicationId={applicationId} expectedPriceString={expectedPriceString} onExit={callback} onOrderPriceMismatch={callback2} onHostSheetClose={onHostSheetClose} onPaymentSuccess={onPaymentSuccess} onPaymentDismiss={onPaymentDismiss} />
</View>}
</View>;
};
@@ -0,0 +1,73 @@
// Metro module 6661 (f6662).
import { useEffect, useState, useCallback } from "react";
import { StyleSheet } from "react-native";
import * as _ReanimatedRexport from "../../../../reanimated/ReanimatedRexport";
import ReanimatedRexport, { useSharedValue, useAnimatedStyle } from "../../../../reanimated/ReanimatedRexport";
import { withTiming } from "../../../../../design/animation/reanimated/timing/timing";
import { timingStandard } from "../../../../../design/animation/reanimated/timing/timingPresets";
import { Button } from "../../../../../design/components/Button/native/Button.native";
const __initData = {
code: "function BuyNitroPurchaseButtonCrossfadeLayerTsx1(){const{opacity}=this.__closure;return{opacity:opacity.get()};}"
};
const __initData2 = {
code: "function BuyNitroPurchaseButtonCrossfadeLayerTsx2(finished){const{runOnJS,onDone}=this.__closure;if(finished===true){runOnJS(onDone)();}}"
};
export default function BuyNitroPurchaseButtonCrossfadeLayer(props) {
const { snapshot, onDone } = props;
const sharedValue = useSharedValue(1);
const _ = () => ({
opacity: sharedValue.get()
});
_.__closure = {
opacity: sharedValue
};
_.__workletHash = 10244393639035;
_.__initData = __initData;
const animatedStyle = useAnimatedStyle(_);
useEffect(() => {
const t = function t(a0) {
if (a0 === true) {
_ReanimatedRexport.runOnJS(onDone)();
}
};
t.__closure = {
runOnJS: _ReanimatedRexport.runOnJS,
onDone
};
t.__workletHash = 12882875362433;
t.__initData = __initData2;
sharedValue.set(withTiming(0, timingStandard, "respect-motion-settings", t));
}, [sharedValue, onDone]);
return <ReanimatedRexport.View style={[StyleSheet.absoluteFill, animatedStyle]} pointerEvents="none">
<Button text={snapshot.ctaText} variant={snapshot.variant} size="lg" grow onPress={void 0} />
</ReanimatedRexport.View>;
};
export function useBuyNitroButtonCrossfade(a0, a1) {
const [state, setState2] = useState({
variant: a0,
ctaText: a1
});
const [outgoing, setState] = useState(null);
if (!(state.variant === a0 && state.ctaText === a1)) {
if (state.variant !== a0) {
setState((prevState) => {
let r7 = prevState?.key;
if (r7 == null) {
r7 = 0;
}
return {
snapshot: state,
key: r7 + 1
};
});
}
setState2({
variant: a0,
ctaText: a1
});
}
return {
outgoing,
onOutgoingDone: useCallback(() => setState(null), [])
};
}
@@ -0,0 +1,35 @@
// Metro module 6662 (f6663).
import { HelpdeskArticles, MarketingURLs } from "../../../../../Constants";
import { createStyles } from "../../../../../design/components/Styles/native/createStyles";
import Module712 from "../../../../../_bundle/Module712";
import { intl, t } from "../../../../../intl/index.native";
import { isAndroid } from "../../../../../utils/PlatformUtils";
import PremiumUtils, { getIntervalStringAsNoun } from "../../../../../utils/PremiumUtils";
import HelpdeskUtils from "../../../../../utils/HelpdeskUtils";
import { Text } from "../../../../../design/components/Text/native/Text";
const useStyles = createStyles({
disclaimer: {
marginTop: Module712.space.PX_12,
textAlign: "center"
}
});
export default function BuyNitroPurchaseButtonLegalDisclaimer(props) {
const { item, ctaText, isTrial, isDiscounted } = props;
const styles = useStyles();
return item?.interval == null ? null : <Text style={styles.disclaimer} variant="text-xxs/medium">
{isTrial ? intl.format(isAndroid() ? t.tINI9V : t.ZWXtAj, {
paidURL: MarketingURLs.PAID_TERMS,
interval: getIntervalStringAsNoun(item.interval),
cancelURL: HelpdeskUtils.getArticleURL(HelpdeskArticles.PREMIUM_DETAILS_CANCEL_SUB)
}) : isDiscounted ? intl.format(t["3uC7vj"], {
buttonText: ctaText,
interval: PremiumUtils.formatInterval(item.interval),
cancelSubscriptionArticle: HelpdeskUtils.getArticleURL(HelpdeskArticles.PREMIUM_DETAILS_CANCEL_SUB),
paidServiceTermsArticle: HelpdeskUtils.getArticleURL(HelpdeskArticles.PAID_TERMS)
}) : intl.format(isAndroid() ? t.COObWR : t["7wpqfj"], {
paidURL: MarketingURLs.PAID_TERMS,
interval: getIntervalStringAsNoun(item.interval),
ctaText
})}
</Text>;
};
@@ -0,0 +1,33 @@
// Metro module 6509 (f6510).
import { useState } from "react";
import { usePremiumPlanPurchasedStore } from "../../../premium/native/PremiumPlanPurchasedStore";
import useInitialValue from "../../../../hooks/useInitialValue";
import { getMobileNitroMarketingRedesignExperiment } from "../BuyNitroMarketingExperiment";
export function useBuyNitroExperiment({ userHasSubscription, isNitroHomeSurface, isConfirmedNonSubscriber }) {
let canRenderRedesignUpsellEarly = useInitialValue(() => getMobileNitroMarketingRedesignExperiment({
location: "PremiumMarketingPage"
}));
const premiumPlanPurchasedStore = usePremiumPlanPurchasedStore((a0) => {
let initiatedPurchaseFromNewFlow = a0.initiatedPurchaseFromNewFlow;
const isPaymentSuccess = a0.isPaymentSuccess;
if (initiatedPurchaseFromNewFlow) {
initiatedPurchaseFromNewFlow = !isPaymentSuccess;
}
return initiatedPurchaseFromNewFlow;
});
const [state, setState] = useState(false);
const showRedesignUpsell = (canRenderRedesignUpsellEarly ? !userHasSubscription : canRenderRedesignUpsellEarly) && !isNitroHomeSurface || state && premiumPlanPurchasedStore;
if (state !== showRedesignUpsell) {
setState(showRedesignUpsell);
}
if (canRenderRedesignUpsellEarly) {
canRenderRedesignUpsellEarly = !isNitroHomeSurface;
}
if (canRenderRedesignUpsellEarly) {
canRenderRedesignUpsellEarly = isConfirmedNonSubscriber;
}
return {
canRenderRedesignUpsellEarly,
showRedesignUpsell
};
}
@@ -0,0 +1,48 @@
// Metro module 6574 (f6575).
import { useRef, useCallback, useEffect } from "react";
import { AnalyticEvents } from "../../../../Constants";
import useAnalyticsLocations from "../../../app_analytics/useAnalyticsLocations";
import AnalyticsUtils from "../../../../utils/AnalyticsUtils";
import useBuyNitroPerks from "./useBuyNitroPerks";
export default function useBuyNitroListData({ selection }) {
let analyticsLocations, ref3;
const { tier, setTier } = selection;
const buyNitroPerks = useBuyNitroPerks(tier);
const ref = useRef(null);
const ref2 = useRef(false);
const callback = useCallback((a0) => {
ref2.current = true;
setTier(a0);
}, [setTier]);
useEffect(() => {
if (ref2.current) {
ref2.current = false;
let c25931_0 = requestAnimationFrame(() => {
const current = ref.current;
return current == null ? void 0 : current.scrollToTop({
animated: true
});
});
return () => cancelAnimationFrame(c25931_0);
}
}, [buyNitroPerks]);
analyticsLocations = void 0;
ref3 = void 0;
analyticsLocations = useAnalyticsLocations().analyticsLocations;
ref3 = useRef(false);
return {
onScroll: function onScroll({ nativeEvent }) {
const { layoutMeasurement, contentOffset, contentSize } = nativeEvent;
const current = ref3.current;
if (current ? !current : layoutMeasurement.height + contentOffset.y >= contentSize.height) {
AnalyticsUtils.track(AnalyticEvents.PREMIUM_MARKETING_SURFACE_REACHED_BOTTOM, {
location_stack: analyticsLocations
});
ref3.current = true;
}
},
onSelectNitroTier: callback,
listData: buyNitroPerks,
listRef: ref
};
};
@@ -0,0 +1,50 @@
// Metro module 6562 (f6563).
import { useEffect, useLayoutEffect } from "react";
import { reset, usePremiumPlanPurchasedStore } from "../../../premium/native/PremiumPlanPurchasedStore";
import { ContentDismissActionType } from "../../../dismissible_content/DismissibleContentConstants";
import { createStyles } from "../../../../design/components/Styles/native/createStyles";
import Module712 from "../../../../_bundle/Module712";
import { usePromotionMarketingComponent } from "../../../premium/hooks/usePromotionMarketingComponent";
import { MarketingComponentType } from "../../../../_bundle/Module6567";
import { UNSAFE_isSnowflakeBoundDismissibleContentDismissed } from "../../../dismissible_content/DismissibleContentUnsafeUtils";
import { DismissibleContent } from "../../../../_bundle/Module1358";
import { markSnowflakeBoundDismissibleContentAsDismissed } from "../../../dismissible_content/DismissibleContentUtils";
import { BuyNitroPurchaseLock } from "./useBuyNitroPurchaseLock";
const useStyles = createStyles({
navigator: {
backgroundColor: Module712.colors.MOBILE_ACTIONSHEET_BACKGROUND,
borderTopWidth: 0
}
});
export function useBuyNitroMarketingLifecycleHooks(a0, a1) {
const styles = useStyles();
const promotionMarketingComponent = usePromotionMarketingComponent(MarketingComponentType.PREMIUM_TAB);
useEffect(() => {
if (a1 && promotionMarketingComponent != null && promotionMarketingComponent.properties.properties.oneofKind === "premiumTab" && !UNSAFE_isSnowflakeBoundDismissibleContentDismissed(DismissibleContent.PREMIUM_TAB_MARKETING_MOMENT_OFFER_BADGE, promotionMarketingComponent.promotionId).isDismissed) {
markSnowflakeBoundDismissibleContentAsDismissed(DismissibleContent.PREMIUM_TAB_MARKETING_MOMENT_OFFER_BADGE, promotionMarketingComponent.promotionId, {
dismissAction: ContentDismissActionType.AUTO_DISMISS
});
}
}, [a1, promotionMarketingComponent]);
useEffect(() => {
BuyNitroPurchaseLock.end();
return () => {
BuyNitroPurchaseLock.end();
BuyNitroPurchaseLock.setInitialLoadComplete(false);
};
}, []);
useEffect(() => {
BuyNitroPurchaseLock.setInitialLoadComplete(a1);
}, [a1]);
useLayoutEffect(() => {
a0.setOptions({
headerShown: false,
contentStyle: styles.navigator
});
}, [a0, styles.navigator]);
useEffect(() => () => {
if (!usePremiumPlanPurchasedStore.getState().isPaymentSuccess) {
reset();
}
}, []);
}
@@ -0,0 +1,317 @@
// Metro module 6575 (f6576).
import { useMemo } from "react";
import { Gradients } from "../../../colors/native/ColorConstants";
import { FractionalPremiumStates, NUM_FREE_GUILD_BOOSTS_WITH_PREMIUM, PremiumTypes } from "../../../premium/PremiumConstants";
import Module689 from "../../../../_bundle/Module689";
import useFractionalPremiumInfo from "../../../billing/hooks/useFractionalPremiumInfo";
import * as _index_native from "../../../../intl/index.native";
import { intl } from "../../../../intl/index.native";
import { ReactionIcon } from "../../../../design/components/Icon/native/redesign/generated/ReactionIcon";
import Module6578 from "../../../../_bundle/Module6578";
import { UploadIcon } from "../../../../design/components/Icon/native/redesign/generated/UploadIcon";
import Module6581 from "../../../../_bundle/Module6581";
import { isAppIconsSupported } from "../../../app_icons/native/AppIconUtils";
import { AppsIcon } from "../../../../design/components/Icon/native/redesign/generated/AppsIcon";
import { UserSquareIcon } from "../../../../design/components/Icon/native/redesign/generated/UserSquareIcon";
import Module6617 from "../../../../_bundle/Module6617";
import { BoostGemIcon } from "../../../../design/components/Icon/native/redesign/generated/BoostGemIcon";
import Module6620 from "../../../../_bundle/Module6620";
import { ScreenStreamIcon } from "../../../../design/components/Icon/native/redesign/generated/ScreenStreamIcon";
import Module6623 from "../../../../_bundle/Module6623";
import { SuperReactionIcon } from "../../../../design/components/Icon/native/redesign/generated/SuperReactionIcon";
import Module6626 from "../../../../_bundle/Module6626";
import { NitroWheelIcon } from "../../../../design/components/Icon/native/redesign/generated/NitroWheelIcon";
import { StickerIcon } from "../../../../design/components/Icon/native/redesign/generated/StickerIcon";
import Module6631 from "../../../../_bundle/Module6631";
import { SoundboardIcon } from "../../../../design/components/Icon/native/redesign/generated/SoundboardIcon";
import Module6634 from "../../../../_bundle/Module6634";
import { DoorEnterIcon } from "../../../../design/components/Icon/native/redesign/generated/DoorEnterIcon";
import { VideoIcon } from "../../../../design/components/Icon/native/redesign/generated/VideoIcon";
import Module6639 from "../../../../_bundle/Module6639";
import { ChatIcon } from "../../../../design/components/Icon/native/redesign/generated/ChatIcon";
import Module6640 from "../../../../_bundle/Module6640";
import { ServerGridIcon } from "../../../../design/components/Icon/native/redesign/generated/ServerGridIcon";
import Module6643 from "../../../../_bundle/Module6643";
import { PaintPaletteIcon } from "../../../../design/components/Icon/native/redesign/generated/PaintPaletteIcon";
import Module6646 from "../../../../_bundle/Module6646";
import { LettersIcon } from "../../../../design/components/Icon/native/redesign/generated/LettersIcon";
import { TrophyIcon } from "../../../../design/components/Icon/native/redesign/generated/TrophyIcon";
import { SparklesIcon } from "../../../../design/components/Icon/native/redesign/generated/SparklesIcon";
import { TagIcon } from "../../../../design/components/Icon/native/redesign/generated/TagIcon";
import { HermesBuiltin } from "../../../../_hermes/prelude";
function $mk78847($env) {
return (a0, a1) => ({
kind: "perk",
perk: a0,
start: a1 === 0,
end: a1 === $env[0].length - 1
});
}
let c4234_7 = Module689.scale([...Gradients.PREMIUM_TIER_2].reverse()).mode("lab");
let c4234_8 = Module689.scale([...Gradients.PREMIUM_TIER_0].reverse()).mode("lab");
export default function useBuyNitroPerks(a0) {
const r13 = useFractionalPremiumInfo({
forceFetch: true
}).fractionalState === FractionalPremiumStates.FP_ONLY;
let c15812_1 = r13;
return useMemo(() => {
let r587;
const r44 = [{
id: "emoji",
label: intl.string(_index_native.t["R2IV/Q"]),
subLabel: intl.string(_index_native.t["3cyhe3"]),
IconComponent: ReactionIcon,
includedInNitroBasic: true,
detail: {
image: Module6578,
description: _index_native.t["3SUJLd"]
}
}, {
id: "uploads",
label: intl.string(_index_native.t["3BtVbk"]),
labelBasic: intl.string(_index_native.t["Zs49/V"]),
subLabel: intl.string(_index_native.t["8AhJqy"]),
IconComponent: UploadIcon,
includedInNitroBasic: true,
detail: {
image: Module6581,
description: _index_native.t.i1UuMk
}
}, , , , , , , , , , , , , , ,];
const r0 = HermesBuiltin.arraySpread(r44, isAppIconsSupported() ? [{
id: "custom-app-icons",
label: intl.string(_index_native.t.OuItFi),
subLabel: intl.string(_index_native.t.mPyrE6),
IconComponent: AppsIcon,
includedInNitroBasic: true,
detail: null
}] : [], 2);
r44[r0] = {
id: "profiles",
label: intl.string(_index_native.t["Gv/rQ6"]),
subLabel: intl.string(_index_native.t["t/Mvdj"]),
IconComponent: UserSquareIcon,
includedInNitroBasic: false,
detail: {
image: Module6617,
description: _index_native.t.kWcDK8
}
};
const r172 = HermesBuiltin.arraySpread(r44, c15812_1 ? [] : [{
id: "boosts",
label: intl.formatToPlainString(_index_native.t.DbkNFj, {
numBoosts: NUM_FREE_GUILD_BOOSTS_WITH_PREMIUM
}),
subLabel: intl.string(_index_native.t["n+DGY/"]),
IconComponent: BoostGemIcon,
includedInNitroBasic: false,
detail: {
image: Module6620,
description: _index_native.t.jsyNHm
}
}], r0 + 1);
r44[r172] = {
id: "streaming",
label: intl.string(_index_native.t.RSXQYO),
subLabel: intl.string(_index_native.t.ymCPxp),
IconComponent: ScreenStreamIcon,
includedInNitroBasic: false,
detail: {
image: Module6623,
description: _index_native.t.ymCPxp
}
};
const r202 = r172 + 1;
r44[r202] = {
id: "super-reactions",
label: intl.string(_index_native.t["uZt5q/"]),
subLabel: intl.string(_index_native.t.ZK3ZoX),
IconComponent: SuperReactionIcon,
includedInNitroBasic: true,
detail: {
image: Module6626,
description: _index_native.t.A0U9fk
}
};
const r254 = c15812_1 ? [] : [{
id: "badge",
label: intl.string(_index_native.t.SS87rQ),
subLabel: intl.string(_index_native.t.oD6CRr),
IconComponent: NitroWheelIcon,
includedInNitroBasic: true,
detail: null
}];
const r259 = HermesBuiltin.arraySpread(r44, r254, r202 + 1);
r44[r259] = {
id: "stickers",
label: intl.string(_index_native.t.tzdIwI),
subLabel: intl.string(_index_native.t.hJG8ZN),
IconComponent: StickerIcon,
includedInNitroBasic: true,
detail: {
image: Module6631,
description: _index_native.t.FXlU24
}
};
const r289 = r259 + 1;
r44[r289] = {
id: "custom-sounds",
label: intl.string(_index_native.t.LWsArT),
subLabel: intl.string(_index_native.t["4lSyCY"]),
IconComponent: SoundboardIcon,
includedInNitroBasic: false,
detail: {
image: Module6634,
description: _index_native.t["4lSyCY"]
}
};
const r319 = r289 + 1;
r44[r319] = {
id: "entrance-sounds",
label: intl.string(_index_native.t["f4M+H9"]),
subLabel: intl.string(_index_native.t["7ZCYvC"]),
IconComponent: DoorEnterIcon,
includedInNitroBasic: false,
detail: null
};
const r342 = r319 + 1;
r44[r342] = {
id: "video-backgrounds",
label: intl.string(_index_native.t.NaGpTf),
subLabel: intl.string(_index_native.t["A8O/Qw"]),
IconComponent: VideoIcon,
includedInNitroBasic: true,
detail: {
image: Module6639,
description: _index_native.t["A8O/Qw"]
}
};
const r372 = r342 + 1;
r44[r372] = {
id: "longer-messages",
label: intl.string(_index_native.t.BUScid),
subLabel: intl.string(_index_native.t.vN6XpQ),
IconComponent: ChatIcon,
includedInNitroBasic: false,
detail: {
image: Module6640,
description: _index_native.t.vN6XpQ
}
};
const r402 = r372 + 1;
r44[r402] = {
id: "more-servers",
label: intl.string(_index_native.t.Bv8Pfk),
subLabel: intl.string(_index_native.t.JMfaTU),
IconComponent: ServerGridIcon,
includedInNitroBasic: false,
detail: {
image: Module6643,
description: _index_native.t.JMfaTU
}
};
const r432 = r402 + 1;
r44[r432] = {
id: "client-themes",
label: intl.string(_index_native.t.kWM48G),
subLabel: intl.string(_index_native.t.CjRASJ),
IconComponent: PaintPaletteIcon,
includedInNitroBasic: false,
detail: {
image: Module6646,
description: _index_native.t.jBTTws
}
};
const r462 = r432 + 1;
r44[r462] = {
id: "display-name-styles",
label: intl.string(_index_native.t.OLtTrt),
subLabel: intl.string(_index_native.t["di/pXR"]),
IconComponent: LettersIcon,
includedInNitroBasic: false,
detail: null
};
const r485 = r462 + 1;
r44[r485] = {
id: "permadecos",
label: intl.string(_index_native.t.L14NZN),
subLabel: intl.string(_index_native.t.eCZkAI),
IconComponent: TrophyIcon,
includedInNitroBasic: false,
detail: null
};
const r508 = r485 + 1;
r44[r508] = {
id: "early-access",
label: intl.string(_index_native.t.EYxi0o),
subLabel: intl.string(_index_native.t.M9AIt1),
IconComponent: SparklesIcon,
includedInNitroBasic: false,
detail: null
};
r44[r508 + 1] = {
id: "member-pricing",
label: intl.string(_index_native.t["H4/NBN"]),
subLabel: intl.string(_index_native.t.wo3D3T),
IconComponent: TagIcon,
includedInNitroBasic: false,
detail: null
};
let c25932_0 = r44;
const r557 = a0 === PremiumTypes.TIER_0;
let c25932_1 = r557;
const r560 = r44.map((item, index) => {
const r13 = index / c25932_0.length;
const r16 = (index + 1) / c25932_0.length;
const iconGradient = [c4234_7(r13).hex(), c4234_7(r16).hex()];
const iconGradientBasic = [c4234_8(r13).hex(), c4234_8(r16).hex()];
return {
...item,
label: c25932_1 && item.labelBasic != null ? item.labelBasic : item.label,
iconGradient,
iconGradientBasic,
disabled: c25932_1 && !item.includedInNitroBasic
};
});
const r570 = {
kind: "section-header",
id: "explore-perks-header",
title: intl.string(_index_native.t["eQX+gg"])
};
if (r557) {
const r581 = r560.filter((item) => item.includedInNitroBasic);
const r584 = r560.filter((item) => !item.includedInNitroBasic);
if (r584.length === 0) {
let env25936;
const r612 = [r570];
const r613 = env25936 = {};
env25936[0] = r581;
HermesBuiltin.arraySpread(r612, r581.map($mk78847(r613)), 1);
r587 = r612;
} else {
let env25934;
let env25935;
r587 = [r570, ,];
const r588 = env25934 = {};
env25934[0] = r581;
const r594 = HermesBuiltin.arraySpread(r587, r581.map($mk78847(r588)), 1);
r587[r594] = {
kind: "section-header",
id: "nitro-only-perks-header",
title: intl.string(_index_native.t.YCZldK),
highlightNitro: true
};
const r605 = env25935 = {};
env25935[0] = r584;
HermesBuiltin.arraySpread(r587, r584.map($mk78847(r605)), r594 + 1);
}
return r587;
}
let env25933;
const r571 = [r570];
const r572 = env25933 = {};
env25933[0] = r560;
HermesBuiltin.arraySpread(r571, r560.map($mk78847(r572)), 1);
return r571;
}, [a0, r13]);
};
@@ -0,0 +1,173 @@
// Metro module 6569 (f6570).
import { useState, useMemo, useCallback } from "react";
import { PremiumTypes, SubscriptionIntervalTypes } from "../../../premium/PremiumConstants";
import { getPremiumBundlesWithPredicate } from "../../../premium/native/PremiumBundledPlansUtils";
import { usePremiumTrialOfferPremiumType } from "../../../premium/native/MobileTrialUtils";
import { NitroACOMSubscriptionExperiment } from "../../../billing/native/ACOMExperiments";
import { isIOS } from "../../../../utils/PlatformUtils";
import { usePremiumDiscountOffer } from "../../../premium/hooks/usePremiumDiscountOffer.android";
import { useIsEligibleForBogoOffer } from "../../../premium/native/hooks/useIsEligibleForBogoOffer.android";
import { useDiscountedPremiumProductInfo } from "../../../premium/native/hooks/useDiscountedPremiumProductInfo";
import usePremiumPlanPrice from "../../../premium/native/hooks/usePremiumPlanPrice";
let c4228_7 = [PremiumTypes.TIER_2, PremiumTypes.TIER_0];
export { c4228_7 as NITRO_PLAN_TIERS };
export function useBuyNitroPlanSelection(a0) {
const premiumTrialOfferPremiumType = usePremiumTrialOfferPremiumType();
const enabled = NitroACOMSubscriptionExperiment.useConfig({
location: "useBuyNitroPlanSelection"
}).enabled;
const trialTier = isIOS() ? enabled ? void 0 : premiumTrialOfferPremiumType != null ? c4228_7.includes(premiumTrialOfferPremiumType) ? premiumTrialOfferPremiumType : void 0 : void 0 : premiumTrialOfferPremiumType != null ? c4228_7.includes(premiumTrialOfferPremiumType) ? premiumTrialOfferPremiumType : void 0 : void 0;
let r45 = a0?.tier;
if (r45 == null) {
r45 = null;
}
let c15804_3, c15804_4, c15804_5, c15804_6, memo2, state2, productId;
let [state3, setState] = useState(r45);
if (state3 == null) {
state3 = trialTier;
}
if (state3 == null) {
state3 = PremiumTypes.TIER_2;
}
const TIER_2 = state3;
const memo = useMemo(() => {
const TIER_22 = TIER_2;
return getPremiumBundlesWithPredicate((a0) => a0.additionalPlans.length === 0 && a0.isDeprecated !== true && a0.numPremiumGuild === 0 && a0.premiumTier === TIER_22).sort((a, b) => b.interval - a.interval);
}, [TIER_2]);
const premiumDiscountOffer = usePremiumDiscountOffer();
const isEligibleForBogoOffer = useIsEligibleForBogoOffer();
const discountedPremiumProductInfo = useDiscountedPremiumProductInfo(premiumDiscountOffer, memo);
const discountedProduct = discountedPremiumProductInfo.discountedProduct;
let discountedPriceString = discountedPremiumProductInfo.discountedPriceString;
const r14 = premiumDiscountOffer != null ? parseFloat(premiumDiscountOffer.discount.amount) : NaN;
const identifier = discountedProduct?.identifier;
let numMonths = premiumDiscountOffer == null ? void 0 : premiumDiscountOffer.discount?.userUsageLimit;
if (numMonths == null) {
numMonths = 1;
}
const discounted = {
id: identifier,
priceString: discountedPriceString,
numMonths,
percentOff: Number.isNaN(r14) ? null : r14
};
const r26 = memo.find((item) => item.interval === SubscriptionIntervalTypes.MONTH);
c15804_3 = r26;
const r25 = memo.find((item) => item.interval === SubscriptionIntervalTypes.YEAR);
c15804_4 = r25;
let r23 = usePremiumPlanPrice(r26?.basePlanId)?.priceString;
if (r23 == null) {
r23 = null;
}
c15804_5 = r23;
let r20 = usePremiumPlanPrice(r25?.basePlanId)?.priceString;
if (r20 == null) {
r20 = null;
}
c15804_6 = r20;
const [state, setState2] = useState(() => new Map());
const callback = useCallback((c25926_0, c25926_1) => {
setState2((prevState2) => {
const get = prevState2.get;
const r8 = get.call(prevState2, c25926_0);
if (r8 === c25926_1) {
return prevState2;
}
const map = new Map(prevState2);
map.set(c25926_0, c25926_1);
return map;
});
}, []);
memo2 = useMemo(() => {
const map = new Map();
const r3 = c15804_3 != null && c15804_5 != null;
if (r3) {
map.set(c15804_3.productId, c15804_5);
}
if (c15804_4 != null && c15804_6 != null) {
map.set(c15804_4.productId, c15804_6);
}
for (const item of state) {
const [r48, r50] = item;
if (map.has(r48)) {
map.set(r48, r50);
}
}
return map;
}, [r26, r25, r23, r20, state]);
const memo4 = useMemo(() => {
const set = new Set();
if (memo2.size > 0) {
for (const item of memo) {
if (!memo2.has(item.productId)) {
set.add(item.productId);
}
}
}
return set;
}, [memo, memo2]);
const r118 = isEligibleForBogoOffer ? SubscriptionIntervalTypes.MONTH : SubscriptionIntervalTypes.YEAR;
let r121 = a0?.productId;
if (r121 == null) {
r121 = null;
}
let [productId2, setState3] = useState(r121);
state2 = productId2;
const callback2 = useCallback((a0) => {
if (a0 !== TIER_2) {
setState(a0);
setState3(null);
}
}, [TIER_2]);
const callback3 = useCallback((a0) => {
setState3(a0);
setState(TIER_2);
}, [TIER_2]);
if (!(state2 != null && (memo.some((item) => item.productId === state2) && !memo4.has(state2)))) {
const memo3 = memo4;
const MONTH = r118;
const r142 = memo.filter((item) => !memo3.has(item.productId));
const r145 = r142.length > 0 ? r142 : memo;
let r148 = r145.find((item) => item.interval === MONTH);
if (r148 == null) {
r148 = r145[0];
}
productId2 = r148?.productId;
}
productId = productId2;
const item = memo.find((item) => item.productId === productId);
const isDiscounted = item != null && item.productId === discounted.id && discountedPriceString != null;
const isTrial = trialTier != null && item?.premiumTier === trialTier;
const r159 = item == null;
let priceString = null;
if (!r159) {
if (!isDiscounted) {
let r163 = memo2.get(item.productId);
if (r163 == null) {
r163 = null;
}
discountedPriceString = r163;
}
priceString = discountedPriceString;
}
return {
selection: {
tier: TIER_2,
setTier: callback2,
productId: productId2,
setProductId: callback3,
item,
priceString,
isDiscounted,
isTrial
},
items: memo,
priceStringByProductId: memo2,
unavailableProductIds: memo4,
bogoEligible: isEligibleForBogoOffer,
hasDiscountOffer: premiumDiscountOffer != null,
trialTier,
discounted,
applyOrderPriceOverride: callback
};
}
@@ -0,0 +1,45 @@
// Metro module 6568 (f6569).
import IAPStore_android from "../../../../stores/native/IAPStore.android";
import { create } from "../../../../_bundle/Module644";
import { useStateFromStores } from "../../../../_bundle/Module589";
let c4227_3 = create(() => ({
isLocked: false,
hasCompletedInitialLoad: false
}));
const r20 = {
begin: () => {
const state = c4227_3.getState();
const { isLocked, hasCompletedInitialLoad } = state;
const r8 = (hasCompletedInitialLoad ? isLocked : !hasCompletedInitialLoad) || IAPStore_android.isBusy();
let r0 = !r8;
if (!r8) {
c4227_3.setState({
isLocked: true
});
r0 = true;
}
return r0;
},
end: () => {
c4227_3.setState({
isLocked: false
});
},
setInitialLoadComplete: (a0) => {
c4227_3.setState({
hasCompletedInitialLoad: a0
});
}
};
export function useIsBuyNitroPurchaseBlocked() {
let r7 = c4227_3((a0) => {
const hasCompletedInitialLoad = a0.hasCompletedInitialLoad;
return hasCompletedInitialLoad ? a0.isLocked : !hasCompletedInitialLoad;
});
const stateFromStores = useStateFromStores([IAPStore_android], () => IAPStore_android.isBusy());
if (!r7) {
r7 = stateFromStores;
}
return r7;
}
export { r20 as BuyNitroPurchaseLock };