feat(fim): add fim login callback

pull/100/head
moonrailgun 2 years ago
parent d41cfe2464
commit f6ef59e37d

@ -24,7 +24,7 @@ export {
getGlobalState, getGlobalState,
useGlobalSocketEvent, useGlobalSocketEvent,
} from '@/utils/global-state-helper'; } from '@/utils/global-state-helper';
export { getJWTUserInfo } from '@/utils/jwt-helper'; export { setUserJWT, getJWTUserInfo } from '@/utils/jwt-helper';
export { dataUrlToFile } from '@/utils/file-helper'; export { dataUrlToFile } from '@/utils/file-helper';
export { export {
urlSearchStringify, urlSearchStringify,
@ -67,6 +67,7 @@ export {
showMessageTime, showMessageTime,
joinArray, joinArray,
useConverseMessageContext, useConverseMessageContext,
loginWithToken,
} from 'tailchat-shared'; } from 'tailchat-shared';
export { navigate } from '@/components/AppRouterApi'; export { navigate } from '@/components/AppRouterApi';

@ -1,7 +1,14 @@
import React from 'react'; import React, { useEffect, useRef } from 'react';
import { useAsync } from '@capital/common'; import {
useAsync,
showToasts,
useNavigate,
loginWithToken,
setUserJWT,
} from '@capital/common';
import { Divider, Image, Tooltip } from '@capital/component'; import { Divider, Image, Tooltip } from '@capital/component';
import { request } from './request'; import { request } from './request';
import { Translate } from './translate';
export const FimAction: React.FC = React.memo(() => { export const FimAction: React.FC = React.memo(() => {
const { loading, value: strategies } = useAsync(async () => { const { loading, value: strategies } = useAsync(async () => {
@ -9,6 +16,37 @@ export const FimAction: React.FC = React.memo(() => {
return strategies; return strategies;
}, []); }, []);
const newWin = useRef<Window>();
const navigate = useNavigate();
useEffect(() => {
const fn = (event: MessageEvent<any>) => {
if (newWin.current && event.source === newWin.current) {
newWin.current.close();
const payload = event.data;
if (payload.type === 'exist') {
showToasts(Translate.accountExistedTip, 'warning');
} else if (payload.type === 'token') {
const token = payload.token;
setUserJWT(token)
.then(loginWithToken(token))
.then(() => {
navigate('/main');
})
.catch(() => {
showToasts(Translate.loginFailed, 'error');
});
}
}
};
window.addEventListener('message', fn);
return () => {
window.removeEventListener('message', fn);
};
}, []);
if (loading) { if (loading) {
return null; return null;
@ -17,7 +55,7 @@ export const FimAction: React.FC = React.memo(() => {
if (Array.isArray(strategies) && strategies.length > 0) { if (Array.isArray(strategies) && strategies.length > 0) {
return ( return (
<div> <div>
<Divider /> <Divider>{Translate.fimLogin}</Divider>
<div style={{ display: 'flex', justifyContent: 'center' }}> <div style={{ display: 'flex', justifyContent: 'center' }}>
{strategies.map((s) => ( {strategies.map((s) => (
<Tooltip key={s.name} title={s.name}> <Tooltip key={s.name} title={s.name}>
@ -36,9 +74,7 @@ export const FimAction: React.FC = React.memo(() => {
); );
const win = window.open(url, 'square', 'frame=true'); const win = window.open(url, 'square', 'frame=true');
win.addEventListener('message', (...args) => { newWin.current = win;
console.log(...args);
});
} }
}} }}
/> />

@ -0,0 +1,16 @@
import { localTrans } from '@capital/common';
export const Translate = {
fimLogin: localTrans({
'zh-CN': '第三方登录',
'en-US': 'Third party login',
}),
loginFailed: localTrans({
'zh-CN': '登录失败',
'en-US': 'Login Failed',
}),
accountExistedTip: localTrans({
'zh-CN': '账号已存在,你应该在登录后绑定账号',
'en-US': 'Account Existed, You should bind provider account after login',
}),
};
Loading…
Cancel
Save