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,110 @@
// Metro module 11775 (f11776).
import ConnectedAccountsStore from "../../../stores/ConnectedAccountsStore";
import { PlatformTypes, AnalyticEvents, FriendDiscoveryFlags } from "../../../Constants";
import { FriendDiscoverySettings } from "../../user_settings/UserSettings";
import * as _Module1384 from "../../../_bundle/Module1384";
import { setFlag } from "../../../_bundle/Module1384";
import AnalyticsUtils from "../../../utils/AnalyticsUtils";
import { isContactSyncEnabled } from "./ContactSyncUtils";
import ConnectedAccountsActionCreators from "../../../actions/ConnectedAccountsActionCreators";
let c8070_0;
let env8068 = {};
let c8069_0 = async (name) => {
let c27159_2;
c27159_2 = void 0;
let c30446_0 = name;
await ConnectedAccountsActionCreators.update(PlatformTypes.CONTACTS, "@me", {
name
});
let num_words = 1;
const NAME_SUBMITTED = AnalyticEvents.NAME_SUBMITTED;
if (c30446_0 != null) {
num_words = c30446_0.split(" ").length;
}
AnalyticsUtils.track(NAME_SUBMITTED, {
num_words,
num_chars: c30446_0 != null ? c30446_0.length : 0
});
};
c8070_0 = void 0;
c8070_0 = async (c27160_0, c27160_1) => {
let c27160_3;
c27160_3 = void 0;
const id = ConnectedAccountsStore.getLocalAccount(PlatformTypes.CONTACTS)?.id;
const enabled = c27160_0.enabled;
let c30447_0 = enabled;
const name2 = c27160_0.name;
let c30447_1 = name2;
if (id == null) {
await ConnectedAccountsActionCreators.connect(PlatformTypes.CONTACTS, "@me", name2, c27160_1, {
friend_sync: enabled
});
let num_words = 1;
if (c30447_1 !== void 0) {
const NAME_SUBMITTED = AnalyticEvents.NAME_SUBMITTED;
if (c30447_1 != null) {
num_words = c30447_1.split(" ").length;
}
AnalyticsUtils.track(NAME_SUBMITTED, {
num_words,
num_chars: c30447_1 != null ? c30447_1.length : 0
});
}
} else if (name2 !== void 0) {
await ConnectedAccountsActionCreators.update(PlatformTypes.CONTACTS, id, {
friend_sync: enabled,
name: name2
});
AnalyticsUtils.track(AnalyticEvents.NAME_SUBMITTED, {
num_words: c30447_1 != null ? c30447_1.split(" ").length : 1,
num_chars: c30447_1 != null ? c30447_1.length : 0
});
} else {
await ConnectedAccountsActionCreators.setFriendSync(PlatformTypes.CONTACTS, id, enabled);
}
let c30447_2 = FriendDiscoverySettings.getSetting();
let c30447_3 = _Module1384.hasFlag(c30447_2, FriendDiscoveryFlags.FIND_BY_PHONE);
let c30447_4 = _Module1384.hasFlag(c30447_2, FriendDiscoveryFlags.FIND_BY_EMAIL);
AnalyticsUtils.track(AnalyticEvents.CONTACT_SYNC_TOGGLED, {
is_enabled: c30447_0,
am_discoverable_phone: c30447_3,
am_discoverable_email: c30447_4
});
};
const r31 = {
updateName: function() {
const apply = c8069_0.apply;
return c8069_0.apply(this, arguments);
},
updateDiscoverability: async function updateDiscoverability(c27158_0) {
const phone = c27158_0.phone;
let c30445_0 = phone;
const email = c27158_0.email;
let c30445_1 = email;
const setting = FriendDiscoverySettings.getSetting();
let c30445_2 = setting;
let c30445_3 = ConnectedAccountsStore.getLocalAccount(PlatformTypes.CONTACTS)?.name;
const r42 = phone != null ? setFlag(setting, FriendDiscoveryFlags.FIND_BY_PHONE, phone) : setting;
await FriendDiscoverySettings.updateSetting(email != null ? setFlag(r42, FriendDiscoveryFlags.FIND_BY_EMAIL, email) : r42);
const USER_DISCOVERY_UPDATED = AnalyticEvents.USER_DISCOVERY_UPDATED;
let hasFlag = c30445_0;
if (c30445_0 == null) {
hasFlag = _Module1384.hasFlag(c30445_2, FriendDiscoveryFlags.FIND_BY_PHONE);
}
let hasFlag2 = c30445_1;
if (c30445_1 == null) {
hasFlag2 = _Module1384.hasFlag(c30445_2, FriendDiscoveryFlags.FIND_BY_EMAIL);
}
AnalyticsUtils.track(USER_DISCOVERY_UPDATED, {
has_name: typeof c30445_3 === "string",
discoverable_phone: hasFlag,
discoverable_email: hasFlag2,
contact_sync_enabled: isContactSyncEnabled(ConnectedAccountsStore.getLocalAccount(PlatformTypes.CONTACTS))
});
},
updateContactSyncEnabled: function() {
const apply = c8070_0.apply;
return c8070_0.apply(this, arguments);
}
};
export default r31;
@@ -0,0 +1,77 @@
// Metro module 11773 (f11774).
import UserStore from "../../../stores/UserStore";
import { getIsOnboarding } from "./ContactSyncModalStore";
import { ContactPermissions } from "./ContactSyncConstants";
import { AnalyticEvents } from "../../../Constants";
import { checkContactPermissions } from "./ContactSyncUtils";
import AnalyticsUtils from "../../../utils/AnalyticsUtils";
import { trackNUFStep } from "../../nuf/native/NewUserAnalyticsUtils";
let c8066_7 = {
INITIALIZED: "Flow Initialized",
LANDING: "Landing",
PERMISSION_REQUESTED: "Contacts Permission Requested",
NAME_INPUT: "Name Input",
SUGGESTIONS_RESULTS: "Suggestions Results",
CONTACT_INVITES: "Contact Invites",
ADD_PHONE_NUMBER: "Add Phone Number",
VERIFY_PHONE_NUMBER: "Verify Phone Number",
PASSWORD_CONFIRM: "Password Confirmation",
COMPLETE: "Complete"
};
let LANDING = null;
let c8066_9 = 0;
const location2 = "Onboarding";
export { c8066_7 as Steps };
export const CONTACT_SYNC_ONBOARDING_LOCATION = "Onboarding";
export function trackFlowStart(c19158_0) {
LANDING = c8066_7.LANDING;
c8066_9 = Date.now();
const has_phone_number = UserStore.getCurrentUser()?.phone != null;
checkContactPermissions().then((result) => {
AnalyticsUtils.track(AnalyticEvents.CONTACT_SYNC_FLOW_KEY, {
...c19158_0,
flow_type: "Contact Sync",
from_step: c8066_7.INITIALIZED,
to_step: c8066_7.LANDING,
skip: false,
back: false,
seconds_on_from_step: 0,
has_phone_number,
mobile_contacts_permission: result !== ContactPermissions.NOT_DETERMINED ? result === ContactPermissions.AUTHORIZED ? "accepted" : "denied" : null
});
});
}
export function trackFlowStep(a0, a1, a2, a3) {
const isOnboarding = getIsOnboarding();
const r20 = Date.now();
AnalyticsUtils.track(AnalyticEvents.CONTACT_SYNC_FLOW_KEY, {
...a3,
location: isOnboarding ? location2 : a3?.location,
flow_type: "Contact Sync",
from_step: LANDING,
to_step: a0,
skip: a1,
back: a2,
seconds_on_from_step: (r20 - c8066_9) / 1000
});
if (isOnboarding) {
trackNUFStep(LANDING, a0, {
skip: a1
});
}
c8066_9 = r20;
LANDING = a0;
}
export function trackFlowEnd(a0, a1) {
AnalyticsUtils.track(AnalyticEvents.CONTACT_SYNC_FLOW_KEY, {
...a1,
location: getIsOnboarding() ? location2 : a1?.location,
flow_type: "Contact Sync",
from_step: LANDING,
to_step: c8066_7.COMPLETE,
skip: a0,
back: false,
seconds_on_from_step: (Date.now() - c8066_9) / 1000
});
LANDING = null;
}
@@ -0,0 +1,34 @@
// Metro module 11769 (f11770).
const r14 = {
DEFAULT: 0,
0: "DEFAULT",
UPSELL_ACTION_SHEET: 1,
1: "UPSELL_ACTION_SHEET"
};
const r17 = {
WELCOME: "WELCOME",
NAME_INPUT: "NAME_INPUT",
SUGGESTIONS: "SUGGESTIONS",
ADD_PHONE: "ADD_PHONE",
VERIFY_PHONE: "VERIFY_PHONE",
VERIFY_PASSWORD: "VERIFY_PASSWORD"
};
const r24 = {
NOT_DETERMINED: -1
};
r24[-1] = "NOT_DETERMINED";
r24.UNAUTHORIZED = 0;
r24[0] = "UNAUTHORIZED";
r24.AUTHORIZED = 1;
r24[1] = "AUTHORIZED";
const r28 = {
MUTUAL_CONTACT_INFO_ONLY: 1,
1: "MUTUAL_CONTACT_INFO_ONLY",
ANYONE_WITH_CONTACT_INFO: 2,
2: "ANYONE_WITH_CONTACT_INFO"
};
export { r14 as ContactSyncLandingPage };
export { r17 as ContactSyncScenes };
export { r24 as ContactPermissions };
export { r28 as ContactSyncSuggestionsSetting };
export const CONTACT_SYNC_MODAL_KEY = "contact-sync";
@@ -0,0 +1,105 @@
// Metro module 11772 (f11773).
import ConnectedAccountsStore from "../../../stores/ConnectedAccountsStore";
import UserStore from "../../../stores/UserStore";
import { deleteStoredContacts, setStoredContacts, useContactSyncStore } from "./ContactSyncPersistedStore";
import { ContactPermissions } from "./ContactSyncConstants";
import { PlatformTypes } from "../../../Constants";
import { Storage } from "../../../_bundle/Module595";
import { getContacts, uploadContacts, isContactSyncEnabled, checkContactPermissions } from "./ContactSyncUtils";
import AutomaticLifecycleManager from "../../../lib/AutomaticLifecycleManager";
import { runAfterInteractions } from "../../../utils/native/RunAfterInteractionsUtils";
let c8065_10;
let _requestAndSyncContacts = function _requestAndSyncContacts() {
const r8 = async () => {
let c27157_0;
let c27157_4 = 0;
let c30444_0, c30444_1, c30444_2, c30444_3;
L25: {
L23: {
try {
c30444_0 = void 0;
c30444_1 = void 0;
c30444_2 = void 0;
c30444_3 = void 0;
const r37 = Storage.get(c8065_10, 0);
c27157_0 = r37;
if (r37 == null) {
c27157_0 = 0;
}
const r38 = c27157_0;
const r41 = Date.now();
c30444_0 = r41;
c27157_4 = 1;
if (r38 + 86400000 <= r41) {
const phone = UserStore.getCurrentUser()?.phone;
if (phone == null) {
c27157_4 = 0;
break L25;
}
c30444_1 = await getContacts(phone, useContactSyncStore.getState().storedContacts);
c30444_2 = c30444_1.names;
c30444_3 = c30444_1.payload;
(0, setStoredContacts)(c30444_2);
if (c30444_3 != null) {
await uploadContacts(c30444_3, true);
}
Storage.set(c8065_10, c30444_0);
c27157_4 = 0;
break L23;
}
c27157_4 = 0;
} catch ($e) {
let r7 = $e;
if (c27157_4 !== 0) {
while (true) {
try {
c27157_4 = 0;
(0, deleteStoredContacts)();
break L23;
} catch ($e) {
r7 = $e;
if (c27157_4 === 0) {
break;
}
}
}
}
throw r7;
}
return void 0;
}
return void 0;
}
};
_requestAndSyncContacts = r8;
return r8.apply(this, arguments);
};
c8065_10 = "LAST_USER_CONTACTS_REQUEST_TIMESTAMP_KEY";
class ContactSyncLifecycleManager extends AutomaticLifecycleManager {
constructor() {
super(...arguments);
const _this = this;
this.actions = {
POST_CONNECTION_OPEN: () => _this.handleConnectionOpen()
};
this.handleConnectionOpen = () => {
if (UserStore.getCurrentUser() != null) {
if (isContactSyncEnabled(ConnectedAccountsStore.getLocalAccount(PlatformTypes.CONTACTS))) {
checkContactPermissions().then((result) => {
if (result === ContactPermissions.AUTHORIZED) {
runAfterInteractions(() => (function requestAndSyncContacts() {
return _requestAndSyncContacts.apply(this, arguments);
})());
}
});
}
}
};
}
}
const contactSyncLifecycleManager = new ContactSyncLifecycleManager();
export default contactSyncLifecycleManager;
export const LAST_USER_CONTACTS_REQUEST_TIMESTAMP_KEY = "LAST_USER_CONTACTS_REQUEST_TIMESTAMP_KEY";
export function removeLastUserContactsUpload() {
Storage.remove(c8065_10);
}
@@ -0,0 +1,453 @@
// Metro module 11767 (f11768).
import ConnectedAccountsStore from "../../../stores/ConnectedAccountsStore";
import UserStore from "../../../stores/UserStore";
import { setPermissionState, useContactSyncModalStore, setSuggestions, setName, setError, getIsOnboarding, setPhone, setPhoneToken, initialize, ContactSyncModes } from "./ContactSyncModalStore";
import { setStoredContacts, deleteStoredContacts } from "./ContactSyncPersistedStore";
import { ContactPermissions, ContactSyncScenes, CONTACT_SYNC_MODAL_KEY } from "./ContactSyncConstants";
import { PlatformTypes, AnalyticEvents } from "../../../Constants";
import { NativePermissionTypes, NativePermissionStates } from "../../native_permissions/NativePermissionConstants";
import { checkContactPermissions, getContacts, isContactSyncEnabled, uploadContacts, ContactSyncPermissionDenied, bulkAddFriends } from "./ContactSyncUtils";
import { trackFlowStep, Steps, trackFlowEnd, trackFlowStart, CONTACT_SYNC_ONBOARDING_LOCATION } from "./ContactSyncAnalyticsUtils";
import AnalyticsUtils from "../../../utils/AnalyticsUtils";
import ContactSyncActionCreators from "./ContactSyncActionCreators";
import { intl, t } from "../../../intl/index.native";
import AlertActionCreators from "../../../actions/native/AlertActionCreators";
import ToastActionCreators from "../../toast/native/ToastActionCreators";
import Module10356 from "../../../_bundle/Module10356";
import PhoneActionCreators from "../../phone/PhoneActionCreators";
import { APIError } from "../../../errors/index";
import ModalActionCreators from "../../../actions/ModalActionCreators";
import { hasDeferredInvite } from "../../instant_invite/native/InstantInviteUtils";
import { ModalAnimation } from "../../../ConstantsIOS";
import { previousOnboardingStep, nextOnboardingStep } from "../../nuf/native/NUFActionCreators";
function $mk116294($env) {
return (c31641_0) => $env[2].find((item) => item.suggested_user.id === c31641_0);
}
function $mk116295($env) {
return () => {
const r4 = $env;
(0, closeContactSyncModal)({
skip: false,
friendsFound: r4[2].length,
friendsAdded: r4[0].length,
back: false,
onComplete: r4[1]
});
};
}
function $mk116296($env) {
return () => {
const r4 = $env;
(0, closeContactSyncModal)({
skip: false,
friendsFound: r4[2].length,
friendsAdded: r4[0].length,
back: false,
onComplete: r4[1]
});
};
}
let closeContactSyncModal;
let $mk88031 = function() {
return (a0) => {
(0, setPermissionState)(a0);
};
};
let env8061 = {};
const handleNameInputScreenOrSuggestions = async function handleNameInputScreenOrSuggestions(c27148_0, c27148_1) {
let r239;
let name, c27148_5;
let c27148_6 = 0;
let c30439_0, c30439_1, c30439_2, c30439_3, c30439_4, c30439_5, c30439_6, c30439_7, c30439_8, c30439_9, c30439_10, c30439_11, c30439_12, c30439_13;
L17: {
try {
c30439_0 = c27148_0;
c30439_1 = c27148_1;
c30439_2 = void 0;
c30439_3 = void 0;
c30439_4 = void 0;
c30439_5 = void 0;
c30439_6 = void 0;
c30439_7 = void 0;
c30439_8 = void 0;
c30439_9 = void 0;
c30439_10 = void 0;
c30439_11 = void 0;
c30439_12 = void 0;
c30439_2 = ConnectedAccountsStore.getLocalAccount(PlatformTypes.CONTACTS);
c30439_3 = useContactSyncModalStore.getState().name;
c30439_4 = await checkContactPermissions();
(0, setPermissionState)(c30439_4);
if (c30439_4 === ContactPermissions.NOT_DETERMINED) {
trackFlowStep(Steps.PERMISSION_REQUESTED, false, false);
}
c27148_6 = 1;
c30439_5 = await getContacts(c30439_0);
c30439_6 = c30439_5.names;
c30439_7 = c30439_5.ownName;
c30439_8 = c30439_5.payload;
(0, setStoredContacts)(c30439_6);
AnalyticsUtils.track(AnalyticEvents.PERMISSIONS_ACKED, {
type: NativePermissionTypes.CONTACTS,
action: NativePermissionStates.ACCEPTED
});
if (c30439_3 != null) {
if (isContactSyncEnabled(c30439_2)) {
await ContactSyncActionCreators.updateName(c30439_3);
c30439_10 = ContactSyncScenes.SUGGESTIONS;
c30439_11 = Steps.SUGGESTIONS_RESULTS;
r239 = uploadContacts(c30439_8, false);
} else {
name = c30439_3;
if (name == null) {
name = void 0;
}
await ContactSyncActionCreators.updateContactSyncEnabled({
enabled: true,
name
});
c30439_10 = ContactSyncScenes.SUGGESTIONS;
c30439_11 = Steps.SUGGESTIONS_RESULTS;
r239 = uploadContacts(c30439_8, false);
}
c30439_12 = await r239;
(0, setSuggestions)(c30439_12.friend_suggestions, c30439_12.bulk_add_token);
c30439_9 = c30439_12.friend_suggestions.length;
trackFlowStep(c30439_11, false, false, {
num_contacts_found: c30439_9
});
c30439_1.navigate(c30439_10);
c27148_6 = 0;
} else {
trackFlowStep(Steps.NAME_INPUT, false, false);
(0, setName)(c30439_7, true);
c30439_1.navigate(ContactSyncScenes.NAME_INPUT);
c27148_6 = 0;
}
} catch ($e) {
const r44 = $e;
let r8 = r44;
c27148_5 = r44;
if (c27148_6 !== 0) {
while (true) {
try {
const r329 = c27148_5;
c27148_6 = 0;
c30439_13 = r329;
AnalyticsUtils.track(AnalyticEvents.PERMISSIONS_ACKED, {
type: NativePermissionTypes.CONTACTS,
action: NativePermissionStates.DENIED
});
if (c30439_13 === ContactSyncPermissionDenied) {
trackFlowStep(Steps.LANDING, true, false, {
mobile_contacts_permission: "denied"
});
(0, setPermissionState)(ContactPermissions.UNAUTHORIZED);
break L17;
}
(0, setError)(intl.string(t.fGrbRX));
(0, deleteStoredContacts)();
break L17;
} catch (r325) {
r8 = r325;
c27148_5 = r325;
if (c27148_6 === 0) {
break;
}
}
}
}
throw r8;
}
}
};
closeContactSyncModal = function closeContactSyncModal(a0) {
let skip2 = a0.skip;
if (skip2 === void 0) {
skip2 = true;
}
const { friendsFound, friendsAdded } = a0;
let back = a0.back;
if (back === void 0) {
back = false;
}
const onComplete2 = a0.onComplete;
if (onComplete2 != null) {
if (skip2 === void 0) {
skip2 = true;
}
const r40 = (0, getIsOnboarding)();
trackFlowEnd(skip2, {
num_contacts_found: friendsFound,
num_contacts_added: friendsAdded
});
if (r40) {
onComplete2(skip2);
} else {
setTimeout(() => {
ModalActionCreators.popWithKey(CONTACT_SYNC_MODAL_KEY);
}, 0);
}
} else {
const skip = skip2 === void 0 ? true : skip2;
if (back === void 0) {
back = false;
}
let c19140_1 = back;
const r16 = (0, getIsOnboarding)();
let c19140_2 = r16;
if (!back) {
trackFlowEnd(skip, {
num_contacts_found: friendsFound,
num_contacts_added: friendsAdded
});
}
if (r16) {
if (back) {
ModalActionCreators.updateAnimation(CONTACT_SYNC_MODAL_KEY, ModalAnimation.SLIDE_IN_OUT_REVERSE);
} else {
ModalActionCreators.updateAnimation(CONTACT_SYNC_MODAL_KEY, ModalAnimation.SLIDE_IN_OUT);
}
}
setTimeout(() => {
ModalActionCreators.popWithKey(CONTACT_SYNC_MODAL_KEY);
if (c19140_2) {
if (c19140_1) {
ModalActionCreators.updateAnimation(CONTACT_SYNC_MODAL_KEY, ModalAnimation.SLIDE_IN_OUT_REVERSE);
previousOnboardingStep();
} else {
ModalActionCreators.updateAnimation(CONTACT_SYNC_MODAL_KEY, ModalAnimation.SLIDE_IN_OUT);
nextOnboardingStep({
skip
});
}
}
}, 0);
}
};
export async function handlePhoneVerificationComplete(c27149_0, c27149_1) {
await handleNameInputScreenOrSuggestions(c27149_0, c27149_1);
}
export async function startContactSync(c27150_0) {
L13: {
const phone = UserStore.getCurrentUser()?.phone;
if (phone == null) {
trackFlowStep(Steps.ADD_PHONE_NUMBER, false, false);
(0, setPhone)(null);
c27150_0.navigate(ContactSyncScenes.ADD_PHONE);
break L13;
}
await handleNameInputScreenOrSuggestions(phone, c27150_0);
return void 0;
}
}
export async function bulkAddFriendSuggestions(c27151_0, onComplete) {
let c27151_2, c27151_3;
let c27151_4 = 0;
const r13 = env8061;
L17: {
try {
let env30440;
c27151_3 = r13;
const r34 = env30440 = {
$parent: r13
};
c27151_2 = r34;
env30440[0] = c27151_0;
env30440[1] = onComplete;
env30440[2] = void 0;
env30440[3] = void 0;
const state = useContactSyncModalStore.getState();
const suggestions = state.suggestions;
env30440[2] = suggestions;
const bulkAddToken = state.bulkAddToken;
if (bulkAddToken != null) {
c27151_4 = 1;
if ((await bulkAddFriends(c27151_0, bulkAddToken)).failed_requests.length > 0) {
const r69 = c27151_2;
env30440[3] = env30440[0].map($mk116294(r69)).filter(Boolean);
AlertActionCreators.show({
title: intl.string(t["6moJ8s"]),
body: intl.formatToPlainString(t["045SiE"], {
name: env30440[3].join(", ")
}),
confirmText: intl.string(t.BddRzS),
onConfirm: $mk116295(r69)
});
} else {
ToastActionCreators.open({
key: "TOAST_ADD_FRIENDS",
content: intl.string(t["+hjBfW"]),
icon: Module10356
});
}
(0, closeContactSyncModal)({
skip: false,
friendsFound: env30440[2].length,
friendsAdded: env30440[0].length,
back: false,
onComplete: env30440[1]
});
c27151_4 = 0;
break L17;
}
closeContactSyncModal({
skip: false,
friendsFound: suggestions.length,
friendsAdded: 0,
back: false,
onComplete
});
} catch ($e) {
let r33 = $e;
if (c27151_4 !== 0) {
while (true) {
try {
const r164 = c27151_2;
c27151_4 = 0;
AlertActionCreators.show({
title: intl.string(t["6moJ8s"]),
body: intl.string(t.Gt2L32),
confirmText: intl.string(t.BddRzS),
onConfirm: $mk116296(r164)
});
break L17;
} catch ($e) {
r33 = $e;
if (c27151_4 === 0) {
break;
}
}
}
}
throw r33;
}
return void 0;
}
}
export function goBackToLanding(a0) {
trackFlowStep(Steps.LANDING, false, true);
a0.pop(a0.getState().routes.length - 1);
}
export function submitPhone(a0, a1) {
(0, setPhone)(a0);
trackFlowStep(Steps.VERIFY_PHONE_NUMBER, false, false);
a1.navigate(ContactSyncScenes.VERIFY_PHONE);
}
export async function verifyPhone(c27152_0) {
let r65;
let anyErrorMessage, c27152_4;
let c27152_5 = 0;
let c30441_0;
try {
c27152_5 = 1;
await PhoneActionCreators.addPhoneWithoutPassword(c27152_0);
c27152_5 = 0;
} catch ($e) {
const r27 = $e;
let r8 = r27;
c27152_4 = r27;
if (c27152_5 !== 0) {
while (true) {
L22: {
try {
const r61 = c27152_4;
c27152_5 = 0;
c30441_0 = r61;
if (c30441_0.status !== 301 && c30441_0.status !== 404) {
anyErrorMessage = new APIError(c30441_0).getAnyErrorMessage();
if (anyErrorMessage == null) {
anyErrorMessage = intl.string(t.cCVXOe);
}
r65 = {
codeIntercepted: true,
addedPhone: false,
error: anyErrorMessage
};
break L22;
}
r65 = {
codeIntercepted: false,
addedPhone: false
};
} catch (r58) {
r8 = r58;
c27152_4 = r58;
if (c27152_5 === 0) {
break;
}
continue;
}
}
return r65;
}
}
throw r8;
}
return {
codeIntercepted: true,
addedPhone: true
};
}
export function verifyPhoneWithPassword(a0, a1) {
trackFlowStep(Steps.PASSWORD_CONFIRM, false, false);
(0, setPhoneToken)(a0);
a1.navigate(ContactSyncScenes.VERIFY_PASSWORD);
}
export function upsellDismissed() {
trackFlowEnd(true);
}
export function openContactSyncModal(a0, a1, a2) {
checkContactPermissions().then($mk88031());
if (a0.initialRoutes == null) {
(0, initialize)(ContactSyncModes.NORMAL);
}
if (a1) {
trackFlowStart({
location: a1
});
}
ModalActionCreators.pushLazy(import("./components/RedesignContactSyncModal"), {
initialRoutes: a0.initialRoutes,
openSettingsSheet: a0.openSettings,
customLandingPage: a0.customLandingPage
}, CONTACT_SYNC_MODAL_KEY).then(a2);
}
export function openContactSyncModalOnboarding(r3 = false) {
if (r3) {
initialize(hasDeferredInvite() ? ContactSyncModes.ONBOARDING_INVITE : ContactSyncModes.ONBOARDING);
}
trackFlowStart({
location: {
page: CONTACT_SYNC_ONBOARDING_LOCATION
}
});
ModalActionCreators.pushLazy(async () => {
let c30442_0 = (await import("./components/RedesignContactSyncModal")).default;
c30442_0.modalConfig = {
animation: ModalAnimation.SLIDE_IN_OUT
};
return c30442_0;
}, {}, CONTACT_SYNC_MODAL_KEY);
}
export function openContactSyncModalDeeplink() {
const r7 = {};
checkContactPermissions().then($mk88031());
if (r7.initialRoutes == null) {
(0, initialize)(ContactSyncModes.NORMAL);
}
trackFlowStart({
location: {
page: "Deep Link"
}
});
ModalActionCreators.pushLazy(import("./components/RedesignContactSyncModal"), {
initialRoutes: r7.initialRoutes,
openSettingsSheet: r7.openSettings,
customLandingPage: r7.customLandingPage
}, CONTACT_SYNC_MODAL_KEY).then(void 0);
}
export function refreshContactSyncPermissionStatus() {
checkContactPermissions().then($mk88031());
}
export { closeContactSyncModal };
@@ -0,0 +1,136 @@
// Metro module 11768 (f11769).
import ConnectedAccountsStore from "../../../stores/ConnectedAccountsStore";
import UserStore from "../../../stores/UserStore";
import { ContactPermissions } from "./ContactSyncConstants";
import { PlatformTypes } from "../../../Constants";
import { create } from "../../../_bundle/Module644";
import { batchUpdates } from "../../../_bundle/Module705";
let c8062_6 = {
NORMAL: 0,
0: "NORMAL",
ONBOARDING: 1,
1: "ONBOARDING",
ONBOARDING_INVITE: 2,
2: "ONBOARDING_INVITE"
};
let c8062_7 = create(() => ({
mode: c8062_6.NORMAL,
permissionState: ContactPermissions.NOT_DETERMINED,
error: "",
phone: null,
phoneToken: null,
name: null,
isNameFromContactBook: false,
allowPhone: true,
allowEmail: true,
bulkAddToken: null,
suggestions: []
}));
export { c8062_6 as ContactSyncModes };
export { c8062_7 as useContactSyncModalStore };
export function initialize(mode) {
const name = ConnectedAccountsStore.getLocalAccount(PlatformTypes.CONTACTS)?.name;
const phone = UserStore.getCurrentUser()?.phone;
batchUpdates(() => c8062_7.setState(() => ({
...{
mode: c8062_6.NORMAL,
permissionState: ContactPermissions.NOT_DETERMINED,
error: "",
phone: null,
phoneToken: null,
name: null,
isNameFromContactBook: false,
allowPhone: true,
allowEmail: true,
bulkAddToken: null,
suggestions: []
},
mode,
phone,
name
})));
}
export function setAllowSync(allowPhone) {
batchUpdates(() => {
c8062_7.setState((state) => ({
...state,
allowPhone,
allowEmail: allowPhone
}));
});
}
export function setAllowPhone(allowPhone2) {
batchUpdates(() => {
c8062_7.setState((state) => ({
...state,
allowPhone: allowPhone2
}));
});
}
export function setAllowEmail(allowEmail) {
batchUpdates(() => {
c8062_7.setState((state) => ({
...state,
allowEmail
}));
});
}
export function setSuggestions(suggestions, bulkAddToken) {
batchUpdates(() => {
c8062_7.setState((state) => ({
...state,
suggestions,
bulkAddToken
}));
});
}
export function setPhone(phone2) {
batchUpdates(() => {
c8062_7.setState((state) => ({
...state,
phone: phone2
}));
});
}
export function setPhoneToken(phoneToken) {
batchUpdates(() => {
c8062_7.setState((state) => ({
...state,
phoneToken
}));
});
}
export function setName(name2, r4 = false) {
const isNameFromContactBook = r4;
batchUpdates(() => {
c8062_7.setState((state) => ({
...state,
name: name2,
isNameFromContactBook
}));
});
}
export function setPermissionState(permissionState) {
batchUpdates(() => {
c8062_7.setState((state) => ({
...state,
permissionState
}));
});
}
export function setError(error) {
batchUpdates(() => {
c8062_7.setState((state) => ({
...state,
error
}));
});
}
export function useIsOnboarding() {
const mode2 = c8062_7().mode;
return mode2 === c8062_6.ONBOARDING || mode2 === c8062_6.ONBOARDING_INVITE;
}
export function getIsOnboarding() {
const mode2 = c8062_7.getState().mode;
return mode2 === c8062_6.ONBOARDING || mode2 === c8062_6.ONBOARDING_INVITE;
}
@@ -0,0 +1,121 @@
// Metro module 11770 (f11771).
import { Storage } from "../../../_bundle/Module595";
import { batchUpdates } from "../../../_bundle/Module705";
import Dispatcher from "../../../Dispatcher";
import { create } from "../../../_bundle/Module644";
function $mk88043($env) {
return () => {
$env.$parent[7].setState($mk108398($env));
};
}
function $mk88044($env) {
return () => {
const r1 = $env.$parent;
return (0, r1[1])(r1[2][2]).dispatch({
type: "CONTACT_SYNC_STORED_CONTACTS",
empty: $env[0] === ""
});
};
}
function $mk108398($env) {
return (a0) => ({
...a0,
storedContacts: $env[0]
});
}
let c8063_7;
let env8063 = {};
const c8063_3 = "V2_DCD_CONTACTS_STORAGE_KEY";
const c8063_4 = "ContactSyncUpsellCTADismissed";
const c8063_5 = "ContactSyncDMListCTADismissed";
const c8063_6 = "contact_sync_dm_list_cta_first_seen_date";
Storage.asyncGet("V2_DCD_CONTACTS_STORAGE_KEY", (a0) => {
let env19152;
const r1 = env19152 = {
$parent: env8063
};
env19152[0] = a0;
Storage.set(c8063_3, a0);
batchUpdates($mk88043(r1));
Dispatcher.wait($mk88044(r1));
});
c8063_7 = create(() => ({
loadedPolicyNotice: false,
storedContacts: "",
upsellCTADismissed: false,
policyUpdateNoticeDismissed: false,
dmListCTADismissed: false
}));
Storage.asyncGet("ContactSyncDMListCTADismissed", (a0) => {
let dmListCTADismissed = Boolean(a0);
let r16 = Storage.get(c8063_6);
if (r16 == null) {
r16 = Date.now();
}
if (Date.now() - r16 > 5184000000) {
dmListCTADismissed = true;
}
batchUpdates(() => c8063_7.setState({
dmListCTADismissed
}));
});
Storage.asyncGet("ContactSyncUpsellCTADismissed", (c19154_0) => {
batchUpdates(() => c8063_7.setState({
upsellCTADismissed: !!c19154_0
}));
});
export function setStoredContacts(a0) {
let env19151;
const r1 = env19151 = {
$parent: env8063
};
env19151[0] = a0;
Storage.set(c8063_3, a0);
batchUpdates($mk88043(r1));
Dispatcher.wait($mk88044(r1));
}
export function deleteStoredContacts() {
let r11 = Storage.get(c8063_3);
if (r11 == null) {
r11 = "";
}
Storage.remove(c8063_3);
batchUpdates(() => {
c8063_7.setState((state) => ({
...state,
storedContacts: ""
}));
});
return r11;
}
export { c8063_7 as useContactSyncStore };
export function dismissUpsellCTA() {
Storage.set(c8063_4, true);
batchUpdates(() => {
c8063_7.setState((state) => ({
...state,
upsellCTADismissed: true
}));
});
}
export function dismissDMListCTA() {
Storage.set(c8063_5, true);
batchUpdates(() => c8063_7.setState((state) => ({
...state,
dmListCTADismissed: true
})));
}
export function setDMListCTAFirstSeenDate() {
if (!Storage.get(c8063_6)) {
Storage.set(c8063_6, Date.now());
}
}
export function clearDismissState() {
Storage.remove(c8063_4);
Storage.remove(c8063_5);
c8063_7.setState((state) => ({
...state,
upsellCTADismissed: false,
dmListCTADismissed: false
}));
}
@@ -0,0 +1,201 @@
// Metro module 11771 (f11772).
import { NativeModules } from "react-native";
import ConnectedAccountsStore from "../../../stores/ConnectedAccountsStore";
import { clearDismissState, deleteStoredContacts, useContactSyncStore } from "./ContactSyncPersistedStore";
import { ContactPermissions, ContactSyncSuggestionsSetting, CONTACT_SYNC_MODAL_KEY } from "./ContactSyncConstants";
import { Endpoints, PlatformTypes, FriendDiscoveryFlags, HelpdeskArticles } from "../../../Constants";
import { isIOS } from "../../../_bundle/Module501";
import TrackedHTTPUtils from "../../../utils/TrackedHTTPUtils";
import { NetworkActionNames } from "../../../_bundle/Module503";
import Dispatcher from "../../../Dispatcher";
import { removeLastUserContactsUpload } from "./ContactSyncManager";
import { ContactSyncEnabled, FriendDiscoverySettings } from "../../user_settings/UserSettings";
import SentryUtils_native from "../../../utils/SentryUtils.native";
import { useStateFromStores } from "../../../_bundle/Module589";
import * as _Module1384 from "../../../_bundle/Module1384";
import HelpdeskUtils from "../../../utils/HelpdeskUtils";
import Linking from "../../../lib/native/Linking";
import ModalActionCreators from "../../../actions/ModalActionCreators";
function $mk116297($env) {
return () => Dispatcher.dispatch({
type: "LOAD_FRIEND_SUGGESTIONS_SUCCESS",
suggestions: $env[3].friend_suggestions
});
}
let env8064 = {};
const error = new Error("No contact permissions");
const c8064_16 = error;
const error2 = new Error("No phone number");
const c8064_17 = new Error("Failed to fetch contact image");
export { error as ContactSyncPermissionDenied };
export { error2 as ContactSyncFailedUserHasNoPhone };
export { c8064_17 as ContactImageFetchFailed };
export function isContactSyncAvailable() {
let r10 = !!isIOS();
if (!r10) {
let r14 = NativeModules.DCDContactSyncManager?.isContactSyncSupported;
if (r14 == null) {
r14 = false;
}
r10 = r14;
}
return r10;
}
export function checkContactPermissions() {
let r11 = !!isIOS();
if (!r11) {
let r14 = NativeModules.DCDContactSyncManager?.isContactSyncSupported;
if (r14 == null) {
r14 = false;
}
r11 = r14;
}
return r11 ? NativeModules.DCDContactSyncManager.hasContactsPermissions() : Promise.resolve(ContactPermissions.UNAUTHORIZED);
}
export async function uploadContacts(c27154_0, c27154_1) {
let env30443;
const r28 = env8064;
let c27154_3 = r28;
const r10 = env30443 = {
$parent: r28
};
let c27154_2 = r10;
env30443[1] = void 0;
env30443[0] = c27154_0;
if (c27154_1 !== void 0) {
env30443[1] = c27154_1;
env30443[2] = void 0;
env30443[3] = void 0;
} else {
env30443[1] = false;
env30443[2] = void 0;
env30443[3] = void 0;
}
await void 0;
env30443[2] = JSON.parse(env30443[0]);
const r75 = await TrackedHTTPUtils.put({
url: Endpoints.CONNECTION_SYNC_CONTACTS,
body: {
friend_list_entries: env30443[2],
background: env30443[1],
allowed_in_suggestions: ContactSyncSuggestionsSetting.ANYONE_WITH_CONTACT_INFO,
include_mutual_friends_count: false
},
trackedActionData: {
event: NetworkActionNames.USER_CONTACTS_SYNC
},
rejectWithError: false
});
env30443[3] = r75.body;
Dispatcher.wait($mk116297(c27154_2));
return env30443[3];
}
export function bulkAddFriends(a0, a1) {
return TrackedHTTPUtils.post({
url: Endpoints.USER_BULK_RELATIONSHIPS,
body: {
user_ids: a0,
token: a1
},
trackedActionData: {
event: NetworkActionNames.USER_BULK_RELATIONSHIPS_UPDATE
},
rejectWithError: false
}).then((result) => result.body);
}
export function adminDeleteContactSync() {
(0, clearDismissState)();
(0, deleteStoredContacts)();
removeLastUserContactsUpload();
ContactSyncEnabled.updateSetting(false);
return TrackedHTTPUtils.delete({
url: Endpoints.CONNECTION(PlatformTypes.CONTACTS, "@me"),
oldFormErrors: true,
trackedActionData: {
event: NetworkActionNames.USER_CONNECTIONS_UPDATE
},
rejectWithError: false
});
}
export function getImageForContactId(c19155_0) {
const DCDContactSyncManager = NativeModules.DCDContactSyncManager;
return new Promise((c27155_0, c27155_1) => {
DCDContactSyncManager.getImageForContactId(c19155_0, (a0, a1) => {
if (a0 == null) {
c27155_0(a1.replace(/(\r\n|\n|\r)/gm, ""));
} else {
c27155_1(c8064_17);
}
});
});
}
export function getContacts(c19156_0, r3 = "") {
let c19156_1 = r3;
const DCDContactSyncManager2 = NativeModules.DCDContactSyncManager;
return new Promise((c27156_0, c27156_1) => {
DCDContactSyncManager2.syncContacts(c19156_1, c19156_0, (a0, a1, a2) => {
let r13;
if (a0 == null) {
try {
r13 = JSON.parse(a1);
} catch ($e) {
r13 = {};
}
const unencryptedName = Object.values(r13).find((item) => item.phone === c19156_0)?.unencryptedName;
c27156_0({
names: a1,
ownName: unencryptedName ?? null,
payload: a2
});
} else {
c27156_1(c8064_16);
}
});
});
}
export function getStoredContacts() {
let r11;
const storedContacts = useContactSyncStore.getState().storedContacts;
try {
r11 = JSON.parse(storedContacts);
} catch ($e) {
SentryUtils_native.captureException($e);
}
return r11;
}
export function useContactSyncAccount() {
return useStateFromStores([ConnectedAccountsStore], () => ConnectedAccountsStore.getLocalAccount(PlatformTypes.CONTACTS));
}
export function useContactSyncEnabled() {
return useStateFromStores([ConnectedAccountsStore], () => {
const localAccount = ConnectedAccountsStore.getLocalAccount(PlatformTypes.CONTACTS);
return localAccount != null && localAccount.friendSync && localAccount.type === PlatformTypes.CONTACTS;
});
}
export function useContactSyncUserIsDiscoverable() {
const setting = FriendDiscoverySettings.useSetting();
let phone = _Module1384.hasFlag(setting, FriendDiscoveryFlags.FIND_BY_PHONE);
const hasFlag = _Module1384.hasFlag(setting, FriendDiscoveryFlags.FIND_BY_EMAIL);
const r20 = {
phone,
email: hasFlag,
any: null
};
if (!phone) {
phone = hasFlag;
}
r20.any = phone;
return r20;
}
export function isContactSyncEnabled(a0) {
return a0 != null && a0.friendSync && a0.type === PlatformTypes.CONTACTS;
}
export function getOpenLearnMoreUrl() {
return HelpdeskUtils.getArticleURL(HelpdeskArticles.CONTACT_SYNC);
}
export function handleOpenLearnMoreLink() {
Linking.openURL(HelpdeskUtils.getArticleURL(HelpdeskArticles.CONTACT_SYNC));
}
export function transitionToAddFriendsLandingPage() {
ModalActionCreators.popWithKey(CONTACT_SYNC_MODAL_KEY);
}
@@ -0,0 +1,125 @@
// Metro module 11794 (f11795).
import { useState, useEffect } from "react";
import { View } from "react-native";
import UserStore from "../../../../stores/UserStore";
import { useContactSyncModalStore } from "../ContactSyncModalStore";
import { createStyles } from "../../../../design/components/Styles/native/createStyles";
import { NAV_BAR_HEIGHT } from "../../../../design/components/Navigator/native/NavigatorConstants.native";
import Module712 from "../../../../_bundle/Module712";
import { useNavigation } from "../../../../design/components/Navigator/native/useNavigation.native";
import { Text } from "../../../../design/components/Text/native/Text";
import * as _index_native from "../../../../intl/index.native";
import { intl } from "../../../../intl/index.native";
import AddPhone from "../../../verification/native/components/AddPhone";
import PhoneActionCreators, { ChangePhoneReason } from "../../../phone/PhoneActionCreators";
import { submitPhone, verifyPhone, handlePhoneVerificationComplete, verifyPhoneWithPassword } from "../ContactSyncModalActionCreators";
import { useStateFromStores } from "../../../../_bundle/defaultAreStatesEqual";
import { runAfterInteractions } from "../../../../utils/native/RunAfterInteractionsUtils";
import Module38 from "../../../../_bundle/Module38";
import VerifyPhone from "../../../verification/native/components/VerifyPhone";
import UserSettingsConfirmPassword from "../../../user_settings/account/native/UserSettingsConfirmPassword";
const useStyles = createStyles({
container: {
paddingTop: NAV_BAR_HEIGHT + 32
},
redesignContainer: {
flex: 1,
backgroundColor: Module712.colors.BACKGROUND_BASE_LOW,
paddingTop: NAV_BAR_HEIGHT + 32
},
header: {
alignItems: "center"
},
title: {
textAlign: "center"
},
subtitle: {
marginTop: 8,
lineHeight: 18,
textAlign: "center"
}
});
export function AddPhoneScreen() {
const navigation = useNavigation();
const styles = useStyles();
return <AddPhone style={styles.container} reason={ChangePhoneReason.CONTACT_SYNC} header={<View style={styles.header}>
<Text style={styles.title} accessibilityRole="header" variant="heading-xl/extrabold" color="mobile-text-heading-primary">
{intl.string(_index_native.t.Xgb497)}
</Text>
<Text style={styles.subtitle} variant="text-sm/medium" color="text-default">
{intl.string(_index_native.t.qFmzyo)}
</Text>
</View>} onComplete={(event) => submitPhone(event, navigation)} />;
}
export function VerifyPhoneScreen() {
let navigation2, stateFromStores;
let _handleCodeEntered2 = function _handleCodeEntered() {
const r9 = async (c30450_0) => {
let c30450_2;
c30450_2 = void 0;
setState(true);
setState2(void 0);
let c31642_0 = await verifyPhone(c30450_0);
let c31642_1 = c31642_0.codeIntercepted;
let c31642_2 = c31642_0.addedPhone;
let c31642_3 = c31642_0.error;
(0, setState2)(c31642_3);
if (!(c31642_2 && c31642_1)) {
(0, setState)(false);
}
return c31642_1;
};
_handleCodeEntered2 = r9;
return r9.apply(this, arguments);
};
const styles = useStyles();
const [loading, setState] = useState(false);
const [error, setState2] = useState();
const phone = useContactSyncModalStore().phone;
navigation2 = useNavigation();
stateFromStores = useStateFromStores([UserStore], () => UserStore.getCurrentUser()?.phone);
useEffect(() => {
let c27165_0 = null;
if (stateFromStores != null) {
handlePhoneVerificationComplete(stateFromStores, navigation2).then(() => {
c27165_0 = runAfterInteractions(() => setState(false));
});
}
return () => {
if (c27165_0 != null) {
c27165_0.cancel();
}
};
}, [navigation2, phone, stateFromStores]);
Module38(phone != null, "Phone shouldn't be null when trying to verify the code");
return <VerifyPhone phone={phone} loading={loading} error={error} backgroundStyle={styles.redesignContainer} disableKeyboardAvoidingView onCodeEnteredIntercept={function handleCodeEntered(event) {
return _handleCodeEntered2.apply(this, arguments);
}} onVerified={(event) => {
verifyPhoneWithPassword(event, navigation2);
}} />;
}
export function VerifyPasswordScreen() {
const [parentLoading, setState3] = useState(false);
const navigation3 = useNavigation();
const styles = useStyles();
const phoneToken = useContactSyncModalStore().phoneToken;
const stateFromStores2 = useStateFromStores([UserStore], () => UserStore.getCurrentUser()?.phone);
useEffect(() => {
let c27166_0 = null;
if (stateFromStores2 != null) {
handlePhoneVerificationComplete(stateFromStores2, navigation3).then(() => {
c27166_0 = runAfterInteractions(() => setState3(false));
});
}
return () => {
if (c27166_0 != null) {
c27166_0.cancel();
}
};
}, [navigation3, stateFromStores2]);
Module38(phoneToken != null, "Phone token shouldn't be null when trying to verify the password");
return <UserSettingsConfirmPassword hideUnverifiedBanner parentLoading={parentLoading} style={styles.redesignContainer} onSubmit={(event) => {
setState3(true);
return PhoneActionCreators.addPhone(phoneToken, event, ChangePhoneReason.CONTACT_SYNC);
}} onError={() => setState3(false)} onSuccess={() => {}} />;
}
@@ -0,0 +1,14 @@
// Metro module 11793 (f11794).
import { useNavigation } from "../../../../design/components/Navigator/native/useNavigation.native";
import { getHeaderBackButton } from "../../../../design/components/Navigator/native/NavigatorHeader.native";
import { goBackToLanding } from "../ContactSyncModalActionCreators";
export default function ContactSyncBackToLanding(a0) {
const navigation = useNavigation();
return getHeaderBackButton(() => {
if (a0.navigateToLandingPage != null) {
a0.navigateToLandingPage();
} else {
goBackToLanding(navigation);
}
}, true)(a0);
};
@@ -0,0 +1,36 @@
// Metro module 11785 (f11786).
import { createStyles } from "../../../../design/components/Styles/native/createStyles";
import ReanimatedRexport, { useAnimatedStyle } from "../../../reanimated/ReanimatedRexport";
import * as _timing from "../../../../design/animation/reanimated/timing/timing";
import { Text } from "../../../../design/components/Text/native/Text";
const useStyles = createStyles({
container: {
justifyContent: "center"
},
error: {
paddingHorizontal: 16,
textAlign: "center"
}
});
const __initData = {
code: "function ContactSyncErrorTsx1(){const{withTiming,hasError,ERROR_HEIGHT}=this.__closure;return{height:withTiming(hasError?ERROR_HEIGHT:0)};}"
};
export default function ContactSyncError(props) {
const { style, error } = props;
const styles = useStyles();
const hasError = error != null && error !== "";
let c19166_0 = hasError;
const l = () => ({
height: _timing.withTiming(c19166_0 ? 44 : 0)
});
l.__closure = {
withTiming: _timing.withTiming,
hasError,
ERROR_HEIGHT: 44
};
l.__workletHash = 14558247431913;
l.__initData = __initData;
return <ReanimatedRexport.View style={[styles.container, style, useAnimatedStyle(l)]}>
<Text variant="text-sm/medium" color="text-feedback-critical" style={styles.error}>{error}</Text>
</ReanimatedRexport.View>;
};
@@ -0,0 +1,68 @@
// Metro module 11791 (f11792).
import { View } from "react-native";
import UserStore from "../../../../stores/UserStore";
import { AnalyticEvents, AnalyticsSections } from "../../../../Constants";
import { createStyles } from "../../../../design/components/Styles/native/createStyles";
import Module712 from "../../../../_bundle/Module712";
import { useStateFromStores } from "../../../../_bundle/Module589";
import FastImage from "../../../../components_native/common/FastImage";
import Module11792 from "../../../../_bundle/Module11792";
import { Text } from "../../../../design/components/Text/native/Text";
import { intl, t } from "../../../../intl/index.native";
import { Button } from "../../../../design/components/Button/native/Button.native";
import AnalyticsUtils from "../../../../utils/AnalyticsUtils";
import UserUtils from "../../../../utils/UserUtils";
import { showShareActionSheet } from "../../../action_sheet/native/showShareActionSheet";
const useStyles = createStyles({
container: {
flex: 1,
alignItems: "center",
justifyContent: "center",
paddingHorizontal: 16
},
art: {
marginBottom: 16
},
title: {
marginBottom: 8,
textAlign: "center"
},
subtitle: {
lineHeight: 18,
textAlign: "center"
},
button: {
marginTop: Module712.space.PX_24,
marginHorizontal: Module712.space.PX_16,
paddingBottom: Module712.space.PX_32
}
});
export default function ContactSyncInviteFriends() {
const styles = useStyles();
const stateFromStores = useStateFromStores([UserStore], () => UserStore.getCurrentUser());
return <>
<View style={styles.container}>
<FastImage style={styles.art} source={Module11792} />
<Text style={styles.title} accessibilityRole="header" variant="heading-xl/extrabold" color="mobile-text-heading-primary">
{intl.string(t.ZxBpLf)}
</Text>
<Text style={styles.subtitle} variant="text-sm/medium" color="text-default">
{intl.string(t["fXtCJ+"])}
</Text>
</View>
<View style={styles.button}>
<Button variant="primary" size="lg" text={intl.string(t["6Qgrev"])} onPress={function onPress() {
AnalyticsUtils.track(AnalyticEvents.FRIEND_ADD_VIEWED, {
friend_add_type: "Invite",
source_page: AnalyticsSections.CONTACT_SYNC_MODAL
});
showShareActionSheet({
message: intl.formatToPlainString(t["6E9a1J"], {
url: "https://discord.com/",
username: stateFromStores != null ? UserUtils.getUserTag(stateFromStores) : ""
})
}, AnalyticsSections.CONTACT_SYNC_MODAL);
}} />
</View>
</>;
};
@@ -0,0 +1,37 @@
// Metro module 11780 (f11781).
import { Image as Image2, View } from "react-native";
import { createStyles } from "../../../../design/components/Styles/native/createStyles";
import Module11781 from "../../../../_bundle/Module11781";
import Module11782 from "../../../../_bundle/Module11782";
const useStyles = createStyles({
leftContainer: {
zIndex: 2,
height: 106,
width: 102,
position: "absolute"
},
landingImageLeft: {
left: 58,
top: -92
},
rightContainer: {
position: "absolute",
height: 113,
width: 103
},
landingImageRight: {
left: 134,
top: -99
}
});
export default function ContactSyncLandingImage() {
const styles = useStyles();
return <>
<View style={styles.leftContainer}>
<Image2 resizeMode="contain" style={styles.landingImageLeft} source={Module11781} />
</View>
<View style={styles.rightContainer}>
<Image2 resizeMode="contain" style={styles.landingImageRight} source={Module11782} />
</View>
</>;
};
@@ -0,0 +1,73 @@
// Metro module 11783 (f11784).
import { useCallback } from "react";
import { Image as Image2, View } from "react-native";
import { NativePermissionTypes } from "../../../native_permissions/NativePermissionConstants";
import { createStyles } from "../../../../design/components/Styles/native/createStyles";
import Module712 from "../../../../_bundle/Module712";
import { NAV_BAR_HEIGHT } from "../../../../design/components/Navigator/native/NavigatorConstants.native";
import NativePermissionUtils from "../../../native_permissions/NativePermissionUtils";
import Module11784 from "../../../../_bundle/Module11784";
import { Text } from "../../../../design/components/Text/native/Text";
import { intl, t } from "../../../../intl/index.native";
import { Button } from "../../../../design/components/Button/native/Button.native";
import ContactSyncError from "./ContactSyncError";
import RedesignContactSyncDiscoverabilityFooter from "./RedesignContactSyncDiscoverabilityFooter";
const useStyles = createStyles({
content: {
flex: 1,
justifyContent: "center",
alignItems: "center",
textAlign: "center",
marginTop: -Module712.space.PX_32 - NAV_BAR_HEIGHT
},
headerImage: {
height: 135,
width: 216,
marginBottom: Module712.space.PX_24
},
title: {
marginBottom: Module712.space.PX_8
},
subtitle: {
marginBottom: Module712.space.PX_24
},
buttonContainer: {
height: 48,
width: "100%",
paddingHorizontal: Module712.space.PX_16
},
trailing: {
paddingBottom: Module712.space.PX_4,
justifyContent: "flex-end",
paddingHorizontal: Module712.space.PX_16
}
});
export default function ContactSyncLandingOnboardingRedesign(props) {
const { onNext, loading, error, discoverabilityEnabled, setDiscoverabilityEnabled } = props;
const styles = useStyles();
const callback = useCallback(async () => {
let c27163_0;
c27163_0 = void 0;
if (await NativePermissionUtils.requestPermission(NativePermissionTypes.CONTACTS)) {
(0, onNext)();
}
}, [onNext]);
return <>
<View style={styles.content}>
<Image2 resizeMode="contain" style={styles.headerImage} source={Module11784} />
<Text style={styles.title} variant="heading-xl/bold">
{intl.string(t["/G+nci"])}
</Text>
<Text style={styles.subtitle} variant="text-sm/medium">
{intl.string(t.G8zcHt)}
</Text>
<View style={styles.buttonContainer}>
<Button variant="primary" size="lg" text={intl.string(t.LhlgY9)} onPress={callback} loading={loading} />
</View>
<ContactSyncError error={error} />
</View>
<View style={styles.trailing}>
<RedesignContactSyncDiscoverabilityFooter discoverabilityEnabled={discoverabilityEnabled} onValueChanged={setDiscoverabilityEnabled} />
</View>
</>;
};
@@ -0,0 +1,84 @@
// Metro module 11788 (f11789).
import { useState } from "react";
import { View } from "react-native";
import { createStyles } from "../../../../design/components/Styles/native/createStyles";
import Module712 from "../../../../_bundle/Module712";
import useSafeAreaInsetsKeyboardAware_native from "../../../safe_area/useSafeAreaInsetsKeyboardAware.native";
import * as _index_native from "../../../../intl/index.native";
import { intl } from "../../../../intl/index.native";
import { Text } from "../../../../design/components/Text/native/Text";
import { InputView, ClearButtonVisibility } from "../../../../design/void/native";
import { Button } from "../../../../design/components/Button/native/Button.native";
import ContactSyncError from "./ContactSyncError";
const useStyles = createStyles({
flex: {
flex: 1
},
content: {
flex: 1,
padding: 16,
paddingBottom: 0
},
title: {
marginBottom: 8,
textAlign: "center"
},
subtitle: {
lineHeight: 18,
textAlign: "center",
marginBottom: 16
},
input: {
width: "100%",
marginTop: 8,
marginBottom: 12,
padding: 12,
backgroundColor: Module712.colors.BACKGROUND_BASE_LOWEST,
borderRadius: Module712.radii.lg
},
formSubtitle: {
lineHeight: 16
},
button: {
flexGrow: 0,
paddingTop: Module712.space.PX_16,
paddingBottom: Module712.space.PX_12
},
error: {
marginTop: 8
}
});
export default function ContactSyncNameInput(props) {
const { loading, error, initialName, prefilledFromContactBook = false, onNext, onRemoveName } = props;
const styles = useStyles();
const [state, onChangeText] = useState(initialName);
const insets = useSafeAreaInsetsKeyboardAware_native({
includeKeyboardHeight: true
}).insets;
const r3 = onRemoveName != null;
const text = r3 ? intl.string(_index_native.t.i4jeWR) : intl.string(_index_native.t.PDTjLN);
return <View style={[styles.content, {
paddingBottom: insets.bottom
}]}>
<View style={styles.flex}>
<Text style={styles.title} accessibilityRole="header" variant="heading-xl/extrabold" color="mobile-text-heading-primary">
{r3 ? intl.string(_index_native.t["/OywGQ"]) : intl.string(_index_native.t["sO+NI5"])}
</Text>
<Text style={styles.subtitle} variant="text-sm/medium" color="text-default">
{r3 ? intl.string(_index_native.t["xCHh/t"]) : intl.string(_index_native.t.xI496M)}
</Text>
<Text variant="eyebrow" color="interactive-text-default">
{intl.string(_index_native.t["42/D2U"])}
</Text>
<InputView value={state} onChangeText={onChangeText} style={styles.input} autoFocus showBorder={false} showTopContainer={false} clearButtonVisibility={ClearButtonVisibility.WITH_CONTENT} autoCorrect autoComplete="name" textContentType="name" />
{prefilledFromContactBook ? <Text style={styles.formSubtitle} variant="text-xs/medium" color="text-default">
{intl.string(_index_native.t.bCQt9K)}
</Text> : null}
</View>
<Button variant="primary" size={r3 ? "md" : "lg"} text={text} onPress={() => onNext(state)} loading={loading} disabled={state === ""} />
{r3 ? <View style={styles.button}>
<Button variant="secondary" size="md" text={intl.string(_index_native.t["91RssO"])} onPress={() => onRemoveName == null ? void 0 : onRemoveName()} />
</View> : null}
<ContactSyncError style={styles.error} error={error} />
</View>;
};
@@ -0,0 +1,95 @@
// Metro module 13876 (f13877).
import { useState } from "react";
import { View } from "react-native";
import { ContactSyncScenes } from "../ContactSyncConstants";
import ModalActionCreators from "../../../../actions/ModalActionCreators";
import { createStyles } from "../../../../design/components/Styles/native/createStyles";
import Module712 from "../../../../_bundle/Module712";
import { NAV_BAR_HEIGHT } from "../../../../design/components/Navigator/native/NavigatorConstants.native";
import { useContactSyncAccount } from "../ContactSyncUtils";
import ContactSyncActionCreators from "../ContactSyncActionCreators";
import ToastActionCreators from "../../../toast/native/ToastActionCreators";
import { intl, t } from "../../../../intl/index.native";
import Module9172 from "../../../../_bundle/Module9172";
import ContactSyncNameInput from "./ContactSyncNameInput";
import { getHeaderCloseButton } from "../../../../design/components/Navigator/native/NavigatorHeader.native";
import { Navigator } from "../../../../design/components/Navigator/native/Navigator.native";
let useStyles, ContactSyncNameInputScreen, screens;
const onClose = function onClose() {
ModalActionCreators.pop();
};
ContactSyncNameInputScreen = function ContactSyncNameInputScreen() {
let _onNext2;
const onNext2 = function onNext() {
return _onNext2.apply(this, arguments);
};
_onNext2 = function _onNext() {
const r9 = async (c30675_0) => {
let c30675_3 = 0;
L10: {
try {
setState(true);
c30675_3 = 1;
await ContactSyncActionCreators.updateName(c30675_0);
(0, setState)(false);
(0, onClose)();
c30675_3 = 0;
} catch ($e) {
let r29 = $e;
if (c30675_3 !== 0) {
while (true) {
try {
c30675_3 = 0;
ToastActionCreators.open({
key: "ERROR_GENERIC_TITLE",
content: intl.string(t.R0RpRX),
icon: Module9172
});
(0, setState)(false);
break L10;
} catch ($e) {
r29 = $e;
if (c30675_3 === 0) {
break;
}
}
}
}
throw r29;
}
}
};
_onNext2 = r9;
return r9.apply(this, arguments);
};
const styles = useStyles();
const contactSyncAccount = useContactSyncAccount();
const [loading, setState] = useState(false);
let initialName = contactSyncAccount?.name;
if (initialName == null) {
initialName = "";
}
return <View style={styles.container}>
<ContactSyncNameInput onNext={onNext2} onRemoveName={() => onNext2(null)} loading={loading} initialName={initialName} />
</View>;
};
useStyles = createStyles({
container: {
flex: 1,
backgroundColor: Module712.colors.BACKGROUND_BASE_LOW,
justifyContent: "center",
paddingTop: NAV_BAR_HEIGHT + 32
}
});
const r45 = {};
r45[ContactSyncScenes.NAME_INPUT] = {
render: () => <ContactSyncNameInputScreen />,
ignoreKeyboard: true,
fullscreen: true,
headerLeft: getHeaderCloseButton(onClose),
title: ""
};
screens = r45;
export default function ContactSyncNameUpdateModal() {
return <Navigator initialRouteName={ContactSyncScenes.NAME_INPUT} screens={screens} />;
};
@@ -0,0 +1,207 @@
// Metro module 13875 (f13876).
import UserStore from "../../../../stores/UserStore";
import { deleteStoredContacts, setStoredContacts } from "../ContactSyncPersistedStore";
import { AnalyticEvents, AnalyticsSections, FriendDiscoveryFlags } from "../../../../Constants";
import * as _ContactSyncUtils from "../ContactSyncUtils";
import { getContacts, uploadContacts, ContactSyncPermissionDenied, useContactSyncAccount, adminDeleteContactSync, handleOpenLearnMoreLink } from "../ContactSyncUtils";
import ToastActionCreators from "../../../toast/native/ToastActionCreators";
import { intl, t } from "../../../../intl/index.native";
import Module9172 from "../../../../_bundle/Module9172";
import ContactSyncActionCreators from "../ContactSyncActionCreators";
import AnalyticsUtils from "../../../../utils/AnalyticsUtils";
import { openContactSyncModal } from "../ContactSyncModalActionCreators";
import { useStateFromStores } from "../../../../_bundle/Module589";
import { FriendDiscoverySettings } from "../../../user_settings/UserSettings";
import * as _Module1384 from "../../../../_bundle/Module1384";
import { FormSection, FormSwitchRow, FormDivider, FormRow, FormHint } from "../../../../design/void/Form/native/index";
import ModalActionCreators from "../../../../actions/ModalActionCreators";
let updateFriendSync;
const syncContacts = async function syncContacts(c27584_0, c27584_1, c27584_2) {
let c27584_5;
let c27584_6 = 0;
let c30673_0, c30673_1, c30673_2;
L17: {
L16: {
try {
c30673_0 = void 0;
c30673_1 = void 0;
c30673_2 = void 0;
deleteStoredContacts();
if (!c27584_2) {
break L17;
}
if (c27584_0 == null) {
break L17;
}
if (c27584_1 != null) {
c27584_6 = 1;
c30673_0 = await getContacts(c27584_1);
c30673_1 = c30673_0.names;
c30673_2 = c30673_0.payload;
(0, setStoredContacts)(c30673_1);
await uploadContacts(c30673_2, true);
c27584_6 = 0;
break L16;
}
break L17;
} catch ($e) {
const r33 = $e;
let r8 = r33;
c27584_5 = r33;
if (c27584_6 !== 0) {
while (true) {
try {
const r102 = c27584_5;
c27584_6 = 0;
if (r102 !== ContactSyncPermissionDenied) {
break L16;
}
ToastActionCreators.open({
key: "CONTACT_SYNC_NEEDS_PERMISSIONS",
content: intl.string(t["h+jFOs"]),
icon: Module9172
});
break L16;
} catch (r99) {
r8 = r99;
c27584_5 = r99;
if (c27584_6 === 0) {
break;
}
}
}
}
throw r8;
}
}
return void 0;
}
};
updateFriendSync = async function updateFriendSync(c27585_0, c27585_1, enabled) {
let c27585_6 = 0;
let c30674_0, c30674_1, c30674_2;
L15: {
try {
c30674_0 = c27585_0;
c30674_1 = c27585_1;
c30674_2 = enabled;
if (c27585_0 != null) {
c27585_6 = 1;
await ContactSyncActionCreators.updateContactSyncEnabled({
enabled
});
await (0, syncContacts)(c30674_0, c30674_1, c30674_2);
c27585_6 = 0;
break L15;
}
} catch ($e) {
let r8 = $e;
if (c27585_6 !== 0) {
while (true) {
try {
c27585_6 = 0;
ToastActionCreators.open({
key: "CONTACT_SYNC_FAILED_ALERT_TITLE",
content: intl.string(t.GCwBtE),
icon: Module9172
});
break L15;
} catch ($e) {
r8 = $e;
if (c27585_6 === 0) {
break;
}
}
}
}
throw r8;
}
return void 0;
}
};
export default function ContactSyncSettings() {
let phone, hasFlag, hasFlag2;
const contactSyncAccount = useContactSyncAccount();
const stateFromStores = useStateFromStores([UserStore], () => UserStore.getCurrentUser());
phone = stateFromStores?.phone;
const r7 = stateFromStores == null ? void 0 : stateFromStores.isStaff();
const isContactSyncEnabled = _ContactSyncUtils.isContactSyncEnabled(contactSyncAccount);
const setting = FriendDiscoverySettings.useSetting();
hasFlag = _Module1384.hasFlag(setting, FriendDiscoveryFlags.FIND_BY_PHONE);
hasFlag2 = _Module1384.hasFlag(setting, FriendDiscoveryFlags.FIND_BY_EMAIL);
return <>
<FormSection title={intl.string(t.bGSsnc)}>
{r7 ? <>
<FormSwitchRow label="STAFF ONLY - Find your friends deletion" value onValueChange={adminDeleteContactSync} />
<FormDivider />
</> : null}
<FormSwitchRow label={intl.string(t.uSvEy7)} value={isContactSyncEnabled} onValueChange={(value) => {
if (contactSyncAccount == null) {
AnalyticsUtils.track(AnalyticEvents.OPEN_MODAL, {
type: AnalyticsSections.CONTACT_SYNC_MODAL,
location: {
page: "User Settings"
}
});
openContactSyncModal({}, {
page: "User Settings"
});
} else {
updateFriendSync(contactSyncAccount, phone, value);
}
}} />
{contactSyncAccount != null ? <>
<FormDivider />
<FormRow label={intl.string(t.nAsWKy)} trailing={<FormRow.Arrow label={contactSyncAccount.name} />} onPress={function onPress() {
AnalyticsUtils.track(AnalyticEvents.OPEN_MODAL, {
type: "Change Name",
location: {
page: "User Settings"
}
});
ModalActionCreators.pushLazy(import("./ContactSyncNameUpdateModal"), "Contact Sync Name Update Modal");
}} />
</> : null}
</FormSection>
<FormHint>
{intl.format(t.BoR0dO, {
onClick: handleOpenLearnMoreLink
})}
</FormHint>
<FormHint>
{intl.string(t.cW1nr9)}
</FormHint>
<FormSection title={intl.string(t["0t2wRW"])}>
<FormSwitchRow label={intl.string(t["eJnn0+"])} subLabel={intl.string(t.X7pIKN)} value={hasFlag} onValueChange={function onValueChange(value) {
ContactSyncActionCreators.updateDiscoverability({
phone: value,
email: hasFlag2
});
}} />
<FormDivider />
<FormSwitchRow label={intl.string(t.dI4d4S)} subLabel={intl.string(t.ilGsHE)} value={hasFlag2} onValueChange={function onValueChange(value) {
ContactSyncActionCreators.updateDiscoverability({
phone: hasFlag,
email: value
});
}} />
</FormSection>
</>;
};
export { syncContacts };
export { updateFriendSync };
export function handleSyncContacts(a0, a1, a2) {
if (a0 == null) {
AnalyticsUtils.track(AnalyticEvents.OPEN_MODAL, {
type: AnalyticsSections.CONTACT_SYNC_MODAL,
location: {
page: "User Settings"
}
});
openContactSyncModal({}, {
page: "User Settings"
});
} else {
updateFriendSync(a0, a1, a2);
}
}
@@ -0,0 +1,75 @@
// Metro module 11778 (f11779).
import { View } from "react-native";
import { setAllowEmail, setAllowPhone, setAllowSync, useContactSyncModalStore } from "../ContactSyncModalStore";
import { Fonts } from "../../../../Constants";
import { createStyles } from "../../../../design/components/Styles/native/createStyles";
import Module712 from "../../../../_bundle/Module712";
import { FormRow, FormText, FormTitle } from "../../../../design/void/Form/native/index";
import { intl, t } from "../../../../intl/index.native";
import { Text } from "../../../../design/components/Text/native/Text";
import { handleOpenLearnMoreLink } from "../ContactSyncUtils";
import { ActionSheet } from "../../../../design/components/Sheet/native/ActionSheet.native";
const useStyles = createStyles({
container: {
backgroundColor: Module712.colors.BACKGROUND_BASE_LOW,
paddingBottom: 16
},
formRow: {
marginTop: 8,
paddingVertical: 16,
backgroundColor: Module712.colors.BACKGROUND_SURFACE_HIGH
},
syncRow: {
marginTop: 24
},
formText: {
fontFamily: Fonts.PRIMARY_SEMIBOLD,
color: Module712.colors.INTERACTIVE_TEXT_ACTIVE
},
info: {
marginTop: 8,
fontSize: 14,
lineHeight: 18,
paddingHorizontal: 16,
color: Module712.colors.TEXT_SUBTLE
}
});
export default function ContactSyncSettingsActionSheet() {
const styles = useStyles();
const contactSyncModalStore = useContactSyncModalStore();
const { allowPhone, allowEmail } = contactSyncModalStore;
const allowEmail2 = allowPhone ? allowPhone : allowEmail;
return <ActionSheet startExpanded>
<View style={styles.container}>
<FormRow DEPRECATED_style={[styles.formRow, styles.syncRow]} label={<FormRow.Label style={styles.formText} text={intl.string(t.a5QL24)} />} onPress={() => {
setAllowSync(!allowEmail2);
}} trailing={<FormRow.Checkbox selected={allowEmail2} />} />
<FormText style={styles.info}>
{intl.string(t.pfjsB5)}
</FormText>
<FormText style={styles.info}>
{intl.string(t.cW1nr9)}
</FormText>
<FormText style={styles.info}>
{intl.format(t.eswIfi, {
learnMoreHook: function learnMoreHook(a0, a1) {
return <Text key={a1} onPress={handleOpenLearnMoreLink} variant="text-sm/medium" color="text-link">
{a0}
</Text>;
}
})}
</FormText>
<FormTitle title={intl.string(t["0t2wRW"])} thinTitle />
<FormRow DEPRECATED_style={styles.formRow} label={<FormRow.Label style={styles.formText} text={intl.string(t["eJnn0+"])} />} subLabel={<Text variant="text-sm/medium" color="text-default">
{intl.string(t.X7pIKN)}
</Text>} onPress={() => {
setAllowPhone(!allowPhone);
}} trailing={<FormRow.Checkbox selected={allowPhone} />} />
<FormRow DEPRECATED_style={styles.formRow} label={<FormRow.Label style={styles.formText} text={intl.string(t.dI4d4S)} />} subLabel={<Text variant="text-sm/medium" color="text-default">
{intl.string(t.ilGsHE)}
</Text>} onPress={() => {
setAllowEmail(!allowEmail);
}} trailing={<FormRow.Checkbox selected={allowEmail} />} />
</View>
</ActionSheet>;
};
@@ -0,0 +1,172 @@
// Metro module 11789 (f11790).
import * as Module19 from "react";
import { useState, useCallback, useMemo } from "react";
import { View } from "react-native";
import { AnalyticEvents } from "../../../../Constants";
import { SuggestedFriendSource } from "../../../main_tabs_v2/native/friends/screens/FriendsScreenConstants";
import { createStyles } from "../../../../design/components/Styles/native/createStyles";
import Module712 from "../../../../_bundle/Module712";
import { NAV_BAR_HEIGHT } from "../../../../design/components/Navigator/native/NavigatorConstants.native";
import { useFontScale } from "../../../screen/native/useFontScale";
import { Text } from "../../../../design/components/Text/native/Text";
import { getUserTag } from "../../../../utils/UserUtils";
import AvatarUtils from "../../../../utils/AvatarUtils";
import { TableCheckboxRow } from "../../../../design/components/TableRow/native/TableCheckboxRow.native";
import { Avatar, AvatarSizes } from "../../../../design/void/native";
import { intl, t } from "../../../../intl/index.native";
import { useToken } from "../../../../design/tokens/native/useToken";
import { hexOpacityToRgba } from "../../../../utils/ColorUtils";
import SnowflakeUtils from "../../../../utils/SnowflakeUtils";
import { FormDivider } from "../../../../design/void/Form/native/index";
import { FlashList } from "../../../../_bundle/noop_6676";
import Module4611 from "../../../../_bundle/Module4611";
import { VerticalGradient } from "../../../../ConstantsIOS";
import { Button } from "../../../../design/components/Button/native/Button.native";
import AnalyticsUtils from "../../../../utils/AnalyticsUtils";
let useStyles, SuggestionRow;
const SuggestedFriendsSectionHeader = function SuggestedFriendsSectionHeader(props) {
const label = props.label;
return <View style={useStyles().sectionHeader}>
<Text color="text-muted" variant="text-sm/semibold">{label}</Text>
</View>;
};
SuggestionRow = function SuggestionRow(props) {
const { start, end, suggestion, selected, onSelect } = props;
const name = suggestion.reasons[0]?.name;
const userTag = getUserTag(suggestion.suggested_user);
const label = name != null ? name !== "" ? name : userTag : userTag;
return <TableCheckboxRow start={start} end={end} icon={<Avatar source={AvatarUtils.getUserAvatarSource(suggestion.suggested_user)} size={AvatarSizes.REFRESH_MEDIUM_32} />} checked={selected} label={label} subLabel={<>
<Text variant="text-xs/medium" color="text-muted">{userTag}</Text>
{suggestion.mutual_friends_count != null && <Text variant="text-xs/medium" color="text-muted">
{intl.format(t.z7y34b, {
count: suggestion.mutual_friends_count
})}
</Text>}
</>} onPress={() => onSelect(suggestion.suggested_user.id)} />;
};
useStyles = createStyles({
container: {
flex: 1,
backgroundColor: Module712.colors.BACKGROUND_BASE_LOWER,
paddingTop: NAV_BAR_HEIGHT + 32,
justifyContent: "center"
},
header: {
alignItems: "center",
paddingTop: Module712.space.PX_16,
paddingBottom: Module712.space.PX_24
},
title: {
marginBottom: 8,
textAlign: "center"
},
subtitle: {
lineHeight: 18,
textAlign: "center"
},
list: {
flex: 1,
marginTop: Module712.space.PX_12
},
divider: {
backgroundColor: Module712.colors.BORDER_SUBTLE
},
linearGradient: {
position: "absolute",
width: "100%",
bottom: 0,
minHeight: 136
},
redesignButton: {
position: "absolute",
width: "100%",
bottom: 0,
padding: Module712.space.PX_16,
paddingBottom: Module712.space.PX_32
},
sectionHeader: {
marginBottom: Module712.space.PX_8,
flexDirection: "row",
alignItems: "center",
justifyContent: "space-between"
}
});
export default function ContactSyncSuggestions(props) {
let state, setState, callback;
const { friendSuggestions, onSubmit } = props;
state = void 0;
setState = void 0;
callback = void 0;
const styles = useStyles();
const r26 = friendSuggestions.reduce((acc, friendSuggestion) => {
acc[friendSuggestion.suggested_user.id] = true;
return acc;
}, {});
const token = useToken(Module712.colors.BACKGROUND_BASE_LOW);
const colors = [hexOpacityToRgba(token, 0), hexOpacityToRgba(token, 100)];
[state, setState] = useState(r26);
const paddingBottom = Module712.space.PX_16 + Module712.space.PX_32 + 40 + Math.max(18 * Math.min(useFontScale(), 2) - 18, 0);
callback = useCallback((a0) => {
const r1 = {
...state
};
r1[a0] = !state[a0];
setState(r1);
}, [state]);
const r80 = SnowflakeUtils.keys(state).some((item) => state[item]);
return <View style={[styles.container, styles.list]}>
<FlashList contentContainerStyle={{
paddingHorizontal: Module712.space.PX_16,
paddingBottom
}} data={useMemo(() => {
const r0 = [];
let c27164_0 = r0;
r0.push({
type: "header"
});
friendSuggestions.forEach((a0) => {
c27164_0.push({
type: "suggestedFriend",
props: {
friendSuggestion: a0,
selected: state[a0.suggested_user.id]
}
});
});
return r0;
}, [friendSuggestions, state])} renderItem={useCallback(({ item, index }) => {
if (item.type === "header") {
return <>
<View style={styles.header}>
<Text style={styles.title} accessibilityRole="header" variant="heading-xl/extrabold" color="mobile-text-heading-primary">
{intl.string(t["7Fjv54"])}
</Text>
<Text style={styles.subtitle} variant="text-sm/medium" color="text-default">
{intl.string(t.ait1x0)}
</Text>
</View>
<SuggestedFriendsSectionHeader label={intl.string(t["1uAmCw"])} />
</>;
}
const friendSuggestion = item.props.friendSuggestion;
return <Module19.Fragment key={friendSuggestion.suggested_user.id}>
<SuggestionRow start={index === 1} end={index === friendSuggestions.length} suggestion={friendSuggestion} selected={item.props.selected} onSelect={callback} />
{index < friendSuggestions.length ? <FormDivider iconPush style={styles.divider} /> : null}
</Module19.Fragment>;
}, [friendSuggestions.length, styles.divider, styles.header, styles.subtitle, styles.title, callback])} />
<Module4611 style={styles.linearGradient} start={VerticalGradient.START} end={VerticalGradient.END} pointerEvents="none" colors={colors} />
<View style={styles.redesignButton}>
<Button variant="primary" size="lg" text={intl.string(t["J5/69j"])} onPress={function onPress() {
const r12 = SnowflakeUtils.keys(state).filter((item) => state[item]);
onSubmit(r12);
r12.forEach((item) => {
AnalyticsUtils.track(AnalyticEvents.FRIEND_SUGGESTION_ADDED, {
suggested_user_id: item,
suggestion_source: SuggestedFriendSource.USER_SUGGESTIONS,
location: "Contact Sync Suggestions"
});
});
}} disabled={!r80} />
</View>
</View>;
};
@@ -0,0 +1,50 @@
// Metro module 12995 (f12996).
import { memo } from "react";
import { dismissUpsellCTA } from "../ContactSyncPersistedStore";
import { AnalyticEvents, AnalyticsSections } from "../../../../Constants";
import { createStyles } from "../../../../design/components/Styles/native/createStyles";
import Module712 from "../../../../_bundle/Module712";
import { FormCTA } from "../../../../design/void/Form/native/index";
import AnalyticsUtils from "../../../../utils/AnalyticsUtils";
import { openContactSyncModal } from "../ContactSyncModalActionCreators";
import { showSimpleActionSheet } from "../../../action_sheet/native/showSimpleActionSheet";
import { intl, t } from "../../../../intl/index.native";
import Module12996 from "../../../../_bundle/Module12996";
const useStyles = createStyles({
container: {
padding: 12,
borderRadius: Module712.radii.sm,
backgroundColor: Module712.colors.BACKGROUND_SURFACE_HIGH
}
});
const r41 = memo(function ContactSyncUpsellCTA(props) {
const { style, location: location2 } = props;
return <FormCTA onPress={function onPress() {
const OPEN_MODAL = AnalyticEvents.OPEN_MODAL;
let page = location2;
AnalyticsUtils.track(OPEN_MODAL, {
type: AnalyticsSections.CONTACT_SYNC_MODAL,
location: {
page: location2 == null ? "Friends List Upsell" : location2
}
});
if (location2 == null) {
page = "Friends List Upsell";
}
openContactSyncModal({}, {
page
});
}} onLongPress={function onLongPress() {
showSimpleActionSheet({
key: "ContactSyncUpsellLongPress",
options: [{
label: intl.string(t.WAI6xu),
onPress: () => {
dismissUpsellCTA();
}
}],
hasIcons: false
});
}} style={[useStyles().container, style]} iconSource={Module12996} title={intl.string(t.T6Rfd9)} subtitle={intl.string(t.c6KIpg)} />;
});
export default r41;
@@ -0,0 +1,14 @@
// Metro module 11777 (f11778).
import { HelpdeskArticles } from "../../../../Constants";
import { TableRowGroup } from "../../../../design/components/TableRow/native/TableRowGroup.native";
import { intl, t } from "../../../../intl/index.native";
import HelpdeskUtils from "../../../../utils/HelpdeskUtils";
import { TableSwitchRow } from "../../../../design/components/TableRow/native/TableSwitchRow.native";
export default function RedesignContactSyncDiscoverabilityFooter(props) {
const { discoverabilityEnabled, onValueChanged } = props;
return <TableRowGroup hasIcons={false} helperText={intl.format(t.zopgpe, {
helpdeskUrl: HelpdeskUtils.getArticleURL(HelpdeskArticles.CONTACT_SYNC)
})}>
<TableSwitchRow label={intl.string(t.a5QL24)} onValueChange={onValueChanged} value={discoverabilityEnabled} />
</TableRowGroup>;
};
@@ -0,0 +1,369 @@
// Metro module 11776 (f11777).
import _slicedToArray from "../../../../_bundle/_slicedToArray";
import { useState, useCallback, useEffect, useLayoutEffect, useMemo } from "react";
import { View } from "react-native";
import UserStore from "../../../../stores/UserStore";
import AppStateStore from "../../../../stores/native/AppStateStore";
import { useContactSyncModalStore, useIsOnboarding, setName } from "../ContactSyncModalStore";
import { ContactPermissions, ContactSyncScenes } from "../ContactSyncConstants";
import { AnalyticEvents } from "../../../../Constants";
import { NativePermissionTypes } from "../../../native_permissions/NativePermissionConstants";
import { jsx } from "react/jsx-runtime";
import { createStyles } from "../../../../design/components/Styles/native/createStyles";
import Module712 from "../../../../_bundle/Module712";
import { NAV_BAR_HEIGHT } from "../../../../design/components/Navigator/native/NavigatorConstants.native";
import { startContactSync, refreshContactSyncPermissionStatus, closeContactSyncModal, bulkAddFriendSuggestions } from "../ContactSyncModalActionCreators";
import { Text } from "../../../../design/components/Text/native/Text";
import { intl, t } from "../../../../intl/index.native";
import { getOpenLearnMoreUrl } from "../ContactSyncUtils";
import RedesignContactSyncDiscoverabilityFooter from "./RedesignContactSyncDiscoverabilityFooter";
import useSafeAreaInsets_native from "../../../safe_area/useSafeAreaInsets.native";
import { useNavigation } from "../../../../design/components/Navigator/native/useNavigation.native";
import { useStateFromStores } from "../../../../_bundle/Module589";
import ContactSyncActionCreators from "../ContactSyncActionCreators";
import { isAndroid } from "../../../../utils/PlatformUtils";
import { AppStates } from "../../../../ConstantsIOS";
import AnalyticsUtils from "../../../../utils/AnalyticsUtils";
import ActionSheetActionCreators from "../../../action_sheet/native/ActionSheetActionCreators";
import NativePermissionUtils from "../../../native_permissions/NativePermissionUtils";
import ThemedGradient from "../../../client_themes/native/ThemedGradient";
import NewUserPermissionsOnboarding_android from "../../../nuf/native/components/NewUserPermissionsOnboarding.android";
import ContactSyncLandingImage from "./ContactSyncLandingImage";
import ContactSyncLandingOnboardingRedesign from "./ContactSyncLandingOnboardingRedesign";
import useBackHandlerSkipPhoneScreens, { useBackHandlerMinimizeApp } from "./useBackHandlerSkipPhoneScreens";
import SkipHeaderButton from "../../../nuf/native/components/SkipHeaderButton";
import ContactSyncNameInput from "./ContactSyncNameInput";
import ContactSyncSuggestions from "./ContactSyncSuggestions";
import ContactSyncInviteFriends from "./ContactSyncInviteFriends";
import { ImpressionNames, ImpressionGroups } from "../../../../_bundle/Module503";
import { getHeaderCloseButton } from "../../../../design/components/Navigator/native/NavigatorHeader.native";
import ContactSyncBackToLanding from "./ContactSyncBackToLanding";
import { AddPhoneScreen, VerifyPhoneScreen, VerifyPasswordScreen } from "./AddPhoneScreens";
import { Navigator } from "../../../../design/components/Navigator/native/Navigator.native";
function $mk118340($env) {
return () => (0, setLoading)(false);
}
function $mk118341($env) {
return () => (0, $env[2])(false);
}
let headerLeft2, OnboardingTrailingLanding, OnboardingTrailing, ContactSyncLandingScreen, ContactSyncNameInputScreen, ContactSyncSuggestionScreen, ContactSyncModal, useStyles;
let env8071 = {};
const headerTitle = function headerTitle() {
return null;
};
headerLeft2 = function headerLeft() {
return null;
};
OnboardingTrailingLanding = function OnboardingTrailingLanding() {
return <Text style={useStyles().landingTrailing} variant="text-sm/medium" color="text-muted">
{intl.format(t["84S6+Z"], {
learnMoreUrl: getOpenLearnMoreUrl()
})}
</Text>;
};
OnboardingTrailing = function OnboardingTrailing(props) {
const { isOnboarding: isOnboarding2, discoverabilityEnabled, setDiscoverabilityEnabled } = props;
return isOnboarding2 ? <OnboardingTrailingLanding /> : <RedesignContactSyncDiscoverabilityFooter discoverabilityEnabled={discoverabilityEnabled} onValueChanged={setDiscoverabilityEnabled} />;
};
ContactSyncLandingScreen = function ContactSyncLandingScreen(props) {
let phone, state, c19159_7, callback, stateFromStores2;
const { openSettingsSheet, loading: loading2, setLoading, onComplete } = props;
phone = void 0;
state = void 0;
c19159_7 = void 0;
callback = void 0;
stateFromStores2 = void 0;
const styles = useStyles();
const bottom = useSafeAreaInsets_native().bottom;
const navigation = useNavigation();
const stateFromStores = useStateFromStores([UserStore], () => UserStore.getCurrentUser());
phone = stateFromStores?.phone;
const r39 = (0, useContactSyncModalStore)();
const { permissionState, error } = r39;
let setDiscoverabilityEnabled;
[state, setDiscoverabilityEnabled] = useState(true);
const showSkip = (0, useIsOnboarding)();
c19159_7 = showSkip;
callback = useCallback(() => {
setLoading(true);
setTimeout(async () => {
const r12 = void 0;
let c30448_1 = r12;
let c30448_0 = r12;
if (c19159_7) {
await startContactSync(navigation);
} else {
await ContactSyncActionCreators.updateDiscoverability({
email: !!state && stateFromStores?.email != null,
phone: !!state && phone != null
});
await startContactSync(navigation);
}
setTimeout($mk118340(c30448_0), 2000);
}, 25);
}, [stateFromStores?.email, state, showSkip, navigation, setLoading, phone]);
stateFromStores2 = useStateFromStores([AppStateStore], () => AppStateStore.getState(), []);
useEffect(() => {
if (isAndroid() && stateFromStores2 === AppStates.ACTIVE) {
refreshContactSyncPermissionStatus();
}
}, [stateFromStores2]);
useEffect(() => {
if (openSettingsSheet) {
AnalyticsUtils.track(AnalyticEvents.OPEN_POPOUT, {
type: "Contact Sync",
location: {
page: "Contact Sync"
}
});
ActionSheetActionCreators.openLazy(import("./ContactSyncSettingsActionSheet"), "Contact Sync Info Settings");
}
}, [openSettingsSheet]);
const callback3 = useCallback(async () => {
let c27161_0;
c27161_0 = void 0;
if (await NativePermissionUtils.requestPermission(NativePermissionTypes.CONTACTS)) {
(0, callback)();
} else {
closeContactSyncModal({
onComplete,
skip: true
});
}
}, [callback, onComplete]);
return <>
{[<ThemedGradient absolute />, <View style={[styles.container, {
paddingBottom: bottom > 0 ? bottom : 16
}]}>
{!showSkip && permissionState === ContactPermissions.AUTHORIZED ? <ContactSyncLandingOnboardingRedesign onNext={callback} error={error} loading={loading2} discoverabilityEnabled={state} setDiscoverabilityEnabled={setDiscoverabilityEnabled} /> : <NewUserPermissionsOnboarding_android title={intl.string(t.DjcfHu)} subtitle={intl.string(t["kq+Cd3"])} trailing={<OnboardingTrailing isOnboarding={showSkip} discoverabilityEnabled={state} setDiscoverabilityEnabled={setDiscoverabilityEnabled} />} header={<ContactSyncLandingImage />} loading={loading2} showSkip={showSkip} onAllow={callback3} onDontAllow={() => {
closeContactSyncModal({
onComplete,
skip: true
});
}} />}
</View>]}
</>;
};
ContactSyncNameInputScreen = function ContactSyncNameInputScreen(props) {
let env19160 = {
$parent: env8071
};
const navigateToLandingPage2 = props.navigateToLandingPage;
env19160[0] = void 0;
env19160[1] = void 0;
env19160[2] = void 0;
env19160[3] = void 0;
const styles = useStyles();
const navigation3 = useNavigation();
env19160[0] = navigation3;
const r25 = _slicedToArray(useState(false), 2);
const loading2 = r25[0];
env19160[1] = loading2;
env19160[2] = r25[1];
const r28 = (0, useContactSyncModalStore)();
const { name, isNameFromContactBook, error } = r28;
useBackHandlerSkipPhoneScreens(navigation3, navigateToLandingPage2);
let c19161_0 = async (c30449_0) => {
let c30449_1;
c30449_1 = void 0;
(0, env19160[2])(true);
(0, setName)(c30449_0);
await startContactSync(env19160[0]);
setTimeout($mk118341(env19160), 2000);
};
const callback3 = useCallback(function() {
return c19161_0.apply(this, arguments);
}, [navigation3]);
env19160[3] = callback3;
useLayoutEffect(() => {
env19160[0].setOptions({
headerRight: () => (0, jsx)(SkipHeaderButton, {
insideNavigator: true,
disabled: env19160[1],
onPress: () => {
(0, env19160[3])("");
}
})
});
}, [loading2, callback3, navigation3]);
let initialName = name;
if (initialName == null) {
initialName = "";
}
return <View style={styles.container}>
<ContactSyncNameInput onNext={callback3} error={error} loading={loading2} initialName={initialName} prefilledFromContactBook={name != null && name !== "" && isNameFromContactBook} />
</View>;
};
ContactSyncSuggestionScreen = function ContactSyncSuggestionScreen(props) {
const onComplete2 = props.onComplete;
const styles = useStyles();
const navigation2 = useNavigation();
const suggestions = (0, useContactSyncModalStore)().suggestions;
useBackHandlerMinimizeApp();
const callback2 = useCallback((a0, a1) => {
closeContactSyncModal({
onComplete: onComplete2,
skip: a0,
friendsFound: suggestions.length,
friendsAdded: a1
});
}, [onComplete2, suggestions.length]);
useLayoutEffect(() => {
navigation2.setOptions({
headerRight: () => (0, jsx)(SkipHeaderButton, {
insideNavigator: true,
onPress: () => callback2(true, 0)
})
});
}, [callback2, navigation2, onComplete2, suggestions.length]);
return suggestions.length > 0 ? (0, jsx)(ContactSyncSuggestions, {
friendSuggestions: suggestions,
onSubmit: (a0) => bulkAddFriendSuggestions(a0, onComplete2)
}) : <View style={styles.container}>
<ContactSyncInviteFriends />
</View>;
};
ContactSyncModal = function ContactSyncModal(props) {
let memo;
const onComplete3 = props.onComplete;
let initialRoutes = props.initialRoutes;
const openSettingsSheet2 = props.openSettingsSheet;
memo = void 0;
const [state2, setState] = useState(false);
const isOnboarding = (0, useIsOnboarding)();
useEffect(() => {
if (isOnboarding) {
refreshContactSyncPermissionStatus();
}
}, [isOnboarding]);
memo = useMemo(() => {
let r2 = onComplete3;
if (onComplete3 == null) {
r2 = () => {};
}
return r2;
}, [onComplete3]);
const memo2 = useMemo(() => {
const r2 = {
isOnboarding,
loading: state2,
setLoading: setState,
openSettingsSheet: openSettingsSheet2,
onComplete: memo
};
const { isOnboarding: isOnboarding2, loading, setLoading: setLoading2, openSettingsSheet: openSettingsSheet3, onComplete: onComplete4, navigateToLandingPage } = r2;
const WELCOME = ContactSyncScenes.WELCOME;
const headerTitle2 = headerTitle;
const headerLeft3 = isOnboarding2 ? headerLeft2 : getHeaderCloseButton(() => closeContactSyncModal({
onComplete: onComplete4,
skip: true
}));
const r37 = {};
r37[WELCOME] = {
ignoreKeyboard: true,
impressionName: ImpressionNames.CONTACT_SYNC_START,
impressionProperties: {
impression_group: ImpressionGroups.CONTACT_SYNC_FLOW
},
fullscreen: true,
headerTitle: headerTitle2,
headerLeft: headerLeft3,
render: () => (0, jsx)(ContactSyncLandingScreen, {
onComplete: onComplete4,
openSettingsSheet: openSettingsSheet3,
loading,
setLoading: setLoading2
})
};
const NAME_INPUT = ContactSyncScenes.NAME_INPUT;
r37[NAME_INPUT] = {
ignoreKeyboard: true,
impressionName: ImpressionNames.CONTACT_SYNC_INPUT_NAME,
impressionProperties: {
impression_group: ImpressionGroups.CONTACT_SYNC_FLOW
},
fullscreen: true,
headerTitle: headerTitle2,
headerLeft: headerLeft2,
render: () => (0, jsx)(ContactSyncNameInputScreen, {
navigateToLandingPage
})
};
r37[ContactSyncScenes.SUGGESTIONS] = {
ignoreKeyboard: true,
impressionName: ImpressionNames.CONTACT_SYNC_SUGGESTIONS,
impressionProperties: {
impression_group: ImpressionGroups.CONTACT_SYNC_FLOW
},
fullscreen: true,
headerTitle: headerTitle2,
headerLeft: headerLeft2,
render: () => (0, jsx)(ContactSyncSuggestionScreen, {
onComplete: onComplete4
})
};
r37[ContactSyncScenes.ADD_PHONE] = {
impressionName: ImpressionNames.USER_ADD_PHONE,
impressionProperties: {
impression_group: ImpressionGroups.CONTACT_SYNC_FLOW
},
fullscreen: true,
headerTitle: headerTitle2,
headerLeft: (a0) => <ContactSyncBackToLanding {...a0} navigateToLandingPage={navigateToLandingPage} />,
render: () => (0, jsx)(AddPhoneScreen, {})
};
r37[ContactSyncScenes.VERIFY_PHONE] = {
impressionName: ImpressionNames.USER_VERIFY_PHONE,
impressionProperties: {
impression_group: ImpressionGroups.CONTACT_SYNC_FLOW
},
fullscreen: true,
headerTitle: headerTitle2,
headerLeft: (a0) => <ContactSyncBackToLanding {...a0} navigateToLandingPage={navigateToLandingPage} />,
render: () => (0, jsx)(VerifyPhoneScreen, {})
};
r37[ContactSyncScenes.VERIFY_PASSWORD] = {
impressionName: ImpressionNames.USER_VERIFY_PASSWORD,
impressionProperties: {
impression_group: ImpressionGroups.CONTACT_SYNC_FLOW
},
fullscreen: true,
headerLeft: (a0) => <ContactSyncBackToLanding {...a0} navigateToLandingPage={navigateToLandingPage} />,
headerTitle: headerTitle2,
render: () => (0, jsx)(VerifyPasswordScreen, {})
};
return r37;
}, [isOnboarding, state2, openSettingsSheet2, memo]);
useEffect(() => () => {
if (!isOnboarding) {
closeContactSyncModal({
onComplete: memo
});
}
}, [isOnboarding, memo]);
if (initialRoutes == null) {
initialRoutes = [{
name: ContactSyncScenes.WELCOME
}];
}
return <Navigator screens={memo2} initialRouteStack={initialRoutes} headerBackTitle={intl.string(t["13/7kX"])} />;
};
useStyles = createStyles({
container: {
flex: 1,
backgroundColor: Module712.colors.BACKGROUND_BASE_LOW,
justifyContent: "center",
paddingTop: NAV_BAR_HEIGHT + 32
},
landingTrailing: {
textAlign: "center"
}
});
export default ContactSyncModal;
export function ContactSyncOnboardingModal(a0) {
return (0, jsx)(ContactSyncModal, {
onComplete: a0.route.params.onComplete,
openSettingsSheet: a0.openSettingsSheet,
initialRoutes: a0.initialRoutes
});
}
@@ -0,0 +1,26 @@
// Metro module 11786 (f11787).
import { NativeModules } from "react-native";
import { ContactSyncScenes } from "../ContactSyncConstants";
import { useNavigatorBackPressHandler } from "../../../../design/components/Navigator/native/useNavigatorBackPressHandler.native";
export default function useBackHandlerSkipPhoneScreens(c19167_0, c19167_1) {
useNavigatorBackPressHandler(() => {
if (c19167_1 != null) {
c19167_1();
} else {
const r7 = [ContactSyncScenes.ADD_PHONE, ContactSyncScenes.VERIFY_PHONE, ContactSyncScenes.VERIFY_PASSWORD];
const routes = c19167_0.getState().routes;
if (routes.length <= 2) {
c19167_0.pop();
} else if (r7.includes(routes[routes.length - 2].name)) {
c19167_0.pop(routes.length - 1);
}
}
return true;
});
};
export function useBackHandlerMinimizeApp() {
useNavigatorBackPressHandler(() => {
NativeModules.MinimizeApp.minimizeApp();
return true;
});
}