// @flow
import { observer } from "mobx-react";
import {
TableOfContentsIcon,
EditIcon,
GlobeIcon,
PlusIcon,
MoreIcon,
} from "outline-icons";
import * as React from "react";
import { Trans, useTranslation } from "react-i18next";
import { Link } from "react-router-dom";
import styled from "styled-components";
import Document from "models/Document";
import DocumentShare from "scenes/DocumentShare";
import { Action, Separator } from "components/Actions";
import Badge from "components/Badge";
import Breadcrumb, { Slash } from "components/Breadcrumb";
import Button from "components/Button";
import Collaborators from "components/Collaborators";
import Fade from "components/Fade";
import Header from "components/Header";
import Modal from "components/Modal";
import Tooltip from "components/Tooltip";
import useMobile from "hooks/useMobile";
import useStores from "hooks/useStores";
import DocumentMenu from "menus/DocumentMenu";
import NewChildDocumentMenu from "menus/NewChildDocumentMenu";
import TemplatesMenu from "menus/TemplatesMenu";
import { metaDisplay } from "utils/keyboard";
import { newDocumentUrl, editDocumentUrl } from "utils/routeHelpers";
type Props = {|
document: Document,
isShare: boolean,
isDraft: boolean,
isEditing: boolean,
isRevision: boolean,
isSaving: boolean,
isPublishing: boolean,
publishingIsDisabled: boolean,
savingIsDisabled: boolean,
onDiscard: () => void,
onSave: ({
done?: boolean,
publish?: boolean,
autosave?: boolean,
}) => void,
|};
function DocumentHeader({
document,
isShare,
isEditing,
isDraft,
isPublishing,
isRevision,
isSaving,
savingIsDisabled,
publishingIsDisabled,
onSave,
}: Props) {
const { t } = useTranslation();
const { auth, ui, shares, policies } = useStores();
const isMobile = useMobile();
const [showShareModal, setShowShareModal] = React.useState(false);
const handleSave = React.useCallback(() => {
onSave({ done: true });
}, [onSave]);
const handlePublish = React.useCallback(() => {
onSave({ done: true, publish: true });
}, [onSave]);
const handleShareLink = React.useCallback(
async (ev: SyntheticEvent<>) => {
await document.share();
setShowShareModal(true);
},
[document]
);
const handleCloseShareModal = React.useCallback(() => {
setShowShareModal(false);
}, []);
const share = shares.getByDocumentId(document.id);
const isPubliclyShared = share && share.published;
const isNew = document.isNew;
const isTemplate = document.isTemplate;
const can = policies.abilities(document.id);
const canShareDocument = auth.team && auth.team.sharing && can.share;
const canToggleEmbeds = auth.team && auth.team.documentEmbeds;
const canEdit = can.update && !isEditing;
const toc = (
}
iconColor="currentColor"
borderOnHover
neutral
/>
);
const editAction = (
}
to={editDocumentUrl(document)}
neutral
>
{t("Edit")}
);
if (isShare) {
return (
}
/>
);
}
return (
<>
{!isEditing && (
<>
{toc}
>
)}
}
title={
<>
{document.title}{" "}
{document.isArchived && {t("Archived")}}
>
}
actions={
<>
{!isPublishing && isSaving && {t("Saving")}…}
{isEditing && !isTemplate && isNew && (
)}
{!isEditing && canShareDocument && (!isMobile || !isTemplate) && (
Anyone with the link
can view this document
) : (
""
)
}
delay={500}
placement="bottom"
>
: undefined}
onClick={handleShareLink}
neutral
>
{t("Share")}
)}
{isEditing && (
<>
>
)}
{canEdit && editAction}
{canEdit && can.createChildDocument && !isMobile && (
(
} {...props} neutral>
{t("New doc")}
)}
/>
)}
{canEdit && isTemplate && !isDraft && !isRevision && (
}
as={Link}
to={newDocumentUrl(document.collectionId, {
templateId: document.id,
})}
primary
>
{t("New from template")}
)}
{can.update && isDraft && !isRevision && (
)}
{!isEditing && (
<>
(
}
iconColor="currentColor"
{...props}
borderOnHover
neutral
/>
)}
showToggleEmbeds={canToggleEmbeds}
showPrint
/>
>
)}
>
}
/>
>
);
}
const Status = styled(Action)`
padding-left: 0;
padding-right: 4px;
color: ${(props) => props.theme.slate};
`;
export default observer(DocumentHeader);