Skip to content

Commit fd170cd

Browse files
committed
feat: refactor WeCom QR code login handling with improved iframe event management
1 parent 1ede617 commit fd170cd

File tree

1 file changed

+18
-34
lines changed

1 file changed

+18
-34
lines changed

ui/src/views/chat/user-login/scanCompinents/wecomQrCode.vue

Lines changed: 18 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,11 @@
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'
99
import useStore from '@/stores'
1010
const WE_COM_ORIGIN = 'https://login.work.weixin.qq.com'
11-
const LOGIN_SUCCESS_EVENT = 'onLoginSuccess'
1211
const LOGIN_STATE = 'fit2cloud-wecom-qr'
1312
const props = defineProps<{
1413
config: {
@@ -22,10 +21,10 @@ const props = defineProps<{
2221
2322
const router = useRouter()
2423
const route = useRoute()
25-
const {chatUser} = useStore()
24+
const { chatUser } = useStore()
2625
2726
const {
28-
params: {accessToken},
27+
params: { accessToken },
2928
} = route as any
3029
3130
let 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-
6455
async 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-
8965
function 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
117101
onBeforeUnmount(cleanup)

0 commit comments

Comments
 (0)