/
login.ts
43 lines (38 loc) · 1.24 KB
/
login.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
/**
* Copyright 2023 Shinami Corp.
* SPDX-License-Identifier: Apache-2.0
*/
import { Ed25519Keypair } from "@mysten/sui.js/keypairs/ed25519";
import { generateNonce, generateRandomness } from "@mysten/zklogin";
import { UseMutationResult, useMutation } from "@tanstack/react-query";
import { useLogout } from "./api.js";
import { ZkLoginLocalSession, useSaveZkLoginLocalSession } from "./session.js";
/**
* React hook for initializing a new zkLogin session.
*
* Uses TanStack mutation.
*/
export function useNewZkLoginSession(): UseMutationResult<
ZkLoginLocalSession,
unknown,
{ getMaxEpoch: () => Promise<number> | number }
> {
const { mutateAsync: logout } = useLogout();
const { mutateAsync: save } = useSaveZkLoginLocalSession();
return useMutation({
mutationFn: async ({ getMaxEpoch }) => {
await logout(undefined);
const ephemeralKeyPair = new Ed25519Keypair();
const jwtRandomness = generateRandomness();
const maxEpoch = await getMaxEpoch();
const nonce = generateNonce(
ephemeralKeyPair.getPublicKey(),
maxEpoch,
jwtRandomness
);
const session = { ephemeralKeyPair, maxEpoch, jwtRandomness, nonce };
await save(session);
return session;
},
});
}