|
|
@@ -1,5 +1,5 @@
|
|
|
import { withContextRoot } from './utils/with-context-root'
|
|
|
-import { useCallback, useEffect, useMemo, useState } from 'react'
|
|
|
+import { useCallback, useMemo, useState } from 'react'
|
|
|
import useFetchMock from './hooks/use-fetch-mock'
|
|
|
import { setupContext } from './fixtures/context'
|
|
|
import { Button } from 'react-bootstrap'
|
|
|
@@ -9,10 +9,20 @@ import PdfPreviewToolbar from '../js/features/pdf-preview/components/pdf-preview
|
|
|
import PdfFileList from '../js/features/pdf-preview/components/pdf-file-list'
|
|
|
import { buildFileList } from '../js/features/pdf-preview/util/file-list'
|
|
|
import PdfLogsViewer from '../js/features/pdf-preview/components/pdf-logs-viewer'
|
|
|
-import examplePdf from './fixtures/storybook-example.pdf'
|
|
|
import PdfPreviewError from '../js/features/pdf-preview/components/pdf-preview-error'
|
|
|
import PdfPreviewHybridToolbar from '../js/features/pdf-preview/components/pdf-preview-hybrid-toolbar'
|
|
|
import { useCompileContext } from '../js/shared/context/compile-context'
|
|
|
+import {
|
|
|
+ dispatchDocChanged,
|
|
|
+ mockBuildFile,
|
|
|
+ mockClearCache,
|
|
|
+ mockCompile,
|
|
|
+ mockCompileError,
|
|
|
+ mockCompileValidationIssues,
|
|
|
+ mockEventTracking,
|
|
|
+ outputFiles,
|
|
|
+} from './fixtures/compile'
|
|
|
+import { cloneDeep } from 'lodash'
|
|
|
|
|
|
setupContext()
|
|
|
|
|
|
@@ -55,167 +65,6 @@ const scope = {
|
|
|
},
|
|
|
}
|
|
|
|
|
|
-const dispatchProjectJoined = () => {
|
|
|
- window.dispatchEvent(new CustomEvent('project:joined', { detail: project }))
|
|
|
-}
|
|
|
-
|
|
|
-const dispatchDocChanged = () => {
|
|
|
- window.dispatchEvent(
|
|
|
- new CustomEvent('doc:changed', { detail: { doc_id: 'foo' } })
|
|
|
- )
|
|
|
-}
|
|
|
-
|
|
|
-const outputFiles = [
|
|
|
- {
|
|
|
- path: 'output.pdf',
|
|
|
- build: '123',
|
|
|
- url: '/build/output.pdf',
|
|
|
- type: 'pdf',
|
|
|
- },
|
|
|
- {
|
|
|
- path: 'output.bbl',
|
|
|
- build: '123',
|
|
|
- url: '/build/output.bbl',
|
|
|
- type: 'bbl',
|
|
|
- },
|
|
|
- {
|
|
|
- path: 'output.bib',
|
|
|
- build: '123',
|
|
|
- url: '/build/output.bib',
|
|
|
- type: 'bib',
|
|
|
- },
|
|
|
- {
|
|
|
- path: 'example.txt',
|
|
|
- build: '123',
|
|
|
- url: '/build/example.txt',
|
|
|
- type: 'txt',
|
|
|
- },
|
|
|
- {
|
|
|
- path: 'output.log',
|
|
|
- build: '123',
|
|
|
- url: '/build/output.log',
|
|
|
- type: 'log',
|
|
|
- },
|
|
|
- {
|
|
|
- path: 'output.blg',
|
|
|
- build: '123',
|
|
|
- url: '/build/output.blg',
|
|
|
- type: 'blg',
|
|
|
- },
|
|
|
-]
|
|
|
-
|
|
|
-const mockCompile = (fetchMock, delay = 1000) =>
|
|
|
- fetchMock.post(
|
|
|
- 'express:/project/:projectId/compile',
|
|
|
- {
|
|
|
- body: {
|
|
|
- status: 'success',
|
|
|
- clsiServerId: 'foo',
|
|
|
- compileGroup: 'priority',
|
|
|
- pdfDownloadDomain: '',
|
|
|
- outputFiles,
|
|
|
- },
|
|
|
- },
|
|
|
- { delay }
|
|
|
- )
|
|
|
-
|
|
|
-const mockCompileError = (fetchMock, status = 'success', delay = 1000) =>
|
|
|
- fetchMock.post(
|
|
|
- 'express:/project/:projectId/compile',
|
|
|
- {
|
|
|
- body: {
|
|
|
- status,
|
|
|
- clsiServerId: 'foo',
|
|
|
- compileGroup: 'priority',
|
|
|
- },
|
|
|
- },
|
|
|
- { delay, overwriteRoutes: true }
|
|
|
- )
|
|
|
-
|
|
|
-const mockCompileValidationIssues = (
|
|
|
- fetchMock,
|
|
|
- validationProblems,
|
|
|
- delay = 1000
|
|
|
-) =>
|
|
|
- fetchMock.post(
|
|
|
- 'express:/project/:projectId/compile',
|
|
|
- () => {
|
|
|
- return {
|
|
|
- body: {
|
|
|
- status: 'validation-problems',
|
|
|
- validationProblems,
|
|
|
- clsiServerId: 'foo',
|
|
|
- compileGroup: 'priority',
|
|
|
- },
|
|
|
- }
|
|
|
- },
|
|
|
- { delay, overwriteRoutes: true }
|
|
|
- )
|
|
|
-
|
|
|
-const mockClearCache = fetchMock =>
|
|
|
- fetchMock.delete('express:/project/:projectId/output', 204, {
|
|
|
- delay: 1000,
|
|
|
- })
|
|
|
-
|
|
|
-const mockBuildFile = fetchMock =>
|
|
|
- fetchMock.get(
|
|
|
- 'express:/build/:file',
|
|
|
- (url, options, request) => {
|
|
|
- const { pathname } = new URL(url, 'https://example.com')
|
|
|
-
|
|
|
- switch (pathname) {
|
|
|
- case '/build/output.blg':
|
|
|
- return 'This is BibTeX, Version 4.0' // FIXME
|
|
|
-
|
|
|
- case '/build/output.log':
|
|
|
- return `
|
|
|
-The LaTeX compiler output
|
|
|
- * With a lot of details
|
|
|
-
|
|
|
-Wrapped in an HTML <pre> element with
|
|
|
- preformatted text which is to be presented exactly
|
|
|
- as written in the HTML file
|
|
|
-
|
|
|
- (whitespace included™)
|
|
|
-
|
|
|
-The text is typically rendered using a non-proportional ("monospace") font.
|
|
|
-
|
|
|
-LaTeX Font Info: External font \`cmex10' loaded for size
|
|
|
-(Font) <7> on input line 18.
|
|
|
-LaTeX Font Info: External font \`cmex10' loaded for size
|
|
|
-(Font) <5> on input line 18.
|
|
|
-! Undefined control sequence.
|
|
|
-<recently read> \\Zlpha
|
|
|
-
|
|
|
- main.tex, line 23
|
|
|
-
|
|
|
-`
|
|
|
-
|
|
|
- case '/build/output.pdf':
|
|
|
- return new Promise(resolve => {
|
|
|
- const xhr = new XMLHttpRequest()
|
|
|
- xhr.addEventListener('load', () => {
|
|
|
- resolve({
|
|
|
- status: 200,
|
|
|
- headers: {
|
|
|
- 'Content-Length': xhr.getResponseHeader('Content-Length'),
|
|
|
- 'Content-Type': xhr.getResponseHeader('Content-Type'),
|
|
|
- },
|
|
|
- body: xhr.response,
|
|
|
- })
|
|
|
- })
|
|
|
- xhr.open('GET', examplePdf)
|
|
|
- xhr.responseType = 'arraybuffer'
|
|
|
- xhr.send()
|
|
|
- })
|
|
|
-
|
|
|
- default:
|
|
|
- return 404
|
|
|
- }
|
|
|
- },
|
|
|
- { sendAsJson: false }
|
|
|
- )
|
|
|
-
|
|
|
export const Interactive = () => {
|
|
|
useFetchMock(fetchMock => {
|
|
|
mockCompile(fetchMock)
|
|
|
@@ -223,10 +72,6 @@ export const Interactive = () => {
|
|
|
mockClearCache(fetchMock)
|
|
|
})
|
|
|
|
|
|
- useEffect(() => {
|
|
|
- dispatchProjectJoined()
|
|
|
- }, [])
|
|
|
-
|
|
|
const Inner = () => {
|
|
|
const context = useCompileContext()
|
|
|
|
|
|
@@ -465,6 +310,10 @@ const compileErrors = [
|
|
|
]
|
|
|
|
|
|
export const DisplayError = () => {
|
|
|
+ useFetchMock(fetchMock => {
|
|
|
+ mockCompile(fetchMock)
|
|
|
+ })
|
|
|
+
|
|
|
return withContextRoot(
|
|
|
<>
|
|
|
{compileErrors.map(error => (
|
|
|
@@ -482,7 +331,10 @@ export const DisplayError = () => {
|
|
|
}
|
|
|
|
|
|
export const Toolbar = () => {
|
|
|
- useFetchMock(fetchMock => mockCompile(fetchMock, 500))
|
|
|
+ useFetchMock(fetchMock => {
|
|
|
+ mockCompile(fetchMock, 500)
|
|
|
+ mockBuildFile(fetchMock)
|
|
|
+ })
|
|
|
|
|
|
return withContextRoot(
|
|
|
<div className="pdf">
|
|
|
@@ -496,6 +348,7 @@ export const HybridToolbar = () => {
|
|
|
useFetchMock(fetchMock => {
|
|
|
mockCompile(fetchMock, 500)
|
|
|
mockBuildFile(fetchMock)
|
|
|
+ mockEventTracking(fetchMock)
|
|
|
})
|
|
|
|
|
|
return withContextRoot(
|
|
|
@@ -508,7 +361,7 @@ export const HybridToolbar = () => {
|
|
|
|
|
|
export const FileList = () => {
|
|
|
const fileList = useMemo(() => {
|
|
|
- return buildFileList(outputFiles)
|
|
|
+ return buildFileList(cloneDeep(outputFiles))
|
|
|
}, [])
|
|
|
|
|
|
return (
|
|
|
@@ -559,9 +412,5 @@ export const ValidationIssues = () => {
|
|
|
mockBuildFile(fetchMock)
|
|
|
})
|
|
|
|
|
|
- useEffect(() => {
|
|
|
- dispatchProjectJoined()
|
|
|
- }, [])
|
|
|
-
|
|
|
return withContextRoot(<PdfPreviewPane />, scope)
|
|
|
}
|