Files
discord-decomp/modules/guild_instant_invites/native/InstantInvite.tsx
T
2026-11-01 12:12:55 +02:00

128 lines
5.5 KiB
TypeScript

// Metro module 10191 (f10192).
import * as Module19 from "react";
import { useMemo, useCallback } from "react";
import { View } from "react-native";
import { createChannelRecordFromInvite } from "../../../records/ChannelRecord";
import { Routes } from "../../../Constants";
import { createStyles } from "../../../design/components/Styles/native/createStyles";
import { useGetOrFetchApplication } from "../../applications/useGetOrFetchApplications";
import { useCanUnlinkLobbyChannel } from "../../lobbies/LobbyUtils";
import useShowUnlinkChannelAlert from "../../integration_settings/native/useShowUnlinkChannelAlert";
import AlertActionCreators from "../../../actions/native/AlertActionCreators";
import { intl, t } from "../../../intl/index.native";
import { ArrowSmallRightIcon } from "../../../design/components/Icon/native/redesign/generated/ArrowSmallRightIcon";
import { transitionTo } from "../../routing/router_utils";
import InstantInviteIcons from "./InstantInviteIcons";
import { Card } from "../../../design/components/Card/native/Card.native";
import { Stack } from "../../../design/components/Stack/native/Stack.native";
import GameIcon, { GameIconSizes } from "../../game_detection/native/GameIcon";
import { Text } from "../../../design/components/Text/native/Text";
import { ContextMenu } from "../../../design/components/ContextMenu/native/ContextMenu.native";
import { IconButton } from "../../../design/components/Button/native/IconButton.native";
import { InstantInviteDetails } from "./InstantInviteCode";
import DetailedGuildIdentityUserRow from "../../guild_settings/native/DetailedGuildIdentityUserRow";
import { useInviteActions } from "./InstantInviteUtils";
import InviteRolesDisplay from "../../instant_invite/native/InviteRolesDisplay";
import InstantInviteUsesLabel from "./InstantInviteUsesLabel";
const useStyles = createStyles({
creatorWrapper: {
marginLeft: -16,
marginBottom: -16,
marginTop: 8,
flex: 1
},
gameWrapper: {
flex: 1,
flexDirection: "row",
alignItems: "center",
gap: 8
},
gameText: {
flex: 1
}
});
const r38 = Module19.memo(function({ invite, onInviteRevoked }) {
const styles = useStyles();
const { uses, maxUses } = invite;
const id = invite.guild?.id;
const memo2 = useMemo(() => createChannelRecordFromInvite(invite.channel), [invite]);
const inviteActions = useInviteActions({
invite,
onInviteRevoked
});
const memo = useMemo(() => invite.roles.map((role) => role.id), [invite.roles]);
let r36 = memo.length > 0 && id != null;
const r57 = [<Stack direction="horizontal" justify="space-between">
<Text variant="text-lg/bold" tabularNumbers>{invite.code}</Text>
<ContextMenu items={inviteActions}>
{({ ref, ...props }) => <IconButton size="sm" variant="secondary" icon={InstantInviteIcons.more} accessibilityLabel={intl.string(t.DEoVWZ)} ref={ref} {...props} />}
</ContextMenu>
</Stack>, <InstantInviteDetails channel={memo2} expiresAt={invite.getExpiresAt()} />, , ,];
if (r36) {
r36 = <InviteRolesDisplay roleIds={memo} guildId={id} />;
}
r57[2] = r36;
r57[3] = <Stack direction="horizontal" align="flex-end">
<View style={styles.creatorWrapper}>
{invite.inviter?.id != null ? <DetailedGuildIdentityUserRow start end userId={invite.inviter?.id} guildId={id} /> : null}
</View>
<InstantInviteUsesLabel uses={uses} maxUses={maxUses} />
</Stack>;
return <Card>{r57}</Card>;
});
export default r38;
export function LinkedChannelInvite(props) {
const channel = props.channel;
const styles = useStyles();
const linked_by = channel.linkedLobby?.linked_by;
const getOrFetchApplication = useGetOrFetchApplication(channel.linkedLobby?.application_id);
const canUnlinkLobbyChannel = useCanUnlinkLobbyChannel(channel);
const id = channel.id;
let r35 = getOrFetchApplication?.name;
if (r35 == null) {
r35 = "";
}
const showUnlinkChannelAlert = useShowUnlinkChannelAlert(id, r35);
let c17756_2 = showUnlinkChannelAlert;
const callback = useCallback(() => {
if (canUnlinkLobbyChannel) {
c17756_2();
} else {
AlertActionCreators.show({
title: intl.string(t.JmUENg),
body: intl.string(t.SrvsML)
});
}
}, [canUnlinkLobbyChannel, showUnlinkChannelAlert]);
return <Card>
<Stack direction="horizontal" justify="space-between">
<View style={styles.gameWrapper}>
<GameIcon game={getOrFetchApplication} size={GameIconSizes.SIZE_24} />
<Text ellipsizeMode="tail" lineClamp={1} variant="text-lg/bold" style={styles.gameText}>
{getOrFetchApplication?.name}
</Text>
</View>
<ContextMenu items={useMemo(() => [{
label: intl.string(t.aW2YlJ),
IconComponent: ArrowSmallRightIcon,
action: () => {
transitionTo(Routes.CHANNEL(channel.guild_id, channel.id));
}
}, {
label: intl.string(t.JmUENg),
iconSource: InstantInviteIcons.revoke,
variant: "destructive",
action: callback
}], [channel.guild_id, channel.id, callback])}>
{({ ref, ...props }) => <IconButton size="sm" variant="secondary" icon={InstantInviteIcons.more} accessibilityLabel={intl.string(t.DEoVWZ)} ref={ref} {...props} />}
</ContextMenu>
</Stack>
<InstantInviteDetails channel={channel} />
<Stack direction="horizontal" align="flex-end">
<View style={styles.creatorWrapper}>
{linked_by != null ? <DetailedGuildIdentityUserRow start end userId={linked_by} guildId={channel.guild_id} /> : null}
</View>
</Stack>
</Card>;
}