message-verify 1.0.1-beta.61 → 1.0.1-beta.63
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +1 -0
- package/dist/index.js +12 -38
- package/dist/modal/verify-modal.js +14 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/utils/eventEmitter.d.ts +10 -0
- package/dist/utils/eventEmitter.js +28 -0
- package/package.json +1 -1
- package/src/index.tsx +15 -36
- package/src/modal/verify-modal.tsx +16 -1
- package/src/utils/eventEmitter.ts +33 -0
package/dist/index.d.ts
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
import { VerifyModalConfig, LoginModalConfig } from './utils/type.js';
|
2
2
|
export declare const initFingerprint: () => Promise<string>;
|
3
3
|
export declare const createReLoginModal: (modalProps: LoginModalConfig) => void;
|
4
|
+
export declare const getResponse: (response: any) => any;
|
4
5
|
export declare const VerifyHandler: ({ data, config, http, verifyPromise, sendApi, response }: VerifyModalConfig) => Promise<any>;
|
package/dist/index.js
CHANGED
@@ -3,6 +3,7 @@ import ReactDOM from 'react-dom/client';
|
|
3
3
|
import VerifyModal from './modal/verify-modal.js';
|
4
4
|
import Fingerprint2 from 'fingerprintjs2';
|
5
5
|
import ReLoginModal from './modal/relogin-modal.js';
|
6
|
+
import eventEmitter from './utils/eventEmitter';
|
6
7
|
let fingerprintPromise = null; // 用 Promise 本身作为缓存
|
7
8
|
let modalRoot = null;
|
8
9
|
export const initFingerprint = async () => {
|
@@ -54,60 +55,33 @@ export const createReLoginModal = (modalProps) => {
|
|
54
55
|
const reLoginModalId = 'relogin-modal-container';
|
55
56
|
creatModal(modalProps, reLoginModalId, ReLoginModal);
|
56
57
|
};
|
57
|
-
let
|
58
|
-
|
58
|
+
let fetchUrl = '';
|
59
|
+
export const getResponse = (response) => {
|
60
|
+
// if (fetchUrl === response.config.url) {
|
61
|
+
console.log('VerifyHandler getResponse =>', response, fetchUrl);
|
62
|
+
eventEmitter.emit('response', response?.data?.status?.code ?? -1);
|
63
|
+
return response;
|
64
|
+
// }
|
65
|
+
};
|
59
66
|
export const VerifyHandler = ({ data, config, http, verifyPromise, sendApi, response }) => {
|
60
67
|
console.log('VerifyHandler =>', response);
|
68
|
+
fetchUrl = config?.url || '';
|
61
69
|
const toEmpty = () => {
|
62
70
|
verifyPromise.current = null;
|
63
|
-
cachedResolve = null;
|
64
|
-
cachedReject = null;
|
65
71
|
};
|
66
|
-
// if (!verifyPromise.current) {
|
67
|
-
// verifyPromise.current = new Promise((resolve, reject) => {
|
68
|
-
// createMessageVerifyModal({
|
69
|
-
// data,
|
70
|
-
// config,
|
71
|
-
// http,
|
72
|
-
// apiResolve: resolve,
|
73
|
-
// apiReject: reject,
|
74
|
-
// apiPromiseToEmpty: toEmpty,
|
75
|
-
// sendApi,
|
76
|
-
// response
|
77
|
-
// } as VerifyModalConfig);
|
78
|
-
// }).finally(toEmpty);
|
79
|
-
// }
|
80
72
|
if (!verifyPromise.current) {
|
81
73
|
verifyPromise.current = new Promise((resolve, reject) => {
|
82
|
-
// 只缓存第一次的 resolve/reject
|
83
|
-
if (!cachedResolve)
|
84
|
-
cachedResolve = resolve;
|
85
|
-
if (!cachedReject)
|
86
|
-
cachedReject = reject;
|
87
74
|
createMessageVerifyModal({
|
88
75
|
data,
|
89
76
|
config,
|
90
77
|
http,
|
91
|
-
apiResolve:
|
92
|
-
apiReject:
|
78
|
+
apiResolve: resolve,
|
79
|
+
apiReject: reject,
|
93
80
|
apiPromiseToEmpty: toEmpty,
|
94
81
|
sendApi,
|
95
82
|
response
|
96
83
|
});
|
97
84
|
}).finally(toEmpty);
|
98
85
|
}
|
99
|
-
else {
|
100
|
-
// 已有 modal,更新其余参数(假设 modal 支持 props 更新)
|
101
|
-
createMessageVerifyModal({
|
102
|
-
data,
|
103
|
-
config,
|
104
|
-
http,
|
105
|
-
apiResolve: cachedResolve,
|
106
|
-
apiReject: cachedReject,
|
107
|
-
apiPromiseToEmpty: toEmpty,
|
108
|
-
sendApi,
|
109
|
-
response
|
110
|
-
});
|
111
|
-
}
|
112
86
|
return verifyPromise.current;
|
113
87
|
};
|
@@ -4,6 +4,7 @@ import { Modal, Input, Button, message } from '../compoments/index.js';
|
|
4
4
|
import Api from '../utils/resource.js';
|
5
5
|
import t from '../utils/i18n.js';
|
6
6
|
import { axios } from '@yqg/resource';
|
7
|
+
import eventEmitter from '../utils/eventEmitter';
|
7
8
|
const CreateMessageVerifyModal = ({ props }) => {
|
8
9
|
const [visible, setVisible] = useState(true);
|
9
10
|
const [countdown, setCountdown] = useState(60);
|
@@ -11,6 +12,7 @@ const CreateMessageVerifyModal = ({ props }) => {
|
|
11
12
|
const [captchaImage, setCaptchaImage] = useState('');
|
12
13
|
const [captchCode, setCaptchCode] = useState('');
|
13
14
|
const [captchaKey, setCaptchaKey] = useState('');
|
15
|
+
const [resCode, setResCode] = useState(-1);
|
14
16
|
const { data, http, lang, sendApi = '/admin/sms/send', config, apiResolve, apiPromiseToEmpty, onClose, response } = props || {};
|
15
17
|
const dataObj = JSON.parse(data || '{}');
|
16
18
|
const { mobile, verifyCodeKey } = dataObj || {};
|
@@ -46,6 +48,17 @@ const CreateMessageVerifyModal = ({ props }) => {
|
|
46
48
|
clearInterval(timer);
|
47
49
|
};
|
48
50
|
}, [visible, countdown]);
|
51
|
+
useEffect(() => {
|
52
|
+
const handler = (data) => {
|
53
|
+
// 这里处理收到的数据
|
54
|
+
console.log('收到 response 事件:', data);
|
55
|
+
setResCode(data);
|
56
|
+
};
|
57
|
+
eventEmitter.on('response', handler);
|
58
|
+
return () => {
|
59
|
+
eventEmitter.off('response', handler);
|
60
|
+
};
|
61
|
+
}, []);
|
49
62
|
const handleResend = async () => {
|
50
63
|
const formData = new FormData();
|
51
64
|
formData.append('captchaKey', captchaKey);
|
@@ -86,7 +99,7 @@ const CreateMessageVerifyModal = ({ props }) => {
|
|
86
99
|
'Content-Type': config.headers['Content-Type'],
|
87
100
|
}
|
88
101
|
}).then(res => {
|
89
|
-
console.log('VerifyHandler => then', response);
|
102
|
+
console.log('VerifyHandler => then', response, resCode);
|
90
103
|
resolve(res);
|
91
104
|
}).catch(err => {
|
92
105
|
reject(err);
|
@@ -1 +1 @@
|
|
1
|
-
{"root":["../src/index.tsx","../src/main.tsx","../src/vite-env.d.ts","../src/compoments/button.tsx","../src/compoments/index.ts","../src/compoments/input.tsx","../src/compoments/message.tsx","../src/compoments/modal.tsx","../src/locales/en.ts","../src/locales/id.ts","../src/locales/zh.ts","../src/modal/relogin-modal.tsx","../src/modal/verify-modal.tsx","../src/utils/i18n.ts","../src/utils/resource.ts","../src/utils/status.ts","../src/utils/type.ts"],"version":"5.7.3"}
|
1
|
+
{"root":["../src/index.tsx","../src/main.tsx","../src/vite-env.d.ts","../src/compoments/button.tsx","../src/compoments/index.ts","../src/compoments/input.tsx","../src/compoments/message.tsx","../src/compoments/modal.tsx","../src/locales/en.ts","../src/locales/id.ts","../src/locales/zh.ts","../src/modal/relogin-modal.tsx","../src/modal/verify-modal.tsx","../src/utils/eventemitter.ts","../src/utils/i18n.ts","../src/utils/resource.ts","../src/utils/status.ts","../src/utils/type.ts"],"version":"5.7.3"}
|
@@ -0,0 +1,10 @@
|
|
1
|
+
type Listener = (...args: any[]) => void;
|
2
|
+
declare class EventEmitter {
|
3
|
+
private events;
|
4
|
+
on(event: string, listener: Listener): void;
|
5
|
+
off(event: string, listener: Listener): void;
|
6
|
+
emit(event: string, ...args: any[]): void;
|
7
|
+
once(event: string, listener: Listener): void;
|
8
|
+
}
|
9
|
+
declare const eventEmitter: EventEmitter;
|
10
|
+
export default eventEmitter;
|
@@ -0,0 +1,28 @@
|
|
1
|
+
class EventEmitter {
|
2
|
+
events = {};
|
3
|
+
on(event, listener) {
|
4
|
+
if (!this.events[event]) {
|
5
|
+
this.events[event] = [];
|
6
|
+
}
|
7
|
+
this.events[event].push(listener);
|
8
|
+
}
|
9
|
+
off(event, listener) {
|
10
|
+
if (!this.events[event])
|
11
|
+
return;
|
12
|
+
this.events[event] = this.events[event].filter(l => l !== listener);
|
13
|
+
}
|
14
|
+
emit(event, ...args) {
|
15
|
+
if (!this.events[event])
|
16
|
+
return;
|
17
|
+
this.events[event].forEach(listener => listener(...args));
|
18
|
+
}
|
19
|
+
once(event, listener) {
|
20
|
+
const onceListener = (...args) => {
|
21
|
+
listener(...args);
|
22
|
+
this.off(event, onceListener);
|
23
|
+
};
|
24
|
+
this.on(event, onceListener);
|
25
|
+
}
|
26
|
+
}
|
27
|
+
const eventEmitter = new EventEmitter();
|
28
|
+
export default eventEmitter;
|
package/package.json
CHANGED
package/src/index.tsx
CHANGED
@@ -3,6 +3,7 @@ import VerifyModal from './modal/verify-modal.js'
|
|
3
3
|
import Fingerprint2 from 'fingerprintjs2';
|
4
4
|
import ReLoginModal from './modal/relogin-modal.js';
|
5
5
|
import { VerifyModalConfig, LoginModalConfig } from './utils/type.js';
|
6
|
+
import eventEmitter from './utils/eventEmitter';
|
6
7
|
|
7
8
|
let fingerprintPromise: Promise<string> | null = null; // 用 Promise 本身作为缓存
|
8
9
|
let modalRoot: ReactDOM.Root | null = null
|
@@ -63,57 +64,35 @@ export const createReLoginModal = (modalProps: LoginModalConfig) => {
|
|
63
64
|
const reLoginModalId = 'relogin-modal-container';
|
64
65
|
creatModal(modalProps, reLoginModalId, ReLoginModal);
|
65
66
|
}
|
66
|
-
|
67
|
-
let
|
67
|
+
|
68
|
+
let fetchUrl: string = '';
|
69
|
+
export const getResponse = (response: any) => {
|
70
|
+
// if (fetchUrl === response.config.url) {
|
71
|
+
console.log('VerifyHandler getResponse =>', response, fetchUrl);
|
72
|
+
eventEmitter.emit('response', response?.data?.status?.code ?? -1);
|
73
|
+
return response;
|
74
|
+
// }
|
75
|
+
}
|
76
|
+
|
68
77
|
export const VerifyHandler = ({data, config, http, verifyPromise, sendApi, response}: VerifyModalConfig): Promise<any> => {
|
69
78
|
console.log('VerifyHandler =>', response);
|
79
|
+
fetchUrl = config?.url as string || '';
|
70
80
|
const toEmpty = () => {
|
71
81
|
verifyPromise.current = null;
|
72
|
-
cachedResolve = null;
|
73
|
-
cachedReject = null;
|
74
82
|
};
|
75
|
-
// if (!verifyPromise.current) {
|
76
|
-
// verifyPromise.current = new Promise((resolve, reject) => {
|
77
|
-
// createMessageVerifyModal({
|
78
|
-
// data,
|
79
|
-
// config,
|
80
|
-
// http,
|
81
|
-
// apiResolve: resolve,
|
82
|
-
// apiReject: reject,
|
83
|
-
// apiPromiseToEmpty: toEmpty,
|
84
|
-
// sendApi,
|
85
|
-
// response
|
86
|
-
// } as VerifyModalConfig);
|
87
|
-
// }).finally(toEmpty);
|
88
|
-
// }
|
89
83
|
if (!verifyPromise.current) {
|
90
84
|
verifyPromise.current = new Promise((resolve, reject) => {
|
91
|
-
// 只缓存第一次的 resolve/reject
|
92
|
-
if (!cachedResolve) cachedResolve = resolve;
|
93
|
-
if (!cachedReject) cachedReject = reject;
|
94
|
-
createMessageVerifyModal({
|
95
|
-
data,
|
96
|
-
config,
|
97
|
-
http,
|
98
|
-
apiResolve: cachedResolve,
|
99
|
-
apiReject: cachedReject,
|
100
|
-
apiPromiseToEmpty: toEmpty,
|
101
|
-
sendApi,
|
102
|
-
response
|
103
|
-
} as VerifyModalConfig);
|
104
|
-
}).finally(toEmpty);
|
105
|
-
} else {
|
106
|
-
// 已有 modal,更新其余参数(假设 modal 支持 props 更新)
|
107
85
|
createMessageVerifyModal({
|
108
86
|
data,
|
109
87
|
config,
|
110
88
|
http,
|
111
|
-
apiResolve:
|
112
|
-
apiReject:
|
89
|
+
apiResolve: resolve,
|
90
|
+
apiReject: reject,
|
113
91
|
apiPromiseToEmpty: toEmpty,
|
114
92
|
sendApi,
|
115
93
|
response
|
116
94
|
} as VerifyModalConfig);
|
95
|
+
}).finally(toEmpty);
|
117
96
|
}
|
118
97
|
return verifyPromise.current;
|
119
98
|
};
|
@@ -4,6 +4,7 @@ import Api from '../utils/resource.js'
|
|
4
4
|
import t from '../utils/i18n.js'
|
5
5
|
import { VerifyModalConfig } from '../utils/type.js';
|
6
6
|
import { axios } from '@yqg/resource';
|
7
|
+
import eventEmitter from '../utils/eventEmitter';
|
7
8
|
|
8
9
|
const CreateMessageVerifyModal = ({ props }: { props: VerifyModalConfig }) => {
|
9
10
|
const [visible, setVisible] = useState(true);
|
@@ -12,6 +13,7 @@ const CreateMessageVerifyModal = ({ props }: { props: VerifyModalConfig }) => {
|
|
12
13
|
const [captchaImage, setCaptchaImage] = useState<string>('');
|
13
14
|
const [captchCode, setCaptchCode] = useState<string>('');
|
14
15
|
const [captchaKey, setCaptchaKey] = useState<string>('');
|
16
|
+
const [resCode, setResCode] = useState<number>(-1);
|
15
17
|
const { data, http, lang, sendApi = '/admin/sms/send', config, apiResolve, apiPromiseToEmpty, onClose, response } = props || {};
|
16
18
|
const dataObj = JSON.parse(data || '{}');
|
17
19
|
const { mobile, verifyCodeKey } = dataObj || {};
|
@@ -49,6 +51,19 @@ const CreateMessageVerifyModal = ({ props }: { props: VerifyModalConfig }) => {
|
|
49
51
|
};
|
50
52
|
}, [visible, countdown]);
|
51
53
|
|
54
|
+
|
55
|
+
useEffect(() => {
|
56
|
+
const handler = (data: any) => {
|
57
|
+
// 这里处理收到的数据
|
58
|
+
console.log('收到 response 事件:', data);
|
59
|
+
setResCode(data);
|
60
|
+
};
|
61
|
+
eventEmitter.on('response', handler);
|
62
|
+
return () => {
|
63
|
+
eventEmitter.off('response', handler);
|
64
|
+
};
|
65
|
+
}, [])
|
66
|
+
|
52
67
|
const handleResend = async () => {
|
53
68
|
const formData = new FormData();
|
54
69
|
formData.append('captchaKey', captchaKey);
|
@@ -102,7 +117,7 @@ const CreateMessageVerifyModal = ({ props }: { props: VerifyModalConfig }) => {
|
|
102
117
|
'Content-Type': config.headers['Content-Type'],
|
103
118
|
}
|
104
119
|
}).then(res => {
|
105
|
-
console.log('VerifyHandler => then', response);
|
120
|
+
console.log('VerifyHandler => then', response, resCode);
|
106
121
|
resolve(res);
|
107
122
|
}).catch(err => {
|
108
123
|
reject(err);
|
@@ -0,0 +1,33 @@
|
|
1
|
+
type Listener = (...args: any[]) => void;
|
2
|
+
|
3
|
+
class EventEmitter {
|
4
|
+
private events: Record<string, Listener[]> = {};
|
5
|
+
|
6
|
+
on(event: string, listener: Listener) {
|
7
|
+
if (!this.events[event]) {
|
8
|
+
this.events[event] = [];
|
9
|
+
}
|
10
|
+
this.events[event].push(listener);
|
11
|
+
}
|
12
|
+
|
13
|
+
off(event: string, listener: Listener) {
|
14
|
+
if (!this.events[event]) return;
|
15
|
+
this.events[event] = this.events[event].filter(l => l !== listener);
|
16
|
+
}
|
17
|
+
|
18
|
+
emit(event: string, ...args: any[]) {
|
19
|
+
if (!this.events[event]) return;
|
20
|
+
this.events[event].forEach(listener => listener(...args));
|
21
|
+
}
|
22
|
+
|
23
|
+
once(event: string, listener: Listener) {
|
24
|
+
const onceListener: Listener = (...args) => {
|
25
|
+
listener(...args);
|
26
|
+
this.off(event, onceListener);
|
27
|
+
};
|
28
|
+
this.on(event, onceListener);
|
29
|
+
}
|
30
|
+
}
|
31
|
+
|
32
|
+
const eventEmitter = new EventEmitter();
|
33
|
+
export default eventEmitter;
|