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,137 @@
// Metro module 11819 (f11820).
import { useState, useEffect } from "react";
import { ActivityIndicator, ImageBackground, View } from "react-native";
import { InviteStates } from "../../../Constants";
import { createStyles } from "../../../design/components/Styles/native/createStyles";
import Module712 from "../../../_bundle/Module712";
import { assertNever } from "../../../utils/GlobalUtils";
import { useToken } from "../../../design/tokens/native/useToken";
import { DeprecatedLayoutAnimation } from "../../animations/native/DeprecatedLayoutAnimation";
import InviteDetails from "./InviteDetails";
import InviteError from "./InviteError";
import AvatarUtils from "../../../utils/AvatarUtils";
import { getDevicePixelRatio } from "../../image_upload/ImageLoaderUtils";
import Module11828 from "../../../_bundle/Module11828";
import useWindowDimensions_native from "../../screen/useWindowDimensions.native";
import { Card } from "../../../design/components/Card/native/Card.native";
let useStyles, c8106_12, InviteResolving, AcceptInviteCardComponent;
const getInviteState = function getInviteState(invite) {
const r8 = invite?.state == null && invite?.channel == null;
if (invite != null && invite.state != null && !r8) {
const state2 = invite.state;
if (InviteStates.RESOLVED !== state2 && InviteStates.ACCEPTED !== state2) {
if (InviteStates.EXPIRED !== state2 && InviteStates.BANNED !== state2 && InviteStates.ERROR !== state2) {
if (InviteStates.RESOLVING !== state2 && InviteStates.APP_NOT_OPENED !== state2 && InviteStates.APP_OPENED !== state2 && InviteStates.APP_OPENING !== state2 && InviteStates.ACCEPTING !== state2) {
assertNever(state2);
return void 0;
}
return c8106_12.LOADING;
}
return c8106_12.ERROR;
}
return c8106_12.DETAILS;
}
return c8106_12.LOADING;
};
InviteResolving = function InviteResolving() {
return <View style={useStyles().resolvingContainer}>
<ActivityIndicator color={useToken(Module712.colors.INTERACTIVE_TEXT_DEFAULT)} size="large" />
</View>;
};
AcceptInviteCardComponent = function AcceptInviteCardComponent(props) {
const invite = props.invite;
const [state, setState] = useState(getInviteState(invite));
useEffect(() => {
const inviteState = getInviteState(invite);
if (inviteState !== state) {
DeprecatedLayoutAnimation();
setState(inviteState);
}
}, [invite, state]);
if (invite == null) {
return <InviteResolving />;
}
if (c8106_12.DETAILS === state) {
return <InviteDetails {...props} invite={invite} />;
}
if (c8106_12.ERROR === state) {
return <InviteError {...props} invite={invite} />;
}
return <InviteResolving />;
};
useStyles = createStyles({
parentContainer: {
backgroundColor: Module712.colors.BACKGROUND_BASE_LOW,
alignItems: "center",
justifyContent: "center"
},
imageStyle: {
marginVertical: 0,
resizeMode: "cover"
},
cardContainer: {
position: "absolute",
flex: 1,
width: "90%",
alignItems: "center",
justifyContent: "center",
padding: 0,
backgroundColor: Module712.colors.BACKGROUND_SURFACE_HIGH
},
cardContent: {
padding: 16,
flex: 1,
justifyContent: "center",
alignItems: "center",
width: "100%"
},
resolvingContainer: {
padding: 64
}
});
c8106_12 = {
LOADING: 0,
0: "LOADING",
DETAILS: 1,
1: "DETAILS",
ERROR: 2,
2: "ERROR"
};
export default function AcceptInvite(props) {
let source;
const { invite: invite2, ...props2 } = props;
const styles = useStyles();
const windowDimensions_native = useWindowDimensions_native();
const { height, width } = windowDimensions_native;
let r23 = invite2;
if (r23 == null) {
r23 = {};
}
const guild = r23.guild;
if (guild?.splash != null) {
source = AvatarUtils.getGuildSplashSource({
id: guild.id,
splash: guild.splash,
size: width * getDevicePixelRatio()
});
if (source == null) {
source = Module11828;
}
} else {
source = Module11828;
}
return <View style={[styles.parentContainer, {
height,
width
}]}>
<ImageBackground source={source} imageStyle={styles.imageStyle} style={{
height,
width
}} />
<Card style={styles.cardContainer}>
<View style={styles.cardContent}>
<AcceptInviteCardComponent invite={invite2} {...props2} />
</View>
</Card>
</View>;
};
@@ -0,0 +1,2 @@
// Metro module 5955 (f5956).
export const ACCEPT_INVITE_MODAL_KEY = "accept-invite";
@@ -0,0 +1,185 @@
// Metro module 16120 (f16121).
import AuthenticationStore from "../../../stores/AuthenticationStore";
import ChannelStore from "../../../stores/ChannelStore";
import GuildMemberStore from "../../../stores/GuildMemberStore";
import GuildStore from "../../../stores/GuildStore";
import InviteStore from "../../../stores/InviteStore";
import PermissionStore from "../../../stores/PermissionStore";
import { ACCEPT_INVITE_MODAL_KEY } from "./AcceptInviteConstants";
import { GuildFeatures, InviteStates, JoinGuildSources, Permissions, Routes } from "../../../Constants";
import * as _InviteTypeUtils from "../../instant_invite/InviteTypeUtils";
import { isGroupDMInvite, isGuildScheduledEventInviteEmbed, isRoleSubscriptionInvite } from "../../instant_invite/InviteTypeUtils";
import { getMobileLurkerServerPreview } from "../../lurker_mode/experiments/MobileLurkerServerPreviewExperiment";
import { transitionTo } from "../../routing/router_utils";
import ActionSheetActionCreators from "../../action_sheet/native/ActionSheetActionCreators";
import ModalActionCreators from "../../../actions/ModalActionCreators";
import AutomaticLifecycleManager from "../../../lib/AutomaticLifecycleManager";
import { acceptFriendInvite } from "../../friend_invites/native/FriendInviteUtils";
import Dispatcher from "../../../Dispatcher";
import { clearDisplayedInvite } from "../../../actions/native/DisplayedInviteActionCreators";
import { startLurking } from "../../../utils/GuildDiscoveryUtils";
import AnalyticsLocation from "../../app_analytics/AnalyticsLocation";
class AcceptInviteManager extends AutomaticLifecycleManager {
constructor() {
super(...arguments);
const _this = this;
this._deferredFromDeeplink = false;
this._isRegistration = false;
this.actions = {
DISPLAYED_INVITE_SHOW: (a0) => _this._handleShowInvite(a0),
DISPLAYED_INVITE_CLEAR: () => _this._handleClearInvite(),
DEFERRED_INVITE_SHOW: () => _this._handleShowDeferredInvite(),
REGISTER_SUCCESS: () => _this._handleRegisterSuccess()
};
this._handleShowInvite = ({ code: code2, deeplinkAttemptId: deeplinkAttemptId2, fromDeeplink, invite_instance_id }) => {
const isAuthenticated = AuthenticationStore.isAuthenticated();
if (isAuthenticated) {
_this._handleInvite(code2, deeplinkAttemptId2, fromDeeplink === true, invite_instance_id);
} else {
_this._deferredCode = code2;
_this._deferredFromDeeplink = fromDeeplink === true;
}
};
this._handleClearInvite = () => {
_this._deferredCode = null;
_this._deferredFromDeeplink = false;
_this._isRegistration = false;
ModalActionCreators.popWithKey(ACCEPT_INVITE_MODAL_KEY);
};
this._handleShowDeferredInvite = () => {
if (_this._deferredCode != null) {
_this._handleInvite(_this._deferredCode, void 0, _this._deferredFromDeeplink);
_this._deferredCode = null;
_this._deferredFromDeeplink = false;
}
};
this._handleInvite = function _handleInvite(code, deeplinkAttemptId, r6 = false) {
let c28227_2 = r6;
const inviteInstanceId = arguments[3];
InviteStore.addConditionalChangeListener(() => {
let r37;
L5: {
const invite = InviteStore.getInvite(code);
if (invite != null) {
if (invite.state !== InviteStates.RESOLVED && invite.state !== InviteStates.EXPIRED && invite.state !== InviteStates.BANNED && invite.state !== InviteStates.ERROR) {
break L5;
}
L62: {
if (invite.channel == null && (invite.guild == null && invite.inviter != null)) {
acceptFriendInvite(invite, {
location: deeplinkAttemptId != null ? "Deep Link" : "Accept Invite"
});
Dispatcher.wait(() => clearDisplayedInvite());
} else {
L28: {
const state = invite.state;
const RESOLVED = InviteStates.RESOLVED;
r37 = false;
if (state === RESOLVED) {
const isStreamInvite = _InviteTypeUtils.isStreamInvite(invite);
r37 = false;
if (!isStreamInvite) {
const id = invite.guild?.id;
const target_channel_id = invite.target_channel_id;
const r43 = id == null;
r37 = false;
if (!r43) {
const r44 = target_channel_id == null;
r37 = false;
if (!r44) {
const r48 = GuildStore.getGuild(id) == null;
r37 = false;
if (!r48) {
if (invite.roles != null && invite.roles.length > 0) {
const r18 = Set;
let r57 = GuildMemberStore.getSelfMember(id)?.roles;
if (r57 == null) {
r57 = [];
}
let c30953_0 = new r18(r57);
const r64 = invite.roles.some((role) => !c30953_0.has(role.id));
r37 = false;
if (r64) {
break L28;
}
}
let r73 = !!PermissionStore.can(Permissions.VIEW_CHANNEL, ChannelStore.getChannel(target_channel_id));
if (r73) {
let target_message_id = invite.target_message_id;
if (target_message_id == null) {
target_message_id = void 0;
}
transitionTo(Routes.CHANNEL(id, target_channel_id, target_message_id), {
navigationReplace: true,
openChannel: true
});
r73 = true;
}
r37 = r73;
}
}
}
}
}
}
if (r37) {
Dispatcher.wait(() => clearDisplayedInvite());
} else {
if (c28227_2 && invite.state === InviteStates.RESOLVED) {
let r87 = invite.guild == null || isGroupDMInvite(invite) || _InviteTypeUtils.isStreamInvite(invite) || isGuildScheduledEventInviteEmbed(invite) || isRoleSubscriptionInvite(invite);
if (!r87) {
const features = invite.guild.features;
r87 = !(features == null ? void 0 : features.includes(GuildFeatures.DISCOVERABLE));
}
if (r87 ? !r87 : getMobileLurkerServerPreview("AcceptInviteManager").enabled) {
Dispatcher.wait(() => clearDisplayedInvite());
let target_channel_id2 = invite.target_channel_id;
if (target_channel_id2 == null) {
target_channel_id2 = void 0;
}
const id2 = invite.guild.id;
let channelId = target_channel_id2;
if (channelId == null) {
channelId = invite.channel?.id;
}
const r172 = target_channel_id2 != null;
let messageId = void 0;
if (r172) {
let target_message_id2 = invite.target_message_id;
if (target_message_id2 == null) {
target_message_id2 = void 0;
}
messageId = target_message_id2;
}
startLurking(id2, {}, {
channelId,
messageId,
joinSource: JoinGuildSources.DISCOVERABLE_GUILD_INVITE_LURKER
}, [AnalyticsLocation.DEEPLINK]);
break L62;
}
}
const _isRegistration = _this._isRegistration;
ActionSheetActionCreators.hideActionSheet();
ModalActionCreators.pushLazy(import("./components/AcceptInviteModal"), {
code,
isRegistration: _isRegistration,
deeplinkAttemptId,
inviteInstanceId
}, ACCEPT_INVITE_MODAL_KEY);
}
}
}
return false;
}
}
return true;
});
};
this._handleRegisterSuccess = () => {
_this._isRegistration = true;
};
}
}
const acceptInviteManager = new AcceptInviteManager();
export default acceptInviteManager;
@@ -0,0 +1,297 @@
// Metro module 11820 (f11821).
import { useMemo, useState } from "react";
import { View } from "react-native";
import MultiAccountStore from "../../multi_account/MultiAccountStore";
import UserRecord from "../../../records/UserRecord";
import UserStore from "../../../stores/UserStore";
import { AnalyticEvents, InviteStates } from "../../../Constants";
import { INVITE_ROUTING_HUB_GUILD_ID } from "../../hub/HubConstants";
import { createStyles } from "../../../design/components/Styles/native/createStyles";
import Module712 from "../../../_bundle/Module712";
import { DARK_1_LIGHT_04 } from "../../../design/migrations/native/LegacyTokens";
import { isGroupDMInvite, isFriendInvite, isStreamInvite } from "../../instant_invite/InviteTypeUtils";
import { Avatar, AvatarSizes } from "../../../design/void/native";
import GuildInviteIcon from "../../guild/native/GuildInviteIcon";
import UserUtils from "../../../utils/UserUtils";
import { intl, t } from "../../../intl/index.native";
import GuildBadge from "../../guild/native/GuildBadge";
import { Heading, Text } from "../../../design/components/Text/native/Text";
import AvatarUtils from "../../../utils/AvatarUtils";
import FastImage from "../../../components_native/common/FastImage";
import AnalyticsUtils from "../../../utils/AnalyticsUtils";
import { useStateFromStores } from "../../../_bundle/Module589";
import InviteRolesList from "./InviteRolesList";
import { GuildEventCardHeader, GuildEventCardMetaInfo, GuildEventCardGuildInfo } from "../../guild_scheduled_events/native/components/GuildEventCardComponents";
import { Button } from "../../../design/components/Button/native/Button.native";
import { ButtonGroup } from "../../../design/components/ButtonGroup/native/ButtonGroup.native";
let useStyles, InviteDestinationIcon, InviteHeader, InviteJoinContext, InviteMemberCounts, c8107_21;
const shouldShowInviter = function shouldShowInviter(a0, a1) {
let r1 = a0.inviter != null && !(a1 ? a0.state !== InviteStates.ACCEPTED : a1);
if (r1) {
let approximate_presence_count = a0.approximate_presence_count;
if (approximate_presence_count == null) {
approximate_presence_count = 0;
}
let approximate_member_count = a0.approximate_member_count;
if (approximate_member_count == null) {
approximate_member_count = 0;
}
const r12 = {
onlineCount: approximate_presence_count,
memberCount: approximate_member_count
};
let r16 = (r12.memberCount !== 0 ? r12 : null)?.memberCount;
if (r16 == null) {
r16 = 0;
}
r1 = !(r16 > 100);
}
return r1;
};
InviteDestinationIcon = function InviteDestinationIcon(props) {
const invite3 = props.invite;
const styles = useStyles();
return <View style={[styles.avatarContainer]}>
{isGroupDMInvite(invite3) && invite3.inviter != null ? invite3.inviter != null ? <Avatar avatarStyle={styles.avatar} user={new UserRecord(invite3.inviter)} guildId={void 0} size={AvatarSizes.XLARGE} /> : null : invite3.guild != null ? <GuildInviteIcon style={styles.avatar} guild={invite3.guild} size={GuildInviteIcon.Sizes.LARGE} textScale={2} /> : null}
</View>;
};
InviteHeader = function InviteHeader(props) {
let r11;
const invite3 = props.invite;
const styles = useStyles();
if (isGroupDMInvite(invite3)) {
let r24 = invite3.channel?.name;
if (r24 == null) {
r24 = UserUtils.getFormattedName(invite3.inviter);
}
r11 = r24;
} else {
r11 = invite3.guild?.name;
}
if (isFriendInvite(invite3)) {
r11 = intl.formatToPlainString(t["4aF92R"], {
username: UserUtils.getFormattedName(invite3.inviter)
});
}
return r11 != null ? <View style={styles.guildNameContainer}>
<GuildBadge guild={invite3.guild} style={styles.featureIcon} disableColor />
<Heading style={styles.guildNameText} variant="heading-xl/extrabold" color="mobile-text-heading-primary">{r11}</Heading>
</View> : null;
};
InviteJoinContext = function InviteJoinContext(props) {
let r51, memo, styles;
let invite, isGuildMember;
L22: {
invite = props.invite;
const isRegistration = props.isRegistration;
isGuildMember = props.isGuildMember;
styles = useStyles();
memo = useMemo(() => isStreamInvite(invite) && invite.target_user != null ? AvatarUtils.getUserAvatarSource(invite.target_user) : shouldShowInviter(invite, isGuildMember) ? invite.inviter != null ? AvatarUtils.getUserAvatarSource(invite.inviter) : null : null, [invite, isGuildMember]);
const r31 = intl.string(t["3rE1P8"]);
if (isFriendInvite(invite)) {
r51 = intl.format(t.Quj7HX, {
username: UserUtils.getFormattedName(invite.inviter)
});
} else if (isGroupDMInvite(invite)) {
r51 = invite.channel != null && invite.inviter != null ? intl.format(t.Lu4h18, {
username: UserUtils.getFormattedName(invite.inviter)
}) : intl.string(t.OsdY8B);
} else {
if (isStreamInvite(invite) && invite.target_user != null) {
r51 = intl.formatToPlainString(t.x2L32Q, {
username: UserUtils.getFormattedName(invite.target_user)
});
break L22;
}
r51 = (isGuildMember ? invite.state !== InviteStates.ACCEPTED : isGuildMember) ? isRegistration ? intl.string(t.jpwYbt) : intl.string(t["FDsl+J"]) : shouldShowInviter(invite, isGuildMember) && invite.inviter != null ? intl.format(t.spU2mI, {
username: UserUtils.getFormattedName(invite.inviter)
}) : r31;
}
}
return <View style={styles.inviteJoinContainer}>
{memo == null ? null : isFriendInvite(invite) ? null : <View style={styles.inviterIconWrapper}>
<FastImage source={memo} style={styles.inviterIcon} />
</View>}
<Text style={styles.inviteJoinText} variant="text-sm/normal" color="text-default">{r51}</Text>
</View>;
};
InviteMemberCounts = function InviteMemberCounts(props) {
const { invite: invite3, isGuildMember: isGuildMember2 } = props;
const styles = useStyles();
let approximate_presence_count = invite3.approximate_presence_count;
if (approximate_presence_count == null) {
approximate_presence_count = 0;
}
let approximate_member_count = invite3.approximate_member_count;
if (approximate_member_count == null) {
approximate_member_count = 0;
}
const r24 = {
onlineCount: approximate_presence_count,
memberCount: approximate_member_count
};
const r19 = r24.memberCount !== 0 ? r24 : null;
return r19 == null ? null : shouldShowInviter(invite3, isGuildMember2) ? null : (invite3 == null ? void 0 : invite3.guild?.id) !== INVITE_ROUTING_HUB_GUILD_ID ? <View style={styles.memberInfo}>
{r19.onlineCount != null ? <>
<View style={styles.dotOnline} />
<Text variant="text-xs/medium" color="text-default">
{intl.format(t["LC+S+m"], {
membersOnline: r19.onlineCount
})}
</Text>
</> : null}
{r19.memberCount != null ? <>
<View style={styles.dotOffline} />
<Text variant="text-xs/medium" color="text-default">
{intl.format(t.zRl6XR, {
count: r19.memberCount
})}
</Text>
</> : null}
</View> : null;
};
useStyles = createStyles({
avatar: {
height: 64,
width: 64,
margin: 0,
borderRadius: Module712.radii.lg
},
avatarContainer: {
borderRadius: Module712.radii.none,
height: 64,
width: 64,
marginBottom: 24,
marginTop: 24
},
inviteJoinContainer: {
flexDirection: "row",
alignItems: "flex-start",
marginBottom: 8,
marginLeft: 16,
marginRight: 16
},
inviteJoinText: {
textAlign: "center"
},
inviterIconWrapper: {
borderRadius: Module712.radii.none,
marginRight: 8
},
inviterIcon: {
width: 20,
height: 20,
borderRadius: Module712.radii.md
},
guildNameContainer: {
flexDirection: "row",
alignItems: "center",
marginBottom: 8
},
guildNameText: {
textAlign: "center"
},
featureIcon: {
flexGrow: 0,
marginRight: 8,
opacity: DARK_1_LIGHT_04
},
memberInfo: {
flexDirection: "row",
alignItems: "center",
marginBottom: 8
},
rolesList: {
marginTop: 8,
marginBottom: 8,
alignItems: "center"
},
dotOnline: {
width: 8,
height: 8,
borderRadius: Module712.radii.sm,
marginRight: 4,
backgroundColor: Module712.unsafe_rawColors.GREEN_360
},
dotOffline: {
width: 8,
height: 8,
borderRadius: Module712.radii.sm,
marginRight: 4,
marginLeft: 16,
backgroundColor: Module712.unsafe_rawColors.PRIMARY_400
},
embedDetailsCard: {
width: "100%",
backgroundColor: Module712.colors.BACKGROUND_SURFACE_HIGH,
padding: 16,
borderRadius: Module712.radii.sm,
marginTop: 16,
marginBottom: 8
}
});
c8107_21 = {
ACCEPT: 0,
0: "ACCEPT",
DECLINE: 1,
1: "DECLINE"
};
export default function InviteDetails(props) {
let accessibilityLabel, text;
const invite2 = props.invite;
let isGuildMember2 = props.isGuildMember;
const { onPressJoin, onPressClose, isRegistration } = props;
const styles = useStyles();
const [state, setState] = useState();
const props2 = {
invite: invite2,
isGuildMember: isGuildMember2,
isRegistration
};
const guild_scheduled_event = invite2.guild_scheduled_event;
const stateFromStores = useStateFromStores([UserStore], () => UserStore.getCurrentUser());
let r47 = useStateFromStores([MultiAccountStore], () => MultiAccountStore.getCanUseMultiAccountMobile());
const r52 = [<InviteDestinationIcon {...props2} />, <InviteJoinContext {...props2} />, <InviteHeader {...props2} />, <InviteMemberCounts {...props2} />, <InviteRolesList invite={invite2} style={styles.rolesList} />, guild_scheduled_event != null && <View style={styles.embedDetailsCard}>
<GuildEventCardHeader event={guild_scheduled_event} />
<GuildEventCardMetaInfo event={guild_scheduled_event} />
<GuildEventCardGuildInfo event={guild_scheduled_event} />
</View>, ,];
if (isGuildMember2) {
isGuildMember2 = invite2.state !== InviteStates.ACCEPTED;
}
const source = stateFromStores != null ? AvatarUtils.getUserAvatarSource(stateFromStores, false, 20) : null;
const icon = source != null ? <Button.Icon source={source} variant="entity" /> : void 0;
const r111 = stateFromStores != null ? intl.formatToPlainString(t["9sWQNT"], {
usernameHook: () => `${stateFromStores.username}${stateFromStores.hasUniqueUsername() ? "" : `#${stateFromStores.discriminator}`}`
}) : void 0;
const r130 = intl.string(t["e/6Ogt"]);
if (isGuildMember2) {
accessibilityLabel = intl.string(t.IRoQXr);
text = accessibilityLabel;
} else {
if (r47) {
r47 = r111 != null;
}
accessibilityLabel = r111;
text = r130;
if (r47) {
accessibilityLabel = r111;
text = accessibilityLabel;
}
}
r52[6] = <ButtonGroup>
<Button icon={icon} variant="primary" size="lg" text={text} accessibilityLabel={accessibilityLabel} onPress={function handleAcceptInvitePress() {
setState(c8107_21.ACCEPT);
onPressJoin();
}} loading={state === c8107_21.ACCEPT} disabled={state === c8107_21.ACCEPT} />
<Button variant="secondary" size="lg" text={isGuildMember2 ? intl.string(t.WAI6xu) : intl.string(t.ndsK4Z)} onPress={function handleCancelPress() {
setState(c8107_21.DECLINE);
AnalyticsUtils.track(AnalyticEvents.INVITE_ACCEPT_DISMISSED, {
invite_code: invite2.code,
guild_id: invite2.guild?.id
});
onPressClose();
}} loading={state === c8107_21.DECLINE} disabled={state === c8107_21.DECLINE} />
</ButtonGroup>;
return <>{r52}</>;
};
@@ -0,0 +1,120 @@
// Metro module 11823 (f11824).
import { Image as Image2, View } from "react-native";
import { AbortCodes, HelpdeskArticles, InviteStates } from "../../../Constants";
import { createStyles } from "../../../design/components/Styles/native/createStyles";
import Module712 from "../../../_bundle/Module712";
import { isThemeDark } from "../../../design/shared";
import useTheme from "../../../hooks/useTheme";
import Module11824 from "../../../_bundle/Module11824";
import Module11825 from "../../../_bundle/Module11825";
import { getDescriptiveInviteError } from "../../../utils/InviteErrorUtils";
import { intl, t } from "../../../intl/index.native";
import { Text } from "../../../design/components/Text/native/Text";
import { Button } from "../../../design/components/Button/native/Button.native";
import AvatarUtils from "../../../utils/AvatarUtils";
import { Icon } from "../../../design/void/native";
import Module11827 from "../../../_bundle/Module11827";
import GuildIcon, { GuildIconSizes } from "../../guild/native/GuildIcon";
import HelpdeskUtils from "../../../utils/HelpdeskUtils";
let useStyles, InviteDisabledError;
const InviteErrorBase = function InviteErrorBase(props) {
let r12;
const { invite, onPressClose, inviteError } = props;
const styles = useStyles();
const source = isThemeDark(useTheme()) ? Module11824 : Module11825;
const descriptiveInviteError = getDescriptiveInviteError(inviteError?.code);
if (invite.state === InviteStates.BANNED) {
r12 = intl.string(t["GzD/aa"]);
} else {
r12 = descriptiveInviteError?.description;
if (r12 == null) {
r12 = intl.string(t.FWkU6P);
}
}
const r58 = [<Image2 style={styles.expiredImage} source={source} />, , , ,];
let r65 = descriptiveInviteError?.title;
if (r65 == null) {
r65 = intl.string(t.u9zxnX);
}
const handlePressClose2 = function handlePressClose() {
onPressClose();
};
r58[1] = <Text style={styles.expiredTitle} variant="heading-xl/extrabold" color="mobile-text-heading-primary">{r65}</Text>;
r58[2] = <Text style={styles.expiredBody} variant="text-sm/medium" color="text-default">{r12}</Text>;
r58[3] = <Button variant="primary" size="lg" text={intl.string(t.wcqOoF)} onPress={handlePressClose2} />;
return <>{r58}</>;
};
InviteDisabledError = function InviteDisabledError(props) {
const { invite, onPressClose: onPressClose2 } = props;
const styles = useStyles();
const guild = invite.guild;
if (guild == null) {
return null;
}
return <>
<View style={styles.disabledView}>
<Icon style={styles.disabledPauseIcon} source={Module11827} />
<GuildIcon style={styles.guildIcon} icon={AvatarUtils.getGuildIconURL({
id: guild.id,
icon: guild.icon,
size: 64,
canAnimate: false
})} size={GuildIconSizes.XLARGE} />
</View>
<Text style={styles.disabledTitle} variant="heading-xl/semibold" color="text-feedback-critical">
{intl.string(t.jlLX2Z)}
</Text>
<Text style={styles.disabledBody} variant="text-md/normal" color="text-default">
{intl.format(t.RXSeLl, {
articleLink: HelpdeskUtils.getArticleURL(HelpdeskArticles.INVITE_DISABLED)
})}
</Text>
<Button variant="primary" size="lg" text={intl.string(t["yD/zkn"])} onPress={function handlePressClose() {
onPressClose2();
}} />
</>;
};
useStyles = createStyles({
expiredImage: {
marginTop: 32,
marginBottom: 32
},
expiredTitle: {
marginBottom: 8,
backgroundColor: "transparent",
textAlign: "center"
},
expiredBody: {
backgroundColor: "transparent",
marginBottom: 24
},
disabledView: {
justifyContent: "center",
alignItems: "center"
},
disabledPauseIcon: {
position: "absolute",
alignSelf: "center",
tintColor: Module712.colors.WHITE,
width: 42,
height: 42
},
guildIcon: {
borderRadius: Module712.radii.lg,
opacity: 0.2,
zIndex: -999
},
disabledTitle: {
marginTop: 16,
marginBottom: 8,
textAlign: "center"
},
disabledBody: {
textAlign: "center",
marginBottom: 16
}
});
export default function InviteError(props) {
const inviteError = props.inviteError;
return inviteError == null ? <InviteErrorBase {...props} /> : inviteError.code === AbortCodes.INVITES_DISABLED ? <InviteDisabledError {...props} /> : <InviteErrorBase {...props} />;
};
@@ -0,0 +1,31 @@
// Metro module 11822 (f11823).
import { useMemo } from "react";
import { View } from "react-native";
import { createStyles } from "../../../design/components/Styles/native/createStyles";
import { sortInviteRoles, inviteRoleToDisplayData } from "../../../utils/GuildRoleUtils";
import { Stack } from "../../../design/components/Stack/native/Stack.native";
import { Text } from "../../../design/components/Text/native/Text";
import { intl, t } from "../../../intl/index.native";
import RolePill from "../../../components_native/common/RolePill";
const useStyles = createStyles({
rolesRow: {
flexDirection: "row",
flexWrap: "wrap",
justifyContent: "center",
gap: 4
}
});
export default function InviteRolesList(props) {
const { invite, style } = props;
const styles = useStyles();
const { guild, roles } = invite;
const memo = useMemo(() => guild != null && (roles != null && roles.length !== 0) ? [...roles].sort(sortInviteRoles).map((item) => inviteRoleToDisplayData(guild.id, item)) : [], [guild, roles]);
return guild == null ? null : memo.length !== 0 ? <Stack spacing={4} style={style}>
<Text variant="text-sm/semibold" color="text-default">
{intl.string(t.stcSfI)}
</Text>
<View style={styles.rolesRow}>
{memo.map((item) => <RolePill key={item.id} role={item} guildId={guild.id} />)}
</View>
</Stack> : null;
};
+109
View File
@@ -0,0 +1,109 @@
// Metro module 9222 (f9223).
import { useCallback } from "react";
import { ScrollView, View } from "react-native";
import { CREATE_GUILD_SMALL_SCREEN_MAX_HEIGHT, CreateGuildModalStates } from "../../create_guild/native/CreateGuildConstants";
import { createStyles } from "../../../design/components/Styles/native/createStyles";
import Module712 from "../../../_bundle/Module712";
import { Text } from "../../../design/components/Text/native/Text";
import { intl, t } from "../../../intl/index.native";
import useSafeAreaInsetsKeyboardAware_native from "../../safe_area/useSafeAreaInsetsKeyboardAware.native";
import { useNavigation } from "../../../design/components/Navigator/native/useNavigation.native";
import useWindowDimensions_native from "../../screen/useWindowDimensions.native";
import FreeFormInputGroup from "../../../design/void/Form/native/FreeFormInputGroup";
import { Button } from "../../../design/components/Button/native/Button.native";
let useStyles, _excluded, placeholder;
const OrSeparator = function OrSeparator() {
const styles = useStyles();
return <View style={styles.separator}>
<View style={styles.innerSeparator} />
<Text style={styles.orText} variant="text-sm/semibold" color="text-muted">
{intl.string(t.HEuagM)}
</Text>
<View style={styles.innerSeparator} />
</View>;
};
useStyles = createStyles({
growSpacing: {
flexGrow: 2,
minHeight: Module712.space.PX_24
},
container: {
flexGrow: 2,
paddingHorizontal: Module712.space.PX_16,
paddingBottom: Module712.space.PX_16
},
textInput: {
borderRadius: Module712.radii.lg
},
innerSeparator: {
height: 1,
flexGrow: 2,
backgroundColor: Module712.colors.BORDER_SUBTLE
},
separator: {
paddingVertical: 12,
flexDirection: "row",
justifyContent: "center",
alignItems: "center"
},
orText: {
textAlign: "center",
marginHorizontal: Module712.space.PX_8,
textTransform: "uppercase"
},
header: {
textAlign: "center"
},
description: {
textAlign: "center",
marginTop: 8,
marginBottom: 32
},
exampleText: {
marginTop: 8
}
});
_excluded = ["https://discord.gg/hTKzmak", "hTKzmak", "https://discord.gg/wumpus-friends"];
placeholder = _excluded[0];
export default function JoinServer(props) {
const { error, inviteString, onInviteChange, onDone, submitting } = props;
const styles = useStyles();
const insets = useSafeAreaInsetsKeyboardAware_native().insets;
const navigation = useNavigation();
const height = useWindowDimensions_native().height;
const callback = useCallback(() => {
navigation.push(CreateGuildModalStates.JOIN_STUDENT_HUB);
}, [navigation]);
return <ScrollView keyboardShouldPersistTaps="handled" contentContainerStyle={[styles.container, {
paddingBottom: insets.bottom + Module712.space.PX_16
}]}>
<View>
{height <= CREATE_GUILD_SMALL_SCREEN_MAX_HEIGHT ? null : <>
<Text style={styles.header} accessibilityRole="header" variant="heading-xl/bold" color="mobile-text-heading-primary">
{intl.string(t.jlfuFW)}
</Text>
<Text style={styles.description} variant="text-sm/medium" color="text-default">
{intl.string(t.lVvN3A)}
</Text>
</>}
<FreeFormInputGroup label={intl.string(t.qreV25)} error={error} value={inviteString} onChangeText={onInviteChange} placeholder={placeholder} accessibilityLabel={intl.string(t.qreV25)} autoFocus autoCapitalize="none" autoCorrect={false} returnKeyType="join" textStyle={styles.textInput} onSubmitEditing={onDone} />
<Text style={styles.exampleText} variant="text-sm/medium" color="text-muted">
{intl.format(t.vwWaTe, {
example1: _excluded[0],
example2: _excluded[1],
example3: _excluded[2],
exampleHook: (a0, a1) => <Text key={a1} variant="text-sm/medium" color="text-default">
{a0}
</Text>
})}
</Text>
</View>
<>
<View style={styles.growSpacing} />
<Button size="lg" text={intl.string(t["+H/coT"])} accessibilityLabel={intl.string(t["+H/coT"])} loading={submitting} disabled={submitting} onPress={onDone} />
<OrSeparator />
<Button size="lg" variant="secondary" text={intl.string(t["MOqX/G"])} accessibilityLabel={intl.string(t["MOqX/G"])} onPress={callback} />
</>
</ScrollView>;
};
export { OrSeparator };
@@ -0,0 +1,27 @@
// Metro module 16121 (f16122).
import { useEffect, useMemo } from "react";
import { CreateGuildModalStates } from "../../../create_guild/native/CreateGuildConstants";
import { ImpressionNames } from "../../../../_bundle/Module503";
import { parseInviteCodeFromInviteKey } from "../../../instant_invite/InviteCodeUtils";
import AcceptInviteContainer from "../../../create_guild/native/components/AcceptInviteContainer";
import { clearDisplayedInvite } from "../../../../actions/native/DisplayedInviteActionCreators";
import { Navigator } from "../../../../design/components/Navigator/native/Navigator.native";
export default function AcceptInviteModal(props) {
let c22804_0 = props;
useEffect(() => () => {}, []);
return <Navigator screens={useMemo(() => {
let c28228_0 = c22804_0;
const r10 = {};
r10[CreateGuildModalStates.ACCEPT_INVITE] = {
fullscreen: true,
headerShown: false,
impressionName: ImpressionNames.INVITE_ACCEPT,
impressionProperties: {
deeplink_attempt_id: c22804_0.deeplinkAttemptId,
invite_code: parseInviteCodeFromInviteKey(c22804_0.code)
},
render: () => <AcceptInviteContainer {...c28228_0} onPressClose={clearDisplayedInvite} />
};
return r10;
}, [props])} initialRouteName={CreateGuildModalStates.ACCEPT_INVITE} />;
};