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,80 @@
// Metro module 7836 (f7837).
import ReferralTrialStore from "../ReferralTrialStore";
import { ContentDismissActionType } from "../../dismissible_content/DismissibleContentConstants";
import Durations from "../../../utils/Durations";
import { intl, t } from "../../../intl/index.native";
import { useIsDismissibleContentDismissed_UNSAFE, UNSAFE_markDismissibleContentAsDismissed, UNSAFE_isDismissibleContentDismissed, UNSAFE_isSnowflakeBoundDismissibleContentDismissed } from "../../dismissible_content/DismissibleContentUnsafeUtils";
import { DismissibleContent } from "../../../_bundle/Module1358";
import SnowflakeUtils from "../../../utils/SnowflakeUtils";
import { markSnowflakeBoundDismissibleContentAsDismissed } from "../../dismissible_content/DismissibleContentUtils";
import { useIsEligibleSenderForReferralProgram } from "./hooks/useIsEligibleSenderForReferralProgram";
import { useStateFromStores } from "../../../_bundle/Module589";
import { useIsReferralReminderDCExperimentEnabled } from "../experiments/ReferralReminderDCExperiment";
export function getReferralTrialOfferExpirationCopy(a0) {
const r10 = (a0 - Date.now()) / Durations.Millis.HOUR;
return r10 > 24 ? intl.formatToPlainString(t["g9s+dA"], {
numDays: Math.floor(r10 / 24)
}) : r10 >= 1 ? intl.formatToPlainString(t.k9v33y, {
numHours: Math.floor(r10)
}) : intl.formatToPlainString(t["/d0GmT"], {
numMinutes: Math.floor(60 * r10)
});
}
export function useIsReferralProgramEntrypointBadgeAcknowledged() {
return useIsDismissibleContentDismissed_UNSAFE(DismissibleContent.REFERRAL_PROGRAM_ENTRYPOINT_NITRO_TAB_BADGE);
}
export function markReferralProgramEntrypointBadgeAcknowledged() {
UNSAFE_markDismissibleContentAsDismissed(DismissibleContent.REFERRAL_PROGRAM_ENTRYPOINT_NITRO_TAB_BADGE);
}
export function isReferralProgramBadgeAcknowledged() {
return UNSAFE_isDismissibleContentDismissed(DismissibleContent.REFERRAL_PROGRAM_NITRO_TAB_BADGE);
}
export function markReferralProgramBadgeAcknowledged() {
UNSAFE_markDismissibleContentAsDismissed(DismissibleContent.REFERRAL_PROGRAM_NITRO_TAB_BADGE);
}
export function useIsReferralProgramBadgeShowable({ trialOffer }) {
if (trialOffer == null) {
return false;
}
let r11 = trialOffer.referrer_id !== void 0;
const redeemed_at = trialOffer.redeemed_at;
const date = new Date(SnowflakeUtils.extractTimestamp(trialOffer.id));
const date2 = new Date();
if (r11) {
r11 = redeemed_at === void 0;
}
if (r11) {
r11 = date2 >= date;
}
return r11;
}
export function markReferralProgramPopoverSeen(a0) {
if (a0 != null) {
markSnowflakeBoundDismissibleContentAsDismissed(DismissibleContent.REFERRAL_PROGRAM_POPOVER_V2, a0, {
dismissAction: ContentDismissActionType.INDIRECT_ACTION
});
} else {
UNSAFE_markDismissibleContentAsDismissed(DismissibleContent.REFERRAL_PROGRAM_POPOVER);
}
}
export function isReferralProgramPopoverSeen() {
return UNSAFE_isDismissibleContentDismissed(DismissibleContent.REFERRAL_PROGRAM_POPOVER);
}
export function useIsReferralProgramPopoverShowable() {
let r14 = useIsEligibleSenderForReferralProgram(false);
const stateFromStores = useStateFromStores([ReferralTrialStore], () => ReferralTrialStore.getReferralsRemaining());
const stateFromStores2 = useStateFromStores([ReferralTrialStore], () => ReferralTrialStore.getReminderStateId());
const r37 = useIsReferralReminderDCExperimentEnabled({
location: "ReferralProgramUtils"
}) ? stateFromStores2 != null && !UNSAFE_isSnowflakeBoundDismissibleContentDismissed(DismissibleContent.REFERRAL_PROGRAM_POPOVER_V2, stateFromStores2).isDismissed : !UNSAFE_isDismissibleContentDismissed(DismissibleContent.REFERRAL_PROGRAM_POPOVER);
if (r14) {
r14 = r37;
}
if (r14) {
r14 = stateFromStores != null;
}
if (r14) {
r14 = stateFromStores > 0;
}
return r14;
}
@@ -0,0 +1,60 @@
// Metro module 15618 (f15619).
import { useMemo } from "react";
import { View } from "react-native";
import { UserSettingsSections } from "../../../../../Constants";
import { ContentDismissActionType } from "../../../../dismissible_content/DismissibleContentConstants";
import { createStyles } from "../../../../../design/components/Styles/native/createStyles";
import FastImage from "../../../../../components_native/common/FastImage";
import Module15619 from "../../../../../_bundle/Module15619";
import { useIsDismissibleContentDismissed_UNSAFE } from "../../../../dismissible_content/DismissibleContentUnsafeUtils";
import { DismissibleContent } from "../../../../../_bundle/Module1358";
import { useIsEligibleSenderForReferralProgram } from "../useIsEligibleSenderForReferralProgram";
import { useSelectedDismissibleContent } from "../../../../dismissible_content/hooks/useSelectedDismissibleContent";
import { intl, t } from "../../../../../intl/index.native";
import { isYouNavFloating } from "../../../../main_tabs_v2/native/tabs/you/YouNavFloatingExperiment";
import Module712 from "../../../../../_bundle/Module712";
import { openUserSettings } from "../../../../user_settings/core/native/openUserSettings";
let useStyles;
const ReferralProgramCoachmarkImg = function ReferralProgramCoachmarkImg() {
const styles = useStyles();
return <View style={styles.coachmarkImageContainer}>
<FastImage source={Module15619} style={styles.coachmarkImage} />
</View>;
};
useStyles = createStyles({
coachmarkImageContainer: {
alignItems: "center",
justifyContent: "center"
},
coachmarkImage: {
width: 200,
height: 112
}
});
export function useReferralProgramCoachmark({ disabled }) {
const [r31, r32] = useSelectedDismissibleContent(useIsEligibleSenderForReferralProgram(useIsDismissibleContentDismissed_UNSAFE(DismissibleContent.REFERRAL_TRIAL_MOBILE_SENDER_COACHMARK) || disabled) && !disabled ? [DismissibleContent.REFERRAL_TRIAL_MOBILE_SENDER_COACHMARK] : []);
let c22250_0 = r32;
const visible = r31 === DismissibleContent.REFERRAL_TRIAL_MOBILE_SENDER_COACHMARK;
const memo = useMemo(() => ({
title: intl.string(t.USo4s7),
description: intl.string(t.zmcRl4),
position: isYouNavFloating() ? "top" : "bottom",
offsetY: isYouNavFloating() ? Module712.space.PX_12 : void 0,
visible,
onDismiss: () => {
c22250_0(ContentDismissActionType.USER_DISMISS);
},
buttonVariant: "experimental_premium-primary",
buttonLabel: intl.string(t.RzWDqY),
onButtonPress: () => {
openUserSettings({
screen: UserSettingsSections.PREMIUM
});
c22250_0(ContentDismissActionType.TAKE_ACTION);
},
renderImgComponent: () => <ReferralProgramCoachmarkImg />
}), [visible, r32]);
return visible ? {
props: memo
} : null;
}
@@ -0,0 +1,8 @@
// Metro module 7837 (f7838).
import ReferralTrialStore from "../../ReferralTrialStore";
import { useMaybeFetchReferralsRemaining } from "./useMaybeFetchReferralsRemaining";
import { useStateFromStores } from "../../../../_bundle/Module589";
export function useIsEligibleSenderForReferralProgram(r7 = false) {
useMaybeFetchReferralsRemaining(r7);
return useStateFromStores([ReferralTrialStore], () => ReferralTrialStore.getIsEligibleToSendReferrals());
}
@@ -0,0 +1,26 @@
// Metro module 7838 (f7839).
import { useEffect } from "react";
import UserStore from "../../../../stores/UserStore";
import ReferralTrialStore from "../../ReferralTrialStore";
import { FractionalPremiumStates, PremiumTypes } from "../../PremiumConstants";
import { useStateFromStores } from "../../../../_bundle/Module589";
import { useHasDiscountApplied } from "../../PremiumSubscriptionOfferUtil";
import { useHasActiveTrial } from "../../PremiumSubscriptionTrialUtil";
import useFractionalPremiumInfo from "../../../billing/hooks/useFractionalPremiumInfo";
import { isPremiumExactly } from "../../../../utils/PremiumTypeUtils";
export function useMaybeFetchReferralsRemaining(r6 = false) {
let c16032_1;
let c16032_0 = r6;
c16032_1 = void 0;
const stateFromStores = useStateFromStores([UserStore], () => UserStore.getCurrentUser());
const hasDiscountApplied = useHasDiscountApplied();
const hasActiveTrial = useHasActiveTrial();
const fractionalPremiumInfo = useFractionalPremiumInfo();
const r30 = stateFromStores?.verified === true && isPremiumExactly(stateFromStores, PremiumTypes.TIER_2) && fractionalPremiumInfo.fetched && fractionalPremiumInfo.fractionalState !== FractionalPremiumStates.FP_ONLY && !hasDiscountApplied && !hasActiveTrial;
c16032_1 = r30;
useEffect(() => {
if (c16032_1 && !c16032_0) {
ReferralTrialStore.checkAndFetchReferralsRemaining();
}
}, [r30, r6]);
}
@@ -0,0 +1,21 @@
// Metro module 12474 (f12475).
import { useEffect } from "react";
import UserStore from "../../../../stores/UserStore";
import ReferralTrialStore from "../../ReferralTrialStore";
import { useStateFromStoresArray, useStateFromStores } from "../../../../_bundle/Module589";
import { getUser } from "../../../../actions/UserActionCreators";
export const MAX_REFERRALS_SENT = 3;
export function useReferralProgramBannerDetails() {
const stateFromStoresArray = useStateFromStoresArray([ReferralTrialStore], () => ReferralTrialStore.getSentUserIds());
const stateFromStoresArray2 = useStateFromStoresArray([UserStore], () => stateFromStoresArray.map((item) => UserStore.getUser(item)).filter((item) => item != null));
useEffect(() => {
stateFromStoresArray.forEach((item) => {
getUser(item);
});
}, [stateFromStoresArray]);
return {
referralSentUsers: stateFromStoresArray2,
hasSentAllReferrals: stateFromStoresArray.length === 3,
refreshAt: useStateFromStores([ReferralTrialStore], () => ReferralTrialStore.getRefreshAt())
};
}
@@ -0,0 +1,421 @@
// Metro module 12477 (f12478).
import _slicedToArray from "../../../../_bundle/_slicedToArray";
import { useState, useRef, useEffect } from "react";
import ReferralTrialStore from "../../ReferralTrialStore";
import { useStateFromStores } from "../../../../_bundle/Module589";
import Module38 from "../../../../_bundle/Module38";
import { ReferralOfferStatus, fetchReferralEligibleUsers } from "../../ReferralTrialActionCreators";
import { getUser } from "../../../../actions/UserActionCreators";
import { HermesBuiltin } from "../../../../_hermes/prelude";
function $mk118353($env) {
return (a0) => {
let r28;
const r6 = $env;
const r4 = $env.$parent;
let env32032 = {
$parent: r4
};
r6[2] = r6[2].filter($mk118891(r4));
env32032[0] = new Set(r6[2].map((item) => item.id));
const r26 = r6[7].users.filter((user) => {
const r7 = env32032.$parent[1].has(user.id);
return r7 ? !r7 : !env32032[0].has(user.id);
});
if (r6[0] === 0) {
const r35 = r4[1].values();
const r36 = [];
const r39 = HermesBuiltin.arraySpread(r36, r35, 0);
HermesBuiltin.arraySpread(r36, r26, HermesBuiltin.arraySpread(r36, r6[2].values(), r39));
r28 = r36;
} else {
r28 = [...a0, ...r26];
}
return r28;
};
}
function $mk118354($env) {
return (a0) => {
const map = new Map(a0);
for (const item of $env[2]) {
map.set(item.id, item);
}
return map;
};
}
function $mk118891($env) {
return (a0) => !$env[1].has(a0.id);
}
let env8623 = {};
export function useReferralProgramEligibleUsers(a0) {
let env19859 = {
$parent: env8623
};
const searchQuery = a0.searchQuery;
env19859[0] = searchQuery;
env19859[1] = a0.selectedUsers;
const limit = a0.limit;
env19859[2] = limit;
env19859[3] = void 0;
env19859[4] = void 0;
env19859[5] = void 0;
env19859[6] = void 0;
env19859[7] = void 0;
env19859[8] = void 0;
env19859[9] = void 0;
env19859[10] = void 0;
env19859[11] = void 0;
env19859[12] = void 0;
env19859[13] = void 0;
env19859[17] = void 0;
env19859[18] = void 0;
env19859[14] = function _getLocalReferrals() {
const r9 = async () => {
let r29;
let c31657_0, c31657_1, c31657_2, c31657_3, c31657_4;
let c30522_0, c30522_1, c30522_4;
let c30522_5 = 0;
L23: {
L22: {
try {
c31657_0 = void 0;
c31657_1 = void 0;
c31657_2 = void 0;
c31657_3 = void 0;
c31657_4 = void 0;
c31657_0 = new Map();
const r42 = env19859[3];
c30522_1 = r42;
const r44 = r42[Symbol.iterator]();
c30522_1 = r44.next;
c30522_0 = r44;
while (true) {
const r46 = c30522_1;
let r47 = c30522_0;
const r48 = r47 === void 0 ? void 0 : (r29 = r46.call(r47)).done ? r47 = void 0 : r29.value;
c30522_0 = r47;
if (r47 === void 0) {
(0, env19859[13])(c31657_0);
(0, env19859[7])(Array.from(c31657_0.values()));
break L23;
}
c30522_5 = 1;
c31657_1 = r48;
c31657_2 = (0, _slicedToArray)(c31657_1, 2);
c31657_3 = c31657_2[0];
if (c31657_2[1] === ReferralOfferStatus.PENDING && !env19859[12].has(c31657_3)) {
let r98 = await getUser(c31657_3);
loop14: while (true) {
c31657_4 = r98;
c31657_0.set(c31657_4.id, c31657_4);
while (true) {
c30522_5 = 0;
const r116 = c30522_1;
let r117 = c30522_0;
const r118 = r117 === void 0 ? void 0 : (r29 = r116.call(r117)).done ? r117 = void 0 : r29.value;
c30522_0 = r117;
if (r117 === void 0) {
(0, env19859[13])(c31657_0);
(0, env19859[7])(Array.from(c31657_0.values()));
break L22;
}
c30522_5 = 1;
c31657_1 = r118;
c31657_2 = (0, _slicedToArray)(c31657_1, 2);
c31657_3 = c31657_2[0];
if (c31657_2[1] === ReferralOfferStatus.PENDING && !env19859[12].has(c31657_3)) {
r98 = await getUser(c31657_3);
continue loop14;
}
}
}
}
c30522_5 = 0;
}
} catch ($e) {
const r37 = $e;
let r7 = r37;
c30522_4 = r37;
if (c30522_5 !== 0) {
while (true) {
try {
const r185 = c30522_4;
c30522_5 = 0;
const r187 = c30522_0;
if (r187 !== void 0 && typeof r187.return === "function") {
try {
r187.return();
} catch {}
}
throw r185;
} catch (r183) {
r7 = r183;
c30522_4 = r183;
if (c30522_5 === 0) {
break;
}
}
}
}
throw r7;
}
}
return void 0;
}
};
env19859[14] = r9;
return r9.apply(this, arguments);
};
const getNextRows = function getNextRows(a0, a1) {
return env19859[16].apply(this, arguments);
};
env19859[15] = getNextRows;
env19859[16] = function _getNextRows() {
const r9 = async (c30523_0, c30523_1) => {
let r34, r148;
let c30523_2, c30523_3, c30523_4, c30523_5, c30523_6, c30523_7;
let c30523_8 = 0;
const r10 = env19859;
L43: {
L38: {
try {
let env31658;
c30523_6 = r10;
const r18 = env31658 = {
$parent: r10
};
c30523_5 = r18;
env31658[0] = c30523_0;
env31658[1] = c30523_1;
env31658[2] = void 0;
env31658[3] = void 0;
env31658[4] = void 0;
env31658[5] = void 0;
env31658[6] = void 0;
env31658[7] = void 0;
if (env19859[8]) {
break L43;
}
if (env19859[10]) {
break L43;
}
if (c30523_0 == null) {
break L43;
}
if (env19859[4] === 0) {
break L43;
}
c30523_8 = 2;
(0, env19859[9])(true);
c30523_2 = 0;
const r23 = env19859[12].values();
const r57 = [];
c30523_2 = HermesBuiltin.arraySpread(r57, r23, c30523_2);
env31658[2] = r57;
const r59 = env19859[3];
c30523_4 = r59;
const r61 = r59[Symbol.iterator]();
c30523_4 = r61.next;
c30523_3 = r61;
while (true) {
const r63 = c30523_4;
let r64 = c30523_3;
const r65 = r64 === void 0 ? void 0 : (r34 = r63.call(r64)).done ? r64 = void 0 : r34.value;
c30523_3 = r64;
if (r64 === void 0) {
const referralEligibleUsers = await fetchReferralEligibleUsers(env31658[0], env19859[0], env31658[1]);
const r308 = c30523_5;
env31658[7] = referralEligibleUsers;
(0, env19859[7])($mk118353(r308));
(0, env19859[13])($mk118354(r308));
(0, env19859[6])(env31658[7].nextIndex);
c30523_8 = 1;
c30523_8 = 0;
(0, env19859[9])(false);
break L38;
}
c30523_8 = 3;
env31658[3] = r65;
env31658[4] = (0, _slicedToArray)(env31658[3], 2);
env31658[5] = env31658[4][0];
if (env31658[4][1] === ReferralOfferStatus.PENDING && !env19859[12].has(env31658[5])) {
env31658[6] = await getUser(env31658[5]);
env31658[2].push(env31658[6]);
while (true) {
c30523_8 = 2;
L34: {
const r134 = c30523_4;
let r135 = c30523_3;
const r136 = r135 === void 0 ? void 0 : (r34 = r134.call(r135)).done ? r135 = void 0 : r34.value;
c30523_3 = r135;
if (r135 === void 0) {
r148 = fetchReferralEligibleUsers(env31658[0], env19859[0], env31658[1]);
} else {
c30523_8 = 3;
env31658[3] = r136;
env31658[4] = (0, _slicedToArray)(env31658[3], 2);
env31658[5] = env31658[4][0];
if (env31658[4][1] !== ReferralOfferStatus.PENDING) {
continue;
}
if (env19859[12].has(env31658[5])) {
continue;
}
let r181 = getUser(env31658[5]);
loop26: while (true) {
env31658[6] = await r181;
env31658[2].push(env31658[6]);
while (true) {
c30523_8 = 2;
const r207 = c30523_4;
let r208 = c30523_3;
const r209 = r208 === void 0 ? void 0 : (r34 = r207.call(r208)).done ? r208 = void 0 : r34.value;
c30523_3 = r208;
if (r208 === void 0) {
r148 = fetchReferralEligibleUsers(env31658[0], env19859[0], env31658[1]);
break L34;
}
c30523_8 = 3;
env31658[3] = r209;
env31658[4] = (0, _slicedToArray)(env31658[3], 2);
env31658[5] = env31658[4][0];
if (env31658[4][1] === ReferralOfferStatus.PENDING && !env19859[12].has(env31658[5])) {
r181 = getUser(env31658[5]);
continue loop26;
}
}
}
}
}
const r40 = await r148;
const r273 = c30523_5;
env31658[7] = r40;
(0, env19859[7])($mk118353(r273));
(0, env19859[13])($mk118354(r273));
(0, env19859[6])(env31658[7].nextIndex);
c30523_8 = 1;
c30523_8 = 0;
(0, env19859[9])(false);
break L38;
}
}
c30523_8 = 2;
}
break L43;
} catch ($e) {
const r46 = $e;
let r7 = r46;
c30523_7 = r46;
let r47 = c30523_8;
if (r47 !== 0) {
while (true) {
if (r47 === 1) {
try {
const r346 = c30523_7;
c30523_8 = 0;
(0, env19859[9])(false);
throw r346;
} catch (r344) {
r7 = r344;
c30523_7 = r344;
r47 = c30523_8;
if (r47 === 0) {
break;
}
}
} else if (r47 === 2) {
try {
c30523_8 = 1;
(0, env19859[11])(true);
c30523_8 = 0;
(0, env19859[9])(false);
break L38;
} catch (r333) {
r7 = r333;
c30523_7 = r333;
r47 = c30523_8;
if (r47 === 0) {
break;
}
}
} else {
try {
const r328 = c30523_7;
c30523_8 = 2;
const r330 = c30523_3;
if (r330 !== void 0 && typeof r330.return === "function") {
try {
r330.return();
} catch {}
}
throw r328;
} catch (r327) {
r7 = r327;
c30523_7 = r327;
r47 = c30523_8;
if (r47 === 0) {
break;
}
}
}
}
}
throw r7;
}
}
return void 0;
}
};
env19859[16] = r9;
return r9.apply(this, arguments);
};
env19859[3] = useStateFromStores([ReferralTrialStore], () => ReferralTrialStore.getRecipientStatus());
const stateFromStores = useStateFromStores([ReferralTrialStore], () => ReferralTrialStore.getReferralsRemaining());
env19859[4] = stateFromStores;
const r37 = _slicedToArray(useState(0), 2);
env19859[5] = r37[0];
env19859[6] = r37[1];
const r43 = _slicedToArray(useState([]), 2);
const eligibleUsers = r43[0];
env19859[7] = r43[1];
const r48 = _slicedToArray(useState(false), 2);
const isFetching = r48[0];
env19859[8] = isFetching;
env19859[9] = r48[1];
const r53 = _slicedToArray(useState(false), 2);
const hasError = r53[0];
env19859[10] = hasError;
env19859[11] = r53[1];
const r61 = _slicedToArray(useState(new Map()), 2);
const resendUsers = r61[0];
env19859[12] = resendUsers;
env19859[13] = r61[1];
Module38(stateFromStores != null, "Referrals remaining should not be null");
const r71 = {
limit,
getNextRows,
getLocalReferrals: function getLocalReferrals() {
return env19859[14].apply(this, arguments);
}
};
env19859[17] = r71;
env19859[18] = useRef(r71);
useEffect(() => {
env19859[18].current = env19859[17];
});
useEffect(() => {
const current = env19859[18].current;
const { getNextRows: getNextRows2, limit, getLocalReferrals: getLocalReferrals2 } = current;
if (env19859[4] > 0) {
getNextRows2(0, limit);
} else {
getLocalReferrals2();
}
}, [searchQuery, stateFromStores]);
return {
eligibleUsers,
fetchUsers: () => (0, env19859[15])(env19859[5], env19859[2]),
hasError,
isFetching,
resendUsers
};
}
@@ -0,0 +1,46 @@
// Metro module 12482 (f12483).
import { View } from "react-native";
import { createStyles } from "../../../../design/components/Styles/native/createStyles";
import { useToken } from "../../../../design/tokens/native/useToken";
import Module712 from "../../../../_bundle/Module712";
import { MAX_REFERRALS_SENT } from "../hooks/useReferralProgramBannerDetails";
import FastImage from "../../../../components_native/common/FastImage";
import Module12483 from "../../../../_bundle/Module12483";
import Module8531, { Circle } from "../../../../_bundle/Module8531";
import Module12484 from "../../../../_bundle/Module12484";
const width = 160;
const strokeDasharray = 2 * Math.PI * 77;
const useStyles = createStyles({
progressCircleContainer: {
width: 160,
height: 160,
alignItems: "center",
justifyContent: "center",
marginTop: 24
},
progressCircleImage: {
position: "absolute",
width: 93,
height: 93,
borderRadius: 46.5
},
glowImage: {
position: "absolute",
width: 180,
height: 180
}
});
export default function ProgressWheel(props) {
const nReferralsSent = props.nReferralsSent;
const styles = useStyles();
return <View style={styles.progressCircleContainer}>
{nReferralsSent === MAX_REFERRALS_SENT && <FastImage source={Module12483} style={styles.glowImage} />}
<Module8531 width={width} height={width}>
<Circle cx={80} cy={80} r={77} stroke={useToken(Module712.colors.BACKGROUND_MOD_STRONG)} strokeWidth={6} fill={useToken(Module712.colors.BACKGROUND_SURFACE_HIGH)} />
<Circle cx={80} cy={80} r={77} stroke="#53ac66" strokeWidth={6} fill="transparent" strokeDasharray={strokeDasharray} strokeDashoffset={strokeDasharray * (1 - 33.3 * nReferralsSent / 100)} strokeLinecap="round" rotation={-90} origin="80, 80" />
</Module8531>
<FastImage source={{
uri: Module12484
}} style={styles.progressCircleImage} />
</View>;
};
@@ -0,0 +1,137 @@
// Metro module 12473 (f12474).
import { useCallback } from "react";
import { View } from "react-native";
import ReferralTrialStore from "../../ReferralTrialStore";
import { AnalyticEvents, HelpdeskArticles } from "../../../../Constants";
import { createStyles } from "../../../../design/components/Styles/native/createStyles";
import Module712 from "../../../../_bundle/Module712";
import { Avatar, AvatarSizes } from "../../../../design/void/native";
import { Text } from "../../../../design/components/Text/native/Text";
import { MAX_REFERRALS_SENT, useReferralProgramBannerDetails } from "../hooks/useReferralProgramBannerDetails";
import { intl, t } from "../../../../intl/index.native";
import HelpdeskUtils from "../../../../utils/HelpdeskUtils";
import { useStateFromStores } from "../../../../_bundle/Module589";
import useAnalyticsLocations from "../../../app_analytics/useAnalyticsLocations";
import AnalyticsLocation from "../../../app_analytics/AnalyticsLocation";
import { ReferralOfferStatus } from "../../ReferralTrialActionCreators";
import AnalyticsUtils from "../../../../utils/AnalyticsUtils";
import ActionSheetActionCreators from "../../../action_sheet/native/ActionSheetActionCreators";
import ProgressWheel from "./ProgressWheel";
import { Button } from "../../../../design/components/Button/native/Button.native";
let useStyles, AvailableReferralSlot, ProgressIndicator;
const ReferredFriendAvatar = function ReferredFriendAvatar(props) {
const user = props.user;
return <View style={useStyles().referredFriendAvatar}>
<Avatar source={user.getAvatarSource(void 0, false, 24)} size={AvatarSizes.XSMALL} />
</View>;
};
AvailableReferralSlot = function AvailableReferralSlot(props) {
const slotIndex = props.slotIndex;
return <View style={useStyles().availableReferralSlot}>
<Text variant="text-xs/medium" color="text-strong">{slotIndex}</Text>
</View>;
};
ProgressIndicator = function ProgressIndicator(props) {
const referralSentUsers = props.referralSentUsers;
const styles = useStyles();
const r10 = [];
let r0 = 0;
if (0 < MAX_REFERRALS_SENT) {
do {
const r21 = referralSentUsers[r0];
const key = r0;
if (r21 != null) {
r10.push(<ReferredFriendAvatar key={referralSentUsers[key].id} user={referralSentUsers[key]} />);
} else {
r10.push(<AvailableReferralSlot key={key} slotIndex={key + 1} />);
}
r0 = key + 1;
} while (r0 < MAX_REFERRALS_SENT);
}
return <View style={styles.progressIndicatorContainer}>{r10}</View>;
};
useStyles = createStyles({
container: {
width: 320,
borderRadius: Module712.radii.sm,
backgroundColor: Module712.colors.BACKGROUND_SURFACE_HIGH,
alignItems: "center",
...Module712.shadows.SHADOW_LOW
},
progressIndicatorContainer: {
flexDirection: "row",
alignItems: "center",
alignSelf: "flex-start",
gap: 8,
marginTop: 16,
marginLeft: 24
},
availableReferralSlot: {
width: 24,
height: 24,
borderRadius: Module712.radii.xxl,
backgroundColor: Module712.colors.BACKGROUND_MOD_STRONG,
justifyContent: "center",
alignItems: "center"
},
referredFriendAvatar: {
borderWidth: 2,
borderColor: Module712.colors.BACKGROUND_SURFACE_HIGH,
borderRadius: Module712.radii.round
},
contentContainer: {
alignItems: "flex-start",
paddingHorizontal: 24,
gap: 8,
marginTop: 12
},
heading: {
textAlign: "left"
},
bodyText: {
textAlign: "left"
},
buttonContainer: {
paddingHorizontal: Module712.space.PX_16,
width: "100%",
marginTop: Module712.space.PX_24,
marginBottom: Module712.space.PX_16
}
});
export function ReferralProgramPerkCard() {
let analyticsLocations;
const styles = useStyles();
const referralSentUsers = useReferralProgramBannerDetails().referralSentUsers;
const stateFromStores2 = useStateFromStores([ReferralTrialStore], () => ReferralTrialStore.getRecipientStatus());
const stateFromStores = useStateFromStores([ReferralTrialStore], () => ReferralTrialStore.getHasEligibleFriends());
analyticsLocations = useAnalyticsLocations(AnalyticsLocation.PREMIUM_MARKETING_REFERALL_PROGRAM_PROGRESS_BAR).analyticsLocations;
const r22 = stateFromStores2.size === MAX_REFERRALS_SENT && [...stateFromStores2.values()].every((item) => item === ReferralOfferStatus.REDEEMED);
const size = stateFromStores2.size;
const callback = useCallback(() => {
AnalyticsUtils.track(AnalyticEvents.REFERRAL_PROGRAM_SHARE_MODAL_CTA_CLICKED, {
location_stack: analyticsLocations
});
ActionSheetActionCreators.openLazy(import("./ReferralProgramShareActionSheet"), "referral-program-share-action-sheet");
}, [analyticsLocations]);
const r77 = [<ProgressWheel nReferralsSent={stateFromStores2.size} />, <ProgressIndicator referralSentUsers={referralSentUsers} />, , ,];
const r94 = [<Text variant="heading-lg/semibold" color="text-strong" style={styles.heading}>
{intl.string(t.USo4s7)}
</Text>, ,];
const length = referralSentUsers.length;
r94[1] = <Text variant="text-md/medium" color="text-subtle" style={styles.bodyText}>
{stateFromStores !== false ? length === MAX_REFERRALS_SENT ? r22 ? intl.format(t["1aEjsH"], {
helpdeskArticle: HelpdeskUtils.getArticleURL(HelpdeskArticles.REFERRAL_PROGRAM)
}) : intl.format(t["+u3AOO"], {
helpdeskArticle: HelpdeskUtils.getArticleURL(HelpdeskArticles.REFERRAL_PROGRAM)
}) : intl.format(t["omMr+V"], {
helpdeskArticle: HelpdeskUtils.getArticleURL(HelpdeskArticles.REFERRAL_PROGRAM)
}) : intl.format(t["zWhX/Q"], {
helpdeskArticle: HelpdeskUtils.getArticleURL(HelpdeskArticles.REFERRAL_PROGRAM)
})}
</Text>;
r77[2] = <View style={styles.contentContainer}>{r94}</View>;
r77[3] = <View style={styles.buttonContainer}>
<Button variant="primary" size="sm" disabled={stateFromStores === false || size === MAX_REFERRALS_SENT} text={intl.string(t.Lm2nFc)} onPress={callback} />
</View>;
return <View style={styles.container}>{r77}</View>;
}
@@ -0,0 +1,278 @@
// Metro module 12475 (f12476).
import _slicedToArray from "../../../../_bundle/_slicedToArray";
import { useRef, useState, useMemo, useLayoutEffect, useCallback } from "react";
import { View } from "react-native";
import UserStore from "../../../../stores/UserStore";
import ReferralTrialStore from "../../ReferralTrialStore";
import { AnalyticEvents } from "../../../../Constants";
import { createStyles } from "../../../../design/components/Styles/native/createStyles";
import Module712 from "../../../../_bundle/Module712";
import { useStateFromStores } from "../../../../_bundle/Module589";
import useDebounce from "../../../../hooks/useDebounce";
import Module38 from "../../../../_bundle/Module38";
import { isNotNullish } from "../../../../utils/GlobalUtils";
import makeUserListPillData from "../../../main_tabs_v2/native/shared_components/user_list/makeUserListPillData";
import { useReferralProgramEligibleUsers } from "../hooks/useReferralProgramEligibleUsers";
import { intl, t } from "../../../../intl/index.native";
import { AccessibilityAnnouncer } from "../../../../_bundle/Module3902";
import { buildReferralUserRow } from "./ReferralProgramShareActionSheetUtils";
import useAnalyticsLocations from "../../../app_analytics/useAnalyticsLocations";
import AnalyticsLocation from "../../../app_analytics/AnalyticsLocation";
import AnalyticsUtils from "../../../../utils/AnalyticsUtils";
import { createReferralTrials } from "../../ReferralTrialActionCreators";
import ActionSheetActionCreators from "../../../action_sheet/native/ActionSheetActionCreators";
import "../../../../_bundle/asyncRequire";
import { presentError } from "../../../toast/native/ToastUtils";
import { BottomSheetTitleHeader } from "../../../../design/components/Sheet/native/BottomSheetTitleHeader.native";
import { Text } from "../../../../design/components/Text/native/Text";
import FastImage from "../../../../components_native/common/FastImage";
import Module12480 from "../../../../_bundle/Module12480";
import Module12481 from "../../../../_bundle/Module12481";
import { useUserListActionsProps } from "../../../main_tabs_v2/native/shared_components/user_list/SearchableUserListActions";
import { ActivityIndicator } from "../../../../design/components/ActivityIndicator/native/ActivityIndicator.native";
import { Button } from "../../../../design/components/Button/native/Button.native";
import { BottomSheet } from "../../../../design/components/Sheet/native/BottomSheet.native";
import TagListInput_native from "../../../../design/components/TagListInput/native/TagListInput.native";
import { UsersFastList } from "../../../main_tabs_v2/native/shared_components/user_list/UsersFastList";
let useStyles;
let env8621 = {};
const mapToUser = function mapToUser(a0) {
return [a0, UserStore.getUser(a0)];
};
useStyles = createStyles({
searchBarContainer: {
paddingHorizontal: Module712.space.PX_16,
paddingBottom: Module712.space.PX_24
},
searchBarRowContainer: {
paddingTop: Module712.space.PX_8
},
header: {
height: Module712.space.PX_64
},
subtitle: {
textAlign: "center",
paddingHorizontal: Module712.space.PX_16,
paddingBottom: Module712.space.PX_8
},
centeredContainer: {
alignItems: "center"
},
errorImage: {
height: 200,
width: 180,
marginVertical: Module712.space.PX_16
},
emptyImage: {
height: 200,
width: 240,
marginTop: Module712.space.PX_16
},
footer: {
paddingHorizontal: Module712.space.PX_16,
paddingBottom: Module712.space.PX_48
}
});
export default function ReferralProgramShareActionSheet() {
let c19857_0;
let env19856 = {
$parent: env8621
};
const styles = useStyles();
const ref = useRef(null);
env19856[0] = ref;
const stateFromStores = useStateFromStores([ReferralTrialStore], () => ReferralTrialStore.getReferralsRemaining());
env19856[1] = stateFromStores;
const [state, onChangeText] = useState("");
const r49 = _slicedToArray(useState([]), 2);
const r30 = r49[0];
env19856[2] = r30;
env19856[3] = r49[1];
const debounce = useDebounce(state, 400);
const r56 = _slicedToArray(useState(false), 2);
let loading = r56[0];
env19856[4] = r56[1];
Module38(stateFromStores != null, "Referrals remaining should not be null");
const memo = useMemo(() => {
const r3 = Map;
const r5 = env19856[2];
return new r3(r5 == null ? void 0 : r5.map(mapToUser));
}, [r30]);
env19856[5] = memo;
const memo3 = useMemo(() => Array.from(env19856[5].values()).filter(isNotNullish).map(makeUserListPillData), [memo]);
env19856[6] = memo3;
useLayoutEffect(() => {
const current = env19856[0].current;
if (current != null) {
current.scrollToTop(false);
}
}, [state]);
const referralProgramEligibleUsers = useReferralProgramEligibleUsers({
searchQuery: debounce,
selectedUsers: memo,
limit: 15
});
const eligibleUsers = referralProgramEligibleUsers.eligibleUsers;
env19856[7] = eligibleUsers;
const fetchUsers = referralProgramEligibleUsers.fetchUsers;
env19856[8] = fetchUsers;
const isFetching = referralProgramEligibleUsers.isFetching;
env19856[9] = isFetching;
const hasError = referralProgramEligibleUsers.hasError;
env19856[10] = hasError;
const resendUsers = referralProgramEligibleUsers.resendUsers;
env19856[11] = resendUsers;
const memo4 = useMemo(() => env19856[2].filter((item) => !env19856[11].has(item)), [r30, resendUsers]);
env19856[12] = memo4;
const memo2 = useMemo(() => env19856[9] && !env19856[10] && env19856[7].length === 0, [isFetching, hasError, eligibleUsers]);
const r34 = intl.string(t.DXgoi2);
const callback2 = useCallback((c27293_0) => {
(0, env19856[3])((a0) => {
const indexOf = a0.indexOf;
const r9 = indexOf.call(a0, c27293_0.id);
const r10 = [...a0];
if (r9 === -1) {
r10.push(c27293_0.id);
} else {
r10.splice(r9, 1);
}
return r10;
});
}, []);
env19856[13] = callback2;
const callback = useCallback((a0) => {
const r7 = env19856[6][a0];
const user = UserStore.getUser(r7.id);
if (user != null) {
(0, env19856[13])(user);
AccessibilityAnnouncer.announce(intl.formatToPlainString(t.srlxB8, {
text: r7.text
}));
}
}, [callback2, memo3]);
const memo5 = useMemo(() => [env19856[7].length], [eligibleUsers]);
const callback3 = useCallback(() => ({
type: "section",
props: {
hideTitle: true
}
}), []);
const callback4 = useCallback((a0, a1) => buildReferralUserRow({
eligibleUsers: env19856[7],
row: a1,
selectedUserIds: env19856[2],
resendUsers: env19856[11],
referralsRemaining: env19856[1],
selectedNotResendUsers: env19856[12],
onSelectUser: env19856[13]
}), [eligibleUsers, callback2, r30, resendUsers, stateFromStores, memo4]);
const analyticsLocations = useAnalyticsLocations(AnalyticsLocation.PREMIUM_MARKETING_REFERALL_PROGRAM_SHARE_MODAL).analyticsLocations;
env19856[14] = analyticsLocations;
c19857_0 = void 0;
c19857_0 = async (c30521_0) => {
let c30521_1, c30521_2;
let c30521_3 = 0;
const r15 = void 0;
L10: {
try {
let env31656;
c30521_2 = r15;
const r31 = env31656 = {};
c30521_1 = r31;
env31656[0] = c30521_0;
env31656[1] = void 0;
c30521_3 = 1;
(0, env19856[4])(true);
AnalyticsUtils.track(AnalyticEvents.REFERRAL_PROGRAM_SHARE_CTA_CLICKED, {
location_stack: env19856[14]
});
env31656[1] = await createReferralTrials(c30521_0.map((item) => item.id));
(0, env19856[4])(false);
ActionSheetActionCreators.openLazy(import("./ReferralProgramShareConfirmationActionSheet"), "referral-program-share-action-sheet", {
selectedUsers: env31656[0],
trialCreationResult: env31656[1]
});
c30521_3 = 0;
} catch ($e) {
let r30 = $e;
if (c30521_3 !== 0) {
while (true) {
try {
c30521_3 = 0;
(0, env19856[4])(false);
presentError(intl.string(t.R0RpRX));
break L10;
} catch ($e) {
r30 = $e;
if (c30521_3 === 0) {
break;
}
}
}
}
throw r30;
}
}
};
env19856[15] = useCallback(function() {
return c19857_0.apply(this, arguments);
}, [analyticsLocations]);
const r144 = <View style={styles.header}>
<BottomSheetTitleHeader title={useMemo(() => env19856[1] === 0 ? intl.string(t.SY9tyI) : intl.string(t["2dVCLl"]), [stateFromStores])} />
<Text variant="text-xs/medium" color="text-default" lineClamp={2} style={styles.subtitle}>{r34}</Text>
</View>;
const header = hasError ? <View style={styles.centeredContainer}>
<FastImage source={{
uri: Module12480
}} resizeMode="contain" style={styles.errorImage} />
<Text variant="heading-xl/bold" style={styles.subtitle}>
{intl.string(t.a9HOKg)}
</Text>
<Text variant="text-md/medium" color="text-default" style={styles.subtitle}>
{intl.string(t.JjjeZb)}
</Text>
</View> : eligibleUsers.length === 0 && debounce.length > 0 ? <View style={styles.centeredContainer}>
<FastImage source={{
uri: Module12481
}} resizeMode="contain" style={styles.emptyImage} />
<Text variant="heading-xl/bold" style={styles.subtitle}>
{intl.string(t["PFp+aJ"])}
</Text>
<Text variant="text-md/medium" color="text-default" style={styles.subtitle}>
{intl.string(t.eBIGB4)}
</Text>
</View> : r144;
const userListActionsProps = useUserListActionsProps({
actions: [],
style: state.trim().length > 0 ? void 0 : styles.searchBarRowContainer
});
const { renderHeader, headerSize } = userListActionsProps;
const callback5 = useCallback((a0) => {
if (a0.nativeEvent.contentOffset.y + a0.nativeEvent.layoutMeasurement.height >= a0.nativeEvent.contentSize.height - 150) {
(0, env19856[8])();
}
}, [fetchUsers]);
const r254 = <ActivityIndicator />;
const props = {
size: "lg",
text: intl.string(t.ItpQxk),
onPress: () => {
(0, env19856[15])(Array.from(env19856[5].values()));
},
loading,
disabled: null
};
if (!loading) {
loading = r30.length === 0;
}
props.disabled = loading;
return <BottomSheet scrollable startExpanded header={header} footer={<View style={[styles.footer]}>
<Button {...props} />
</View>}>
<View style={styles.searchBarContainer}>
<TagListInput_native onChangeText={onChangeText} onRemove={callback} tags={memo3} placeholder={intl.string(t.Kd5RaI)} />
</View>
{memo2 ? r254 : null}
<UsersFastList ref={ref} inActionSheet sections={memo5} getItemProps={callback4} getSectionProps={callback3} renderListHeader={renderHeader} listHeaderSize={headerSize} insetEnd={80} onScroll={callback5} />
</BottomSheet>;
};
@@ -0,0 +1,35 @@
// Metro module 12478 (f12479).
import RelationshipStore from "../../../../stores/RelationshipStore";
import { UserRowModes } from "../../../main_tabs_v2/native/shared_components/user_list/UserRowConstants";
export function buildReferralUserRow({ eligibleUsers, row, selectedUserIds, resendUsers, referralsRemaining, selectedNotResendUsers, onSelectUser }) {
const user = eligibleUsers[row];
if (user != null) {
let disabled = selectedNotResendUsers.length >= referralsRemaining;
const selected = selectedUserIds.includes(user.id);
const r23 = resendUsers.has(user.id);
const props = {
type: RelationshipStore.getRelationshipType(user.id),
user,
onPress: onSelectUser,
selected,
disabled: null,
mode: null,
start: null,
end: null
};
if (disabled) {
disabled = !selected;
}
if (disabled) {
disabled = !r23;
}
props.disabled = disabled;
props.mode = UserRowModes.TOGGLE;
props.start = row === 0;
props.end = row === eligibleUsers.length - 1;
return {
type: "user",
props
};
}
}
@@ -0,0 +1,108 @@
// Metro module 12479 (f12480).
import { View } from "react-native";
import { HelpdeskArticles } from "../../../../Constants";
import { createStyles } from "../../../../design/components/Styles/native/createStyles";
import Module712 from "../../../../_bundle/Module712";
import UserUtils from "../../../../utils/UserUtils";
import { CreateReferralStatus } from "../../ReferralTrialActionCreators";
import { Avatar, AvatarSizes } from "../../../../design/void/native";
import { Text } from "../../../../design/components/Text/native/Text";
import { intl, t } from "../../../../intl/index.native";
import { Button } from "../../../../design/components/Button/native/Button.native";
import { ChatIcon } from "../../../../design/components/Icon/native/redesign/generated/ChatIcon";
import ActionSheetActionCreators from "../../../action_sheet/native/ActionSheetActionCreators";
import ChannelActionCreators from "../../../../actions/ChannelActionCreators";
import HelpdeskUtils from "../../../../utils/HelpdeskUtils";
import { BottomSheet } from "../../../../design/components/Sheet/native/BottomSheet.native";
import { BottomSheetTitleHeader } from "../../../../design/components/Sheet/native/BottomSheetTitleHeader.native";
import { Stack } from "../../../../design/components/Stack/native/Stack.native";
import { FistBumpSpotIllustration } from "../../../../design/assets/native";
let useStyles;
const SharedUser = function SharedUser(props) {
const { user, trialCreationResult: trialCreationResult2 } = props;
const styles = useStyles();
const name = UserUtils.getName(user);
const r1 = trialCreationResult2 === CreateReferralStatus.FAIL;
return <View style={styles.recipientRow}>
<Avatar style={[styles.avatarContainer, r1 && styles.erroredAvatar]} size={AvatarSizes.REFRESH_MEDIUM_32} user={user} guildId={void 0} />
{r1 ? <>
<Text variant="text-md/medium" color="text-muted" style={styles.recipientDisplayName}>{name}</Text>
<Text variant="text-md/medium" color="text-muted">
{intl.format(t.RO3T4B, {
userName: name
})}
</Text>
</> : <Text variant="text-md/medium" color="text-strong" style={styles.recipientDisplayName}>{name}</Text>}
<Button variant="secondary" size="sm" text={intl.string(t["g33r/P"])} icon={<ChatIcon size="xs" color={Module712.colors.CONTROL_SECONDARY_TEXT_DEFAULT} />} onPress={function onPress() {
ActionSheetActionCreators.hideActionSheet();
ChannelActionCreators.openPrivateChannel({
recipientIds: user.id
});
}} />
</View>;
};
useStyles = createStyles({
content: {
paddingHorizontal: Module712.space.PX_16
},
headerAsset: {
alignSelf: "center"
},
header: {
marginTop: Module712.space.PX_16,
alignSelf: "center",
paddingHorizontal: Module712.space.PX_8,
textAlign: "center"
},
subheader: {
textAlign: "center",
paddingHorizontal: Module712.space.PX_8,
marginTop: Module712.space.PX_8
},
recipientContainer: {
gap: Module712.space.PX_16,
marginTop: Module712.space.PX_16,
paddingBottom: 21
},
recipientRow: {
flexDirection: "row",
alignItems: "center",
padding: Module712.space.PX_12,
gap: Module712.space.PX_12,
borderRadius: Module712.radii.md,
borderWidth: 1,
borderColor: Module712.colors.BORDER_MUTED
},
recipientDisplayName: {
flex: 1
},
erroredAvatar: {
opacity: 0.5
},
avatarContainer: {
alignSelf: "center",
justifyContent: "center"
}
});
export default function ReferralProgramShareConfirmationActionSheet(props) {
const { selectedUsers, trialCreationResult } = props;
const styles = useStyles();
return <BottomSheet startExpanded contentStyles={styles.content} header={<BottomSheetTitleHeader title={null} />}>
<Stack>
<View style={styles.headerAsset}>
<FistBumpSpotIllustration />
</View>
<Text variant="heading-lg/bold" color="mobile-text-heading-primary" style={styles.header}>
{Array.from(trialCreationResult.values()).filter((item) => item === CreateReferralStatus.SUCCESS).length === 0 ? intl.string(t["7VBEue"]) : intl.string(t.tKCltd)}
</Text>
<Text variant="text-md/medium" color="text-default" style={styles.subheader}>
{intl.format(t.AwGSWl, {
helpdeskArticle: HelpdeskUtils.getArticleURL(HelpdeskArticles.REFERRAL_PROGRAM)
})}
</Text>
<View style={styles.recipientContainer}>
{Array.from(selectedUsers).map((item) => <SharedUser key={item.id} user={item} trialCreationResult={trialCreationResult.get(item.id)} />)}
</View>
</Stack>
</BottomSheet>;
};