mirror of
https://github.com/hedgedoc/hedgedoc.git
synced 2025-05-29 06:15:29 -04:00
Add custom intro page by fetching markdown content from a file (#697)
Signed-off-by: Tilman Vatteroth <tilman.vatteroth@tu-dortmund.de>
This commit is contained in:
parent
4b2e2a7c93
commit
7f6e0e53a7
31 changed files with 373 additions and 173 deletions
|
@ -10,13 +10,20 @@ import { useIsDarkModeActivated } from '../../../hooks/common/use-is-dark-mode-a
|
|||
import { ApplicationState } from '../../../redux'
|
||||
import { isTestMode } from '../../../utils/is-test-mode'
|
||||
import { IframeEditorToRendererCommunicator } from '../../render-page/iframe-editor-to-renderer-communicator'
|
||||
import { MarkdownDocumentProps } from '../../render-page/markdown-document'
|
||||
import { ImageDetails } from '../../render-page/rendering-message'
|
||||
import { RendererProps } from '../../render-page/markdown-document'
|
||||
import { ImageDetails, RendererType } from '../../render-page/rendering-message'
|
||||
import { ScrollState } from '../synced-scroll/scroll-props'
|
||||
import { useOnIframeLoad } from './hooks/use-on-iframe-load'
|
||||
import { ShowOnPropChangeImageLightbox } from './show-on-prop-change-image-lightbox'
|
||||
|
||||
export const RenderIframe: React.FC<MarkdownDocumentProps> = (
|
||||
export interface RenderIframeProps extends RendererProps {
|
||||
onRendererReadyChange?: (rendererReady: boolean) => void
|
||||
rendererType: RendererType,
|
||||
forcedDarkMode?: boolean
|
||||
frameClasses?: string
|
||||
}
|
||||
|
||||
export const RenderIframe: React.FC<RenderIframeProps> = (
|
||||
{
|
||||
markdownContent,
|
||||
onTaskCheckedChange,
|
||||
|
@ -25,9 +32,13 @@ export const RenderIframe: React.FC<MarkdownDocumentProps> = (
|
|||
onFirstHeadingChange,
|
||||
onScroll,
|
||||
onMakeScrollSource,
|
||||
extraClasses
|
||||
frameClasses,
|
||||
onRendererReadyChange,
|
||||
rendererType,
|
||||
forcedDarkMode
|
||||
}) => {
|
||||
const darkMode = useIsDarkModeActivated()
|
||||
const savedDarkMode = useIsDarkModeActivated()
|
||||
const darkMode = forcedDarkMode ?? savedDarkMode
|
||||
const [rendererReady, setRendererReady] = useState<boolean>(false)
|
||||
const [lightboxDetails, setLightboxDetails] = useState<ImageDetails | undefined>(undefined)
|
||||
|
||||
|
@ -37,6 +48,11 @@ export const RenderIframe: React.FC<MarkdownDocumentProps> = (
|
|||
const resetRendererReady = useCallback(() => setRendererReady(false), [])
|
||||
const iframeCommunicator = useMemo(() => new IframeEditorToRendererCommunicator(), [])
|
||||
const onIframeLoad = useOnIframeLoad(frameReference, iframeCommunicator, rendererOrigin, renderPageUrl, resetRendererReady)
|
||||
const [frameHeight, setFrameHeight] = useState<number>(0)
|
||||
|
||||
useEffect(() => {
|
||||
onRendererReadyChange?.(rendererReady)
|
||||
}, [onRendererReadyChange, rendererReady])
|
||||
|
||||
useEffect(() => () => iframeCommunicator.unregisterEventListener(), [iframeCommunicator])
|
||||
useEffect(() => iframeCommunicator.onFirstHeadingChange(onFirstHeadingChange), [iframeCommunicator,
|
||||
|
@ -49,8 +65,15 @@ export const RenderIframe: React.FC<MarkdownDocumentProps> = (
|
|||
useEffect(() => iframeCommunicator.onTaskCheckboxChange(onTaskCheckedChange), [iframeCommunicator,
|
||||
onTaskCheckedChange])
|
||||
useEffect(() => iframeCommunicator.onImageClicked(setLightboxDetails), [iframeCommunicator])
|
||||
useEffect(() => iframeCommunicator.onRendererReady(() => setRendererReady(true)), [darkMode, iframeCommunicator,
|
||||
scrollState])
|
||||
useEffect(() => iframeCommunicator.onRendererReady(() => {
|
||||
iframeCommunicator.sendSetBaseConfiguration({
|
||||
baseUrl: window.location.toString(),
|
||||
rendererType
|
||||
})
|
||||
setRendererReady(true)
|
||||
}), [darkMode, rendererType, iframeCommunicator, rendererReady, scrollState])
|
||||
useEffect(() => iframeCommunicator.onHeightChange(setFrameHeight), [iframeCommunicator])
|
||||
|
||||
useEffect(() => {
|
||||
if (rendererReady) {
|
||||
iframeCommunicator.sendSetDarkmode(darkMode)
|
||||
|
@ -65,12 +88,6 @@ export const RenderIframe: React.FC<MarkdownDocumentProps> = (
|
|||
}
|
||||
}, [iframeCommunicator, rendererReady, scrollState])
|
||||
|
||||
useEffect(() => {
|
||||
if (rendererReady) {
|
||||
iframeCommunicator.sendSetBaseUrl(window.location.toString())
|
||||
}
|
||||
}, [iframeCommunicator, rendererReady])
|
||||
|
||||
useEffect(() => {
|
||||
if (rendererReady) {
|
||||
iframeCommunicator.sendSetMarkdownContent(markdownContent)
|
||||
|
@ -79,8 +96,9 @@ export const RenderIframe: React.FC<MarkdownDocumentProps> = (
|
|||
|
||||
return <Fragment>
|
||||
<ShowOnPropChangeImageLightbox details={ lightboxDetails }/>
|
||||
<iframe data-cy={ 'documentIframe' } onLoad={ onIframeLoad } title="render" src={ renderPageUrl }
|
||||
<iframe style={ { height: `${ frameHeight }px` } } data-cy={ 'documentIframe' } onLoad={ onIframeLoad }
|
||||
title="render" src={ renderPageUrl }
|
||||
{ ...isTestMode() ? {} : { sandbox: 'allow-downloads allow-same-origin allow-scripts allow-popups' } }
|
||||
ref={ frameReference } className={ `h-100 w-100 border-0 ${ extraClasses ?? '' }` }/>
|
||||
ref={ frameReference } className={ `border-0 ${ frameClasses ?? '' }` }/>
|
||||
</Fragment>
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue