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,123 @@
// Metro module 15576 (f15577).
import { useLayoutEffect } from "react";
import { View } from "react-native";
import { createNativeStackNavigator } from "../../../../_bundle/Module9109";
import { createStyles } from "../../../../design/components/Styles/native/createStyles";
import Module712 from "../../../../_bundle/Module712";
import PressableNavigatorButtonWrapper from "../shared_components/navigator/PressableNavigatorButtonWrapper";
import { HeaderIconButton, GenericHeaderTitle, getRenderModalCloseImage, getRenderModalBackImage, HeaderTextButton } from "../shared_components/HeaderShared";
import Module11690 from "../../../../_bundle/Module11690";
import { intl, t } from "../../../../intl/index.native";
import useThemedHeaderOptions from "../../../client_themes/native/useThemedHeaderOptions";
import { trackAppUIViewed } from "../../../tti_analytics/native/TTIAnalyticsUtils";
import { useAccessibilityNativeStackOptions } from "../../../../design/components/Navigator/native/Navigator.native";
import * as _FriendsScreen from "./screens/FriendsScreen";
import * as _NewMessageScreen from "./screens/NewMessageScreen";
import * as _NewGroupDMScreen from "./screens/NewGroupDMScreen";
import * as _AddFriendScreen from "./screens/AddFriendScreen";
import * as _AddFriendsScreen from "./screens/AddFriendsScreen";
import * as _UsernameSearchScreen from "./screens/UsernameSearchScreen";
import * as _SuggestedFriendsScreen from "./screens/SuggestedFriendsScreen";
import * as _FriendRequestsSettingsScreen from "./screens/FriendRequestsSettingsScreen";
import * as _FriendRequestsScreen from "./screens/FriendRequestsScreen";
import * as _SpamRequestsScreen from "./screens/SpamRequestsScreen";
import * as _IgnoredUserRequestsScreen from "./screens/IgnoredUserRequestsScreen";
import useColorThemeBackground from "../../../client_themes/native/useColorThemeBackground";
import useSafeAreaInsets_native from "../../../safe_area/useSafeAreaInsets.native";
import { ThemeContextProvider } from "../../../../_bundle/Module3901";
import { HermesBuiltin } from "../../../../_hermes/prelude";
let nativeStackNavigator, useStyles, FriendsNavigator;
const RequestsSettingsModalButton = function RequestsSettingsModalButton(props) {
return <PressableNavigatorButtonWrapper isModal>
<HeaderIconButton source={Module11690} onPress={props.onPress} accessibilityLabel={intl.string(t["3D5yo/"])} />
</PressableNavigatorButtonWrapper>;
};
FriendsNavigator = function FriendsNavigator() {
let accessibilityNativeStackOptions;
const styles = useStyles();
let c22206_1 = useThemedHeaderOptions();
useLayoutEffect(() => trackAppUIViewed(), []);
accessibilityNativeStackOptions = useAccessibilityNativeStackOptions();
return <nativeStackNavigator.Navigator screenOptions={({ navigation: navigation3, route }) => {
const presentation = route.params?.presentation;
const r15 = {};
HermesBuiltin.copyDataProperties(r15, c22206_1);
const presentation2 = route.params?.presentation;
const r19 = presentation === "card";
r15.contentStyle = presentation2 !== "card" ? r19 ? null : c22206_1.contentStyle : null;
r15.headerStyle = styles.header;
r15.headerShadowVisible = false;
r15.headerTitle = (a0) => {
const { children, ...rest } = a0;
return <GenericHeaderTitle title={a0.children} {...rest} />;
};
r15.headerTitleAlign = "center";
r15.headerLeft = navigation3.getState().routes[0].key === route.key ? route.params?.presentation !== "card" ? getRenderModalCloseImage(navigation3) : getRenderModalBackImage(navigation3) : getRenderModalBackImage(navigation3);
r15.fullScreenGestureEnabled = route.params?.presentation === "card" || r19;
HermesBuiltin.copyDataProperties(r15, accessibilityNativeStackOptions);
return r15;
}}>
<nativeStackNavigator.Screen name="root" options={({ navigation }) => ({
title: intl.string(t.TdEu5X),
headerRight: (a0) => <HeaderTextButton {...a0} label={intl.string(t.zIJnA6)} onPress={() => navigation.navigate("add-friends", {
sourcePage: "Friends Screen Header"
})} />
})} getComponent={() => _FriendsScreen.default} />
<nativeStackNavigator.Screen name="new-message" options={{
title: intl.string(t.jD1qzM)
}} getComponent={() => _NewMessageScreen.default} />
<nativeStackNavigator.Screen name="gdm" options={{
title: intl.string(t["3hF1W4"])
}} getComponent={() => _NewGroupDMScreen.default} />
<nativeStackNavigator.Screen name="add-friend" options={{
title: intl.string(t.w5uwoI)
}} getComponent={() => _AddFriendScreen.default} />
<nativeStackNavigator.Screen name="add-friends" options={{
title: intl.string(t.zIJnA6)
}} getComponent={() => _AddFriendsScreen.default} />
<nativeStackNavigator.Screen name="username-search" options={{
title: intl.string(t.QzVsOs)
}} getComponent={() => _UsernameSearchScreen.default} />
<nativeStackNavigator.Screen name="suggested-friends" options={{
title: intl.string(t["1uAmCw"])
}} getComponent={() => _SuggestedFriendsScreen.default} />
<nativeStackNavigator.Screen name="requests-settings" options={{
title: intl.string(t.XT4hVl)
}} getComponent={() => _FriendRequestsSettingsScreen.default} />
<nativeStackNavigator.Screen name="requests" options={({ navigation: navigation2 }) => ({
title: intl.string(t.fyA115),
headerRight: () => <RequestsSettingsModalButton onPress={() => navigation2.navigate("requests-settings")} />
})} getComponent={() => _FriendRequestsScreen.default} />
<nativeStackNavigator.Screen name="spam-requests" options={{
title: intl.string(t.oHVeHc)
}} getComponent={() => _SpamRequestsScreen.default} />
<nativeStackNavigator.Screen name="ignored-user-requests" options={{
title: intl.string(t.tFY5Zb)
}} getComponent={() => _IgnoredUserRequestsScreen.default} />
</nativeStackNavigator.Navigator>;
};
nativeStackNavigator = createNativeStackNavigator();
useStyles = createStyles({
container: {
flex: 1,
backgroundColor: Module712.colors.BACKGROUND_BASE_LOWEST
},
header: {
borderBottomWidth: 0,
backgroundColor: Module712.colors.MOBILE_ACTIONSHEET_BACKGROUND,
shadowColor: "transparent"
}
});
export default function ThemedFriendsNavigator() {
const colorThemeBackground = useColorThemeBackground();
const safeAreaInsets_native = useSafeAreaInsets_native();
const { left, right } = safeAreaInsets_native;
return <ThemeContextProvider gradient={colorThemeBackground}>
<View style={[useStyles().container, {
paddingLeft: left,
paddingRight: right
}]}>
<FriendsNavigator />
</View>
</ThemeContextProvider>;
};
@@ -0,0 +1,133 @@
// Metro module 15312 (f15313).
import { createStyles } from "../../../../../design/components/Styles/native/createStyles";
import { AccessibilityAnnouncer } from "../../../../../_bundle/Module3902";
import * as _ReanimatedRexport from "../../../../reanimated/ReanimatedRexport";
import ReanimatedRexport, { useAnimatedStyle, useAnimatedReaction } from "../../../../reanimated/ReanimatedRexport";
import { Text } from "../../../../../design/components/Text/native/Text";
import { useFontScale } from "../../../../screen/native/useFontScale";
import * as _timing from "../../../../../design/animation/reanimated/timing/timing";
let useStyles, AnimatedComponent, __initData, __initData2, __initData3, __initData4, __initData5;
const announceActioned = function announceActioned(a0) {
AccessibilityAnnouncer.announce(a0);
};
useStyles = createStyles(() => ({
container: {
overflow: "hidden"
},
actionStatus: {
position: "absolute"
}
}));
AnimatedComponent = ReanimatedRexport.createAnimatedComponent(Text);
__initData = {
code: "function ActionStatusSubLabelTsx1(){const{hasSecondLine,actioned,lineHeight,fontScale,animate,withTiming,interpolate}=this.__closure;const currentlyHasSecondLine=hasSecondLine&&!actioned.get();const lineHeightValue=lineHeight*fontScale;const currentLineHeightValue=currentlyHasSecondLine?lineHeightValue*2:lineHeightValue;return{height:!animate||!actioned.get()?currentLineHeightValue:withTiming(interpolate(actioned.get()?1:0,[0,1],[currentlyHasSecondLine?lineHeightValue*2:lineHeightValue,lineHeightValue]))};}"
};
__initData2 = {
code: "function ActionStatusSubLabelTsx2(){const{actioned,lineHeight,fontScale,animate,withTiming,interpolate}=this.__closure;const translateYValue=actioned.get()?lineHeight*fontScale:0;return{transform:[{translateY:!animate?translateYValue:withTiming(interpolate(actioned.get()?1:0,[0,1],[0,translateYValue]))}]};}"
};
__initData3 = {
code: "function ActionStatusSubLabelTsx3(){const{actioned,lineHeight,fontScale,animate,withTiming,interpolate}=this.__closure;const translateYValue=actioned.get()?0:-lineHeight*fontScale;return{transform:[{translateY:!animate?translateYValue:withTiming(interpolate(actioned.get()?1:0,[0,1],[translateYValue,0]))}],opacity:!animate?actioned.get()?1:0:withTiming(actioned.get()?1:0)};}"
};
__initData4 = {
code: "function ActionStatusSubLabelTsx4(){const{actioned}=this.__closure;return actioned.get();}"
};
__initData5 = {
code: "function ActionStatusSubLabelTsx5(actioned,actionedPrev){const{actionStatusAccessibilityLabel,runOnJS,announceActioned}=this.__closure;const isActioned=actioned&&actionedPrev===false;if(!isActioned||actionStatusAccessibilityLabel==null){return;}runOnJS(announceActioned)(actionStatusAccessibilityLabel);}"
};
export function ActionStatusSubLabel(props) {
let lineHeight = props.lineHeight;
if (lineHeight === void 0) {
lineHeight = 16;
}
let c21862_0 = lineHeight;
const { textVariant = "text-xs/medium", actioned, label, secondaryLabel, actionStatus, actionStatusAccessibilityLabel, maxFontSizeMultiplier, animate } = props;
let hasSecondLine = secondaryLabel != null;
let c21862_4 = hasSecondLine;
const fontScale = useFontScale();
const styles = useStyles();
const L = function L() {
const r2 = c21862_4 && !actioned.get();
const r11 = c21862_0 * fontScale;
const r16 = r2 ? 2 * r11 : r11;
return {
height: animate ? actioned.get() ? _timing.withTiming(_ReanimatedRexport.interpolate(actioned.get() ? 1 : 0, [0, 1], [r2 ? 2 * r11 : r11, r11])) : r16 : r16
};
};
L.__closure = {
hasSecondLine,
actioned,
lineHeight,
fontScale,
animate,
withTiming: _timing.withTiming,
interpolate: _ReanimatedRexport.interpolate
};
L.__workletHash = 14210085997091;
L.__initData = __initData;
const animatedStyle = useAnimatedStyle(L);
const y = function y() {
const r11 = actioned.get() ? c21862_0 * fontScale : 0;
return {
transform: [{
translateY: animate ? _timing.withTiming(_ReanimatedRexport.interpolate(actioned.get() ? 1 : 0, [0, 1], [0, r11])) : r11
}]
};
};
y.__closure = {
actioned,
lineHeight,
fontScale,
animate,
withTiming: _timing.withTiming,
interpolate: _ReanimatedRexport.interpolate
};
y.__workletHash = 1040596522101;
y.__initData = __initData2;
const animatedStyle2 = useAnimatedStyle(y);
const V = function V() {
const r13 = actioned.get() ? 0 : -c21862_0 * fontScale;
return {
transform: [{
translateY: animate ? _timing.withTiming(_ReanimatedRexport.interpolate(actioned.get() ? 1 : 0, [0, 1], [r13, 0])) : r13
}],
opacity: animate ? _timing.withTiming(actioned.get() ? 1 : 0) : actioned.get() ? 1 : 0
};
};
V.__closure = {
actioned,
lineHeight,
fontScale,
animate,
withTiming: _timing.withTiming,
interpolate: _ReanimatedRexport.interpolate
};
V.__workletHash = 2183035188794;
V.__initData = __initData3;
const animatedStyle3 = useAnimatedStyle(V);
const Y = () => actioned.get();
Y.__closure = {
actioned
};
Y.__workletHash = 9609826744629;
Y.__initData = __initData4;
const v = function v(a0, a1) {
if ((a0 ? a1 === false : a0) && actionStatusAccessibilityLabel != null) {
_ReanimatedRexport.runOnJS(announceActioned)(actionStatusAccessibilityLabel);
}
};
v.__closure = {
actionStatusAccessibilityLabel,
runOnJS: _ReanimatedRexport.runOnJS,
announceActioned
};
v.__workletHash = 14141240445417;
v.__initData = __initData5;
useAnimatedReaction(Y, v);
const r93 = [<AnimatedComponent variant={textVariant} maxFontSizeMultiplier={maxFontSizeMultiplier} color="text-default" style={animatedStyle2} lineClamp={1}>{label}</AnimatedComponent>, , ,];
if (hasSecondLine) {
hasSecondLine = <AnimatedComponent variant={textVariant} maxFontSizeMultiplier={maxFontSizeMultiplier} style={animatedStyle2} color="text-default" lineClamp={1}>{secondaryLabel}</AnimatedComponent>;
}
r93[1] = hasSecondLine;
r93[2] = <AnimatedComponent variant={textVariant} maxFontSizeMultiplier={maxFontSizeMultiplier} color="text-default" style={[styles.actionStatus, animatedStyle3]} lineClamp={1}>{actionStatus}</AnimatedComponent>;
return <ReanimatedRexport.View style={[styles.container, animatedStyle]}>{r93}</ReanimatedRexport.View>;
}
@@ -0,0 +1,66 @@
// Metro module 15603 (f15604).
import { Image as Image2, View } from "react-native";
import { createStyles } from "../../../../../design/components/Styles/native/createStyles";
import Module712 from "../../../../../_bundle/Module712";
import Module11784 from "../../../../../_bundle/Module11784";
import { Text } from "../../../../../design/components/Text/native/Text";
import { intl, t } from "../../../../../intl/index.native";
import { handleOpenLearnMoreLink } from "../../../../contact_sync/native/ContactSyncUtils";
import { Button } from "../../../../../design/components/Button/native/Button.native";
import { openContactSyncModal } from "../../../../contact_sync/native/ContactSyncModalActionCreators";
const useStyles = createStyles({
content: {
alignItems: "center",
marginTop: Module712.space.PX_24,
marginHorizontal: Module712.space.PX_16,
paddingBottom: Module712.space.PX_12,
backgroundColor: Module712.colors.CARD_BACKGROUND_DEFAULT,
borderRadius: Module712.radii.lg
},
headerImage: {
height: 135,
width: 216,
marginTop: Module712.space.PX_24,
marginBottom: Module712.space.PX_16
},
title: {
marginBottom: Module712.space.PX_8,
width: "100%",
textAlign: "center"
},
subtitle: {
marginBottom: Module712.space.PX_24,
paddingHorizontal: Module712.space.PX_48,
width: "100%",
alignContent: "center"
},
subtitleText: {
textAlign: "center"
},
trailing: {
width: "100%",
paddingBottom: Module712.space.PX_4,
paddingHorizontal: Module712.space.PX_12
}
});
export default function AddFriendsContactSyncEmptyState() {
const styles = useStyles();
return <View style={styles.content}>
<Image2 resizeMode="contain" style={styles.headerImage} source={Module11784} />
<Text style={styles.title} variant="heading-lg/bold" color="mobile-text-heading-primary">
{intl.string(t["/G+nci"])}
</Text>
<View style={styles.subtitle}>
<Text style={styles.subtitleText} variant="text-sm/medium">
{intl.format(t.OXdOPf, {
learnMoreHook: handleOpenLearnMoreLink
})}
</Text>
</View>
<View style={styles.trailing}>
<Button variant="primary" size="lg" text={intl.string(t.QUXSpo)} onPress={function onPress() {
openContactSyncModal({}, "Add Friends Contact Sync Empty State");
}} />
</View>
</View>;
};
@@ -0,0 +1,111 @@
// Metro module 15041 (f15042).
import ChannelStore from "../../../../../stores/ChannelStore";
import { AnalyticsSections } from "../../../../../Constants";
import { MessageSendLocation } from "../../../../messages/MessageConstants";
import PeopleUtils from "../../../../people/PeopleUtils";
import ChannelActionCreators from "../../../../../actions/ChannelActionCreators";
import { presentError } from "../../../../toast/native/ToastUtils";
import { intl, t } from "../../../../../intl/index.native";
import { trackWaveCtaClicked } from "../../../../channel/trackWaveCtaClicked";
import MessageActionCreators from "../../../../../actions/MessageActionCreators";
import RelationshipActionCreators from "../../../../../actions/RelationshipActionCreators";
export function dismissIncomingRequest(a0) {
PeopleUtils.cancelFriendRequest({
userId: a0.userId,
applicationId: a0.applicationId,
location: AnalyticsSections.FRIENDS_ADD_FRIENDS_MODAL
});
}
export function acceptIncomingRequest(a0) {
PeopleUtils.maybeConfirmFriendRequestAccept({
userId: a0.userId,
applicationId: a0.applicationId,
location: AnalyticsSections.FRIENDS_ADD_FRIENDS_MODAL
});
}
export async function sendWave(c27935_0, c27935_1, c27935_2) {
let c27935_6 = 0;
let c30833_1, c30833_2, c30833_0, c30833_3;
L17: {
try {
c30833_1 = void 0;
c30833_2 = void 0;
c30833_0 = c27935_0;
if (c27935_1 !== void 0) {
c30833_1 = c27935_1;
c30833_2 = c27935_2;
c30833_3 = void 0;
} else {
c30833_1 = true;
c30833_2 = c27935_2;
c30833_3 = void 0;
}
await void 0;
c30833_3 = ChannelStore.getDMFromUserId(c30833_0);
if (c30833_3 == null) {
c27935_6 = 1;
c30833_3 = await ChannelActionCreators.getDMChannel(c30833_0);
c27935_6 = 0;
}
c27935_6 = 2;
if (c30833_3 != null) {
trackWaveCtaClicked({
channelId: c30833_3,
source: c30833_2
});
await MessageActionCreators.sendStickers(c30833_3, ["749054660769218631"], "", {
location: MessageSendLocation.SEND_WAVE
});
if (c30833_1) {
ChannelActionCreators.openPrivateChannel({
recipientIds: c30833_0
});
}
}
c27935_6 = 0;
} catch ($e) {
let r8 = $e;
let r39 = c27935_6;
if (r39 !== 0) {
while (true) {
if (r39 === 1) {
try {
c27935_6 = 0;
presentError(intl.string(t.iufib1));
} catch ($e) {
r8 = $e;
r39 = c27935_6;
if (r39 === 0) {
break;
}
continue;
}
return void 0;
}
try {
c27935_6 = 0;
presentError(intl.string(t.iufib1));
break L17;
} catch ($e) {
r8 = $e;
r39 = c27935_6;
if (r39 === 0) {
break;
}
}
}
}
throw r8;
}
}
}
export function addContactSuggestion(a0) {
RelationshipActionCreators.addRelationship({
userId: a0.id,
context: {
location: AnalyticsSections.FRIENDS_ADD_FRIENDS_MODAL
},
type: void 0,
fromFriendSuggestion: true
});
}
@@ -0,0 +1,17 @@
// Metro module 15609 (f15610).
import RelationshipActionCreators from "../../../../../actions/RelationshipActionCreators";
import { AlertModal, AlertActionButton } from "../../../../../design/components/AlertModal/native/AlertModal.native";
import { intl, t } from "../../../../../intl/index.native";
import { AlertActions } from "../../../../../design/components/AlertModal/native/AlertModal.native";
const handleConfirm = async function handleConfirm() {
await RelationshipActionCreators.clearPendingRelationships();
};
export default function ClearAllIncomingRequestsAlertModal(props) {
const incomingRequestCount = props.incomingRequestCount;
return <AlertModal title={intl.string(t.z2pFjo)} content={intl.formatToPlainString(t["0nTvEw"], {
incomingRequestCount
})} actions={<AlertActions>
<AlertActionButton key="confirm" variant="destructive" onPress={handleConfirm} text={intl.string(t["cY+Oob"])} />
<AlertActionButton key="cancel" variant="secondary" text={intl.string(t["ETE/oC"])} />
</AlertActions>} />;
};
@@ -0,0 +1,195 @@
// Metro module 15313 (f15314).
import { useCallback } from "react";
import { View } from "react-native";
import * as _ReanimatedRexport from "../../../../reanimated/ReanimatedRexport";
import ReanimatedRexport, { Easing, useSharedValue, useAnimatedStyle, useAnimatedReaction } from "../../../../reanimated/ReanimatedRexport";
import { createStyles } from "../../../../../design/components/Styles/native/createStyles";
import Module712 from "../../../../../_bundle/Module712";
import { addContactSuggestion } from "./AddFriendsScreenUtils";
import * as _timing from "../../../../../design/animation/reanimated/timing/timing";
import * as _spring from "../../../../../design/animation/reanimated/spring/spring";
import { Icon } from "../../../../../design/void/native";
import Module15314 from "../../../../../_bundle/Module15314";
import { Button } from "../../../../../design/components/Button/native/Button.native";
import { intl, t } from "../../../../../intl/index.native";
const OPACITY_CONFIG = {
duration: 200,
easing: Easing.in(Easing.quad)
};
const OPACITY_OUT_CONFIG = {
duration: 250,
easing: Easing.in(Easing.quad)
};
const SCALE_CONFIG = {
duration: 250,
easing: Easing.in(Easing.quad)
};
const TRANSLATE_OUT_CONFIG = {
duration: 250,
easing: Easing.out(Easing.quad)
};
const SPRING_CONFIG = {
mass: 1,
stiffness: 172,
damping: 17.3
};
const useStyles = createStyles({
icon: {
position: "absolute",
top: 4,
zIndex: 2,
color: Module712.colors.INTERACTIVE_TEXT_DEFAULT,
opacity: 0
}
});
const __initData = {
code: "function ContactSuggestionActionsTsx1(){const{right,opacity,scale}=this.__closure;return{right:right.get(),opacity:opacity.get(),transform:[{scale:scale.get()}]};}"
};
const __initData2 = {
code: "function ContactSuggestionActionsTsx2(){const{buttonOpacity}=this.__closure;return{opacity:buttonOpacity.get()};}"
};
const __initData3 = {
code: "function ContactSuggestionActionsTsx3(){const{added}=this.__closure;return added.get();}"
};
const __initData4 = {
code: "function ContactSuggestionActionsTsx4(added){const{animate,runOnJS,finishAnimationCallback,scale,withTiming,SCALE_CONFIG,opacity,OPACITY_CONFIG,buttonOpacity,right,withSpring,SPRING_CONFIG,withDelay,OPACITY_OUT_CONFIG,TRANSLATE_OUT_CONFIG}=this.__closure;if(!animate){runOnJS(finishAnimationCallback)();return;}if(added){scale.set(withTiming(1,SCALE_CONFIG));opacity.set(withTiming(1,OPACITY_CONFIG));buttonOpacity.set(withTiming(0,OPACITY_CONFIG));right.set(withSpring(12,SPRING_CONFIG,'respect-motion-settings',function(finished){if(!finished)return;opacity.set(withDelay(1000,withTiming(0,OPACITY_OUT_CONFIG)));scale.set(withDelay(1000,withTiming(0.5,SCALE_CONFIG)));right.set(withDelay(1000,withTiming(-8,TRANSLATE_OUT_CONFIG,'respect-motion-settings',function(finished){if(finished)runOnJS(finishAnimationCallback)();})));}));}else{buttonOpacity.set(1);scale.set(0.5);opacity.set(0);right.set(30);}}"
};
const __initData5 = {
code: "function ContactSuggestionActionsTsx5(finished){const{opacity,withDelay,withTiming,OPACITY_OUT_CONFIG,scale,SCALE_CONFIG,right,TRANSLATE_OUT_CONFIG,runOnJS,finishAnimationCallback}=this.__closure;if(!finished)return;opacity.set(withDelay(1000,withTiming(0,OPACITY_OUT_CONFIG)));scale.set(withDelay(1000,withTiming(0.5,SCALE_CONFIG)));right.set(withDelay(1000,withTiming(-8,TRANSLATE_OUT_CONFIG,'respect-motion-settings',function(finished){if(finished)runOnJS(finishAnimationCallback)();})));}"
};
const __initData6 = {
code: "function ContactSuggestionActionsTsx6(finished){const{runOnJS,finishAnimationCallback}=this.__closure;if(finished)runOnJS(finishAnimationCallback)();}"
};
export function ContactSuggestionActions(props) {
const { user, added, onAddSuggestion, onFinishAnimation, size = "sm", animate } = props;
const styles = useStyles();
const sharedValue = useSharedValue(30);
const sharedValue2 = useSharedValue(0.5);
const sharedValue3 = useSharedValue(0);
const sharedValue4 = useSharedValue(1);
const callback = useCallback(() => {
if (onFinishAnimation != null) {
setTimeout(() => {
onFinishAnimation(user);
}, 1000);
}
}, [onFinishAnimation, user]);
const b = () => ({
right: sharedValue.get(),
opacity: sharedValue3.get(),
transform: [{
scale: sharedValue2.get()
}]
});
b.__closure = {
right: sharedValue,
opacity: sharedValue3,
scale: sharedValue2
};
b.__workletHash = 13774422449074;
b.__initData = __initData;
const animatedStyle = useAnimatedStyle(b);
const E = () => ({
opacity: sharedValue4.get()
});
E.__closure = {
buttonOpacity: sharedValue4
};
E.__workletHash = 4378005846847;
E.__initData = __initData2;
const animatedStyle2 = useAnimatedStyle(E);
const callback2 = useCallback(() => {
addContactSuggestion(user);
onAddSuggestion(user);
added.set(true);
if (!animate) {
sharedValue.set(12);
sharedValue3.set(1);
sharedValue2.set(1);
sharedValue4.set(0);
}
}, [onAddSuggestion, user, added, animate, sharedValue, sharedValue3, sharedValue2, sharedValue4]);
const k = () => added.get();
k.__closure = {
added
};
k.__workletHash = 15816115253403;
k.__initData = __initData3;
const D = function D(a0) {
if (animate) {
if (a0) {
sharedValue2.set(_timing.withTiming(1, SCALE_CONFIG));
sharedValue3.set(_timing.withTiming(1, OPACITY_CONFIG));
sharedValue4.set(_timing.withTiming(0, OPACITY_CONFIG));
const r76 = function n(a0) {
if (a0) {
sharedValue3.set(_ReanimatedRexport.withDelay(1000, _timing.withTiming(0, OPACITY_OUT_CONFIG)));
sharedValue2.set(_ReanimatedRexport.withDelay(1000, _timing.withTiming(0.5, SCALE_CONFIG)));
const r47 = function n(a0) {
if (a0) {
_ReanimatedRexport.runOnJS(callback)();
}
};
r47.__closure = {
runOnJS: _ReanimatedRexport.runOnJS,
finishAnimationCallback: callback
};
r47.__workletHash = 5242616772399;
r47.__initData = __initData6;
sharedValue.set(_ReanimatedRexport.withDelay(1000, _timing.withTiming(-8, TRANSLATE_OUT_CONFIG, "respect-motion-settings", r47)));
}
};
r76.__closure = {
opacity: sharedValue3,
withDelay: _ReanimatedRexport.withDelay,
withTiming: _timing.withTiming,
OPACITY_OUT_CONFIG,
scale: sharedValue2,
SCALE_CONFIG,
right: sharedValue,
TRANSLATE_OUT_CONFIG,
runOnJS: _ReanimatedRexport.runOnJS,
finishAnimationCallback: callback
};
r76.__workletHash = 9570116008915;
r76.__initData = __initData5;
sharedValue.set(_spring.withSpring(12, SPRING_CONFIG, "respect-motion-settings", r76));
} else {
sharedValue4.set(1);
sharedValue2.set(0.5);
sharedValue3.set(0);
sharedValue.set(30);
}
} else {
_ReanimatedRexport.runOnJS(callback)();
}
};
D.__closure = {
animate,
runOnJS: _ReanimatedRexport.runOnJS,
finishAnimationCallback: callback,
scale: sharedValue2,
withTiming: _timing.withTiming,
SCALE_CONFIG,
opacity: sharedValue3,
OPACITY_CONFIG,
buttonOpacity: sharedValue4,
right: sharedValue,
withSpring: _spring.withSpring,
SPRING_CONFIG,
withDelay: _ReanimatedRexport.withDelay,
OPACITY_OUT_CONFIG,
TRANSLATE_OUT_CONFIG
};
D.__workletHash = 6602847520399;
D.__initData = __initData4;
useAnimatedReaction(k, D);
return <View>
<ReanimatedRexport.View pointerEvents="none" style={[styles.icon, animatedStyle]}>
<Icon source={Module15314} color={styles.icon.color} />
</ReanimatedRexport.View>
<ReanimatedRexport.View style={animatedStyle2}>
<Button variant="secondary" size={size} grow={false} text={intl.string(t.OYkgVk)} onPress={callback2} />
</ReanimatedRexport.View>
</View>;
}
@@ -0,0 +1,65 @@
// Metro module 15602 (f15603).
import { useEffect, useMemo, useCallback } from "react";
import AccessibilityStore from "../../../../a11y/AccessibilityStore";
import { AnalyticEvents, InstantInviteSources, RelationshipTypes } from "../../../../../Constants";
import UserUtils from "../../../../../utils/UserUtils";
import { useSharedValue } from "../../../../reanimated/ReanimatedRexport";
import { intl, t } from "../../../../../intl/index.native";
import { useStateFromStores } from "../../../../../_bundle/defaultAreStatesEqual";
import { addContactSuggestion } from "./AddFriendsScreenUtils";
import { getSuggestedContactNameForSuggestion } from "../../../../friend_suggestions/FriendSuggestionUtils";
import UserRow from "../../shared_components/user_list/UserRow";
import { ActionStatusSubLabel } from "./ActionStatusSubLabel";
import { ContactSuggestionActions } from "./ContactSuggestionActions";
import AnalyticsUtils from "../../../../../utils/AnalyticsUtils";
let c11127_9 = {
ADD: "add"
};
export function ContactSuggestionRow(props) {
const { suggestedFriend, added, onAddSuggestion: onAddSuggestion2, ...props2 } = props;
let c22239_3 = props2;
const label = suggestedFriend.friendSuggestionName != null && suggestedFriend.friendSuggestionName.length > 0 ? suggestedFriend.friendSuggestionName : UserUtils.getName(suggestedFriend.user);
const sharedValue = useSharedValue(false);
useEffect(() => {
sharedValue.set(added);
}, [added, sharedValue]);
const memo = useMemo(() => added ? [] : [{
name: c11127_9.ADD,
label: intl.string(t["ed99+i"])
}], [added]);
const stateFromStores = useStateFromStores([AccessibilityStore], () => AccessibilityStore.useReducedMotion);
const callback = useCallback((a0) => {
if (a0.nativeEvent.actionName === c11127_9.ADD) {
sharedValue.set(true);
onAddSuggestion2(suggestedFriend.user);
return addContactSuggestion(suggestedFriend.user);
}
}, [sharedValue, onAddSuggestion2, suggestedFriend.user]);
const r58 = suggestedFriend?.mutualFriendsCount != null && suggestedFriend?.mutualFriendsCount > 0;
const suggestedContactNameForSuggestion = getSuggestedContactNameForSuggestion(label, suggestedFriend);
const label2 = suggestedContactNameForSuggestion != null ? `${UserUtils.getUserTag(suggestedFriend.user)} · ${suggestedContactNameForSuggestion}` : UserUtils.getUserTag(suggestedFriend.user);
let secondaryLabel = void 0;
if (r58) {
const z7y34b = t.z7y34b;
let count = suggestedFriend?.mutualFriendsCount;
if (count == null) {
count = "";
}
secondaryLabel = intl.formatToPlainString(z7y34b, {
count
});
}
return <UserRow {...props2} user={suggestedFriend.user} type={RelationshipTypes.SUGGESTION} accessibilityActions={memo} onAccessibilityAction={callback} labelLineClamp={1} subLabelLineClamp={1} label={label} subLabel={<ActionStatusSubLabel actioned={sharedValue} label={label2} secondaryLabel={secondaryLabel} actionStatus={intl.string(t.Kzyxm9)} animate={!stateFromStores} />} trailing={<ContactSuggestionActions user={suggestedFriend.user} added={sharedValue} onAddSuggestion={(event) => {
const FRIEND_SUGGESTION_ADDED = AnalyticEvents.FRIEND_SUGGESTION_ADDED;
let location2 = c22239_3.location;
if (location2 == null) {
location2 = InstantInviteSources.ADD_FRIENDS_MODAL;
}
AnalyticsUtils.track(FRIEND_SUGGESTION_ADDED, {
suggested_user_id: event.id,
suggestion_source: suggestedFriend.source,
location: location2
});
onAddSuggestion2(event);
}} animate={!stateFromStores} />} />;
}
@@ -0,0 +1,125 @@
// Metro module 15600 (f15601).
import { useEffect, useMemo, useCallback } from "react";
import AccessibilityStore from "../../../../a11y/AccessibilityStore";
import ApplicationStore from "../../../../applications/ApplicationStore";
import { UserRowModes } from "../../shared_components/user_list/UserRowConstants";
import { RelationshipTypes } from "../../../../../Constants";
import { useSharedValue } from "../../../../reanimated/ReanimatedRexport";
import { useStateFromStores } from "../../../../../_bundle/defaultAreStatesEqual";
import { intl, t } from "../../../../../intl/index.native";
import UserUtils from "../../../../../utils/UserUtils";
import { acceptIncomingRequest, dismissIncomingRequest, sendWave } from "./AddFriendsScreenUtils";
import ApplicationIconAndName from "../../../../user_profile/native/ApplicationIconAndName";
import UserRow from "../../shared_components/user_list/UserRow";
import { ActionStatusSubLabel } from "./ActionStatusSubLabel";
import { IncomingRequestRowActions } from "./IncomingRequestRowActions";
import { HermesBuiltin } from "../../../../../_hermes/prelude";
let c11125_9, IncomingGameFriendRequestRow;
const IncomingRequestRow = function IncomingRequestRow(props) {
let userTag, stateFromStores;
const { user, applicationId, accepted, onAcceptIncomingRequest, onDeclineIncomingRequest, accessibilityLabel, acceptRequestAccessibilityLabel, ignoreRequestAccessibilityLabel, acceptedRequestLabel, acceptedRequestAccessibilityLabel, ...props2 } = props;
userTag = void 0;
stateFromStores = void 0;
const sharedValue = useSharedValue(false);
const stateFromStores2 = useStateFromStores([AccessibilityStore], () => AccessibilityStore.useReducedMotion);
useEffect(() => {
sharedValue.set(accepted);
}, [accepted, sharedValue]);
const memo = useMemo(() => {
let r14;
const r3 = {
name: null,
label: null
};
if (accepted) {
r3.name = c11125_9.WAVE;
r3.label = intl.formatToPlainString(t.m0zYbV, {
username: UserUtils.getName(user)
});
r14 = [r3];
} else {
r3.name = c11125_9.ACCEPT;
r3.label = acceptRequestAccessibilityLabel;
r14 = [r3, {
name: c11125_9.DECLINE,
label: ignoreRequestAccessibilityLabel
}];
}
return r14;
}, [acceptRequestAccessibilityLabel, accepted, ignoreRequestAccessibilityLabel, user]);
const callback = useCallback((a0) => {
const actionName = a0.nativeEvent.actionName;
if (c11125_9.ACCEPT === actionName) {
sharedValue.set(true);
onAcceptIncomingRequest(user.id, applicationId);
return acceptIncomingRequest({
userId: user.id,
applicationId
});
}
if (c11125_9.DECLINE === actionName) {
onDeclineIncomingRequest(user.id, applicationId);
return dismissIncomingRequest({
userId: user.id,
applicationId
});
}
if (c11125_9.WAVE === actionName) {
return sendWave(user.id, true, "Incoming Friend Request");
}
}, [applicationId, onAcceptIncomingRequest, onDeclineIncomingRequest, sharedValue, user]);
userTag = UserUtils.useUserTag(user);
stateFromStores = useStateFromStores([ApplicationStore], () => ApplicationStore.getApplication(applicationId));
return <UserRow {...props2} user={user} type={RelationshipTypes.PENDING_INCOMING} mode={UserRowModes.ACTIONS} accessibilityActions={memo} accessibilityLabel={accessibilityLabel} onAccessibilityAction={callback} subLabel={<ActionStatusSubLabel actioned={sharedValue} label={useMemo(() => stateFromStores != null ? <ApplicationIconAndName key={stateFromStores.id} application={stateFromStores} textVariant="text-xs/medium" iconSize={12} /> : applicationId != null ? "" : userTag, [stateFromStores, applicationId, userTag])} actionStatus={acceptedRequestLabel} actionStatusAccessibilityLabel={acceptedRequestAccessibilityLabel} animate={!stateFromStores2} />} trailing={<IncomingRequestRowActions user={user} pressed={sharedValue} applicationId={applicationId} onAcceptIncomingRequest={onAcceptIncomingRequest} onDeclineIncomingRequest={onDeclineIncomingRequest} animate={!stateFromStores2} acceptRequestAccessibilityLabel={acceptRequestAccessibilityLabel} ignoreRequestAccessibilityLabel={ignoreRequestAccessibilityLabel} />} />;
};
IncomingGameFriendRequestRow = function IncomingGameFriendRequestRow(props) {
const { user: user2, application, ...props2 } = props;
const userTag2 = UserUtils.useUserTag(user2);
return <IncomingRequestRow user={user2} applicationId={application.id} accessibilityLabel={intl.formatToPlainString(t.u6lp4x, {
name: userTag2
})} acceptedRequestLabel={intl.format(t.gRgJGR, {
applicationNameHook: () => <ApplicationIconAndName key={application.id} application={application} textVariant="text-xs/medium" iconSize={12} />
})} acceptedRequestAccessibilityLabel={intl.formatToPlainString(t.Ke6fRJ, {
name: userTag2,
applicationName: application.name
})} acceptRequestAccessibilityLabel={intl.formatToPlainString(t.kMUpdH, {
name: userTag2,
applicationName: application.name
})} ignoreRequestAccessibilityLabel={intl.formatToPlainString(t.d8Cw5e, {
name: userTag2,
applicationName: application.name
})} {...props2} />;
};
c11125_9 = {
ACCEPT: "accept",
DECLINE: "decline",
WAVE: "wave"
};
export function IncomingFriendRequestRow(props) {
const { user: user2, ...props2 } = props;
const userTag2 = UserUtils.useUserTag(user2);
return <IncomingRequestRow user={user2} accessibilityLabel={intl.formatToPlainString(t.u6lp4x, {
name: userTag2
})} acceptedRequestLabel={intl.string(t["0E614Z"])} acceptedRequestAccessibilityLabel={intl.formatToPlainString(t.cRwkp7, {
name: userTag2
})} acceptRequestAccessibilityLabel={intl.formatToPlainString(t.MUfqsS, {
name: userTag2
})} ignoreRequestAccessibilityLabel={intl.formatToPlainString(t["0OF9IB"], {
name: userTag2
})} {...props2} />;
}
export function ConnectedIncomingGameFriendRequestRow(props) {
const { user: user2, applicationId: applicationId2 } = props;
const r13 = {};
let r14 = null;
const props2 = HermesBuiltin.copyDataProperties(r13, props, {
__proto__: null,
user: 0,
applicationId: 0
});
const stateFromStores2 = useStateFromStores([ApplicationStore], () => ApplicationStore.getApplication(applicationId2));
if (stateFromStores2 != null) {
r14 = <IncomingGameFriendRequestRow user={user2} application={stateFromStores2} {...props2} />;
}
return r14;
}
@@ -0,0 +1,178 @@
// Metro module 15601 (f15602).
import { useCallback } from "react";
import { View } from "react-native";
import { createStyles } from "../../../../../design/components/Styles/native/createStyles";
import * as _ReanimatedRexport from "../../../../reanimated/ReanimatedRexport";
import ReanimatedRexport, { useSharedValue, useAnimatedStyle, useAnimatedProps } from "../../../../reanimated/ReanimatedRexport";
import * as _timing from "../../../../../design/animation/reanimated/timing/timing";
import { acceptIncomingRequest, dismissIncomingRequest, sendWave } from "./AddFriendsScreenUtils";
import { Stack } from "../../../../../design/components/Stack/native/Stack.native";
import { IconButton } from "../../../../../design/components/Button/native/IconButton.native";
import Module13954 from "../../../../../_bundle/Module13954";
import Module10356 from "../../../../../_bundle/Module10356";
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 useStyles = createStyles({
container: {
flexDirection: "row"
}
});
const __initData = {
code: "function IncomingRequestRowActionsTsx1(){const{animate,pressed,withTiming}=this.__closure;return{position:'absolute',right:0,flexDirection:'row',opacity:!animate?!pressed.get()?1:0:withTiming(!pressed.get()?1:0,{duration:150}),pointerEvents:!pressed.get()?'auto':'none'};}"
};
const __initData2 = {
code: "function IncomingRequestRowActionsTsx2(){const{buttonWidth,buttonOffsetX,pressed,animate,withTiming}=this.__closure;const width=buttonWidth.get();const offset=buttonOffsetX.get();const scaleX=!pressed.get()?0.5:1;const translateX=!pressed.get()?width-offset:0;return{transform:[{translateX:!animate?translateX:withTiming(translateX)},{scaleX:!animate?scaleX:withTiming(scaleX)}],opacity:!animate?!pressed.get()?0:1:withTiming(!pressed.get()?0:1),pointerEvents:!pressed.get()?'none':'auto'};}"
};
const __initData3 = {
code: "function IncomingRequestRowActionsTsx3(){const{waveWidth,waveHeight}=this.__closure;return{transform:[{translateX:waveWidth.get()/2},{translateY:waveHeight.get()/2}]};}"
};
const __initData4 = {
code: "function IncomingRequestRowActionsTsx4(){const{withDelay,withRepeat,withTiming,pressed,Easing,waveWidth,waveHeight}=this.__closure;return{transform:[{rotateZ:withDelay(450,withRepeat(withTiming(pressed.get()?'8deg':'-2deg',{duration:150,easing:Easing.inOut(Easing.quad)}),4,true))},{translateX:-waveWidth.get()/2},{translateY:-waveHeight.get()/2}]};}"
};
const __initData5 = {
code: "function IncomingRequestRowActionsTsx5(){const{pressed}=this.__closure;return{pointerEvents:!pressed.get()?'none':'none'};}"
};
export function IncomingRequestRowActions(props) {
const { user, applicationId, pressed, onAcceptIncomingRequest, onDeclineIncomingRequest, animate, acceptRequestAccessibilityLabel, ignoreRequestAccessibilityLabel } = props;
const styles = useStyles();
const sharedValue = useSharedValue(0);
const sharedValue2 = useSharedValue(-1);
const sharedValue3 = useSharedValue(-1);
const sharedValue4 = useSharedValue(-1);
const E = function E() {
return {
position: "absolute",
right: 0,
flexDirection: "row",
opacity: animate ? _timing.withTiming(pressed.get() ? 0 : 1, {
duration: 150
}) : pressed.get() ? 0 : 1,
pointerEvents: pressed.get() ? "none" : "auto"
};
};
E.__closure = {
animate,
pressed,
withTiming: _timing.withTiming
};
E.__workletHash = 1291516991185;
E.__initData = __initData;
const animatedStyle = useAnimatedStyle(E);
const q = function q() {
const r6 = sharedValue2.get();
const r11 = sharedValue.get();
const r0 = pressed.get() ? 1 : 0.5;
const r8 = pressed.get() ? 0 : r6 - r11;
return {
transform: [{
translateX: animate ? _timing.withTiming(r8) : r8
}, {
scaleX: animate ? _timing.withTiming(r0) : r0
}],
opacity: animate ? _timing.withTiming(pressed.get() ? 1 : 0) : pressed.get() ? 1 : 0,
pointerEvents: pressed.get() ? "auto" : "none"
};
};
q.__closure = {
buttonWidth: sharedValue2,
buttonOffsetX: sharedValue,
pressed,
animate,
withTiming: _timing.withTiming
};
q.__workletHash = 2207673076655;
q.__initData = __initData2;
const animatedStyle2 = useAnimatedStyle(q);
const x = () => ({
transform: [{
translateX: sharedValue3.get() / 2
}, {
translateY: sharedValue4.get() / 2
}]
});
x.__closure = {
waveWidth: sharedValue3,
waveHeight: sharedValue4
};
x.__workletHash = 4308223742756;
x.__initData = __initData3;
const animatedStyle3 = useAnimatedStyle(x);
const A = function A() {
return {
transform: [{
rotateZ: _ReanimatedRexport.withDelay(450, _ReanimatedRexport.withRepeat(_timing.withTiming(pressed.get() ? "8deg" : "-2deg", {
duration: 150,
easing: _ReanimatedRexport.Easing.inOut(_ReanimatedRexport.Easing.quad)
}), 4, true))
}, {
translateX: -sharedValue3.get() / 2
}, {
translateY: -sharedValue4.get() / 2
}]
};
};
A.__closure = {
withDelay: _ReanimatedRexport.withDelay,
withRepeat: _ReanimatedRexport.withRepeat,
withTiming: _timing.withTiming,
pressed,
Easing: _ReanimatedRexport.Easing,
waveWidth: sharedValue3,
waveHeight: sharedValue4
};
A.__workletHash = 6870822621980;
A.__initData = __initData4;
const animatedStyle4 = useAnimatedStyle(A);
const X = function X() {
pressed.get();
return {
pointerEvents: "none"
};
};
X.__closure = {
pressed
};
X.__workletHash = 5804402563280;
X.__initData = __initData5;
const animatedProps = useAnimatedProps(X);
const callback2 = useCallback(() => {
pressed.set(true);
acceptIncomingRequest({
userId: user.id,
applicationId
});
onAcceptIncomingRequest(user.id, applicationId);
}, [applicationId, onAcceptIncomingRequest, pressed, user]);
const callback = useCallback(() => {
onDeclineIncomingRequest(user.id, applicationId);
dismissIncomingRequest({
userId: user.id,
applicationId
});
}, [applicationId, onDeclineIncomingRequest, user]);
const callback3 = useCallback(() => {
sendWave(user.id, true, "Incoming Friend Request");
}, [user]);
const r139 = [<ReanimatedRexport.View onLayout={function onLayout(event) {
sharedValue.set(event.nativeEvent.layout.width);
}} style={animatedStyle}>
<Stack direction="horizontal" spacing={8}>
<IconButton size="sm" variant="tertiary" icon={Module13954} onPress={callback} accessibilityLabel={ignoreRequestAccessibilityLabel} maxFontSizeMultiplier={2} />
<IconButton size="sm" variant="active" icon={Module10356} onPress={callback2} accessibilityLabel={acceptRequestAccessibilityLabel} maxFontSizeMultiplier={2} />
</Stack>
</ReanimatedRexport.View>, ,];
r139[1] = <ReanimatedRexport.View style={animatedStyle2} onLayout={function onLayout(event) {
sharedValue2.set(event.nativeEvent.layout.width);
}} {...animatedProps}>
<Button size="sm" variant="secondary" text={intl.string(t.n8nU4W)} icon={<ReanimatedRexport.View style={animate ? animatedStyle3 : null} accessibilityElementsHidden importantForAccessibility="no-hide-descendants">
<ReanimatedRexport.View style={animate ? animatedStyle4 : null} onLayout={function onLayout(event) {
sharedValue3.set(event.nativeEvent.layout.width);
sharedValue4.set(event.nativeEvent.layout.height);
}}>
<Text maxFontSizeMultiplier={2} variant="text-sm/normal">👋</Text>
</ReanimatedRexport.View>
</ReanimatedRexport.View>} onPress={callback3} />
</ReanimatedRexport.View>;
return <View style={styles.container}>{r139}</View>;
}
@@ -0,0 +1,32 @@
// Metro module 15599 (f15600).
import { View } from "react-native";
import { createStyles } from "../../../../../design/components/Styles/native/createStyles";
import Module712 from "../../../../../_bundle/Module712";
import { TableRow } from "../../../../../design/components/TableRow/native/TableRow.native";
import { AvatarDuoPile } from "../../../../../design/components/Pile/native/AvatarDuoPile.native";
import { AvatarSizes, Avatar, AVATAR_SIZE_MAP } from "../../../../../design/void/native";
import { Text } from "../../../../../design/components/Text/native/Text";
import { intl, t } from "../../../../../intl/index.native";
const useStyles = createStyles({
labelContainer: {
flexDirection: "row",
alignItems: "center"
},
showAllText: {
marginLeft: Module712.space.PX_12
}
});
export default function ShowAllRow(props) {
const { users, onPress, count } = props;
const styles = useStyles();
return <TableRow onPress={onPress} end height="100%" label={<View style={styles.labelContainer}>
<AvatarDuoPile size={AvatarSizes.XSMALL_20} aria-label="">
{users.slice(0, 2).map((item, index) => <Avatar key={index} source={item.getAvatarSource(null, false, AVATAR_SIZE_MAP[AvatarSizes.XSMALL])} size={AvatarSizes.XSMALL_20} />)}
</AvatarDuoPile>
<Text style={styles.showAllText} variant="text-md/semibold" color="text-brand">
{intl.format(t.NrzztX, {
count
})}
</Text>
</View>} trailing={<TableRow.Arrow />} />;
};
@@ -0,0 +1,41 @@
// Metro module 15043 (f15044).
import { useState, useMemo } from "react";
import FriendSuggestionStore from "../../../../friend_suggestions/FriendSuggestionStore";
import { SuggestedFriendSource } from "../screens/FriendsScreenConstants";
import { useStateFromStoresArray } from "../../../../../_bundle/defaultAreStatesEqual";
import Module12 from "../../../../../_bundle/Module12";
import UserUtils from "../../../../../utils/UserUtils";
export default function useSuggestedFriends(a0) {
const r4 = a0 == null ? {} : a0;
let c21621_2;
let isConnected = r4.isConnected;
const stateFromStoresArray = useStateFromStoresArray([FriendSuggestionStore], () => FriendSuggestionStore.getSuggestions());
const [state, setAdded] = useState([]);
if (isConnected == null) {
isConnected = true;
}
c21621_2 = isConnected;
const memo = useMemo(() => {
if (c21621_2) {
return Module12.unionBy(state.filter((item) => item.source === SuggestedFriendSource.USER_SUGGESTIONS), stateFromStoresArray.map((item) => {
let name = item.name;
if (name == null) {
name = void 0;
}
return {
user: item.user,
friendSuggestionName: name,
source: SuggestedFriendSource.USER_SUGGESTIONS,
contactNames: item.contactNames
};
}), (a0) => a0.user.id).sort((a, b) => UserUtils.getName(a.user).localeCompare(UserUtils.getName(b.user)));
}
return [];
}, [state, stateFromStoresArray, isConnected]);
return {
added: state,
setAdded,
friendSuggestions: memo,
numFriendSuggestions: isConnected ? memo.length : stateFromStoresArray.length
};
};
@@ -0,0 +1,36 @@
// Metro module 15610 (f15611).
import RelationshipStore from "../../../../../stores/RelationshipStore";
import { RelationshipTypes } from "../../../../../Constants";
const filterFromPending = function filterFromPending(item) {
return RelationshipStore.isSpam(item) || RelationshipStore.isIgnored(item);
};
export function getPendingRelationshipIds(a0) {
const pendingIncomingIds = [];
const pendingOutgoingIds = [];
const spamIds = [];
const ignoredUserIds = [];
for (const item of a0.keys()) {
const r14 = a0.get(item);
if (!(r14 !== RelationshipTypes.PENDING_INCOMING || filterFromPending(item))) {
pendingIncomingIds.push(item);
}
if (r14 === RelationshipTypes.PENDING_OUTGOING) {
pendingOutgoingIds.push(item);
}
if (r14 === RelationshipTypes.PENDING_INCOMING && RelationshipStore.isSpam(item)) {
spamIds.push(item);
}
if (r14 === RelationshipTypes.PENDING_INCOMING && RelationshipStore.isIgnored(item)) {
ignoredUserIds.push(item);
}
}
pendingIncomingIds.reverse();
pendingOutgoingIds.reverse();
spamIds.reverse();
return {
pendingIncomingIds,
pendingOutgoingIds,
spamIds,
ignoredUserIds
};
}
@@ -0,0 +1,263 @@
// Metro module 12993 (f12994).
import { forwardRef, useRef, useState, useCallback, useEffect } from "react";
import { Keyboard, View } from "react-native";
import { AnalyticEvents, PLACEHOLDER_TAG } from "../../../../../Constants";
import { createStyles } from "../../../../../design/components/Styles/native/createStyles";
import Module712 from "../../../../../_bundle/Module712";
import { intl, t } from "../../../../../intl/index.native";
import { Text } from "../../../../../design/components/Text/native/Text";
import { TextField } from "../../../../../design/components/TextField/native/TextField.native";
import FriendRequestMessageExperiment from "../../../../people/FriendRequestMessageExperiment";
import { validateDiscordTag, humanizeAbortCode, humanizeAbortCodeForA11y } from "../../../../../utils/FriendsUtils";
import RelationshipActionCreators, { RelationshipErrorUXConfig } from "../../../../../actions/RelationshipActionCreators";
import { presentAddedFriendToast } from "../../../../toast/native/ToastUtils";
import AnalyticsUtils from "../../../../../utils/AnalyticsUtils";
import { AccessibilityAnnouncer } from "../../../../../_bundle/Module3902";
import { TextArea } from "../../../../../design/components/TextInput/native/TextArea.native";
import { Button } from "../../../../../design/components/Button/native/Button.native";
let useStyles, c8969_13, c8969_14, Component;
const ErrorMessage = function ErrorMessage(props) {
const errorMessage = props.errorMessage;
const styles = useStyles();
return <Text variant="text-xs/medium" color="text-feedback-critical" style={[styles.inputAccessoryText, styles.errorStateText]}>{errorMessage}</Text>;
};
useStyles = createStyles({
container: {
backgroundColor: Module712.colors.BACKGROUND_BASE_LOWER,
alignItems: "center",
justifyContent: "center",
paddingHorizontal: 16
},
textInputContainer: {
alignSelf: "stretch"
},
placeholderText: {
color: Module712.colors.TEXT_MUTED
},
inputAccessoryText: {
fontSize: 12,
lineHeight: 16,
marginVertical: 8,
color: Module712.colors.TEXT_SUBTLE
},
redesignInputAccessoryText: {
marginBottom: Module712.space.PX_8
},
inputHeaderText: {
marginTop: 0
},
redesignGrow: {
flexGrow: 2,
minHeight: Module712.space.PX_24
},
errorStateText: {
color: Module712.unsafe_rawColors.RED_400,
marginVertical: 4
},
friendMessageContainer: {
alignSelf: "stretch",
marginTop: Module712.space.PX_16
},
messageLabel: {
marginBottom: Module712.space.PX_4
},
messageFooterText: {
marginTop: Module712.space.PX_4
}
});
c8969_13 = {
SUCCESS: 0,
0: "SUCCESS",
ERROR: 1,
1: "ERROR",
LOADING: 2,
2: "LOADING",
NONE: 3,
3: "NONE"
};
c8969_14 = {
DISCORD_TAG: "DISCORD_TAG",
MESSAGE: "MESSAGE"
};
Component = forwardRef(({ textState, onChangeText, onSelectionChange: onSelectionChange2, onKeyPress: onKeyPress2, onSubmitEditing, onFocus, validationState, autoFocus, headerText = intl.string(t.YegTF2).toUpperCase(), headerTextStyle }, a1) => {
const styles = useStyles();
const errorMessage = validationState.status === c8969_13.ERROR ? validationState.field === c8969_14.DISCORD_TAG ? validationState.message : void 0 : void 0;
return <View style={styles.textInputContainer}>
<Text style={[styles.redesignInputAccessoryText, styles.inputHeaderText, headerTextStyle]} variant="text-sm/semibold" color="text-muted">{headerText}</Text>
<TextField ref={a1} value={textState.validatedText} accessibilityLabel={intl.string(t.qRaqel)} accessibilityHint={validationState.status === c8969_13.ERROR ? validationState.a11yMessage : void 0} placeholder={intl.string(t.qRaqel)} placeholderTextColor={styles.placeholderText.color} onChange={onChangeText} onSelectionChange={onSelectionChange2} onKeyPress={onKeyPress2} onSubmitEditing={onSubmitEditing} autoCapitalize="none" returnKeyType="send" keyboardType="twitter" autoCorrect={false} blurOnSubmit maxLength={37} autoFocus={autoFocus} onFocus={onFocus} status={errorMessage != null ? "error" : void 0} />
{errorMessage != null ? <ErrorMessage errorMessage={errorMessage} /> : null}
</View>;
});
const r100 = forwardRef(({ style, onFocus, autoFocusInput, headerText, headerTextStyle, sourcePage }, a1) => {
let ref, ref2, state, setState, state2, setState2, state3, setState3;
ref = void 0;
ref2 = void 0;
state = void 0;
setState = void 0;
state2 = void 0;
setState2 = void 0;
state3 = void 0;
setState3 = void 0;
const handleSubmitEditing = function handleSubmitEditing() {
let discordTag = state.validatedText.trim();
const r12 = state3.trim();
if (discordTag.length <= 0) {
setState2({
status: c8969_13.ERROR,
field: c8969_14.DISCORD_TAG,
message: intl.string(t.mxnceg)
});
} else {
const r20 = discordTag.includes("#");
const r21 = r20 ? !r20 : discordTag.startsWith("@");
let r23 = discordTag;
if (r21) {
discordTag = discordTag.substring(1);
r23 = discordTag;
}
const message = validateDiscordTag(r23);
const discordTag2 = r23;
if (message != null) {
setState2({
status: c8969_13.ERROR,
field: c8969_14.DISCORD_TAG,
message
});
} else {
setState2({
status: c8969_13.LOADING
});
RelationshipActionCreators.sendRequest({
discordTag: discordTag2,
context: {
location: "Search - Add Friend Search"
},
errorUxConfig: RelationshipErrorUXConfig.SHOW_ONLY_IF_ACTION_NEEDED,
note: r12.length > 0 ? r12 : void 0
}).then(() => {
setState({
validatedText: "",
hint: intl.string(t["6p7Mhh"])
});
setState3("");
setState2({
status: c8969_13.SUCCESS,
message: intl.format(t.Rtl1Ep, {
discordTag
})
});
presentAddedFriendToast();
Keyboard.dismiss();
}, (a0) => {
let r16;
if ((a0 == null ? void 0 : a0.body?.note) != null) {
r16 = {
status: c8969_13.ERROR,
field: c8969_14.MESSAGE,
message: intl.string(t.ckHwck),
a11yMessage: intl.string(t.ckHwck)
};
} else {
let r23 = a0 == null ? void 0 : a0.body?.code;
if (r23 == null) {
r23 = -1;
}
r16 = {
status: c8969_13.ERROR,
field: c8969_14.DISCORD_TAG,
message: humanizeAbortCode(r23, discordTag),
a11yMessage: null
};
let r34 = a0 == null ? void 0 : a0.body?.code;
if (r34 == null) {
r34 = -1;
}
r16.a11yMessage = humanizeAbortCodeForA11y(r34, discordTag);
}
setState2(r16);
});
}
}
};
const styles = useStyles();
ref = useRef(0);
ref2 = useRef("");
[state, setState] = useState(() => ({
validatedText: "",
hint: intl.string(t["6p7Mhh"])
}));
[state2, setState2] = useState({
status: c8969_13.NONE
});
[state3, setState3] = useState("");
let enabled = FriendRequestMessageExperiment.useConfig({
location: "AddFriendbyId"
}).enabled;
const callback2 = useCallback((a0) => {
let r25;
if (a0.length <= 0) {
r25 = {
validatedText: "",
hint: intl.string(t["6p7Mhh"])
};
} else {
const [, r11] = a0.split("#");
r25 = {
validatedText: a0,
hint: r11 != null ? a0 + PLACEHOLDER_TAG.slice(r11 != null ? r11.length + 1 : 0) : ""
};
}
setState(r25);
if (state2.status === c8969_13.ERROR && state2.field === c8969_14.DISCORD_TAG) {
setState2({
status: c8969_13.NONE
});
}
}, [state2]);
const callback = useCallback((a0) => {
setState3(a0.replace(/\n/g, ""));
if (state2.status === c8969_13.ERROR && state2.field === c8969_14.MESSAGE) {
setState2({
status: c8969_13.NONE
});
}
}, [state2]);
useEffect(() => {
AnalyticsUtils.track(AnalyticEvents.FRIEND_ADD_VIEWED, {
friend_add_type: "Id",
source_page: sourcePage
});
}, [sourcePage]);
useEffect(() => {
if (state2.status === c8969_13.ERROR && state2.a11yMessage != null) {
AccessibilityAnnouncer.announce(state2.a11yMessage);
}
}, [state2]);
const length = state.validatedText.trim().length;
const r83 = [<Component textState={state} onChangeText={callback2} onSelectionChange={function onSelectionChange(event) {
const start = event.nativeEvent.selection.start;
if (start !== ref.current) {
ref.current = start;
}
}} onKeyPress={function onKeyPress(event) {
ref2.current = event.nativeEvent.key;
}} onSubmitEditing={handleSubmitEditing} onFocus={onFocus} validationState={state2} autoFocus={autoFocusInput} headerText={headerText} headerTextStyle={headerTextStyle} ref={a1} />, ,];
if (enabled) {
enabled = <View style={styles.friendMessageContainer}>
<Text style={[styles.messageLabel, styles.inputHeaderText, headerTextStyle]} variant="text-sm/semibold" color="text-muted">
{intl.string(t.Yi6Mpu)}
</Text>
<TextArea returnKeyType="done" submitBehavior="submit" value={state3} maxLength={120} onSubmitEditing={handleSubmitEditing} onChange={callback} status={state2.field === c8969_14.MESSAGE ? state2.status === c8969_13.ERROR ? "error" : void 0 : void 0} />
{state2.status === c8969_13.ERROR && state2.field === c8969_14.MESSAGE ? <ErrorMessage errorMessage={state2.message} /> : <Text style={styles.messageFooterText} variant="text-xs/medium" color="text-muted">
{intl.string(t.UtfQNw)}
</Text>}
</View>;
}
r83[1] = enabled;
return <>
<View style={[styles.container, style]}>{r83}</View>
<View style={styles.redesignGrow} />
<Button size="lg" text={intl.string(t["PMsq/b"])} disabled={length <= 0} onPress={handleSubmitEditing} loading={state2.status === c8969_13.LOADING} grow={false} />
</>;
});
export default r100;
@@ -0,0 +1,95 @@
// Metro module 15597 (f15598).
import { useState, useCallback, useLayoutEffect } from "react";
import { ScrollView, View } from "react-native";
import UserStore from "../../../../../stores/UserStore";
import { AnalyticEvents } from "../../../../../Constants";
import { ContactPermissions } from "../../../../contact_sync/native/ContactSyncConstants";
import { createStyles } from "../../../../../design/components/Styles/native/createStyles";
import Module712 from "../../../../../_bundle/Module712";
import { useContactSyncAccount, isContactSyncEnabled, checkContactPermissions } from "../../../../contact_sync/native/ContactSyncUtils";
import UserUtils from "../../../../../utils/UserUtils";
import AnalyticsUtils from "../../../../../utils/AnalyticsUtils";
import { intl, t } from "../../../../../intl/index.native";
import { showShareActionSheet } from "../../../../action_sheet/native/showShareActionSheet";
import { getRenderHeaderTextButton } from "../../shared_components/HeaderShared";
import { isAndroid } from "../../../../../utils/PlatformUtils";
import ThemedGradient from "../../../../client_themes/native/ThemedGradient";
import { Text } from "../../../../../design/components/Text/native/Text";
import AddFriendById from "./AddFriendById";
import ContactSyncUpsellCTA from "../../../../contact_sync/native/components/ContactSyncUpsellCTA";
const useStyles = createStyles({
headerText: {
marginTop: 32,
marginHorizontal: 16,
textAlign: "center"
},
subheaderText: {
marginVertical: 8,
marginHorizontal: 16,
textAlign: "center"
},
input: {
marginTop: 16,
backgroundColor: Module712.colors.BACKGROUND_BASE_LOWER
},
otherOptionsContainer: {
marginTop: 16,
paddingHorizontal: 16
},
rowContainer: {
marginTop: 8
},
background: {
backgroundColor: Module712.colors.BACKGROUND_BASE_LOWER
}
});
export default function AddFriendScreen(props) {
const navigation = props.navigation;
const sourcePage = props.route.params.sourcePage;
const styles = useStyles();
const contactSyncAccount = useContactSyncAccount();
const [state, setState] = useState(!isContactSyncEnabled(contactSyncAccount));
const callback = useCallback(() => {
const currentUser = UserStore.getCurrentUser();
const username = currentUser != null ? UserUtils.getUserTag(currentUser) : void 0;
AnalyticsUtils.track(AnalyticEvents.FRIEND_ADD_VIEWED, {
friend_add_type: "Invite",
source_page: "Add Friend Modal"
});
showShareActionSheet({
message: intl.formatToPlainString(t["6E9a1J"], {
url: `${location.protocol}${window.GLOBAL_ENV.WEBAPP_ENDPOINT}`,
username
})
}, "Add Friend Modal");
}, []);
useLayoutEffect(() => {
navigation.setOptions({
headerRight: (a0) => getRenderHeaderTextButton(intl.string(t.RDE0Sc), callback)({
...a0
})
});
checkContactPermissions().then((result) => {
const NOT_DETERMINED = ContactPermissions.NOT_DETERMINED;
const r11 = isAndroid() && result === ContactPermissions.UNAUTHORIZED;
setState(result === NOT_DETERMINED || r11 || !isContactSyncEnabled(contactSyncAccount));
});
}, [callback, navigation, contactSyncAccount]);
return <>
{[<ThemedGradient absolute />, <ScrollView keyboardShouldPersistTaps="handled" style={styles.background}>
<Text style={styles.headerText} accessibilityRole="header" variant="heading-xl/extrabold" color="mobile-text-heading-primary">
{intl.string(t.GWMTSE)}
</Text>
<Text style={styles.subheaderText} variant="text-sm/medium" color="text-default">
{intl.string(t["Rn/sLl"])}
</Text>
<AddFriendById style={styles.input} autoFocusInput={false} sourcePage={sourcePage} />
<View style={styles.otherOptionsContainer}>
<Text accessibilityRole="header" variant="eyebrow" color="text-default">
{intl.string(t.dukg0Z)}
</Text>
{state ? <ContactSyncUpsellCTA style={styles.rowContainer} location="Add Friend Modal" /> : null}
</View>
</ScrollView>]}
</>;
};
@@ -0,0 +1,405 @@
// Metro module 15598 (f15599).
import { useState, useCallback, useMemo, useEffect } from "react";
import { ScrollView, View } from "react-native";
import GameRelationshipStore from "../../../../game_relationships/GameRelationshipStore";
import RelationshipStore from "../../../../../stores/RelationshipStore";
import UserStore from "../../../../../stores/UserStore";
import { Sections } from "./FriendsScreenConstants";
import { AnalyticEvents, AnalyticsSections, InstantInviteSources, RelationshipTypes } from "../../../../../Constants";
import { ContactPermissions } from "../../../../contact_sync/native/ContactSyncConstants";
import { createStyles } from "../../../../../design/components/Styles/native/createStyles";
import Module712 from "../../../../../_bundle/Module712";
import { openContactSyncModal } from "../../../../contact_sync/native/ContactSyncModalActionCreators";
import InstantInviteActionCreators from "../../../../../actions/InstantInviteActionCreators";
import { presentError } from "../../../../toast/native/ToastUtils";
import { intl, t } from "../../../../../intl/index.native";
import getInviteURL from "../../../../instant_invite/getInviteURL";
import * as _ContactSyncUtils from "../../../../contact_sync/native/ContactSyncUtils";
import { useContactSyncAccount, isContactSyncAvailable, checkContactPermissions } from "../../../../contact_sync/native/ContactSyncUtils";
import { isAndroid } from "../../../../../utils/PlatformUtils";
import useAnalyticsLocations, { AnalyticsLocationProvider } from "../../../../app_analytics/useAnalyticsLocations";
import AnalyticsLocation from "../../../../app_analytics/AnalyticsLocation";
import useMountEffect from "../../../../../hooks/useMountEffect";
import AnalyticsUtils from "../../../../../utils/AnalyticsUtils";
import showUserProfileActionSheet from "../../../../user_profile/native/showUserProfileActionSheet";
import { useStateFromStoresArray, useStateFromStores } from "../../../../../_bundle/defaultAreStatesEqual";
import Module12 from "../../../../../_bundle/Module12";
import UserUtils from "../../../../../utils/UserUtils";
import useSuggestedFriends from "../components/useSuggestedFriends";
import useGetOrFetchApplications from "../../../../applications/useGetOrFetchApplications";
import ThemedGradient from "../../../../client_themes/native/ThemedGradient";
import InstantInviteShareApps from "../../../../instant_invite/native/components/InstantInviteShareApps";
import { ActivityIndicator } from "../../../../../design/components/ActivityIndicator/native/ActivityIndicator.native";
import { UsersFastList } from "../../shared_components/user_list/UsersFastList";
import { TableRow } from "../../../../../design/components/TableRow/native/TableRow.native";
import { FriendsIcon } from "../../../../../design/components/Icon/native/redesign/generated/FriendsIcon";
import { AtIcon } from "../../../../../design/components/Icon/native/redesign/generated/AtIcon";
import ShowAllRow from "../components/ShowAllRow";
import { IncomingFriendRequestRow, ConnectedIncomingGameFriendRequestRow } from "../components/IncomingRequestRow";
import { ContactSuggestionRow } from "../components/ContactSuggestionRow";
import AddFriendsContactSyncEmptyState from "../components/AddFriendsContactSyncEmptyState";
let c11123_19, useStyles, handleShare, areHydratedGameFriendRequestRowStatesEqual;
const handleFindFriends = function handleFindFriends() {
openContactSyncModal({}, AnalyticsSections.FRIENDS_ADD_FRIENDS_MODAL);
};
handleShare = async function handleShare(c28099_0) {
let c28099_4 = 0;
let c30906_0, c30906_1;
try {
c30906_0 = c28099_0;
c30906_1 = void 0;
c28099_4 = 1;
c30906_1 = (await InstantInviteActionCreators.createFriendInvite(null, InstantInviteSources.ADD_FRIENDS_MODAL)).code;
c28099_4 = 0;
(0, c30906_0)({
channel: null,
code: c30906_1,
message: intl.formatToPlainString(t.PJf9P9, {
link: getInviteURL(c30906_1)
}),
location: InstantInviteSources.ADD_FRIENDS_MODAL
});
} catch ($e) {
let r8 = $e;
if (c28099_4 !== 0) {
while (true) {
try {
c28099_4 = 0;
presentError(intl.string(t.R0RpRX));
} catch ($e) {
r8 = $e;
if (c28099_4 === 0) {
break;
}
continue;
}
return void 0;
}
}
throw r8;
}
};
areHydratedGameFriendRequestRowStatesEqual = function areHydratedGameFriendRequestRowStatesEqual(a0, a1) {
return a0 === a1 || a0.length === a1.length && a0.every((item, index) => {
const r7 = a1[index];
return item.user === r7.user && item.applicationId === r7.applicationId;
});
};
c11123_19 = {
FIND_FRIENDS: 0,
0: "FIND_FRIENDS",
INCOMING_FRIEND_REQUESTS: 1,
1: "INCOMING_FRIEND_REQUESTS",
INCOMING_GAME_FRIEND_REQUESTS: 2,
2: "INCOMING_GAME_FRIEND_REQUESTS",
CONTACT_SUGGESTIONS: 3,
3: "CONTACT_SUGGESTIONS"
};
useStyles = createStyles({
container: {
flex: 1
},
inviteAppsContainerNonSticky: {
backgroundColor: Module712.colors.MOBILE_ACTIONSHEET_BACKGROUND,
paddingVertical: Module712.space.PX_16
},
inviteAppsContentContainer: {
paddingTop: 0,
paddingBottom: 0,
minWidth: "100%"
},
emptyContainer: {
backgroundColor: Module712.colors.MOBILE_ACTIONSHEET_BACKGROUND
},
emptyActionContainer: {
marginHorizontal: Module712.space.PX_16,
paddingTop: Module712.space.PX_8
},
loading: {
backgroundColor: Module712.colors.MOBILE_ACTIONSHEET_BACKGROUND,
justifyContent: "center",
flex: 1
}
});
export default function AddFriendsScreen(props) {
let callback2, callback3, callback4, stateFromStoresArray, stateFromStores, added, setAdded, friendSuggestions, c22232_20, c22232_21, state5, memo;
const navigation = props.navigation;
const sourcePage = props.route.params.sourcePage;
callback2 = void 0;
callback3 = void 0;
callback4 = void 0;
stateFromStoresArray = void 0;
stateFromStores = void 0;
added = void 0;
setAdded = void 0;
friendSuggestions = void 0;
c22232_20 = void 0;
c22232_21 = void 0;
state5 = void 0;
memo = void 0;
const styles = useStyles();
const analyticsLocations = useAnalyticsLocations(AnalyticsLocation.ADD_FRIENDS).analyticsLocations;
const [state, setState] = useState([]);
const [state2, setState2] = useState([]);
const [state3, setState3] = useState([]);
const [state4, setState4] = useState([]);
const callback = useCallback((userId, a1) => {
const applicationId = a1;
if (a1 != null) {
setState4((prevState4) => [...prevState4, {
userId,
applicationId
}]);
} else {
setState2((prevState2) => [...prevState2, userId]);
}
}, []);
callback2 = useCallback((userId2, a1) => {
const applicationId2 = a1;
if (a1 != null) {
setState3((prevState3) => [...prevState3, {
userId: userId2,
applicationId: applicationId2
}]);
} else {
setState((prevState) => [...prevState, userId2]);
}
}, []);
useMountEffect(() => {
AnalyticsUtils.track(AnalyticEvents.FRIEND_ADD_VIEWED, {
friend_add_type: AnalyticsSections.FRIENDS_ADD_FRIENDS_MODAL,
source_page: sourcePage
});
});
callback3 = useCallback(() => {
navigation.navigate("username-search");
}, [navigation]);
callback4 = useCallback((a0) => {
showUserProfileActionSheet({
userId: a0.id,
localUser: a0,
sourceAnalyticsLocations: analyticsLocations,
location: "Add Friends Modal User Profile"
});
}, [analyticsLocations]);
stateFromStoresArray = useStateFromStoresArray([RelationshipStore, UserStore], () => {
const r5 = [];
for (const item of RelationshipStore.getMutableRelationships().keys()) {
if (RelationshipStore.isUnfilteredPendingIncoming(item)) {
const user3 = UserStore.getUser(item);
if (!(user3 == null || state.includes(item))) {
r5.push(user3);
}
}
}
const r49 = [];
let c28102_0 = r49;
state2.forEach((item) => {
const user3 = UserStore.getUser(item);
if (user3 != null) {
c28102_0.push(user3);
}
});
return Module12.unionBy(r49, r5, (a0) => a0.id).sort((a, b) => UserUtils.getName(a).localeCompare(UserUtils.getName(b)));
});
stateFromStores = useStateFromStores([GameRelationshipStore, RelationshipStore, UserStore], () => {
let c28103_1;
const gameRelationshipsByType = GameRelationshipStore.getGameRelationshipsByType(RelationshipTypes.PENDING_INCOMING);
const r6 = [];
let c28103_0 = r6;
gameRelationshipsByType.forEach(({ id, applicationId: applicationId4 }) => {
const user3 = UserStore.getUser(id);
if (!(RelationshipStore.isSpam(id) || RelationshipStore.isBlockedOrIgnored(id) || user3 == null || state3.some((item) => item.userId === id && item.applicationId === applicationId4))) {
c28103_0.push({
user: user3,
applicationId: applicationId4
});
}
});
const r12 = [];
c28103_1 = r12;
state4.forEach(({ userId: userId3, applicationId: applicationId5 }) => {
const user3 = UserStore.getUser(userId3);
if (user3 != null) {
c28103_1.push({
user: user3,
applicationId: applicationId5
});
}
});
return Module12.unionBy(r12, r6, (a0) => a0.user.id).sort((a, b) => UserUtils.getName(a.user).localeCompare(UserUtils.getName(b.user)));
}, [state4, state3], areHydratedGameFriendRequestRowStatesEqual);
const suggestedFriends = useSuggestedFriends();
added = suggestedFriends.added;
setAdded = suggestedFriends.setAdded;
friendSuggestions = suggestedFriends.friendSuggestions;
const r5 = friendSuggestions.length > 0 && stateFromStoresArray.length > 3;
c22232_20 = r5;
const r6 = friendSuggestions.length > 0 && stateFromStores.length > 3;
let navigation2, setState5;
let setState6;
c22232_21 = r6;
useGetOrFetchApplications(useMemo(() => {
const r6 = c22232_21 ? Math.min(stateFromStores.length, 3) : stateFromStores.length;
const r13 = [];
let r0 = 0;
while (r0 < r6) {
const r17 = stateFromStores[r0];
const r1 = r0;
if (r17 != null) {
r13.push(r17.applicationId);
}
r0 = r1 + 1;
}
return r13;
}, [stateFromStores, r6]));
navigation2 = navigation;
setState5 = void 0;
let state6;
[state6, setState5] = useState(false);
useEffect(() => navigation2.addListener("transitionEnd", () => {
setState5(true);
}), [navigation]);
setState6 = void 0;
const isContactSyncEnabled = _ContactSyncUtils.isContactSyncEnabled(useContactSyncAccount());
let state7;
[state7, setState6] = useState(false);
useEffect(() => {
if (isContactSyncAvailable()) {
checkContactPermissions().then((result) => {
const NOT_DETERMINED = ContactPermissions.NOT_DETERMINED;
const r11 = isAndroid() && result === ContactPermissions.UNAUTHORIZED;
setState6(result === NOT_DETERMINED || r11);
});
}
}, []);
state5 = !!isContactSyncAvailable() && (isContactSyncEnabled ? state7 : !isContactSyncEnabled);
const r150 = stateFromStoresArray.length === 0 && stateFromStores.length === 0 && friendSuggestions.length === 0;
memo = useMemo(() => {
const r8 = [state5 ? 2 : 1, , , ,];
let r5 = 4;
r8[1] = c22232_20 ? 4 : stateFromStoresArray.length;
if (!c22232_21) {
r5 = stateFromStores.length;
}
r8[2] = r5;
r8[3] = friendSuggestions.length;
return r8;
}, [stateFromStoresArray.length, friendSuggestions.length, stateFromStores.length, state5, r5, r6]);
const callback5 = useCallback((a0) => {
if (c11123_19.FIND_FRIENDS === a0) {
return void 0;
}
if (c11123_19.INCOMING_FRIEND_REQUESTS === a0) {
return {
type: "section",
props: {
title: intl.string(t["93cLE3"])
}
};
}
if (c11123_19.INCOMING_GAME_FRIEND_REQUESTS === a0) {
return {
type: "section",
props: {
title: intl.string(t["0uVuaU"])
}
};
}
if (c11123_19.CONTACT_SUGGESTIONS === a0) {
return {
type: "section",
props: {
title: intl.string(t["1uAmCw"])
}
};
}
}, []);
const r173 = [<ThemedGradient absolute />, ,];
r173[1] = <View style={styles.container}>
<View style={styles.inviteAppsContainerNonSticky}>
<InstantInviteShareApps onItemPressed={handleShare} contentContainerStyle={styles.inviteAppsContentContainer} />
</View>
{!state6 && !r150 ? <View style={styles.loading}>
<ActivityIndicator />
</View> : r150 ? <ScrollView style={styles.emptyContainer}>
<View style={styles.emptyActionContainer}>
<TableRow label={intl.string(t.QzVsOs)} labelLineClamp={1} icon={<TableRow.Icon IconComponent={AtIcon} />} arrow onPress={callback3} start end />
</View>
{state5 ? <AddFriendsContactSyncEmptyState /> : null}
</ScrollView> : <UsersFastList sections={memo} getItemProps={function getItemProps(a0, a1) {
let user, user2, applicationId3, suggestedFriend;
const start = a1 === 0;
const end = a1 === memo[a0] - 1;
if (c11123_19.FIND_FRIENDS === a0) {
return start && state5 ? {
type: "custom",
itemType: "showContactSyncCTA",
key: "showContactSyncCTA",
component: () => <TableRow start height="100%" label={intl.string(t.j2POVo)} labelLineClamp={1} icon={<TableRow.Icon IconComponent={FriendsIcon} />} trailing={<TableRow.Arrow />} onPress={handleFindFriends} />
} : {
type: "custom",
itemType: "addByUsername",
key: "addByUsername",
component: () => <TableRow start={!state5} end height="100%" label={intl.string(t.QzVsOs)} labelLineClamp={1} icon={<TableRow.Icon IconComponent={AtIcon} />} arrow onPress={callback3} />
};
}
if (c11123_19.INCOMING_FRIEND_REQUESTS === a0) {
if (end && c22232_20) {
return {
type: "custom",
itemType: "viewAll",
key: "friendRequestsViewAll",
component: () => <ShowAllRow onPress={() => {
AnalyticsUtils.track(AnalyticEvents.FRIEND_FINDER_SECTION_EXPANDED, {
section_id: Sections.PENDING,
truncated_count: 3,
expanded_count: stateFromStoresArray.length,
location: "AddFriends"
});
navigation.navigate("requests");
}} users={stateFromStoresArray.slice(3)} count={stateFromStoresArray.length} />
};
}
user = stateFromStoresArray[a1];
return {
type: "custom",
itemType: "incomingRequest",
key: user.id,
component: () => <IncomingFriendRequestRow accepted={state2.includes(user.id)} user={user} start={start} end={end} onPress={callback4} onDeclineIncomingRequest={callback2} onAcceptIncomingRequest={callback} />
};
}
if (c11123_19.INCOMING_GAME_FRIEND_REQUESTS === a0) {
if (end && c22232_21) {
return {
type: "custom",
itemType: "viewAll",
key: "gameFriendRequestsViewAll",
component: () => <ShowAllRow onPress={() => {
navigation.navigate("requests");
}} users={stateFromStores.slice(3).map((item) => item.user)} count={stateFromStores.length} />
};
}
const r37 = stateFromStores[a1];
user2 = r37.user;
applicationId3 = r37.applicationId;
return {
type: "custom",
itemType: "incomingRequest",
key: `${user2.id}-${applicationId3}`,
component: () => <ConnectedIncomingGameFriendRequestRow accepted={state4.find((item) => item.userId === user2.id && item.applicationId === applicationId3) != null} applicationId={applicationId3} user={user2} start={start} end={end} onPress={callback4} onDeclineIncomingRequest={callback2} onAcceptIncomingRequest={callback} />
};
}
if (c11123_19.CONTACT_SUGGESTIONS === a0) {
suggestedFriend = friendSuggestions[a1];
return {
type: "custom",
itemType: suggestedFriend?.mutualFriendsCount != null ? suggestedFriend?.mutualFriendsCount > 0 ? "contactSuggestionMutualCount" : "contactSuggestionNoMutualCount" : "contactSuggestionNoMutualCount",
key: suggestedFriend.user.id,
component: () => <ContactSuggestionRow added={added.includes(suggestedFriend)} suggestedFriend={suggestedFriend} start={start} end={end} onPress={callback4} location={InstantInviteSources.ADD_FRIENDS_MODAL} onAddSuggestion={() => setAdded((prevAdded) => [...prevAdded, suggestedFriend])} />
};
}
}} getSectionProps={callback5} insetEnd={12} disableStickySections />}
</View>;
return <AnalyticsLocationProvider value={analyticsLocations}>{r173}</AnalyticsLocationProvider>;
};
@@ -0,0 +1,274 @@
// Metro module 15608 (f15609).
import { useEffect, useMemo, useState, useCallback, lazy } from "react";
import { View } from "react-native";
import NotificationCenterItemsStore from "../../../../notification_center/NotificationCenterItemsStore";
import RelationshipStore from "../../../../../stores/RelationshipStore";
import UserStore from "../../../../../stores/UserStore";
import { UserRowModes } from "../../shared_components/user_list/UserRowConstants";
import { AnalyticEvents, AnalyticsSections, RelationshipTypes } from "../../../../../Constants";
import { MINIMUM_PENDING_INCOMING_COUNT_FOR_CLEAR_ALL } from "../../../../people/Constants";
import { jsx } from "react/jsx-runtime";
import { createStyles } from "../../../../../design/components/Styles/native/createStyles";
import Module712 from "../../../../../_bundle/Module712";
import { openAlert } from "../../../../../design/components/AlertModal/native/useAlertStore.native";
import { useStateFromStoresArray, useStateFromStores } from "../../../../../_bundle/defaultAreStatesEqual";
import { NotificationCenterLocalItems } from "../../../../notification_center/NotificationCenterItemsTypes";
import { NotificationCenterAckedBeforeId } from "../../../../user_settings/UserSettings";
import { markNotificationCenterLocalItemsAcked, bulkMarkNotificationCenterItemsAcked } from "../../../../notification_center/NotificationCenterItemsActions";
import { isRemoteAcked } from "../../../../notification_center/NotificationCenterUtils";
import SnowflakeUtils from "../../../../../utils/SnowflakeUtils";
import useAnalyticsLocations, { AnalyticsLocationProvider } from "../../../../app_analytics/useAnalyticsLocations";
import AnalyticsLocation from "../../../../app_analytics/AnalyticsLocation";
import AnalyticsUtils from "../../../../../utils/AnalyticsUtils";
import { useGameRelationshipsByType } from "../../../../game_relationships/GameRelationshipStoreHooks";
import useGetOrFetchApplications from "../../../../applications/useGetOrFetchApplications";
import { getPendingRelationshipIds } from "../hooks/getPendingRelationshipIds";
import isUndefinedOrNull from "../../../../../_bundle/isUndefinedOrNull";
import showUserProfileActionSheet from "../../../../user_profile/native/showUserProfileActionSheet";
import { intl, t } from "../../../../../intl/index.native";
import { useNavigation } from "../../../../../design/components/Navigator/native/useNavigation.native";
import { TableRowGroup } from "../../../../../design/components/TableRow/native/TableRowGroup.native";
import { TableRow } from "../../../../../design/components/TableRow/native/TableRow.native";
import { Text } from "../../../../../design/components/Text/native/Text";
import { useSegmentedControlState } from "../../../../../design/components/SegmentedControl/native/SegmentedControlState.native";
import ThemedGradient from "../../../../client_themes/native/ThemedGradient";
import { SegmentedControl } from "../../../../../design/components/SegmentedControl/native/SegmentedControl.native";
import { PressableOpacity } from "../../../../../design/void/Pressables/native/Pressables";
import NoResults from "../../shared_components/user_list/NoResults";
import { WumpusCouchSpotIllustration } from "../../../../../design/assets/native";
import { UsersFastList } from "../../shared_components/user_list/UsersFastList";
let c11133_16, useStyles;
const compareUserItems = function compareUserItems(a0, a1) {
return a0.user.id === a1.user.id ? SnowflakeUtils.compare(a0.applicationId, a1.applicationId) : SnowflakeUtils.compare(a0.user.id, a1.user.id);
};
c11133_16 = {
Incoming: 0,
0: "Incoming",
Outgoing: 1,
1: "Outgoing"
};
useStyles = createStyles({
container: {
flex: 1
},
noResultsContainer: {
backgroundColor: Module712.colors.BACKGROUND_BASE_LOWER,
flex: 1
},
clearAllContainer: {
backgroundColor: Module712.colors.BACKGROUND_BASE_LOWER,
paddingHorizontal: Module712.space.PX_16,
paddingBottom: Module712.space.PX_16,
justifyContent: "flex-end",
flexDirection: "row"
},
clearAll: {
backgroundColor: Module712.colors.INPUT_BACKGROUND_DEFAULT,
borderColor: Module712.colors.INPUT_BACKGROUND_DEFAULT,
paddingHorizontal: Module712.space.PX_16,
minWidth: 2 * Module712.space.PX_64,
borderRadius: Module712.radii.round,
alignItems: "center",
paddingVertical: 5,
borderWidth: 3
},
tabs: {
backgroundColor: Module712.colors.BACKGROUND_BASE_LOWER,
paddingHorizontal: Module712.space.PX_16,
paddingBottom: Module712.space.PX_16,
paddingTop: Module712.space.PX_8
}
});
export default function FriendRequestsScreen() {
let r227;
let c22243_1, c22243_2, gameRelationshipsByType, gameRelationshipsByType2, pendingIncomingIds, pendingOutgoingIds, spamIds, ignoredUserIds, incoming, outgoing, spam, ignoredUsers, incomingData, outgoingData, callback, navigation;
let setting;
const styles = useStyles();
const analyticsLocations = useAnalyticsLocations(AnalyticsLocation.FRIEND_REQUESTS).analyticsLocations;
setting = void 0;
const stateFromStoresArray = useStateFromStoresArray([NotificationCenterItemsStore], () => NotificationCenterItemsStore.localItems.filter((localItem) => localItem.type === NotificationCenterLocalItems.INCOMING_FRIEND_REQUESTS || localItem.type === NotificationCenterLocalItems.INCOMING_GAME_FRIEND_REQUESTS));
setting = NotificationCenterAckedBeforeId.useSetting();
useEffect(() => {
if (stateFromStoresArray.length > 0) {
markNotificationCenterLocalItemsAcked(stateFromStoresArray.map((item) => item.local_id).filter(Boolean));
bulkMarkNotificationCenterItemsAcked(stateFromStoresArray.filter((item) => !isRemoteAcked(item, setting)));
}
}, [stateFromStoresArray, setting]);
useEffect(() => {
AnalyticsUtils.track(AnalyticEvents.FRIEND_ADD_VIEWED, {
friend_add_type: AnalyticsSections.FRIENDS_REQUESTS_MODAL
});
}, []);
const [r68, r69] = useStateFromStoresArray([RelationshipStore], () => [RelationshipStore.getMutableRelationships(), RelationshipStore.getVersion()]);
c22243_1 = r68;
c22243_2 = r69;
gameRelationshipsByType = useGameRelationshipsByType(RelationshipTypes.PENDING_INCOMING);
gameRelationshipsByType2 = useGameRelationshipsByType(RelationshipTypes.PENDING_OUTGOING);
useGetOrFetchApplications(useMemo(() => {
const set = new Set();
let c28106_0 = set;
gameRelationshipsByType.forEach((item) => {
c28106_0.add(item.applicationId);
});
gameRelationshipsByType2.forEach((item) => {
c28106_0.add(item.applicationId);
});
return Array.from(set);
}, [gameRelationshipsByType, gameRelationshipsByType2]));
const memo = useMemo(() => getPendingRelationshipIds(c22243_1, c22243_2), [r68, r69]);
pendingIncomingIds = memo.pendingIncomingIds;
pendingOutgoingIds = memo.pendingOutgoingIds;
spamIds = memo.spamIds;
ignoredUserIds = memo.ignoredUserIds;
const stateFromStores = useStateFromStores([UserStore], () => {
const r12 = pendingIncomingIds.map((pendingIncomingId) => ({
user: UserStore.getUser(pendingIncomingId),
isGameRelationship: false
})).filter((item) => item.user != null);
const r23 = gameRelationshipsByType.map((item) => ({
user: UserStore.getUser(item.id),
isGameRelationship: true,
applicationId: item.applicationId
})).filter((item) => item.user != null);
const r29 = pendingOutgoingIds.map((pendingOutgoingId) => ({
user: UserStore.getUser(pendingOutgoingId),
isGameRelationship: false
})).filter((item) => item.user != null);
const r35 = gameRelationshipsByType2.map((item) => ({
user: UserStore.getUser(item.id),
isGameRelationship: true,
applicationId: item.applicationId
})).filter((item) => item.user != null);
return {
incoming: [...r12, ...r23].sort(compareUserItems),
outgoing: [...r29, ...r35].sort(compareUserItems),
spam: spamIds.map((spamId) => ({
user: UserStore.getUser(spamId)
})).filter((item) => item.user != null),
ignoredUsers: ignoredUserIds.map((ignoredUserId) => ({
user: UserStore.getUser(ignoredUserId)
})).filter((item) => item.user != null)
};
}, [ignoredUserIds, gameRelationshipsByType, gameRelationshipsByType2, pendingIncomingIds, pendingOutgoingIds, spamIds], isUndefinedOrNull);
incoming = stateFromStores.incoming;
outgoing = stateFromStores.outgoing;
spam = stateFromStores.spam;
ignoredUsers = stateFromStores.ignoredUsers;
const memo2 = useMemo(() => ({
incomingData: {
items: incoming,
relationship: RelationshipTypes.PENDING_INCOMING
},
incomingSection: [incoming.length, spam.length + ignoredUsers.length > 0 ? 1 : 0],
outgoingData: {
items: outgoing,
relationship: RelationshipTypes.PENDING_OUTGOING
},
outgoingSection: [outgoing.length]
}), [ignoredUsers, incoming, outgoing, spam]);
incomingData = memo2.incomingData;
const incomingSection = memo2.incomingSection;
outgoingData = memo2.outgoingData;
let outgoingSection = memo2.outgoingSection;
const [state, setState] = useState(() => incoming.length === 0 && outgoing.length > 0 ? c11133_16.Outgoing : c11133_16.Incoming);
callback = useCallback((a0) => {
showUserProfileActionSheet({
userId: a0.id,
localUser: a0,
sourceAnalyticsLocations: analyticsLocations
});
}, [analyticsLocations]);
const callback2 = useCallback((a0) => {
if (a0 === 1) {
return {
type: "section",
props: {
title: intl.string(t["NHpP/k"])
}
};
}
}, []);
navigation = useNavigation();
const callback3 = useCallback((a0, a1) => {
if (a0 === 1) {
return {
type: "custom",
component: () => <TableRowGroup hasIcons={false}>
{spam.length > 0 ? <TableRow onPress={() => {
navigation.navigate("friends", {
screen: "spam-requests"
});
}} label={intl.string(t.fUQoqD)} trailing={<Text variant="text-sm/medium" color="text-muted">{spam.length}</Text>} arrow /> : null}
{ignoredUsers.length > 0 ? <TableRow onPress={() => {
navigation.navigate("friends", {
screen: "ignored-user-requests"
});
}} label={intl.string(t.en1Gkz)} trailing={<Text variant="text-sm/medium" color="text-muted">{ignoredUsers.length}</Text>} arrow /> : null}
</TableRowGroup>,
key: "spamRequests",
itemType: "spamRequests"
};
}
const r9 = state === c11133_16.Incoming ? incomingData : outgoingData;
const items = r9.items;
return {
type: "user",
props: {
type: r9.relationship,
user: items[a1].user,
onPress: callback,
mode: UserRowModes.ACTIONS,
start: a1 === 0,
end: a1 === items.length - 1,
applicationId: items[a1].applicationId,
isGameRelationship: items[a1].isGameRelationship
}
};
}, [state, incomingData, outgoingData, callback, spam.length, ignoredUsers.length, navigation]);
const r3 = state === c11133_16.Outgoing && outgoing.length === 0 || state === c11133_16.Incoming && incoming.length === 0 && spam.length === 0 && ignoredUserIds.length === 0;
const r143 = state === c11133_16.Incoming && incoming.length >= MINIMUM_PENDING_INCOMING_COUNT_FOR_CLEAR_ALL;
const segmentedControlState = useSegmentedControlState({
pageWidth: 0,
defaultIndex: state,
onSetActiveIndex: (a0) => {
setState(a0 === 0 ? c11133_16.Incoming : c11133_16.Outgoing);
},
items: [{
id: c11133_16.Incoming.toString(),
label: intl.string(t.bekioP),
page: null
}, {
id: c11133_16.Outgoing.toString(),
label: intl.string(t.tWqcIF),
page: null
}]
});
const r189 = [<ThemedGradient absolute />, ,];
const r201 = [<View style={styles.tabs}>
<SegmentedControl state={segmentedControlState} />
</View>, r143 ? <View style={styles.clearAllContainer}>
<PressableOpacity style={styles.clearAll} onPress={() => {
const length = incoming.length;
openAlert("clear-all-incoming-requests", jsx(lazy(() => import("../components/ClearAllIncomingRequestsAlertModal")), {
incomingRequestCount: length
}));
}}>
<Text variant="text-sm/semibold" color="text-brand">
{intl.string(t.O8k7O4)}
</Text>
</PressableOpacity>
</View> : null, ,];
if (r3) {
r227 = <View style={styles.noResultsContainer}>
<NoResults title={state === c11133_16.Incoming ? intl.string(t["7uvAKe"]) : intl.string(t["yvzX/Z"])} illustration={WumpusCouchSpotIllustration} disableBackgroundOverlay />
</View>;
} else {
if (state === c11133_16.Incoming) {
outgoingSection = incomingSection;
}
r227 = <UsersFastList sections={outgoingSection} getItemProps={callback3} getSectionProps={callback2} />;
}
r201[2] = r227;
r189[1] = <View style={styles.container}>{r201}</View>;
return <AnalyticsLocationProvider value={analyticsLocations}>{r189}</AnalyticsLocationProvider>;
};
@@ -0,0 +1,22 @@
// Metro module 15606 (f15607).
import { ScrollView } from "react-native";
import { createStyles } from "../../../../../design/components/Styles/native/createStyles";
import Module712 from "../../../../../_bundle/Module712";
import ThemedGradient from "../../../../client_themes/native/ThemedGradient";
import UserSettingsFriendRequests from "../../../../user_settings/content_and_social/native/UserSettingsFriendRequests";
const useStyles = createStyles({
container: {
backgroundColor: Module712.colors.BACKGROUND_BASE_LOWER,
flex: 1,
paddingTop: Module712.space.PX_16,
paddingHorizontal: Module712.space.PX_16
}
});
export default function FriendRequestsSettingsScreen() {
return <>
<ThemedGradient absolute />
<ScrollView style={useStyles().container}>
<UserSettingsFriendRequests />
</ScrollView>
</>;
};
@@ -0,0 +1,143 @@
// Metro module 15578 (f15579).
import { useCallback, useEffect, useMemo } from "react";
import { View } from "react-native";
import GameRelationshipStore from "../../../../game_relationships/GameRelationshipStore";
import RelationshipStore from "../../../../../stores/RelationshipStore";
import { createStyles } from "../../../../../design/components/Styles/native/createStyles";
import Module712 from "../../../../../_bundle/Module712";
import { useNavigation } from "../../../../../design/components/Navigator/native/useNavigation.native";
import useAnalyticsLocations, { AnalyticsLocationProvider } from "../../../../app_analytics/useAnalyticsLocations";
import AnalyticsLocation from "../../../../app_analytics/AnalyticsLocation";
import useSafeAreaInsets_native from "../../../../safe_area/useSafeAreaInsets.native";
import { useStateFromStoresObject } from "../../../../../_bundle/Module589";
import { getIncomingFriendRequestCount, getOutgoingFriendRequestCount } from "../../../../people/hooks/useFriendRequestCounts";
import { dismissGlobalKeyboard } from "../../../../../utils/native/KeyboardManagerUtils";
import showUserProfileActionSheet from "../../../../user_profile/native/showUserProfileActionSheet";
import trackFriendListViewed from "../../../../app_analytics/track/friends_list_viewed/trackFriendListViewed";
import trackFriendListClicked from "../../../../app_analytics/track/friends_list_viewed/trackFriendListClicked";
import Module15314 from "../../../../../_bundle/Module15314";
import { SendMessageIcon } from "../../../../../design/components/Icon/native/redesign/generated/SendMessageIcon";
import { intl, t } from "../../../../../intl/index.native";
import { TableRow } from "../../../../../design/components/TableRow/native/TableRow.native";
import NoResults from "../../shared_components/user_list/NoResults";
import { WumpusCouchSpotIllustration } from "../../../../../design/assets/native";
import { Button } from "../../../../../design/components/Button/native/Button.native";
import SearchableUserList from "../../shared_components/user_list/SearchableUserList";
import { TTIFirstContentfulPaint } from "../../../../tti_analytics/native/TTIFirstContentfulPaint";
const useStyles = createStyles({
container: {
paddingTop: Module712.space.PX_8,
flex: 1
},
requestsButtonContainer: {
marginHorizontal: Module712.space.PX_16,
borderRadius: Module712.radii.lg,
overflow: "hidden"
},
emptyContainer: {
justifyContent: "center",
flexGrow: 1
},
buttonContainer: {
flexDirection: "row",
marginBottom: Module712.space.PX_16,
width: "100%"
}
});
export default function FriendsScreen() {
let incoming, outgoing, spam, pendingIgnored;
const navigation = useNavigation();
const styles = useStyles();
const analyticsLocations = useAnalyticsLocations(AnalyticsLocation.FRIENDS_LIST).analyticsLocations;
const bottom = useSafeAreaInsets_native().bottom;
const stateFromStoresObject = useStateFromStoresObject([RelationshipStore, GameRelationshipStore], () => ({
incoming: getIncomingFriendRequestCount([RelationshipStore, GameRelationshipStore]),
outgoing: getOutgoingFriendRequestCount([RelationshipStore, GameRelationshipStore]),
spam: RelationshipStore.getSpamCount(),
pendingIgnored: RelationshipStore.getPendingIgnoredCount()
}));
incoming = stateFromStoresObject.incoming;
outgoing = stateFromStoresObject.outgoing;
spam = stateFromStoresObject.spam;
pendingIgnored = stateFromStoresObject.pendingIgnored;
const callback = useCallback((a0) => {
dismissGlobalKeyboard();
showUserProfileActionSheet({
userId: a0.id,
localUser: a0,
sourceAnalyticsLocations: analyticsLocations
});
}, [analyticsLocations]);
const callback2 = useCallback((a0) => {
navigation.navigate("friends", {
screen: "new-message",
params: {
defaultSelectedUserId: a0.id,
sourcePage: "Friends Screen"
}
});
}, [navigation]);
useEffect(() => {
trackFriendListViewed({
tab_opened: null
});
trackFriendListClicked({
tab_opened: null
});
}, []);
return <AnalyticsLocationProvider value={analyticsLocations}>
<SearchableUserList onSelectUser={callback} handleMessage={callback2} actions={useMemo(() => {
const incoming2 = incoming + spam + pendingIgnored;
const r1 = incoming2 > 0 || outgoing > 0;
const r16 = [];
if (r1) {
r16.push({
icon: Module15314,
IconComponent: SendMessageIcon,
iconVariant: "default",
label: intl.string(t.fyA115),
subLabel: intl.formatToPlainString(t["1IEawz"], {
incoming: incoming2,
outgoing
}),
onPress: () => navigation.navigate("friends", {
screen: "requests"
})
});
}
return r16;
}, [incoming, navigation, outgoing, spam, pendingIgnored])} withAffinitySuggestions={false} withGameFriends defaultNoResultsFound={useMemo(() => <View style={styles.container}>
{incoming + outgoing + spam > 0 ? <View style={styles.requestsButtonContainer}>
<TableRow start end icon={<TableRow.Icon source={Module15314} />} trailing={<TableRow.Arrow />} label={intl.string(t.fyA115)} subLabel={incoming + outgoing > 0 ? intl.formatToPlainString(t["1IEawz"], {
incoming,
outgoing
}) : intl.formatToPlainString(t.e6BtLq, {
spam
})} onPress={() => {
if (incoming + outgoing > 0) {
navigation.navigate("friends", {
screen: "requests"
});
} else {
navigation.navigate("friends", {
screen: "spam-requests"
});
}
}} />
</View> : null}
<NoResults title={intl.string(t["oi+B4p"])} fullHeight containerStyle={styles.emptyContainer} illustration={WumpusCouchSpotIllustration}>
<View style={[styles.buttonContainer, {
paddingBottom: bottom
}]}>
<Button text={intl.string(t.zIJnA6)} size="lg" onPress={() => navigation.navigate("friends", {
screen: "add-friends",
params: {
sourcePage: "Friends Screen"
}
})} grow />
</View>
</NoResults>
</View>, [bottom, incoming, navigation, outgoing, styles, spam])} hideSearchOnDefaultNoResults disableThemedGradient />
<TTIFirstContentfulPaint label="friends" />
</AnalyticsLocationProvider>;
};
@@ -0,0 +1,23 @@
// Metro module 11790 (f11791).
const r12 = {
USER_SUGGESTIONS: 1,
1: "USER_SUGGESTIONS",
FF_PEOPLE_YOU_MAY_KNOW: 2,
2: "FF_PEOPLE_YOU_MAY_KNOW"
};
const r15 = {
SYNC_CONTACTS: 0,
0: "SYNC_CONTACTS",
FRIEND_SUGGESTIONS: 1,
1: "FRIEND_SUGGESTIONS",
PENDING: 2,
2: "PENDING",
ONLINE: 3,
3: "ONLINE",
OFFLINE: 4,
4: "OFFLINE",
SPAM: 5,
5: "SPAM"
};
export { r12 as SuggestedFriendSource };
export { r15 as Sections };
@@ -0,0 +1,44 @@
// Metro module 15612 (f15613).
import { useCallback } from "react";
import RelationshipStore from "../../../../../stores/RelationshipStore";
import UserStore from "../../../../../stores/UserStore";
import { UserRowModes } from "../../shared_components/user_list/UserRowConstants";
import { RelationshipTypes } from "../../../../../Constants";
import useAnalyticsLocations from "../../../../app_analytics/useAnalyticsLocations";
import AnalyticsLocation from "../../../../app_analytics/AnalyticsLocation";
import { useStateFromStoresArray, useStateFromStores } from "../../../../../_bundle/Module589";
import { getPendingRelationshipIds } from "../hooks/getPendingRelationshipIds";
import showUserProfileActionSheet from "../../../../user_profile/native/showUserProfileActionSheet";
import { UsersFastList } from "../../shared_components/user_list/UsersFastList";
export default function IgnoredUserRequestsScreen(props) {
let stateFromStores, callback;
const navigation = props.navigation;
stateFromStores = void 0;
callback = void 0;
const analyticsLocations = useAnalyticsLocations(AnalyticsLocation.FRIEND_REQUESTS).analyticsLocations;
const stateFromStoresArray = useStateFromStoresArray([RelationshipStore], () => getPendingRelationshipIds(RelationshipStore.getMutableRelationships()).ignoredUserIds);
stateFromStores = useStateFromStores([UserStore], () => stateFromStoresArray.map((item) => UserStore.getUser(item)).filter((item) => item != null), [stateFromStoresArray]);
callback = useCallback((a0) => {
showUserProfileActionSheet({
userId: a0.id,
localUser: a0,
sourceAnalyticsLocations: analyticsLocations
});
}, [analyticsLocations]);
const callback2 = useCallback(() => {}, []);
const callback3 = useCallback((a0) => ({
type: "user",
props: {
type: RelationshipTypes.PENDING_INCOMING,
user: stateFromStores[a0],
onPress: callback,
mode: UserRowModes.ACTIONS,
start: a0 === 0,
end: a0 === stateFromStores.length - 1
}
}), [callback, stateFromStores]);
if (stateFromStores.length !== 0) {
return <UsersFastList getItemProps={callback3} getSectionProps={callback2} sections={[stateFromStores.length]} />;
}
navigation.goBack();
};
@@ -0,0 +1,398 @@
// Metro module 15596 (f15597).
import _slicedToArray from "../../../../../_bundle/_slicedToArray";
import _asyncToGenerator from "../../../../../_bundle/_asyncToGenerator";
import { useState, useMemo, useEffect, useCallback, useLayoutEffect } from "react";
import { ActivityIndicator, View } from "react-native";
import ChannelStore from "../../../../../stores/ChannelStore";
import PrivateChannelRecipientsInviteStore from "../../../../../stores/PrivateChannelRecipientsInviteStore";
import RTCConnectionStore from "../../../../../stores/RTCConnectionStore";
import UserStore from "../../../../../stores/UserStore";
import { UserRowModes } from "../../shared_components/user_list/UserRowConstants";
import { NEW_GROUP_DM_POPOUT_ID, AnalyticEvents, AnalyticsSections, InstantInviteSources } from "../../../../../Constants";
import { jsx } from "react/jsx-runtime";
import { createStyles } from "../../../../../design/components/Styles/native/createStyles";
import Module712 from "../../../../../_bundle/Module712";
import ChannelActionCreators from "../../../../../actions/ChannelActionCreators";
import { showGuardCallAlert } from "../../../../../utils/native/PrivateChannelCallUtils";
import CallActionCreators from "../../../../../actions/CallActionCreators";
import ActionSheetActionCreators from "../../../../action_sheet/native/ActionSheetActionCreators";
import { useStateFromStores } from "../../../../../_bundle/Module589";
import getGroupDMRecipientLimit from "../../../../group_dm/getGroupDMRecipientLimit";
import AnalyticsUtils from "../../../../../utils/AnalyticsUtils";
import ToastActionCreators from "../../../../toast/native/ToastActionCreators";
import { intl, t } from "../../../../../intl/index.native";
import { GenericHeaderTitle, getRenderHeaderTextButton } from "../../shared_components/HeaderShared";
import useIsUsingClientTheme from "../../../../client_themes/native/useIsUsingClientTheme";
import InstantInviteShareApps from "../../../../instant_invite/native/components/InstantInviteShareApps";
import InstantInviteActionCreators from "../../../../../actions/InstantInviteActionCreators";
import getInviteURL from "../../../../instant_invite/getInviteURL";
import { TextInput } from "../../../../../design/void/native";
import SearchableUserList from "../../shared_components/user_list/SearchableUserList";
import { HermesBuiltin } from "../../../../../_hermes/prelude";
function $mk116987($env) {
return function*() {
let r50;
let env31772 = {
$parent: $env
};
env31772[1] = 0;
env31772[2] = 0;
const r33 = env31772.$parent;
env31772[0] = r33;
const r11 = r33[1];
if (r11.length === 1) {
r50 = yield (0, handleOneRecipientInDM)(r11, r33[2]);
} else {
r50 = yield ChannelActionCreators.addRecipients(r33[0].id, r11, void 0, r33[2]);
}
const r58 = env31772[0];
r58[3] = r50;
const r59 = r58.$parent;
yield (0, r59[0])(r59[2][14]).monkeyPatchCall();
const r80 = env31772[0];
const r81 = r80.$parent;
(0, r81[1])(r81[2][15]).call(r80[3], false, true);
(0, r81[1])(r81[2][16])(r80[3]);
};
}
let useStyles;
let env11121 = {};
const handleOneRecipientInDM = async function handleOneRecipientInDM(c28094_0, onBeforeTransition) {
let c30902_0 = c28094_0;
let c30902_1 = await ChannelActionCreators.openPrivateChannel({
recipientIds: [],
location: "New Group DM",
onBeforeTransition
});
const r20 = await ChannelActionCreators.addRecipients(c30902_1, c30902_0, void 0);
c30902_1 = r20;
return r20;
};
env11121[22] = function _handleInviteUsers() {
const r8 = async function(c28095_0, c28095_1, c28095_2) {
let r129, r130;
let env30903;
const r11 = env11121;
let c28095_4 = r11;
const r36 = env30903 = {
$parent: r11
};
let c28095_3 = r36;
env30903[1] = void 0;
env30903[2] = void 0;
env30903[0] = c28095_0;
let r37 = c28095_1;
if (r37 === void 0) {
r37 = Array.from(PrivateChannelRecipientsInviteStore.getSelectedUsers());
}
env30903[1] = r37;
env30903[2] = c28095_2;
env30903[3] = void 0;
await void 0;
L19: {
if (env30903[0] != null) {
if (RTCConnectionStore.getChannelId() !== env30903[0].id) {
env30903[3] = env30903[0].isDM() && env30903[1].length === 1 ? await (0, handleOneRecipientInDM)(env30903[1], env30903[2]) : await ChannelActionCreators.addRecipients(env30903[0].id, env30903[1], void 0, env30903[2]);
break L19;
}
}
if (env30903[0] != null) {
if (RTCConnectionStore.getChannelId() === env30903[0].id) {
const isDM = env30903[0].isDM();
if (isDM) {
showGuardCallAlert((0, _asyncToGenerator)($mk116987(c28095_3)));
break L19;
}
if (!env30903[0].isGroupDM()) {
break L19;
}
env30903[3] = await ChannelActionCreators.addRecipients(env30903[0].id, env30903[1], void 0, env30903[2]);
CallActionCreators.ring(env30903[3], env30903[1], "gdm_invite");
} else {
r129 = c28095_3;
r130 = c28095_4;
env30903[3] = await ChannelActionCreators.openPrivateChannel({
recipientIds: env30903[1],
location: "New Group DM",
onBeforeTransition: env30903[2]
});
}
} else {
r129 = c28095_3;
r130 = c28095_4;
env30903[3] = await ChannelActionCreators.openPrivateChannel({
recipientIds: env30903[1],
location: "New Group DM",
onBeforeTransition: env30903[2]
});
}
}
ActionSheetActionCreators.hideActionSheet(NEW_GROUP_DM_POPOUT_ID);
return env30903[3];
};
env11121[22] = r8;
return r8.apply(this, arguments);
};
useStyles = createStyles({
button: {
color: Module712.colors.INTERACTIVE_TEXT_ACTIVE
},
container: {
height: "100%",
display: "flex"
},
instantInviteView: {
flexShrink: 1,
backgroundColor: Module712.colors.MOBILE_ACTIONSHEET_BACKGROUND
},
nameInputContainer: {
paddingHorizontal: 16,
backgroundColor: Module712.colors.BACKGROUND_BASE_LOW
},
nameInput: {
backgroundColor: Module712.colors.BACKGROUND_BASE_LOWER,
marginBottom: 8,
height: 40,
width: "100%"
}
});
export default function NewGroupDMScreen(props) {
let env22228 = {
$parent: env11121
};
const navigation = props.navigation;
env22228[0] = navigation;
const params = props.route.params;
env22228[1] = params.channelId;
const locationPage = params.locationPage;
env22228[2] = locationPage;
let allowNameEdit = params.allowNameEdit;
if (allowNameEdit === void 0) {
allowNameEdit = false;
}
env22228[3] = void 0;
env22228[4] = void 0;
env22228[5] = void 0;
env22228[6] = void 0;
env22228[7] = void 0;
env22228[8] = void 0;
env22228[9] = void 0;
env22228[10] = void 0;
env22228[11] = void 0;
env22228[12] = void 0;
env22228[13] = void 0;
env22228[14] = void 0;
env22228[15] = void 0;
env22228[16] = void 0;
const styles = useStyles();
env22228[3] = styles;
const stateFromStores = useStateFromStores([ChannelStore], () => ChannelStore.getChannel(env22228[1]));
env22228[4] = stateFromStores;
const stateFromStores2 = useStateFromStores([UserStore], () => UserStore.getCurrentUser());
env22228[5] = stateFromStores2;
const r48 = _slicedToArray(useState([]), 2);
const selectedUserIds = r48[0];
env22228[6] = selectedUserIds;
env22228[7] = r48[1];
const r52 = _slicedToArray(useState(false), 2);
const r25 = r52[0];
env22228[8] = r25;
env22228[9] = r52[1];
const r56 = _slicedToArray(useState(""), 2);
const value = r56[0];
env22228[10] = value;
const onChangeText = r56[1];
const memo = useMemo(() => {
let r4 = env22228[4]?.recipients;
if (r4 == null) {
r4 = [];
}
return r4;
}, [stateFromStores]);
env22228[11] = memo;
const length = selectedUserIds.length;
let length2 = memo.length;
if (length2 == null) {
length2 = 0;
}
const r19 = length + (length2 + 1);
env22228[12] = r19;
const r4 = r19 > getGroupDMRecipientLimit(stateFromStores);
env22228[13] = r4;
useEffect(() => {
AnalyticsUtils.track(AnalyticEvents.OPEN_POPOUT, {
type: AnalyticsSections.DM_INVITE,
location: {
page: env22228[2]
}
});
}, [locationPage]);
const callback = useCallback(async () => {
let c28096_0, c28096_1, c28096_2;
let c28096_3 = 0;
const r15 = env22228;
L17: {
try {
let env30904;
c28096_1 = r15;
const r37 = env30904 = {
$parent: r15
};
c28096_0 = r37;
env30904[0] = void 0;
(0, env22228[9])(true);
c28096_3 = 1;
env30904[0] = await (function handleInviteUsers() {
return env11121[22].apply(this, arguments);
})(env22228[4], [...env22228[6], ...env22228[11]], () => {
const r3 = env22228[0];
let r4 = r3.getParent();
if (r4 == null) {
r4 = r3;
}
return r4.goBack();
});
c28096_3 = 0;
if (env22228[4] == null && env30904[0] != null && env22228[10] !== "") {
await ChannelActionCreators.setName(env30904[0], env22228[10]);
break L17;
}
} catch ($e) {
const r35 = $e;
let r7 = r35;
c28096_2 = r35;
if (c28096_3 !== 0) {
while (true) {
try {
c28096_3 = 0;
ToastActionCreators.open({
key: "GROUP_DM_ADD_ERROR",
content: intl.string(t["N/9OFy"])
});
(0, env22228[9])(false);
} catch (r110) {
r7 = r110;
c28096_2 = r110;
if (c28096_3 === 0) {
break;
}
continue;
}
return void 0;
}
}
throw r7;
}
return void 0;
}
}, [stateFromStores, navigation, memo, selectedUserIds, value]);
env22228[14] = callback;
useLayoutEffect(() => {
const r10 = env22228[4];
const title = (r10 == null ? void 0 : r10.isGroupDM()) ? intl.string(t["LR+Ptf"]) : intl.string(t["3hF1W4"]);
if (r10 != null) {
r10.isGroupDM();
}
const subtitle = intl.formatToPlainString(t.YUhnoy, {
numMembers: env22228[12],
maxMemberLimit: getGroupDMRecipientLimit(r10)
});
env22228[0].setOptions({
title: `${title} (${subtitle})`,
headerTitle: (a0) => {
if (a0 == null) {
HermesBuiltin.throwTypeError("Cannot destructure 'undefined' or 'null'.");
throw new Error("unreachable");
}
return <GenericHeaderTitle {...HermesBuiltin.copyDataProperties({}, a0, void 0)} title={title} subtitle={subtitle} color={env22228[13] ? "text-feedback-critical" : "mobile-text-heading-primary"} />;
},
headerRight: (a0) => {
let r39;
if (env22228[8]) {
r39 = (0, jsx)(ActivityIndicator, {
color: env22228[3].button.color,
size: "small"
});
} else {
const r11 = env22228[4];
r39 = (r11 == null ? void 0 : r11.isGroupDM()) ? getRenderHeaderTextButton(intl.string(t.OYkgVk), async () => await (0, env22228[14])())({
...a0,
disabled: env22228[13] || (r11 == null ? void 0 : r11.isGroupDM()) && env22228[6].length <= 0
}) : getRenderHeaderTextButton(intl.string(t.CumH4u), async () => await (0, env22228[14])())({
...a0,
disabled: env22228[13]
});
}
return r39;
}
});
}, [stateFromStores, r25, navigation, r19, r4, memo, selectedUserIds, callback, styles]);
const callback2 = useCallback((c28098_0) => {
(0, env22228[7])((a0) => {
const indexOf = a0.indexOf;
const r9 = indexOf.call(a0, c28098_0.id);
const r10 = [...a0];
if (r9 === -1) {
r10.push(c28098_0.id);
} else {
r10.splice(r9, 1);
}
return r10;
});
}, []);
const r85 = _slicedToArray(useState(false), 2);
env22228[15] = r85[0];
env22228[16] = r85[1];
const isUsingClientTheme = useIsUsingClientTheme();
let r96 = (stateFromStores == null ? void 0 : stateFromStores.isGroupDM()) && stateFromStores2 != null && r19 < getGroupDMRecipientLimit(stateFromStores);
if (r96) {
let c22229_0 = async (c30905_0) => {
let c30905_2;
let c31775_0, c31775_1;
L15: {
c30905_2 = void 0;
c31775_0 = c30905_0;
c31775_1 = void 0;
if (env22228[15]) {
break L15;
}
(0, env22228[16])(true);
c31775_1 = await InstantInviteActionCreators.mobileCreateInvite(env22228[4], InstantInviteSources.GROUP_DM);
if (c31775_1 != null) {
c31775_0({
channel: env22228[4],
code: c31775_1,
message: intl.formatToPlainString(t["+zWvOQ"], {
username: env22228[5].username,
link: getInviteURL(c31775_1)
}),
location: InstantInviteSources.GROUP_DM
});
}
(0, env22228[16])(false);
return void 0;
}
};
r96 = <View style={styles.instantInviteView}>
<InstantInviteShareApps onItemPressed={function() {
return c22229_0.apply(this, arguments);
}} />
</View>;
}
return <View style={styles.container}>
{r96}
{allowNameEdit ? <View style={styles.nameInputContainer}>
<TextInput style={styles.nameInput} value={value} onChangeText={onChangeText} placeholder={intl.string(t.KSVhrX)} />
</View> : null}
{(0, jsx)(SearchableUserList, {
rowMode: UserRowModes.TOGGLE,
onSelectUser: callback2,
disabledUserIds: memo,
selectedUserIds,
withAffinitySuggestions: true,
withAlphabeticalSections: false,
disableGradient: true,
disableStickySections: isUsingClientTheme
})}
</View>;
};
@@ -0,0 +1,489 @@
// Metro module 15584 (f15585).
import _slicedToArray from "../../../../../_bundle/_slicedToArray";
import { useMemo, useRef, useEffect, useCallback, useState, useLayoutEffect } from "react";
import { View } from "react-native";
import { PrivateChannelRecord } from "../../../../../records/ChannelRecord";
import ChannelStore from "../../../../../stores/ChannelStore";
import RelationshipStore from "../../../../../stores/RelationshipStore";
import PrivateChannelSortStore from "../../../../../stores/views/PrivateChannelSortStore";
import { UserRowModes } from "../../shared_components/user_list/UserRowConstants";
import { ME, AnalyticEvents, ChannelTypes, Routes, AnalyticsSections } from "../../../../../Constants";
import { jsx } from "react/jsx-runtime";
import ReanimatedRexport, { useAnimatedStyle } from "../../../../reanimated/ReanimatedRexport";
import { Text } from "../../../../../design/components/Text/native/Text";
import { createStyles } from "../../../../../design/components/Styles/native/createStyles";
import Module712 from "../../../../../_bundle/Module712";
import { isAndroid } from "../../../../../utils/PlatformUtils";
import ChannelActionCreators from "../../../../../actions/ChannelActionCreators";
import { FAKE_PLACEHOLDER_PRIVATE_CHANNEL_ID } from "../../../../channel/FakePlaceholderPrivateChannel";
import Dispatcher from "../../../../../Dispatcher";
import { useStateFromStores } from "../../../../../_bundle/Module589";
import AnalyticsUtils from "../../../../../utils/AnalyticsUtils";
import useOnMessageSend from "../../../../messages/useOnMessageSend";
import getGroupDMRecipientLimit from "../../../../group_dm/getGroupDMRecipientLimit";
import * as _timing from "../../../../../design/animation/reanimated/timing/timing";
import { GenericHeaderTitle } from "../../shared_components/HeaderShared";
import { intl, t } from "../../../../../intl/index.native";
import ChatView from "../../../../chat/native/ChatView";
import { PortalKeyboardRenderer } from "../../../../keyboard/native/PortalKeyboardRenderer";
import useAnalyticsLocations, { AnalyticsLocationProvider } from "../../../../app_analytics/useAnalyticsLocations";
import AnalyticsLocation from "../../../../app_analytics/AnalyticsLocation";
import useSafeAreaInsetsKeyboardAware_native from "../../../../safe_area/useSafeAreaInsetsKeyboardAware.native";
import useMountEffect from "../../../../../hooks/useMountEffect";
import ChannelActions from "../../channel/ChannelActions";
import { transitionTo } from "../../../../routing/router_utils";
import { showMaxGroupMembers } from "../../../../toast/native/ToastUtils";
import Module10223 from "../../../../../_bundle/Module10223";
import { GroupPlusIcon } from "../../../../../design/components/Icon/native/redesign/generated/GroupPlusIcon";
import Module4128 from "../../../../../_bundle/Module4128";
import { UserPlusIcon } from "../../../../../design/components/Icon/native/redesign/generated/UserPlusIcon";
import NoResults from "../../shared_components/user_list/NoResults";
import { Button } from "../../../../../design/components/Button/native/Button.native";
import NewMessageUserList from "../../shared_components/user_list/NewMessageUserList";
let findLocalMatchingPrivateChannelId, Header, ChatPreview, Component, useStyles, c11109_24;
let env11109 = {};
const isPrivateChannelMatch = function isPrivateChannelMatch(a0, { recipients }) {
if (recipients.length !== a0.length) {
return false;
}
for (const item of recipients) {
if (a0.includes(item)) {
continue;
}
return false;
}
return true;
};
findLocalMatchingPrivateChannelId = function findLocalMatchingPrivateChannelId(a0) {
if (a0.length === 1) {
let r45 = ChannelStore.getDMFromUserId(a0[0]);
if (r45 == null) {
r45 = null;
}
return r45;
}
const r27 = _slicedToArray(PrivateChannelSortStore.getSortedChannels(), 2);
for (const item of [r27[0], r27[1]]) {
const r37 = item.find((item) => {
const channel = ChannelStore.getChannel(item.channelId);
const r2 = channel == null || !channel.isPrivate();
return r2 ? !r2 : isPrivateChannelMatch(a0, channel);
});
if (r37 == null) {
continue;
}
return r37.channelId;
}
return null;
};
env11109[23] = function _findMatchingPrivateChannelId() {
const r8 = async (c28086_0) => {
let r26, dMChannel;
let c28086_4 = 0;
L15: {
L14: {
try {
r26 = findLocalMatchingPrivateChannelId(c28086_0);
if (r26 != null) {
break L15;
}
if (c28086_0.length > 1) {
break L14;
}
c28086_4 = 1;
dMChannel = await ChannelActionCreators.getDMChannel(c28086_0[0]);
c28086_4 = 0;
} catch ($e) {
let r7 = $e;
if (c28086_4 !== 0) {
while (true) {
try {
c28086_4 = 0;
} catch ($e) {
r7 = $e;
if (c28086_4 === 0) {
break;
}
continue;
}
return null;
}
}
throw r7;
}
return dMChannel;
}
return null;
}
return r26;
};
env11109[23] = r8;
return r8.apply(this, arguments);
};
Header = function Header(props) {
const { title, numInGroup } = props;
const styles = useStyles();
const memo = useMemo(() => getGroupDMRecipientLimit() - (numInGroup + 1), [numInGroup]);
const r24 = function() {
const r4 = numInGroup >= 5;
return {
opacity: _timing.withTiming(r4 ? 1 : 0),
maxHeight: _timing.withTiming(r4 ? 20 : 0)
};
};
r24.__closure = {
numInGroup,
NUM_IN_GROUP_THRESHOLD: 5,
withTiming: _timing.withTiming
};
r24.__workletHash = 12426216833792;
r24.__initData = c11109_24;
const animatedStyle = useAnimatedStyle(r24);
const r2 = memo === 0;
return <View style={styles.header}>
<GenericHeaderTitle title={title} />
<Component style={animatedStyle} variant="text-xs/medium" color={r2 ? "text-feedback-critical" : "text-muted"}>
{r2 ? intl.string(t.yiQW1O) : intl.formatToPlainString(t.HrSDPF, {
number: `${memo}`
})}
</Component>
</View>;
};
ChatPreview = function ChatPreview(props) {
let channelId2, navigateToChannel;
const { channelId, navigateToChannel: navigateToChannel2, tagListInputRef } = props;
const styles = useStyles();
const ref = useRef(null);
useEffect(() => {
if (channelId != null) {
ChannelActionCreators.preload(ME, channelId);
}
}, [channelId]);
channelId2 = channelId;
navigateToChannel = navigateToChannel2;
useOnMessageSend(useCallback(() => {
AnalyticsUtils.track(AnalyticEvents.MESSAGE_COMPOSER_TRANSITIONED, {
channel_id: channelId2
});
navigateToChannel(channelId2);
}, [channelId, navigateToChannel]));
return <View style={styles.background}>
<View style={styles.container}>
<ChatView guildId={ME} channelId={channelId} chatInputRef={ref} HACK_fixModalInteraction alwaysRespectKeyboard screenIndex="new-message" secondaryTextFieldRef={tagListInputRef} />
<PortalKeyboardRenderer portal={isAndroid()} />
</View>
</View>;
};
Component = ReanimatedRexport.createAnimatedComponent(Text);
useStyles = createStyles({
container: {
flex: 1
},
background: {
flex: 1,
backgroundColor: Module712.colors.BACKGROUND_BASE_LOW
},
header: {
flexDirection: "column",
alignItems: isAndroid() ? "flex-start" : "center"
},
emptyContainer: {
flexGrow: 1,
justifyContent: "center"
},
emptyKeyboardView: {
flexGrow: 1
},
addFriendsButtonContainer: {
marginBottom: Module712.space.PX_16,
flexDirection: "row",
justifyContent: "center",
width: "100%"
}
});
c11109_24 = {
code: "function NewMessageScreenTsx1(){const{numInGroup,NUM_IN_GROUP_THRESHOLD,withTiming}=this.__closure;const show=numInGroup>=NUM_IN_GROUP_THRESHOLD;return{opacity:withTiming(show?1:0),maxHeight:withTiming(show?20:0)};}"
};
export default function NewMessageScreen(props) {
let env22213 = {
$parent: env11109
};
const navigation = props.navigation;
env22213[0] = navigation;
const params = props.route.params;
const defaultSelectedUserId = params.defaultSelectedUserId;
env22213[1] = params.sourcePage;
env22213[2] = void 0;
env22213[3] = void 0;
env22213[4] = void 0;
env22213[5] = void 0;
env22213[6] = void 0;
env22213[7] = void 0;
env22213[8] = void 0;
env22213[9] = void 0;
env22213[10] = void 0;
env22213[11] = void 0;
const styles = useStyles();
env22213[2] = styles;
const analyticsLocations = useAnalyticsLocations(AnalyticsLocation.NEW_MESSAGE_COMPOSER).analyticsLocations;
const insets = useSafeAreaInsetsKeyboardAware_native({
includeKeyboardHeight: true
}).insets;
env22213[3] = insets;
useMountEffect(() => {
AnalyticsUtils.track(AnalyticEvents.MESSAGE_COMPOSER_OPENED, {
source_page: env22213[1]
});
});
const r45 = defaultSelectedUserId != null ? [defaultSelectedUserId] : [];
let stateFromStores;
let c22215_0;
const r48 = _slicedToArray(useState(r45), 2);
const r13 = r48[0];
env22213[4] = r13;
env22213[5] = r48[1];
const r52 = _slicedToArray(useState(false), 2);
const r53 = r52[0];
env22213[6] = r52[1];
const r57 = _slicedToArray(useState(false), 2);
const forceSearchResults = r57[0];
env22213[7] = r57[1];
const state = r13;
stateFromStores = void 0;
let [channelId3, setState] = useState(null);
const state2 = channelId3;
useEffect(() => {
let handleChannelDelete2;
const handleChannelCreate2 = function handleChannelCreate({ channel }) {
if (channel.id !== FAKE_PLACEHOLDER_PRIVATE_CHANNEL_ID && channel.isPrivate() && isPrivateChannelMatch(state, channel)) {
setState(findLocalMatchingPrivateChannelId(state));
}
};
handleChannelDelete2 = function handleChannelDelete(c30896_0) {
setState((prevState) => prevState !== FAKE_PLACEHOLDER_PRIVATE_CHANNEL_ID ? prevState !== c30896_0.channel.id ? prevState : null : prevState);
};
Dispatcher.subscribe("CHANNEL_CREATE", handleChannelCreate2);
Dispatcher.subscribe("CHANNEL_DELETE", handleChannelDelete2);
return () => {
Dispatcher.unsubscribe("CHANNEL_CREATE", handleChannelCreate2);
Dispatcher.unsubscribe("CHANNEL_DELETE", handleChannelDelete2);
};
}, [state]);
stateFromStores = useStateFromStores([ChannelStore], () => ChannelStore.getChannel(state2));
useEffect(() => {
let _doAction2 = function _doAction() {
const r9 = async () => {
let c31770_1;
let env32073;
c31770_1 = void 0;
const r11 = env32073 = {
$parent: env11109
};
let c31770_0 = r11;
env32073[0] = void 0;
env32073[0] = await (function findMatchingPrivateChannelId() {
return env11109[23].apply(this, arguments);
})(state);
setState(env32073[0] == null ? FAKE_PLACEHOLDER_PRIVATE_CHANNEL_ID : env32073[0]);
};
_doAction2 = r9;
return r9.apply(this, arguments);
};
if (state.length !== 0) {
if (!((stateFromStores == null ? void 0 : stateFromStores.isPrivate()) && isPrivateChannelMatch(state, stateFromStores))) {
(function doAction() {
return _doAction2.apply(this, arguments);
})();
}
} else {
setState(null);
}
}, [state, stateFromStores]);
useEffect(() => {
if (!(state2 != null && state2 !== FAKE_PLACEHOLDER_PRIVATE_CHANNEL_ID) && findLocalMatchingPrivateChannelId(state) == null) {
Dispatcher.dispatch({
type: "CHANNEL_CREATE",
channel: new PrivateChannelRecord({
id: FAKE_PLACEHOLDER_PRIVATE_CHANNEL_ID,
type: state.length === 1 ? ChannelTypes.DM : ChannelTypes.GROUP_DM,
name: "",
guild_id: null,
recipients: state
})
});
return () => {
Dispatcher.dispatch({
type: "CHANNEL_DELETE",
channel: {
id: FAKE_PLACEHOLDER_PRIVATE_CHANNEL_ID,
guild_id: void 0,
parent_id: void 0
}
});
};
}
}, [state, state2]);
useEffect(() => {
if (stateFromStores != null && stateFromStores.id === FAKE_PLACEHOLDER_PRIVATE_CHANNEL_ID) {
Dispatcher.dispatch({
type: "LOAD_MESSAGES_SUCCESS",
channelId: stateFromStores.id,
messages: [],
isBefore: false,
isAfter: false,
hasMoreBefore: false,
hasMoreAfter: false,
limit: 0,
jump: void 0,
isStale: false
});
}
}, [stateFromStores]);
env22213[8] = state2;
const ref = useRef(null);
useLayoutEffect(() => {
env22213[0].setOptions({
headerTitle: (a0) => (0, jsx)(Header, {
numInGroup: env22213[4].length,
title: a0.children
}),
headerRight: () => {
const channelId3 = env22213[8];
return channelId3 !== null ? channelId3 !== FAKE_PLACEHOLDER_PRIVATE_CHANNEL_ID ? (0, jsx)(ChannelActions, {
channelId: channelId3,
screenIndex: "new-message"
}) : null : null;
}
});
}, [navigation, state.length, state2]);
const callback = useCallback((a0) => {
env22213[0].goBack();
transitionTo(Routes.CHANNEL(ME, a0));
}, [navigation]);
env22213[9] = callback;
c22215_0 = void 0;
c22215_0 = async (c30897_0) => {
let c30897_2;
let c31771_0;
L21: {
L20: {
L17: {
c30897_2 = void 0;
c31771_0 = void 0;
if (c30897_0 instanceof PrivateChannelRecord) {
AnalyticsUtils.track(AnalyticEvents.MESSAGE_COMPOSER_SEARCH_RESULT_CLICKED);
(0, env22213[9])(c30897_0.id);
break L21;
}
if (RelationshipStore.isFriend(c30897_0.id)) {
const r46 = env22213[4];
const r48 = r46.indexOf(c30897_0.id);
const r49 = [...r46];
if (r48 === -1) {
if (r46.length >= getGroupDMRecipientLimit() - 1) {
showMaxGroupMembers();
AnalyticsUtils.track(AnalyticEvents.MESSAGE_COMPOSER_MAX_USERS_ADDED);
break L20;
}
r49.push(c30897_0.id);
} else {
r49.splice(r48, 1);
}
(0, env22213[5])(r49);
(0, env22213[7])(false);
break L17;
}
c31771_0 = await ChannelActionCreators.getOrEnsurePrivateChannel(c30897_0.id);
AnalyticsUtils.track(AnalyticEvents.MESSAGE_COMPOSER_SEARCH_RESULT_CLICKED);
(0, env22213[9])(c31771_0);
return void 0;
}
return void 0;
}
return void 0;
}
};
const callback2 = useCallback(function(a0) {
return c22215_0.apply(this, arguments);
}, [state, callback]);
const callback3 = useCallback(() => {
(0, env22213[7])((a0) => !a0);
}, []);
const callback4 = useCallback((a0) => {
(0, env22213[7])(false);
(0, env22213[6])(a0.length > 0);
}, []);
const memo = useMemo(() => env22213[4].join(":"), [state]);
let overrideResults = void 0;
if (!r53) {
overrideResults = void 0;
if (!forceSearchResults) {
const r115 = state.length > 0;
overrideResults = void 0;
if (r115) {
if (state2 == null) {
channelId3 = FAKE_PLACEHOLDER_PRIVATE_CHANNEL_ID;
}
overrideResults = <ChatPreview key={memo} channelId={channelId3} navigateToChannel={callback} tagListInputRef={ref} />;
}
}
}
const withGuildMembers = state.length === 0;
env22213[10] = withGuildMembers;
const stateFromStores2 = useStateFromStores([RelationshipStore], () => RelationshipStore.getRelationshipCount() > 0);
env22213[11] = stateFromStores2;
return <AnalyticsLocationProvider value={analyticsLocations}>
<NewMessageUserList actions={useMemo(() => {
const r1 = [];
if (env22213[10]) {
if (env22213[11]) {
r1.push({
icon: Module10223,
IconComponent: GroupPlusIcon,
label: intl.string(t["3hF1W4"]),
iconVariant: "default",
onPress: () => env22213[0].navigate("gdm", {
allowNameEdit: false,
locationPage: AnalyticsSections.NEW_MESSAGE_COMPOSER
})
});
}
r1.push({
icon: Module4128,
IconComponent: UserPlusIcon,
label: intl.string(t["9nbDJx"]),
iconVariant: "default",
onPress: () => {
env22213[0].navigate("add-friends", {
sourcePage: "New Message Composer"
});
}
});
}
return r1;
}, [navigation, stateFromStores2, withGuildMembers])} noResultActions={useMemo(() => [{
icon: Module4128,
IconComponent: UserPlusIcon,
label: intl.string(t["9nbDJx"]),
iconVariant: "default",
onPress: () => {
env22213[0].navigate("add-friends", {
sourcePage: "New Message Composer"
});
}
}], [navigation])} rowMode={UserRowModes.NONE} tagListInputRef={ref} onSelectUser={callback2} onQueryChanged={callback4} selectedUserIds={state} withAffinitySuggestions overrideResults={overrideResults} withGuildMembers={withGuildMembers} withGDMNames forceSearchResults={forceSearchResults} onForceSearchResults={callback3} defaultNoResultsFound={useMemo(() => {
const r7 = env22213[2];
return <View style={[r7.emptyKeyboardView, {
paddingBottom: env22213[3].bottom
}]}>
<NoResults title={intl.string(t["1ESycm"])} subtitle={intl.string(t["5IlFpu"])} containerStyle={r7.emptyContainer} fullHeight>
<View style={r7.addFriendsButtonContainer}>
<Button text={intl.string(t.zIJnA6)} size="lg" onPress={() => env22213[0].navigate("add-friends", {
sourcePage: "New Message Composer No Results"
})} grow />
</View>
</NoResults>
</View>;
}, [navigation, styles, insets.bottom])} autoFocusSearch />
</AnalyticsLocationProvider>;
};
@@ -0,0 +1,49 @@
// Metro module 15611 (f15612).
import { useCallback } from "react";
import RelationshipStore from "../../../../../stores/RelationshipStore";
import UserStore from "../../../../../stores/UserStore";
import { UserRowModes } from "../../shared_components/user_list/UserRowConstants";
import { RelationshipTypes } from "../../../../../Constants";
import useAnalyticsLocations from "../../../../app_analytics/useAnalyticsLocations";
import AnalyticsLocation from "../../../../app_analytics/AnalyticsLocation";
import { useStateFromStoresArray } from "../../../../../_bundle/Module589";
import { getPendingRelationshipIds } from "../hooks/getPendingRelationshipIds";
import useTrackImpression from "../../../../app_analytics/useTrackImpression";
import { ImpressionNames } from "../../../../../_bundle/Module503";
import showUserProfileActionSheet from "../../../../user_profile/native/showUserProfileActionSheet";
import { UsersFastList } from "../../shared_components/user_list/UsersFastList";
export default function SpamRequestsScreen(props) {
let stateFromStoresArray2, callback;
const navigation = props.navigation;
stateFromStoresArray2 = void 0;
callback = void 0;
const analyticsLocations = useAnalyticsLocations(AnalyticsLocation.FRIEND_REQUESTS).analyticsLocations;
const stateFromStoresArray = useStateFromStoresArray([RelationshipStore], () => getPendingRelationshipIds(RelationshipStore.getMutableRelationships()).spamIds);
useTrackImpression({
name: ImpressionNames.FRIEND_REQUESTS_SPAM_INBOX
});
stateFromStoresArray2 = useStateFromStoresArray([UserStore], () => stateFromStoresArray.map((item) => UserStore.getUser(item)).filter((item) => item != null), [stateFromStoresArray]);
callback = useCallback((a0) => {
showUserProfileActionSheet({
userId: a0.id,
localUser: a0,
sourceAnalyticsLocations: analyticsLocations
});
}, [analyticsLocations]);
const callback2 = useCallback(() => {}, []);
const callback3 = useCallback((a0, a1) => ({
type: "user",
props: {
type: RelationshipTypes.PENDING_INCOMING,
user: stateFromStoresArray2[a1],
onPress: callback,
mode: UserRowModes.ACTIONS,
start: a1 === 0,
end: a1 === stateFromStoresArray2.length - 1
}
}), [callback, stateFromStoresArray2]);
if (stateFromStoresArray2.length !== 0) {
return <UsersFastList getItemProps={callback3} getSectionProps={callback2} sections={[stateFromStoresArray2.length]} />;
}
navigation.goBack();
};
@@ -0,0 +1,66 @@
// Metro module 15605 (f15606).
import { useEffect, useCallback } from "react";
import { View } from "react-native";
import { AnalyticEvents, AnalyticsSections } from "../../../../../Constants";
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 AnalyticsUtils from "../../../../../utils/AnalyticsUtils";
import useSuggestedFriends from "../components/useSuggestedFriends";
import showUserProfileActionSheet from "../../../../user_profile/native/showUserProfileActionSheet";
import { ContactSuggestionRow } from "../components/ContactSuggestionRow";
import ThemedGradient from "../../../../client_themes/native/ThemedGradient";
import { UsersFastList } from "../../shared_components/user_list/UsersFastList";
import NoResults from "../../shared_components/user_list/NoResults";
import { intl, t } from "../../../../../intl/index.native";
const useStyles = createStyles({
emptyContainer: {
flex: 1,
paddingTop: Module712.space.PX_32
},
container: {
flex: 1
}
});
export default function SuggestedFriendsScreen() {
let added, setAdded, friendSuggestions, callback;
const styles = useStyles();
const analyticsLocations = useAnalyticsLocations(AnalyticsLocation.SUGGESTED_FRIENDS).analyticsLocations;
useEffect(() => {
AnalyticsUtils.track(AnalyticEvents.FRIEND_ADD_VIEWED, {
friend_add_type: AnalyticsSections.FRIENDS_SUGGESTED_FRIENDS_MODAL
});
}, []);
const suggestedFriends = useSuggestedFriends();
added = suggestedFriends.added;
setAdded = suggestedFriends.setAdded;
friendSuggestions = suggestedFriends.friendSuggestions;
callback = useCallback((a0) => {
showUserProfileActionSheet({
userId: a0.id,
localUser: a0,
sourceAnalyticsLocations: analyticsLocations
});
}, [analyticsLocations]);
const callback3 = useCallback((a0, a1) => {
const suggestedFriend = friendSuggestions[a1];
const r10 = suggestedFriend?.mutualFriendsCount != null && suggestedFriend?.mutualFriendsCount > 0;
const end = a1 === friendSuggestions.length - 1;
return {
type: "custom",
itemType: r10 ? "contactSuggestionMutualCount" : "contactSuggestionNoMutualCount",
key: suggestedFriend.user.id,
component: () => <ContactSuggestionRow added={added.includes(suggestedFriend)} suggestedFriend={suggestedFriend} start={a1 === 0} end={end} onPress={callback} onAddSuggestion={() => setAdded((prevAdded) => [...prevAdded, suggestedFriend])} location={AnalyticsSections.FRIENDS_SUGGESTED_FRIENDS_MODAL} />
};
}, [added, friendSuggestions, callback, setAdded]);
const callback2 = useCallback(() => {}, []);
return <AnalyticsLocationProvider value={analyticsLocations}>
<ThemedGradient absolute />
<View style={styles.container}>
{friendSuggestions.length !== 0 ? <UsersFastList sections={[friendSuggestions.length]} getItemProps={callback3} getSectionProps={callback2} insetStart={8} /> : <View style={styles.emptyContainer}>
<NoResults title={intl.string(t.pxFW8V)} disableBackgroundOverlay />
</View>}
</View>
</AnalyticsLocationProvider>;
};
@@ -0,0 +1,73 @@
// Metro module 15604 (f15605).
import { useEffect, useRef } from "react";
import { ScrollView, View } from "react-native";
import { AnalyticEvents, AnalyticsSections } from "../../../../../Constants";
import { createStyles } from "../../../../../design/components/Styles/native/createStyles";
import Module712 from "../../../../../_bundle/Module712";
import AnalyticsUtils from "../../../../../utils/AnalyticsUtils";
import useSafeAreaInsetsKeyboardAware_native from "../../../../safe_area/useSafeAreaInsetsKeyboardAware.native";
import { getIsScreenReaderEnabled } from "../../../../a11y/native/useIsScreenReaderEnabled.native";
import { useClientThemesOverride } from "../../../../client_themes/native/ClientThemesOverrides";
import { isIOS } from "../../../../../utils/PlatformUtils";
import KeyboardAwareView from "../../../../keyboard/native/KeyboardAwareView";
import ThemedGradient from "../../../../client_themes/native/ThemedGradient";
import AddFriendById from "./AddFriendById";
import { intl, t } from "../../../../../intl/index.native";
const useStyles = createStyles({
background: {
flex: 1,
backgroundColor: Module712.colors.MOBILE_ACTIONSHEET_BACKGROUND
},
content: {
flex: 1,
backgroundColor: Module712.colors.MOBILE_ACTIONSHEET_BACKGROUND
},
iosPaddingThemeAdjust: {
paddingTop: Module712.space.PX_40
},
container: {
flexGrow: 1,
backgroundColor: Module712.colors.MOBILE_ACTIONSHEET_BACKGROUND,
paddingHorizontal: Module712.space.PX_16
},
inputContainer: {
marginTop: Module712.space.PX_16,
backgroundColor: "transparent",
paddingHorizontal: 0
},
headerText: {
textTransform: "none"
}
});
export default function UsernameSearchScreen(props) {
let ref;
const navigation = props.navigation;
ref = void 0;
const styles = useStyles();
useEffect(() => {
AnalyticsUtils.track(AnalyticEvents.FRIEND_ADD_VIEWED, {
friend_add_type: AnalyticsSections.FRIENDS_ADD_BY_USERNAME_MODAL
});
}, []);
const insets = useSafeAreaInsetsKeyboardAware_native().insets;
ref = useRef(null);
useEffect(() => navigation.addListener("transitionEnd", (a0) => {
if (!(a0.data.closing || getIsScreenReaderEnabled())) {
const current = ref.current;
if (current != null) {
current.focus();
}
}
}), [navigation]);
const clientThemesOverride = useClientThemesOverride();
return <View style={styles.background}>
<KeyboardAwareView style={[styles.content, clientThemesOverride]}>
<ThemedGradient absolute />
<ScrollView alwaysBounceVertical={false} keyboardShouldPersistTaps="handled" contentContainerStyle={[styles.container, isIOS() ? clientThemesOverride != null ? insets.top > 0 ? styles.iosPaddingThemeAdjust : null : null : null, {
paddingBottom: insets.bottom + Module712.space.PX_16
}]}>
<AddFriendById style={styles.inputContainer} autoFocusInput={false} headerText={intl.string(t.YEOwDM)} headerTextStyle={styles.headerText} ref={ref} />
</ScrollView>
</KeyboardAwareView>
</View>;
};