import { observer } from "mobx-react"; import { TableOfContentsIcon, EditIcon, PlusIcon, MoonIcon, MoreIcon, SunIcon, } from "outline-icons"; import * as React from "react"; import { useTranslation } from "react-i18next"; import { Link } from "react-router-dom"; import styled, { useTheme } from "styled-components"; import { NavigationNode } from "@shared/types"; import { Theme } from "~/stores/UiStore"; import Document from "~/models/Document"; import Revision from "~/models/Revision"; import { Action, Separator } from "~/components/Actions"; import Badge from "~/components/Badge"; import Button from "~/components/Button"; import Collaborators from "~/components/Collaborators"; import DocumentBreadcrumb from "~/components/DocumentBreadcrumb"; import { useDocumentContext, useEditingFocus, } from "~/components/DocumentContext"; import Flex from "~/components/Flex"; import Header from "~/components/Header"; import Icon from "~/components/Icon"; import Star from "~/components/Star"; import Tooltip from "~/components/Tooltip"; import { publishDocument } from "~/actions/definitions/documents"; import { navigateToTemplateSettings } from "~/actions/definitions/navigation"; import { restoreRevision } from "~/actions/definitions/revisions"; import useActionContext from "~/hooks/useActionContext"; import useCurrentTeam from "~/hooks/useCurrentTeam"; import useCurrentUser from "~/hooks/useCurrentUser"; import useKeyDown from "~/hooks/useKeyDown"; import useMobile from "~/hooks/useMobile"; import usePolicy from "~/hooks/usePolicy"; import useStores from "~/hooks/useStores"; import DocumentMenu from "~/menus/DocumentMenu"; import NewChildDocumentMenu from "~/menus/NewChildDocumentMenu"; import TableOfContentsMenu from "~/menus/TableOfContentsMenu"; import TemplatesMenu from "~/menus/TemplatesMenu"; import { metaDisplay } from "~/utils/keyboard"; import { documentEditPath } from "~/utils/routeHelpers"; import ObservingBanner from "./ObservingBanner"; import PublicBreadcrumb from "./PublicBreadcrumb"; import ShareButton from "./ShareButton"; type Props = { document: Document; documentHasHeadings: boolean; revision: Revision | undefined; sharedTree: NavigationNode | undefined; shareId: string | null | undefined; isDraft: boolean; isEditing: boolean; isSaving: boolean; isPublishing: boolean; publishingIsDisabled: boolean; savingIsDisabled: boolean; onSelectTemplate: (template: Document) => void; onSave: (options: { done?: boolean; publish?: boolean; autosave?: boolean; }) => void; headings: { title: string; level: number; id: string; }[]; }; function DocumentHeader({ document, documentHasHeadings, revision, shareId, isEditing, isDraft, isPublishing, isSaving, savingIsDisabled, publishingIsDisabled, sharedTree, onSelectTemplate, onSave, headings, }: Props) { const { t } = useTranslation(); const { ui } = useStores(); const theme = useTheme(); const team = useCurrentTeam({ rejectOnEmpty: false }); const user = useCurrentUser({ rejectOnEmpty: false }); const { resolvedTheme } = ui; const isMobile = useMobile(); const isRevision = !!revision; const isEditingFocus = useEditingFocus(); const { editor } = useDocumentContext(); // We cache this value for as long as the component is mounted so that if you // apply a template there is still the option to replace it until the user // navigates away from the doc const [isNew] = React.useState(document.isPersistedOnce); const handleSave = React.useCallback(() => { onSave({ done: true, }); }, [onSave]); const context = useActionContext({ activeDocumentId: document?.id, }); const { isDeleted, isTemplate } = document; const can = usePolicy(document); const canToggleEmbeds = team?.documentEmbeds; const toc = ( ); const appearanceAction = ( )} {can.update && !isEditing && user?.separateEditMode && !isRevision && editAction} {can.update && can.createChildDocument && !isRevision && !isMobile && ( ( )} /> )} {revision && revision.createdAt !== document.updatedAt && ( )} {can.publish && ( )} {!isDeleted && } (