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

167 lines
8.1 KiB
TypeScript

// Metro module 15768 (f15769).
import { useCallback } from "react";
import { View } from "react-native";
import ApplicationStore from "../../applications/ApplicationStore";
import ConnectedAccountsStore from "../../../stores/ConnectedAccountsStore";
import { ContentDismissActionType } from "../../dismissible_content/DismissibleContentConstants";
import { createStyles } from "../../../design/components/Styles/native/createStyles";
import Module712 from "../../../_bundle/Module712";
import { useThemeContext } from "../../../_bundle/Module3901";
import useSafeAreaInsets_native from "../../safe_area/useSafeAreaInsets.native";
import { useStateFromStores, useStateFromStoresObject } from "../../../_bundle/Module589";
import Platforms from "../../../lib/Platforms";
import useStartAuthorize from "./useStartAuthorize";
import useAnalyticsLocations from "../../app_analytics/useAnalyticsLocations";
import AnalyticsLocation from "../../app_analytics/AnalyticsLocation";
import { claimIncentivizedAccountLinkingReward } from "../AccountLinkManager";
import ActionSheetActionCreators from "../../action_sheet/native/ActionSheetActionCreators";
import { BottomSheetTitleHeader } from "../../../design/components/Sheet/native/BottomSheetTitleHeader.native";
import { BottomSheet } from "../../../design/components/Sheet/native/BottomSheet.native";
import { Stack } from "../../../design/components/Stack/native/Stack.native";
import { UnionIcon } from "../../local_app_detection/native/RobloxConnectionCoachmark";
import { Text } from "../../../design/components/Text/native/Text";
import { intl, t } from "../../../intl/index.native";
import ApplicationAccountLinking_messages from "../ApplicationAccountLinking.messages";
import { OrbsIcon } from "../../../design/components/Icon/native/redesign/generated/OrbsIcon";
import { Button } from "../../../design/components/Button/native/Button.native";
import { WindowLaunchIcon } from "../../../design/components/Icon/native/redesign/generated/WindowLaunchIcon";
import * as _themes from "../../../design/utils/shared/themes";
import { makeSource } from "../../../utils/AvatarUtils";
import Icon, { IconSizes } from "../../../design/void/Icon/native/Icon";
import GameIcon, { GameIconSizes } from "../../game_detection/native/GameIcon";
import { useGetOrFetchApplication } from "../../applications/useGetOrFetchApplications";
let useStyles, ApplicationIcon;
const ConnectionIcon = function ConnectionIcon(props) {
const { platform: platform2, theme } = props;
const styles = useStyles();
const isThemeDark = _themes.isThemeDark(theme);
const icon = platform2.icon;
return <View style={styles.iconContainer}>
<Icon size={IconSizes.CUSTOM} source={makeSource(isThemeDark ? icon.darkPNG : icon.lightPNG)} disableColor style={styles.connectionIcon} />
</View>;
};
ApplicationIcon = function ApplicationIcon(props) {
const application = props.application;
return <View style={useStyles().iconContainer}>
{application != null ? <GameIcon game={application} size={GameIconSizes.NORMAL} /> : null}
</View>;
};
useStyles = createStyles({
iconContainer: {
width: 56,
height: 56,
alignItems: "center",
justifyContent: "center"
},
content: {
paddingHorizontal: Module712.space.PX_16
},
text: {
textAlign: "center"
},
connectionIcon: {
height: 48,
width: 48
}
});
export default function ConnectionDeprecationBottomSheet(props) {
let replacedBy, startAuthorization, analyticsLocations, callback;
const platformTypes = props.platformTypes;
let applicationName = props.applicationName;
const markAsDismissed = props.markAsDismissed;
replacedBy = void 0;
startAuthorization = void 0;
analyticsLocations = void 0;
callback = void 0;
const styles = useStyles();
const theme = useThemeContext().theme;
const bottom = useSafeAreaInsets_native().bottom;
const stateFromStores2 = useStateFromStores([ConnectedAccountsStore], () => ConnectedAccountsStore.getAccounts().find((item) => platformTypes.includes(item.type))?.type);
const platform2 = stateFromStores2 != null ? Platforms.get(stateFromStores2) : null;
replacedBy = platform2 == null ? void 0 : platform2.migrationData?.replacedBy;
const stateFromStores = useStateFromStores([ApplicationStore], () => ApplicationStore.getApplication(replacedBy));
startAuthorization = useStartAuthorize(stateFromStores).startAuthorization;
analyticsLocations = useAnalyticsLocations(AnalyticsLocation.ACTION_SHEET).analyticsLocations;
callback = useCallback(() => {
claimIncentivizedAccountLinkingReward({
applicationId: replacedBy,
onSuccess: () => {
ActionSheetActionCreators.openLazy(import("./IncentivizedAccountLinkConfirmationBottomSheet"), "IncentivizedAccountLinkConfirmationBottomSheet");
}
});
}, [replacedBy]);
const callback2 = useCallback(() => {
ActionSheetActionCreators.hideActionSheet();
if (markAsDismissed != null) {
markAsDismissed(ContentDismissActionType.PRIMARY);
}
startAuthorization({
analyticsLocations,
onSuccess: callback
});
}, [analyticsLocations, startAuthorization, markAsDismissed, callback]);
if (platform2 != null && stateFromStores != null) {
if (applicationName == null) {
applicationName = stateFromStores.name;
}
return <BottomSheet startExpanded contentStyles={styles.content} header={<BottomSheetTitleHeader title={null} />} onDismiss={() => markAsDismissed(ContentDismissActionType.DISMISS)}>
<Stack spacing={24} style={{
paddingBottom: bottom
}}>
<Stack justify="center" align="center" direction="horizontal">
<ConnectionIcon theme={theme} platform={platform2} />
<UnionIcon theme={theme} />
<ApplicationIcon application={stateFromStores} />
</Stack>
<Stack justify="center">
<Text variant="heading-xl/bold" style={styles.text}>
{intl.string(ApplicationAccountLinking_messages.vycLU2)}
</Text>
<Text variant="text-md/medium" style={styles.text}>
{intl.format(ApplicationAccountLinking_messages.DfSSdL, {
connectionName: platform2.name,
applicationName,
orbCount: 200,
orbsIconHook: () => <OrbsIcon size="xs" color={Module712.colors.TEXT_STRONG} />
})}
</Text>
</Stack>
<Stack>
<Button text={intl.string(ApplicationAccountLinking_messages.ZeOhh9)} icon={<WindowLaunchIcon size="sm" color={Module712.colors.WHITE} />} iconPosition="end" size="lg" onPress={callback2} />
<Button text={intl.string(t.TulDPl)} variant="secondary" size="lg" onPress={function onPress() {
ActionSheetActionCreators.hideActionSheet();
if (markAsDismissed != null) {
markAsDismissed(ContentDismissActionType.DISMISS);
}
}} />
</Stack>
</Stack>
</BottomSheet>;
}
return false;
};
export function useShouldShowConnectionDeprecationBottomSheet({ deprecatedPlatformTypes }) {
const stateFromStoresObject = useStateFromStoresObject([ConnectedAccountsStore], () => ({
fetchingConnections: ConnectedAccountsStore.isFetching(),
matchingPlatform: ConnectedAccountsStore.getAccounts().map((item) => Platforms.get(item.type)).find((item) => {
const migrationData = item.migrationData;
return (migrationData == null ? void 0 : migrationData.getMigrationExperimentEnabled("ConnectionDeprecationBottomSheet")) && deprecatedPlatformTypes.includes(item.type);
})
}));
let fetchingConnections = stateFromStoresObject.fetchingConnections;
const matchingPlatform = stateFromStoresObject.matchingPlatform;
const getOrFetchApplication = useGetOrFetchApplication(matchingPlatform == null ? void 0 : matchingPlatform.migrationData?.replacedBy);
const startAuthorize = useStartAuthorize(getOrFetchApplication);
const { hasAlreadyLinked, canStartAuthorization, fetched } = startAuthorize;
if (!fetchingConnections) {
fetchingConnections = !fetched;
}
if (!fetchingConnections) {
fetchingConnections = !canStartAuthorization;
}
if (!fetchingConnections) {
fetchingConnections = getOrFetchApplication == null;
}
return fetchingConnections ? !fetchingConnections : !hasAlreadyLinked;
}