IGPAPI
    Preparing search index...

    Variable LoginHomepageScreenConst

    LoginHomepageScreen: ScreenDefinition<
        "LoginHomepage",
        "screen",
        undefined,
        {
            aac: string;
            attestationChallengeNonce?: string;
            loginEntryPoint: "login-home"
            | "landing-screen";
            oauthQpl: { instanceId: number; markerId: number };
            passwordTextInputId: string;
            qpl: { instanceId: number; markerId: number };
            recoveryTicket?: string & Brand<"RecoveryActionTicket">;
            usernameTextInputId: string;
            waterfallId: string;
        },
        {
            aac: string;
            attestationChallengeNonce?: string;
            loginEntryPoint: "login-home"
            | "landing-screen";
            oauthQpl: { instanceId: number; markerId: number };
            passwordTextInputId: string;
            qpl: { instanceId: number; markerId: number };
            recoveryTicket?: string & Brand<"RecoveryActionTicket">;
            usernameTextInputId: string;
            waterfallId: string;
        },
        | InvalidSkipOrdinalsError
        | ScreenEnterNavigationError
        | LoginHomepageNotLaunchedError,
        MobileNavigation
        | LoginHomepageLaunch,
        {
            createNewAccount: (
                self: ScreenHandle,
                state: {
                    aac: string;
                    attestationChallengeNonce?: string;
                    loginEntryPoint: "login-home" | "landing-screen";
                    oauthQpl: { instanceId: number; markerId: number };
                    passwordTextInputId: string;
                    qpl: { instanceId: number; markerId: number };
                    recoveryTicket?: string & Brand<"RecoveryActionTicket">;
                    usernameTextInputId: string;
                    waterfallId: string;
                },
            ) => ScreenEdgeBound<
                ScreenEdgeShape<RegistrationPhoneNumberDefinition, []>,
                (
                    ...args: [],
                ) => Effect<
                    AssembledHandle<
                        "RegistrationPhoneNumber",
                        "screen",
                        {},
                        {
                            submitPhoneNumber: (
                                self: ScreenHandle,
                                state: State,
                            ) => (...args: [phoneNumber: ...]) => Effect<(...), (...), (...)>;
                        },
                        Record<never, never>,
                        ScreenHandle,
                        "required",
                    >,

                        | IgNotFoundError
                        | IgRateLimitError
                        | IgSpamError
                        | IgSignupBlockError
                        | IgCheckpointError
                        | IgAccountSuspendedError
                        | IgAccountDisabledError
                        | IgCookieConsentRequiredError
                        | IgLoginRequiredError
                        | IgUserLoggedOutError
                        | IgChallengeWrongCodeError
                        | IgPrivateUserError
                        | IgInactiveUserError
                        | IgSentryBlockError
                        | IgUploadVideoError
                        | IgConfigureVideoError
                        | IgExactUserNotFoundError
                        | IgUserIdNotFoundError
                        | IgNetworkError
                        | IgDecompressionError
                        | IgParseError
                        | IgIpBlockError
                        | IgLoginTwoFactorRequiredError
                        | IgRequestsLimitError
                        | IgNotResolvableError
                        | RequestError
                        | ParseError
                        | TransportError
                        | IgBloks429Error
                        | InvalidSkipOrdinalsError
                        | ScreenDataError
                        | ScreenEnterNavigationError
                        | ScreenEnterConcurrentError
                        | ScreenNotOnTopError
                        | ScreenEdgeInputError,
                >,
            >;
            logIn: (
                self: LoginHomepageFrame,
                state: {
                    aac: string;
                    attestationChallengeNonce?: string;
                    loginEntryPoint: "login-home" | "landing-screen";
                    oauthQpl: { instanceId: number; markerId: number };
                    passwordTextInputId: string;
                    qpl: { instanceId: number; markerId: number };
                    recoveryTicket?: string & Brand<"RecoveryActionTicket">;
                    usernameTextInputId: string;
                    waterfallId: string;
                },
            ) => (
                ...args: [credentials: LoginInput],
            ) => Effect<
                LoginHomepageAnswer,
                | IgNotFoundError
                | IgRateLimitError
                | IgSpamError
                | IgSignupBlockError
                | IgCheckpointError
                | IgAccountSuspendedError
                | IgAccountDisabledError
                | IgCookieConsentRequiredError
                | IgLoginRequiredError
                | IgUserLoggedOutError
                | IgChallengeWrongCodeError
                | IgPrivateUserError
                | IgInactiveUserError
                | IgSentryBlockError
                | IgUploadVideoError
                | IgConfigureVideoError
                | IgExactUserNotFoundError
                | IgUserIdNotFoundError
                | IgNetworkError
                | IgDecompressionError
                | IgParseError
                | IgIpBlockError
                | IgLoginTwoFactorRequiredError
                | IgRequestsLimitError
                | IgNotResolvableError
                | RequestError
                | ParseError
                | TransportError
                | PasswordEncryptionKeysUnavailableError
                | LoginBloksParseError
                | LoginBloksRejectedError
                | LoginTwoFactorEntrypointParseError
                | LoginAccountRecoveryRequiredError
                | LoginAccountRecoveryContinueError
                | IgBloks429Error
                | IgLoginBadPasswordError
                | InvalidSkipOrdinalsError
                | AccountRecoveryBloksIssuedParamsMissingError
                | ScreenDataError
                | ScreenFeedPageError
                | ScreenEnterNavigationError
                | ScreenEnterConcurrentError
                | ScreenLaunchFirstScreenError
                | ScreenLaunchScreenNotInCatalogError
                | ScreenLaunchSplashNotOnTopError
                | ScreenLaunchSplashScreenError
                | AppAlreadyStartedError
                | ProcessNotSignedInError
                | AccountRecoveryTicketUnknownError
                | ScreenNotOnTopError
                | ScreenEdgeInputError
                | LoginPendingError
                | TwoFactorTicketUnknownError,
                | PlainJsonApiHttp
                | MobileSession
                | MobileDevice
                | MobileApplication
                | SessionHeaderParser
                | BloksHttp
                | MobileNavigation
                | AccountRecoveryTickets
                | LoginHomepageLaunch
                | ScreenCatalog
                | ScreenStack
                | TwoFactorTickets,
            >;
            openApproveFromAnotherDevice: <Self extends ScreenHandle>(
                self: Self,
                state: {
                    aac: string;
                    attestationChallengeNonce?: string;
                    loginEntryPoint: "login-home" | "landing-screen";
                    oauthQpl: { instanceId: number; markerId: number };
                    passwordTextInputId: string;
                    qpl: { instanceId: number; markerId: number };
                    recoveryTicket?: string & Brand<"RecoveryActionTicket">;
                    usernameTextInputId: string;
                    waterfallId: string;
                },
            ) => ScreenEdgeBound<
                ScreenEdgeShape<
                    ScreenDefinition<
                        "LoginTwoFactorEntrypoint",
                        "screen",
                        undefined,
                        { ticket: string & Brand<"TwoFactorApprovalTicket"> },
                        LoginTwoFactorApproveFromAnotherDeviceState,

                            | InvalidSkipOrdinalsError
                            | ScreenEnterNavigationError
                            | TwoFactorTicketUnknownError,
                        MobileNavigation
                        | TwoFactorTickets,
                        {
                            checkApproval: (
                                self: ScreenHandle,
                                state: LoginTwoFactorApproveFromAnotherDeviceState,
                            ) => (
                                ...args: [],
                            ) => Effect<
                                LoginTwoFactorApproveFromAnotherDeviceCheck,
                                | (...)
                                | (...)
                                | (...)
                                | (...)
                                | (...)
                                | (...)
                                | (...)
                                | (...)
                                | (...)
                                | (...)
                                | (...)
                                | (...)
                                | (...)
                                | (...)
                                | (...)
                                | (...)
                                | (...)
                                | (...)
                                | (...)
                                | (...)
                                | (...)
                                | (...)
                                | (...)
                                | (...)
                                | (...)
                                | (...)
                                | (...)
                                | (...)
                                | (...)
                                | (...)
                                | (...)
                                | (...)
                                | (...)
                                | (...)
                                | (...)
                                | (...)
                                | (...)
                                | (...)
                                | (...)
                                | (...)
                                | (...)
                                | (...)
                                | (...)
                                | (...),
                                (...) | (...) | (...) | (...) | (...) | (...) | (...) | (...),
                            >;
                            tryAnotherWay: (
                                self: ScreenHandle,
                                state: LoginTwoFactorApproveFromAnotherDeviceState,
                            ) => ScreenEdgeBound<
                                ScreenEdgeShape<
                                    ScreenDefinition<
                                        (...),
                                        (...),
                                        (...),
                                        (...),
                                        (...),
                                        (...),
                                        (...),
                                        (...),
                                        (...),
                                        (...),
                                    >,
                                    [],
                                >,
                                (...args: []) => Effect<(...), (...)>,
                            >;
                        },
                        Record<never, never>,
                        never,
                    >,
                    [],
                >,
                (
                    ...args: [],
                ) => Effect<
                    AssembledHandle<
                        "LoginTwoFactorEntrypoint",
                        "screen",
                        { ticket: string & Brand<"TwoFactorApprovalTicket"> },
                        {
                            checkApproval: (
                                self: ScreenHandle,
                                state: LoginTwoFactorApproveFromAnotherDeviceState,
                            ) => (...args: []) => Effect<(...), (...), (...)>;
                            tryAnotherWay: (
                                self: ScreenHandle,
                                state: LoginTwoFactorApproveFromAnotherDeviceState,
                            ) => ScreenEdgeBound<
                                ScreenEdgeShape<(...), (...)>,
                                (...args: ...) => ...,
                            >;
                        },
                        Record<never, never>,
                        Self,
                        "required",
                    >,

                        | InvalidSkipOrdinalsError
                        | ScreenDataError
                        | ScreenEnterNavigationError
                        | ScreenEnterConcurrentError
                        | ScreenNotOnTopError
                        | ScreenEdgeInputError
                        | TwoFactorTicketUnknownError,
                >,
            >;
            openEmailCode: <Self extends ScreenHandle>(
                self: Self,
                state: {
                    aac: string;
                    attestationChallengeNonce?: string;
                    loginEntryPoint: "login-home" | "landing-screen";
                    oauthQpl: { instanceId: number; markerId: number };
                    passwordTextInputId: string;
                    qpl: { instanceId: number; markerId: number };
                    recoveryTicket?: string & Brand<"RecoveryActionTicket">;
                    usernameTextInputId: string;
                    waterfallId: string;
                },
            ) => ScreenEdgeBound<
                ScreenEdgeShape<
                    ScreenDefinition<
                        "AccountRecoveryEmailCode",
                        "screen",
                        undefined,
                        {
                            maskedContact?: string;
                            ticket: string & Brand<"LastResortCodeEntryTicket">;
                        },
                        {
                            maskedContact?: string;
                            ticket: string & Brand<"LastResortCodeEntryTicket">;
                        },
                        | BloksHttpError
                        | InvalidSkipOrdinalsError
                        | AccountRecoveryBloksIssuedParamsMissingError
                        | ScreenEnterNavigationError
                        | AccountRecoveryTicketUnknownError,
                        | MobileSession
                        | MobileDevice
                        | MobileApplication
                        | BloksHttp
                        | MobileNavigation
                        | AccountRecoveryTickets,
                        {
                            requestNewCode: (
                                self: ScreenHandle,
                                state: { maskedContact?: string; ticket: string & Brand<(...)> },
                            ) => (
                                ...args: [],
                            ) => Effect<
                                (...)
                                | (...),

                                    | (...)
                                    | (...)
                                    | (...)
                                    | (...)
                                    | (...)
                                    | (...)
                                    | (...)
                                    | (...)
                                    | (...)
                                    | (...)
                                    | (...)
                                    | (...)
                                    | (...)
                                    | (...)
                                    | (...)
                                    | (...)
                                    | (...)
                                    | (...)
                                    | (...)
                                    | (...)
                                    | (...)
                                    | (...)
                                    | (...)
                                    | (...)
                                    | (...)
                                    | (...)
                                    | (...)
                                    | (...)
                                    | (...)
                                    | (...)
                                    | (...)
                                    | (...)
                                    | (...)
                                    | (...)
                                    | (...)
                                    | (...)
                                    | (...)
                                    | (...)
                                    | (...)
                                    | (...)
                                    | (...)
                                    | (...)
                                    | (...)
                                    | (...)
                                    | (...),
                                (...) | (...) | (...) | (...) | (...) | (...) | (...) | (...),
                            >;
                            submitCode: (
                                self: ScreenHandle,
                                state: { maskedContact?: string; ticket: string & Brand<(...)> },
                            ) => (
                                ...args: [code: string],
                            ) => Effect<
                                AccountRecoveryFirstScreen,
                                | (...)
                                | (...)
                                | (...)
                                | (...)
                                | (...)
                                | (...)
                                | (...)
                                | (...)
                                | (...)
                                | (...)
                                | (...)
                                | (...)
                                | (...)
                                | (...)
                                | (...)
                                | (...)
                                | (...)
                                | (...)
                                | (...)
                                | (...)
                                | (...)
                                | (...)
                                | (...)
                                | (...)
                                | (...)
                                | (...)
                                | (...)
                                | (...)
                                | (...)
                                | (...)
                                | (...)
                                | (...)
                                | (...)
                                | (...)
                                | (...)
                                | (...)
                                | (...)
                                | (...)
                                | (...)
                                | (...)
                                | (...)
                                | (...)
                                | (...)
                                | (...)
                                | (...),
                                (...) | (...) | (...) | (...) | (...) | (...) | (...) | (...),
                            >;
                        },
                        Record<never, never>,
                        never,
                    >,
                    [],
                >,
                (
                    ...args: [],
                ) => Effect<
                    AssembledHandle<
                        "AccountRecoveryEmailCode",
                        "screen",
                        {
                            maskedContact?: string;
                            ticket: string & Brand<"LastResortCodeEntryTicket">;
                        },
                        {
                            requestNewCode: (
                                self: ScreenHandle,
                                state: { maskedContact?: (...) | (...); ticket: (...) & (...) },
                            ) => (...args: []) => Effect<(...), (...), (...)>;
                            submitCode: (
                                self: ScreenHandle,
                                state: { maskedContact?: (...) | (...); ticket: (...) & (...) },
                            ) => (...args: [code: ...]) => Effect<(...), (...), (...)>;
                        },
                        Record<never, never>,
                        Self,
                        "required",
                    >,

                        | BloksHttpError
                        | InvalidSkipOrdinalsError
                        | AccountRecoveryBloksIssuedParamsMissingError
                        | ScreenDataError
                        | ScreenEnterNavigationError
                        | ScreenEnterConcurrentError
                        | AccountRecoveryTicketUnknownError
                        | ScreenNotOnTopError
                        | ScreenEdgeInputError,
                >,
            >;
            openMethodPicker: <Self extends ScreenHandle>(
                self: Self,
                state: {
                    aac: string;
                    attestationChallengeNonce?: string;
                    loginEntryPoint: "login-home" | "landing-screen";
                    oauthQpl: { instanceId: number; markerId: number };
                    passwordTextInputId: string;
                    qpl: { instanceId: number; markerId: number };
                    recoveryTicket?: string & Brand<"RecoveryActionTicket">;
                    usernameTextInputId: string;
                    waterfallId: string;
                },
            ) => ScreenEdgeBound<
                ScreenEdgeShape<
                    ScreenDefinition<
                        "LoginTwoFactorMethodPicker",
                        "screen",
                        { ticket?: string & Brand<"TwoFactorApprovalTicket"> },
                        {
                            offeredMethods: readonly (
                                | "approve_from_another_device"
                                | "whatsapp"
                                | "totp"
                                | "sms"
                                | "backup_codes"
                            )[];
                            preselected?: | "approve_from_another_device"
                            | "whatsapp"
                            | "totp"
                            | "sms"
                            | "backup_codes";
                            ticket: string & Brand<"TwoFactorPickerTicket">;
                        },
                        LoginTwoFactorChooseMethodState,
                        | BloksHttpError
                        | InvalidSkipOrdinalsError
                        | ScreenEnterNavigationError
                        | TwoFactorTicketUnknownError,
                        | MobileDevice
                        | MobileApplication
                        | BloksHttp
                        | MobileNavigation
                        | TwoFactorTickets,
                        {
                            chooseAuthenticationApp: (
                                self: ScreenHandle,
                                state: LoginTwoFactorChooseMethodState,
                            ) => ScreenEdgeBound<
                                ScreenEdgeShape<
                                    ScreenDefinition<
                                        (...),
                                        (...),
                                        (...),
                                        (...),
                                        (...),
                                        (...),
                                        (...),
                                        (...),
                                        (...),
                                        (...),
                                    >,
                                    [],
                                >,
                                (...args: []) => Effect<(...), (...)>,
                            >;
                        },
                        Record<never, never>,
                        never,
                    >,
                    [],
                >,
                (
                    ...args: [],
                ) => Effect<
                    AssembledHandle<
                        "LoginTwoFactorMethodPicker",
                        "screen",
                        {
                            offeredMethods: readonly (
                                | "approve_from_another_device"
                                | "whatsapp"
                                | "totp"
                                | "sms"
                                | "backup_codes"
                            )[];
                            preselected?: | "approve_from_another_device"
                            | "whatsapp"
                            | "totp"
                            | "sms"
                            | "backup_codes";
                            ticket: string & Brand<"TwoFactorPickerTicket">;
                        },
                        {
                            chooseAuthenticationApp: (
                                self: ScreenHandle,
                                state: LoginTwoFactorChooseMethodState,
                            ) => ScreenEdgeBound<
                                ScreenEdgeShape<(...), (...)>,
                                (...args: ...) => ...,
                            >;
                        },
                        Record<never, never>,
                        Self,
                        "required",
                    >,

                        | BloksHttpError
                        | InvalidSkipOrdinalsError
                        | ScreenDataError
                        | ScreenEnterNavigationError
                        | ScreenEnterConcurrentError
                        | ScreenNotOnTopError
                        | ScreenEdgeInputError
                        | TwoFactorTicketUnknownError,
                >,
            >;
            recoverPassword: (
                self: ScreenHandle,
                state: {
                    aac: string;
                    attestationChallengeNonce?: string;
                    loginEntryPoint: "login-home" | "landing-screen";
                    oauthQpl: { instanceId: number; markerId: number };
                    passwordTextInputId: string;
                    qpl: { instanceId: number; markerId: number };
                    recoveryTicket?: string & Brand<"RecoveryActionTicket">;
                    usernameTextInputId: string;
                    waterfallId: string;
                },
            ) => ScreenEdgeBound<
                ScreenEdgeShape<
                    ScreenDefinition<
                        "AccountRecoverySearch",
                        "screen",
                        { aac: string; ticket?: string & Brand<"RecoveryActionTicket"> },
                        {
                            aac: string;
                            searchScreenType: string;
                            searchTicket: string & Brand<"SearchTicket">;
                            textInputId: string;
                            waterfallId: string;
                        },
                        {
                            aac: string;
                            searchScreenType: string;
                            searchTicket: string & Brand<"SearchTicket">;
                            textInputId: string;
                            waterfallId: string;
                        },
                        | BloksHttpError
                        | InvalidSkipOrdinalsError
                        | AccountRecoveryBloksIssuedParamsMissingError
                        | ScreenEnterNavigationError
                        | AccountRecoveryTicketUnknownError,
                        | MobileDevice
                        | MobileApplication
                        | BloksHttp
                        | MobileNavigation
                        | AccountRecoveryTickets,
                        {
                            findAccount: (
                                self: ScreenHandle,
                                state: {
                                    aac: string;
                                    searchScreenType: string;
                                    searchTicket: string & Brand<(...)>;
                                    textInputId: string;
                                    waterfallId: string;
                                },
                            ) => ScreenEdgeBound<
                                ScreenEdgeShape<
                                    ScreenDefinition<
                                        (...),
                                        (...),
                                        (...),
                                        (...),
                                        (...),
                                        (...),
                                        (...),
                                        (...),
                                        (...),
                                        (...),
                                    >,
                                    readonly [(...)],
                                >,
                                (...args: readonly [(...)]) => Effect<(...), (...)>,
                            >;
                        },
                        Record<never, never>,
                        never,
                    >,
                    [],
                >,
                (
                    ...args: [],
                ) => Effect<
                    AssembledHandle<
                        "AccountRecoverySearch",
                        "screen",
                        {
                            aac: string;
                            searchScreenType: string;
                            searchTicket: string & Brand<"SearchTicket">;
                            textInputId: string;
                            waterfallId: string;
                        },
                        {
                            findAccount: (
                                self: ScreenHandle,
                                state: {
                                    aac: string;
                                    searchScreenType: string;
                                    searchTicket: (...) & (...);
                                    textInputId: string;
                                    waterfallId: string;
                                },
                            ) => ScreenEdgeBound<
                                ScreenEdgeShape<(...), (...)>,
                                (...args: ...) => ...,
                            >;
                        },
                        Record<never, never>,
                        ScreenHandle,
                        "required",
                    >,

                        | BloksHttpError
                        | InvalidSkipOrdinalsError
                        | AccountRecoveryBloksIssuedParamsMissingError
                        | ScreenDataError
                        | ScreenEnterNavigationError
                        | ScreenEnterConcurrentError
                        | AccountRecoveryTicketUnknownError
                        | ScreenNotOnTopError
                        | ScreenEdgeInputError,
                >,
            >;
        },
        Record<never, never>,
        never,
    > = ...

    com.bloks.www.caa.login.login_homepage, the login home of a logged-out Android process. It is reached as the logged-out launch's first screen: the launch's burst is the recorded pre-login bootstrap (the client-data redirect, USDID registration, the login-home screen fetch, the phone prefill), and the launch returns this screen's handle. The screen itself sends nothing on entry; it shows the state the burst issued, as the Android 448 app's pre-login flow shows it: the login form with its two text inputs, the account-access-context token and waterfall id every later call chains, the login entry point, and the "Forgot password" entry the login-home action graph issued (held as an opaque ticket).

    Login homepage

    Its actions:

    • logIn(credentials) sends the identified login: oauth.token.fetch with the typed username, then send_login_request (the recorded pre-login/017 → login@fresh/018 order). Its answer continues the process into the feed, or opens a two-factor screen, or the last-resort recovery code screen — each as a normal edge the login home stays under. The post-login burst registers the device's FCM/FBNS push token (AndroidApp({ pushToken })), which the launch reads from the device:

      • the feed — the session exists, so the action continues the process through the platform's recorded launch, which sends the post-login burst and opens the feed; the handle is the feed's, and its data and actions are the launched process's;
      • LoginTwoFactorApproveFromAnotherDeviceScreen — the entrypoint scheduled the trusted-notification poll, so the app waits for the login to be approved on another device. The action opens that screen as a normal edge and returns its handle; the entrypoint request was already sent by the login, and the issued poll reaches the screen as a process handoff;
      • LoginTwoFactorChooseMethodScreen — the entrypoint scheduled no poll, so the server's default is another method. The login already fetched the picker; the action opens it with the issued rows and returns its handle;
      • AccountRecoveryEmailCodeScreen — the answer escalated to last-resort recovery; the action opens the code-entry screen from its process handoff.

      A wrong password and the shared flow's other refusals stay failures, and a failed attempt forgets the escalation an earlier answer issued. The login home's issued state is spent once the login produced any of these answers: the 2FA screens continue from their own issued tickets and the recovery screen from its own, never from the form's state.

    • createNewAccount() opens the registration's first screen, RegistrationPhoneNumberScreen ("What's your phone number?"). The recorded "Create new account" answer — the sign-up session's start — is that screen's enter burst, so the transition itself sends nothing and the login home stays under it.

    • recoverPassword() opens AccountRecoverySearch with that ticket and the login home's aac.

    • openApproveFromAnotherDevice(), openMethodPicker() and openEmailCode() are the transitions logIn takes after its answer; they are public names because the trail records them. Each target takes its issued values from the process handoff the login left, so a direct call in a fresh process requires that handoff as a precondition (the checkpoint work, #314).

    Registration is modelled from its first screen on: createNewAccount() opens RegistrationPhoneNumberScreen, and the registration screens carry their own steps to the account creation. The server-decided login outcomes other than 2FA and the last-resort recovery are not modelled: no edge is declared for them.