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,125 @@
// Metro module 13763 (f13764).
import { useState, useEffect, useLayoutEffect } from "react";
import { Image as Image2, View } from "react-native";
import WebAuthnStore from "../../WebAuthnStore";
import { WebAuthnScreens } from "../../WebAuthnConstants";
import { createStyles } from "../../../../design/components/Styles/native/createStyles";
import Module712 from "../../../../_bundle/Module712";
import { useStateFromStoresObject } from "../../../../_bundle/Module589";
import Module13753 from "../../../../_bundle/Module13753";
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 { IconButton } from "../../../../design/components/Button/native/IconButton.native";
import { TrashIcon } from "../../../../design/components/Icon/native/redesign/generated/TrashIcon";
import ActionSheetActionCreators from "../../../action_sheet/native/ActionSheetActionCreators";
import { PencilIcon } from "../../../../design/components/Icon/native/redesign/generated/PencilIcon";
import { TableRowGroup } from "../../../../design/components/TableRow/native/TableRowGroup.native";
import { TableRow } from "../../../../design/components/TableRow/native/TableRow.native";
import { formatDate } from "../../../auth_sessions/AuthSessionsUtils";
import { useNavigation } from "../../../../design/components/Navigator/native/useNavigation.native";
import { fetchWebAuthnCredentials } from "../../WebAuthnActionCreators";
import { hasWebAuthn } from "../../../../utils/MFAUtils";
import { HeaderActionButton } from "../../../../design/components/Navigator/native/HeaderActionButton.native";
import { Form } from "../../../../design/void/Form/native/index";
import { HermesBuiltin } from "../../../../_hermes/prelude";
let useStyles;
const CredentialList = function CredentialList(props) {
let styles, state, setState;
const navigation = props.navigation;
styles = void 0;
state = void 0;
setState = void 0;
const credentials = useStateFromStoresObject([WebAuthnStore], () => ({
credentials: WebAuthnStore.getCredentials()
})).credentials;
styles = useStyles();
[state, setState] = useState(false);
if (credentials.length === 0) {
return <View style={styles.upsellContainer}>
<Image2 source={Module13753} style={styles.keychainImage} />
<Text variant="text-md/normal" style={styles.upsellText}>
{intl.string(t.FSNwFW)}
</Text>
</View>;
}
return <TableRowGroup title={intl.string(t["4RIqrQ"])} hasIcons={false}>
{credentials.map((a0) => {
const credential = a0;
return <TableRow key={a0.id} label={a0.name} trailing={<ButtonGroup style={styles.iconButtonGroup}>
<IconButton variant="secondary" icon={<TrashIcon color={Module712.colors.TEXT_FEEDBACK_CRITICAL} />} accessibilityLabel={intl.string(t.N86XcP)} size="sm" disabled={state} loading={state} onPress={() => ActionSheetActionCreators.openLazy(import("../WebAuthnDeleteActionSheet"), "WEBAUTHN_DELETE_SHEET_KEY", {
credential,
deleting: state,
setDeleting: setState
})} />
<IconButton variant="secondary" icon={<PencilIcon />} accessibilityLabel={intl.string(t.bt75uw)} size="sm" disabled={state} loading={state} onPress={() => {
navigation.push(WebAuthnScreens.EDIT, {
credential
});
}} />
</ButtonGroup>} subLabel={a0.last_used != null ? intl.format(t["7JgxF5"], {
lastUsed: formatDate(a0.last_used)
}) : null} />;
})}
</TableRowGroup>;
};
useStyles = createStyles({
container: {
flex: 1,
flexDirection: "column",
alignItems: "stretch",
justifyContent: "space-between",
marginLeft: Module712.space.PX_16,
marginRight: Module712.space.PX_16,
marginTop: Module712.space.PX_8
},
upsellContainer: {
marginTop: Module712.space.PX_16,
alignItems: "center"
},
upsellText: {
color: Module712.colors.TEXT_SUBTLE,
marginTop: Module712.space.PX_16,
textAlign: "center"
},
iconButtonGroup: {
flexDirection: "row",
paddingVertical: Module712.space.PX_8
},
keychainImage: {
height: 125,
width: 161
}
});
export default function PasskeyInitStep(props) {
if (props == null) {
HermesBuiltin.throwTypeError("Cannot destructure 'undefined' or 'null'.");
throw new Error("unreachable");
}
const navigation2 = useNavigation();
const styles2 = useStyles();
const hasFetchedCredentials = useStateFromStoresObject([WebAuthnStore], () => ({
hasFetchedCredentials: WebAuthnStore.hasFetchedCredentials()
})).hasFetchedCredentials;
useEffect(() => {
if (!hasFetchedCredentials) {
fetchWebAuthnCredentials();
}
}, [hasFetchedCredentials]);
useLayoutEffect(() => {
navigation2.setOptions({
headerRight: () => {
if (hasWebAuthn) {
return <HeaderActionButton text={intl.string(t.OYkgVk)} onPress={() => {
navigation2.push(WebAuthnScreens.REGISTER);
}} foregroundRipple />;
}
}
});
}, [navigation2]);
return <Form>
<View style={styles2.container}>
<CredentialList navigation={navigation2} />
</View>
</Form>;
};
@@ -0,0 +1,131 @@
// Metro module 13756 (f13757).
import { useState, useLayoutEffect } from "react";
import { Image as Image2, ScrollView, View } from "react-native";
import { WebAuthnScreens } from "../../WebAuthnConstants";
import { HelpdeskArticles } from "../../../../Constants";
import { ContentDismissActionType } from "../../../dismissible_content/DismissibleContentConstants";
import { createStyles } from "../../../../design/components/Styles/native/createStyles";
import Module712 from "../../../../_bundle/Module712";
import { useNavigation } from "../../../../design/components/Navigator/native/useNavigation.native";
import { intl, t } from "../../../../intl/index.native";
import PasskeyUpsellManager from "../PasskeyUpsellManager";
import PasskeyUpsellActionCreators from "../PasskeyUpsellActionCreators";
import { getHeaderCloseButton } from "../../../../design/components/Navigator/native/NavigatorHeader.native";
import HelpdeskUtils from "../../../../utils/HelpdeskUtils";
import { SafeAreaPaddingView } from "../../../../components_native/common/SafeAreaView";
import Module13761 from "../../../../_bundle/Module13761";
import { Text } from "../../../../design/components/Text/native/Text";
import { isIOS } from "../../../../utils/PlatformUtils";
import { Button } from "../../../../design/components/Button/native/Button.native";
import NativeCeremonies from "../NativeCeremonies";
const useStyles = createStyles({
container: {
flex: 1,
flexDirection: "column",
backgroundColor: Module712.colors.BACKGROUND_BASE_LOW
},
scrollViewContainer: {
flexGrow: 1,
justifyContent: "space-between",
paddingHorizontal: Module712.space.PX_16
},
headerContainer: {
alignItems: "center",
justifyContent: "center",
gap: Module712.space.PX_16
},
headerImage: {
height: 190,
width: 220,
resizeMode: "contain"
},
headerText: {
textAlign: "center"
},
circleIcon: {
backgroundColor: Module712.colors.BACKGROUND_BASE_LOWEST,
width: Module712.space.PX_32,
height: Module712.space.PX_32,
borderRadius: Module712.radii.round
},
listContainer: {
gap: Module712.space.PX_24,
marginLeft: Module712.space.PX_8,
marginRight: Module712.space.PX_8
},
row: {
flexDirection: "row",
gap: Module712.space.PX_8,
alignItems: "center"
},
text: {
flex: 1
},
buttonContainer: {
gap: Module712.space.PX_16,
alignItems: "center"
}
});
export default function PasskeyUpsellView() {
let navigation, onCancel2;
const onRegisterSuccess2 = function onRegisterSuccess(a0) {
navigation.push(WebAuthnScreens.NAME, {
...a0,
name: intl.string(t["8H5RmH"])
});
};
onCancel2 = function onCancel() {
PasskeyUpsellManager.markDismissed(ContentDismissActionType.USER_DISMISS);
PasskeyUpsellActionCreators.closePasskeyUpsellModal();
};
navigation = useNavigation();
const styles = useStyles();
const [, setState] = useState("");
const [disabled, setState2] = useState(false);
useLayoutEffect(() => {
navigation.setOptions({
headerLeft: getHeaderCloseButton(onCancel2)
});
}, [navigation]);
const articleURL = HelpdeskUtils.getArticleURL(HelpdeskArticles.SETTING_UP_TWO_FACTOR);
const r98 = [<View style={styles.headerContainer}>
<Image2 source={Module13761} style={styles.headerImage} />
<Text accessibilityRole="header" variant="heading-xl/bold" color="mobile-text-heading-primary" style={styles.headerText}>
{intl.string(t.CjleBl)}
</Text>
<Text variant="heading-md/normal" color="text-default" style={styles.headerText}>
{isIOS() ? intl.string(t["7yxR9t"]) : intl.string(t.d6uxJy)}
</Text>
</View>, , ,];
const r122 = [<View style={styles.row}>
<View style={styles.circleIcon} />
<Text variant="heading-md/normal" color="text-default" style={styles.text}>
{intl.string(t.HtqVkj)}
</Text>
</View>, <View style={styles.row}>
<View style={styles.circleIcon} />
<Text variant="heading-md/normal" color="text-default" style={styles.text}>
{isIOS() ? intl.string(t.U409I8) : intl.string(t.uYfqlo)}
</Text>
</View>];
r98[1] = <View style={styles.listContainer}>{r122}</View>;
r98[2] = <View style={styles.buttonContainer}>
<Text variant="text-sm/semibold" color="text-brand">
{intl.format(t.OeGXVv, {
learnMoreLink: articleURL
})}
</Text>
<Button text={disabled ? intl.string(t.wePEBF) : intl.string(t.NIFmCJ)} onPress={function onPress() {
PasskeyUpsellManager.markDismissed(ContentDismissActionType.TAKE_ACTION);
NativeCeremonies.registerPasskey({
setRegistering: setState2,
setError: setState,
onRegisterSuccess: onRegisterSuccess2
});
}} size="lg" disabled={disabled} loading={disabled} grow />
<Button text={disabled ? intl.string(t.wePEBF) : intl.string(t["7J6/nG"])} onPress={onCancel2} size="lg" variant="secondary" grow />
</View>;
return <SafeAreaPaddingView bottom style={styles.container}>
<ScrollView contentContainerStyle={styles.scrollViewContainer}>{r98}</ScrollView>
</SafeAreaPaddingView>;
};
@@ -0,0 +1,59 @@
// Metro module 13768 (f13769).
import { useState, useLayoutEffect } from "react";
import { createStyles } from "../../../../design/components/Styles/native/createStyles";
import Module712 from "../../../../_bundle/Module712";
import { useNavigation } from "../../../../design/components/Navigator/native/useNavigation.native";
import { getHeaderBackButton } from "../../../../design/components/Navigator/native/NavigatorHeader.native";
import { Form, FormInput, FormDivider } from "../../../../design/void/Form/native/index";
import { intl, t } from "../../../../intl/index.native";
import { ClearButtonVisibility } from "../../../../design/void/native";
import { Button } from "../../../../design/components/Button/native/Button.native";
import { editWebAuthnCredential } from "../../WebAuthnActionCreators";
import ToastActionCreators from "../../../toast/native/ToastActionCreators";
import Module9690 from "../../../../_bundle/Module9690";
import { CircleCheckIcon } from "../../../../design/components/Icon/native/redesign/generated/CircleCheckIcon";
const useStyles = createStyles({
inputField: {
marginBottom: Module712.space.PX_16
},
form: {
paddingHorizontal: Module712.space.PX_16
}
});
export default function EditCredentialModal(props) {
const credential = props.credential;
const styles = useStyles();
const navigation = useNavigation();
const [disabled, setState] = useState(false);
const [state, onChange] = useState("");
const [error, setState2] = useState(null);
useLayoutEffect(() => {
navigation.setOptions({
headerLeft: getHeaderBackButton(() => {
navigation.pop();
})
});
}, [navigation]);
return <Form style={styles.form}>
<FormInput showTopContainer={false} value={state} onChange={onChange} style={styles.inputField} error={error} title={intl.string(t["Jzd+z/"])} placeholder={credential.name} disabled={disabled} clearButtonVisibility={ClearButtonVisibility.WITH_CONTENT} autoFocus showBorder required large />
<FormDivider />
<Button onPress={function onPress() {
setState(true);
setState2(null);
editWebAuthnCredential(credential.id, state).then(() => {
ToastActionCreators.open({
key: "WEBAUTHN_CREDENTIAL_EDIT_SUCCESS_TOAST_KEY",
content: intl.string(t.IV13mH),
icon: Module9690,
IconComponent: CircleCheckIcon,
iconColor: "status-positive"
});
navigation.popToTop();
}).catch((error) => {
setState2(error.body.message);
}).finally(() => {
setState(false);
});
}} disabled={disabled || state === ""} loading={disabled} size="lg" text={intl.string(t["7asiR3"])} grow />
</Form>;
};
@@ -0,0 +1,113 @@
// Metro module 13772 (f13773).
import _slicedToArray from "../../../../_bundle/_slicedToArray";
import { useState } from "react";
import { View } from "react-native";
import { WebAuthnScreens } from "../../WebAuthnConstants";
import { createStyles } from "../../../../design/components/Styles/native/createStyles";
import { useNavigation } from "../../../../design/components/Navigator/native/useNavigation.native";
import { finishRegisterWebAuthnCredential } from "../../WebAuthnActionCreators";
import ToastActionCreators from "../../../toast/native/ToastActionCreators";
import { intl, t } from "../../../../intl/index.native";
import Module9690 from "../../../../_bundle/Module9690";
import { CircleCheckIcon } from "../../../../design/components/Icon/native/redesign/generated/CircleCheckIcon";
import { Form, FormInput, FormDivider } from "../../../../design/void/Form/native/index";
import { ClearButtonVisibility } from "../../../../design/void/native";
import { Button } from "../../../../design/components/Button/native/Button.native";
const useStyles = createStyles({
margin: {
margin: 16
}
});
export default function WebAuthnNameStep(props) {
let navigation, setState, setState2, state;
const { ticket, credential } = props;
let name = props.name;
navigation = void 0;
setState = void 0;
setState2 = void 0;
state = void 0;
let _onPress2 = function _onPress() {
const r9 = async () => {
let c30666_2;
let c30666_3 = 0;
try {
c30666_3 = 2;
setState(true);
await finishRegisterWebAuthnCredential(state, ticket, credential);
c30666_3 = 0;
(0, setState)(false);
ToastActionCreators.open({
key: "WEBAUTHN_CREDENTIAL_REGISTER_SUCCESS_TOAST_KEY",
content: intl.string(t.j3d5qI),
icon: Module9690,
IconComponent: CircleCheckIcon,
iconColor: "status-success"
});
navigation.push(WebAuthnScreens.SUCCESS, {});
} catch ($e) {
const r33 = $e;
let r7 = r33;
c30666_2 = r33;
let r34 = c30666_3;
if (r34 !== 0) {
while (true) {
if (r34 !== 1) {
try {
const r100 = c30666_2;
c30666_3 = 1;
(0, setState2)(r100.body.message);
c30666_3 = 0;
(0, setState)(false);
} catch (r98) {
r7 = r98;
c30666_2 = r98;
r34 = c30666_3;
if (r34 === 0) {
break;
}
continue;
}
return void 0;
}
try {
const r115 = c30666_2;
c30666_3 = 0;
(0, setState)(false);
throw r115;
} catch (r113) {
r7 = r113;
c30666_2 = r113;
r34 = c30666_3;
if (r34 === 0) {
break;
}
}
}
}
throw r7;
}
};
_onPress2 = r9;
return r9.apply(this, arguments);
};
const styles = useStyles();
navigation = useNavigation();
let disabled;
[disabled, setState] = useState(false);
let error;
[error, setState2] = useState(null);
if (name == null) {
name = "";
}
const r38 = _slicedToArray(useState(name), 2);
state = r38[0];
return <Form>
<FormInput showTopContainer={false} value={state} onChange={r38[1]} style={styles.margin} error={error} title={intl.string(t["Jzd+z/"])} placeholder={intl.string(t["I/sJtJ"])} disabled={disabled} clearButtonVisibility={ClearButtonVisibility.WITH_CONTENT} autoFocus showBorder required large />
<FormDivider />
<View style={styles.margin}>
<Button onPress={function onPress() {
return _onPress2.apply(this, arguments);
}} text={intl.string(t["5dyZ1S"])} disabled={state === ""} size="lg" />
</View>
</Form>;
};
@@ -0,0 +1,96 @@
// Metro module 13769 (f13770).
import { useState, useCallback, useMemo } from "react";
import { View } from "react-native";
import { WebAuthnScreens } from "../../WebAuthnConstants";
import { createStyles } from "../../../../design/components/Styles/native/createStyles";
import Module712 from "../../../../_bundle/Module712";
import NativeCeremonies from "../NativeCeremonies";
import { intl, t } from "../../../../intl/index.native";
import { RadioGroup } from "../../../../design/void/native";
import { useNavigation } from "../../../../design/components/Navigator/native/useNavigation.native";
import { isAndroid } from "../../../../utils/PlatformUtils";
import { SafeAreaPaddingView } from "../../../../components_native/common/SafeAreaView";
import { KeyImage } from "../../../mfa/native/components/KeyImage";
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";
let useStyles, c9579_10, c9579_11;
const AndroidPasskeyRadioGroup = function AndroidPasskeyRadioGroup(props) {
const { authenticatorSelection, onChange: onChange2, registering } = props;
return <RadioGroup style={useStyles().radioItem} options={[{
value: c9579_10.PASSKEY_CREDENTIAL_MANAGER,
name: intl.string(t.JQbo8L)
}, {
value: c9579_10.PASSKEY_DEVICE,
name: intl.string(t.GjBNMg)
}, {
value: c9579_10.OTHER_AND_ANDROID_NONDISCOVERABLE,
name: intl.string(t["OhC77+"])
}]} onChange={(event) => onChange2(event.value)} value={authenticatorSelection} disabled={registering} size={RadioGroup.Sizes.LARGE} withSpacing />;
};
useStyles = createStyles({
flexContainer: {
flex: 1,
flexDirection: "column",
alignItems: "stretch",
justifyContent: "space-between",
marginLeft: 16,
marginRight: 16,
marginTop: 16
},
centerFlex: {
display: "flex",
alignItems: "center"
},
margin: {
marginTop: 16,
textAlign: "center"
},
radioItem: {
backgroundColor: Module712.colors.BACKGROUND_SURFACE_HIGH,
borderRadius: Module712.radii.md
}
});
c9579_10 = {
PASSKEY_CREDENTIAL_MANAGER: 0,
0: "PASSKEY_CREDENTIAL_MANAGER",
PASSKEY_DEVICE: 1,
1: "PASSKEY_DEVICE",
OTHER_AND_ANDROID_NONDISCOVERABLE: 2,
2: "OTHER_AND_ANDROID_NONDISCOVERABLE"
};
const r52 = {};
r52[c9579_10.PASSKEY_CREDENTIAL_MANAGER] = NativeCeremonies.registerPasskey;
r52[c9579_10.PASSKEY_DEVICE] = NativeCeremonies.registerAndroidDevicePasskey;
r52[c9579_10.OTHER_AND_ANDROID_NONDISCOVERABLE] = NativeCeremonies.registerSecurityKey;
c9579_11 = r52;
export default function WebAuthnRegisterStep() {
let memo, memo2;
const navigation = useNavigation();
const styles = useStyles();
const [registering, setState] = useState(false);
const [state2, setState2] = useState("");
const [state, onChange3] = useState(isAndroid() ? c9579_10.PASSKEY_CREDENTIAL_MANAGER : c9579_10.OTHER_AND_ANDROID_NONDISCOVERABLE);
const callback = useCallback((a0) => {
navigation.push(WebAuthnScreens.NAME, a0);
}, [navigation]);
memo = useMemo(() => c9579_11[state], [state]);
memo2 = useMemo(() => ({
onRegisterSuccess: callback,
setError: setState2,
setRegistering: setState
}), [callback, setState2, setState]);
return <SafeAreaPaddingView bottom left right style={styles.flexContainer}>
<View style={styles.centerFlex}>
<KeyImage />
<Text style={styles.margin} variant="text-md/normal">
{registering ? intl.string(t.aVMiX3) : intl.string(t.Lh5vTW)}
</Text>
{state2 != null && <Text variant="text-md/normal" color="text-feedback-critical">{state2}</Text>}
</View>
{NativeCeremonies.shouldDisplayAndroidFidoSelector && <AndroidPasskeyRadioGroup authenticatorSelection={state} registering={registering} onChange={onChange3} />}
<ButtonGroup>
<Button text={registering ? intl.string(t.wePEBF) : intl.string(t.oibaQa)} disabled={registering} loading={registering} onPress={() => memo(memo2)} size="lg" />
</ButtonGroup>
</SafeAreaPaddingView>;
};
@@ -0,0 +1,19 @@
// Metro module 13773 (f13774).
import { useLayoutEffect } from "react";
import { useNavigation } from "../../../../design/components/Navigator/native/useNavigation.native";
import { getHeaderCloseButton } from "../../../../design/components/Navigator/native/NavigatorHeader.native";
import PasskeyUpsellActionCreators from "../PasskeyUpsellActionCreators";
import UserSettingsAccountBackupCodes from "../../../user_settings/account/native/UserSettingsAccountBackupCodes";
import { intl, t } from "../../../../intl/index.native";
export default function WebAuthnSuccessStep() {
const navigation = useNavigation();
useLayoutEffect(() => {
navigation.setOptions({
headerLeft: getHeaderCloseButton(() => {
navigation.popToTop();
PasskeyUpsellActionCreators.closePasskeyUpsellModal();
})
});
}, [navigation]);
return <UserSettingsAccountBackupCodes onGenerate={null} headerLabel={intl.format(t.iVTs6i, {})} />;
};