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,18 @@
// Metro module 14441 (f14442).
import { createApexExperiment } from "../../experiments/apex/index";
const apexExperiment = createApexExperiment({
name: "2026-06-contextual-opt-in-nudge-holdout",
kind: "user",
defaultConfig: {
inHoldout: false
},
variations: {
0: {
inHoldout: false
},
1: {
inHoldout: true
}
}
});
export default apexExperiment;
+108
View File
@@ -0,0 +1,108 @@
// Metro module 11795 (f11796).
import { setAllowEmail, setAllowSync, setName, useContactSyncModalStore } from "../../contact_sync/native/ContactSyncModalStore";
import ConnectedAccountsStore from "../../../stores/ConnectedAccountsStore";
import UserStore from "../../../stores/UserStore";
import { NUF_DISCOVERABILITY_MODAL_KEY } from "../NUFConstants";
import { PlatformTypes } from "../../../Constants";
import { IN_APP_GUILD_TEMPLATES_MODAL_KEY } from "../../create_guild/native/CreateGuildConstants";
import Dispatcher from "../../../Dispatcher";
import ModalActionCreators from "../../../actions/ModalActionCreators";
import HubEmailConnectionModalActionCreators from "../../hub/native/components/HubEmailConnectionModalActionCreators";
import { setNewUserFlowCompleted } from "../NUFActionCreators";
import { ModalAnimation } from "../../../ConstantsIOS";
import * as _ContactSyncUtils from "../../contact_sync/native/ContactSyncUtils";
import { uploadContacts } from "../../contact_sync/native/ContactSyncUtils";
import ContactSyncActionCreators from "../../contact_sync/native/ContactSyncActionCreators";
export function startOnboarding() {
Dispatcher.dispatch({
type: "ONBOARDING_START"
});
}
export function nextOnboardingStep({ skip = false, skipAttempt = false }) {
Dispatcher.dispatch({
type: "ONBOARDING_STEP",
skip,
skipAttempt
});
}
export function previousOnboardingStep() {
Dispatcher.dispatch({
type: "ONBOARDING_STEP",
back: true
});
}
export function transitionToNUFGuildTemplatesModal(c19176_0) {
ModalActionCreators.pushLazy(async () => {
let c27168_1;
c27168_1 = void 0;
let c30451_0 = (await import("./components/NUFGuildTemplates")).default;
c30451_0.modalConfig = {
animation: c19176_0
};
return c30451_0;
}, {}, IN_APP_GUILD_TEMPLATES_MODAL_KEY);
}
export function transitionToHubEmailConnectionModal(a0, displayStudentPrompt = false) {
HubEmailConnectionModalActionCreators.open({
onCloseExtra: (a0) => {
if (a0) {
setNewUserFlowCompleted();
} else {
Dispatcher.dispatch({
type: "ONBOARDING_STEP"
});
}
},
displayStudentPrompt
}, a0);
}
export function openDiscoverabilityModal() {
ModalActionCreators.pushLazy(async () => {
let c27169_1;
c27169_1 = void 0;
let c30452_0 = (await import("./components/DiscoverabilityModal")).default;
c30452_0.modalConfig = {
animation: ModalAnimation.SLIDE_IN_OUT
};
return c30452_0;
}, {}, NUF_DISCOVERABILITY_MODAL_KEY);
}
export function closeDiscoverabilityModal(a0) {
ModalActionCreators.popWithKey(NUF_DISCOVERABILITY_MODAL_KEY);
Dispatcher.dispatch({
type: "ONBOARDING_STEP",
skip: a0
});
}
export async function startContactSyncForDiscoverability(name) {
let c27167_1;
c27167_1 = void 0;
const phone = UserStore.getCurrentUser()?.phone;
const isContactSyncEnabled = _ContactSyncUtils.isContactSyncEnabled(ConnectedAccountsStore.getLocalAccount(PlatformTypes.CONTACTS));
if (phone == null) {
throw new Error("Cannot start contact sync without a phone number");
}
setName(name);
await ContactSyncActionCreators.updateContactSyncEnabled({
enabled: isContactSyncEnabled,
name
});
await uploadContacts("[]", true);
}
export function toggleDiscoverabilityForUser() {
const phone = UserStore.getCurrentUser()?.phone;
const state = useContactSyncModalStore.getState();
let allowPhone = state.allowPhone;
const allowEmail = state.allowEmail;
if (!allowPhone) {
allowPhone = allowEmail;
}
if (phone != null) {
setAllowSync(!allowPhone);
} else {
setAllowSync(false);
if (!allowPhone) {
setAllowEmail(true);
}
}
}
@@ -0,0 +1,15 @@
// Metro module 11774 (f11775).
import { AnalyticEvents } from "../../../Constants";
import AnalyticsUtils from "../../../utils/AnalyticsUtils";
let c8067_3 = 0;
export function trackNUFStep(a0, a1, a2) {
const r12 = Date.now();
AnalyticsUtils.track(AnalyticEvents.NUO_TRANSITION, {
...a2,
flow_type: "Mobile NUX Post Reg",
from_step: a0,
to_step: a1,
seconds_on_from_step: (r12 - c8067_3) / 1000
});
c8067_3 = r12;
}
+202
View File
@@ -0,0 +1,202 @@
// Metro module 16257 (f16258).
import PhoneStore from "../../phone/PhoneStore";
import ConnectedAccountsStore from "../../../stores/ConnectedAccountsStore";
import UserStore from "../../../stores/UserStore";
import NewUserStore from "../NewUserStore";
import { NewUserTypes } from "../NUFConstants";
import { PlatformTypes } from "../../../Constants";
import { HUBS_IN_ONBOARDING_COUNTRIES } from "../../hub/HubConstants";
import { openAddAvatarModal } from "../../avatar/native/AddAvatarModalActionCreators";
import { openContactSyncModalOnboarding } from "../../contact_sync/native/ContactSyncModalActionCreators";
import { openDiscoverabilityModal, transitionToHubEmailConnectionModal, transitionToNUFGuildTemplatesModal } from "./NUFActionCreators";
import { ModalAnimation } from "../../../ConstantsIOS";
import { hasDeferredInvite } from "../../instant_invite/native/InstantInviteUtils";
import Dispatcher from "../../../Dispatcher";
import AutomaticLifecycleManager from "../../../lib/AutomaticLifecycleManager";
import { trackNUFStep } from "./NewUserAnalyticsUtils";
import { setNewUserFlowCompleted } from "../NUFActionCreators";
const r36 = {
REGISTRATION: "Registration",
ADD_AVATAR: "Add Avatar",
CONTACT_SYNC: "Contact Sync",
GUILD_TEMPLATE: "Guild Template",
STUDENT_HUB: "Student Hub",
NEW_USER_INTENT: "New User Intent",
ACCEPT_INVITE: "Accept Invite",
DISCOVERABILITY: "Discoverability"
};
let c11685_11 = [{
key: r36.ADD_AVATAR,
shouldShowStep: () => UserStore.getCurrentUser()?.avatar == null,
transitionToStep: openAddAvatarModal
}, {
key: r36.DISCOVERABILITY,
shouldShowStep: () => ConnectedAccountsStore.getLocalAccount(PlatformTypes.CONTACTS) == null,
transitionToStep: openDiscoverabilityModal
}, {
key: r36.CONTACT_SYNC,
shouldShowStep: () => {
const friendSync = ConnectedAccountsStore.getLocalAccount(PlatformTypes.CONTACTS)?.friendSync;
return friendSync ? !friendSync : UserStore.getCurrentUser()?.phone != null;
},
transitionToStep: openContactSyncModalOnboarding
}, {
key: r36.STUDENT_HUB,
shouldShowStep: () => {
if (NewUserStore.getType() !== NewUserTypes.ORGANIC_REGISTERED) {
return false;
}
return HUBS_IN_ONBOARDING_COUNTRIES.includes(PhoneStore.getCountryCode()?.alpha2);
},
transitionToStep: () => {
transitionToHubEmailConnectionModal(ModalAnimation.SLIDE_IN, true);
}
}, {
key: r36.GUILD_TEMPLATE,
shouldShowStep: () => NewUserStore.getType() === NewUserTypes.ORGANIC_REGISTERED,
transitionToStep: () => transitionToNUFGuildTemplatesModal(ModalAnimation.SLIDE_IN)
}, {
key: r36.ACCEPT_INVITE,
shouldShowStep: hasDeferredInvite,
transitionToStep: () => {
Dispatcher.dispatch({
type: "DEFERRED_INVITE_SHOW"
});
}
}];
class NewUserManager extends AutomaticLifecycleManager {
constructor() {
let c22926_0, c22926_1;
super(...arguments);
const _this = this;
this._onboardingStepIndex = -1;
this._lastStep = null;
this.actions = {
ONBOARDING_STEP: (a0) => {
_this.handleOnboardingStep(a0);
}
};
c22926_0 = void 0;
c22926_1 = this;
c22926_0 = async (c31010_0) => {
let r10, back, skipAttempt;
let key, key2, c31010_4;
let c31804_0, c31804_1, c31804_2, c31804_3, c31804_4, c31804_5, c31804_6, c31804_7, c31804_8, c31804_9, c31804_10;
L37: {
L32: {
L16: {
L13: {
L14: {
L10: {
c31010_4 = void 0;
c31804_0 = void 0;
c31804_1 = void 0;
c31804_2 = void 0;
r10 = c31010_0;
const skip = r10.skip;
if (skip !== void 0) {
c31804_0 = skip;
skipAttempt = r10.skipAttempt;
if (skipAttempt !== void 0) {
break L10;
}
} else {
c31804_0 = false;
skipAttempt = r10.skipAttempt;
if (skipAttempt !== void 0) {
break L10;
}
}
c31804_1 = false;
back = r10.back;
if (back !== void 0) {
break L13;
}
break L14;
}
c31804_1 = skipAttempt;
back = r10.back;
if (back !== void 0) {
break L13;
}
}
c31804_2 = false;
c31804_3 = void 0;
c31804_4 = void 0;
c31804_5 = void 0;
c31804_6 = void 0;
c31804_7 = void 0;
c31804_8 = void 0;
c31804_9 = void 0;
c31804_10 = void 0;
break L16;
}
c31804_2 = back;
c31804_3 = void 0;
c31804_4 = void 0;
c31804_5 = void 0;
c31804_6 = void 0;
c31804_7 = void 0;
c31804_8 = void 0;
c31804_9 = void 0;
c31804_10 = void 0;
}
await void 0;
c31804_3 = c22926_1._onboardingStepIndex;
if (c31804_2) {
const key3 = c11685_11[c31804_3]?.key;
key = key3;
if (key3 == null) {
key = null;
}
c22926_1._lastStep = key;
c22926_1._onboardingStepIndex = c22926_1._onboardingStepIndex - 1;
c31804_4 = c11685_11[c22926_1._onboardingStepIndex];
c31804_5 = c31804_4.key;
c31804_6 = c31804_4.transitionToStep;
trackNUFStep(c22926_1._lastStep, c31804_5, {
back: true
});
(0, c31804_6)();
break L37;
}
c22926_1._onboardingStepIndex = c22926_1._onboardingStepIndex + 1;
if (c22926_1._onboardingStepIndex >= c11685_11.length) {
trackNUFStep(c22926_1._lastStep, "NUF Complete", {
skip_attempt: c31804_1
});
setNewUserFlowCompleted();
break L32;
}
c31804_7 = c11685_11[c22926_1._onboardingStepIndex];
c31804_8 = c31804_7.key;
c31804_9 = c31804_7.shouldShowStep;
c31804_10 = c31804_7.transitionToStep;
if (await (0, c31804_9)()) {
trackNUFStep(c22926_1._lastStep, c31804_8, {
skip: c31804_0,
skip_attempt: c31804_1
});
key2 = c11685_11[c31804_3]?.key;
if (key2 == null) {
key2 = null;
}
c22926_1._lastStep = key2;
(0, c31804_10)();
} else {
c22926_1.handleOnboardingStep({
skip: c31804_0
});
}
return void 0;
}
return void 0;
}
};
this.handleOnboardingStep = function() {
return c22926_0.apply(this, arguments);
};
}
}
const newUserManager = new NewUserManager();
export default newUserManager;
+215
View File
@@ -0,0 +1,215 @@
// Metro module 16272 (f16273).
import { NativeModules } from "react-native";
import ParentalConsentStore from "../../parent_tools/ParentalConsentStore";
import ConnectedAccountsStore from "../../../stores/ConnectedAccountsStore";
import UserStore from "../../../stores/UserStore";
import { PlatformTypes, Routes } from "../../../Constants";
import { ContactPermissions } from "../../contact_sync/native/ContactSyncConstants";
import { NotificationAuthorizationStatus } from "../../native_permissions/NativePermissionConstants";
import * as _ContactSyncUtils from "../../contact_sync/native/ContactSyncUtils";
import { checkContactPermissions } from "../../contact_sync/native/ContactSyncUtils";
import { isIOS } from "../../../utils/PlatformUtils";
import { hasDeferredInvite } from "../../instant_invite/native/InstantInviteUtils";
import Dispatcher from "../../../Dispatcher";
import { CommonActions } from "../../../_bundle/Module1481";
import { trackNUFStep } from "./NewUserAnalyticsUtils";
import { isModalOpen } from "../../main_tabs_v2/helpers/NavigationRouteUtils.native";
import { NEW_USER_MODAL_KEY } from "./components/NewUserModalTypes";
import ModalActionCreators from "../../../actions/ModalActionCreators";
import { transitionTo } from "../../routing/router_utils";
import { setNewUserFlowCompleted } from "../NUFActionCreators";
let c11691_13, c11691_14, c11691_15, lastStepComplete, getNextOnboardingStep;
let _shouldSkipContactSyncStep = function _shouldSkipContactSyncStep() {
const r8 = async () => {
let r50;
let c28314_0;
L15: {
c28314_0 = void 0;
const isContactSyncAvailable = _ContactSyncUtils.isContactSyncAvailable();
const r11 = !isContactSyncAvailable;
if (isContactSyncAvailable) {
r50 = await checkContactPermissions() === ContactPermissions.UNAUTHORIZED;
if (!r50) {
break L15;
}
r50 = isIOS();
break L15;
}
return r11;
}
return r50;
};
_shouldSkipContactSyncStep = r8;
return r8.apply(this, arguments);
};
lastStepComplete = function lastStepComplete(a0) {
trackNUFStep(a0, "NUF Complete");
if (isModalOpen(NEW_USER_MODAL_KEY)) {
ModalActionCreators.popWithKey(NEW_USER_MODAL_KEY);
}
transitionTo(Routes.ME, {
navigationReplace: true
});
setNewUserFlowCompleted();
};
getNextOnboardingStep = async function getNextOnboardingStep(c28315_0, c28315_1, c28315_2) {
let r76, r152, r163;
let key, c28315_5;
let c31012_0, c31012_1, c31012_2, c31012_3, c31012_4, c31012_5, c31012_6, c31012_7;
L31: {
L30: {
c28315_5 = void 0;
c31012_0 = void 0;
c31012_1 = void 0;
c31012_2 = void 0;
if (c28315_0 !== void 0) {
c31012_0 = c28315_0;
c31012_1 = c28315_1;
c31012_2 = c28315_2;
c31012_3 = void 0;
c31012_4 = void 0;
c31012_5 = void 0;
c31012_6 = void 0;
c31012_7 = void 0;
} else {
c31012_0 = false;
c31012_1 = c28315_1;
c31012_2 = c28315_2;
c31012_3 = void 0;
c31012_4 = void 0;
c31012_5 = void 0;
c31012_6 = void 0;
c31012_7 = void 0;
}
await void 0;
const key2 = c11691_15[c31012_1]?.key;
key = key2;
if (key2 == null) {
key = "registration";
}
c31012_3 = key;
const r65 = c31012_2 + 1;
c31012_2 = r65;
if (r65 >= c11691_15.length) {
(0, lastStepComplete)(c31012_3);
r76 = {
lastShownStepIndex: c31012_1,
onboardingStepIndex: c31012_2,
continueNavigation: false
};
break L31;
}
c31012_4 = c11691_15[c31012_2];
c31012_5 = c31012_4.key;
c31012_6 = c31012_4.shouldShowStep;
c31012_7 = c31012_4.transitionStep;
if (await (0, c31012_6)()) {
c31012_1 = c31012_2;
trackNUFStep(c31012_3, c31012_5, {
skip: c31012_0
});
if (c31012_7 != null) {
(0, lastStepComplete)(c31012_5);
Dispatcher.wait(c31012_7);
r152 = {
lastShownStepIndex: c31012_1,
onboardingStepIndex: c31012_2,
continueNavigation: false
};
} else {
r152 = {
lastShownStepIndex: c31012_1,
onboardingStepIndex: c31012_2,
continueNavigation: c11691_15[c31012_2]?.transitionStep == null
};
}
r163 = r152;
break L30;
}
return await (0, getNextOnboardingStep)(c31012_0, c31012_1, c31012_2);
}
return r163;
}
return r76;
};
const r38 = {
key: "choose-avatar",
shouldShowStep: () => UserStore.getCurrentUser()?.avatar == null
};
c11691_13 = async () => {
let r49;
let c22931_0;
L13: {
c22931_0 = void 0;
const r10 = !!isIOS();
if (r10) {
r49 = await NativeModules.NativePermissionManager.getNotificationAuthorizationStatus() !== NotificationAuthorizationStatus.AUTHORIZED;
break L13;
}
return r10;
}
return r49;
};
const r42 = {
key: "enable-notification",
shouldShowStep: function() {
const apply = c11691_13.apply;
return c11691_13.apply(this, arguments);
}
};
c11691_14 = async () => {
let r28;
L13: {
const friendSync = ConnectedAccountsStore.getLocalAccount(PlatformTypes.CONTACTS)?.friendSync;
r28 = !friendSync;
if (friendSync) {
break L13;
}
return !await (function shouldSkipContactSyncStep() {
return _shouldSkipContactSyncStep.apply(this, arguments);
})();
}
return r28;
};
c11691_15 = [r42, {
key: "contact-sync",
shouldShowStep: function() {
const apply = c11691_14.apply;
return c11691_14.apply(this, arguments);
}
}, {
key: "discoverability",
shouldShowStep: () => true
}, r38, {
key: "connect-guardian",
shouldShowStep: () => ParentalConsentStore.getShouldShowGuardianConnect()
}, {
key: "accept-invite",
shouldShowStep: hasDeferredInvite,
transitionStep: () => {
Dispatcher.dispatch({
type: "DEFERRED_INVITE_SHOW"
});
}
}];
export function getKeyForOnboardingStep(a0) {
return c11691_15[a0]?.key;
}
export function continueToNextStep(a0, a1) {
const key2 = c11691_15[a0]?.key;
if (key2 !== null) {
a1.navigate(key2, {});
setTimeout(() => {
const state = a1.getState();
const routes = state.routes;
if (routes.length === 2) {
a1.dispatch(CommonActions.reset({
...state,
routes: [routes[1]],
index: 0
}));
}
}, 500);
}
}
export { getNextOnboardingStep };
@@ -0,0 +1,263 @@
// Metro module 16281 (f16282).
import { NativeModules } from "react-native";
import JoinedThreadsStore from "../../threads/JoinedThreadsStore";
import AuthenticationStore from "../../../stores/AuthenticationStore";
import ChannelStore from "../../../stores/ChannelStore";
import UserGuildSettingsStore from "../../../stores/UserGuildSettingsStore";
import PushNotificationPermissionStore, { PermissionPromptType } from "../../../stores/native/PushNotificationPermissionStore";
import { EventActionLocation, NOTIFICATION_REACTIVATION_ACTIONSHEET_KEY } from "./components/notification/NotificationPermissionConstants";
import { AnalyticEvents, GuildFeatures, RelationshipTypes } from "../../../Constants";
import { NotificationAuthorizationStatus } from "../../native_permissions/NativePermissionConstants";
import ActionSheetActionCreators from "../../action_sheet/native/ActionSheetActionCreators";
import { ImpressionNames } from "../../../_bundle/Module503";
import Module3771 from "../../../_bundle/Module3771";
import { setPushPermissionReactivationSeen, updateNotificationAuthorizationStatus, setPushNotificationPermissionEligibleForPrompt } from "../../../actions/native/PushNotificationActionCreators";
import { allowInAppNotifications } from "../../notifications/NotificationTextUtils";
import AnalyticsUtils from "../../../utils/AnalyticsUtils";
import { isIOS } from "../../../utils/PlatformUtils";
import AutomaticLifecycleManager from "../../../lib/AutomaticLifecycleManager";
import ContextualOptInNudgeHoldoutExperiment from "./ContextualOptInNudgeHoldoutExperiment";
import { AppStates } from "../../../ConstantsIOS";
let c11699_17, shouldShowPrompt, shouldShowReactivationPrompt, c11699_23, showPrompt, _logNotificationPermissionStatus;
const haveNotSeenPromptSince = function haveNotSeenPromptSince(a0, a1) {
const r7 = PushNotificationPermissionStore.getState().promptLastSeen[a0];
return r7 == null || (c11699_17.includes(a0) ? Module3771().diff(r7, "days") >= 1 : void 0);
};
shouldShowPrompt = async function shouldShowPrompt(c28318_0) {
let c28318_2;
c28318_2 = void 0;
let c31014_0 = c28318_0;
let c31014_1 = await NativeModules.NativePermissionManager.getNotificationAuthorizationStatus();
return (c31014_1 === NotificationAuthorizationStatus.UNDETERMINED || c31014_1 === NotificationAuthorizationStatus.PROVISIONAL) && (0, haveNotSeenPromptSince)(c31014_0, 1);
};
shouldShowReactivationPrompt = async function shouldShowReactivationPrompt(c28319_0) {
let c28319_2;
c28319_2 = void 0;
let c31015_0 = c28319_0;
return await NativeModules.NativePermissionManager.getNotificationAuthorizationStatus() === NotificationAuthorizationStatus.DENIED && (0, haveNotSeenPromptSince)(c31015_0, 1);
};
showPrompt = function showPrompt(c22941_0, action_location, a2) {
if (c11699_23 != null) {
clearTimeout(c11699_23);
}
c11699_23 = setTimeout(() => {
setPushPermissionReactivationSeen(c22941_0);
ActionSheetActionCreators.openLazy(import("./components/notification/NotificationReactivationActionSheet"), NOTIFICATION_REACTIVATION_ACTIONSHEET_KEY, {
impressionName: ImpressionNames.PUSH_NOTIFICATION_REACTIVATION_PROMPT,
impressionProperties: {
action_location
},
location: action_location
});
}, a2);
};
_logNotificationPermissionStatus = async function _logNotificationPermissionStatus() {
let c28320_1;
c28320_1 = void 0;
let c31016_0 = await NativeModules.NativePermissionManager.getNotificationAuthorizationStatus();
let c31016_1 = allowInAppNotifications();
AnalyticsUtils.track(AnalyticEvents.NOTIFICATION_PERMISSION_STATUS, {
os_enabled: c31016_0 === NotificationAuthorizationStatus.AUTHORIZED,
foreground_app_enabled: c31016_1,
background_app_enabled: c31016_1,
notification_authorization_status: isIOS() ? c31016_0 : null
});
};
c11699_17 = [PermissionPromptType.FRIEND_REQUEST_SENT, PermissionPromptType.INVITE_ACCEPTED];
c11699_23 = null;
class NotificationPermissionManager extends AutomaticLifecycleManager {
constructor() {
let c22943_0;
let c22944_0;
let c22945_0;
let c22946_0;
let c22947_0, c22947_1;
super(...arguments);
const _this = this;
this.previousAppState = null;
this.actions = {
MESSAGE_CREATE: (a0) => {
_this.handleMessageCreate(a0);
_this.handleMessageCreateForNudge(a0);
},
MESSAGE_REACTION_ADD: (a0) => {
_this.handleReactionAddForNudge(a0);
},
INVITE_ACCEPT_SUCCESS: (a0) => {
_this.handleInviteAccept(a0);
},
RELATIONSHIP_ADD: (a0) => {
_this.handleSendFriendRequest(a0);
},
POST_CONNECTION_OPEN: () => {
_this.handleConnectionOpen();
},
APP_STATE_UPDATE: (a0) => {
_this.handleAppStateUpdate(a0);
}
};
c22943_0 = this;
this.handleConnectionOpen = async () => {
let c31017_0;
c31017_0 = void 0;
await _logNotificationPermissionStatus();
await c22943_0._handleNotificationAuthorizationStatusUpdate();
};
c22944_0 = void 0;
c22944_0 = async (c31018_0) => {
let c31018_2;
let c31808_0, c31808_1, c31808_2, c31808_3;
L23: {
c31018_2 = void 0;
c31808_0 = void 0;
c31808_1 = void 0;
c31808_2 = void 0;
c31808_3 = void 0;
c31808_0 = c31018_0.message;
c31808_1 = c31018_0.optimistic;
c31808_2 = c31018_0.isPushNotification;
c31808_3 = c31018_0.sendMessageOptions;
await void 0;
if (!(c31808_1 || c31808_2 || c31808_3 != null)) {
const r51 = c31808_0;
const r59 = (r51 == null ? void 0 : r51.author?.id) === AuthenticationStore.getId();
if (r59) {
if (!await (0, shouldShowPrompt)(PermissionPromptType.MESSAGE_SENT)) {
break L23;
}
} else if (!r59) {
break L23;
}
(0, showPrompt)(PermissionPromptType.MESSAGE_SENT, EventActionLocation.MESSAGE_SENT, 1000);
}
}
};
this.handleMessageCreate = function() {
return c22944_0.apply(this, arguments);
};
c22945_0 = void 0;
c22945_0 = async (c31019_0) => {
let features, c31019_3;
let c31809_0;
L23: {
c31019_3 = void 0;
c31809_0 = void 0;
c31809_0 = c31019_0.invite;
await void 0;
const features2 = c31809_0.guild?.features;
features = features2;
if (features2 == null) {
features = [];
}
if (!features.includes(GuildFeatures.COMMUNITY)) {
L17: {
let inHoldout = ContextualOptInNudgeHoldoutExperiment.getConfig({
location: "NotificationPermissionManager"
}).inHoldout;
if (inHoldout) {
const r88 = await (0, shouldShowPrompt)(PermissionPromptType.INVITE_ACCEPTED);
inHoldout = r88;
if (!r88) {
if (!await (0, shouldShowReactivationPrompt)(PermissionPromptType.INVITE_ACCEPTED)) {
break L23;
}
break L17;
}
}
if (!inHoldout) {
break L23;
}
}
(0, showPrompt)(PermissionPromptType.INVITE_ACCEPTED, EventActionLocation.INVITE_ACCEPTED, 1000);
}
}
};
this.handleInviteAccept = function() {
return c22945_0.apply(this, arguments);
};
c22946_0 = void 0;
c22946_0 = async (c31020_0) => {
let c31020_2;
let c31810_0;
L13: {
c31020_2 = void 0;
c31810_0 = void 0;
c31810_0 = c31020_0.relationship;
await void 0;
L12: {
let r50 = c31810_0.type === RelationshipTypes.PENDING_OUTGOING;
if (r50) {
const r72 = await (0, shouldShowPrompt)(PermissionPromptType.FRIEND_REQUEST_SENT);
r50 = r72;
if (!r72) {
if (!await (0, shouldShowReactivationPrompt)(PermissionPromptType.FRIEND_REQUEST_SENT)) {
break L13;
}
break L12;
}
}
if (!r50) {
break L13;
}
}
(0, showPrompt)(PermissionPromptType.FRIEND_REQUEST_SENT, EventActionLocation.FRIEND_REQUEST_SENT, 100);
}
};
this.handleSendFriendRequest = function() {
return c22946_0.apply(this, arguments);
};
c22947_0 = void 0;
c22947_1 = this;
c22947_0 = async (c31021_0) => {
let c31021_2;
c31021_2 = void 0;
let c31811_0 = c31021_0.state;
await void 0;
let c31811_1 = c22947_1.previousAppState === AppStates.BACKGROUND;
let c31811_2 = c31811_0 === AppStates.ACTIVE;
if (c31811_1 && c31811_2) {
await c22947_1._handleNotificationAuthorizationStatusUpdate();
}
if (c31811_0 === AppStates.ACTIVE) {
await (0, _logNotificationPermissionStatus)();
}
c22947_1.previousAppState = c31811_0;
};
this.handleAppStateUpdate = function() {
return c22947_0.apply(this, arguments);
};
this._handleNotificationAuthorizationStatusUpdate = async () => {
let c31022_1;
c31022_1 = void 0;
let c31812_0 = await NativeModules.NativePermissionManager.getNotificationAuthorizationStatus();
updateNotificationAuthorizationStatus(c31812_0);
};
}
handleMessageCreateForNudge({ channelId, message, optimistic, isPushNotification, sendMessageOptions }) {
if (!optimistic && !isPushNotification && sendMessageOptions == null) {
if ((message == null ? void 0 : message.author?.id) === AuthenticationStore.getId()) {
const channel = ChannelStore.getChannel(channelId);
if (channel != null) {
const guildId = channel.getGuildId();
if (!(channel.isThread() ? JoinedThreadsStore.isMuted(channel.id) : UserGuildSettingsStore.isChannelMuted(guildId, channel.id))) {
setPushNotificationPermissionEligibleForPrompt(PermissionPromptType.CHANNEL_BANNER);
}
}
}
}
}
handleReactionAddForNudge(a0) {
const { channelId, userId } = a0;
if (!a0.optimistic && userId === AuthenticationStore.getId()) {
const channel = ChannelStore.getChannel(channelId);
if (channel != null) {
const guildId = channel.getGuildId();
if (!(channel.isThread() ? JoinedThreadsStore.isMuted(channel.id) : UserGuildSettingsStore.isChannelMuted(guildId, channel.id))) {
setPushNotificationPermissionEligibleForPrompt(PermissionPromptType.POST_REACTION_BANNER);
}
}
}
}
}
const notificationPermissionManager = new NotificationPermissionManager();
export default notificationPermissionManager;
@@ -0,0 +1,163 @@
// Metro module 11506 (f11507).
import _slicedToArray from "../../../_bundle/_slicedToArray";
import { useState, useEffect } from "react";
import { NativeModules } from "react-native";
import PushNotificationPermissionStore from "../../../stores/native/PushNotificationPermissionStore";
import { EventActionType } from "./components/notification/NotificationPermissionConstants";
import { AnalyticEvents } from "../../../Constants";
import { NotificationAuthorizationStatus } from "../../native_permissions/NativePermissionConstants";
import openNotificationSettings_native from "../../native_permissions/mobile/openNotificationSettings.native";
import AnalyticsUtils from "../../../utils/AnalyticsUtils";
import { updateNotificationAuthorizationStatus } from "../../../actions/native/PushNotificationActionCreators";
import NotificationUtils from "../../../utils/native/NotificationUtils";
import { useIsTeenInStrictCountry } from "../../regional_feature_config/RegionalTeenUtils";
import { useStateFromStores } from "../../../_bundle/Module589";
function $mk87417($env) {
return () => {
$env.$parent[6].NativePermissionManager.getNotificationAuthorizationStatus().then($mk108155($env));
};
}
function $mk108155($env) {
return (a0) => {
if (a0 != null) {
const r2 = $env.$parent;
(0, r2[0])(r2[2][10]).updateNotificationAuthorizationStatus(a0);
}
(0, $env[0])(true);
};
}
function $mk116246($env) {
return (a0) => {
const r1 = $env;
AnalyticsUtils.track(AnalyticEvents.NOTIFICATION_PERMISSION_PREPROMPT_ACKED, {
action_type: r1[0],
action_location: r1[1],
permission_granted: a0
});
(0, r1[2])();
};
}
function $mk116247($env) {
return (a0) => {
const r1 = $env;
AnalyticsUtils.track(AnalyticEvents.PERMISSIONS_ACKED, {
type: "provisional_notification",
action: a0 ? "accepted" : "denied"
});
NativeModules.NativePermissionManager.getNotificationAuthorizationStatus().then($mk118326(r1));
};
}
function $mk118326($env) {
return (a0) => {
if (a0 != null) {
updateNotificationAuthorizationStatus(a0);
}
};
}
let $mk87416 = function() {
return () => PushNotificationPermissionStore.authorizationStatus;
};
let env7841 = {};
export async function requestPushNotificationPermission(c27086_0, c27086_1, c27086_2) {
let env30410;
const r25 = env7841;
let c27086_4 = r25;
const r11 = env30410 = {
$parent: r25
};
let c27086_3 = r11;
env30410[0] = c27086_0;
env30410[1] = c27086_1;
env30410[2] = c27086_2;
env30410[3] = void 0;
env30410[3] = await NativeModules.NativePermissionManager.getNotificationAuthorizationStatus();
if (env30410[3] === NotificationAuthorizationStatus.DENIED) {
openNotificationSettings_native();
AnalyticsUtils.track(AnalyticEvents.NOTIFICATION_PERMISSION_PREPROMPT_ACKED, {
action_type: EventActionType.TO_SETTINGS,
action_location: env30410[1]
});
(0, env30410[2])();
} else if (env30410[3] === NotificationAuthorizationStatus.AUTHORIZED) {
updateNotificationAuthorizationStatus(env30410[3]);
(0, env30410[2])();
} else {
NotificationUtils.requestPermission($mk116246(c27086_3));
}
}
export function useShowReactivationPrompt() {
const [state, setState] = useState(false);
useEffect(() => {
let _shouldShowReactivationPrompts2 = function _shouldShowReactivationPrompts() {
const r9 = async () => {
let c31628_0;
c31628_0 = void 0;
if (await NativeModules.NativePermissionManager.getNotificationAuthorizationStatus() !== NotificationAuthorizationStatus.AUTHORIZED) {
(0, setState)(true);
}
};
_shouldShowReactivationPrompts2 = r9;
return r9.apply(this, arguments);
};
(function shouldShowReactivationPrompts() {
return _shouldShowReactivationPrompts2.apply(this, arguments);
})();
}, []);
return state;
}
export async function enableProvisionalPushNotification() {
const r20 = env7841;
let c27087_1 = r20;
let c27087_0 = r20;
if (await NativeModules.NativePermissionManager.getNotificationAuthorizationStatus() === NotificationAuthorizationStatus.UNDETERMINED) {
NativeModules.DCDProvisionalNotificationUtils.registerProvisionalNotification($mk116247(c27087_0));
}
}
export function useCanSeePushNotificationNudge() {
let env18902;
const r7 = env18902 = {
$parent: env7841
};
const isTeenInStrictCountry = useIsTeenInStrictCountry();
const stateFromStores = useStateFromStores([PushNotificationPermissionStore], $mk87416());
const r22 = _slicedToArray(useState(false), 2);
let r23 = r22[0];
env18902[0] = r22[1];
useEffect($mk87417(r7), []);
if (r23) {
r23 = !isTeenInStrictCountry;
}
if (r23) {
r23 = stateFromStores != null;
}
if (r23) {
r23 = [NotificationAuthorizationStatus.DENIED, NotificationAuthorizationStatus.PROVISIONAL, NotificationAuthorizationStatus.UNDETERMINED].includes(stateFromStores);
}
return r23;
}
export function useShouldShowPushNotificationNudgeByPromptType(a0) {
let env18904;
const r9 = env18904 = {
$parent: env7841
};
const isTeenInStrictCountry = useIsTeenInStrictCountry();
const stateFromStores = useStateFromStores([PushNotificationPermissionStore], $mk87416());
const r22 = _slicedToArray(useState(false), 2);
let r23 = r22[0];
env18904[0] = r22[1];
useEffect($mk87417(r9), []);
if (r23) {
r23 = !isTeenInStrictCountry;
}
if (r23) {
r23 = stateFromStores != null;
}
if (r23) {
r23 = [NotificationAuthorizationStatus.DENIED, NotificationAuthorizationStatus.PROVISIONAL, NotificationAuthorizationStatus.UNDETERMINED].includes(stateFromStores);
}
const stateFromStores2 = useStateFromStores([PushNotificationPermissionStore], () => PushNotificationPermissionStore.getState().eligiblePromptTypes);
if (r23) {
r23 = stateFromStores2.has(a0);
}
return r23;
}
@@ -0,0 +1,15 @@
// Metro module 11515 (f11516).
import { createApexExperiment } from "../../experiments/apex/index";
const apexExperiment = createApexExperiment({
name: "2026-04-post-reaction-push-banner",
kind: "user",
defaultConfig: {
enabled: false
},
variations: {
1: {
enabled: true
}
}
});
export default apexExperiment;
@@ -0,0 +1,46 @@
// Metro module 16271 (f16272).
import { ContactSyncModes, initialize } from "../../contact_sync/native/ContactSyncModalStore";
import NewUserStore from "../NewUserStore";
import AutomaticLifecycleManager from "../../../lib/AutomaticLifecycleManager";
import { hasDeferredInvite } from "../../instant_invite/native/InstantInviteUtils";
import { getNextOnboardingStep, getKeyForOnboardingStep } from "./NewUserUtils";
import ModalActionCreators from "../../../actions/ModalActionCreators";
import { NEW_USER_MODAL_KEY } from "./components/NewUserModalTypes";
import { isAndroid } from "../../../utils/PlatformUtils";
import { isModalOpen } from "../../main_tabs_v2/helpers/NavigationRouteUtils.native";
class RedesignNewUserManager extends AutomaticLifecycleManager {
_onboardingStepIndex = -1;
_lastShownStepIndex = -1;
actions = {
POST_CONNECTION_OPEN: () => this.handleConnectionOpen(),
ONBOARDING_START: () => this.handleOnboardingStart()
};
startOnboarding = () => {
initialize(hasDeferredInvite() ? ContactSyncModes.ONBOARDING_INVITE : ContactSyncModes.ONBOARDING);
getNextOnboardingStep(false, -1, -1).then((result) => {
result.lastShownStepIndex;
const onboardingStepIndex = result.onboardingStepIndex;
const keyForOnboardingStep = getKeyForOnboardingStep(onboardingStepIndex);
if (keyForOnboardingStep != null) {
ModalActionCreators.pushLazy(import("./components/NewUserModal"), {
initialRouteName: keyForOnboardingStep,
initialOnboardingStepIndex: onboardingStepIndex
}, NEW_USER_MODAL_KEY, {
fullScreenGestureEnabled: false,
presentation: isAndroid() ? "transparentModal" : "card",
animation: "slide_from_bottom"
});
}
});
};
handleOnboardingStart = () => {
this.startOnboarding();
};
handleConnectionOpen = () => {
if (NewUserStore.getType() != null && !isModalOpen()) {
this.startOnboarding();
}
};
}
const redesignNewUserManager = new RedesignNewUserManager();
export default redesignNewUserManager;
@@ -0,0 +1,147 @@
// Metro module 11848 (f11849).
import { useState, useLayoutEffect, useCallback } from "react";
import { ScrollView, View } from "react-native";
import GuildChannelStore from "../../../../stores/GuildChannelStore";
import GuildStore from "../../../../stores/GuildStore";
import { createStyles } from "../../../../design/components/Styles/native/createStyles";
import { NAV_BAR_HEIGHT } from "../../../../design/components/Navigator/native/NavigatorConstants.native";
import { useStateFromStores } from "../../../../_bundle/Module589";
import { useNavigation } from "../../../../design/components/Navigator/native/useNavigation.native";
import { getHeaderBackButton, getHeaderTextButton } from "../../../../design/components/Navigator/native/NavigatorHeader.native";
import { intl, t } from "../../../../intl/index.native";
import ChannelActionCreators from "../../../../actions/ChannelActionCreators";
import { APIError } from "../../../../errors/index";
import { SafeAreaPaddingView } from "../../../../components_native/common/SafeAreaView";
import GuildIcon from "../../../guild/native/GuildIcon";
import AvatarUtils from "../../../../utils/AvatarUtils";
import { Text } from "../../../../design/components/Text/native/Text";
import FreeFormInputGroup from "../../../../design/void/Form/native/FreeFormInputGroup";
import { Button } from "../../../../design/components/Button/native/Button.native";
import FreeFormErrorLabel from "../../../../design/void/Form/native/FreeFormErrorLabel";
const useStyles = createStyles({
flex: {
flex: 1
},
safePadding: {
marginTop: NAV_BAR_HEIGHT,
flex: 1
},
contentContainer: {
paddingHorizontal: 16
},
guildIcon: {
alignSelf: "center"
},
guildName: {
marginTop: 8,
textAlign: "center"
},
title: {
marginTop: 16,
textAlign: "center"
},
subTitle: {
marginTop: 8,
textAlign: "center"
},
topicInput: {
marginTop: 24
},
buttonWrapper: {
marginTop: 8
},
error: {
marginTop: 4
}
});
export default function ChannelPrompt(props) {
let state, setState, setState2, navigation;
const { guildId, buttonText, hasBack, hasSkip, onCancel, onSuccess } = props;
state = void 0;
setState = void 0;
setState2 = void 0;
navigation = void 0;
const styles = useStyles();
const stateFromStores = useStateFromStores([GuildStore], () => GuildStore.getGuild(guildId));
let onChangeText;
[state, onChangeText] = useState("");
let loading;
[loading, setState] = useState(false);
let state2;
[state2, setState2] = useState(null);
navigation = useNavigation();
useLayoutEffect(() => {
navigation.setOptions({
headerLeft: hasBack ? getHeaderBackButton(onCancel) : () => null,
headerRight: hasSkip ? getHeaderTextButton(intl.string(t["5Wxrcd"]), onSuccess) : () => null
});
}, [navigation, hasBack, hasSkip, onCancel, onSuccess]);
const callback = useCallback(async () => {
let c27196_2;
let c27196_3 = 0;
let c30470_0;
L12: {
try {
setState2(null);
setState(true);
const defaultChannel = GuildChannelStore.getDefaultChannel(guildId);
c27196_3 = 1;
await ChannelActionCreators.createTextChannel(guildId, state, defaultChannel?.parent_id, intl.formatToPlainString(t.V4lepJ, {
topic: state
}));
(0, onSuccess)();
c27196_3 = 0;
(0, setState)(false);
} catch ($e) {
const r34 = $e;
let r7 = r34;
c27196_2 = r34;
if (c27196_3 !== 0) {
while (true) {
try {
const r94 = c27196_2;
c27196_3 = 0;
c30470_0 = r94;
setState2(new APIError(c30470_0));
(0, setState)(false);
break L12;
} catch (r90) {
r7 = r90;
c27196_2 = r90;
if (c27196_3 === 0) {
break;
}
}
}
}
throw r7;
}
}
}, [guildId, onSuccess, state]);
return stateFromStores == null ? null : <SafeAreaPaddingView top style={styles.safePadding}>
<ScrollView style={styles.flex} contentInset={{
top: 0
}} automaticallyAdjustContentInsets={false} keyboardShouldPersistTaps="handled" alwaysBounceVertical={false} contentContainerStyle={styles.contentContainer}>
<GuildIcon style={styles.guildIcon} value={stateFromStores.name} icon={stateFromStores.icon != null ? AvatarUtils.getGuildIconURL({
id: stateFromStores.id,
icon: stateFromStores.icon,
canAnimate: true,
size: 128
}) : null} selected />
<Text style={styles.guildName} lineClamp={1} variant="text-sm/semibold" color="mobile-text-heading-primary">{stateFromStores.name}</Text>
<Text style={styles.title} accessibilityRole="header" variant="heading-xl/extrabold" color="mobile-text-heading-primary">
{intl.string(t["8VRa7d"])}
</Text>
<Text style={styles.subTitle} variant="text-sm/medium" color="text-default">
{intl.string(t["+855Pm"])}
</Text>
<FreeFormInputGroup style={styles.topicInput} label={intl.string(t.bY20tU)} value={state} error={state2 == null ? void 0 : state2.getFirstFieldErrorMessage("name")} onChangeText={onChangeText} onSubmitEditing={callback} maxLength={100} placeholder={intl.string(t.xGOYA8)} returnKeyType="done" autoFocus />
<View style={styles.buttonWrapper}>
<Button size="md" text={buttonText} onPress={callback} loading={loading} disabled={loading} grow />
</View>
{(state2 == null ? void 0 : state2.hasFieldErrors()) ? <FreeFormErrorLabel style={styles.error}>
{state2 == null ? void 0 : state2.getAnyErrorMessage()}
</FreeFormErrorLabel> : null}
</ScrollView>
</SafeAreaPaddingView>;
};
@@ -0,0 +1,100 @@
// Metro module 16279 (f16280).
import { useRef, useEffect } from "react";
import { View } from "react-native";
import { AnalyticEvents } from "../../../../Constants";
import { FamilyCenterAction } from "../../../parent_tools/FamilyCenterConstants";
import { createStyles } from "../../../../design/components/Styles/native/createStyles";
import Module712 from "../../../../_bundle/Module712";
import useSafeAreaInsets_native from "../../../safe_area/useSafeAreaInsets.native";
import { useConnectGuardianGate } from "../../../parent_tools/hooks/useConnectGuardianGate";
import AnalyticsUtils from "../../../../utils/AnalyticsUtils";
import { ActivityIndicator } from "../../../../design/components/ActivityIndicator/native/ActivityIndicator.native";
import { Text } from "../../../../design/components/Text/native/Text";
import { intl, t } from "../../../../intl/index.native";
import FamilyCenter_messages from "../../../parent_tools/FamilyCenter.messages";
import { ConnectGuardianCard } from "../../../parent_tools/native/ConnectGuardianCard";
import { Button } from "../../../../design/components/Button/native/Button.native";
const useStyles = createStyles({
container: {
flex: 1,
backgroundColor: Module712.colors.BACKGROUND_BASE_LOW
},
centered: {
flex: 1,
alignItems: "center",
justifyContent: "center",
paddingHorizontal: Module712.space.PX_16
},
header: {
marginBottom: Module712.space.PX_40
},
title: {
paddingHorizontal: Module712.space.PX_16,
marginBottom: Module712.space.PX_8,
textAlign: "center"
},
description: {
paddingHorizontal: Module712.space.PX_16,
textAlign: "center"
},
cardSection: {
alignItems: "center"
},
scanPrompt: {
paddingHorizontal: Module712.space.PX_16,
marginBottom: Module712.space.PX_24,
textAlign: "center"
},
grow: {
flexGrow: 1
},
footer: {
paddingHorizontal: Module712.space.PX_16
}
});
export default function ConnectGuardianModal(props) {
const route = props.route;
const onComplete = route.params.onComplete;
const styles = useStyles();
const bottom = useSafeAreaInsets_native().bottom;
const connectGuardianGate = useConnectGuardianGate();
const ref = useRef(false);
useEffect(() => {
if (!(connectGuardianGate.state !== "error" || ref.current)) {
ref.current = true;
AnalyticsUtils.track(AnalyticEvents.FAMILY_CENTER_ACTION, {
action: FamilyCenterAction.NufConsentGateLinkCodeError,
source: "NUF Connect Guardian"
});
if (onComplete != null) {
onComplete(true);
}
}
}, [connectGuardianGate.state, onComplete]);
return connectGuardianGate.state !== "gate" ? <View style={[styles.container, styles.centered]}>
<ActivityIndicator />
</View> : <View style={styles.container}>
<View style={styles.header}>
<Text style={styles.title} variant="heading-xl/bold" color="text-default">
{intl.string(FamilyCenter_messages.ITlV6p)}
</Text>
<Text style={styles.description} variant="text-sm/medium" color="text-muted">
{intl.format(FamilyCenter_messages.F4GT2S, {
link: "https://support.discord.com/hc/articles/14155060633623"
})}
</Text>
</View>
<View style={styles.cardSection}>
<Text style={styles.scanPrompt} variant="text-md/semibold" color="text-default">
{intl.string(FamilyCenter_messages.Mi60fm)}
</Text>
<ConnectGuardianCard shareActions="compact" linkCode={connectGuardianGate.linkCode} expiresAt={connectGuardianGate.expiresAt} onRefresh={connectGuardianGate.refresh} />
</View>
<View style={styles.grow} />
<View style={[styles.footer, {
paddingBottom: bottom + Module712.space.PX_16
}]}>
<Button variant="primary" size="lg" text={intl.string(t["3PatSz"])} onPress={() => onComplete == null ? void 0 : onComplete(false)} />
</View>
</View>;
};
@@ -0,0 +1,79 @@
// Metro module 11852 (f11853).
import { useCallback } from "react";
import { View } from "react-native";
import { setAllowEmail, setAllowPhone, setAllowSync, useContactSyncModalStore } from "../../../contact_sync/native/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 "../../../contact_sync/native/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 DiscoverabilityActionSheet() {
const styles = useStyles();
const contactSyncModalStore = useContactSyncModalStore();
const { allowPhone, allowEmail } = contactSyncModalStore;
const allowEmail2 = allowPhone ? allowPhone : allowEmail;
const callback = useCallback(() => {
setAllowSync(!allowEmail2);
}, [allowEmail2]);
const callback3 = useCallback(() => {
setAllowPhone(!allowPhone);
}, [allowPhone]);
const callback2 = useCallback(() => {
setAllowEmail(!allowEmail);
}, [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.gMUgpv)} />} onPress={callback} 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={callback3} 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={callback2} trailing={<FormRow.Checkbox selected={allowEmail} />} />
</View>
</ActionSheet>;
};
@@ -0,0 +1,123 @@
// Metro module 11851 (f11852).
import { useCallback } from "react";
import { ScrollView, View } from "react-native";
import { useContactSyncModalStore } from "../../../contact_sync/native/ContactSyncModalStore";
import { Fonts } from "../../../../Constants";
import { createStyles } from "../../../../design/components/Styles/native/createStyles";
import Module712 from "../../../../_bundle/Module712";
import TextStyles from "../../../rebrand/native/TextStyles";
import useSafeAreaInsets_native from "../../../safe_area/useSafeAreaInsets.native";
import ActionSheetActionCreators from "../../../action_sheet/native/ActionSheetActionCreators";
import { NAV_BAR_HEIGHT } from "../../../../design/components/Navigator/native/NavigatorConstants.native";
import FastImage from "../../../../components_native/common/FastImage";
import Module11853 from "../../../../_bundle/Module11853";
import { Text } from "../../../../design/components/Text/native/Text";
import { intl, t } from "../../../../intl/index.native";
import { FormRow, FormCheckboxRow } from "../../../../design/void/Form/native/index";
import { toggleDiscoverabilityForUser } from "../NUFActionCreators";
import { Button } from "../../../../design/components/Button/native/Button.native";
const useStyles = createStyles({
container: {
flex: 1,
backgroundColor: Module712.colors.BACKGROUND_BASE_LOW
},
headerContainer: {
flexGrow: 0,
justifyContent: "center",
marginBottom: 24
},
header: {
paddingHorizontal: 16,
alignItems: "center"
},
image: {
width: "100%",
marginHorizontal: 0
},
button: {
flexGrow: 0,
marginHorizontal: 16,
marginBottom: 24
},
title: {
textAlign: "center",
marginTop: 16
},
subtitle: {
textAlign: "center",
marginTop: 8
},
formRow: {
paddingVertical: 16,
backgroundColor: Module712.colors.BACKGROUND_SURFACE_HIGH
},
formText: {
...TextStyles(Fonts.PRIMARY_SEMIBOLD, Module712.colors.INTERACTIVE_TEXT_ACTIVE, 16)
},
footerContainer: {
flexGrow: 1,
width: "100%"
},
info: {
paddingHorizontal: 16,
marginTop: 8,
marginBottom: 24
}
});
export default function DiscoverabilityLanding(props) {
const styles = useStyles();
const onNext = props.onNext;
const contactSyncModalStore = useContactSyncModalStore();
let allowEmail2 = contactSyncModalStore.allowEmail;
const allowEmail = allowEmail2;
const allowPhone = contactSyncModalStore.allowPhone;
const bottom = useSafeAreaInsets_native().bottom;
const callback = useCallback(() => {
ActionSheetActionCreators.openLazy(import("./DiscoverabilityActionSheet"), "Discoverability Landing", {
allowPhone,
allowEmail
});
}, [allowPhone, allowEmail]);
const r82 = [<View style={styles.headerContainer}>
<View style={styles.header}>
<FastImage resizeMode="contain" style={styles.image} source={Module11853} />
<Text style={styles.title} accessibilityRole="header" variant="heading-xl/extrabold" color="mobile-text-heading-primary">
{intl.string(t.n8nw6j)}
</Text>
<Text style={styles.subtitle} variant="text-sm/medium" color="text-subtle">
{intl.string(t.KMW0kP)}
</Text>
</View>
</View>, ,];
const props2 = {
DEPRECATED_style: styles.formRow,
label: <FormRow.Label style={styles.formText} text={intl.string(t.gMUgpv)} />,
onPress: toggleDiscoverabilityForUser,
selected: null
};
if (!allowEmail) {
allowEmail2 = allowPhone;
}
props2.selected = allowEmail2;
r82[1] = <View style={styles.footerContainer}>
<FormCheckboxRow {...props2} />
<Text style={styles.info} variant="heading-deprecated-12/medium" color="text-default">
{intl.string(t["DGZg+k"])}
{" "}
{intl.format(t.QmF5z4, {
learnMoreHook: function learnMoreHook(a0, a1) {
return <Text key={a1} onPress={callback} variant="text-sm/medium" color="text-link">
{a0}
</Text>;
}
})}
</Text>
<View style={styles.button}>
<Button text={intl.string(t.PDTjLN)} onPress={() => onNext()} grow />
</View>
</View>;
return <ScrollView style={styles.container} contentContainerStyle={{
paddingTop: NAV_BAR_HEIGHT + 32,
paddingBottom: bottom + 16
}}>{r82}</ScrollView>;
};
@@ -0,0 +1,95 @@
// Metro module 11850 (f11851).
import { useCallback, useEffect, useMemo } from "react";
import { View } from "react-native";
import { useContactSyncModalStore } from "../../../contact_sync/native/ContactSyncModalStore";
import UserStore from "../../../../stores/UserStore";
import { ModalAnimation } from "../../../../Constants";
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 { useNavigation } from "../../../../design/components/Navigator/native/useNavigation.native";
import { useStateFromStores } from "../../../../_bundle/Module589";
import ContactSyncActionCreators from "../../../contact_sync/native/ContactSyncActionCreators";
import { DiscoverabilityScenes } from "../../../../ConstantsIOS";
import { closeDiscoverabilityModal, startContactSyncForDiscoverability } from "../NUFActionCreators";
import DiscoverabilityLanding from "./DiscoverabilityLanding";
import ContactSyncNameInput from "../../../contact_sync/native/components/ContactSyncNameInput";
import { ImpressionNames } from "../../../../_bundle/Module503";
import { Navigator } from "../../../../design/components/Navigator/native/Navigator.native";
import { intl, t } from "../../../../intl/index.native";
let useStyles, DiscoverabilityNameScene;
const DiscoverabilityLandingScene = function DiscoverabilityLandingScene() {
let allowPhone, allowEmail, allowEmail2;
const navigation = useNavigation();
const stateFromStores = useStateFromStores([UserStore], () => UserStore.getCurrentUser()?.phone);
const contactSyncModalStore = useContactSyncModalStore();
allowPhone = contactSyncModalStore.allowPhone;
allowEmail = contactSyncModalStore.allowEmail;
allowEmail2 = allowPhone ? allowPhone : allowEmail;
return <DiscoverabilityLanding onNext={useCallback(() => {
ContactSyncActionCreators.updateDiscoverability({
phone: allowPhone,
email: allowEmail
});
if (allowEmail2 && (stateFromStores != null && allowPhone)) {
navigation.push(DiscoverabilityScenes.NAME);
} else {
closeDiscoverabilityModal(false);
}
}, [navigation, stateFromStores, allowEmail, allowPhone, allowEmail2])} />;
};
DiscoverabilityNameScene = function DiscoverabilityNameScene() {
const styles = useStyles();
const contactSyncModalStore = useContactSyncModalStore();
let name = contactSyncModalStore.name;
const allowPhone2 = contactSyncModalStore.allowPhone;
useEffect(() => {
if (!allowPhone2) {
closeDiscoverabilityModal(false);
}
}, [allowPhone2]);
const callback = useCallback((a0) => {
startContactSyncForDiscoverability(a0);
closeDiscoverabilityModal(false);
}, []);
if (name == null) {
name = "";
}
return <View style={styles.container}>
<ContactSyncNameInput onNext={callback} loading={false} initialName={name} />
</View>;
};
const DiscoverabilityModal = function DiscoverabilityModal() {
return <Navigator screens={useMemo(() => {
const r1 = {};
r1[DiscoverabilityScenes.LANDING] = {
ignoreKeyboard: true,
impressionName: ImpressionNames.DISCOVERABILITY,
fullscreen: true,
headerLeft: () => null,
headerTitle: () => null,
render: () => <DiscoverabilityLandingScene />
};
r1[DiscoverabilityScenes.NAME] = {
ignoreKeyboard: true,
impressionName: ImpressionNames.DISCOVERABILITY,
fullscreen: true,
headerTitle: () => null,
render: () => <DiscoverabilityNameScene />
};
return r1;
}, [])} initialRouteName={DiscoverabilityScenes.LANDING} headerBackTitle={intl.string(t["13/7kX"])} />;
};
useStyles = createStyles({
container: {
flex: 1,
backgroundColor: Module712.colors.BACKGROUND_BASE_LOW,
justifyContent: "center",
paddingBottom: 44,
paddingTop: NAV_BAR_HEIGHT + 32
}
});
DiscoverabilityModal.modalConfig = {
animation: ModalAnimation.SLIDE_IN_OUT
};
export default DiscoverabilityModal;
@@ -0,0 +1,130 @@
// Metro module 11797 (f11798).
import { useMemo } from "react";
import { Keyboard } from "react-native";
import DefaultRouteStore from "../../../../stores/DefaultRouteStore";
import { AnalyticEvents, AnalyticsSections, NOOP } from "../../../../Constants";
import { GuildTemplateId } from "../../../create_guild/CreateGuildConstants";
import { CreateGuildModalStates, GuildTemplateTriggers, NUXGuildTemplatesAnalytics } from "../../../create_guild/native/CreateGuildConstants";
import GuildActionCreators from "../../../../actions/GuildActionCreators";
import { createGuildProgress } from "../../../guild_progress/native/GuildProgressUtils";
import navigateToLastChannel from "../../../main_tabs_v2/native/navigateToLastChannel";
import CreateGuildModalActionCreators from "../../../create_guild/native/CreateGuildModalActionCreators";
import { showInstantInviteModal } from "../../../../actions/native/CreateGuildActionCreators";
import AnalyticsUtils from "../../../../utils/AnalyticsUtils";
import { ImpressionGroups, ImpressionNames } from "../../../../_bundle/Module503";
import { getHeaderCloseButton } from "../../../../design/components/Navigator/native/NavigatorHeader.native";
import { trackNUFStep } from "../NewUserAnalyticsUtils";
import { transitionTo } from "../../../routing/router_utils";
import GuildTemplates from "../../../create_guild/native/components/GuildTemplates";
import CreationIntent from "../../../create_guild/native/components/CreationIntent";
import CreateGuildContainer from "../../../create_guild/native/components/CreateGuildContainer";
import { intl, t } from "../../../../intl/index.native";
import JoinServer from "../../../create_guild/native/components/JoinServer";
import AcceptInviteContainer from "../../../create_guild/native/components/AcceptInviteContainer";
import ChannelPrompt from "./ChannelPrompt";
import HubEmailConnectionModal from "../../../hub/native/components/HubEmailConnectionModal";
import { Navigator } from "../../../../design/components/Navigator/native/Navigator.native";
let _onCreateServer, impressionProperties;
const onCreateGuild = async function onCreateGuild(c27170_0) {
let c27170_2;
c27170_2 = void 0;
let c30453_0 = c27170_0;
await GuildActionCreators.transitionToGuildSync(c27170_0);
createGuildProgress(c30453_0);
navigateToLastChannel();
CreateGuildModalActionCreators.closeCreateGuildOnboardingModal();
showInstantInviteModal(c30453_0);
AnalyticsUtils.track(AnalyticEvents.USER_FLOW_TRANSITION, {
flow_type: AnalyticsSections.GUILD_CREATE_MODAL,
from_step: CreateGuildModalStates.CREATE_SERVER,
to_step: "modal_closed"
});
};
_onCreateServer = function _onCreateServer() {
const r8 = async (c27171_0, guildId, c27171_2) => {
L12: {
if (c27171_2.id !== GuildTemplateId.CREATE) {
await onCreateGuild(guildId);
break L12;
}
c27171_0.push(CreateGuildModalStates.CHANNEL_PROMPT, {
guildId
});
return void 0;
}
};
_onCreateServer = r8;
return r8.apply(this, arguments);
};
impressionProperties = {
impression_group: ImpressionGroups.GUILD_ADD_FLOW
};
export default function NUFGuildTemplates() {
return <Navigator screens={useMemo(() => {
const r1 = {};
r1[CreateGuildModalStates.GUILD_TEMPLATES] = {
impressionName: ImpressionNames.GUILD_ADD_LANDING,
impressionProperties,
fullscreen: true,
headerTitle: () => null,
headerLeft: getHeaderCloseButton(() => {
trackNUFStep(NUXGuildTemplatesAnalytics.STEP_GUILD_TEMPLATE, NUXGuildTemplatesAnalytics.STEP_FRIEND_LIST, {
skip: true
});
transitionTo(DefaultRouteStore.fallbackRoute);
CreateGuildModalActionCreators.closeCreateGuildOnboardingModal();
}),
render: () => <GuildTemplates trigger={GuildTemplateTriggers.NUF} />
};
r1[CreateGuildModalStates.CREATION_INTENT] = {
impressionName: ImpressionNames.GUILD_ADD_INTENT_SELECTION,
impressionProperties,
fullscreen: true,
headerTitle: () => null,
render: (a0) => <CreationIntent guildTemplate={a0.guildTemplate} trigger={GuildTemplateTriggers.NUF} />
};
r1[CreateGuildModalStates.CREATE_SERVER] = {
impressionName: ImpressionNames.GUILD_ADD_CUSTOMIZE,
impressionProperties,
fullscreen: true,
headerTitle: () => null,
render: (a0, c27172_1) => {
return <CreateGuildContainer {...a0} onCreate={(event) => (function onCreateServer() {
return _onCreateServer.apply(this, arguments);
})(c27172_1, event.guild.id, a0.guildTemplate)} customTitle={intl.string(t["5HZu07"])} />;
}
};
r1[CreateGuildModalStates.JOIN_SERVER] = {
impressionName: ImpressionNames.GUILD_ADD_JOIN,
impressionProperties,
fullscreen: true,
headerTitle: () => null,
render: () => <JoinServer location="Onboarding Join Guild Modal" onClose={CreateGuildModalActionCreators.closeCreateGuildModal} />
};
r1[CreateGuildModalStates.ACCEPT_INVITE] = {
impressionName: ImpressionNames.GUILD_ADD_ACCEPT_INVITE,
impressionProperties,
fullscreen: true,
headerTitle: () => null,
headerLeft: () => null,
render: (a0) => <AcceptInviteContainer code={a0.code} onPressClose={CreateGuildModalActionCreators.closeCreateGuildModal} />
};
r1[CreateGuildModalStates.CHANNEL_PROMPT] = {
impressionName: ImpressionNames.GUILD_ADD_CHANNEL_PROMPT,
impressionProperties,
fullscreen: true,
headerTitle: () => null,
render: ({ guildId: guildId2 }) => <ChannelPrompt hasSkip hasBack={false} onCancel={NOOP} onSuccess={() => onCreateGuild(guildId2)} guildId={guildId2} buttonText={intl.string(t["uHXB+F"])} />
};
r1[CreateGuildModalStates.JOIN_STUDENT_HUB] = {
impressionName: void 0,
impressionProperties,
fullscreen: true,
ignoreKeyboard: true,
headerTitle: () => null,
headerLeft: () => null,
render: () => <HubEmailConnectionModal isNestedNavigator />
};
return r1;
}, [])} onWillFocus={Keyboard.dismiss} headerBackTitle={intl.string(t["13/7kX"])} initialRouteName={CreateGuildModalStates.GUILD_TEMPLATES} />;
};
@@ -0,0 +1,98 @@
// Metro module 16274 (f16275).
import { useState, useRef, useCallback, lazy } from "react";
import { NativeModules } from "react-native";
import { jsx } from "react/jsx-runtime";
import { createNativeStackNavigator } from "../../../../_bundle/Module9109";
import { createStyles } from "../../../../design/components/Styles/native/createStyles";
import Module712 from "../../../../_bundle/Module712";
import { openAlert } from "../../../../design/components/AlertModal/native/useAlertStore.native";
import { useAccessibilityNativeStackOptions } from "../../../../design/components/Navigator/native/Navigator.native";
import { getNextOnboardingStep, continueToNextStep } from "../NewUserUtils";
import ModalActionCreators from "../../../../actions/ModalActionCreators";
import { NEW_USER_MODAL_KEY } from "./NewUserModalTypes";
import { useNavigatorBackPressHandler } from "../../../../design/components/Navigator/native/useNavigatorBackPressHandler.native";
import { isAndroid } from "../../../../utils/PlatformUtils";
import { RedesignNotificationScreen } from "./notification/RedesignNotificationModal";
import * as _RedesignAddAvatarModal from "../../../avatar/native/components/RedesignAddAvatarModal";
import SkipHeaderButton from "./SkipHeaderButton";
import { ContactSyncOnboardingModal } from "../../../contact_sync/native/components/RedesignContactSyncModal";
import * as _RedesignDiscoverabilityModal from "./RedesignDiscoverabilityModal";
import * as _ConnectGuardianModal from "./ConnectGuardianModal";
const nativeStackNavigator = createNativeStackNavigator();
const useStyles = createStyles({
header: {
borderBottomWidth: 0,
backgroundColor: Module712.colors.BACKGROUND_BASE_LOW,
shadowColor: "transparent"
}
});
export default function NewUserModal(props) {
let initialRouteName = props.initialRouteName;
const initialOnboardingStepIndex = props.initialOnboardingStepIndex;
const styles = useStyles();
const [state, setState] = useState(initialOnboardingStepIndex);
const [state2, setState2] = useState(initialOnboardingStepIndex);
const ref = useRef(null);
const accessibilityNativeStackOptions = useAccessibilityNativeStackOptions();
const callback = useCallback((a0) => {
getNextOnboardingStep(a0 == null ? false : a0, state2, state).then(({ lastShownStepIndex, onboardingStepIndex, continueNavigation }) => {
setState(onboardingStepIndex);
setState2(lastShownStepIndex);
if (continueNavigation && ref.current != null) {
continueToNextStep(onboardingStepIndex, ref.current);
} else {
ModalActionCreators.popWithKey(NEW_USER_MODAL_KEY);
}
});
}, [state2, state]);
useNavigatorBackPressHandler(() => {
NativeModules.MinimizeApp.minimizeApp();
return true;
});
const Navigator = nativeStackNavigator.Navigator;
if (initialRouteName == null) {
initialRouteName = "choose-avatar";
}
return <Navigator screenOptions={(a0) => {
ref.current = a0.navigation;
return {
headerStyle: styles.header,
headerShadowVisible: false,
title: "",
headerLeft: () => null,
headerRight: () => null,
fullScreenGestureEnabled: false,
presentation: isAndroid() ? "transparentModal" : "card",
animation: "slide_from_right",
headerBackVisible: false,
...accessibilityNativeStackOptions
};
}} initialRouteName={initialRouteName}>
<nativeStackNavigator.Screen name="enable-notification" getComponent={() => RedesignNotificationScreen} initialParams={{
onComplete: callback
}} />
<nativeStackNavigator.Screen name="choose-avatar" getComponent={() => _RedesignAddAvatarModal.default} options={() => ({
headerRight: (a0) => <SkipHeaderButton {...a0} onPress={() => {
const callback2 = callback;
openAlert("skip-avatar-upload", jsx(lazy(() => import("../../../avatar/native/components/RedesignSkipAvatarUploadAlertModal")), {
onConfirm: () => callback2(true)
}));
}} />
})} initialParams={{
onComplete: callback
}} />
<nativeStackNavigator.Screen name="contact-sync" options={{
headerShown: false
}} getComponent={() => ContactSyncOnboardingModal} initialParams={{
onComplete: callback
}} />
<nativeStackNavigator.Screen name="discoverability" options={{
headerShown: false
}} getComponent={() => _RedesignDiscoverabilityModal.default} initialParams={{
onComplete: callback
}} />
<nativeStackNavigator.Screen name="connect-guardian" getComponent={() => _ConnectGuardianModal.default} initialParams={{
onComplete: callback
}} />
</Navigator>;
};
@@ -0,0 +1,2 @@
// Metro module 16273 (f16274).
export const NEW_USER_MODAL_KEY = "new-user-modal";
@@ -0,0 +1,83 @@
// Metro module 11779 (f11780).
import { ScrollView, View } from "react-native";
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 { Text } from "../../../../design/components/Text/native/Text";
import { Button } from "../../../../design/components/Button/native/Button.native";
import { intl, t } from "../../../../intl/index.native";
const useStyles = createStyles({
scrollContainer: {
minHeight: "100%"
},
container: {
flexGrow: 1,
alignItems: "center",
justifyContent: "center"
},
alertContainer: {
paddingTop: 80 + NAV_BAR_HEIGHT
},
alert: {
backgroundColor: Module712.colors.BACKGROUND_SURFACE_HIGH,
borderRadius: Module712.radii.xl,
borderWidth: 1,
borderColor: Module712.colors.INTERACTIVE_BACKGROUND_ACTIVE,
alignItems: "center",
maxWidth: 290,
...Module712.shadows.SHADOW_HIGH
},
alertContent: {
paddingVertical: 24,
paddingHorizontal: 24,
alignItems: "center"
},
alertTitle: {
paddingBottom: 8,
textAlign: "center"
},
alertSubtitle: {
paddingBottom: Module712.space.PX_16,
textAlign: "center"
},
buttonWrapper: {
flexDirection: "row"
},
primaryButtonContainer: {
marginBottom: Module712.space.PX_12
},
trailing: {
flexGrow: 0,
padding: Module712.space.PX_16
}
});
export default function NewUserPermissionsOnboarding(props) {
const { title, subtitle, header, trailing, loading } = props;
let showSkip = props.showSkip;
if (showSkip === void 0) {
showSkip = true;
}
const { onAllow, onDontAllow } = props;
const styles = useStyles();
const r31 = [header, ,];
const r39 = [<Text style={styles.alertTitle} variant="heading-lg/bold" color="text-default">{title}</Text>, <Text style={styles.alertSubtitle} variant="text-sm/medium" color="text-default">{subtitle}</Text>, <View style={[styles.buttonWrapper, showSkip ? styles.primaryButtonContainer : showSkip]}>
<Button variant="primary" size="md" text={intl.string(t["2nYlT2"])} onPress={onAllow} loading={loading} grow />
</View>, ,];
if (showSkip) {
showSkip = <View style={styles.buttonWrapper}>
<Button variant="secondary" text={intl.string(t["5Wxrcd"])} onPress={onDontAllow} grow />
</View>;
}
r39[3] = showSkip;
r31[1] = <View style={styles.alert}>
<View style={styles.alertContent}>{r39}</View>
</View>;
return <ScrollView contentContainerStyle={styles.scrollContainer}>
<View style={styles.container}>
<View style={styles.alertContainer}>
<View>{r31}</View>
</View>
</View>
<View style={styles.trailing}>{trailing}</View>
</ScrollView>;
};
@@ -0,0 +1,74 @@
// Metro module 16278 (f16279).
import { ScrollView, View } from "react-native";
import { createStyles } from "../../../../design/components/Styles/native/createStyles";
import Module712 from "../../../../_bundle/Module712";
import useSafeAreaInsets_native from "../../../safe_area/useSafeAreaInsets.native";
import { NAV_BAR_HEIGHT } from "../../../../design/components/Navigator/native/NavigatorConstants.native";
import { Text } from "../../../../design/components/Text/native/Text";
import { intl, t } from "../../../../intl/index.native";
import FastImage from "../../../../components_native/common/FastImage";
import Module11853 from "../../../../_bundle/Module11853";
import { handleOpenLearnMoreLink } from "../../../contact_sync/native/ContactSyncUtils";
import { Button } from "../../../../design/components/Button/native/Button.native";
const useStyles = createStyles({
container: {
flex: 1,
backgroundColor: Module712.colors.BACKGROUND_BASE_LOW
},
topContainer: {
paddingTop: Module712.space.PX_16
},
growContainer: {
flexGrow: 2
},
image: {
width: "100%",
marginBottom: Module712.space.PX_32
},
title: {
textAlign: "center",
marginBottom: Module712.space.PX_16
},
subtitle: {
textAlign: "center",
marginBottom: Module712.space.PX_32
},
info: {
paddingHorizontal: 16,
marginTop: 8,
marginBottom: 24,
textAlign: "center"
}
});
export default function RedesignDiscoverabilityLanding(props) {
const styles = useStyles();
const onNext = props.onNext;
return <ScrollView style={styles.container} alwaysBounceVertical={false} contentContainerStyle={{
flexGrow: 2,
paddingTop: NAV_BAR_HEIGHT + 32,
paddingBottom: useSafeAreaInsets_native().bottom + 16,
paddingHorizontal: Module712.space.PX_16
}}>
<View style={styles.topContainer} />
<Text style={styles.title} accessibilityRole="header" variant="heading-xl/extrabold" color="mobile-text-heading-primary">
{intl.string(t.n8nw6j)}
</Text>
<Text variant="text-sm/medium" color="text-default" style={styles.subtitle}>
{intl.string(t.KMW0kP)}
</Text>
<FastImage resizeMode="contain" style={styles.image} source={Module11853} />
<Text style={styles.info} variant="text-sm/medium" color="text-default">
{intl.string(t.ci12MJ)}
{" "}
{intl.format(t.VcSQ4n, {
learnMoreHook: function learnMoreHook(a0, a1) {
return <Text key={a1} onPress={handleOpenLearnMoreLink} variant="text-sm/medium" color="text-link">
{a0}
</Text>;
}
})}
</Text>
<View style={styles.growContainer} />
<Button variant="primary" size="lg" text={intl.string(t.gHPk3I)} onPress={onNext} />
</ScrollView>;
};
@@ -0,0 +1,115 @@
// Metro module 16277 (f16278).
import { useCallback, useEffect, useMemo } from "react";
import { View } from "react-native";
import { useContactSyncModalStore } from "../../../contact_sync/native/ContactSyncModalStore";
import UserStore from "../../../../stores/UserStore";
import { ModalAnimation } from "../../../../Constants";
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 { useNavigation } from "../../../../design/components/Navigator/native/useNavigation.native";
import { useStateFromStores } from "../../../../_bundle/Module589";
import ContactSyncActionCreators from "../../../contact_sync/native/ContactSyncActionCreators";
import { DiscoverabilityScenes } from "../../../../ConstantsIOS";
import RedesignDiscoverabilityLanding from "./RedesignDiscoverabilityLanding";
import { startContactSyncForDiscoverability } from "../NUFActionCreators";
import ContactSyncNameInput from "../../../contact_sync/native/components/ContactSyncNameInput";
import { ImpressionNames } from "../../../../_bundle/Module503";
import SkipHeaderButton from "./SkipHeaderButton";
import { Navigator } from "../../../../design/components/Navigator/native/Navigator.native";
import { intl, t } from "../../../../intl/index.native";
let useStyles, DiscoverabilityNameScene;
const DiscoverabilityLandingScene = function DiscoverabilityLandingScene(props) {
let allowPhone, name, allowEmail, allowEmail2;
const onComplete = props.onComplete;
allowPhone = void 0;
name = void 0;
allowEmail = void 0;
allowEmail2 = void 0;
const navigation = useNavigation();
const stateFromStores = useStateFromStores([UserStore], () => UserStore.getCurrentUser()?.phone);
const contactSyncModalStore = useContactSyncModalStore();
allowPhone = contactSyncModalStore.allowPhone;
name = contactSyncModalStore.name;
allowEmail = contactSyncModalStore.allowEmail;
allowEmail2 = allowPhone ? allowPhone : allowEmail;
return <RedesignDiscoverabilityLanding onNext={useCallback(() => {
ContactSyncActionCreators.updateDiscoverability({
phone: allowPhone,
email: allowEmail
});
if (allowEmail2 && (stateFromStores != null && (allowPhone && name == null))) {
navigation.push(DiscoverabilityScenes.NAME);
} else {
onComplete();
}
}, [allowPhone, allowEmail, allowEmail2, stateFromStores, name, navigation, onComplete])} />;
};
DiscoverabilityNameScene = function DiscoverabilityNameScene(props) {
const onComplete2 = props.onComplete;
const styles = useStyles();
const contactSyncModalStore = useContactSyncModalStore();
let name2 = contactSyncModalStore.name;
const allowPhone2 = contactSyncModalStore.allowPhone;
useEffect(() => {
if (!allowPhone2) {
onComplete2();
}
}, [allowPhone2, onComplete2]);
const callback = useCallback((a0) => {
startContactSyncForDiscoverability(a0);
onComplete2();
}, [onComplete2]);
if (name2 == null) {
name2 = "";
}
return <View style={styles.container}>
<ContactSyncNameInput onNext={callback} loading={false} initialName={name2} />
</View>;
};
const RedesignDiscoverabilityModal = function RedesignDiscoverabilityModal(props) {
const onComplete3 = props.route.params.onComplete;
return <Navigator headerStyle={useStyles().header} screens={useMemo(() => {
let r8 = onComplete3;
if (onComplete3 == null) {
r8 = () => {};
}
const onComplete4 = r8;
const r10 = {};
r10[DiscoverabilityScenes.LANDING] = {
ignoreKeyboard: true,
impressionName: ImpressionNames.DISCOVERABILITY,
fullscreen: true,
headerLeft: () => null,
headerTitle: () => null,
headerRight: (a0) => <SkipHeaderButton insideNavigator {...a0} onPress={() => onComplete4(true)} />,
render: () => <DiscoverabilityLandingScene onComplete={onComplete4} />
};
r10[DiscoverabilityScenes.NAME] = {
ignoreKeyboard: true,
impressionName: ImpressionNames.DISCOVERABILITY,
fullscreen: true,
headerTitle: () => null,
render: () => <DiscoverabilityNameScene onComplete={onComplete4} />
};
return r10;
}, [onComplete3])} initialRouteName={DiscoverabilityScenes.LANDING} headerBackTitle={intl.string(t["13/7kX"])} />;
};
useStyles = createStyles({
header: {
borderBottomWidth: 0,
backgroundColor: Module712.colors.BACKGROUND_BASE_LOW,
shadowColor: "transparent"
},
container: {
flex: 1,
backgroundColor: Module712.colors.BACKGROUND_BASE_LOW,
justifyContent: "center",
paddingBottom: 44,
paddingTop: NAV_BAR_HEIGHT + 32
}
});
RedesignDiscoverabilityModal.modalConfig = {
animation: ModalAnimation.SLIDE_IN_OUT
};
export default RedesignDiscoverabilityModal;
@@ -0,0 +1,21 @@
// Metro module 11787 (f11788).
import { createStyles } from "../../../../design/components/Styles/native/createStyles";
import Module712 from "../../../../_bundle/Module712";
import { intl, t } from "../../../../intl/index.native";
import { HeaderTextButton } from "../../../main_tabs_v2/native/shared_components/HeaderShared";
const useStyles = createStyles({
button: {
color: Module712.colors.INTERACTIVE_TEXT_DEFAULT
},
insideNavigatorButton: {
paddingRight: 16
}
});
export default function SkipHeaderButton(props) {
const styles = useStyles();
let label = props.label;
if (label == null) {
label = intl.string(t["5Wxrcd"]);
}
return <HeaderTextButton {...props} labelStyle={[styles.button, props.insideNavigator ? styles.insideNavigatorButton : void 0]} label={label} accessibilityLabel={label} />;
};
@@ -0,0 +1,80 @@
// Metro module 15394 (f15395).
import { useRef, useState, useEffect } from "react";
import GuildMemberStore from "../../../../../stores/GuildMemberStore";
import GuildStore from "../../../../../stores/GuildStore";
import SelectedGuildStore from "../../../../../stores/SelectedGuildStore";
import UserGuildSettingsStore from "../../../../../stores/UserGuildSettingsStore";
import PushNotificationPermissionStore, { PermissionPromptType } from "../../../../../stores/native/PushNotificationPermissionStore";
import { EventActionLocation, NotificationNudgeSurface } from "./NotificationPermissionConstants";
import { UserNotificationSettings, ZERO_STRING_GUILD_ID } from "../../../../../Constants";
import { useStateFromStores } from "../../../../../_bundle/Module589";
import NotificationNudgeBottomSheet from "./NotificationNudgeBottomSheet";
import { intl, t } from "../../../../../intl/index.native";
import ContextualOptInNudgeHoldoutExperiment from "../../ContextualOptInNudgeHoldoutExperiment";
import { useCanSeePushNotificationNudge } from "../../NotificationPermissionUtil";
import { isBlockedByOnboarding } from "../../../../guild_onboarding/GuildOnboardingUtils";
import { isPseudoGuildId } from "../../../../routing/RouteUtils";
import { useSelectedTimeRecurringGuildDismissibleContent } from "../../../../dismissible_content/hooks/useSelectedDismissibleContent";
import { DismissibleContent } from "../../../../../_bundle/Module1358";
import { setPushPermissionReactivationSeen } from "../../../../../actions/native/PushNotificationActionCreators";
import ActionSheetActionCreators from "../../../../action_sheet/native/ActionSheetActionCreators";
let c10946_16 = "guild-open-notification-nudge-key";
let c10946_17 = {
cooldownDurationMs: 5184000000
};
export default function GuildOpenNotificationNudge(props) {
const { guildId, markAsDismissed: markAsDismissed2, onHide } = props;
return <NotificationNudgeBottomSheet title={intl.formatToPlainString(t.tyWHMY, {
guildName: useStateFromStores([GuildStore], () => {
let r8 = GuildStore.getGuild(guildId)?.name;
if (r8 == null) {
r8 = "";
}
return r8;
})
})} body={intl.string(t["ehJH+P"])} actionLocation={EventActionLocation.GUILD_OPEN} surface={NotificationNudgeSurface.GUILD_OPEN_BOTTOM_SHEET} markAsDismissed={markAsDismissed2} onHide={onHide} />;
};
export const GUILD_OPEN_NOTIFICATION_NUDGE_KEY = "guild-open-notification-nudge-key";
export function useGuildOpenNudge() {
let stateFromStores2, ref, c21955_4;
const stateFromStores = useStateFromStores([SelectedGuildStore], () => {
let r4 = SelectedGuildStore.getGuildId();
if (r4 == null) {
r4 = null;
}
return r4;
});
const inHoldout = ContextualOptInNudgeHoldoutExperiment.useConfig({
location: "useGuildOpenNudge"
}).inHoldout;
const canSeePushNotificationNudge = useCanSeePushNotificationNudge();
const stateFromStores3 = useStateFromStores([UserGuildSettingsStore], () => stateFromStores == null || UserGuildSettingsStore.isMuted(stateFromStores));
const stateFromStores4 = useStateFromStores([UserGuildSettingsStore], () => stateFromStores != null ? UserGuildSettingsStore.getMessageNotifications(stateFromStores) : UserNotificationSettings.NO_MESSAGES);
stateFromStores2 = useStateFromStores([GuildStore, GuildMemberStore], () => stateFromStores != null && isBlockedByOnboarding(GuildStore.getGuild(stateFromStores), GuildMemberStore.getSelfMember(stateFromStores)));
ref = useRef(stateFromStores);
const [state, setState] = useState(stateFromStores2);
useEffect(() => {
const current = ref.current;
ref.current = stateFromStores;
if (current !== stateFromStores) {
setState(stateFromStores2);
} else if (stateFromStores2) {
setState(true);
}
}, [stateFromStores, stateFromStores2]);
const stateFromStores5 = useStateFromStores([PushNotificationPermissionStore], () => {
const r6 = PushNotificationPermissionStore.getState().promptLastSeen[PermissionPromptType.GUILD_OPEN_BOTTOM_SHEET];
return r6 == null || Date.now() - new Date(r6).getTime() >= 604800000;
});
let [r85, markAsDismissed] = useSelectedTimeRecurringGuildDismissibleContent(stateFromStores != null && !isPseudoGuildId(stateFromStores) && !inHoldout && canSeePushNotificationNudge && !state && !stateFromStores3 && stateFromStores4 !== UserNotificationSettings.NO_MESSAGES && stateFromStores5 ? DismissibleContent.NOTIFICATION_NUDGE_GUILD_OPEN_PER_GUILD : null, stateFromStores == null ? ZERO_STRING_GUILD_ID : stateFromStores, c10946_17);
c21955_4 = r85;
useEffect(() => {
if (stateFromStores != null && c21955_4 != null) {
setPushPermissionReactivationSeen(PermissionPromptType.GUILD_OPEN_BOTTOM_SHEET);
ActionSheetActionCreators.openLazy(import("./GuildOpenNotificationNudge"), c10946_16, {
guildId: stateFromStores,
markAsDismissed
});
}
}, [stateFromStores, markAsDismissed, r85]);
}
@@ -0,0 +1,86 @@
// Metro module 15395 (f15396).
import { useEffect, useCallback } from "react";
import { View } from "react-native";
import { EventActionType, NotificationNudgeAnalyticsAction } from "./NotificationPermissionConstants";
import { AnalyticEvents } from "../../../../../Constants";
import { ContentDismissActionType } from "../../../../dismissible_content/DismissibleContentConstants";
import { createStyles } from "../../../../../design/components/Styles/native/createStyles";
import Module712 from "../../../../../_bundle/Module712";
import AnalyticsUtils from "../../../../../utils/AnalyticsUtils";
import ActionSheetActionCreators from "../../../../action_sheet/native/ActionSheetActionCreators";
import { requestPushNotificationPermission } from "../../NotificationPermissionUtil";
import { BottomSheet } from "../../../../../design/components/Sheet/native/BottomSheet.native";
import { BellSpotIllustration } from "../../../../../design/assets/native";
import { Text } from "../../../../../design/components/Text/native/Text";
import { ButtonGroup } from "../../../../../design/components/ButtonGroup/native/ButtonGroup.native";
import { Button } from "../../../../../design/components/Button/native/Button.native";
import { intl, t } from "../../../../../intl/index.native";
const useStyles = createStyles({
container: {
marginHorizontal: Module712.space.PX_24,
alignItems: "center"
},
illustration: {
marginVertical: Module712.space.PX_24
},
title: {
textAlign: "center"
},
body: {
textAlign: "center",
marginTop: Module712.space.PX_8
},
buttonsContainer: {
marginTop: Module712.space.PX_8,
width: "100%"
}
});
export default function NotificationNudgeBottomSheet(props) {
let callback;
const { title, body, actionLocation, surface, markAsDismissed, onHide } = props;
callback = void 0;
const styles = useStyles();
useEffect(() => {
AnalyticsUtils.track(AnalyticEvents.CONTEXTUAL_REMINDER_ACTION, {
action: NotificationNudgeAnalyticsAction.IMPRESSION,
prompt_type: surface
});
}, [surface]);
callback = useCallback(() => {
ActionSheetActionCreators.hideActionSheet();
if (onHide != null) {
onHide();
}
}, [onHide]);
const callback3 = useCallback(() => {
AnalyticsUtils.track(AnalyticEvents.CONTEXTUAL_REMINDER_ACTION, {
action: NotificationNudgeAnalyticsAction.ACCEPT,
prompt_type: surface
});
markAsDismissed(ContentDismissActionType.USER_DISMISS);
requestPushNotificationPermission(EventActionType.ALLOW_TO_REQUEST, actionLocation, callback);
}, [surface, actionLocation, callback, markAsDismissed]);
const callback2 = useCallback(() => {
AnalyticsUtils.track(AnalyticEvents.CONTEXTUAL_REMINDER_ACTION, {
action: NotificationNudgeAnalyticsAction.DISMISS,
prompt_type: surface
});
markAsDismissed(ContentDismissActionType.USER_DISMISS);
callback();
}, [surface, callback, markAsDismissed]);
return <BottomSheet>
<View style={styles.container}>
<View style={styles.illustration}>
<BellSpotIllustration scale={0.8} />
</View>
<Text style={styles.title} variant="heading-xl/bold" accessibilityRole="header">{title}</Text>
<Text style={styles.body} variant="text-sm/medium" color="text-default">{body}</Text>
<View style={styles.buttonsContainer}>
<ButtonGroup>
<Button text={intl.string(t["+7MDbQ"])} onPress={callback3} />
<Button text={intl.string(t.L5eIZ2)} onPress={callback2} variant="secondary" />
</ButtonGroup>
</View>
</View>
</BottomSheet>;
};
@@ -0,0 +1,46 @@
// Metro module 11505 (f11506).
const r11 = {
SKIP_STEP: "skip_step",
ALLOW_TO_REQUEST: "allow_to_request",
REQUEST: "request",
TO_SETTINGS: "to_settings",
REQUEST_PROVISIONAL: "request_provisional",
DISMISS: "dismiss"
};
const r17 = {
ALERT: "alert",
AUTO_PROMPT: "auto_prompt",
NAV: "nav",
FOOTER: "footer",
CTA: "cta",
DM_LIST: "dm_list",
MESSAGE_SENT: "message_sent",
USER_SETTING: "user_setting",
NOTIFICATION_SETTING: "notification_setting",
INVITE_ACCEPTED: "invite_accepted",
FRIEND_REQUEST_SENT: "friend_request_sent",
FRIEND_REQUEST_ACCEPTED: "friend_request_accepted",
NOTIFICATION_CENTER: "notification_center",
CHANNEL_BANNER: "channel_banner",
POST_REACTION: "post_reaction",
GUILD_OPEN: "guild_open",
CALL_DISCONNECT: "call_disconnect"
};
const r35 = {
CHANNEL_BANNER: "channel_banner",
NOTIFICATION_CENTER_BANNER: "notification_center_banner",
POST_REACTION_BANNER: "post_reaction_banner",
NOTIFICATION_SETTINGS_PERMISSION_HEADER: "notification_settings_permission_header",
GUILD_OPEN_BOTTOM_SHEET: "guild_open_bottom_sheet",
CALL_DISCONNECT_BOTTOM_SHEET: "call_disconnect_bottom_sheet"
};
const r41 = {
IMPRESSION: "impression",
DISMISS: "dismiss",
ACCEPT: "accept"
};
export { r11 as EventActionType };
export { r17 as EventActionLocation };
export const NOTIFICATION_REACTIVATION_ACTIONSHEET_KEY = "notification-reactivation-actionsheet-key";
export { r35 as NotificationNudgeSurface };
export { r41 as NotificationNudgeAnalyticsAction };
@@ -0,0 +1,68 @@
// Metro module 16282 (f16283).
import { useCallback } from "react";
import { Image as Image2, View } from "react-native";
import { EventActionType } from "./NotificationPermissionConstants";
import { AnalyticEvents } from "../../../../../Constants";
import { createStyles } from "../../../../../design/components/Styles/native/createStyles";
import Module712 from "../../../../../_bundle/Module712";
import AnalyticsUtils from "../../../../../utils/AnalyticsUtils";
import { requestPushNotificationPermission } from "../../NotificationPermissionUtil";
import ActionSheetActionCreators from "../../../../action_sheet/native/ActionSheetActionCreators";
import { BottomSheet } from "../../../../../design/components/Sheet/native/BottomSheet.native";
import Module16283 from "../../../../../_bundle/Module16283";
import { Text } from "../../../../../design/components/Text/native/Text";
import { intl, t } from "../../../../../intl/index.native";
import { ButtonGroup } from "../../../../../design/components/ButtonGroup/native/ButtonGroup.native";
import { Button } from "../../../../../design/components/Button/native/Button.native";
const useStyles = createStyles({
container: {
marginHorizontal: Module712.space.PX_24,
alignItems: "center"
},
image: {
marginVertical: Module712.space.PX_24,
height: 120
},
title: {
textAlign: "center"
},
subtitle: {
textAlign: "center",
marginTop: Module712.space.PX_8
},
buttons: {
marginTop: Module712.space.PX_8
}
});
export default function NotificationReactivationActionSheet(props) {
const location2 = props.location;
const styles = useStyles();
const callback = useCallback(() => {
requestPushNotificationPermission(EventActionType.ALLOW_TO_REQUEST, location2, () => {
ActionSheetActionCreators.hideActionSheet();
});
}, [location2]);
const callback2 = useCallback(() => {
AnalyticsUtils.track(AnalyticEvents.NOTIFICATION_PERMISSION_PREPROMPT_ACKED, {
action_type: EventActionType.SKIP_STEP,
action_location: location2,
permission_granted: void 0
});
ActionSheetActionCreators.hideActionSheet();
}, [location2]);
return <BottomSheet>
<View style={styles.container}>
<Image2 style={styles.image} source={Module16283} resizeMode="contain" />
<Text style={styles.title} variant="heading-xl/bold" accessibilityRole="header">
{intl.string(t.a4bgO0)}
</Text>
<Text style={styles.subtitle} variant="text-sm/medium" color="text-default">
{intl.string(t["rW5gw/"])}
</Text>
<ButtonGroup style={styles.buttons}>
<Button text={intl.string(t.a4bgO0)} onPress={callback} />
<Button text={intl.string(t["/L3kom"])} onPress={callback2} variant="secondary" />
</ButtonGroup>
</View>
</BottomSheet>;
};
@@ -0,0 +1,50 @@
// Metro module 15396 (f15397).
import { useRef, useState, useEffect } from "react";
import SelectedChannelStore from "../../../../../stores/SelectedChannelStore";
import VoiceStateStore from "../../../../../stores/VoiceStateStore";
import { PermissionPromptType } from "../../../../../stores/native/PushNotificationPermissionStore";
import { EventActionLocation, NotificationNudgeSurface } from "./NotificationPermissionConstants";
import NotificationNudgeBottomSheet from "./NotificationNudgeBottomSheet";
import { intl, t } from "../../../../../intl/index.native";
import ContextualOptInNudgeHoldoutExperiment from "../../ContextualOptInNudgeHoldoutExperiment";
import { useCanSeePushNotificationNudge } from "../../NotificationPermissionUtil";
import { useStateFromStores } from "../../../../../_bundle/Module589";
import { useSelectedTimeRecurringDismissibleContent } from "../../../../dismissible_content/hooks/useSelectedDismissibleContent";
import { DismissibleContent } from "../../../../../_bundle/Module1358";
import { setPushPermissionReactivationSeen } from "../../../../../actions/native/PushNotificationActionCreators";
import ActionSheetActionCreators from "../../../../action_sheet/native/ActionSheetActionCreators";
let c10948_11 = "post-call-disconnect-nudge-key";
let c10948_12 = {
cooldownDurationMs: 604800000
};
export default function PostCallDisconnectNudge(props) {
const { markAsDismissed: markAsDismissed2, onHide } = props;
return <NotificationNudgeBottomSheet title={intl.string(t.pJbYq1)} body={intl.string(t.vegtFT)} actionLocation={EventActionLocation.CALL_DISCONNECT} surface={NotificationNudgeSurface.CALL_DISCONNECT_BOTTOM_SHEET} markAsDismissed={markAsDismissed2} onHide={onHide} />;
};
export const POST_CALL_DISCONNECT_NUDGE_KEY = "post-call-disconnect-nudge-key";
export function usePostCallDisconnectNudge() {
let stateFromStores2, ref, c21957_4;
const inHoldout = ContextualOptInNudgeHoldoutExperiment.useConfig({
location: "usePostCallDisconnectNudge"
}).inHoldout;
const canSeePushNotificationNudge = useCanSeePushNotificationNudge();
const stateFromStores = useStateFromStores([VoiceStateStore], () => VoiceStateStore.getCurrentClientVoiceChannelId(null));
stateFromStores2 = useStateFromStores([SelectedChannelStore], () => SelectedChannelStore.getChannelId());
ref = useRef(stateFromStores);
const [state, setState] = useState(false);
useEffect(() => {
const current = ref.current;
ref.current = stateFromStores;
setState(current != null && stateFromStores == null && current === stateFromStores2);
}, [stateFromStores, stateFromStores2]);
let [r55, markAsDismissed] = useSelectedTimeRecurringDismissibleContent(state ? inHoldout ? null : canSeePushNotificationNudge ? DismissibleContent.NOTIFICATION_NUDGE_POST_CALL_DISCONNECT : null : null, c10948_12);
c21957_4 = r55;
useEffect(() => {
if (c21957_4 != null) {
setPushPermissionReactivationSeen(PermissionPromptType.CALL_DISCONNECT_BOTTOM_SHEET);
ActionSheetActionCreators.openLazy(import("./PostCallDisconnectNudge"), c10948_11, {
markAsDismissed
});
}
}, [r55, markAsDismissed]);
}
@@ -0,0 +1,57 @@
// Metro module 14913 (f14914).
import { useCallback } from "react";
import { Image as Image2, View } from "react-native";
import { PermissionStateType } from "../../../../../stores/native/PushNotificationPermissionStore";
import { EventActionLocation, EventActionType } from "./NotificationPermissionConstants";
import { AnalyticEvents } from "../../../../../Constants";
import { createStyles } from "../../../../../design/components/Styles/native/createStyles";
import Module712 from "../../../../../_bundle/Module712";
import { requestPushNotificationPermission, enableProvisionalPushNotification } from "../../NotificationPermissionUtil";
import AnalyticsUtils from "../../../../../utils/AnalyticsUtils";
import { setPushPermissionState } from "../../../../../actions/native/PushNotificationActionCreators";
import NewUserPermissionsOnboarding_android from "../NewUserPermissionsOnboarding.android";
import Module14914 from "../../../../../_bundle/Module14914";
import { intl, t } from "../../../../../intl/index.native";
let useStyles;
const RedesignNotificationModal = function RedesignNotificationModal(props) {
const onComplete = props.onComplete;
const styles = useStyles();
return <View style={styles.container}>
<NewUserPermissionsOnboarding_android onAllow={useCallback(() => {
requestPushNotificationPermission(EventActionType.ALLOW_TO_REQUEST, EventActionLocation.ALERT, () => {
if (onComplete != null) {
onComplete();
}
});
}, [onComplete])} onDontAllow={useCallback(() => {
AnalyticsUtils.track(AnalyticEvents.NOTIFICATION_PERMISSION_PREPROMPT_ACKED, {
action_type: EventActionType.SKIP_STEP,
action_location: EventActionLocation.ALERT
});
setPushPermissionState(PermissionStateType.PROMPT_SKIPPED);
enableProvisionalPushNotification();
if (onComplete != null) {
onComplete(true);
}
}, [onComplete])} header={<Image2 resizeMode="contain" style={styles.notificationHeaderImage} source={Module14914} />} title={intl.string(t["3nx0b5"])} subtitle={intl.string(t.Gf7U1T)} />
</View>;
};
useStyles = createStyles({
container: {
flex: 1,
backgroundColor: Module712.colors.BACKGROUND_BASE_LOW,
marginTop: -Module712.space.PX_48
},
notificationHeaderImage: {
position: "absolute",
alignSelf: "center",
zIndex: 2,
top: -140,
height: 156,
width: 150
}
});
export default RedesignNotificationModal;
export function RedesignNotificationScreen(props) {
return <RedesignNotificationModal onComplete={props.route.params.onComplete} />;
}
@@ -0,0 +1,14 @@
// Metro module 14912 (f14913).
import { PermissionStateType } from "../../../stores/native/PushNotificationPermissionStore";
import { NUF_NOTIFICATION_MODAL_KEY } from "../NUFConstants";
import ModalActionCreators from "../../../actions/ModalActionCreators";
import { setPushPermissionState } from "../../../actions/native/PushNotificationActionCreators";
export function showPushNotificationPromptModal({ onComplete: onComplete2 }) {
ModalActionCreators.pushLazy(import("./components/notification/RedesignNotificationModal"), {
onComplete: function onComplete() {
ModalActionCreators.popWithKey(NUF_NOTIFICATION_MODAL_KEY);
onComplete2();
}
}, NUF_NOTIFICATION_MODAL_KEY);
setPushPermissionState(PermissionStateType.PROMPT_SEEN);
}
@@ -0,0 +1,26 @@
// Metro module 15393 (f15394).
import { useEffect } from "react";
import LoginRequiredActionStore from "../../auth/LoginRequiredActionStore";
import GatewayConnectionStore from "../../gateway/GatewayConnectionStore";
import UserRequiredActionStore from "../../../stores/UserRequiredActionStore";
import PushNotificationPermissionStore from "../../../stores/native/PushNotificationPermissionStore";
import { useStateFromStores } from "../../../_bundle/Module589";
import isActionRequired from "../../core/isActionRequired";
import NotificationUtils from "../../../utils/native/NotificationUtils";
import { useGuildOpenNudge } from "./components/notification/GuildOpenNotificationNudge";
import { usePostCallDisconnectNudge } from "./components/notification/PostCallDisconnectNudge";
export default function useNotificationPermissionPrompt() {
let stateFromStores2;
const stateFromStores = useStateFromStores([GatewayConnectionStore], () => GatewayConnectionStore.isConnected());
stateFromStores2 = useStateFromStores([UserRequiredActionStore, LoginRequiredActionStore], () => isActionRequired(LoginRequiredActionStore, UserRequiredActionStore));
useEffect(() => {
if (stateFromStores && !stateFromStores2) {
if (NotificationUtils.shouldRequestNotification && !PushNotificationPermissionStore.promptSeen) {
NotificationUtils.requestPermission();
NotificationUtils.shouldRequestNotification = false;
}
}
}, [stateFromStores, stateFromStores2]);
useGuildOpenNudge();
usePostCallDisconnectNudge();
};