0
Fork 0
mirror of https://github.com/logto-io/logto.git synced 2025-01-27 21:39:16 -05:00
logto/packages/ui/src/hooks/use-social.ts
2022-10-21 14:03:35 +08:00

73 lines
2.1 KiB
TypeScript

import type { ConnectorMetadata } from '@logto/schemas';
import { useCallback, useContext } from 'react';
import { invokeSocialSignIn } from '@/apis/social';
import { getLogtoNativeSdk, isNativeWebview } from '@/utils/native-sdk';
import { generateState, storeState, buildSocialLandingUri } from '@/utils/social-connectors';
import useApi from './use-api';
import { PageContext } from './use-page-context';
import useTerms from './use-terms';
const useSocial = () => {
const { experienceSettings, theme } = useContext(PageContext);
const { termsValidation } = useTerms();
const { run: asyncInvokeSocialSignIn } = useApi(invokeSocialSignIn);
const nativeSignInHandler = useCallback((redirectTo: string, connector: ConnectorMetadata) => {
const { id: connectorId, platform } = connector;
const redirectUri =
platform === 'Universal'
? buildSocialLandingUri(`/social/landing/${connectorId}`, redirectTo).toString()
: redirectTo;
getLogtoNativeSdk()?.getPostMessage()({
callbackUri: `${window.location.origin}/sign-in/social/${connectorId}`,
redirectTo: redirectUri,
});
}, []);
const invokeSocialSignInHandler = useCallback(
async (connector: ConnectorMetadata) => {
if (!(await termsValidation())) {
return;
}
const { id: connectorId } = connector;
const state = generateState();
storeState(state, connectorId);
const result = await asyncInvokeSocialSignIn(
connectorId,
state,
`${window.location.origin}/callback/${connectorId}`
);
if (!result?.redirectTo) {
return;
}
// Invoke Native Social Sign In flow
if (isNativeWebview()) {
nativeSignInHandler(result.redirectTo, connector);
return;
}
// Invoke Web Social Sign In flow
window.location.assign(result.redirectTo);
},
[asyncInvokeSocialSignIn, nativeSignInHandler, termsValidation]
);
return {
theme,
socialConnectors: experienceSettings?.socialConnectors ?? [],
invokeSocialSignIn: invokeSocialSignInHandler,
};
};
export default useSocial;