as-app/src/hooks/useSendAuthSMS.js

51 lines
1.5 KiB
JavaScript

import { gql, useLazyQuery } from "@apollo/client";
import Base62Str from "base62str";
import sha256 from "hash.js/lib/hash/sha/256";
import hmac from "hash.js/lib/hash/hmac";
import sendSMS from "~/lib/sms/sendSMS";
import { useSessionState } from "~/stores";
const base62 = Base62Str.createInstance();
async function generateCode(userId, signKey, type) {
const timestampInSeconds = Math.floor(Date.now() / 1000);
const signature = hmac(sha256, signKey)
.update(`${userId}.${timestampInSeconds}`)
.digest("hex");
return (
"AS_" +
type +
"_" +
base62.encodeStr(`${userId}.${timestampInSeconds}#${signature}`)
);
}
const GET_GENERATE_CODE_REQUIREMENTS = gql`
query getGenerateCodeRequirements($userId: Int!) {
selectManyAuthSignKey(where: { userId: { _eq: $userId } }) {
key
}
selectOneExternalPublicConfig(key: smsVerificationNumber) {
value
}
}
`;
export default function useSendAuthSMS() {
const [getGenerateCodeRequirements] = useLazyQuery(
GET_GENERATE_CODE_REQUIREMENTS,
);
const { userId } = useSessionState(["userId"]);
return async ({ body, smsType }) => {
const { data } = await getGenerateCodeRequirements({
variables: {
userId,
},
});
const verificationNumber = data.selectOneExternalPublicConfig.value;
const signKey = data.selectManyAuthSignKey[0].key;
const code = await generateCode(userId, signKey, smsType);
sendSMS([verificationNumber], body.replace(/\[CODE\]/g, code));
};
}