dify/web/hooks/use-oauth.ts
Yeuoly b76e17b25d
feat: introduce trigger functionality (#27644)
Signed-off-by: lyzno1 <yuanyouhuilyz@gmail.com>
Co-authored-by: Stream <Stream_2@qq.com>
Co-authored-by: lyzno1 <92089059+lyzno1@users.noreply.github.com>
Co-authored-by: zhsama <torvalds@linux.do>
Co-authored-by: Harry <xh001x@hotmail.com>
Co-authored-by: lyzno1 <yuanyouhuilyz@gmail.com>
Co-authored-by: yessenia <yessenia.contact@gmail.com>
Co-authored-by: hjlarry <hjlarry@163.com>
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
Co-authored-by: WTW0313 <twwu@dify.ai>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-11-12 17:59:37 +08:00

71 lines
1.8 KiB
TypeScript

'use client'
import { useEffect } from 'react'
import { validateRedirectUrl } from '@/utils/urlValidation'
export const useOAuthCallback = () => {
useEffect(() => {
const urlParams = new URLSearchParams(window.location.search)
const subscriptionId = urlParams.get('subscription_id')
const error = urlParams.get('error')
const errorDescription = urlParams.get('error_description')
if (window.opener) {
if (subscriptionId) {
window.opener.postMessage({
type: 'oauth_callback',
success: true,
subscriptionId,
}, '*')
}
else if (error) {
window.opener.postMessage({
type: 'oauth_callback',
success: false,
error,
errorDescription,
}, '*')
}
else {
window.opener.postMessage({
type: 'oauth_callback',
}, '*')
}
window.close()
}
}, [])
}
export const openOAuthPopup = (url: string, callback: (data?: any) => void) => {
const width = 600
const height = 600
const left = window.screenX + (window.outerWidth - width) / 2
const top = window.screenY + (window.outerHeight - height) / 2
validateRedirectUrl(url)
const popup = window.open(
url,
'OAuth',
`width=${width},height=${height},left=${left},top=${top},scrollbars=yes`,
)
const handleMessage = (event: MessageEvent) => {
if (event.data?.type === 'oauth_callback') {
window.removeEventListener('message', handleMessage)
callback(event.data)
}
}
window.addEventListener('message', handleMessage)
// Fallback for window close detection
const checkClosed = setInterval(() => {
if (popup?.closed) {
clearInterval(checkClosed)
window.removeEventListener('message', handleMessage)
callback()
}
}, 1000)
return popup
}