dify/web/hooks/use-async-window-open.ts
Stephen Zhou a84c2d36a3
style: format with vp fmt (#38803)
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
2026-07-12 15:57:46 +00:00

59 lines
1.4 KiB
TypeScript

import { useCallback } from 'react'
type GetUrl = () => Promise<string | null | undefined>
type AsyncWindowOpenOptions = {
immediateUrl?: string | null
target?: string
features?: string
onError?: (error: Error) => void
}
export const useAsyncWindowOpen = () =>
useCallback(async (getUrl: GetUrl, options?: AsyncWindowOpenOptions) => {
const { immediateUrl, target = '_blank', features, onError } = options ?? {}
const secureImmediateFeatures = features
? `${features},noopener,noreferrer`
: 'noopener,noreferrer'
if (immediateUrl) {
const newWindow = window.open(immediateUrl, target, secureImmediateFeatures)
if (!newWindow) {
onError?.(new Error('Failed to open new window'))
return
}
try {
newWindow.opener = null
} catch {
/* noop */
}
return
}
const newWindow = window.open('about:blank', target, features)
if (!newWindow) {
onError?.(new Error('Failed to open new window'))
return
}
try {
newWindow.opener = null
} catch {
/* noop */
}
try {
const url = await getUrl()
if (url) {
newWindow.location.href = url
return
}
newWindow.close()
onError?.(new Error('No url resolved for new window'))
} catch (error) {
newWindow.close()
onError?.(error instanceof Error ? error : new Error(String(error)))
}
}, [])