This commit is contained in:
Erik Michelson 2025-01-14 20:10:47 +01:00
parent 7e2d22961a
commit 353f9fd8f9
No known key found for this signature in database
GPG key ID: DB99ADDDC5C0AF82
6 changed files with 73 additions and 14 deletions

View file

@ -0,0 +1,29 @@
/*
* SPDX-FileCopyrightText: 2024 The HedgeDoc developers (see AUTHORS file)
*
* SPDX-License-Identifier: AGPL-3.0-only
*/
import { useSendToRenderer } from '../../../render-page/window-post-message-communicator/hooks/use-send-to-renderer'
import { CommunicationMessageType } from '../../../render-page/window-post-message-communicator/rendering-message'
import { useMemo } from 'react'
import { useApplicationState } from '../../../../hooks/common/use-application-state'
/**
* Sends the id of the current note to the renderer.
*
* @param rendererReady Defines if the target renderer is ready
*/
export const useSendNoteId = (rendererReady: boolean): void => {
const noteId = useApplicationState((state) => state.noteDetails.id)
return useSendToRenderer(
useMemo(
() => ({
type: CommunicationMessageType.SET_NOTE_ID,
noteId
}),
[noteId]
),
rendererReady
)
}

View file

@ -27,6 +27,7 @@ import { useSendMarkdownToRenderer } from './hooks/use-send-markdown-to-renderer
import { useSendScrollState } from './hooks/use-send-scroll-state' import { useSendScrollState } from './hooks/use-send-scroll-state'
import styles from './style.module.scss' import styles from './style.module.scss'
import React, { Fragment, useCallback, useEffect, useMemo, useRef, useState } from 'react' import React, { Fragment, useCallback, useEffect, useMemo, useRef, useState } from 'react'
import { useSendNoteId } from './hooks/use-send-note-id'
export interface RendererIframeProps extends Omit<CommonMarkdownRendererProps & ScrollProps, 'baseUrl'> { export interface RendererIframeProps extends Omit<CommonMarkdownRendererProps & ScrollProps, 'baseUrl'> {
rendererType: RendererType rendererType: RendererType
@ -157,6 +158,7 @@ export const RendererIframe: React.FC<RendererIframeProps> = ({
useEffectOnRenderTypeChange(rendererType, onIframeLoad) useEffectOnRenderTypeChange(rendererType, onIframeLoad)
useSendAdditionalConfigurationToRenderer(rendererReady) useSendAdditionalConfigurationToRenderer(rendererReady)
useSendMarkdownToRenderer(markdownContentLines, rendererReady) useSendMarkdownToRenderer(markdownContentLines, rendererReady)
useSendNoteId(rendererReady)
useSendScrollState(scrollState ?? null, rendererReady) useSendScrollState(scrollState ?? null, rendererReady)
useEditorReceiveHandler( useEditorReceiveHandler(

View file

@ -25,26 +25,26 @@ import { NoteType } from '@hedgedoc/commons'
export const FullscreenButton: React.FC = () => { export const FullscreenButton: React.FC = () => {
const noteLinks = useNoteLinks() const noteLinks = useNoteLinks()
const pageType = useGetNotePageType() const pageType = useGetNotePageType()
const noteFrontmatter = useApplicationState((state) => state.noteDetails.frontmatter) const noteType = useApplicationState((state) => state.noteDetails.frontmatter.type)
const { correctLink, icon } = useMemo(() => { const { correctLink, icon } = useMemo(() => {
if (!noteFrontmatter) { if (!noteType) {
return {} return {}
} }
switch (pageType) { switch (pageType) {
case NotePageType.EDITOR: case NotePageType.EDITOR:
switch (noteFrontmatter.type) { switch (noteType) {
case NoteType.DOCUMENT:
return {
correctLink: noteLinks[NotePageType.READ_ONLY],
icon: IconArrowsFullscreen
}
case NoteType.SLIDE: case NoteType.SLIDE:
default:
return { return {
correctLink: noteLinks[NotePageType.PRESENTATION], correctLink: noteLinks[NotePageType.PRESENTATION],
icon: IconCollectionPlay icon: IconCollectionPlay
} }
case NoteType.DOCUMENT:
default:
return {
correctLink: noteLinks[NotePageType.READ_ONLY],
icon: IconArrowsFullscreen
}
} }
case NotePageType.READ_ONLY: case NotePageType.READ_ONLY:
default: default:
@ -53,7 +53,7 @@ export const FullscreenButton: React.FC = () => {
icon: IconPencil icon: IconPencil
} }
} }
}, [noteLinks, pageType, noteFrontmatter]) }, [noteLinks, pageType, noteType])
if (pageType === NotePageType.PRESENTATION || !correctLink || !icon) { if (pageType === NotePageType.PRESENTATION || !correctLink || !icon) {
return null return null

View file

@ -20,6 +20,10 @@ import React, { useCallback, useDeferredValue, useEffect, useMemo, useRef, useSt
import { setPrintMode } from '../../redux/print-mode/methods' import { setPrintMode } from '../../redux/print-mode/methods'
import { usePrintKeyboardShortcut } from '../editor-page/hooks/use-print-keyboard-shortcut' import { usePrintKeyboardShortcut } from '../editor-page/hooks/use-print-keyboard-shortcut'
import { FullscreenButton } from './fullscreen-button/fullscreen-button' import { FullscreenButton } from './fullscreen-button/fullscreen-button'
import { updateMetadata } from '../../redux/note-details/methods'
import { Logger } from '../../utils/logger'
const logger = new Logger('RenderPageContent')
/** /**
* Wraps the markdown rendering in an iframe. * Wraps the markdown rendering in an iframe.
@ -88,6 +92,18 @@ export const RenderPageContent: React.FC = () => {
}, []) }, [])
) )
useRendererReceiveHandler(
CommunicationMessageType.SET_NOTE_ID,
useCallback(({ noteId }) => {
if (!noteId) {
return
}
updateMetadata(noteId).catch((error) => {
logger.error('Failed to update metadata for note id', noteId, error)
})
}, [])
)
usePrintKeyboardShortcut() usePrintKeyboardShortcut()
const onMakeScrollSource = useCallback(() => { const onMakeScrollSource = useCallback(() => {

View file

@ -21,7 +21,8 @@ export enum CommunicationMessageType {
SET_SLIDE_OPTIONS = 'SET_SLIDE_OPTIONS', SET_SLIDE_OPTIONS = 'SET_SLIDE_OPTIONS',
IMAGE_UPLOAD = 'IMAGE_UPLOAD', IMAGE_UPLOAD = 'IMAGE_UPLOAD',
EXTENSION_EVENT = 'EXTENSION_EVENT', EXTENSION_EVENT = 'EXTENSION_EVENT',
SET_PRINT_MODE = 'SET_PRINT_MODE' SET_PRINT_MODE = 'SET_PRINT_MODE',
SET_NOTE_ID = 'SET_NOTE_ID'
} }
export interface NoPayloadMessage<TYPE extends CommunicationMessageType> { export interface NoPayloadMessage<TYPE extends CommunicationMessageType> {
@ -83,6 +84,11 @@ export interface SetSlideOptionsMessage {
slideOptions: SlideOptions slideOptions: SlideOptions
} }
export interface SetNoteMetadataMessage {
type: CommunicationMessageType.SET_NOTE_ID
noteId: string
}
export interface OnHeightChangeMessage { export interface OnHeightChangeMessage {
type: CommunicationMessageType.ON_HEIGHT_CHANGE type: CommunicationMessageType.ON_HEIGHT_CHANGE
height: number height: number
@ -108,6 +114,7 @@ export type CommunicationMessages =
| ImageUploadMessage | ImageUploadMessage
| ExtensionEvent | ExtensionEvent
| SetPrintModeConfigurationMessage | SetPrintModeConfigurationMessage
| SetNoteMetadataMessage
export type EditorToRendererMessageType = export type EditorToRendererMessageType =
| CommunicationMessageType.SET_MARKDOWN_CONTENT | CommunicationMessageType.SET_MARKDOWN_CONTENT
@ -118,6 +125,7 @@ export type EditorToRendererMessageType =
| CommunicationMessageType.SET_SLIDE_OPTIONS | CommunicationMessageType.SET_SLIDE_OPTIONS
| CommunicationMessageType.DISABLE_RENDERER_SCROLL_SOURCE | CommunicationMessageType.DISABLE_RENDERER_SCROLL_SOURCE
| CommunicationMessageType.SET_PRINT_MODE | CommunicationMessageType.SET_PRINT_MODE
| CommunicationMessageType.SET_NOTE_ID
export type RendererToEditorMessageType = export type RendererToEditorMessageType =
| CommunicationMessageType.RENDERER_READY | CommunicationMessageType.RENDERER_READY

View file

@ -52,13 +52,17 @@ export const updateCursorPositions = (selection: CursorSelection): void => {
/** /**
* Updates the current note's metadata from the server. * Updates the current note's metadata from the server.
* If no noteId is provided, the noteId from the current note is used.
*
* @param noteId Optional: The noteId of the note to update the metadata for.
*/ */
export const updateMetadata = async (): Promise<void> => { export const updateMetadata = async (noteId?: string): Promise<void> => {
const noteDetails = store.getState().noteDetails const noteDetails = store.getState().noteDetails
if (!noteDetails) { if (!noteDetails && !noteId) {
return return
} }
const updatedMetadata = await getNoteMetadata(noteDetails.id) const updatedMetadata = await getNoteMetadata(noteId || noteDetails.id)
console.debug('Updated metadata:', updatedMetadata)
const action = noteDetailsActionsCreator.updateMetadata(updatedMetadata) const action = noteDetailsActionsCreator.updateMetadata(updatedMetadata)
store.dispatch(action) store.dispatch(action)
} }