33</template >
44
55<script lang="ts" setup>
6- import {nextTick , defineProps , onBeforeUnmount } from ' vue'
7- import {useRoute , useRouter } from ' vue-router'
8- import {getBrowserLang } from ' @/locales'
6+ import { nextTick , defineProps , onBeforeUnmount } from ' vue'
7+ import { useRoute , useRouter } from ' vue-router'
8+ import { getBrowserLang } from ' @/locales'
99import useStore from ' @/stores'
1010const WE_COM_ORIGIN = ' https://login.work.weixin.qq.com'
11- const LOGIN_SUCCESS_EVENT = ' onLoginSuccess'
1211const LOGIN_STATE = ' fit2cloud-wecom-qr'
1312const props = defineProps <{
1413 config: {
@@ -22,10 +21,10 @@ const props = defineProps<{
2221
2322const router = useRouter ()
2423const route = useRoute ()
25- const {chatUser} = useStore ()
24+ const { chatUser } = useStore ()
2625
2726const {
28- params : {accessToken},
27+ params : { accessToken },
2928} = route as any
3029
3130let iframe: HTMLIFrameElement | null = null
@@ -53,41 +52,17 @@ function getLang() {
5352 return lang === ' en-US' ? ' en' : ' zh'
5453}
5554
56- function safeParse(data : unknown ) {
57- try {
58- return typeof data === ' string' ? JSON .parse (data ) : data
59- } catch {
60- return null
61- }
62- }
63-
6455async function handleLoginSuccess(code : string ) {
6556 await chatUser .wecomCallback (code , accessToken )
6657
6758 router .push ({
6859 name: ' chat' ,
69- params: {accessToken },
60+ params: { accessToken },
7061 query: route .query ,
7162 })
7263}
7364
74- function handleWindowMessage(event : MessageEvent ) {
75- if (event .origin !== WE_COM_ORIGIN ) return
76-
77- const payload: any = safeParse (event .data )
78- if (! payload ?.args ) return
79-
80- if (payload .args .name === LOGIN_SUCCESS_EVENT ) {
81- const code = payload .args ?.data ?.code
82- if (! code ) return
83-
84- handleLoginSuccess (code )
85- cleanup ()
86- }
87- }
88-
8965function cleanup() {
90- window .removeEventListener (' message' , handleWindowMessage )
9166 iframe ?.remove ()
9267 iframe = null
9368}
@@ -109,9 +84,18 @@ const init = async () => {
10984 ` &state=${LOGIN_STATE } ` +
11085 ` &lang=${getLang ()} ` +
11186 ` &panel_size=small ` +
112- ` &redirect_type=callback `
113-
114- window .addEventListener (' message' , handleWindowMessage )
87+ ` &redirect_type=self `
88+ iframe .addEventListener (' load' , (e ) => {
89+ if (iframe ?.contentWindow ) {
90+ iframe ?.contentWindow ?.stop ()
91+ const searchParams = new URLSearchParams (iframe .contentWindow .location .search )
92+ const code = searchParams .get (' code' )
93+ if (code ) {
94+ handleLoginSuccess (code )
95+ cleanup ()
96+ }
97+ }
98+ })
11599}
116100
117101onBeforeUnmount (cleanup )
0 commit comments