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,111 @@
// Metro module 14928 (f14929).
import { useLayoutEffect, useEffect } from "react";
import { AnalyticEvents } from "../../../../Constants";
import Logger from "../../../debug/Logger";
import AnalyticsUtils from "../../../../utils/AnalyticsUtils";
import * as _ReanimatedRexport from "../../../reanimated/ReanimatedRexport";
import { runOnUI } from "../../../reanimated/ReanimatedRexport";
let c10556_5 = new Logger("TabsPerformanceTracker");
let c10556_6 = {};
const __initData = {
code: "function TabsPerformanceTrackerTsx1(){const{runOnJS,log}=this.__closure;return runOnJS(log)();}"
};
const __initData2 = {
code: "function TabsPerformanceTrackerTsx2(){const{runOnJS,log}=this.__closure;return runOnJS(log)();}"
};
export function trackTabPressed(a0) {
if (c10556_6[a0] == null) {
c10556_6[a0] = {
startTime: performance.now()
};
}
}
export function useTrackTabPerformance(a0) {
const tab = a0;
useLayoutEffect(() => {
let c27858_0;
const log2 = function log() {
if (c27858_0 != null && c27858_0.startTime != null) {
c27858_0.layoutUITime = performance.now();
if (c27858_0.uiTime != null && c27858_0.layoutUITime != null) {
AnalyticsUtils.track(AnalyticEvents.REDESIGN_NAV_BAR_RENDERED, {
tab,
start_time: c27858_0.startTime,
layout_effect_time: c27858_0.layoutEffectTime,
layout_ui_thread_time: c27858_0.layoutUITime,
effect_time: c27858_0.effectTime,
ui_thread_time: c27858_0.uiTime
});
c10556_5.info("First navigation to", tab, "took", {
layoutEffectDuration: c27858_0.layoutEffectTime - c27858_0.startTime,
effectDuration: c27858_0.effectTime - c27858_0.startTime,
layoutUIDuration: c27858_0.layoutUITime - c27858_0.startTime,
uiDuration: c27858_0.uiTime - c27858_0.startTime
});
}
}
};
const r4 = c10556_6[tab];
c27858_0 = r4;
if (r4 != null && r4.startTime != null) {
r4.layoutEffectTime = performance.now();
const r21 = () => _ReanimatedRexport.runOnJS(log2)();
r21.__closure = {
runOnJS: _ReanimatedRexport.runOnJS,
log: log2
};
r21.__workletHash = 7114578957129;
r21.__initData = __initData;
runOnUI(r21)();
} else {
let r11 = c10556_6[tab];
if (r11 == null) {
r11 = {};
}
c10556_6[tab] = r11;
}
}, [a0]);
useEffect(() => {
let c27859_0;
const log3 = function log() {
if (c27859_0 != null && c27859_0.startTime != null) {
c27859_0.uiTime = performance.now();
if (c27859_0.uiTime != null && c27859_0.layoutUITime != null) {
AnalyticsUtils.track(AnalyticEvents.REDESIGN_NAV_BAR_RENDERED, {
tab,
start_time: c27859_0.startTime,
layout_effect_time: c27859_0.layoutEffectTime,
layout_ui_thread_time: c27859_0.layoutUITime,
effect_time: c27859_0.effectTime,
ui_thread_time: c27859_0.uiTime
});
c10556_5.info("First navigation to", tab, "took", {
layoutEffectDuration: c27859_0.layoutEffectTime - c27859_0.startTime,
effectDuration: c27859_0.effectTime - c27859_0.startTime,
layoutUIDuration: c27859_0.layoutUITime - c27859_0.startTime,
uiDuration: c27859_0.uiTime - c27859_0.startTime
});
}
}
};
const r4 = c10556_6[tab];
c27859_0 = r4;
if (r4 != null && r4.startTime != null) {
r4.effectTime = performance.now();
const r21 = () => _ReanimatedRexport.runOnJS(log3)();
r21.__closure = {
runOnJS: _ReanimatedRexport.runOnJS,
log: log3
};
r21.__workletHash = 331508196106;
r21.__initData = __initData2;
runOnUI(r21)();
} else {
let r11 = c10556_6[tab];
if (r11 == null) {
r11 = {};
}
c10556_6[tab] = r11;
}
}, [a0]);
}
@@ -0,0 +1,32 @@
// Metro module 15168 (f15169).
import { useEffect, useCallback } from "react";
import { resolveRefreshToken } from "../../../../themes/experiments/MobileVisualRefreshExperiment";
import Module712 from "../../../../../_bundle/Module712";
import { scaleTextLineHeight } from "../../../../screen/native/useScaledTextLineHeight.android";
import { useGuildProgressStep, openActionSheet } from "../../../../guild_progress/native/GuildProgressUtils";
import GuildProgressActionCreators from "../../../../guild_progress/GuildProgressActionCreators";
import { RowButton } from "../../../../../design/components/TableRow/native/RowButton.native";
import Module15169 from "../../../../../_bundle/Module15169";
import { intl, t } from "../../../../../intl/index.native";
import GuildProgressCircle from "../../../../guild_progress/native/components/GuildProgressCircle";
export default function GuildProgressButton(props) {
const guild = props.guild;
const guildProgressStep = useGuildProgressStep(guild);
const { percentComplete, subtitle, completed } = guildProgressStep;
useEffect(() => {
if (completed) {
GuildProgressActionCreators.markCompletedProgressSeen(guild.id);
}
}, [completed, guild.id]);
const callback = useCallback(() => {
if (!completed) {
GuildProgressActionCreators.createProgress(guild.id);
}
openActionSheet(guild);
}, [guild, completed]);
return <RowButton icon={<RowButton.Icon source={Module15169} />} label={intl.string(t.o3HK3d)} subLabel={subtitle} onPress={callback} trailing={<GuildProgressCircle percent={percentComplete} />} />;
};
export function getScaledGuildProgressButtonHeight(a0, a1) {
const r16 = resolveRefreshToken(Module712.modules.mobile.TABLE_ROW_PADDING, a1);
return r16 + scaleTextLineHeight("text-md/semibold", a0) + 2 * scaleTextLineHeight("text-xs/medium", a0) + r16;
}
@@ -0,0 +1,25 @@
// Metro module 14927 (f14928).
import { memo } from "react";
import { YouBarNavigatorScreens } from "../../MainTabsConstants";
import { useTrackTabPerformance } from "../TabsPerformanceTracker";
import useColorThemeBackground from "../../../../client_themes/native/useColorThemeBackground";
import { getIsEligibleForQuests } from "../../../../quests/lib/QuestsEligibility";
import { ThemeContextProvider } from "../../../../../_bundle/Module3901";
import { QuestDockExternalCoordinationContextProvider } from "../../../../quests/native/QuestDock/QuestDockExternalCoordinationContext";
import MainChannels from "../../../../../components_native/MainChannels";
import YouBar from "../../you_bar/YouBar";
import QuestDock from "../../../../quests/native/QuestDock/QuestDock";
const r25 = memo(function GuildsOnly() {
useTrackTabPerformance(YouBarNavigatorScreens.GUILDS);
const colorThemeBackground = useColorThemeBackground();
let r8 = getIsEligibleForQuests();
const r32 = [<MainChannels />, <YouBar />, ,];
if (r8) {
r8 = <QuestDock />;
}
r32[2] = r8;
return <ThemeContextProvider gradient={colorThemeBackground}>
<QuestDockExternalCoordinationContextProvider>{r32}</QuestDockExternalCoordinationContextProvider>
</ThemeContextProvider>;
}, () => true);
export default r25;
@@ -0,0 +1,77 @@
// Metro module 14938 (f14939).
import { memo, useContext } from "react";
import { View } from "react-native";
import HomeDrawerStore from "../../../../home_drawer/native/HomeDrawerStore";
import { DM_WIDTH } from "../../../../../Constants";
import { createStyles } from "../../../../../design/components/Styles/native/createStyles";
import { MobileHomeDrawerExperiment } from "../../../../home_drawer/native/HomeDrawerExperiment";
import { useDrawerOpen } from "../../../../home_drawer/native/useDrawerState";
import { HomeDrawerStateContext } from "../../../../home_drawer/native/useHomeDrawerGesture";
import { useIsClientThemeOrCustomThemeActive } from "../../../../client_themes/native/useActiveTheme";
import { useToken } from "../../../../../design/tokens/native/useToken";
import Module712 from "../../../../../_bundle/Module712";
import * as _ReanimatedRexport from "../../../../reanimated/ReanimatedRexport";
import ReanimatedRexport, { useAnimatedStyle } from "../../../../reanimated/ReanimatedRexport";
import GuildsBar from "../../../../guilds_bar/native/GuildsBar";
const useStyles = createStyles({
container: {
flex: 1
},
guildsListContainerGestured: {
flex: 1
},
guildLisetContainerDefault: {
flex: 1
}
});
const __initData = {
code: "function HomePanelContentTsx1(){const{enableHome,isGradientTheme,maxX,interpolateColor,panelSpringTranslateX,baseLowest,panelBg}=this.__closure;if(!enableHome||isGradientTheme||maxX<=0){return{backgroundColor:'transparent'};}return{backgroundColor:interpolateColor(panelSpringTranslateX.get(),[0,maxX],[baseLowest,panelBg])};}"
};
const r37 = memo(function() {
let c21467_2, isClientThemeOrCustomThemeActive, token, token2;
const styles = useStyles();
const enableHome = MobileHomeDrawerExperiment.useConfig({
location: "guilds"
}).enableHome;
const drawerOpen = useDrawerOpen(enableHome);
const panelSpringTranslateX = useContext(HomeDrawerStateContext).panelSpringTranslateX;
const maxX = HomeDrawerStore((a0) => a0.maxX);
c21467_2 = maxX;
isClientThemeOrCustomThemeActive = useIsClientThemeOrCustomThemeActive();
token = useToken(Module712.colors.BACKGROUND_BASE_LOWEST);
token2 = useToken(Module712.colors.PANEL_BG);
const r53 = function() {
let r20;
if (enableHome && !isClientThemeOrCustomThemeActive) {
r20 = c21467_2 <= 0 ? {
backgroundColor: "transparent"
} : {
backgroundColor: _ReanimatedRexport.interpolateColor(panelSpringTranslateX.get(), [0, c21467_2], [token, token2])
};
} else {
r20 = {
backgroundColor: "transparent"
};
}
return r20;
};
r53.__closure = {
enableHome,
isGradientTheme: isClientThemeOrCustomThemeActive,
maxX,
interpolateColor: _ReanimatedRexport.interpolateColor,
panelSpringTranslateX,
baseLowest: token,
panelBg: token2
};
r53.__workletHash = 4210709178426;
r53.__initData = __initData;
return <ReanimatedRexport.View style={[styles.container, useAnimatedStyle(r53)]}>
<View style={[enableHome && drawerOpen ? styles.guildsListContainerGestured : styles.guildLisetContainerDefault, enableHome ? null : {
width: DM_WIDTH
}]}>
<GuildsBar enableHome={enableHome} />
</View>
</ReanimatedRexport.View>;
});
export { r37 as HomePanelContent };
@@ -0,0 +1,93 @@
// Metro module 15221 (f15222).
import { memo, useCallback } from "react";
import { Image as Image2, View } from "react-native";
import PermissionStore from "../../../../../../stores/PermissionStore";
import { Permissions } from "../../../../../../Constants";
import { createStyles } from "../../../../../../design/components/Styles/native/createStyles";
import { TextStyleSheet, Text } from "../../../../../../design/components/Text/native/Text";
import Module712 from "../../../../../../_bundle/Module712";
import { useStateFromStoresObject } from "../../../../../../_bundle/defaultAreStatesEqual";
import GuildSettingsActionCreators from "../../../../../guild_settings/GuildSettingsActionCreators";
import CreateChannelModalActionCreators from "../../../../../../actions/native/CreateChannelModalActionCreators";
import { useYouBarTotalHeight } from "../../../you_bar/hooks/useYouBarTotalHeight";
import * as _FavoritesUtils from "../../../../../favorites/FavoritesUtils";
import { FavoritesSpotIllustration } from "../../../../../../design/assets/native";
import Module15222 from "../../../../../../_bundle/Module15222";
import { intl, t } from "../../../../../../intl/index.native";
import FavoritesGuild_messages from "../../../../../favorites/intl/FavoritesGuild.messages";
import { RowButton } from "../../../../../../design/components/TableRow/native/RowButton.native";
import { Icon } from "../../../../../../design/void/native";
import Module15223 from "../../../../../../_bundle/Module15223";
import { BaseTextButton } from "../../../../../../design/components/Button/native/BaseTextButton.native";
const useStyles = createStyles({
wrapper: {
flex: 1,
paddingTop: 12
},
content: {
flex: 1,
justifyContent: "center",
alignItems: "center",
paddingHorizontal: 48
},
headerText: {
...TextStyleSheet["heading-md/bold"],
fontSize: 18,
marginTop: 16,
marginBottom: 8
},
text: {
textAlign: "center"
},
buttonWrapper: {
marginTop: 24
},
buttonPill: {
borderRadius: Module712.radii.xl,
height: 44,
paddingHorizontal: 20
},
personalizeButtonWrapper: {
marginHorizontal: 12,
marginBottom: 12
}
});
const r56 = memo(function ChannelsEmpty(props) {
const guild = props.guild;
const styles = useStyles();
const stateFromStoresObject = useStateFromStoresObject([PermissionStore], () => ({
canCustomizeGuild: PermissionStore.can(Permissions.MANAGE_GUILD, guild),
canCreateChannel: PermissionStore.can(Permissions.MANAGE_CHANNELS, guild)
}), [guild]);
let canCustomizeGuild = stateFromStoresObject.canCustomizeGuild;
let canCreateChannel = stateFromStoresObject.canCreateChannel;
const callback2 = useCallback(() => {
GuildSettingsActionCreators.open(guild.id);
}, [guild.id]);
const callback = useCallback(() => {
CreateChannelModalActionCreators.open(null, guild.id, null, null);
}, [guild.id]);
const youBarTotalHeight = useYouBarTotalHeight(16);
const isFavoritesGuildId = _FavoritesUtils.isFavoritesGuildId(guild.id);
const r52 = isFavoritesGuildId ? <FavoritesSpotIllustration width={192} height={108} /> : <Image2 source={Module15222} />;
const r16 = isFavoritesGuildId ? intl.string(FavoritesGuild_messages["wh+Rz1"]) : intl.string(t.o4s29v);
const r12 = isFavoritesGuildId ? intl.string(FavoritesGuild_messages["+SuGKb"]) : intl.string(t.iypvFu);
if (canCustomizeGuild) {
canCustomizeGuild = <View style={styles.personalizeButtonWrapper}>
<RowButton icon={<Icon source={Module15223} disableColor />} label={intl.string(t["Yhi9/N"])} onPress={callback2} />
</View>;
}
const r109 = [canCustomizeGuild, ,];
const r112 = [r52, <Text color="mobile-text-heading-primary" variant="heading-md/bold" style={[styles.text, styles.headerText]}>{r16}</Text>, <Text color="text-default" variant="text-md/medium" style={styles.text}>{r12}</Text>, ,];
if (canCreateChannel) {
canCreateChannel = <View style={styles.buttonWrapper}>
<BaseTextButton shrink size="md" pillStyle={styles.buttonPill} text={intl.string(t["63PyJQ"])} onPress={callback} />
</View>;
}
r112[3] = canCreateChannel;
r109[1] = <View style={styles.content}>{r112}</View>;
return <View style={[styles.wrapper, {
paddingBottom: youBarTotalHeight
}]}>{r109}</View>;
});
export default r56;
@@ -0,0 +1,164 @@
// Metro module 15234 (f15235).
import _slicedToArray from "../../../../../../_bundle/_slicedToArray";
import { memo, useEffect } from "react";
import { Image as Image2, ScrollView, View } from "react-native";
import AuthenticationStore from "../../../../../../stores/AuthenticationStore";
import GuildStore from "../../../../../../stores/GuildStore";
import SelectedGuildStore from "../../../../../../stores/SelectedGuildStore";
import { ME, MOBILE_GUILD_UPSELL_LIST } from "../../../../../../Constants";
import { createStyles } from "../../../../../../design/components/Styles/native/createStyles";
import Module712 from "../../../../../../_bundle/Module712";
import { Heading, Text, TextStyleSheet } from "../../../../../../design/components/Text/native/Text";
import CreateGuildModalActionCreators from "../../../../../create_guild/native/CreateGuildModalActionCreators";
import Module15235 from "../../../../../../_bundle/Module15235";
import { intl, t } from "../../../../../../intl/index.native";
import { Stack } from "../../../../../../design/components/Stack/native/Stack.native";
import { Button } from "../../../../../../design/components/Button/native/Button.native";
import { useNavigation, CommonActions } from "../../../../../../_bundle/Module1481";
import { useStateFromStores } from "../../../../../../_bundle/defaultAreStatesEqual";
import useTrackImpression from "../../../../../app_analytics/useTrackImpression";
import { ImpressionTypes, ImpressionNames } from "../../../../../../_bundle/Module503";
import { isFavoritesGuildId } from "../../../../../favorites/FavoritesUtils";
import { getInitialGuildState } from "../../../getInitialNavigationState";
import { useIsScreenLandscape } from "../../../../../screen/useIsScreenLandscape.native";
import { useYouBarTotalHeight } from "../../../you_bar/hooks/useYouBarTotalHeight";
let useStyles, handleCreateGuild, GuildsEmptyContent;
const handleJoinGuild = function handleJoinGuild() {
CreateGuildModalActionCreators.openGuildJoinServerScreen();
};
handleCreateGuild = function handleCreateGuild() {
CreateGuildModalActionCreators.openCreateGuildModal();
};
GuildsEmptyContent = function GuildsEmptyContent(props) {
const contentContainerStyle = props.contentContainerStyle;
const styles = useStyles();
return <ScrollView alwaysBounceVertical={false} bounces={false} style={styles.scrollView} contentContainerStyle={[styles.scrollViewContentContainer, contentContainerStyle]}>
<View>
<View style={styles.content}>
<View style={styles.illustrationWrapper}>
<Image2 source={Module15235} style={styles.illustration} />
</View>
<View style={styles.textWrapper}>
<Heading color="mobile-text-heading-primary" variant="heading-md/bold" style={[styles.text, styles.headerText]}>
{intl.string(t["Y7Ml/I"])}
</Heading>
<Text color="text-default" variant="text-md/medium" style={styles.text}>
{intl.string(t.kuyE4r)}
</Text>
</View>
</View>
<Stack style={styles.buttonContainer} spacing={12}>
<Button size="lg" text={intl.string(t.riOUtB)} onPress={handleJoinGuild} />
<Button size="lg" variant="secondary" text={intl.string(t["BetvT+"])} onPress={handleCreateGuild} />
</Stack>
</View>
</ScrollView>;
};
useStyles = createStyles({
scrollView: {
borderTopLeftRadius: Module712.radii.xxl,
borderTopRightRadius: Module712.radii.sm
},
header: {
zIndex: 100,
width: "100%",
backgroundColor: Module712.colors.BACKGROUND_BASE_LOW,
flex: 1
},
headerTitle: {
height: 56,
marginLeft: 16,
marginRight: 8,
flexDirection: "row",
alignItems: "center"
},
scrollViewContentContainer: {
flexGrow: 2,
justifyContent: "center",
backgroundColor: Module712.colors.BACKGROUND_BASE_LOW
},
headerInner: {
flex: 1,
flexDirection: "row",
alignItems: "center"
},
content: {
flexGrow: 2,
paddingHorizontal: Module712.space.PX_16,
alignItems: "center",
justifyContent: "center"
},
illustrationWrapper: {
width: "100%",
paddingHorizontal: 36
},
illustration: {
resizeMode: "contain",
alignSelf: "center",
marginBottom: Module712.space.PX_24
},
buttonContainer: {
paddingBottom: Module712.space.PX_16,
paddingHorizontal: Module712.space.PX_16,
backgroundColor: Module712.colors.BACKGROUND_BASE_LOW
},
textWrapper: {
marginHorizontal: Module712.space.PX_16,
marginVertical: Module712.space.PX_24
},
headerText: {
...TextStyleSheet["heading-md/bold"],
fontSize: 18,
marginBottom: 8
},
text: {
textAlign: "center"
}
});
const r111 = memo(function GuildsEmpty(props) {
let selectedGuildId;
const { selectedGuildId: selectedGuildId2, style } = props;
selectedGuildId = void 0;
const styles = useStyles();
const navigation = useNavigation();
const stateFromStores = useStateFromStores([AuthenticationStore], () => AuthenticationStore.getSessionId() != null);
selectedGuildId = stateFromStores ? selectedGuildId2 : null;
useTrackImpression({
type: ImpressionTypes.VIEW,
name: ImpressionNames.GUILDS_EMPTY_NUX
});
useEffect(() => {
if (selectedGuildId != null && navigation != null && selectedGuildId !== ME && !isFavoritesGuildId(selectedGuildId) && selectedGuildId !== MOBILE_GUILD_UPSELL_LIST) {
let r18 = GuildStore.getGuild(selectedGuildId);
if (r18 == null) {
r18 = GuildStore.getGuild(SelectedGuildStore.getGuildId());
}
if (r18 == null) {
r18 = GuildStore.getGuild(SelectedGuildStore.getLastSelectedGuildId());
}
if (r18 == null) {
r18 = GuildStore.getGuilds()[GuildStore.getGuildIds()[0]];
}
if (r18 != null) {
let c27968_0 = _slicedToArray(getInitialGuildState(r18.id, void 0, false), 2)[1];
navigation.dispatch(() => CommonActions.reset(c27968_0));
}
}
}, [selectedGuildId, navigation]);
const isScreenLandscape = useIsScreenLandscape();
const youBarTotalHeight = useYouBarTotalHeight();
return stateFromStores ? <View style={[styles.header, style]}>
<View style={styles.headerTitle}>
<View style={styles.headerInner}>
<Text color="mobile-text-heading-primary" variant="heading-lg/bold" maxFontSizeMultiplier={1.75} accessibilityRole="header">
{intl.string(t["7hB4kg"])}
</Text>
</View>
</View>
<GuildsEmptyContent contentContainerStyle={isScreenLandscape ? {
paddingBottom: youBarTotalHeight
} : void 0} />
</View> : null;
});
export default r111;
export { GuildsEmptyContent };
@@ -0,0 +1,130 @@
// Metro module 15022 (f15023).
import { memo, useRef, useEffect, useLayoutEffect } from "react";
import { View } from "react-native";
import AccessibilityStore from "../../../../a11y/AccessibilityStore";
import GatewayConnectionStore from "../../../../gateway/GatewayConnectionStore";
import { jsx } from "react/jsx-runtime";
import { createStyles } from "../../../../../design/components/Styles/native/createStyles";
import Module712 from "../../../../../_bundle/Module712";
import useAnalyticsLocations, { AnalyticsLocationProvider } from "../../../../app_analytics/useAnalyticsLocations";
import AnalyticsLocation from "../../../../app_analytics/AnalyticsLocation";
import { useSharedValue, useAnimatedScrollHandler } from "../../../../reanimated/ReanimatedRexport";
import { useYouBarTotalHeight } from "../../you_bar/hooks/useYouBarTotalHeight";
import { useMobileQuestDockHeight } from "../../../../quests/native/QuestHooks.native";
import useMessagesSpecs from "./useMessagesSpecs";
import useMessagesData from "./useMessagesData";
import MessagesListImplExperiment from "./MessagesListImplExperiment";
import useMessagesScrollToTop from "./useMessagesScrollToTop";
import useMessagesReconnectToCallsEffect from "./useMessagesReconnectToCallsEffect";
import { useCommonTriggerPoint } from "../../../../experiments/trigger_points/useCommonTriggerPoint";
import { DmGdmListRenderTriggerPoint } from "../../../../experiments/trigger_points/DmGdmListRenderTriggerPoint";
import MobileVisualRefreshExperiment from "../../../../themes/experiments/MobileVisualRefreshExperiment";
import { isAndroid } from "../../../../../utils/PlatformUtils";
import { getRootNavigationRef } from "../../../RootNavigationRef.native";
import { coerceGuildsRoute } from "../../../helpers/NavigationRouteUtils.native";
import { DeprecatedLayoutAnimation } from "../../../../animations/native/DeprecatedLayoutAnimation";
import { trackAppUIViewed } from "../../../../tti_analytics/native/TTIAnalyticsUtils";
import TTITracker from "../../../../tti_analytics/TTITracker";
import { useExternalScrollEventHandler } from "../../../../quests/native/QuestDock/QuestDockExternalCoordinationContext";
import { intl, t } from "../../../../../intl/index.native";
import { CutoutBackgroundProvider } from "../../../../../design/components/Icon/native/CutoutBackgroundContext";
import MessagesHeader from "./MessagesHeader";
import MessagesEmptyState from "./MessagesEmptyState";
import { TTIFirstContentfulPaint } from "../../../../tti_analytics/native/TTIFirstContentfulPaint";
let __initData;
const useStyles = createStyles(() => ({
container: {
flex: 1,
backgroundColor: Module712.colors.PANEL_BG
}
}));
__initData = {
code: "function MessagesTsx1(event){const{scrollPosition,handleGuildsNavigationScroll}=this.__closure;scrollPosition.set(event.contentOffset.y);handleGuildsNavigationScroll(event.contentOffset.y,event.contentSize.height,event.layoutMeasurement.height);}"
};
const r34 = memo(function Messages(props) {
let externalScrollEventHandler;
const style = props.style;
externalScrollEventHandler = void 0;
const styles = useStyles();
const analyticsLocations = useAnalyticsLocations(AnalyticsLocation.MESSAGES).analyticsLocations;
const sharedValue = useSharedValue(0);
const insetEnd = useYouBarTotalHeight() + useMobileQuestDockHeight();
const youBarTotalHeight = useYouBarTotalHeight(-16);
const messagesSpecs = useMessagesSpecs();
const { headerSize, listItemHeight, listItemSizes, listItemSuggestedFriendHeight, listLeft, listTop } = messagesSpecs;
const messagesData = useMessagesData();
const { dataKey, sections, showFullscreenEmptyState } = messagesData;
const ref2 = useRef(null);
const ref = useRef(null);
const config = MessagesListImplExperiment.useConfig({
location: "Messages Tab"
});
const { list, recycleItems } = config;
useMessagesScrollToTop({
listRef: ref2,
listRefHappeningNow: ref
});
useMessagesReconnectToCallsEffect();
useCommonTriggerPoint(DmGdmListRenderTriggerPoint);
const isRefreshEnabled = MobileVisualRefreshExperiment("Messages");
useEffect(() => {
if (dataKey != null && !isAndroid() && !AccessibilityStore.useReducedMotion) {
const rootNavigationRef2 = getRootNavigationRef();
let r21 = rootNavigationRef2 != null && rootNavigationRef2.isReady();
if (r21) {
const rootNavigationRef = getRootNavigationRef();
r21 = coerceGuildsRoute(rootNavigationRef == null ? void 0 : rootNavigationRef.getCurrentRoute()) != null;
}
if (r21) {
DeprecatedLayoutAnimation();
}
}
}, [dataKey]);
useLayoutEffect(() => {
trackAppUIViewed();
TTITracker.recordRender(sections.reduce((acc, section) => acc + section, 0), GatewayConnectionStore.isConnected());
});
externalScrollEventHandler = useExternalScrollEventHandler({
id: "messages"
});
const z = function z(a0) {
sharedValue.set(a0.contentOffset.y);
externalScrollEventHandler(a0.contentOffset.y, a0.contentSize.height, a0.layoutMeasurement.height);
};
z.__closure = {
scrollPosition: sharedValue,
handleGuildsNavigationScroll: externalScrollEventHandler
};
z.__workletHash = 5461403437592;
z.__initData = __initData;
const animatedScrollHandler = useAnimatedScrollHandler(z);
const r113 = {
accessibilityLabel: intl.string(t.OIgYlQ),
data: messagesData,
handleScrollAnimated: animatedScrollHandler,
insetEnd,
isRefreshEnabled,
listItemHeight,
listItemSizes,
listItemSuggestedFriendHeight,
listLeft,
listRefHappeningNow: ref,
listTop,
recycleItems,
scrollIndicatorInsetBottom: youBarTotalHeight,
scrollPosition: sharedValue
};
return <AnalyticsLocationProvider value={analyticsLocations}>
<View style={[styles.container, style]}>
<CutoutBackgroundProvider backgroundColor={styles.container.backgroundColor}>
<MessagesHeader height={headerSize} scrollPosition={sharedValue} />
{showFullscreenEmptyState ? <MessagesEmptyState /> : jsx(importDefault(list === "legend" ? dependencyMap[31] : list === "flash" ? dependencyMap[32] : dependencyMap[33]), {
ref: ref2,
...r113
})}
<TTIFirstContentfulPaint label="messages_tabs" />
</CutoutBackgroundProvider>
</View>
</AnalyticsLocationProvider>;
});
export default r34;
@@ -0,0 +1,101 @@
// Metro module 15048 (f15049).
import { useState, useCallback } from "react";
import { Image as Image2, ScrollView, View } from "react-native";
import { createStyles } from "../../../../../design/components/Styles/native/createStyles";
import useWindowDimensions_native from "../../../../screen/useWindowDimensions.native";
import { useNavigation } from "../../../../../design/components/Navigator/native/useNavigation.native";
import useTrackImpression from "../../../../app_analytics/useTrackImpression";
import { ImpressionTypes, ImpressionNames } from "../../../../../_bundle/Module503";
import { useIsScreenLandscape } from "../../../../screen/useIsScreenLandscape.native";
import { useYouBarTotalHeight } from "../../you_bar/hooks/useYouBarTotalHeight";
import Module15049 from "../../../../../_bundle/Module15049";
import { Heading, Text } from "../../../../../design/components/Text/native/Text";
import { intl, t } from "../../../../../intl/index.native";
import { Button } from "../../../../../design/components/Button/native/Button.native";
const useStyles = createStyles({
container: {
flex: 1,
justifyContent: "center"
},
scrollViewContentContainer: {
flexGrow: 2
},
innerContainer: {
alignItems: "center",
justifyContent: "center"
},
imageContainer: {
alignItems: "center",
marginBottom: 24
},
textWrapper: {
paddingHorizontal: 48
},
body: {
marginBottom: 24,
textAlign: "center"
},
title: {
textAlign: "center",
fontSize: 18,
marginBottom: 8
},
buttonWrapper: {
paddingHorizontal: 16,
paddingBottom: 16
}
});
export default function MessagesEmptyState() {
let navigation;
const styles = useStyles();
let width = useWindowDimensions_native().width;
const [state, setState] = useState(0);
const callback2 = useCallback((a0) => {
setState(a0.nativeEvent.layout.width);
}, []);
navigation = useNavigation();
const callback = useCallback(() => {
navigation.navigate("friends", {
screen: "add-friends",
params: {
sourcePage: "Messages Empty State",
presentation: "card"
}
});
}, [navigation]);
useTrackImpression({
type: ImpressionTypes.VIEW,
name: ImpressionNames.MESSAGES_EMPTY_NUX
});
if (state > 0) {
width = state;
}
const r54 = 0.9 * width;
const isScreenLandscape = useIsScreenLandscape();
const youBarTotalHeight = useYouBarTotalHeight();
return <ScrollView alwaysBounceVertical={false} bounces={false} contentContainerStyle={[styles.scrollViewContentContainer, isScreenLandscape ? {
paddingBottom: youBarTotalHeight
} : void 0]}>
<View style={styles.container} onLayout={callback2}>
<View style={styles.innerContainer}>
<View style={styles.imageContainer}>
<Image2 resizeMode="contain" source={Module15049} style={{
height: r54 < 622 ? r54 / 622 * 350 : 350,
width: Math.min(r54, 622)
}} />
</View>
<View style={styles.textWrapper}>
<Heading color="mobile-text-heading-primary" variant="heading-md/bold" style={styles.title}>
{intl.string(t["8JZof8"])}
</Heading>
<Text color="text-default" variant="text-md/medium" style={styles.body}>
{intl.string(t["qm+H7x"])}
</Text>
</View>
</View>
<View style={styles.buttonWrapper}>
<Button text={intl.string(t.zIJnA6)} onPress={callback} size="lg" />
</View>
</View>
</ScrollView>;
};
@@ -0,0 +1,132 @@
// Metro module 15097 (f15098).
import * as Module19 from "react";
import { forwardRef, useRef, useImperativeHandle, useCallback, useMemo } from "react";
import { createStyles } from "../../../../../design/components/Styles/native/createStyles";
import Module712 from "../../../../../_bundle/Module712";
import { MessagesDataSections, MessagesDataHeader } from "./useMessagesData";
import { MessagesItemChannelFast } from "./items/MessagesItemChannel";
import MessagesItemSeparator, { MESSAGES_ITEM_SEPERATOR_HEIGHT } from "./items/MessagesItemSeparator";
import { MessagesItemSuggestedFriendFast } from "./items/MessagesItemSuggestedFriend";
import MessagesItemPlaceholder from "./items/MessagesItemPlaceholder";
import MessagesItemSuggestedFriendsHeader, { MESSAGES_ITEM_SUGGESTED_FRIENDS_HEADER_HEIGHT } from "./items/MessagesItemSuggestedFriendsHeader";
import MessagesItemHappeningNow, { getMessagesItemHappeningNowHeight } from "./items/MessagesItemHappeningNow";
import MessagesItemEmptyState, { MESSAGES_ITEM_EMPTY_STATE_HEIGHT } from "./items/MessagesItemEmptyState";
import MessagesItemAddFriendsWidget, { MESSAGES_ITEM_ADD_FRIENDS_WIDGET_HEIGHT } from "./items/MessagesItemAddFriendsWidget";
import FastestListItemType from "../../../../fastest_list/FastestListItemType";
import { FastestListPropsPlaceholderType } from "../../../../fastest_list/props/FastestListPropsPlaceholder";
import FastestList_android from "../../../../fastest_list/FastestList.android";
const useStyles = createStyles(() => ({
placeholder: {
backgroundColor: Module712.colors.BORDER_SUBTLE
}
}));
const r27 = Module19.memo(forwardRef(function MessagesFastestList(props, a1) {
const { accessibilityLabel, data, handleScrollAnimated, insetEnd, isRefreshEnabled, listItemHeight, listItemSizes, listItemSuggestedFriendHeight, listLeft, listRefHappeningNow, listTop, scrollIndicatorInsetBottom, scrollPosition } = props;
const styles = useStyles();
const { channels, channelFavorites, friendSuggestions, renderHeader, renderFooter, sections, setAddedFriendSuggestions } = data;
const ref = useRef(null);
useImperativeHandle(a1, () => ({
scrollToTop: function scrollToTop(animated = false) {
const current = ref.current;
if (current != null) {
current.scrollToLocation({
section: 0,
item: 0,
animated
});
}
}
}), []);
const callback = useCallback((a0, a1) => {
if (MessagesDataSections.FavoriteChannels === a0) {
return <MessagesItemChannelFast channelId={channelFavorites[a1].channelId} placeholderHeight={listItemHeight} row={a1} />;
}
if (MessagesDataSections.Channels === a0) {
return <MessagesItemChannelFast channelId={channels[a1].channelId} placeholderHeight={listItemHeight} row={a1} />;
}
if (MessagesDataSections.Separator === a0) {
return <MessagesItemSeparator />;
}
if (MessagesDataSections.SuggestedFriends === a0) {
return <MessagesItemSuggestedFriendFast height={listItemSuggestedFriendHeight} suggestedFriend={friendSuggestions[a1]} onAddFriendSuggestions={setAddedFriendSuggestions} />;
}
if (MessagesDataSections.Placeholders === a0) {
return <MessagesItemPlaceholder row={a1} height={listItemHeight} />;
}
throw new Error(`Invalid section ${a0} in Messages renderItem`);
}, [channelFavorites, listItemHeight, channels, friendSuggestions, setAddedFriendSuggestions, listItemSuggestedFriendHeight]);
const memo = useMemo(() => ({
getComponent: (a0, a1, a2) => a0 === MessagesDataSections.SuggestedFriends ? <MessagesItemSuggestedFriendsHeader scrollPosition={scrollPosition} stickyAt={a2} stickyTop={listTop} stickyLeft={listLeft} /> : null,
getSize: (a0) => a0 === MessagesDataSections.SuggestedFriends ? MESSAGES_ITEM_SUGGESTED_FRIENDS_HEADER_HEIGHT : 0
}), [listTop, listLeft, scrollPosition]);
const memo2 = useMemo(() => ({
getComponent: () => {
if (MessagesDataHeader.HappeningNow === renderHeader) {
return <MessagesItemHappeningNow listRef={listRefHappeningNow} />;
}
if (MessagesDataHeader.EmptyState === renderHeader) {
return <MessagesItemEmptyState />;
}
return null;
},
getSize: () => {
if (MessagesDataHeader.HappeningNow === renderHeader) {
return getMessagesItemHappeningNowHeight(isRefreshEnabled);
}
if (MessagesDataHeader.EmptyState === renderHeader) {
return MESSAGES_ITEM_EMPTY_STATE_HEIGHT;
}
return 0;
}
}), [renderHeader, isRefreshEnabled, listRefHappeningNow]);
const memo3 = useMemo(() => ({
getComponent: () => renderFooter ? <MessagesItemAddFriendsWidget /> : null,
getSize: () => renderFooter ? MESSAGES_ITEM_ADD_FRIENDS_WIDGET_HEIGHT : 0
}), [renderFooter]);
const callback2 = useCallback((a0) => {
if (MessagesDataSections.FavoriteChannels !== a0 && MessagesDataSections.Channels !== a0 && MessagesDataSections.Placeholders !== a0) {
if (MessagesDataSections.SuggestedFriends === a0) {
return listItemSuggestedFriendHeight;
}
if (MessagesDataSections.Separator === a0) {
return MESSAGES_ITEM_SEPERATOR_HEIGHT;
}
throw new Error(`Invalid section ${a0} in Messages renderItem`);
}
return listItemHeight;
}, [listItemHeight, listItemSuggestedFriendHeight]);
return <FastestList_android insetEnd={insetEnd} accessibilityLabel={accessibilityLabel} estimatedListSize="windowSize" keyExtractor={useCallback((a0, a1, a2) => {
if (FastestListItemType.SECTION_HEADER !== a0 && FastestListItemType.SECTION_FOOTER !== a0) {
if (FastestListItemType.ITEM === a0) {
if (MessagesDataSections.FavoriteChannels === a1) {
return channelFavorites[a2].channelId;
}
if (MessagesDataSections.Channels === a1) {
return channels[a2].channelId;
}
return void 0;
}
return void 0;
}
}, [channels, channelFavorites])} itemSize={callback2} listId="dm-messages-list" listFooterSize={memo3.getSize} listFooterAlwaysMounted listHeaderSize={memo2.getSize} listHeaderAlwaysMounted placeholderConfig={useMemo(() => ({
listHeader: {
type: FastestListPropsPlaceholderType.SHAPE,
colorHex: styles.placeholder.backgroundColor,
shape: "rect",
borderRadius: Module712.radii.lg,
paddingHorizontal: Module712.space.PX_8,
paddingVertical: Module712.space.PX_4
},
sectionItem: {
type: FastestListPropsPlaceholderType.FEED_ITEM,
colorHex: styles.placeholder.backgroundColor,
labelPadding: Module712.space.PX_4,
labelSize: listItemSizes.label,
labelSecondarySize: listItemSizes.labelSecondary,
padding: Module712.space.PX_16,
shape: "circle",
shapeSize: listItemSizes.avatar
}
}), [styles, listItemSizes])} ref={ref} renderItem={callback} renderListFooter={memo3.getComponent} renderListHeader={memo2.getComponent} renderSectionHeader={memo.getComponent} scrollIndicatorInsetEnd={scrollIndicatorInsetBottom} scrollReporting="animatedCallbacks" scrollHandlerAnimated={handleScrollAnimated} sections={sections} sectionHeaderSize={memo.getSize} />;
}));
export default r27;
@@ -0,0 +1,103 @@
// Metro module 15096 (f15097).
import * as Module19 from "react";
import { forwardRef, useRef, useImperativeHandle, useCallback, useMemo, useState } from "react";
import useMessagesFlatData from "./useMessagesFlatData";
import { MessagesItemChannelFlash } from "./items/MessagesItemChannel";
import MessagesItemSeparator from "./items/MessagesItemSeparator";
import MessagesItemSuggestedFriendsHeader from "./items/MessagesItemSuggestedFriendsHeader";
import { MessagesItemSuggestedFriendFlash } from "./items/MessagesItemSuggestedFriend";
import MessagesItemPlaceholder from "./items/MessagesItemPlaceholder";
import { MessagesDataHeader } from "./useMessagesData";
import MessagesItemHappeningNow from "./items/MessagesItemHappeningNow";
import MessagesItemEmptyState from "./items/MessagesItemEmptyState";
import MessagesItemAddFriendsWidget from "./items/MessagesItemAddFriendsWidget";
import { AnimatedFlashList } from "../../../../../_bundle/noop_6676";
const r24 = Module19.memo(forwardRef(function MessagesFlashList(props, a1) {
let state, setState;
const { accessibilityLabel, data, handleScrollAnimated, insetEnd, isRefreshEnabled, listItemHeight, listItemSuggestedFriendHeight, listLeft, listRefHappeningNow, listTop, scrollIndicatorInsetBottom, scrollPosition } = props;
state = void 0;
setState = void 0;
const { friendSuggestions, renderHeader, renderFooter, setAddedFriendSuggestions } = data;
const ref = useRef(null);
const messagesFlatData = useMessagesFlatData(data, {
listItemHeight,
isRefreshEnabled
});
const { listData, friendsHeaderIndex, friendsHeaderOffset, listHeaderHeight } = messagesFlatData;
useImperativeHandle(a1, () => ({
scrollToTop: function scrollToTop(animated = false) {
const current = ref.current;
if (current != null) {
current.scrollToOffset({
offset: listHeaderHeight,
animated
});
}
}
}), [listHeaderHeight]);
const callback = useCallback(({ item }) => {
const kind = item.kind;
if (kind !== "favorite" && kind !== "channel") {
if (kind === "separator") {
return <MessagesItemSeparator />;
}
if (kind === "friendsHeader") {
return <MessagesItemSuggestedFriendsHeader scrollPosition={scrollPosition} stickyAt={friendsHeaderOffset} stickyTop={listTop} stickyLeft={listLeft} />;
}
if (kind === "suggestedFriend") {
return <MessagesItemSuggestedFriendFlash height={listItemSuggestedFriendHeight} suggestedFriend={friendSuggestions[item.row]} onAddFriendSuggestions={setAddedFriendSuggestions} />;
}
if (kind === "placeholder") {
return <MessagesItemPlaceholder row={item.row} height={listItemHeight} />;
}
return void 0;
}
return <MessagesItemChannelFlash channelId={item.channelId} placeholderHeight={listItemHeight} row={item.row} />;
}, [listItemHeight, scrollPosition, friendsHeaderOffset, listTop, listLeft, listItemSuggestedFriendHeight, friendSuggestions, setAddedFriendSuggestions]);
const callback2 = useCallback((a0) => a0.kind, []);
const callback3 = useCallback((a0) => {
const kind = a0.kind;
if (kind === "favorite") {
return `fav:${a0.channelId}`;
}
if (kind === "channel") {
return `ch:${a0.channelId}`;
}
if (kind === "separator") {
return "separator";
}
if (kind === "friendsHeader") {
return "friendsHeader";
}
if (kind === "suggestedFriend") {
const r19 = friendSuggestions[a0.row];
let r21 = r19 == null ? void 0 : r19.user.id;
if (r21 == null) {
r21 = a0.row;
}
return `sf:${r21}`;
}
if (kind === "placeholder") {
return `placeholder:${a0.row}`;
}
}, [friendSuggestions]);
const memo = useMemo(() => {
if (MessagesDataHeader.HappeningNow === renderHeader) {
return <MessagesItemHappeningNow listRef={listRefHappeningNow} />;
}
if (MessagesDataHeader.EmptyState === renderHeader) {
return <MessagesItemEmptyState />;
}
return null;
}, [renderHeader, listRefHappeningNow]);
const memo2 = useMemo(() => renderFooter ? <MessagesItemAddFriendsWidget /> : null, [renderFooter]);
[state, setState] = useState(null);
const callback4 = useCallback(() => setState(listData), [listData]);
const memo3 = useMemo(() => state === listData ? friendsHeaderIndex != null ? [friendsHeaderIndex] : void 0 : void 0, [state, listData, friendsHeaderIndex]);
return <AnimatedFlashList ref={ref} accessibilityLabel={accessibilityLabel} contentContainerStyle={useMemo(() => ({
paddingBottom: insetEnd
}), [insetEnd])} data={listData} extraData={friendsHeaderOffset} getItemType={callback2} keyExtractor={callback3} ListFooterComponent={memo2} ListHeaderComponent={memo} onCommitLayoutEffect={callback4} onLoad={callback4} onScroll={handleScrollAnimated} renderItem={callback} scrollIndicatorInsets={useMemo(() => ({
bottom: scrollIndicatorInsetBottom
}), [scrollIndicatorInsetBottom])} stickyHeaderIndices={memo3} />;
}));
export default r24;
@@ -0,0 +1,142 @@
// Metro module 15024 (f15025).
import * as Module19 from "react";
import { useMemo, useCallback } from "react";
import { View, StyleSheet } from "react-native";
import { SearchTypes } from "../../../../../Constants";
import Module712 from "../../../../../_bundle/Module712";
import MobileVisualRefreshExperiment, { resolveRefreshToken } from "../../../../themes/experiments/MobileVisualRefreshExperiment";
import { scaleTextLineHeight } from "../../../../screen/native/useScaledTextLineHeight.android";
import { SMALL_BUTTON_HEIGHT } from "../../../../../design/components/Button/native/ButtonConstants.native";
import { createStyles } from "../../../../../design/components/Styles/native/createStyles";
import ReanimatedRexport, { useAnimatedStyle } from "../../../../reanimated/ReanimatedRexport";
import * as _spring from "../../../../../design/animation/reanimated/spring/spring";
import { MobileHomeDrawerExperiment } from "../../../../home_drawer/native/HomeDrawerExperiment";
import { getRootNavigationRef } from "../../../RootNavigationRef.native";
import SearchPlatformUtils from "../../../../search/native/SearchPlatformUtils";
import HeaderDebugOverlay_native from "../../../../devtools/design_toggles/HeaderDebugOverlay.native";
import { IconButton } from "../../../../../design/components/Button/native/IconButton.native";
import { PlusLargeIcon } from "../../../../../design/components/Icon/native/redesign/generated/PlusLargeIcon";
import { intl, t } from "../../../../../intl/index.native";
import { Text } from "../../../../../design/components/Text/native/Text";
import Module8295 from "../../../../../_bundle/Module8295";
import { MagnifyingGlassIcon } from "../../../../../design/components/Icon/native/redesign/generated/MagnifyingGlassIcon";
import MessageRequestsButton from "../../shared_components/MessageRequestsButton";
import { Button } from "../../../../../design/components/Button/native/Button.native";
import Module4128 from "../../../../../_bundle/Module4128";
import { UserPlusIcon } from "../../../../../design/components/Icon/native/redesign/generated/UserPlusIcon";
const PX_16 = Module712.space.PX_16;
const PX_8 = Module712.space.PX_8;
const useStyles = createStyles({
headerPanel: {
position: "relative",
padding: PX_16,
paddingBottom: Module712.modules.mobile.MESSAGES_HEADER_PADDING_BOTTOM
},
headerPanelTitle: {
paddingBottom: PX_8,
flexDirection: "row",
gap: Module712.space.PX_8,
justifyContent: "space-between"
},
headerPanelButtons: {
height: SMALL_BUTTON_HEIGHT,
gap: Module712.modules.mobile.MESSAGES_HEADER_BUTTON_GAP,
flexDirection: Module712.modules.mobile.MESSAGES_HEADER_BUTTON_LAYOUT,
alignItems: "center"
},
headerBorder: {
...StyleSheet.absoluteFillObject,
backgroundColor: Module712.colors.BORDER_SUBTLE,
top: void 0,
height: 1
}
});
const __initData = {
code: "function MessagesHeaderTsx1(){const{withSpring,scrollPosition}=this.__closure;return{opacity:withSpring(scrollPosition.get()>0?1:0)};}"
};
const r77 = Module19.memo(function MessagesHeader(props) {
const { height, scrollPosition } = props;
const styles = useStyles();
const r15 = MobileVisualRefreshExperiment("MessagesHeader");
const memo = useMemo(() => [styles.headerPanel, {
height
}], [styles, height]);
const c = function c() {
return {
opacity: _spring.withSpring(scrollPosition.get() > 0 ? 1 : 0)
};
};
c.__closure = {
withSpring: _spring.withSpring,
scrollPosition
};
c.__workletHash = 17233409273245;
c.__initData = __initData;
const animatedStyle = useAnimatedStyle(c);
const enableHome = MobileHomeDrawerExperiment.useConfig({
location: "messages-header"
}).enableHome;
const callback3 = useCallback(() => {
const rootNavigationRef = getRootNavigationRef();
if (rootNavigationRef != null) {
rootNavigationRef.navigate("message-requests");
}
}, []);
const callback = useCallback(() => {
const rootNavigationRef = getRootNavigationRef();
if (rootNavigationRef != null) {
rootNavigationRef.navigate("friends", {
screen: "add-friends",
params: {
sourcePage: "Messages Tab",
presentation: "card"
}
});
}
}, []);
const callback2 = useCallback(() => {
const rootNavigationRef = getRootNavigationRef();
if (rootNavigationRef != null) {
SearchPlatformUtils.navigateToSearchWithPrefetch(rootNavigationRef, {
type: SearchTypes.DMS
});
}
}, []);
const callback4 = useCallback(() => {
const rootNavigationRef = getRootNavigationRef();
if (rootNavigationRef != null) {
const current = rootNavigationRef.current;
if (current != null) {
current.navigate("friends", {
screen: "new-message",
params: {
sourcePage: "Messages Header"
}
});
}
}
}, []);
const r61 = HeaderDebugOverlay_native("bespoke");
const r83 = <IconButton variant="primary" icon={<PlusLargeIcon size="sm" color={Module712.colors.WHITE} />} size="sm" accessibilityLabel={intl.string(t.jD1qzM)} onPress={callback4} />;
return <View style={memo}>
<View style={styles.headerPanelTitle}>
<Text color="mobile-text-heading-primary" variant={r15 ? "heading-lg/semibold" : "redesign/heading-18/bold"} maxFontSizeMultiplier={1.75} accessibilityRole="header">
{enableHome ? intl.string(t.YUU0RF) : intl.string(t.OIgYlQ)}
</Text>
</View>
<View style={styles.headerPanelButtons}>
<IconButton onPress={callback2} variant="secondary" size="sm" icon={r15 ? Module8295 : <MagnifyingGlassIcon size="sm" />} accessibilityLabel={intl.string(t["5h0QOP"])} />
<MessageRequestsButton noMargin onPress={callback3} alternateVariant />
<Button variant="secondary" grow shrink size="sm" icon={r15 ? Module4128 : <UserPlusIcon size="sm" />} onPress={callback} maxFontSizeMultiplier={1} text={intl.string(t.zIJnA6)} />
{r83}
</View>
<ReanimatedRexport.View style={[styles.headerBorder, animatedStyle]} />
{r61}
</View>;
});
export default r77;
export function getMessagesHeaderHeight(a0, a1) {
const r9 = Math.min(a0, 1.75);
const r20 = resolveRefreshToken(Module712.modules.mobile.MESSAGES_HEADER_PADDING_BOTTOM, a1);
return scaleTextLineHeight("redesign/heading-18/bold", r9) + PX_8 + SMALL_BUTTON_HEIGHT + PX_16 + r20;
}
@@ -0,0 +1,113 @@
// Metro module 15050 (f15051).
import * as Module19 from "react";
import { forwardRef, useRef, useImperativeHandle, useCallback, useMemo } from "react";
import useMessagesFlatData from "./useMessagesFlatData";
import { MessagesItemChannelLegend } from "./items/MessagesItemChannel";
import MessagesItemSeparator, { MESSAGES_ITEM_SEPERATOR_HEIGHT } from "./items/MessagesItemSeparator";
import MessagesItemSuggestedFriendsHeader, { MESSAGES_ITEM_SUGGESTED_FRIENDS_HEADER_HEIGHT } from "./items/MessagesItemSuggestedFriendsHeader";
import { MessagesItemSuggestedFriendLegend } from "./items/MessagesItemSuggestedFriend";
import MessagesItemPlaceholder from "./items/MessagesItemPlaceholder";
import { MessagesDataHeader } from "./useMessagesData";
import MessagesItemHappeningNow from "./items/MessagesItemHappeningNow";
import MessagesItemEmptyState from "./items/MessagesItemEmptyState";
import MessagesItemAddFriendsWidget from "./items/MessagesItemAddFriendsWidget";
import { AnimatedLegendList } from "../../../../../_bundle/ReanimatedScrollOffsetTracker";
const r22 = Module19.memo(forwardRef(function MessagesLegendList(props, a1) {
const { accessibilityLabel, data, handleScrollAnimated, insetEnd, isRefreshEnabled, listItemHeight, listItemSuggestedFriendHeight, listLeft, listRefHappeningNow, listTop, recycleItems, scrollIndicatorInsetBottom, scrollPosition } = props;
const { friendSuggestions, renderHeader, renderFooter, setAddedFriendSuggestions } = data;
const ref = useRef(null);
const messagesFlatData = useMessagesFlatData(data, {
listItemHeight,
isRefreshEnabled
});
const { listData, friendsHeaderIndex, friendsHeaderOffset, listHeaderHeight } = messagesFlatData;
useImperativeHandle(a1, () => ({
scrollToTop: function scrollToTop(animated = false) {
const current = ref.current;
if (current != null) {
current.scrollToOffset({
offset: listHeaderHeight,
animated
});
}
}
}), [listHeaderHeight]);
const callback = useCallback(({ item }) => {
const kind = item.kind;
if (kind !== "favorite" && kind !== "channel") {
if (kind === "separator") {
return <MessagesItemSeparator />;
}
if (kind === "friendsHeader") {
return <MessagesItemSuggestedFriendsHeader scrollPosition={scrollPosition} stickyAt={friendsHeaderOffset} stickyTop={listTop} stickyLeft={listLeft} />;
}
if (kind === "suggestedFriend") {
return <MessagesItemSuggestedFriendLegend height={listItemSuggestedFriendHeight} suggestedFriend={friendSuggestions[item.row]} onAddFriendSuggestions={setAddedFriendSuggestions} />;
}
if (kind === "placeholder") {
return <MessagesItemPlaceholder row={item.row} height={listItemHeight} />;
}
return void 0;
}
return <MessagesItemChannelLegend channelId={item.channelId} placeholderHeight={listItemHeight} row={item.row} />;
}, [listItemHeight, scrollPosition, friendsHeaderOffset, listTop, listLeft, listItemSuggestedFriendHeight, friendSuggestions, setAddedFriendSuggestions]);
const callback2 = useCallback((a0) => a0.kind, []);
const callback3 = useCallback(({ kind }) => {
if (kind !== "favorite" && kind !== "channel" && kind !== "placeholder") {
if (kind === "separator") {
return MESSAGES_ITEM_SEPERATOR_HEIGHT;
}
if (kind === "friendsHeader") {
return MESSAGES_ITEM_SUGGESTED_FRIENDS_HEADER_HEIGHT;
}
if (kind === "suggestedFriend") {
return listItemSuggestedFriendHeight;
}
return void 0;
}
return listItemHeight;
}, [listItemHeight, listItemSuggestedFriendHeight]);
const callback4 = useCallback((a0) => {
const kind = a0.kind;
if (kind === "favorite") {
return `fav:${a0.channelId}`;
}
if (kind === "channel") {
return `ch:${a0.channelId}`;
}
if (kind === "separator") {
return "separator";
}
if (kind === "friendsHeader") {
return "friendsHeader";
}
if (kind === "suggestedFriend") {
const r19 = friendSuggestions[a0.row];
let r21 = r19 == null ? void 0 : r19.user.id;
if (r21 == null) {
r21 = a0.row;
}
return `sf:${r21}`;
}
if (kind === "placeholder") {
return `placeholder:${a0.row}`;
}
}, [friendSuggestions]);
const memo = useMemo(() => {
if (MessagesDataHeader.HappeningNow === renderHeader) {
return <MessagesItemHappeningNow listRef={listRefHappeningNow} />;
}
if (MessagesDataHeader.EmptyState === renderHeader) {
return <MessagesItemEmptyState />;
}
return null;
}, [renderHeader, listRefHappeningNow]);
const memo2 = useMemo(() => renderFooter ? <MessagesItemAddFriendsWidget /> : null, [renderFooter]);
const memo3 = useMemo(() => friendsHeaderIndex != null ? [friendsHeaderIndex] : void 0, [friendsHeaderIndex]);
return <AnimatedLegendList ref={ref} accessibilityLabel={accessibilityLabel} contentContainerStyle={useMemo(() => ({
paddingBottom: insetEnd
}), [insetEnd])} data={listData} estimatedHeaderSize={listHeaderHeight} estimatedItemSize={listItemHeight} getFixedItemSize={callback3} getItemType={callback2} keyExtractor={callback4} ListFooterComponent={memo2} ListHeaderComponent={memo} onScroll={handleScrollAnimated} recycleItems={recycleItems} renderItem={callback} scrollIndicatorInsets={useMemo(() => ({
bottom: scrollIndicatorInsetBottom
}), [scrollIndicatorInsetBottom])} stickyHeaderIndices={memo3} />;
}));
export default r22;
@@ -0,0 +1,25 @@
// Metro module 15044 (f15045).
import { createApexExperiment } from "../../../../experiments/apex/index";
const apexExperiment = createApexExperiment({
kind: "user",
name: "2026-06-messages-list-impl",
defaultConfig: {
list: "fastest",
recycleItems: false
},
variations: {
1: {
list: "flash",
recycleItems: false
},
2: {
list: "legend",
recycleItems: false
},
3: {
list: "legend",
recycleItems: true
}
}
});
export default apexExperiment;
@@ -0,0 +1,120 @@
// Metro module 15093 (f15094).
import { memo, useCallback } from "react";
import { View } from "react-native";
import { InstantInviteSources } from "../../../../../../Constants";
import IconActionButton, { ICON_ACTION_BUTTON_SIZE } from "../../../shared_components/IconActionButton";
import Module712 from "../../../../../../_bundle/Module712";
import { createStyles } from "../../../../../../design/components/Styles/native/createStyles";
import InstantInviteActionCreators from "../../../../../../actions/InstantInviteActionCreators";
import { presentError } from "../../../../../toast/native/ToastUtils";
import { intl, t } from "../../../../../../intl/index.native";
import { handleOpenShareSheet, handleCopy } from "../../../../../instant_invite/native/InstantInviteUtils";
import getInviteURL from "../../../../../instant_invite/getInviteURL";
import { getRootNavigationRef } from "../../../../RootNavigationRef.native";
import { PressableHighlight } from "../../../../../../design/void/Pressables/native/Pressables";
import { Text } from "../../../../../../design/components/Text/native/Text";
import Module12992 from "../../../../../../_bundle/Module12992";
import Module15094 from "../../../../../../_bundle/Module15094";
let useStyles, handleShare, handleLink;
const getFriendInviteCode = async function getFriendInviteCode() {
let r55;
let c27944_3 = 0;
let c30839_0;
try {
c30839_0 = void 0;
c27944_3 = 1;
c30839_0 = (await InstantInviteActionCreators.createFriendInvite(null, InstantInviteSources.ADD_FRIENDS_WIDGET)).code;
c27944_3 = 0;
r55 = c30839_0;
} catch ($e) {
let r8 = $e;
if (c27944_3 !== 0) {
while (true) {
try {
c27944_3 = 0;
presentError(intl.string(t.R0RpRX));
} catch ($e) {
r8 = $e;
if (c27944_3 === 0) {
break;
}
continue;
}
return void 0;
}
}
throw r8;
}
return r55;
};
handleShare = async function handleShare() {
let c27945_1;
c27945_1 = void 0;
let c30840_0 = await getFriendInviteCode();
handleOpenShareSheet(c30840_0, null, intl.formatToPlainString(t.PJf9P9, {
link: getInviteURL(c30840_0)
}), InstantInviteSources.ADD_FRIENDS_WIDGET);
};
handleLink = async function handleLink() {
let c27946_1;
c27946_1 = void 0;
let c30841_0 = await getFriendInviteCode();
handleCopy(c30841_0, null, InstantInviteSources.ADD_FRIENDS_WIDGET);
};
const height = ICON_ACTION_BUTTON_SIZE + Module712.space.PX_16;
useStyles = createStyles({
container: {
height,
paddingHorizontal: Module712.space.PX_8,
justifyContent: "space-between",
flexDirection: "row",
alignItems: "center"
},
title: {
flexDirection: "row",
alignItems: "center",
borderRadius: Module712.radii.md,
paddingHorizontal: Module712.space.PX_8,
paddingVertical: Module712.space.PX_12
},
actions: {
paddingHorizontal: Module712.space.PX_8,
flexDirection: "row",
justifyContent: "flex-end"
},
actionIcon: {
marginEnd: 0,
marginStart: Module712.space.PX_8
}
});
const r76 = memo(function MessagesItemAddFriendsWidget() {
const styles = useStyles();
const callback = useCallback(() => {
const rootNavigationRef = getRootNavigationRef();
if (rootNavigationRef != null) {
const current = rootNavigationRef.current;
if (current != null) {
current.navigate("friends", {
screen: "add-friends",
params: {
sourcePage: "Add Friends Widget",
presentation: "card"
}
});
}
}
}, []);
return <View style={styles.container} collapsable={false}>
<PressableHighlight accessibilityLabel={intl.string(t.afcl67)} accessibilityRole="button" onPress={callback} style={styles.title}>
<Text variant="text-md/semibold" color="text-default" lineClamp={1} maxFontSizeMultiplier={2}>
{intl.string(t.afcl67)}
</Text>
</PressableHighlight>
<View style={styles.actions}>
<IconActionButton style={styles.actionIcon} variant="filled" source={Module12992} onPress={handleShare} accessibilityLabel={intl.string(t.Ej3B3Y)} />
<IconActionButton style={styles.actionIcon} variant="filled" source={Module15094} onPress={handleLink} accessibilityLabel={intl.string(t.WqhZss)} />
</View>
</View>;
});
export default r76;
export { height as MESSAGES_ITEM_ADD_FRIENDS_WIDGET_HEIGHT };
@@ -0,0 +1,45 @@
// Metro module 15027 (f15028).
import _slicedToArray from "../../../../../../_bundle/_slicedToArray";
import { memo, useState, useCallback } from "react";
import ChannelStore from "../../../../../../stores/ChannelStore";
import { scaleTextLineHeight } from "../../../../../screen/native/useScaledTextLineHeight.android";
import Module712 from "../../../../../../_bundle/Module712";
import MessagesItemChannelBase, { MESSAGES_ITEM_CHANNEL_PRESSABLE_PADDING } from "./channel/MessagesItemChannelBase";
import { useStateFromStores } from "../../../../../../_bundle/Module589";
import MessagesItemPlaceholder from "./MessagesItemPlaceholder";
import { useRecyclingState } from "../../../../../../_bundle/noop_6676";
import * as _createAnimatedValue from "../../../../../../_bundle/createAnimatedValue";
const MessagesItemChannel = memo(function MessagesItemChannel(props) {
const { channelId, placeholderHeight, row, isPressed, setIsPressed } = props;
const stateFromStores = useStateFromStores([ChannelStore], () => ChannelStore.getChannel(channelId));
return (stateFromStores == null ? void 0 : stateFromStores.isPrivate()) === true ? <MessagesItemChannelBase channel={stateFromStores} height={placeholderHeight} isPressed={isPressed} setIsPressed={setIsPressed} /> : <MessagesItemPlaceholder height={placeholderHeight} row={row} />;
});
const r27 = memo(function(a0) {
const r13 = _slicedToArray(useState(false), 2);
return <MessagesItemChannel {...a0} isPressed={r13[0]} setIsPressed={r13[1]} />;
});
const r30 = memo(function(a0) {
const [isPressed, r10] = useRecyclingState(false, [a0.channelId]);
let c21538_0 = r10;
return <MessagesItemChannel {...a0} isPressed={isPressed} setIsPressed={useCallback((a0) => c21538_0(a0, true), [r10])} />;
});
const r33 = memo(function(a0) {
const r16 = _slicedToArray(_createAnimatedValue.useRecyclingState(false), 2);
return <MessagesItemChannel {...a0} isPressed={r16[0]} setIsPressed={r16[1]} />;
});
export function getMessagesItemChannelSizes(a0) {
const label = scaleTextLineHeight("redesign/channel-title/semibold", a0);
const labelSecondary = scaleTextLineHeight("text-xs/medium", a0);
const PX_16 = Module712.space.PX_16;
const PX_32 = Module712.space.PX_32;
return {
avatar: PX_32,
height: Math.max(PX_32, label + labelSecondary) + PX_16 + MESSAGES_ITEM_CHANNEL_PRESSABLE_PADDING,
label,
labelSecondary,
padding: PX_16
};
}
export { r27 as MessagesItemChannelFast };
export { r30 as MessagesItemChannelFlash };
export { r33 as MessagesItemChannelLegend };
@@ -0,0 +1,66 @@
// Metro module 15090 (f15091).
import { memo, useCallback } from "react";
import { Image as Image2, View } from "react-native";
import { createStyles } from "../../../../../../design/components/Styles/native/createStyles";
import Module712 from "../../../../../../_bundle/Module712";
import { getRootNavigationRef } from "../../../../RootNavigationRef.native";
import Module15049 from "../../../../../../_bundle/Module15049";
import { Heading, Text } from "../../../../../../design/components/Text/native/Text";
import { intl, t } from "../../../../../../intl/index.native";
import { Button } from "../../../../../../design/components/Button/native/Button.native";
const useStyles = createStyles({
container: {
padding: Module712.space.PX_16,
flex: 1,
height: 325
},
containerImage: {
marginBottom: Module712.space.PX_16,
flexShrink: 1,
flexGrow: 1
},
image: {
height: "100%",
width: "100%"
},
body: {
marginBottom: Module712.space.PX_16,
marginTop: Module712.space.PX_8,
textAlign: "center"
},
title: {
textAlign: "center"
}
});
const r52 = memo(function MessagesItemEmptyState() {
const styles = useStyles();
const callback = useCallback(() => {
const rootNavigationRef = getRootNavigationRef();
if (rootNavigationRef != null) {
const current = rootNavigationRef.current;
if (current != null) {
current.navigate("friends", {
screen: "add-friends",
params: {
sourcePage: "Messages Empty State",
presentation: "card"
}
});
}
}
}, []);
return <View style={styles.container} collapsable={false}>
<View style={styles.containerImage}>
<Image2 resizeMode="contain" source={Module15049} style={styles.image} />
</View>
<Heading color="mobile-text-heading-primary" variant="heading-lg/bold" style={styles.title} maxFontSizeMultiplier={2}>
{intl.string(t["8JZof8"])}
</Heading>
<Text color="text-default" variant="text-md/medium" style={styles.body} maxFontSizeMultiplier={2}>
{intl.string(t["qm+H7x"])}
</Text>
<Button text={intl.string(t.zIJnA6)} onPress={callback} size="lg" />
</View>;
});
export default r52;
export const MESSAGES_ITEM_EMPTY_STATE_HEIGHT = 325;
@@ -0,0 +1,30 @@
// Metro module 15052 (f15053).
import { memo } from "react";
import { View } from "react-native";
import { HAPPENING_NOW_CARD_HEIGHT, HappeningNowItem } from "../../../shared_components/happening_now/HappeningNowConstants";
import { resolveRefreshToken } from "../../../../../themes/experiments/MobileVisualRefreshExperiment";
import Module712 from "../../../../../../_bundle/Module712";
import { createStyles } from "../../../../../../design/components/Styles/native/createStyles";
import { useToken } from "../../../../../../design/tokens/native/useToken";
import { CutoutBackgroundProvider } from "../../../../../../design/components/Icon/native/CutoutBackgroundContext";
import HappeningNow from "../../../shared_components/happening_now/HappeningNow";
const cards = new Set([HappeningNowItem.LIVE_GUILD_STAGE, HappeningNowItem.VOICES, HappeningNowItem.EMBEDDED_ACTIVITY, HappeningNowItem.STREAMS, HappeningNowItem.ACTIVITIES, HappeningNowItem.USER_CUSTOM_STATUS, HappeningNowItem.USER]);
const useStyles = createStyles((a0) => ({
container: {
height: a0,
paddingStart: Module712.space.PX_8,
overflow: "hidden"
}
}));
const r48 = memo(function MessagesItemHappeningNow(props) {
const listRef = props.listRef;
return <CutoutBackgroundProvider backgroundColor={null}>
<View style={useStyles(HAPPENING_NOW_CARD_HEIGHT + useToken(Module712.modules.mobile.MESSAGES_ITEM_HAPPENING_NOW_PADDING_BOTTOM)).container} collapsable={false}>
<HappeningNow cards={cards} listRef={listRef} />
</View>
</CutoutBackgroundProvider>;
});
export default r48;
export function getMessagesItemHappeningNowHeight(a0) {
return resolveRefreshToken(Module712.modules.mobile.MESSAGES_ITEM_HAPPENING_NOW_PADDING_BOTTOM, a0) + HAPPENING_NOW_CARD_HEIGHT;
}
@@ -0,0 +1,7 @@
// Metro module 15037 (f15038).
import { memo } from "react";
import UserPlaceholderRow from "../../../shared_components/user_list/UserPlaceholderRow";
const r20 = memo(function MessagesItemPlaceholder(props) {
return <UserPlaceholderRow row={props.row} height={props.height} />;
});
export default r20;
@@ -0,0 +1,25 @@
// Metro module 15091 (f15092).
import { memo } from "react";
import { View, StyleSheet } from "react-native";
import Module712 from "../../../../../../_bundle/Module712";
import { createStyles } from "../../../../../../design/components/Styles/native/createStyles";
const PX_12 = Module712.space.PX_12;
const useStyles = createStyles({
container: {
height: PX_12
},
separator: {
backgroundColor: Module712.colors.BORDER_SUBTLE,
height: StyleSheet.hairlineWidth,
...StyleSheet.absoluteFillObject,
top: void 0
}
});
const r44 = memo(function MessagesItemSeperator() {
const styles = useStyles();
return <View style={styles.container} collapsable={false}>
<View style={styles.separator} />
</View>;
});
export default r44;
export { PX_12 as MESSAGES_ITEM_SEPERATOR_HEIGHT };
@@ -0,0 +1,119 @@
// Metro module 15039 (f15040).
import _slicedToArray from "../../../../../../_bundle/_slicedToArray";
import * as Module19 from "react";
import { useMemo, useCallback, useState } from "react";
import { View } from "react-native";
import RelationshipStore from "../../../../../../stores/RelationshipStore";
import { AnalyticEvents, RelationshipTypes } from "../../../../../../Constants";
import { createStyles } from "../../../../../../design/components/Styles/native/createStyles";
import Module712 from "../../../../../../_bundle/Module712";
import { scaleTextLineHeight } from "../../../../../screen/native/useScaledTextLineHeight.android";
import { useStateFromStores } from "../../../../../../_bundle/defaultAreStatesEqual";
import { intl, t } from "../../../../../../intl/index.native";
import UserUtils from "../../../../../../utils/UserUtils";
import { getSuggestedContactNameForSuggestion } from "../../../../../friend_suggestions/FriendSuggestionUtils";
import { addContactSuggestion } from "../../../friends/components/AddFriendsScreenUtils";
import AnalyticsUtils from "../../../../../../utils/AnalyticsUtils";
import { PressableHighlight } from "../../../../../../design/void/Pressables/native/Pressables";
import { Avatar, AvatarSizes } from "../../../../../../design/void/native";
import { Text } from "../../../../../../design/components/Text/native/Text";
import { Button } from "../../../../../../design/components/Button/native/Button.native";
import { SendMessageIcon } from "../../../../../../design/components/Icon/native/redesign/generated/SendMessageIcon";
import { useRecyclingState } from "../../../../../../_bundle/noop_6676";
import * as _createAnimatedValue from "../../../../../../_bundle/createAnimatedValue";
const useStyles = createStyles({
container: {
paddingHorizontal: Module712.space.PX_8
},
pressable: {
borderRadius: Module712.radii.md,
flexDirection: "row",
alignItems: "center",
padding: Module712.space.PX_8
},
textContainer: {
marginRight: Module712.space.PX_8,
flexDirection: "column",
alignSelf: "center",
overflow: "hidden",
flexGrow: 1,
flexShrink: 1
},
avatar: {
marginRight: Module712.space.PX_8
}
});
const MessagesItemSuggestedFriendView = Module19.memo(function MessagesItemSuggestedFriendView(props) {
const { height, onAddFriendSuggestions, suggestedFriend } = props;
let addedPressed = props.addedPressed;
const setAddedPressed = props.setAddedPressed;
const styles = useStyles();
const memo = useMemo(() => [styles.container, styles.pressable, {
height
}], [styles, height]);
const callback = useCallback(() => {
import("../../../../../user_profile/native/showUserProfileActionSheet").then((result) => (0, result.default)({
userId: suggestedFriend.user.id,
localUser: suggestedFriend.user,
location: "Messages Tab User Profile"
}));
}, [suggestedFriend]);
const stateFromStores = useStateFromStores([RelationshipStore], () => RelationshipStore.getRelationshipType(suggestedFriend.user.id) === RelationshipTypes.PENDING_OUTGOING);
if (!addedPressed) {
addedPressed = stateFromStores;
}
const memo2 = useMemo(() => {
const r8 = suggestedFriend.mutualFriendsCount != null && suggestedFriend.mutualFriendsCount > 0 ? intl.formatToPlainString(t.z7y34b, {
count: suggestedFriend.mutualFriendsCount
}) : UserUtils.getName(suggestedFriend.user);
const suggestionName = suggestedFriend.friendSuggestionName != null && suggestedFriend.friendSuggestionName.length > 0 ? suggestedFriend.friendSuggestionName : UserUtils.getName(suggestedFriend.user);
const suggestedContactNameForSuggestion = getSuggestedContactNameForSuggestion(suggestionName, suggestedFriend);
return {
userStatusLabel: `${r8}${suggestedContactNameForSuggestion != null ? ` · ${suggestedContactNameForSuggestion}` : ""}`,
suggestionName
};
}, [suggestedFriend]);
let userStatusLabel = memo2.userStatusLabel;
const suggestionName = memo2.suggestionName;
const callback2 = useCallback(() => {
const user = suggestedFriend.user;
addContactSuggestion(user);
AnalyticsUtils.track(AnalyticEvents.FRIEND_SUGGESTION_ADDED, {
suggested_user_id: user.id,
suggestion_source: suggestedFriend.source,
location: "Messages Tab"
});
onAddFriendSuggestions((a0) => [...a0, suggestedFriend]);
onAddFriendSuggestions((a0) => a0.filter((item) => item.user.id !== suggestedFriend.user.id));
setAddedPressed(true);
}, [suggestedFriend, onAddFriendSuggestions, setAddedPressed]);
const r57 = [<Avatar style={styles.avatar} user={suggestedFriend.user} guildId={void 0} size={AvatarSizes.REFRESH_MEDIUM_32} />, , ,];
const r66 = [<Text lineClamp={1} variant="redesign/channel-title/semibold" maxFontSizeMultiplier={2} color="text-default">{suggestionName}</Text>, ,];
if (addedPressed) {
userStatusLabel = intl.string(t.Kzyxm9);
}
r66[1] = <Text variant="text-xs/medium" color="text-default" lineClamp={1} maxFontSizeMultiplier={2}>{userStatusLabel}</Text>;
r57[1] = <View style={styles.textContainer}>{r66}</View>;
r57[2] = addedPressed ? <SendMessageIcon style={{
marginHorizontal: 8
}} /> : <Button variant="secondary" size="sm" text={intl.string(t.OYkgVk)} onPress={callback2} />;
return <PressableHighlight accessibilityRole="button" style={memo} onPress={callback} collapsable={false}>{r57}</PressableHighlight>;
});
const r64 = Module19.memo(function(a0) {
const r13 = _slicedToArray(useState(false), 2);
return <MessagesItemSuggestedFriendView {...a0} addedPressed={r13[0]} setAddedPressed={r13[1]} />;
});
const r67 = Module19.memo(function(a0) {
const r18 = _slicedToArray(useRecyclingState(false, [a0.suggestedFriend.user.id]), 2);
return <MessagesItemSuggestedFriendView {...a0} addedPressed={r18[0]} setAddedPressed={r18[1]} />;
});
const r70 = Module19.memo(function(a0) {
const r16 = _slicedToArray(_createAnimatedValue.useRecyclingState(false), 2);
return <MessagesItemSuggestedFriendView {...a0} addedPressed={r16[0]} setAddedPressed={r16[1]} />;
});
export function getMessagesItemSuggestedFriendHeight(a0) {
return scaleTextLineHeight("redesign/channel-title/semibold", a0) + scaleTextLineHeight("text-xs/medium", a0) + Module712.space.PX_16;
}
export { r64 as MessagesItemSuggestedFriendFast };
export { r67 as MessagesItemSuggestedFriendFlash };
export { r70 as MessagesItemSuggestedFriendLegend };
@@ -0,0 +1,56 @@
// Metro module 15092 (f15093).
import * as Module19 from "react";
import { useMemo } from "react";
import { View, StyleSheet } from "react-native";
import { TextStyleSheet, Text } from "../../../../../../design/components/Text/native/Text";
import Module712 from "../../../../../../_bundle/Module712";
import { createStyles } from "../../../../../../design/components/Styles/native/createStyles";
import { useDerivedValue } from "../../../../../reanimated/ReanimatedRexport";
import useStateFromSharedValue from "../../../../../reanimated/native/useStateFromSharedValue";
import ThemedGradient from "../../../../../client_themes/native/ThemedGradient";
import { intl, t } from "../../../../../../intl/index.native";
const height = TextStyleSheet["text-md/semibold"].lineHeight + Module712.space.PX_24;
const useStyles = createStyles({
headerContainer: {
height,
justifyContent: "center",
overflow: "hidden"
},
stickyOverlay: {
...StyleSheet.absoluteFillObject,
backgroundColor: Module712.colors.PANEL_BG
},
headerText: {
marginHorizontal: Module712.space.PX_16
}
});
const __initData = {
code: "function MessagesItemSuggestedFriendsHeaderTsx1(){const{stickyAt,scrollPosition}=this.__closure;return stickyAt!=null&&scrollPosition.get()>=stickyAt;}"
};
const r57 = Module19.memo(function MessagesItemSuggestedFriendsHeader(props) {
const { stickyAt, scrollPosition, stickyLeft, stickyTop } = props;
const styles = useStyles();
const x = () => stickyAt != null && scrollPosition.get() >= stickyAt;
x.__closure = {
stickyAt,
scrollPosition
};
x.__workletHash = 895751186732;
x.__initData = __initData;
const stateFromSharedValue = useStateFromSharedValue(useDerivedValue(x));
const memo = useMemo(() => ({
left: -stickyLeft,
top: -stickyTop
}), [stickyLeft, stickyTop]);
return <View style={styles.headerContainer} collapsable={false}>
{stateFromSharedValue ? <>
<ThemedGradient absolute wide componentStyles={memo} tall mix />
<View style={styles.stickyOverlay} />
</> : null}
<Text style={styles.headerText} maxFontSizeMultiplier={2} lineClamp={1} accessibilityRole="header" variant="text-md/semibold" color="text-default">
{intl.string(t["1uAmCw"])}
</Text>
</View>;
});
export default r57;
export { height as MESSAGES_ITEM_SUGGESTED_FRIENDS_HEADER_HEIGHT };
@@ -0,0 +1,64 @@
// Metro module 15031 (f15032).
import { memo } from "react";
import AccessibilityStore from "../../../../../../a11y/AccessibilityStore";
import AuthenticationStore from "../../../../../../../stores/AuthenticationStore";
import PresenceStore from "../../../../../../../stores/PresenceStore";
import TypingStore from "../../../../../../../stores/TypingStore";
import UserStore from "../../../../../../../stores/UserStore";
import { MUTED_OPACITY_CONTENT } from "../../../../../../channel_list_v2/native/RedesignChannelListConstants";
import { createStyles } from "../../../../../../../design/components/Styles/native/createStyles";
import Module712 from "../../../../../../../_bundle/Module712";
import { AvatarSizes, Avatar } from "../../../../../../../design/void/native";
import { useStateFromStores } from "../../../../../../../_bundle/Module589";
import GroupDMAvatar from "../../../../../../group_dm/native/GroupDMAvatar";
const useStyles = createStyles((a0) => ({
avatar: {
borderRadius: Module712.radii.round,
marginRight: Module712.modules.mobile.MESSAGES_ITEM_CHANNEL_AVATAR_MARGIN_END,
width: Module712.modules.mobile.MESSAGES_ITEM_CHANNEL_AVATAR_SIZE,
height: Module712.modules.mobile.MESSAGES_ITEM_CHANNEL_AVATAR_SIZE,
opacity: a0 ? MUTED_OPACITY_CONTENT : 1
}
}));
const r38 = memo(function MessagesItemChannelAvatar(props) {
const { channel, channelSelected, hasUnreadMessages, isStreaming } = props;
let muted = props.muted;
const { ignored, blocked, status } = props;
if (!muted) {
muted = ignored;
}
if (!muted) {
muted = blocked;
}
if (muted) {
muted = !channelSelected;
}
const styles = useStyles(muted);
const REFRESH_MEDIUM_32 = AvatarSizes.REFRESH_MEDIUM_32;
const id = AuthenticationStore.getId();
const stateFromStores = useStateFromStores([TypingStore], () => {
const typingUsers = TypingStore.getTypingUsers(channel.id);
for (const key in typingUsers) {
if (key !== id) {
return true;
}
}
return false;
});
const stateFromStores3 = useStateFromStores([AccessibilityStore], () => {
let r4 = !AccessibilityStore.useReducedMotion;
if (!AccessibilityStore.useReducedMotion) {
let r5 = stateFromStores;
if (!stateFromStores) {
r5 = hasUnreadMessages;
}
r4 = r5;
}
return r4;
});
const stateFromStores2 = useStateFromStores([UserStore], () => UserStore.getUser(channel.isDM() === true ? channel.getRecipientId() : void 0));
const stateFromStores4 = useStateFromStores([PresenceStore], () => !!channel.isDM() && PresenceStore.isMobileOnline(channel.getRecipientId()));
const stateFromStores5 = useStateFromStores([PresenceStore], () => !!channel.isDM() && PresenceStore.isVROnline(channel.getRecipientId()));
return channel.isGroupDM() ? <GroupDMAvatar status={status} size={REFRESH_MEDIUM_32} channel={channel} animate={stateFromStores3} style={styles.avatar} /> : stateFromStores2 != null ? <Avatar user={stateFromStores2} avatarDecoration={stateFromStores2.avatarDecoration} guildId={void 0} isMobileOnline={stateFromStores4} isVROnline={stateFromStores5} status={stateFromStores2.isSystemUser() ? null : status} streaming={isStreaming} style={styles.avatar} size={REFRESH_MEDIUM_32} animate={stateFromStores3} typing={stateFromStores} autoStatusCutout /> : null;
});
export default r38;
@@ -0,0 +1,146 @@
// Metro module 15028 (f15029).
import * as Module19 from "react";
import { useMemo, useCallback } from "react";
import { View } from "react-native";
import PresenceStore from "../../../../../../../stores/PresenceStore";
import ReadStateStore from "../../../../../../../stores/ReadStateStore";
import RelationshipStore from "../../../../../../../stores/RelationshipStore";
import SelectedChannelStore from "../../../../../../../stores/SelectedChannelStore";
import UserGuildSettingsStore from "../../../../../../../stores/UserGuildSettingsStore";
import UserStore from "../../../../../../../stores/UserStore";
import { ActivityTypes } from "../../../../../../../Constants";
import { createStyles } from "../../../../../../../design/components/Styles/native/createStyles";
import Module712 from "../../../../../../../_bundle/Module712";
import { useStateFromStores, useStateFromStoresObject } from "../../../../../../../_bundle/Module589";
import MobileVisualRefreshExperiment from "../../../../../../themes/experiments/MobileVisualRefreshExperiment";
import useCallA11yState from "../../../../../../calls/useCallA11yState";
import { useNameplate } from "../../../../../../collectibles/nameplates/hooks/useNameplate";
import { isIOS } from "../../../../../../../utils/PlatformUtils";
import ChannelActionCreators from "../../../../../../../actions/ChannelActionCreators";
import { transitionToChannel } from "../../../../../../routing/transitionToChannel";
import { openChannelLongPressActionSheet } from "../../../../../../channel/native/openChannelLongPressActionSheet";
import { PressableHighlight } from "../../../../../../../design/void/Pressables/native/Pressables";
import getChannelA11yLabel, { getChannelA11yHint } from "../../../../../../channel/getChannelA11yLabel";
import Nameplate from "../../../../../../collectibles/nameplates/native/Nameplate";
import ChannelUnreadBadge from "../../../../shared_components/guild_channels/ChannelUnreadBadge";
import { ChannelListLayoutTypes } from "../../../../../ChannelListLayoutTypes";
import { CutoutBackgroundProvider } from "../../../../../../../design/components/Icon/native/CutoutBackgroundContext";
import MessagesItemChannelAvatar from "./MessagesItemChannelAvatar";
import isStreaming from "../../../../../../activities/utils/isStreaming";
import MessagesItemChannelContent from "./MessagesItemChannelContent";
const useStyles = createStyles((a0) => ({
pressable: {
marginBottom: 1,
borderRadius: Module712.radii.md,
marginHorizontal: Module712.space.PX_8,
paddingHorizontal: Module712.space.PX_8,
paddingVertical: a0 ? 0 : Module712.space.PX_8,
marginVertical: a0 ? Module712.space.PX_4 : void 0,
flexDirection: "row",
alignItems: "center",
flex: 1
},
nameplate: {
borderRadius: Module712.radii.md
},
rowActive: {
backgroundColor: Module712.colors.INTERACTIVE_BACKGROUND_ACTIVE
},
selectedBorder: {
position: "absolute",
top: 0,
bottom: 0,
left: 0,
right: 0,
borderWidth: 1,
borderColor: Module712.colors.BORDER_MUTED,
borderRadius: Module712.radii.md
},
rowSelected: {
borderRadius: Module712.radii.md,
backgroundColor: Module712.colors.BACKGROUND_MOD_MUTED
}
}));
const r45 = Module19.memo(function MessagesItemChannelBase(props) {
let styles, isPressed2;
const { channel, height, isPressed, setIsPressed } = props;
styles = void 0;
isPressed2 = void 0;
const stateFromStores = useStateFromStores([SelectedChannelStore], () => SelectedChannelStore.getChannelId(null) === channel?.id);
styles = useStyles(MobileVisualRefreshExperiment("MessagesItemChannelBase"));
const memo2 = useMemo(() => ({
height,
overflow: "hidden"
}), [height]);
const memo = useMemo(() => [styles.pressable, stateFromStores ? styles.rowSelected : void 0], [styles, stateFromStores]);
const stateFromStoresObject = useStateFromStoresObject([PresenceStore], () => {
const activities = channel.isDM() ? PresenceStore.getActivities(channel.getRecipientId()) : void 0;
return channel.isDM() ? {
status: PresenceStore.getStatus(channel.getRecipientId()),
activities
} : {
status: void 0,
activities: void 0
};
});
const { status, activities } = stateFromStoresObject;
const stateFromStoresObject2 = useStateFromStoresObject([ReadStateStore], () => {
const mentionCount = ReadStateStore.getMentionCount(channel.id);
return {
mentionCount,
hasUnreadMessages: mentionCount > 0 || channel.getGuildId() != null && ReadStateStore.hasUnread(channel.id)
};
});
const { mentionCount, hasUnreadMessages } = stateFromStoresObject2;
const callA11yState = useCallA11yState(channel.id);
const { isIncomingCall, isOngoingCall } = callA11yState;
const stateFromStoresObject3 = useStateFromStoresObject([UserGuildSettingsStore], () => ({
resolvedUnreadSetting: UserGuildSettingsStore.resolveUnreadSetting(channel),
muted: UserGuildSettingsStore.isChannelMuted(channel.getGuildId(), channel.id),
favorite: UserGuildSettingsStore.isMessagesFavorite(channel.id)
}));
const { resolvedUnreadSetting, muted, favorite } = stateFromStoresObject3;
const stateFromStoresObject4 = useStateFromStoresObject([RelationshipStore], () => ({
ignored: !!channel.isDM() && RelationshipStore.isIgnored(channel.getRecipientId()),
blocked: !!channel.isDM() && RelationshipStore.isBlocked(channel.getRecipientId())
}));
const { ignored, blocked } = stateFromStoresObject4;
const nameplate = useNameplate({
user: useStateFromStores([UserStore], () => UserStore.getUser(channel.isDM() === true ? channel.getRecipientId() : void 0))
});
isPressed2 = nameplate != null && (stateFromStores ? stateFromStores : isPressed);
const memo3 = useMemo(() => isIOS() ? isPressed2 ? null : isPressed ? styles.rowActive.backgroundColor : stateFromStores ? styles.rowSelected.backgroundColor : void 0 : null, [stateFromStores, isPressed2, isPressed, styles]);
return <View style={memo2} collapsable={false}>
<PressableHighlight onPressIn={useCallback(() => {
ChannelActionCreators.preload(channel.guild_id, channel.id);
setIsPressed(true);
}, [channel.guild_id, channel.id, setIsPressed])} onPressOut={useCallback(() => {
setIsPressed(false);
}, [setIsPressed])} onPress={useCallback(() => {
transitionToChannel(channel.id);
}, [channel.id])} onLongPress={useCallback(() => {
openChannelLongPressActionSheet(channel.id);
}, [channel.id])} accessibilityRole="button" accessibilityLabel={getChannelA11yLabel({
channel,
unread: hasUnreadMessages,
mentionCount,
isIncomingCall,
isOngoingCall
})} accessibilityHint={getChannelA11yHint({
channel,
muted,
userStatus: status,
isFavorite: favorite
})} underlayColor={styles.rowActive.backgroundColor} style={memo}>
<Nameplate nameplate={isPressed2 ? nameplate : void 0} isFocused={stateFromStores} isPressed={isPressed} isMuted={muted || ignored || blocked} fadeIn={isPressed} style={styles.nameplate} />
{stateFromStores ? <View style={styles.selectedBorder} pointerEvents="none" /> : stateFromStores}
<ChannelUnreadBadge unread={hasUnreadMessages} resolvedUnreadSetting={resolvedUnreadSetting} muted={muted} layout={ChannelListLayoutTypes.COZY_DRAWER_SMOL} panelVariant />
<CutoutBackgroundProvider backgroundColor={memo3}>
<MessagesItemChannelAvatar channel={channel} channelSelected={stateFromStores} hasUnreadMessages={hasUnreadMessages} muted={muted} ignored={ignored} blocked={blocked} isStreaming={isStreaming(activities)} status={status} />
</CutoutBackgroundProvider>
<MessagesItemChannelContent channel={channel} channelSelected={stateFromStores} favorite={favorite} muted={muted} ignored={ignored} blocked={blocked} hasActivity={(activities == null ? void 0 : activities.some((activity) => activity.type !== ActivityTypes.CUSTOM_STATUS)) === true} hasUnreadMessages={hasUnreadMessages} resolvedUnreadSetting={resolvedUnreadSetting} hasNameplate={isPressed2} />
</PressableHighlight>
</View>;
});
export default r45;
export const MESSAGES_ITEM_CHANNEL_PRESSABLE_PADDING = 1;
@@ -0,0 +1,205 @@
// Metro module 15032 (f15033).
import { memo } from "react";
import { View } from "react-native";
import ReadStateStore from "../../../../../../../stores/ReadStateStore";
import { SUBTITLE_OPACITY_NORMAL } from "../../../../../../channel_list_v2/native/RedesignChannelListConstants";
import { UnreadSetting } from "../../../../../../read_states/ReadStateConstants";
import { createStyles } from "../../../../../../../design/components/Styles/native/createStyles";
import Module712 from "../../../../../../../_bundle/Module712";
import { Icon } from "../../../../../../../design/void/native";
import Module8363 from "../../../../../../../_bundle/Module8363";
import Module8364 from "../../../../../../../_bundle/Module8364";
import Module10308 from "../../../../../../../_bundle/Module10308";
import Module9980 from "../../../../../../../_bundle/Module9980";
import * as _themes from "../../../../../../../design/utils/shared/themes";
import useTheme from "../../../../../../../hooks/useTheme";
import MobileVisualRefreshExperiment from "../../../../../../themes/experiments/MobileVisualRefreshExperiment";
import { useStateFromStores } from "../../../../../../../_bundle/Module589";
import useMessagePreviews from "../../../../../useMessagePreviews";
import Module3771 from "../../../../../../../_bundle/Module3771";
import isChangelogChannel from "../../../../../../changelog/utils/isChangelogChannel";
import { useRelativeTimestamp } from "../../../../../../notification_center/useRelativeTimestamp";
import SnowflakeUtils from "../../../../../../../utils/SnowflakeUtils";
import useChannelName from "../../../../../../channel/useChannelName";
import usePrivateChannelWave_native from "../../../../../../channel/usePrivateChannelWave.native";
import { useToken } from "../../../../../../../design/tokens/native/useToken";
import UsernameWithEffects from "../../../../../../display_name_styles/native/UsernameWithEffects";
import { EffectDisplayType } from "../../../../../../display_name_styles/types";
import { Text } from "../../../../../../../design/components/Text/native/Text";
import GuildTag from "../../../../../../guild_tag/native/GuildTag";
import BotTag from "../../../../../../applications/native/BotTag";
import { ChannelRowPreview } from "../../../../shared_components/ChannelRowPreview";
import { ChannelListLayoutTypes } from "../../../../../ChannelListLayoutTypes";
import ActivityStatus from "../../../../../../activity_status/native/ActivityStatus";
import { intl, t } from "../../../../../../../intl/index.native";
import MessagesItemChannelWave from "./MessagesItemChannelWave";
let useStyles, useStyles2, useStyles3;
const MessagesItemChannelContentIcon = function MessagesItemChannelContentIcon(props) {
const { muted, favorite, ignored, blocked } = props;
const styles3 = useStyles3(props.selected);
return blocked ? <Icon source={Module8363} size={Icon.Sizes.EXTRA_SMALL} style={[styles3.channelIcon, styles3.channelMutedIcon]} /> : ignored ? <Icon source={Module8364} size={Icon.Sizes.EXTRA_SMALL} style={[styles3.channelIcon, styles3.channelIgnoredIcon]} /> : muted ? <Icon source={Module10308} size={Icon.Sizes.EXTRA_SMALL} style={[styles3.channelIcon, styles3.channelMutedIcon]} /> : favorite ? <Icon source={Module9980} size={Icon.Sizes.EXTRA_SMALL} style={[styles3.channelIcon, styles3.channelFavoriteIcon]} /> : null;
};
useStyles = createStyles({
content: {
flex: 1
},
channelIcon: {
alignSelf: "center"
},
channelNameAndAccessories: {
flexDirection: "row",
alignItems: "center",
width: "100%"
},
channelIcons: {
flexDirection: "row",
alignItems: "center"
},
channelAccessoriesContainer: {
flexDirection: "row",
justifyContent: "flex-end",
marginLeft: Module712.space.PX_4
},
channelAccessories: {
flexDirection: "row",
justifyContent: "flex-end",
alignItems: "center",
borderRadius: Module712.radii.xs,
paddingHorizontal: Module712.space.PX_4,
paddingVertical: 1
},
channelNameAndBadge: {
flexDirection: "row",
alignItems: "center",
gap: Module712.space.PX_4,
flex: 1,
minWidth: 0
},
botTag: {
marginRight: Module712.space.PX_4
},
contentPadded: {
paddingRight: Module712.space.PX_40
}
});
useStyles2 = createStyles((a0, a1, a2, a3, a4) => {
let TEXT_MUTED;
L7: {
if (a2) {
TEXT_MUTED = Module712.colors.TEXT_MUTED;
} else {
if (!a0 && !a1) {
TEXT_MUTED = Module712.colors.MESSAGES_ITEM_CHANNEL_TEXT_DEFAULT;
break L7;
}
TEXT_MUTED = Module712.colors.MOBILE_TEXT_HEADING_PRIMARY;
}
}
return {
channelText: {
color: TEXT_MUTED
},
channelName: {
flexShrink: 1
},
timestamp: {
opacity: a4 ? void 0 : a2 ? void 0 : a3 ? void 0 : SUBTITLE_OPACITY_NORMAL,
...a4 ? {
color: Module712.colors.TEXT_SUBTLE
} : {}
}
};
});
useStyles3 = createStyles((a0) => ({
channelIcon: {
marginRight: Module712.space.PX_4
},
channelMutedIcon: {
tintColor: a0 ? Module712.colors.ICON_SUBTLE : Module712.colors.ICON_MUTED
},
channelFavoriteIcon: {
tintColor: a0 ? Module712.colors.ICON_SUBTLE : Module712.colors.ICON_MUTED
},
channelIgnoredIcon: {
tintColor: a0 ? Module712.colors.ICON_SUBTLE : Module712.colors.ICON_MUTED
}
}));
const r82 = memo(function MessagesItemChannelContent(props) {
let r218;
const { channel, channelSelected, favorite, muted, ignored, blocked, hasActivity, hasUnreadMessages, resolvedUnreadSetting, hasNameplate } = props;
const isThemeLight = _themes.isThemeLight(useTheme());
const r53 = MobileVisualRefreshExperiment("MessagesItemChannelContent");
const r24 = hasUnreadMessages ? resolvedUnreadSetting === UnreadSetting.ALL_MESSAGES : hasUnreadMessages;
const r56 = (muted || ignored || blocked) && !channelSelected;
const styles = useStyles();
const styles2 = useStyles2(channelSelected, r24, r56, hasNameplate, r53);
const stateFromStores = useStateFromStores([ReadStateStore], () => ReadStateStore.lastMessageId(channel.id));
const messagePreviews = useMessagePreviews(channel, {
unread: hasUnreadMessages
});
let r17 = messagePreviews != null;
if (r17) {
r17 = Module3771().diff(messagePreviews.timestamp, "hours") < 1 || !hasActivity || hasUnreadMessages;
}
if (r17) {
r17 = !isChangelogChannel(channel.id);
}
let r87 = stateFromStores;
if (r87 == null) {
r87 = channel.id;
}
const relativeTimestamp = useRelativeTimestamp({
timestamp: SnowflakeUtils.extractTimestamp(r87)
});
const r30 = channel.isPrivate() && !channel.isMultiUserDM() && channel.recipients != null && channel.recipients.length > 0;
const channelName = useChannelName(channel);
const privateChannelWave_native = usePrivateChannelWave_native(channel, stateFromStores);
const { waveShouldShow, wavePressed } = privateChannelWave_native;
const props2 = {
variant: useToken(Module712.modules.mobile.MESSAGES_ITEM_CHANNEL_NAME_TEXT_STYLE),
style: [styles2.channelText, styles2.channelName],
lineClamp: 1,
ellipsizeMode: "tail"
};
const r166 = [<View style={styles.channelNameAndBadge}>
{channel.isDM() && (channel.recipients != null && channel.recipients.length > 0) ? <UsernameWithEffects userId={channel.recipients[0]} userName={channelName} effectDisplayType={channelSelected ? EffectDisplayType.STATIC : EffectDisplayType.PLAIN} {...props2} /> : <Text {...props2}>{channelName}</Text>}
{r30 ? <GuildTag userId={channel.recipients[0]} disabledTooltip /> : null}
{channel.isSystemDM() ? <BotTag style={styles.botTag} type={BotTag.Types.SYSTEM_DM} verified /> : null}
</View>, <View style={[styles.channelAccessoriesContainer, {
minWidth: hasNameplate ? waveShouldShow ? 0 : 40 : 0
}]}>
<View style={[styles.channelAccessories, waveShouldShow ? {
paddingVertical: 0
} : void 0, hasNameplate ? {
backgroundColor: isThemeLight ? `rgba(255, 255, 255, ${channelSelected ? 0.6 : 0.3})` : `rgba(0, 0, 0, ${channelSelected ? 0.7 : 0.25})`
} : void 0]}>
<View style={styles.channelIcons}>
<MessagesItemChannelContentIcon muted={muted} favorite={favorite} ignored={ignored} blocked={blocked} selected={channelSelected} />
</View>
{waveShouldShow ? !waveShouldShow : <Text style={[styles2.channelText, styles2.timestamp]} variant="text-xs/medium" lineClamp={1}>{relativeTimestamp}</Text>}
</View>
</View>];
const r209 = [<View style={styles.channelNameAndAccessories}>{r166}</View>, ,];
const style = hasNameplate ? waveShouldShow ? void 0 : styles.contentPadded : void 0;
if (r17) {
let r244 = "text-muted";
let color = "text-muted";
if (!r56) {
if (!(!channelSelected && !r24)) {
r244 = "mobile-text-heading-primary";
}
color = r244;
}
r218 = <ChannelRowPreview message={messagePreviews} channel={channel} color={color} layout={ChannelListLayoutTypes.COZY_DRAWER_SMOL} muted={muted} />;
} else {
r218 = channel.isDM() ? <ActivityStatus textStyle={styles2.channelText} userId={channel.getRecipientId()} guildId={channel?.guild_id} /> : isChangelogChannel(channel.id) ? <Text variant="text-xs/medium" style={styles2.channelText} lineClamp={1}>
{intl.string(t.FL5T01)}
</Text> : null;
}
r209[1] = <View style={style}>{r218}</View>;
return <>
<View style={styles.content}>{r209}</View>
{waveShouldShow ? <MessagesItemChannelWave wavePressed={wavePressed} hasNameplate={hasNameplate} /> : null}
</>;
});
export default r82;
@@ -0,0 +1,12 @@
// Metro module 15036 (f15037).
import { memo } from "react";
import { Button } from "../../../../../../../design/components/Button/native/Button.native";
import { intl, t } from "../../../../../../../intl/index.native";
import { Text } from "../../../../../../../design/components/Text/native/Text";
const r19 = memo(function MessagesItemChannelWave(props) {
const { wavePressed, hasNameplate = false } = props;
return <Button text={intl.string(t.n8nU4W)} icon={<Text style={{
marginTop: 3
}} variant="text-sm/semibold" aria-hidden>👋</Text>} variant={hasNameplate ? "secondary-overlay" : "secondary"} size="sm" onPress={wavePressed} />;
});
export default r19;
@@ -0,0 +1,107 @@
// Metro module 15042 (f15043).
import { useRef, useMemo } from "react";
import GatewayConnectionStore from "../../../../gateway/GatewayConnectionStore";
import AuthenticationStore from "../../../../../stores/AuthenticationStore";
import RelationshipStore from "../../../../../stores/RelationshipStore";
import PrivateChannelSortStore from "../../../../../stores/views/PrivateChannelSortStore";
import { useStateFromStoresObject, useStateFromStoresArray, useStateFromStores } from "../../../../../_bundle/Module589";
import useSuggestedFriends from "../../friends/components/useSuggestedFriends";
import { HappeningNowCardsDisabled } from "../../../../user_settings/UserSettings";
const r28 = {
FavoriteChannels: 0,
0: "FavoriteChannels",
Channels: 1,
1: "Channels",
Separator: 2,
2: "Separator",
SuggestedFriends: 3,
3: "SuggestedFriends",
Placeholders: 4,
4: "Placeholders"
};
let c10655_9 = {
HappeningNow: 0,
0: "HappeningNow",
EmptyState: 1,
1: "EmptyState"
};
export default function useMessagesData() {
let connected, connectedToGateway, setAdded, friendSuggestions, numFriendSuggestions, setting, stateFromStores, ref;
const stateFromStoresObject = useStateFromStoresObject([AuthenticationStore, GatewayConnectionStore], () => ({
connected: AuthenticationStore.getSessionId() != null,
connectedToGateway: GatewayConnectionStore.isConnected()
}));
connected = stateFromStoresObject.connected;
connectedToGateway = stateFromStoresObject.connectedToGateway;
const [channelFavorites, channels] = useStateFromStoresArray([PrivateChannelSortStore], () => PrivateChannelSortStore.getSortedChannels());
const suggestedFriends = useSuggestedFriends({
location: "Messages Tab",
isConnected: connected ? connectedToGateway : connected
});
setAdded = suggestedFriends.setAdded;
friendSuggestions = suggestedFriends.friendSuggestions;
numFriendSuggestions = suggestedFriends.numFriendSuggestions;
setting = HappeningNowCardsDisabled.useSetting();
stateFromStores = useStateFromStores([RelationshipStore], () => RelationshipStore.getFriendCount());
ref = useRef(-1);
return useMemo(() => {
let r3, r4, r27;
if (ref.current === -1) {
ref.current = 0;
} else {
let r15 = connected;
if (connected) {
r15 = connectedToGateway;
}
if (r15) {
ref.current = ref.current + 1;
}
}
L14: {
L10: {
r3 = channelFavorites.length + channels.length > 0;
r4 = numFriendSuggestions > 0;
if (r4) {
if (connected && connectedToGateway) {
break L10;
}
r27 = Math.min(numFriendSuggestions, 5);
break L14;
}
}
r27 = r3 ? 0 : connected ? 0 : 15;
}
const sections = [];
sections.push(channelFavorites.length);
sections.push(channels.length);
sections.push(r4 ? 1 : 0);
sections.push(r4 ? connected ? connectedToGateway ? friendSuggestions.length : 0 : 0 : 0);
sections.push(r27);
const renderHeader = r3 ? setting ? null : c10655_9.HappeningNow : r4 ? c10655_9.EmptyState : null;
const dataKey = ref.current > 0 ? `${ref.current}` : null;
const showFullscreenEmptyState = (r3 ? !r3 : connected) && !r4;
let renderFooter = connected;
if (connected) {
renderFooter = stateFromStores < 4;
}
if (renderFooter) {
renderFooter = r3;
}
if (!renderFooter) {
renderFooter = r4;
}
return {
channels,
channelFavorites,
dataKey,
showFullscreenEmptyState,
setAddedFriendSuggestions: setAdded,
friendSuggestions,
renderHeader,
renderFooter,
sections
};
}, [connected, connectedToGateway, channelFavorites, channels, numFriendSuggestions, friendSuggestions, setting, stateFromStores, setAdded]);
};
export { r28 as MessagesDataSections };
export { c10655_9 as MessagesDataHeader };
@@ -0,0 +1,97 @@
// Metro module 15051 (f15052).
import { useMemo } from "react";
import { MessagesDataHeader, MessagesDataSections } from "./useMessagesData";
import { getMessagesItemHappeningNowHeight } from "./items/MessagesItemHappeningNow";
import { MESSAGES_ITEM_EMPTY_STATE_HEIGHT } from "./items/MessagesItemEmptyState";
import { MESSAGES_ITEM_SEPERATOR_HEIGHT } from "./items/MessagesItemSeparator";
export default function useMessagesFlatData({ channels, channelFavorites, renderHeader, sections }, { listItemHeight, isRefreshEnabled }) {
return useMemo(() => {
const listHeaderHeight = renderHeader === MessagesDataHeader.HappeningNow ? getMessagesItemHappeningNowHeight(isRefreshEnabled) : renderHeader === MessagesDataHeader.EmptyState ? MESSAGES_ITEM_EMPTY_STATE_HEIGHT : 0;
const listData = [];
const r35 = sections[MessagesDataSections.FavoriteChannels];
const r5 = 0 < r35;
let row = 0;
let r36 = listHeaderHeight;
let r37 = r36;
if (r5) {
do {
listData.push({
kind: "favorite",
channelId: channelFavorites[row].channelId,
row
});
r36 = r36 + listItemHeight;
row = row + 1;
r37 = r36;
} while (row < r35);
}
const r50 = sections[MessagesDataSections.Channels];
const r51 = 0 < r50;
let r52 = r37;
let row2 = 0;
let r54 = r52;
if (r51) {
do {
listData.push({
kind: "channel",
channelId: channels[row2].channelId,
row: row2
});
r52 = r52 + listItemHeight;
row2 = row2 + 1;
r54 = r52;
} while (row2 < r50);
}
const r69 = sections[MessagesDataSections.Separator];
let r70 = r54;
if (r69 > 0) {
listData.push({
kind: "separator"
});
r70 = r54 + MESSAGES_ITEM_SEPERATOR_HEIGHT;
}
const r80 = sections[MessagesDataSections.SuggestedFriends];
const r81 = r80 > 0;
let friendsHeaderOffset = void 0;
let friendsHeaderIndex = void 0;
if (r81) {
const length = listData.length;
listData.push({
kind: "friendsHeader"
});
const r88 = 0 < r80;
let row3 = 0;
friendsHeaderOffset = r70;
friendsHeaderIndex = length;
if (r88) {
do {
listData.push({
kind: "suggestedFriend",
row: row3
});
row3 = row3 + 1;
friendsHeaderOffset = r70;
friendsHeaderIndex = length;
} while (row3 < r80);
}
}
const r100 = sections[MessagesDataSections.Placeholders];
const r101 = 0 < r100;
let row4 = 0;
if (r101) {
do {
listData.push({
kind: "placeholder",
row: row4
});
row4 = row4 + 1;
} while (row4 < r100);
}
return {
listData,
friendsHeaderIndex,
friendsHeaderOffset,
listHeaderHeight
};
}, [channels, channelFavorites, renderHeader, sections, listItemHeight, isRefreshEnabled]);
};
@@ -0,0 +1,46 @@
// Metro module 15046 (f15047).
import { useEffect } from "react";
import GatewayConnectionStore from "../../../../gateway/GatewayConnectionStore";
import ChannelStore from "../../../../../stores/ChannelStore";
import PrivateChannelSortStore from "../../../../../stores/views/PrivateChannelSortStore";
import Dispatcher from "../../../../../Dispatcher";
export default function useMessagesReconnectToCallsEffect() {
useEffect(() => {
let isConnected;
const isGatewayConnectedListener2 = function isGatewayConnectedListener() {
const isConnected2 = GatewayConnectionStore.isConnected();
if (isConnected !== isConnected2) {
isConnected = isConnected2;
if (isConnected2) {
const [, r11] = PrivateChannelSortStore.getSortedChannels();
const channelIds = [];
const r25 = Math.min(20, r11.length);
let r0 = 0;
if (0 < r25) {
do {
const channel = ChannelStore.getChannel(r11[r0].channelId);
let r32 = channel != null;
const r1 = r0;
if (r32) {
r32 = channel.isGroupDM();
}
if (r32) {
channelIds.push(r11[r1].channelId);
}
r0 = r1 + 1;
} while (r0 < Math.min(20, r11.length));
}
Dispatcher.dispatch({
type: "CALL_CONNECT_MULTIPLE",
channelIds
});
}
}
};
isConnected = GatewayConnectionStore.isConnected();
GatewayConnectionStore.addChangeListener(isGatewayConnectedListener2);
return () => {
GatewayConnectionStore.removeChangeListener(isGatewayConnectedListener2);
};
}, []);
};
@@ -0,0 +1,35 @@
// Metro module 15045 (f15046).
import { useRef, useMemo } from "react";
import AccessibilityStore from "../../../../a11y/AccessibilityStore";
import { coerceGuildsRoute } from "../../../helpers/NavigationRouteUtils.native";
import getNavigatorCurrentRoute from "../../../navigator/getNavigatorCurrentRoute";
import { useScrollToTop } from "../../../../../_bundle/Module1481";
export default function useMessagesScrollToTop({ listRef, listRefHappeningNow }) {
useScrollToTop(useRef(useMemo(() => ({
scrollToTopTimeout: -1,
scrollToTop: function scrollToTop() {
if (coerceGuildsRoute(getNavigatorCurrentRoute()) != null) {
if (this.scrollToTopTimeout === -1) {
this.scrollToTopTimeout = setTimeout(() => {
if (listRef != null) {
const current = listRef.current;
if (current != null) {
current.scrollToTop(!AccessibilityStore.useReducedMotion);
}
}
const current2 = listRefHappeningNow.current;
if (current2 != null) {
current2.scrollToOffset({
offset: 0,
animated: !AccessibilityStore.useReducedMotion
});
}
}, 300);
} else {
clearTimeout(this.scrollToTopTimeout);
this.scrollToTopTimeout = -1;
}
}
}
}), [listRef, listRefHappeningNow])));
};
@@ -0,0 +1,31 @@
// Metro module 15023 (f15024).
import _objectWithoutProperties from "../../../../../_bundle/_objectWithoutProperties";
import { useMemo } from "react";
import { DM_WIDTH } from "../../../../../Constants";
import { useFontScale } from "../../../../screen/native/useFontScale";
import useSafeAreaInsets_native from "../../../../safe_area/useSafeAreaInsets.native";
import MobileVisualRefreshExperiment from "../../../../themes/experiments/MobileVisualRefreshExperiment";
import { getMessagesHeaderHeight } from "./MessagesHeader";
import { getMessagesItemChannelSizes } from "./items/MessagesItemChannel";
import { getMessagesItemSuggestedFriendHeight } from "./items/MessagesItemSuggestedFriend";
import Module712 from "../../../../../_bundle/Module712";
const _excluded = ["height"];
export default function useMessagesSpecs() {
const fontScale = useFontScale();
const top = useSafeAreaInsets_native().top;
const r17 = MobileVisualRefreshExperiment("MessagesHeader");
let c21534_2 = r17;
return useMemo(() => {
const messagesHeaderHeight = getMessagesHeaderHeight(fontScale, c21534_2);
const messagesItemChannelSizes = getMessagesItemChannelSizes(fontScale);
return {
headerSize: messagesHeaderHeight,
listTop: top + messagesHeaderHeight,
listLeft: DM_WIDTH,
listItemHeight: messagesItemChannelSizes.height,
listItemSizes: _objectWithoutProperties(messagesItemChannelSizes, _excluded),
listItemSuggestedFriendHeight: getMessagesItemSuggestedFriendHeight(fontScale),
scrollIndicatorInsetEnd: Module712.space.PX_4
};
}, [fontScale, top, r17]);
};
@@ -0,0 +1,172 @@
// Metro module 15271 (f15272).
import * as Module19 from "react";
import { useLayoutEffect, useCallback, useMemo, useRef } from "react";
import { View } from "react-native";
import { YouBarNavigatorScreens } from "../../MainTabsConstants";
import { ContentDismissActionType } from "../../../../dismissible_content/DismissibleContentConstants";
import { createStyles } from "../../../../../design/components/Styles/native/createStyles";
import Module712 from "../../../../../_bundle/Module712";
import { getRootNavigationRef } from "../../../RootNavigationRef.native";
import useIsWindowLarge from "../../../../screen/native/useIsWindowLarge";
import ForLaterExperiment from "../../../../saved_messages/ForLaterExperiment";
import useForLaterCoachmark from "../../../../saved_messages/native/useForLaterCoachmark";
import { SafeAreaPaddingView } from "../../../../../components_native/common/SafeAreaView";
import { PressableOpacity } from "../../../../../design/void/Pressables/native/Pressables";
import { intl, t } from "../../../../../intl/index.native";
import { LeftBackIconWithBadge } from "../../shared_components/BackIconWithBadge";
import { Text } from "../../../../../design/components/Text/native/Text";
import ForLaterOpenActionButton from "../../../../saved_messages/native/ForLaterOpenActionButton";
import { SavedMessageSortTypes } from "../../../../saved_messages/SavedMessagesTypes";
import NotificationCenterActionButton from "../../../../notification_center/native/NotificationCenterActionButton";
import useAnalyticsLocations, { AnalyticsLocationProvider } from "../../../../app_analytics/useAnalyticsLocations";
import AnalyticsLocation from "../../../../app_analytics/AnalyticsLocation";
import { trackAppUIViewed } from "../../../../tti_analytics/native/TTIAnalyticsUtils";
import { useNavigatorBackPressHandler } from "../../../../../design/components/Navigator/native/useNavigatorBackPressHandler.native";
import { LayerScope } from "../../../../../design/components/Layers/native/LayerScope.native";
import NotificationCenterPermissionNudge from "../../../../notification_center/native/NotificationCenterPermissionNudge";
import { NotificationCenterForYou } from "../../../../notification_center/native/NotificationCenterForYou";
import { TTIFirstContentfulPaint } from "../../../../tti_analytics/native/TTIFirstContentfulPaint";
import useColorThemeBackground from "../../../../client_themes/native/useColorThemeBackground";
import useSafeAreaInsets_native from "../../../../safe_area/useSafeAreaInsets.native";
import { useTrackTabPerformance } from "../TabsPerformanceTracker";
import ThemedGradient from "../../../../client_themes/native/ThemedGradient";
import { ThemeContextProvider } from "../../../../../_bundle/Module3901";
let useStyles, HeaderInner, Notifications, ThemedNotifications;
const goBack = function goBack() {
const rootNavigationRef = getRootNavigationRef();
if (rootNavigationRef != null) {
if (rootNavigationRef.canGoBack()) {
rootNavigationRef.goBack();
} else {
rootNavigationRef.navigate("guilds");
}
}
};
Notifications = function Notifications(props) {
const { style, nestedInLaunchPad = false, inNestedNavigator = false } = props;
const styles2 = useStyles();
const analyticsLocations = useAnalyticsLocations(AnalyticsLocation.NOTIFICATIONS).analyticsLocations;
useLayoutEffect(() => trackAppUIViewed(), []);
useNavigatorBackPressHandler(useCallback(() => {
const rootNavigationRef = getRootNavigationRef();
if (rootNavigationRef != null) {
if (rootNavigationRef.canGoBack()) {
rootNavigationRef.goBack();
} else {
rootNavigationRef.navigate("guilds");
}
}
return true;
}, []));
return <LayerScope zIndex={1}>
<AnalyticsLocationProvider value={analyticsLocations}>
<View style={[styles2.container, style]}>
<HeaderInner nestedInLaunchPad={nestedInLaunchPad} inNestedNavigator={inNestedNavigator} />
<NotificationCenterPermissionNudge />
<NotificationCenterForYou nestedInLaunchPad={nestedInLaunchPad} />
<TTIFirstContentfulPaint label="notifications" />
</View>
</AnalyticsLocationProvider>
</LayerScope>;
};
ThemedNotifications = function ThemedNotifications(props) {
const colorThemeBackground = useColorThemeBackground();
const top = useSafeAreaInsets_native().top;
const isWindowLarge = useIsWindowLarge();
let c21831_1 = isWindowLarge;
const styles = useStyles();
const memo = useMemo(() => c21831_1 ? [styles.containerOuterTablet, {
paddingTop: top
}] : styles.containerOuter, [styles, isWindowLarge, top]);
useTrackTabPerformance(YouBarNavigatorScreens.NOTIFICATIONS);
const r42 = [<ThemedGradient absolute />, ,];
const route = props.route;
r42[1] = <ThemeContextProvider gradient={colorThemeBackground}>
<Notifications {...props} inNestedNavigator={route == null ? void 0 : route.params?.inNestedNavigator} />
</ThemeContextProvider>;
return <View style={memo}>{r42}</View>;
};
useStyles = createStyles({
containerOuter: {
flex: 1
},
containerOuterTablet: {
backgroundColor: Module712.colors.BACKGROUND_BASE_LOWEST,
paddingHorizontal: Module712.space.PX_8,
flex: 1
},
container: {
backgroundColor: Module712.colors.BACKGROUND_BASE_LOW,
borderTopLeftRadius: Module712.radii.sm,
borderTopRightRadius: Module712.radii.sm,
flexGrow: 1
},
headerTitle: {
height: 56,
marginHorizontal: 16,
flexDirection: "row",
alignItems: "center"
},
actionButtons: {
flexDirection: "row",
gap: 12
},
headerClose: {
marginRight: Module712.space.PX_16,
height: Module712.space.PX_32,
width: Module712.space.PX_32,
alignItems: "center",
justifyContent: "center",
borderRadius: Module712.radii.lg
},
headerText: {
flex: 1,
marginTop: 2
},
headerBorder: {
left: 0,
bottom: 0,
height: 1,
width: "100%",
position: "absolute",
backgroundColor: Module712.colors.BORDER_SUBTLE
}
});
HeaderInner = Module19.memo(function HeaderInner(props) {
const nestedInLaunchPad = props.nestedInLaunchPad;
const styles2 = useStyles();
const isWindowLarge = useIsWindowLarge();
const enabled = ForLaterExperiment.useConfig({
location: "NativeNotifications"
}).enabled;
const ref = useRef(null);
const forLaterCoachmark = useForLaterCoachmark(ref);
let c21832_0 = forLaterCoachmark;
const callback = useCallback(() => c21832_0(ContentDismissActionType.TAKE_ACTION), [forLaterCoachmark]);
return <View>
<SafeAreaPaddingView top={nestedInLaunchPad ? !nestedInLaunchPad : !isWindowLarge}>
{nestedInLaunchPad ? null : <View style={styles2.headerTitle}>
<PressableOpacity style={styles2.headerClose} accessibilityLabel={intl.string(t["13/7kX"])} onPress={goBack}>
<LeftBackIconWithBadge />
</PressableOpacity>
<Text color="mobile-text-heading-primary" variant="heading-lg/bold" style={styles2.headerText} maxFontSizeMultiplier={1.75} accessibilityRole="header">
{intl.string(t.HcoRu0)}
</Text>
<View style={styles2.actionButtons}>
{enabled ? <>
<ForLaterOpenActionButton ref={ref} type={SavedMessageSortTypes.BOOKMARK} onOpen={callback} />
<ForLaterOpenActionButton type={SavedMessageSortTypes.REMINDER} onOpen={callback} />
</> : null}
<NotificationCenterActionButton />
</View>
</View>}
</SafeAreaPaddingView>
<View style={[styles2.headerBorder]} />
</View>;
});
export default Notifications;
export { goBack };
export { ThemedNotifications };
export function ThemedNotificationsModal() {
return <ThemedNotifications inNestedNavigator />;
}
@@ -0,0 +1,13 @@
// Metro module 15264 (f15265).
import { useMemo } from "react";
import NotificationCenterItemsStore from "../../../../notification_center/NotificationCenterItemsStore";
import { useStateFromStores } from "../../../../../_bundle/Module589";
import { NotificationCenterLocalItems } from "../../../../notification_center/NotificationCenterItemsTypes";
export default function useNotificationsTabBadge() {
const stateFromStores = useStateFromStores([NotificationCenterItemsStore], () => NotificationCenterItemsStore.localItems);
const memo = useMemo(() => stateFromStores.filter((stateFromStore) => stateFromStore.type === NotificationCenterLocalItems.INCOMING_FRIEND_REQUESTS || stateFromStore.type === NotificationCenterLocalItems.INCOMING_GAME_FRIEND_REQUESTS || stateFromStore.type === NotificationCenterLocalItems.MOBILE_NATIVE_UPDATE_AVAILABLE).length, [stateFromStores]);
return {
value: memo,
showDot: memo > 0
};
};
@@ -0,0 +1,51 @@
// Metro module 15729 (f15730).
import { useMemo } from "react";
import { View } from "react-native";
import { createStyles } from "../../../../../design/components/Styles/native/createStyles";
import Module712 from "../../../../../_bundle/Module712";
import { useReportProfileModalTransition } from "../../../../user_profile/native/profileModalTransition";
import useSafeAreaInsets_native from "../../../../safe_area/useSafeAreaInsets.native";
import useIsWindowLarge from "../../../../screen/native/useIsWindowLarge";
import { isIpadOS } from "../../../../../utils/native/DeviceUtils";
import ReanimatedRexport from "../../../../reanimated/ReanimatedRexport";
import SettingsNavigator from "../../../../user_settings/core/native/SettingsNavigator";
const useStyles = createStyles({
containerOuter: {
flex: 1,
overflow: "hidden"
},
containerOuterTablet: {
backgroundColor: Module712.colors.BACKGROUND_BASE_LOWEST,
paddingHorizontal: Module712.space.PX_8,
borderRadius: Module712.radii.md,
flex: 1
},
container: {
flex: 1
},
containerTablet: {
borderRadius: Module712.radii.md,
overflow: "hidden",
flex: 1
}
});
export default function Settings() {
useReportProfileModalTransition();
const safeAreaInsets_native = useSafeAreaInsets_native();
const { top, left, right } = safeAreaInsets_native;
const r9 = useIsWindowLarge() && !isIpadOS();
let c22396_3 = r9;
const styles = useStyles();
return <View style={useMemo(() => c22396_3 ? [styles.containerOuterTablet, {
paddingTop: top,
paddingLeft: left,
paddingRight: right
}] : [styles.containerOuter, {
paddingLeft: left,
paddingRight: right
}], [styles, r9, top, left, right])}>
<ReanimatedRexport.View style={r9 ? styles.containerTablet : styles.container}>
<SettingsNavigator />
</ReanimatedRexport.View>
</View>;
};
@@ -0,0 +1,40 @@
// Metro module 15253 (f15254).
import Durations from "../../../../../utils/Durations";
import { intl, t } from "../../../../../intl/index.native";
import { useFocusModeEnabled } from "../../../../notifications/FocusModeUtils";
import { ActionSheet } from "../../../../../design/components/Sheet/native/ActionSheet.native";
import { TableRowGroup } from "../../../../../design/components/TableRow/native/TableRowGroup.native";
import { TableRow } from "../../../../../design/components/TableRow/native/TableRow.native";
let c10833_4 = [{
duration: 30 * Durations.Millis.MINUTE,
label: () => intl.string(t.RxJGbL)
}, {
duration: Durations.Millis.HOUR,
label: () => intl.string(t.UMWBZr)
}, {
duration: 3 * Durations.Millis.HOUR,
label: () => intl.string(t.QmYWtu)
}, {
duration: 8 * Durations.Millis.HOUR,
label: () => intl.string(t.EpAXPC)
}, {
duration: Durations.Millis.DAY,
label: () => intl.string(t["755t4q"])
}, {
duration: void 0,
label: () => intl.string(t["46dqJY"])
}];
export default function FocusModeOptionsActionSheet(props) {
const onSelect = props.onSelect;
const focusModeEnabled = useFocusModeEnabled();
return <ActionSheet>
<TableRowGroup title={intl.string(t["sNX1E+"])} hasIcons={false}>
{focusModeEnabled ? <TableRow accessibilityLabel={intl.string(t.rk35Gm)} accessibilityHint={intl.string(t.rk35Gm)} onPress={() => {
onSelect(false, void 0);
}} trailing={null} label={intl.string(t.rk35Gm)} /> : null}
{c10833_4.map(({ duration, label: label2 }) => <TableRow key={`${duration}`} accessibilityLabel={label2()} accessibilityHint={label2()} onPress={() => {
onSelect(true, duration);
}} trailing={null} label={label2()} />)}
</TableRowGroup>
</ActionSheet>;
};
@@ -0,0 +1,32 @@
// Metro module 15623 (f15624).
import Durations from "../../../../../utils/Durations";
import { createApexExperiment } from "../../../../experiments/apex/index";
const r18 = 3 * Durations.Millis.DAYS_30;
const apexExperiment = createApexExperiment({
name: "2026-05-mobile-referral-subscriber-profile-entrypoint-button",
kind: "user",
defaultConfig: {
enabled: false,
showReferralNotificationDot: false
},
variations: {
0: {
enabled: false,
showReferralNotificationDot: false
},
1: {
enabled: true,
showReferralNotificationDot: false
},
2: {
enabled: true,
showReferralNotificationDot: true
}
}
});
export { r18 as REFERRAL_NITRO_BUTTON_RED_DOT_COOLDOWN_MS };
export function useMobileReferralSubscriberProfileEntrypointButtonConfig(a0) {
return apexExperiment.useConfig({
location: a0
});
}
@@ -0,0 +1,311 @@
// Metro module 15245 (f15246).
import * as Module19 from "react";
import { useMemo, useCallback } from "react";
import { Image as Image2, View } from "react-native";
import MultiAccountStore, { MultiAccountTokenStatus } from "../../../../multi_account/MultiAccountStore";
import ThemeStore from "../../../../user_settings/ThemeStore";
import UserRecord from "../../../../../records/UserRecord";
import DeveloperExperimentStore from "../../../../../stores/DeveloperExperimentStore";
import StreamerModeStore from "../../../../../stores/StreamerModeStore";
import UserStore from "../../../../../stores/UserStore";
import { AnalyticEvents, AuthStates, StatusTypes, ThemeTypes } from "../../../../../Constants";
import { MultiAccountSwitchLocation } from "../../../../multi_account/Constants";
import { createStyles } from "../../../../../design/components/Styles/native/createStyles";
import Module712 from "../../../../../_bundle/Module712";
import { TableRowIcon } from "../../../../../design/components/TableRow/native/TableRowIcon.native";
import Module13155 from "../../../../../_bundle/Module13155";
import Module13152 from "../../../../../_bundle/Module13152";
import Module13153 from "../../../../../_bundle/Module13153";
import Module13154 from "../../../../../_bundle/Module13154";
import { StatusSetting, StatusExpiresAtSetting, FocusModeExpiresAtSetting } from "../../../../user_settings/UserSettings";
import setUserStatus from "../../../../multi_account/setUserStatus";
import ActionSheetActionCreators from "../../../../action_sheet/native/ActionSheetActionCreators";
import { TableRadioGroup } from "../../../../../design/components/TableRow/native/TableRadioGroup.native";
import { intl, t } from "../../../../../intl/index.native";
import { TableRadioRow } from "../../../../../design/components/TableRow/native/TableRadioRow.native";
import { getStatusLabel } from "../../../../channel/getChannelA11yLabel";
import MobileVisualRefreshExperiment from "../../../../themes/experiments/MobileVisualRefreshExperiment";
import { useStateFromStores } from "../../../../../_bundle/Module589";
import { resetBackgroundGradientPreset } from "../../../../client_themes/ClientThemesBackgroundActionCreators";
import { resetCustomTheme } from "../../../../client_themes/native/CustomThemeMobileActionCreators";
import UserSettingsActionCreators from "../../../../../actions/UserSettingsActionCreators";
import { ThemeLightIcon } from "../../../../../design/components/Icon/native/redesign/generated/ThemeLightIcon";
import { getThemeName } from "../../../../client_themes/ClientThemesUtils";
import { ThemeGrayIcon } from "../../../../../design/components/Icon/native/redesign/generated/ThemeGrayIcon";
import { ThemeDarkIcon } from "../../../../../design/components/Icon/native/redesign/generated/ThemeDarkIcon";
import { ThemeMidnightIcon } from "../../../../../design/components/Icon/native/redesign/generated/ThemeMidnightIcon";
import UserUtils from "../../../../../utils/UserUtils";
import { Avatar, AvatarSizes } from "../../../../../design/void/native";
import { useMultiAccountUsers } from "../../../../multi_account/useMultiAccount";
import openManageAccountsModal from "../../../../multi_account/native/openManageAccountsModal";
import AnalyticsUtils from "../../../../../utils/AnalyticsUtils";
import AnalyticsLocation from "../../../../app_analytics/AnalyticsLocation";
import { switchAccount } from "../../../../multi_account/MultiAccountActionCreators";
import { PressableOpacity } from "../../../../../design/void/Pressables/native/Pressables";
import { Text } from "../../../../../design/components/Text/native/Text";
import { useFocusModeEnabled, setFocusMode } from "../../../../notifications/FocusModeUtils";
import { TableRowGroup } from "../../../../../design/components/TableRow/native/TableRowGroup.native";
import { TableSwitchRow } from "../../../../../design/components/TableRow/native/TableSwitchRow.native";
import { BellSlashIcon } from "../../../../../design/components/Icon/native/redesign/generated/BellSlashIcon";
import { showYouAccountActionSheet } from "./utils/showYouAccountActionSheet";
import { useCustomStatusActivity } from "../../../../custom_status/utils/userSettingToActivity";
import { useToken } from "../../../../../design/tokens/native/useToken";
import { useGameMentionsAsPlainText } from "../../../../game_mentions/hooks/useGameMentionsAsPlainText";
import { Card } from "../../../../../design/components/Card/native/Card.native";
import { openEditCustomStatusModal } from "../../../../custom_status/native/CustomStatusUtils";
import ActivityEmoji from "../../../../activity_status/native/ActivityEmoji";
import { ReactionIcon } from "../../../../../design/components/Icon/native/redesign/generated/ReactionIcon";
import removeCustomStatus from "../../../../custom_status/utils/removeCustomStatus";
import Module7734 from "../../../../../_bundle/Module7734";
import useDesignToggle from "../../../../devtools/design_toggles/useDesignToggle";
import { ActionSheet } from "../../../../../design/components/Sheet/native/ActionSheet.native";
import { BottomSheetTitleHeader } from "../../../../../design/components/Sheet/native/BottomSheetTitleHeader.native";
import { Stack } from "../../../../../design/components/Stack/native/Stack.native";
import DevToolsContent from "../../../../devtools/native/components/DevToolsContent";
let useStyles, ThemeRadioGroup, YouAccountRadioGroup, FocusModeSetting, CustomStatus;
const YouStatusRadioGroup = function YouStatusRadioGroup() {
let setting, setting2;
const memo = useMemo(() => [{
icon: <TableRowIcon source={Module13155} variant="text-status-online" />,
value: StatusTypes.ONLINE
}, {
icon: <TableRowIcon source={Module13152} variant="text-status-idle" />,
value: StatusTypes.IDLE
}, {
icon: <TableRowIcon source={Module13153} variant="text-status-dnd" />,
value: StatusTypes.DND
}, {
icon: <TableRowIcon source={Module13154} variant="text-status-offline" />,
value: StatusTypes.INVISIBLE
}], []);
setting = StatusSetting.useSetting();
setting2 = StatusExpiresAtSetting.useSetting();
const callback = useCallback((a0) => {
setUserStatus({
prevStatus: setting,
nextStatus: a0
});
ActionSheetActionCreators.hideActionSheet();
}, [setting]);
return <TableRadioGroup title={intl.string(t["0DPAZH"])} onChange={callback} defaultValue={setting} hasIcons>
{memo.map((item) => <TableRadioRow key={item.value} {...item} label={getStatusLabel(item.value)} subLabel={item.value === setting ? setting2 != null ? setting2 !== "0" ? intl.formatToPlainString(t.BWD8fs, {
endTime: new Date(Number(setting2)).toLocaleString(intl.currentLocale, {
month: "numeric",
day: "numeric",
hour: "numeric",
minute: "2-digit"
})
}) : void 0 : void 0 : void 0} />)}
</TableRadioGroup>;
};
ThemeRadioGroup = function ThemeRadioGroup() {
const r15 = MobileVisualRefreshExperiment("ThemeRadioGroup");
const stateFromStores3 = useStateFromStores([ThemeStore], () => ThemeStore.theme);
const callback = useCallback((a0) => {
resetBackgroundGradientPreset();
resetCustomTheme();
UserSettingsActionCreators.updateTheme(a0);
}, []);
return <View>
<TableRadioGroup title={intl.string(t.Ksh3ik)} onChange={callback} defaultValue={stateFromStores3} hasIcons>
<TableRadioRow icon={<ThemeLightIcon />} label={getThemeName(ThemeTypes.LIGHT, r15)} value={ThemeTypes.LIGHT} />
{r15 && <TableRadioRow icon={<ThemeGrayIcon />} label={getThemeName(ThemeTypes.DARK, true)} value={ThemeTypes.DARK} />}
<TableRadioRow icon={<ThemeDarkIcon />} label={getThemeName(ThemeTypes.DARKER, r15)} value={ThemeTypes.DARKER} />
<TableRadioRow icon={<ThemeMidnightIcon />} label={getThemeName(ThemeTypes.MIDNIGHT, r15)} value={ThemeTypes.MIDNIGHT} />
</TableRadioGroup>
</View>;
};
YouAccountRadioGroup = function YouAccountRadioGroup() {
let multiAccountUsers;
let multiAccountUsers2, stateFromStores2;
const r15 = MobileVisualRefreshExperiment("YouAccountRadioGroup");
const styles = useStyles();
const stateFromStores = useStateFromStores([UserStore], () => UserStore.getCurrentUser());
multiAccountUsers = useMultiAccountUsers().multiAccountUsers;
multiAccountUsers2 = multiAccountUsers;
stateFromStores2 = void 0;
stateFromStores2 = useStateFromStores([StreamerModeStore], () => StreamerModeStore.hidePersonalInformation);
const memo = useMemo(() => multiAccountUsers2.map((item) => {
const userRecord = new UserRecord(item);
const subLabel = stateFromStores2 ? null : userRecord.hasUniqueUsername() ? null : `#${userRecord.discriminator}`;
return {
label: UserUtils.getUserTag(userRecord, {
mode: "username",
identifiable: stateFromStores2 ? "never" : "always"
}),
value: item.id,
subLabel,
icon: <Avatar user={userRecord} guildId={void 0} size={AvatarSizes.REFRESH_MEDIUM_32} />
};
}), [multiAccountUsers, stateFromStores2]);
const callback = useCallback((a0) => {
if (a0 !== stateFromStores?.id) {
const r15 = multiAccountUsers.find((multiAccountUser) => multiAccountUser.id === a0);
if (r15 != null) {
if (r15.tokenStatus === MultiAccountTokenStatus.INVALID) {
openManageAccountsModal(AuthStates.LOGIN);
AnalyticsUtils.track(AnalyticEvents.LOGIN_VIEWED, {
source: "you_account_action_sheet"
});
} else {
AnalyticsUtils.track(AnalyticEvents.MULTI_ACCOUNT_SWITCH_ATTEMPT, {
location: AnalyticsLocation.YOU_ACCOUNT_ACTION_SHEET
});
ActionSheetActionCreators.hideActionSheet();
switchAccount(r15.id, void 0, MultiAccountSwitchLocation.YOU_ACCOUNT_ACTION_SHEET);
}
}
}
}, [multiAccountUsers, stateFromStores?.id]);
return stateFromStores == null ? null : <View style={styles.account}>
<View style={styles.manage}>
<PressableOpacity onPress={() => openManageAccountsModal()}>
<Text variant="text-sm/semibold" color={r15 ? "text-brand" : "text-link"}>
{intl.string(t.HxrBOZ)}
</Text>
</PressableOpacity>
</View>
<TableRadioGroup title={intl.string(t.oMNyYN)} onChange={callback} defaultValue={stateFromStores.id} hasIcons>
{memo.map((item) => <TableRadioRow key={item.value} {...item} />)}
</TableRadioGroup>
</View>;
};
FocusModeSetting = function FocusModeSetting() {
const styles = useStyles();
const focusModeEnabled = useFocusModeEnabled();
const setting3 = FocusModeExpiresAtSetting.useSetting();
return focusModeEnabled ? <TableRowGroup hasIcons>
<TableSwitchRow accessibilityLabel={intl.string(t.wCxBOc)} accessibilityHint={intl.string(t.wCxBOc)} icon={<BellSlashIcon style={styles.leadingIcon} />} onValueChange={(value) => {
if (value) {
ActionSheetActionCreators.openLazy(import("./FocusModeOptionsActionSheet"), "FocusModeOptionsActionSheet", {
onSelect: (a0, a1) => {
setFocusMode(a0, a1);
ActionSheetActionCreators.hideActionSheet();
showYouAccountActionSheet();
}
});
} else {
setFocusMode(false);
}
}} value={focusModeEnabled} label={intl.string(t.wCxBOc)} subLabel={setting3 != null && setting3 !== "0" ? intl.formatToPlainString(t.BWD8fs, {
endTime: new Date(Number(setting3)).toLocaleString(intl.currentLocale, {
month: "numeric",
day: "numeric",
hour: "numeric",
minute: "2-digit"
})
}) : intl.string(t.i0nsoY)} />
</TableRowGroup> : null;
};
CustomStatus = function CustomStatus() {
const styles = useStyles();
const customStatusActivity = useCustomStatusActivity();
const token = useToken(Module712.modules.mobile.TABLE_ROW_ICON_SIZE);
const r35 = customStatusActivity?.state != null && customStatusActivity.state !== "" || customStatusActivity?.emoji != null;
let status = useGameMentionsAsPlainText(customStatusActivity?.state);
const accessibilityLabel = r35 ? intl.string(t["2p9FMw"]) : intl.string(t["/UonHN"]);
let accessibilityHint = void 0;
if (r35) {
const GE7QzY = t.GE7QzY;
let emoji = customStatusActivity.emoji?.name;
if (emoji == null) {
emoji = "";
}
accessibilityHint = intl.formatToPlainString(GE7QzY, {
emoji,
status
});
}
const props = {
style: styles.customStatusEditButton,
accessibilityRole: "button",
accessibilityLabel,
accessibilityHint,
onPress: () => {
ActionSheetActionCreators.hideActionSheet();
openEditCustomStatusModal({
analyticsLocations: [AnalyticsLocation.YOU_ACCOUNT_ACTION_SHEET]
});
},
children: null
};
const children = [customStatusActivity?.emoji != null ? <ActivityEmoji emoji={customStatusActivity.emoji} size={token} /> : <ReactionIcon size="md" style={styles.leadingIcon} />, ,];
if (!r35) {
status = intl.string(t["/UonHN"]);
}
children[1] = <Text variant="text-md/semibold" color="mobile-text-heading-primary" lineClamp={2} style={styles.customStatusText}>{status}</Text>;
props.children = children;
return <TableRowGroup hasIcons={false}>
<Card shadow="none" border="none" style={styles.customStatusRow}>
<PressableOpacity {...props} />
{customStatusActivity != null ? <PressableOpacity onPress={(event) => {
event.stopPropagation();
removeCustomStatus();
}} accessibilityRole="button" accessibilityLabel={intl.string(t.wfYTHe)} style={styles.customStatusRemoveButton}>
<Image2 style={styles.trailingIcon} source={Module7734} />
</PressableOpacity> : null}
</Card>
</TableRowGroup>;
};
useStyles = createStyles({
account: {
position: "relative"
},
manage: {
position: "absolute",
right: 0,
zIndex: 100
},
leadingIcon: {
width: 24,
height: 24,
margin: 4
},
trailingIcon: {
tintColor: Module712.colors.INTERACTIVE_TEXT_DEFAULT,
width: 16,
height: 16
},
customStatusRow: {
padding: 0,
flexDirection: "row",
alignItems: "center",
gap: Module712.modules.mobile.TABLE_ROW_PADDING
},
customStatusEditButton: {
minHeight: Module712.modules.mobile.TABLE_ROW_HEIGHT,
padding: Module712.modules.mobile.TABLE_ROW_PADDING,
flex: 1,
flexDirection: "row",
alignItems: "center",
gap: Module712.modules.mobile.TABLE_ROW_PADDING
},
customStatusRemoveButton: {
height: Module712.modules.mobile.TABLE_ROW_HEIGHT,
paddingHorizontal: Module712.modules.mobile.TABLE_ROW_PADDING,
alignItems: "center",
justifyContent: "center"
},
customStatusText: {
flexShrink: 1
}
});
const r101 = Module19.memo(function({ statusOnly }) {
if (statusOnly === void 0) {
statusOnly = false;
}
const stateFromStores4 = useStateFromStores([MultiAccountStore], () => MultiAccountStore.getCanUseMultiAccountMobile());
const designToggle = useDesignToggle("theme_setting_in_account_sheet");
const stateFromStores3 = useStateFromStores([DeveloperExperimentStore], () => DeveloperExperimentStore.isDeveloper);
return <ActionSheet startExpanded={stateFromStores4} header={<BottomSheetTitleHeader title={statusOnly ? intl.string(t["3Uj+2p"]) : stateFromStores4 ? intl.string(t["ldCE/p"]) : intl.string(t["qP/i6k"])} />} showGradient>
<Stack spacing={24}>
{designToggle && <ThemeRadioGroup />}
<YouStatusRadioGroup />
<FocusModeSetting />
<CustomStatus />
{(statusOnly ? !statusOnly : stateFromStores4) && <YouAccountRadioGroup />}
{(statusOnly ? !statusOnly : stateFromStores3) && <DevToolsContent title="Developer Tools" embedded />}
</Stack>
</ActionSheet>;
});
export default r101;
@@ -0,0 +1,226 @@
// Metro module 15621 (f15622).
import * as Module19 from "react";
import { useMemo, useCallback } from "react";
import { ActivityIndicator, StyleSheet, View } from "react-native";
import UserStore from "../../../../../stores/UserStore";
import { ContentDismissActionType } from "../../../../dismissible_content/DismissibleContentConstants";
import { PREMIUM_TIER_2_TRIAL_FOR_EVERYONE_TRIAL_ID } from "../../../../premium/PremiumConstants";
import { createStyles } from "../../../../../design/components/Styles/native/createStyles";
import { isIOS } from "../../../../../_bundle/Module501";
import Module712 from "../../../../../_bundle/Module712";
import { isMobileVisualRefreshEnabled } from "../../../../themes/experiments/MobileVisualRefreshExperiment";
import { useUnseenOutboundPromotions } from "../../../../premium/promotions/PromotionsHooks";
import { useTrialOffer } from "../../../../premium/useTrialOffer";
import { useIsDismissibleContentDismissed_UNSAFE, UNSAFE_isDismissibleContentDismissed, UNSAFE_markDismissibleContentAsDismissed } from "../../../../dismissible_content/DismissibleContentUnsafeUtils";
import { DismissibleContent } from "../../../../../_bundle/Module1358";
import { useStateFromStores } from "../../../../../_bundle/Module589";
import useDisplayProfile from "../../../../user_profile/hooks/useDisplayProfile";
import useProfileTheme from "../../../../user_profile/hooks/useProfileTheme";
import { useUserProfileColors } from "../../../../user_profile/hooks/native/useUserProfileColors";
import { isThemeLight } from "../../../../../design/shared";
import Module689 from "../../../../../_bundle/Module689";
import { useHasPremiumSubscriptionToDisplay } from "../../../../../utils/PremiumUtils";
import useHasNewAdContent from "../../../../quests/hooks/useHasNewAdContent";
import { getIsEligibleForQuests } from "../../../../quests/lib/QuestsEligibility";
import { useMobileReferralSubscriberProfileEntrypointButtonConfig } from "./MobileReferralSubscriberProfileEntrypointButtonExperiment";
import { trackYouTabSettingsIconPress, trackYouTabNitroIconPress } from "./tracking/Tracking";
import { openQuestHome } from "../../../../quests/native/QuestUtils.native";
import { QuestContent } from "../../../../quests/QuestTypes";
import YouScreenNavIcon from "./YouScreenNavIcon";
import { QuestsIcon } from "../../../../../design/components/Icon/native/redesign/generated/QuestsIcon";
import { intl, t } from "../../../../../intl/index.native";
import CollectiblesShopEntryButton from "../../../../collectibles/native/CollectiblesShopEntryButton";
import YouScreenNavIconNitroSubscriber from "./YouScreenNavIconNitroSubscriber";
import { NitroWheelIcon } from "../../../../../design/components/Icon/native/redesign/generated/NitroWheelIcon";
import { SettingsIcon } from "../../../../../design/components/Icon/native/redesign/generated/SettingsIcon";
import * as _YouNavFloatingExperiment from "./YouNavFloatingExperiment";
import Module4611 from "../../../../../_bundle/Module4611";
import { HermesBuiltin } from "../../../../../_hermes/prelude";
const useStyles = createStyles((a0, a1, a2, a3, a4) => {
const container = {
...StyleSheet.absoluteFillObject,
zIndex: 10,
paddingTop: a0
};
const containerFloatingWrap = {
...StyleSheet.absoluteFillObject,
top: void 0,
alignItems: "center"
};
const containerFloatingGradient = {
...StyleSheet.absoluteFillObject,
color: a3
};
const containerFloating = {
marginBottom: isIOS() ? Module712.space.PX_24 : Module712.space.PX_4 + a1,
paddingVertical: Module712.space.PX_8,
paddingHorizontal: Module712.space.PX_24,
borderRadius: null,
backgroundColor: null,
flexDirection: "row",
borderColor: null,
borderWidth: 1
};
const borderRadius = isMobileVisualRefreshEnabled("YouBannerDecorations") ? Module712.radii.lg : Module712.radii.round;
let backgroundColor = a2;
containerFloating.borderRadius = borderRadius;
if (a2 == null) {
backgroundColor = Module712.colors.BACKGROUND_SURFACE_HIGH;
}
containerFloating.backgroundColor = backgroundColor;
containerFloating.borderColor = a4;
HermesBuiltin.copyDataProperties(containerFloating, Module712.shadows.SHADOW_HIGH);
return {
container,
containerFloatingWrap,
containerFloatingGradient,
containerFloating,
buttons: {
position: "absolute",
flexDirection: "row",
alignItems: "center",
top: Module712.space.PX_4,
right: Module712.space.PX_12,
paddingTop: a0
},
buttonsFloating: {
flexDirection: "row",
alignItems: "center",
gap: Module712.space.PX_16
},
loading: {
height: "100%",
alignItems: "center",
justifyContent: "center"
}
};
});
const r40 = Module19.memo(function(a0) {
let r66, r239, containerBorderColor;
let gradientSecondaryBackground, containerBackground, isBadged, showBadge, dismissBadge, c22252_7, color;
let isLoading = a0.isLoading;
const { navigateToSettings, navigateToPremium, navigateToShop, shopButtonRef, settingsButtonRef, paddingTop = 0, paddingBottom = 0, backButton } = a0;
gradientSecondaryBackground = void 0;
containerBackground = void 0;
isBadged = void 0;
showBadge = void 0;
dismissBadge = void 0;
c22252_7 = void 0;
color = void 0;
const stateFromStores = useStateFromStores([UserStore], () => UserStore.getCurrentUser());
const id = stateFromStores?.id;
L11: {
const profileTheme = useProfileTheme({
user: stateFromStores,
displayProfile: useDisplayProfile(id)
});
const { theme, primaryColor, secondaryColor } = profileTheme;
const userProfileColors = useUserProfileColors({
theme,
primaryColor,
secondaryColor
});
const containerBackground2 = userProfileColors.containerBackground;
containerBorderColor = userProfileColors.containerBorderColor;
gradientSecondaryBackground = userProfileColors.gradientSecondaryBackground;
if (isMobileVisualRefreshEnabled("YouBannerDecorations") && isThemeLight(theme)) {
const r65 = primaryColor == null;
r66 = null;
if (r65) {
break L11;
}
r66 = secondaryColor == null ? null : containerBackground2;
} else {
r66 = containerBackground2;
}
}
containerBackground = r66;
const styles = useStyles(paddingTop, paddingBottom, useMemo(() => containerBackground != null ? Module689.mix(gradientSecondaryBackground, Module689(containerBackground).hex("rgb"), Module689(containerBackground).alpha(), "rgb").hex("rgb") : null, [gradientSecondaryBackground, containerBackground]), gradientSecondaryBackground, containerBorderColor);
const hasPremiumSubscriptionToDisplay = useHasPremiumSubscriptionToDisplay();
let r83 = useUnseenOutboundPromotions().length > 0;
const r4 = useTrialOffer(PREMIUM_TIER_2_TRIAL_FOR_EVERYONE_TRIAL_ID) != null;
const isDismissibleContentDismissed_UNSAFE = useIsDismissibleContentDismissed_UNSAFE(DismissibleContent.TRIAL_FOR_ALL_2026_SETTINGS_BADGE);
const r3 = isDismissibleContentDismissed_UNSAFE ? !isDismissibleContentDismissed_UNSAFE : r4;
if (!r83) {
r83 = r3;
}
isBadged = r83;
const hasNewAdContent = useHasNewAdContent();
showBadge = hasNewAdContent.showBadge;
dismissBadge = hasNewAdContent.dismissBadge;
const isEligibleForQuests = getIsEligibleForQuests();
const mobileReferralSubscriberProfileEntrypointButtonConfig = useMobileReferralSubscriberProfileEntrypointButtonConfig("YouBannerDecorations");
const { enabled, showReferralNotificationDot } = mobileReferralSubscriberProfileEntrypointButtonConfig;
const r116 = useTrialOffer(PREMIUM_TIER_2_TRIAL_FOR_EVERYONE_TRIAL_ID) != null;
c22252_7 = r116;
const callback = useCallback(() => {
trackYouTabSettingsIconPress({
isBadged
});
navigateToSettings();
if (c22252_7 && !UNSAFE_isDismissibleContentDismissed(DismissibleContent.TRIAL_FOR_ALL_2026_SETTINGS_BADGE)) {
UNSAFE_markDismissibleContentAsDismissed(DismissibleContent.TRIAL_FOR_ALL_2026_SETTINGS_BADGE);
}
}, [isBadged, navigateToSettings, r116]);
const callback2 = useCallback(() => {
trackYouTabNitroIconPress();
navigateToPremium();
}, [navigateToPremium]);
const callback3 = useCallback(() => {
if (showBadge) {
dismissBadge(ContentDismissActionType.TAKE_ACTION);
}
openQuestHome({
fromContent: QuestContent.USER_PROFILE_HEADER
});
}, [showBadge, dismissBadge]);
const r201 = [isEligibleForQuests ? <YouScreenNavIcon key="quests" IconComponent={QuestsIcon} accessibilityLabel={intl.string(t.JALI2K)} onPress={callback3} showRedDot={showBadge} /> : null, <CollectiblesShopEntryButton key="shop" shopButtonRef={shopButtonRef} navigateToShop={navigateToShop} />, hasPremiumSubscriptionToDisplay ? enabled ? <YouScreenNavIconNitroSubscriber key="nitro-subscriber" onPress={callback2} showReferralNotificationDot={showReferralNotificationDot} /> : null : <YouScreenNavIcon key="nitro" IconComponent={NitroWheelIcon} accessibilityLabel={intl.string(t.Ipxkog)} label={intl.string(t.Ipxkog)} onPress={callback2} showNitroSlant />, <YouScreenNavIcon key="settings" ref={settingsButtonRef} IconComponent={SettingsIcon} accessibilityLabel={intl.string(t["3D5yo/"])} onPress={callback} showRedDot={isBadged} />].filter((item) => item != null);
if (isLoading) {
isLoading = <View style={styles.loading}>
<ActivityIndicator size={_YouNavFloatingExperiment.isYouNavFloating() ? "small" : "large"} />
</View>;
}
const r225 = <>
{isLoading}
<View style={_YouNavFloatingExperiment.isYouNavFloating() ? styles.buttonsFloating : styles.buttons} pointerEvents="box-none">{r201}</View>
</>;
color = styles.containerFloatingGradient.color;
const memo = useMemo(() => ({
start: {
x: 0,
y: 0
},
end: {
x: 0,
y: 1
},
colors: [Module689(color).alpha(0).hex(), Module689(color).alpha(1).hex()]
}), [color]);
const isYouNavFloating = _YouNavFloatingExperiment.isYouNavFloating();
const props = {
style: null,
pointerEvents: "box-none",
children: null
};
if (isYouNavFloating) {
props.style = styles.containerFloatingWrap;
props.children = [<Module4611 style={styles.containerFloatingGradient} {...memo} pointerEvents="none" />, <View style={styles.containerFloating}>{r225}</View>];
r239 = <View {...props} />;
} else {
props.style = styles.container;
props.children = [backButton, r225];
r239 = <View {...props} />;
}
return r239;
});
export default r40;
export function useHasSettingsBadge() {
let r2 = useUnseenOutboundPromotions().length > 0;
const r17 = useTrialOffer(PREMIUM_TIER_2_TRIAL_FOR_EVERYONE_TRIAL_ID) != null;
const isDismissibleContentDismissed_UNSAFE = useIsDismissibleContentDismissed_UNSAFE(DismissibleContent.TRIAL_FOR_ALL_2026_SETTINGS_BADGE);
const r26 = isDismissibleContentDismissed_UNSAFE ? !isDismissibleContentDismissed_UNSAFE : r17;
if (!r2) {
r2 = r26;
}
return r2;
}
@@ -0,0 +1,24 @@
// Metro module 15244 (f15245).
import { AVATAR_SIZE_MAP, AvatarSizes } from "../../../../../design/void/native";
import Module712 from "../../../../../_bundle/Module712";
const r18 = AVATAR_SIZE_MAP[AvatarSizes.XXLARGE];
const lg = Module712.radii.lg;
export const YOU_SCREEN_ID = "you-screen-native-id";
export const YOU_BANNER_IMAGE_HEIGHT = 150;
export const YOU_AVATAR_PADDING = 6;
export { r18 as YOU_AVATAR_SIZE };
export const YOU_CUSTOM_STATUS_MODAL_KEY = "you-custom-status-modal-key";
export const YOU_ACCOUNT_ACTION_SHEET_KEY = "you-account-action-sheet-key";
export { lg as YOU_CARD_BORDER_RADIUS };
export const YOU_CARD_BORDER_WIDTH = 1;
export const YOU_SCROLL_EVENT_THROTTLE = 16;
export const YOU_ACTION_SHEET_TOP_INSET = 12;
export const YOU_SCREEN_DROP_SHADOW = {
xOffset: 0,
yOffset: 2,
shadowColorIos: "#000000",
shadowOpacity: 0.08,
shadowRadius: 2.62,
elevation: 4,
shadowColorAndroid: "#000000"
};
@@ -0,0 +1,152 @@
// Metro module 15634 (f15635).
import { useEffect } from "react";
import { View } from "react-native";
import NoticeStore from "../../../../premium/native/NoticeStore";
import { AnalyticEvents, HelpdeskArticles, HorizontalGradient, NoticeTypes } from "../../../../../Constants";
import { Gradients } from "../../../../colors/native/ColorConstants";
import { PREMIUM_TIER_2_TRIAL_FOR_EVERYONE_TRIAL_ID } from "../../../../premium/PremiumConstants";
import Durations from "../../../../../utils/Durations";
import { createStyles } from "../../../../../design/components/Styles/native/createStyles";
import Module712 from "../../../../../_bundle/Module712";
import NoticeActionCreators from "../../../../../actions/NoticeActionCreators";
import AnalyticsUtils from "../../../../../utils/AnalyticsUtils";
import { intl, t } from "../../../../../intl/index.native";
import Module3771 from "../../../../../_bundle/Module3771";
import { useStateFromStores } from "../../../../../_bundle/defaultAreStatesEqual";
import { usePremiumTrialOffer } from "../../../../premium/hooks/usePremiumTrialOffer.android";
import useCountdown from "../../../../../hooks/useCountdown";
import { useShouldShowExpiringTrialOfferCard } from "./hooks/useShouldShowExpiringTrialOfferCard";
import HelpdeskUtils from "../../../../../utils/HelpdeskUtils";
import { Text } from "../../../../../design/components/Text/native/Text";
import { formatIntervalDuration } from "../../../../../utils/PremiumUtils";
import { PressableOpacity } from "../../../../../design/void/Pressables/native/Pressables";
import { CloseIcon, ShinyButton } from "../../../../../design/void/native";
import { NitroWheelIcon } from "../../../../../design/components/Icon/native/redesign/generated/NitroWheelIcon";
import Module4611 from "../../../../../_bundle/Module4611";
import UserProfileCard from "../../../../user_profile/native/UserProfileCard";
let c11157_15 = 10 * Durations.Millis.SECOND;
const useStyles = createStyles({
header: {
flexDirection: "row",
alignItems: "flex-start",
marginBottom: 16,
marginRight: 32
},
closeButton: {
position: "absolute",
top: 16,
right: 16
},
closeIcon: {
color: Module712.colors.INTERACTIVE_TEXT_DEFAULT
},
linearGradient: {
width: "100%",
height: "100%",
position: "absolute",
overflow: "hidden"
},
primaryCTA: {
borderRadius: Module712.radii.round,
gap: 4
}
});
export default function YouExpiringTrialOfferCard(props) {
let premiumTrialOffer, shouldShowExpiringTrialOfferCard;
const { navigateToPremium, style } = props;
premiumTrialOffer = void 0;
shouldShowExpiringTrialOfferCard = void 0;
const untilAtLeast = Module3771().add(5, "days");
const styles = useStyles();
const stateFromStores = useStateFromStores([NoticeStore], () => NoticeStore.getNoticeType());
premiumTrialOffer = usePremiumTrialOffer();
const countdown = useCountdown(premiumTrialOffer != null ? premiumTrialOffer.expires_at != null ? Date.parse(premiumTrialOffer.expires_at) : 0 : 0, c11157_15);
shouldShowExpiringTrialOfferCard = useShouldShowExpiringTrialOfferCard();
useEffect(() => {
let r2 = shouldShowExpiringTrialOfferCard;
if (shouldShowExpiringTrialOfferCard) {
r2 = stateFromStores != null;
}
if (r2) {
r2 = premiumTrialOffer != null;
}
if (r2) {
AnalyticsUtils.track(AnalyticEvents.APP_NOTICE_VIEWED, {
notice_type: stateFromStores,
trial_id: premiumTrialOffer.trial_id
});
}
}, [stateFromStores, shouldShowExpiringTrialOfferCard, premiumTrialOffer]);
if (shouldShowExpiringTrialOfferCard) {
if (premiumTrialOffer != null && stateFromStores != null) {
const articleURL = HelpdeskUtils.getArticleURL(premiumTrialOffer.trial_id === PREMIUM_TIER_2_TRIAL_FOR_EVERYONE_TRIAL_ID ? HelpdeskArticles.NITRO_TRIAL_FOR_ALL : HelpdeskArticles.PREMIUM_TRIAL);
const trialPeriod = formatIntervalDuration({
intervalType: premiumTrialOffer.subscription_trial?.interval,
intervalCount: premiumTrialOffer.subscription_trial?.interval_count
});
return <UserProfileCard style={style}>
<>
<View style={styles.header}>
<Text variant="heading-sm/medium" color="text-default">
{countdown.days > 0 ? intl.format(t.GPqVWT, {
days: countdown.days,
trialPeriod,
termsUrl: articleURL
}) : countdown.hours > 0 ? intl.format(t.WFMtg1, {
hours: countdown.hours,
trialPeriod,
termsUrl: articleURL
}) : intl.format(t.SxXB42, {
minutes: Math.max(countdown.minutes, 1),
trialPeriod,
termsUrl: articleURL
})}
</Text>
</View>
<PressableOpacity style={styles.closeButton} accessibilityRole="button" accessibilityLabel={intl.string(t.cpT0Cq)} hitSlop={{
top: 8,
right: 8,
bottom: 8,
left: 8
}} onPress={() => {
const trial_id = premiumTrialOffer.trial_id;
if (stateFromStores != null) {
AnalyticsUtils.track(AnalyticEvents.APP_NOTICE_CLOSED, {
notice_type: stateFromStores,
trial_id
});
}
NoticeActionCreators.dismiss({
untilAtLeast
});
}}>
<CloseIcon width={16} height={16} color={styles.closeIcon.color} />
</PressableOpacity>
<ShinyButton style={styles.primaryCTA} text={intl.string(t.J61px0)} onPress={() => {
const trial_id = premiumTrialOffer.trial_id;
if (stateFromStores != null) {
AnalyticsUtils.track(AnalyticEvents.APP_NOTICE_PRIMARY_CTA_OPENED, {
notice_type: stateFromStores,
trial_id
});
}
navigateToPremium();
}} renderIcon={() => <NitroWheelIcon color="white" size="sm" />} renderLinearGradient={() => {
let PREMIUM_TIER_0;
if (NoticeTypes.PREMIUM_TIER_0_TRIAL_ENDING === stateFromStores) {
PREMIUM_TIER_0 = Gradients.PREMIUM_TIER_0;
} else {
if (NoticeTypes.PREMIUM_TIER_2_TRIAL_ENDING !== stateFromStores) {
throw new Error(`Unsupported notice type: ${stateFromStores}`);
}
PREMIUM_TIER_0 = Gradients.PREMIUM_TIER_2_TRI_COLOR;
}
return <Module4611 style={[styles.linearGradient]} start={HorizontalGradient.START} end={HorizontalGradient.END} colors={PREMIUM_TIER_0} />;
}} />
</>
</UserProfileCard>;
}
return null;
}
return null;
};
@@ -0,0 +1,19 @@
// Metro module 15616 (f15617).
import { createApexExperiment } from "../../../../experiments/apex/index";
const enabled = createApexExperiment({
name: "2026-04-you-nav-floating",
kind: "user",
defaultConfig: {
enabled: false
},
variations: {
1: {
enabled: true
}
}
}).getConfig({
location: "you-nav-floating"
}).enabled;
export function isYouNavFloating() {
return enabled;
}
@@ -0,0 +1,446 @@
// Metro module 15614 (f15615).
import { useState, useCallback, useRef, useMemo, useEffect, useLayoutEffect } from "react";
import { StyleSheet, View, ScrollView } from "react-native";
import UserProfileStore from "../../../../user_profile/UserProfileStore";
import LocaleStore from "../../../../user_settings/LocaleStore";
import UserSettingSearchStore from "../../../../user_settings/UserSettingSearchStore";
import GuildReadStateStore from "../../../../../stores/GuildReadStateStore";
import UserStore from "../../../../../stores/UserStore";
import { YOU_ACTION_SHEET_TOP_INSET, YOU_AVATAR_SIZE, YOU_SCREEN_ID, YOU_SCROLL_EVENT_THROTTLE } from "./YouConstants";
import { UserSettingsSections } from "../../../../../Constants";
import { CollectiblesMobileShopScreen } from "../../../../collectibles/CollectiblesShopConstants";
import { ContentDismissActionType } from "../../../../dismissible_content/DismissibleContentConstants";
import { UserProfileThemeTypes } from "../../../../user_profile/native/Constants";
import ReanimatedRexport, { useSharedValue, useAnimatedScrollHandler } from "../../../../reanimated/ReanimatedRexport";
import VisualEffectViewThemed from "../../../../visual_effect_view/native/VisualEffectViewThemed";
import { createStyles } from "../../../../../design/components/Styles/native/createStyles";
import { isIOS } from "../../../../../_bundle/Module501";
import Module712 from "../../../../../_bundle/Module712";
import Module689 from "../../../../../_bundle/Module689";
import { getRootNavigationRef } from "../../../RootNavigationRef.native";
import { useStateFromStores } from "../../../../../_bundle/defaultAreStatesEqual";
import { intl, t } from "../../../../../intl/index.native";
import { PressableOpacity } from "../../../../../design/void/Pressables/native/Pressables";
import { CloseIconWithBadgeOnSide } from "../../shared_components/BackIconWithBadge";
import useUserProfileBannerHeight from "../../../../user_profile/hooks/native/useUserProfileBannerHeight";
import useTrackImpression from "../../../../app_analytics/useTrackImpression";
import { ImpressionTypes, ImpressionNames } from "../../../../../_bundle/Module503";
import useDisplayProfile from "../../../../user_profile/hooks/useDisplayProfile";
import useSafeAreaInsets_native from "../../../../safe_area/useSafeAreaInsets.native";
import useProfileTheme from "../../../../user_profile/hooks/useProfileTheme";
import useTheme from "../../../../../hooks/useTheme";
import useUserProfileOverscrollStyles from "../../../../user_profile/native/useUserProfileOverscrollStyles";
import useChatLayout from "../../../../chat/native/useChatLayout";
import useWindowDimensions_native from "../../../../screen/useWindowDimensions.native";
import { GifAutoPlay } from "../../../../user_settings/UserSettings";
import { useIsFocused, useScrollToTop } from "../../../../../_bundle/Module1481";
import { useIsProfileModalTransitioning } from "../../../../user_profile/native/profileModalTransition";
import * as _AvatarUtils from "../../../../../utils/AvatarUtils";
import { makeSource } from "../../../../../utils/AvatarUtils";
import { useUserProfileBannerBackgroundColor } from "../../../../profile_customization/native/ProfileCustomizationUtils";
import useIsWindowLarge from "../../../../screen/native/useIsWindowLarge";
import * as _YouNavFloatingExperiment from "./YouNavFloatingExperiment";
import { useCreateUserProfileAnalyticsContext, UserProfileAnalyticsProvider } from "../../../../user_profile/UserProfileAnalyticsContext";
import { useIsScreenLandscape } from "../../../../screen/useIsScreenLandscape.native";
import useMaybeFetchProfileFrame from "../../../../collectibles/profile_frames/hooks/useMaybeFetchProfileFrame";
import useMaybeTrackProfileFrameViewed from "../../../../collectibles/profile_frames/hooks/useMaybeTrackProfileFrameViewed";
import AnalyticsLocation from "../../../../app_analytics/AnalyticsLocation";
import scaleProfileFrame from "../../../../collectibles/profile_frames/scaleProfileFrame";
import { DismissibleContent } from "../../../../../_bundle/Module1358";
import { useSelectedDismissibleContent } from "../../../../dismissible_content/hooks/useSelectedDismissibleContent";
import FastImage from "../../../../../components_native/common/FastImage";
import YouSettingsCoachmark, { useYouSettingsCoachmark } from "./YouSettingsCoachmark";
import { LayerScope } from "../../../../../design/components/Layers/native/LayerScope.native";
import ShopCoachmark from "../../../../collectibles/native/ShopCoachmark";
import YouBannerDecorations from "./YouBannerDecorations";
import { ThemeContextProvider } from "../../../../../_bundle/Module3901";
import VisualEffectViewTarget from "../../../../visual_effect_view/native/VisualEffectViewTarget";
import ProfileFrame from "../../../../collectibles/profile_frames/native/ProfileFrame";
import { ProfileFrameLayerOrder } from "../../../../../_bundle/Module8088";
import UserProfileFixedBackground from "../../../../user_profile/native/UserProfileFixedBackground";
import { int2hex } from "../../../../../_bundle/int2hslRaw";
import { Caption } from "../../../../media/native/Caption";
import ProfileEffect from "../../../../collectibles/profile_effects/native/ProfileEffect";
import YouScreenUserProfileContent from "../../../../user_profile/native/YouScreenUserProfileContent";
import { TTIFirstContentfulPaint } from "../../../../tti_analytics/native/TTIFirstContentfulPaint";
import maybeFetchUserProfile from "../../../../user_profile/maybeFetchUserProfile";
import { useFetchWishlist } from "../../../../wishlists/hooks/useWishlistHooks";
import { openUserSettings } from "../../../../user_settings/core/native/openUserSettings";
import { openCollectiblesShopMobile } from "../../../../collectibles/CollectiblesActionCreators";
import { openEditCustomStatusModal } from "../../../../custom_status/native/CustomStatusUtils";
import { trackAppUIViewed } from "../../../../tti_analytics/native/TTIAnalyticsUtils";
let AnimatedComponent, useStyles, useStyles2, AnimatedComponent2, BackButton, __initData, UnconnectedYouScreen;
const handleBackButtonPress = function handleBackButtonPress() {
const rootNavigationRef = getRootNavigationRef();
if (rootNavigationRef != null) {
if (rootNavigationRef.canGoBack()) {
rootNavigationRef.goBack();
} else {
rootNavigationRef.navigate("guilds");
}
}
};
BackButton = function BackButton(props) {
const paddingTop = props.paddingTop;
const styles2 = useStyles2();
const stateFromStores2 = useStateFromStores([GuildReadStateStore], () => GuildReadStateStore.getTotalMentionCount());
return <PressableOpacity style={[styles2.backButton, {
top: paddingTop
}]} accessibilityRole="button" accessibilityLabel={stateFromStores2 > 0 ? intl.formatToPlainString(t.vxFYaM, {
mentionCount: stateFromStores2
}) : intl.string(t["13/7kX"])} onPress={handleBackButtonPress}>
<CloseIconWithBadgeOnSide count={stateFromStores2} />
</PressableOpacity>;
};
UnconnectedYouScreen = function UnconnectedYouScreen(props) {
let height, c22247_4, sharedValue, width, state, setState2, overflowTop, c22247_10, c22247_11, youSettingsCoachmark, c22247_13, setState3;
const { user, navigateToSettings, navigateToPremium, navigateToShop, navigateToProfileCustomization, navigateToCustomStatus, navigateToFriends, initialTab } = props;
height = void 0;
c22247_4 = void 0;
sharedValue = void 0;
width = void 0;
state = void 0;
setState2 = void 0;
overflowTop = void 0;
c22247_10 = void 0;
c22247_11 = void 0;
youSettingsCoachmark = void 0;
c22247_13 = void 0;
setState3 = void 0;
const [state2, setState] = useState(0);
const callback2 = useCallback((a0) => {
setState(a0.nativeEvent.layout.width);
}, []);
height = useUserProfileBannerHeight(state2 > 0 ? state2 : void 0);
const styles = useStyles(height);
useTrackImpression({
type: ImpressionTypes.VIEW,
name: ImpressionNames.USER_YOU_SCREEN
});
const displayProfile = useDisplayProfile(user.id);
const safeAreaInsets_native = useSafeAreaInsets_native();
c22247_4 = safeAreaInsets_native;
const profileTheme = useProfileTheme({
user,
displayProfile
});
const { theme, primaryColor, secondaryColor } = profileTheme;
const theme2 = useTheme();
const ref = useRef(null);
sharedValue = useSharedValue(0);
const N = function N(a0) {
sharedValue.set(a0.contentOffset.y);
};
N.__closure = {
scrollPosition: sharedValue
};
N.__workletHash = 952837799380;
N.__initData = __initData;
const animatedScrollHandler = useAnimatedScrollHandler(N);
const styles2 = useUserProfileOverscrollStyles({
scrollPosition: sharedValue,
bannerHeight: height
});
const { bannerAnimatedStyle, bannerImageAnimatedStyle, contentAnimatedStyle, blurAnimatedProps, showBlur } = styles2;
const isChatBesideChannelList = useChatLayout().isChatBesideChannelList;
const windowDimensions_native = useWindowDimensions_native();
const { width: width2, height: height2 } = windowDimensions_native;
const r132 = width2 - safeAreaInsets_native.right - safeAreaInsets_native.left - (isChatBesideChannelList ? 16 : 0);
width = state2 > 0 ? Math.min(r132, state2) : r132;
[state, setState2] = useState(false);
const setting = GifAutoPlay.getSetting();
const isFocused = useIsFocused();
const isProfileModalTransitioning = useIsProfileModalTransitioning();
const paused = isFocused ? !isFocused : !isProfileModalTransitioning;
const ref2 = useRef(Date.now());
const ref3 = useRef(void 0);
const ref4 = useRef(false);
if (isFocused && !ref4.current) {
ref4.current = true;
ref3.current = Date.now();
} else if (!isFocused) {
ref4.current = false;
}
const canAnimate = setting || state;
const r166 = displayProfile == null ? void 0 : displayProfile.getBannerURL({
canAnimate,
size: width
});
const source = r166 != null ? makeSource(r166) : null;
const isAnimatedImageURL = _AvatarUtils.isAnimatedImageURL(r166);
const accessibilityLabel = intl.formatToPlainString(t.gVn4uJ, {
username: user.username
});
const userProfileBannerBackgroundColor = useUserProfileBannerBackgroundColor({
user,
displayProfile
});
const isLoading = displayProfile == null || !displayProfile.isLoaded;
const isWindowLarge = useIsWindowLarge();
const memo3 = useMemo(() => ({
dimensionStyle: {
width,
height
},
contentContainerStyle: {
paddingBottom: c22247_4.bottom + (_YouNavFloatingExperiment.isYouNavFloating() ? Module712.space.PX_64 : 0)
}
}), [height, width, safeAreaInsets_native.bottom]);
const { dimensionStyle, contentContainerStyle } = memo3;
const createUserProfileAnalyticsContext = useCreateUserProfileAnalyticsContext({
layout: "YOU_SCREEN",
userId: user.id
});
const isScreenLandscape = useIsScreenLandscape();
const maybeFetchProfileFrame = useMaybeFetchProfileFrame(isScreenLandscape ? void 0 : displayProfile == null ? void 0 : displayProfile.profileFrame?.skuId, "YouScreen");
useMaybeTrackProfileFrameViewed({
skuId: isScreenLandscape ? void 0 : displayProfile == null ? void 0 : displayProfile.profileFrame?.skuId,
openedAt: ref3.current,
analyticsLocations: [AnalyticsLocation.YOU_SCREEN],
context: createUserProfileAnalyticsContext
});
overflowTop = maybeFetchProfileFrame != null ? scaleProfileFrame(maybeFetchProfileFrame, width).overflowTop : 0;
const memo4 = useMemo(() => overflowTop > 0 ? {
marginTop: overflowTop
} : void 0, [overflowTop]);
const paddingTop = !isWindowLarge && !isIOS() ? Math.max(safeAreaInsets_native.top - overflowTop, YOU_ACTION_SHEET_TOP_INSET) : YOU_ACTION_SHEET_TOP_INSET;
const skuId = displayProfile == null ? void 0 : displayProfile.profileEffect?.skuId;
let r253 = skuId != null;
const [r263, markAsDismissed] = useSelectedDismissibleContent(useMemo(() => [DismissibleContent.WISHLIST_MOBILE_YOU_SCREEN_COACHMARK], []));
const visible = r263 != null;
c22247_10 = visible;
const memo2 = useMemo(() => c22247_10 ? {
title: intl.string(t.epBu6F),
description: intl.string(t["o8+3AX"]),
avatarSrc: {},
decorationAsset: "",
renderImgComponent: () => <FastImage source={{
uri: "https://cdn.discordapp.com/assets/content/1979309f7455b06e0bc1e8f5da89de9934155a0a9a74bfff5b680c82fb45d53f.png"
}} style={{
width: 80,
height: 80
}} />
} : null, [visible]);
const ref5 = useRef(null);
const ref6 = useRef(null);
c22247_11 = markAsDismissed;
const callback3 = useCallback(() => {
navigateToShop();
c22247_11(ContentDismissActionType.TAKE_ACTION);
}, [markAsDismissed, navigateToShop]);
let disabled = memo2 != null;
youSettingsCoachmark = useYouSettingsCoachmark({
disabled
});
let r60 = youSettingsCoachmark != null;
const r279 = disabled ? disabled : r60;
c22247_13 = r279;
let state3;
[state3, setState3] = useState(!_YouNavFloatingExperiment.isYouNavFloating());
let r288 = null;
if (r279) {
r288 = null;
if (state3) {
if (disabled) {
disabled = <ShopCoachmark buttonRef={ref5} markAsDismissed={markAsDismissed} visible={visible} title={memo2.title} description={memo2.description} avatarSrc={memo2.avatarSrc} decorationAsset={memo2.decorationAsset} renderImgComponent={memo2.renderImgComponent} navigateToShop={callback3} />;
}
const r300 = [disabled, ,];
if (r60) {
r60 = <YouSettingsCoachmark buttonRef={ref6} {...youSettingsCoachmark.props} />;
}
r300[1] = r60;
r288 = <LayerScope zIndex={1}>{r300}</LayerScope>;
}
}
useEffect(() => {
if (c22247_13 && _YouNavFloatingExperiment.isYouNavFloating()) {
let c28108_0 = setTimeout(() => setState3(true), 500);
return () => clearTimeout(c28108_0);
}
}, [r279]);
const r327 = <YouBannerDecorations isLoading={isLoading} navigateToPremium={navigateToPremium} navigateToSettings={useCallback(() => {
if (youSettingsCoachmark != null) {
const trackSettingsPress = youSettingsCoachmark.trackSettingsPress;
if (trackSettingsPress != null) {
trackSettingsPress.call(youSettingsCoachmark);
}
}
navigateToSettings();
}, [navigateToSettings, youSettingsCoachmark])} navigateToShop={callback3} shopButtonRef={ref5} settingsButtonRef={ref6} paddingTop={paddingTop} paddingBottom={_YouNavFloatingExperiment.isYouNavFloating() ? safeAreaInsets_native.bottom : void 0} backButton={<BackButton paddingTop={paddingTop} />} />;
const fetchStartedAt = displayProfile?.fetchStartedAt;
const fetchEndedAt = displayProfile?.fetchEndedAt;
const isLoaded = displayProfile?.isLoaded;
const r363 = [maybeFetchProfileFrame != null && <ProfileFrame frame={maybeFetchProfileFrame} profileThemeType={UserProfileThemeTypes.YOU_SCREEN} frameOrder={ProfileFrameLayerOrder.BACK} containerWidth={width} />, <UserProfileFixedBackground gradientHeight={height2} bannerHeight={height} style={styles.background} />, , , , , ,];
const isYouNavFloating = _YouNavFloatingExperiment.isYouNavFloating();
r363[2] = isYouNavFloating ? !isYouNavFloating : r288;
const r391 = [r253 ? !r253 : _YouNavFloatingExperiment.isYouNavFloating() ? <BackButton paddingTop={paddingTop} /> : r327, ,];
const r408 = [<View style={[StyleSheet.absoluteFill, {
backgroundColor: int2hex(userProfileBannerBackgroundColor)
}]} />, , ,];
r408[1] = source != null && (isAnimatedImageURL ? <PressableOpacity onPress={() => setState2(!state)} accessibilityRole="image" accessibilityLabel={intl.string(t["3fzj/l"])}>
<FastImage style={dimensionStyle} accessibilityRole="image" accessibilityLabel={accessibilityLabel} source={source} paused={paused} />
{canAnimate ? !canAnimate : <Caption label={intl.string(t.I5gL2H)} style={[styles.gifTag, {
top: paddingTop
}]} textStyle={styles.gifTagText} />}
</PressableOpacity> : <FastImage style={dimensionStyle} accessibilityRole="image" accessibilityLabel={accessibilityLabel} source={source} paused={paused} />);
r408[2] = isIOS() && showBlur && <AnimatedComponent animatedProps={blurAnimatedProps} style={StyleSheet.absoluteFillObject} />;
r391[1] = <ReanimatedRexport.View style={[dimensionStyle, bannerImageAnimatedStyle]}>{r408}</ReanimatedRexport.View>;
const r460 = [<ReanimatedRexport.View style={[styles.banner, bannerAnimatedStyle]}>{r391}</ReanimatedRexport.View>, , , ,];
if (r253) {
r253 = <ReanimatedRexport.View pointerEvents="box-none" style={[styles.profileEffectLayer, {
width,
height: height2
}, bannerAnimatedStyle]}>
<ProfileEffect skuId={skuId} bannerAdjustment={0} replayOnNavigationFocus paused={paused} />
{_YouNavFloatingExperiment.isYouNavFloating() ? <BackButton paddingTop={paddingTop} /> : r327}
</ReanimatedRexport.View>;
}
r460[1] = r253;
r460[2] = <YouScreenUserProfileContent user={user} userTheme={theme2} scrollViewRef={ref} style={[styles.content, contentAnimatedStyle]} navigateToProfileCustomization={navigateToProfileCustomization} navigateToCustomStatus={navigateToCustomStatus} navigateToFriends={navigateToFriends} navigateToPremium={navigateToPremium} navigateToShop={navigateToShop} initialTab={initialTab} animateAvatar={!paused} />;
r460[3] = <TTIFirstContentfulPaint label="you_screen" />;
r363[3] = <AnimatedComponent2 contentContainerStyle={contentContainerStyle} ref={ref} onScroll={animatedScrollHandler} onLayout={callback2} scrollEventThrottle={YOU_SCROLL_EVENT_THROTTLE} style={styles.scrollView}>{r460}</AnimatedComponent2>;
r363[4] = maybeFetchProfileFrame != null && <ProfileFrame frame={maybeFetchProfileFrame} profileThemeType={UserProfileThemeTypes.YOU_SCREEN} frameOrder={ProfileFrameLayerOrder.FRONT} containerWidth={width} />;
r363[5] = _YouNavFloatingExperiment.isYouNavFloating() && r327;
r363[6] = _YouNavFloatingExperiment.isYouNavFloating() && r288;
return <LayerScope>
<ThemeContextProvider theme={theme} primaryColor={primaryColor} secondaryColor={secondaryColor}>
<UserProfileAnalyticsProvider value={createUserProfileAnalyticsContext} openedAt={ref2.current} fetchStartedAt={fetchStartedAt} fetchEndedAt={fetchEndedAt} isLoaded={isLoaded}>
<VisualEffectViewTarget style={[styles.container, memo4]} nativeID={YOU_SCREEN_ID}>{r363}</VisualEffectViewTarget>
</UserProfileAnalyticsProvider>
</ThemeContextProvider>
</LayerScope>;
};
AnimatedComponent = ReanimatedRexport.createAnimatedComponent(VisualEffectViewThemed);
useStyles = createStyles((a0) => {
const r17 = {
borderTopLeftRadius: isIOS() ? Module712.radii.xl : void 0,
borderTopRightRadius: isIOS() ? Module712.radii.xl : void 0
};
return {
container: {
flex: 1,
flexGrow: 1,
position: "relative",
...r17
},
background: {
overflow: "hidden",
...r17
},
scrollView: {
flex: 1,
...r17
},
profileEffectLayer: {
position: "absolute",
top: 0,
zIndex: 1
},
banner: {
minHeight: a0,
position: "absolute",
top: 0,
maxWidth: "100%"
},
gifTag: {
position: "absolute",
left: 16,
right: "auto",
bottom: "auto",
marginTop: 8,
backgroundColor: Module689(Module712.unsafe_rawColors.WHITE).alpha(0.9).css()
},
gifTagText: {
color: Module712.unsafe_rawColors.PRIMARY_800,
fontSize: 14
},
content: {
marginTop: a0,
flex: 1,
flexGrow: 1
}
};
});
useStyles2 = createStyles(() => ({
backButton: {
position: "absolute",
marginTop: Module712.space.PX_4,
left: Module712.space.PX_16,
zIndex: 99,
alignItems: "center",
justifyContent: "center"
}
}));
AnimatedComponent2 = ReanimatedRexport.createAnimatedComponent(ScrollView);
__initData = {
code: "function YouScreenTsx1(e){const{scrollPosition}=this.__closure;scrollPosition.set(e.contentOffset.y);}"
};
export default function YouScreen(props) {
let id, memo, callback;
const initialTab = props.initialTab;
id = void 0;
memo = void 0;
callback = void 0;
const stateFromStores = useStateFromStores([UserStore], () => UserStore.getCurrentUser());
const stateFromStores2 = useStateFromStores([LocaleStore], () => LocaleStore.locale);
id = stateFromStores?.id;
memo = useMemo(() => stateFromStores == null ? void 0 : stateFromStores.getAvatarURL(null, YOU_AVATAR_SIZE), [stateFromStores]);
useLayoutEffect(() => {
if (id != null && memo != null) {
maybeFetchUserProfile(id, memo, {
type: "you_screen"
});
}
}, [id, memo, stateFromStores2]);
useFetchWishlist({
wishlistId: useStateFromStores([UserProfileStore], () => id != null ? UserProfileStore.getFirstWishlistId(id) : null),
userId: id
});
callback = useCallback(() => {
UserSettingSearchStore.setState({
query: "",
isActive: false
});
openUserSettings();
}, []);
const callback2 = useCallback(() => {
openUserSettings({
screen: UserSettingsSections.PREMIUM
});
}, []);
const callback3 = useCallback(() => {
openCollectiblesShopMobile({
analyticsSource: AnalyticsLocation.YOU_SCREEN,
analyticsLocations: [AnalyticsLocation.YOU_SCREEN],
screen: CollectiblesMobileShopScreen.FEATURED_PAGE
});
}, []);
const callback4 = useCallback((a0) => {
openUserSettings({
screen: UserSettingsSections.PROFILE_CUSTOMIZATION,
params: {
autoFocusElement: a0
}
});
}, []);
const callback5 = useCallback(() => {
openEditCustomStatusModal({
analyticsLocations: [AnalyticsLocation.YOU_SCREEN]
});
}, []);
const callback6 = useCallback(() => {
const rootNavigationRef = getRootNavigationRef();
if (rootNavigationRef != null && rootNavigationRef.isReady()) {
rootNavigationRef.navigate("friends");
return void 0;
}
return false;
}, []);
useLayoutEffect(() => trackAppUIViewed(), []);
useScrollToTop(useRef({
scrollToTop: () => {
callback();
}
}));
return stateFromStores == null ? null : <UnconnectedYouScreen user={stateFromStores} navigateToSettings={callback} navigateToPremium={callback2} navigateToProfileCustomization={callback4} navigateToCustomStatus={callback5} navigateToFriends={callback6} navigateToShop={callback3} initialTab={initialTab} />;
};
@@ -0,0 +1,49 @@
// Metro module 15613 (f15614).
import { memo } from "react";
import { View } from "react-native";
import { RootNavigatorScreen } from "../../MainTabsConstants";
import { createStyles } from "../../../../../design/components/Styles/native/createStyles";
import Module712 from "../../../../../_bundle/Module712";
import useSafeAreaInsets_native from "../../../../safe_area/useSafeAreaInsets.native";
import { useTrackTabPerformance } from "../TabsPerformanceTracker";
import useWindowDimensions_native from "../../../../screen/useWindowDimensions.native";
import useChatLayout from "../../../../chat/native/useChatLayout";
import YouScreen from "./YouScreen";
import { isAndroid } from "../../../../../_bundle/Module501";
const useStyles = createStyles({
container: {
flex: 1,
overflow: "hidden",
alignItems: "center",
justifyContent: "center",
borderRadius: Module712.radii.xl
},
androidContainer: {
backgroundColor: Module712.colors.BACKGROUND_SCRIM,
borderRadius: Module712.radii.none
},
wrapper: {
flex: 1,
borderRadius: Module712.radii.xl,
overflow: "hidden"
}
});
const r50 = memo(function YouScreenContainer(props) {
const route = props.route;
const styles = useStyles();
const top = useSafeAreaInsets_native().top;
useTrackTabPerformance(RootNavigatorScreen.YOU);
const initialTab = route == null ? void 0 : route.params?.initialTab;
const width = useWindowDimensions_native().width;
return useChatLayout().isChatBesideChannelList ? <View style={[styles.container, isAndroid() ? {
...styles.androidContainer,
paddingTop: top
} : void 0]}>
{isAndroid() ? <View style={[styles.wrapper, {
maxWidth: 0.6 * width
}]}>
<YouScreen initialTab={initialTab} />
</View> : <YouScreen initialTab={initialTab} />}
</View> : <YouScreen initialTab={initialTab} />;
});
export default r50;
@@ -0,0 +1,124 @@
// Metro module 15625 (f15626).
import { memo, forwardRef } from "react";
import { View } from "react-native";
import * as _YouNavFloatingExperiment from "./YouNavFloatingExperiment";
import { ICON_SIZE } from "../../../../../_bundle/Module15275";
import Module712 from "../../../../../_bundle/Module712";
import ClipView, { CutoutShape } from "../../../../../design/components/Icon/native/ClipView";
import { createStyles } from "../../../../../design/components/Styles/native/createStyles";
import { intl, t } from "../../../../../intl/index.native";
import { PressableScale } from "../../../../../design/components/experimental/native";
import { Text } from "../../../../../design/components/Text/native/Text";
const r38 = _YouNavFloatingExperiment.isYouNavFloating() ? ICON_SIZE.md : ICON_SIZE.sm;
const size = _YouNavFloatingExperiment.isYouNavFloating() ? "md" : "sm";
const padding = (Module712.space.PX_32 - r38) / 2;
const TEXT_DEFAULT = _YouNavFloatingExperiment.isYouNavFloating() ? Module712.colors.TEXT_DEFAULT : Module712.colors.WHITE;
const color = _YouNavFloatingExperiment.isYouNavFloating() ? "text-default" : "text-overlay-light";
const height = _YouNavFloatingExperiment.isYouNavFloating() ? 8 : 6;
const r0 = _YouNavFloatingExperiment.isYouNavFloating() ? 4 : 2;
const cutouts = [{
shape: CutoutShape.Circle,
x: r38 - height - r0,
y: -r0,
size: height + 2 * r0
}];
const useStyles = createStyles({
container: {
backgroundColor: _YouNavFloatingExperiment.isYouNavFloating() ? void 0 : Module712.colors.CONTROL_OVERLAY_SECONDARY_BACKGROUND_DEFAULT,
borderRadius: Module712.modules.button.BORDER_RADIUS,
marginHorizontal: Module712.space.PX_4,
flexDirection: _YouNavFloatingExperiment.isYouNavFloating() ? "column" : "row",
alignItems: "center",
padding,
overflow: _YouNavFloatingExperiment.isYouNavFloating() ? void 0 : "hidden"
},
label: {
marginLeft: _YouNavFloatingExperiment.isYouNavFloating() ? void 0 : Module712.space.PX_4,
marginTop: _YouNavFloatingExperiment.isYouNavFloating() ? Module712.space.PX_4 : void 0
},
dot: {
backgroundColor: Module712.colors.BACKGROUND_FEEDBACK_NOTIFICATION,
borderRadius: Module712.radii.round,
height,
width: height,
position: "absolute",
right: 0,
top: 0
},
nitroSlant: {
backgroundColor: Module712.colors.WHITE,
transform: [{
rotate: "30deg"
}],
position: "absolute",
height: "200%",
opacity: 0.15
},
nitroSlantLarge: {
width: Module712.space.PX_12,
left: "75%"
},
nitroSlantSmall: {
width: Module712.space.PX_8,
left: "45%"
}
});
const r157 = memo(forwardRef(function(a0, a1) {
let r82, children;
const { onPress, IconComponent, accessibilityLabel } = a0;
let label = a0.label;
let showNitroSlant = a0.showNitroSlant;
if (showNitroSlant === void 0) {
showNitroSlant = false;
}
let showRedDot = a0.showRedDot;
if (showRedDot === void 0) {
showRedDot = false;
}
const styles = useStyles();
const r16 = <IconComponent size={size} color={TEXT_DEFAULT} />;
const r24 = showRedDot ? <View>
<ClipView cutouts={cutouts}>{r16}</ClipView>
<View style={styles.dot} />
</View> : r16;
const props = {
ref: a1,
style: styles.container,
accessibilityRole: "button",
accessibilityLabel,
accessibilityValue: showRedDot ? {
text: intl.string(t.y2b7CA)
} : void 0,
onPress,
hitSlop: Module712.space.PX_8,
children: null
};
if (showNitroSlant) {
showNitroSlant = !_YouNavFloatingExperiment.isYouNavFloating();
}
if (showNitroSlant) {
showNitroSlant = <>
<View style={[styles.nitroSlant, styles.nitroSlantSmall]} />
<View style={[styles.nitroSlant, styles.nitroSlantLarge]} />
</>;
}
L19: {
children = [showNitroSlant, r24, ,];
if (label == null) {
const isYouNavFloating = _YouNavFloatingExperiment.isYouNavFloating();
r82 = null;
if (!isYouNavFloating) {
break L19;
}
}
const variant = _YouNavFloatingExperiment.isYouNavFloating() ? "text-xs/semibold" : "text-sm/semibold";
if (label == null) {
label = accessibilityLabel;
}
r82 = <Text style={styles.label} variant={variant} color={color} maxFontSizeMultiplier={2}>{label}</Text>;
}
children[2] = r82;
props.children = children;
return <PressableScale {...props} />;
}));
export default r157;
@@ -0,0 +1,45 @@
// Metro module 15628 (f15629).
import { memo, useCallback } from "react";
import ReferralTrialStore from "../../../../premium/ReferralTrialStore";
import PremiumNitroNavigationStore, { NitroHomeSectionId } from "../../../../user_settings/premium/native/PremiumNitroNavigationStore";
import { ContentDismissActionType } from "../../../../dismissible_content/DismissibleContentConstants";
import { useIsEligibleSenderForReferralProgram } from "../../../../premium/referral_program/hooks/useIsEligibleSenderForReferralProgram";
import { useStateFromStores } from "../../../../../_bundle/Module589";
import { useSelectedTimeRecurringDismissibleContent } from "../../../../dismissible_content/hooks/useSelectedDismissibleContent";
import { DismissibleContent } from "../../../../../_bundle/Module1358";
import { REFERRAL_NITRO_BUTTON_RED_DOT_COOLDOWN_MS } from "./MobileReferralSubscriberProfileEntrypointButtonExperiment";
import YouScreenNavIcon from "./YouScreenNavIcon";
import { NitroWheelIcon } from "../../../../../design/components/Icon/native/redesign/generated/NitroWheelIcon";
import { intl, t } from "../../../../../intl/index.native";
const r32 = memo(function SubscriberNitroIcon(props) {
let c22257_2, c22257_3;
const onPress = props.onPress;
let showReferralNotificationDot = props.showReferralNotificationDot;
c22257_2 = void 0;
c22257_3 = void 0;
const isEligibleSenderForReferralProgram2 = useIsEligibleSenderForReferralProgram(!showReferralNotificationDot);
if (showReferralNotificationDot) {
showReferralNotificationDot = isEligibleSenderForReferralProgram2;
}
const isEligibleSenderForReferralProgram = showReferralNotificationDot;
const stateFromStores = useStateFromStores([ReferralTrialStore], () => ReferralTrialStore.getReferralsRemaining({
bypassFetch: !isEligibleSenderForReferralProgram
}), [isEligibleSenderForReferralProgram]);
const [r45, r46] = useSelectedTimeRecurringDismissibleContent(isEligibleSenderForReferralProgram ? stateFromStores != null ? stateFromStores > 0 ? DismissibleContent.REFERRAL_PROGRAM_ENTRYPOINT_NITRO_BUTTON_NOTIFICATION : null : null : null, {
cooldownDurationMs: REFERRAL_NITRO_BUTTON_RED_DOT_COOLDOWN_MS
}, void 0, true);
c22257_2 = r46;
const showRedDot = r45 === DismissibleContent.REFERRAL_PROGRAM_ENTRYPOINT_NITRO_BUTTON_NOTIFICATION;
c22257_3 = showRedDot;
const callback = useCallback(() => {
if (c22257_3) {
c22257_2(ContentDismissActionType.TAKE_ACTION);
PremiumNitroNavigationStore.setState({
scrollToSectionId: NitroHomeSectionId.REFERRAL_PROGRAM
});
}
onPress();
}, [showRedDot, r46, onPress]);
return <YouScreenNavIcon IconComponent={NitroWheelIcon} accessibilityLabel={intl.string(t.Ipxkog)} onPress={callback} showRedDot={showRedDot} />;
});
export default r32;
@@ -0,0 +1,17 @@
// Metro module 15617 (f15618).
import { useReferralProgramCoachmark } from "../../../../premium/referral_program/hooks/native/useReferralProgramCoachmark";
import { useCoachmark } from "../../../../../design/components/Coachmark/native/useCoachmark.native";
export default function YouSettingsCoachmark(a0) {
const { buttonRef, ...rest } = a0;
useCoachmark(a0.buttonRef, rest);
return null;
};
export function useYouSettingsCoachmark(a0) {
let r10 = useReferralProgramCoachmark({
disabled: a0.disabled
});
if (r10 == null) {
r10 = null;
}
return r10;
}
@@ -0,0 +1,15 @@
// Metro module 15633 (f15634).
import NoticeStore from "../../../../../premium/native/NoticeStore";
import { NoticeTypes } from "../../../../../../Constants";
import { PremiumSubscriptionSKUs } from "../../../../../premium/PremiumConstants";
import Durations from "../../../../../../utils/Durations";
import { useStateFromStores } from "../../../../../../_bundle/defaultAreStatesEqual";
import { usePremiumTrialOffer } from "../../../../../premium/hooks/usePremiumTrialOffer.android";
import useCountdown from "../../../../../../hooks/useCountdown";
let c11156_6 = 10 * Durations.Millis.SECOND;
export function useShouldShowExpiringTrialOfferCard() {
const stateFromStores = useStateFromStores([NoticeStore], () => NoticeStore.getNoticeType());
const premiumTrialOffer = usePremiumTrialOffer();
const countdown = useCountdown(premiumTrialOffer != null ? premiumTrialOffer.expires_at != null ? Date.parse(premiumTrialOffer.expires_at) : 0 : 0, c11156_6);
return premiumTrialOffer != null && stateFromStores != null && (stateFromStores === NoticeTypes.PREMIUM_TIER_0_TRIAL_ENDING || stateFromStores === NoticeTypes.PREMIUM_TIER_2_TRIAL_ENDING) && premiumTrialOffer.subscription_trial?.sku_id === (stateFromStores == null ? PremiumSubscriptionSKUs.NONE : NoticeTypes.PREMIUM_TIER_2_TRIAL_ENDING === stateFromStores ? PremiumSubscriptionSKUs.TIER_2 : NoticeTypes.PREMIUM_TIER_0_TRIAL_ENDING === stateFromStores ? PremiumSubscriptionSKUs.TIER_0 : PremiumSubscriptionSKUs.NONE) && premiumTrialOffer.expires_at != null && !Object.values(countdown).every((item) => item === 0);
}
@@ -0,0 +1,20 @@
// Metro module 15624 (f15625).
import { AnalyticEvents } from "../../../../../../Constants";
import AnalyticsUtils from "../../../../../../utils/AnalyticsUtils";
export function trackYouTabAvatarPress() {
AnalyticsUtils.track(AnalyticEvents.YOU_TAB_AVATAR_PRESS);
}
export function trackYouTabCustomStatusPress() {
AnalyticsUtils.track(AnalyticEvents.YOU_TAB_CUSTOM_STATUS_PRESS);
}
export function trackYouTabEditProfilePress() {
AnalyticsUtils.track(AnalyticEvents.YOU_TAB_EDIT_PROFILE_PRESS);
}
export function trackYouTabNitroIconPress() {
AnalyticsUtils.track(AnalyticEvents.YOU_TAB_NITRO_ICON_PRESS);
}
export function trackYouTabSettingsIconPress(a0) {
AnalyticsUtils.track(AnalyticEvents.YOU_TAB_SETTINGS_ICON_PRESS, {
has_badge: a0.isBadged
});
}
@@ -0,0 +1,9 @@
// Metro module 15243 (f15244).
import { YOU_ACCOUNT_ACTION_SHEET_KEY } from "../YouConstants";
import ActionSheetActionCreators from "../../../../../action_sheet/native/ActionSheetActionCreators";
export function showYouAccountActionSheet(statusOnly = false, disableHapticOnOpen = true) {
ActionSheetActionCreators.openLazy(import("../YouAccountActionSheet"), YOU_ACCOUNT_ACTION_SHEET_KEY, {
statusOnly,
disableHapticOnOpen
});
}