| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556 |
- import { getJSON } from '@/infrastructure/fetch-json'
- import { useLocation } from '@/shared/hooks/use-location'
- import { debugConsole } from '@/utils/debugging'
- import { useProjectContext } from '@/shared/context/project-context'
- import { useCallback } from 'react'
- import {
- hidePreparingExportToast,
- showExportDocumentError,
- showExportDocumentSuccess,
- showPreparingExportToast,
- } from '../components/toolbar/export-document-toasts'
- import { RootDocInfo } from '@/shared/hooks/use-root-doc'
- import { OpenDocuments } from '../editor/open-documents'
- const SLOW_CONVERSION_THRESHOLD = 2000
- export default function useConvertProject(
- type: 'docx' | 'markdown',
- openDocs: OpenDocuments,
- getRootDocInfo: () => RootDocInfo
- ) {
- const { projectId } = useProjectContext()
- const location = useLocation()
- return useCallback(async () => {
- let handle: string | undefined
- const toastTimer = setTimeout(() => {
- handle = showPreparingExportToast()
- }, SLOW_CONVERSION_THRESHOLD)
- const hidePreparingToast = () => {
- clearTimeout(toastTimer)
- if (handle) hidePreparingExportToast(handle)
- }
- const url = new URL(window.location.origin)
- url.pathname = `/project/${projectId}/download/conversion/${type}`
- url.searchParams.set('responseFormat', 'json')
- const { rootResourcePath } = getRootDocInfo()
- url.searchParams.set('rootResourcePath', rootResourcePath)
- try {
- await openDocs.awaitBufferedOps(AbortSignal.timeout(10_000))
- const response = await getJSON(url.href)
- hidePreparingToast()
- const { downloadUrl } = response
- if (downloadUrl) {
- const url = new URL(downloadUrl, window.location.origin)
- location.assign(url.toString())
- showExportDocumentSuccess(type)
- } else {
- showExportDocumentError()
- }
- } catch (error) {
- hidePreparingToast()
- showExportDocumentError()
- debugConsole.error(error)
- }
- }, [projectId, type, getRootDocInfo, openDocs, location])
- }
|