import { useWallet } from "@solana/wallet-adapter-react";
import {
ClaimsApi,
VerifySignatureAndCreatePassRequestWalletTypeEnum,
} from "@passentry/pow-cards-client";
import bs58 from "bs58";
import { useState } from "react";
export const useWalletSignIn = () => {
const { publicKey, signMessage, wallet } = useWallet();
const [isLoading, setIsLoading] = useState(false);
const [error, setError] = useState<string | null>(null);
const [isSuccess, setIsSuccess] = useState(false);
const signIn = async () => {
if (!publicKey || !signMessage) {
throw new Error("Wallet not connected");
}
try {
setIsLoading(true);
setError(null);
// 1. Initialize the Claims API client
const claimsApi = new ClaimsApi();
// 2. Get sign-in data from backend
const initResponse = await claimsApi.initializeClaimProcess({
publicKey: publicKey.toBase58(),
});
// 3. Request signature from wallet
const encodedMessage = new TextEncoder().encode(initResponse.message);
const signature = await signMessage(encodedMessage);
// 4. Verify signature and create pass
const verifyResponse = await claimsApi.verifySignatureAndCreatePass({
verifySignatureAndCreatePassRequest: {
message: initResponse.message,
publicKey: publicKey.toBase58(),
signature: bs58.encode(signature),
walletType:
(wallet?.adapter
.name as VerifySignatureAndCreatePassRequestWalletTypeEnum) ||
"Generic",
},
});
setIsSuccess(true);
return verifyResponse;
} catch (err) {
setError("Error with your request. Please try again.");
throw err;
} finally {
setIsLoading(false);
}
};
return { signIn, isLoading, error, isSuccess };
};