diff --git a/app/components/Collaborators.js b/app/components/Collaborators.js index 384e20f8..d817e9a2 100644 --- a/app/components/Collaborators.js +++ b/app/components/Collaborators.js @@ -12,17 +12,19 @@ import DocumentViews from "components/DocumentViews"; import Facepile from "components/Facepile"; import NudeButton from "components/NudeButton"; import Popover from "components/Popover"; +import useCurrentUser from "hooks/useCurrentUser"; import useStores from "hooks/useStores"; type Props = {| document: Document, - currentUserId: string, |}; function Collaborators(props: Props) { const { t } = useTranslation(); + const user = useCurrentUser(); + const currentUserId = user?.id; const { users, presence } = useStores(); - const { document, currentUserId } = props; + const { document } = props; let documentPresence = presence.get(document.id); documentPresence = documentPresence diff --git a/app/scenes/Document/components/Document.js b/app/scenes/Document/components/Document.js index 13628d2f..6533d925 100644 --- a/app/scenes/Document/components/Document.js +++ b/app/scenes/Document/components/Document.js @@ -90,7 +90,7 @@ class DocumentScene extends React.Component { this.updateIsDirty(); } - if (this.props.readOnly) { + if (this.props.readOnly || auth.team?.collaborativeEditing) { this.lastRevision = document.revision; if (document.title !== this.title) { diff --git a/app/scenes/Document/components/Header.js b/app/scenes/Document/components/Header.js index b766f864..925d1f36 100644 --- a/app/scenes/Document/components/Header.js +++ b/app/scenes/Document/components/Header.js @@ -20,6 +20,7 @@ import Header from "components/Header"; import Tooltip from "components/Tooltip"; import PublicBreadcrumb from "./PublicBreadcrumb"; import ShareButton from "./ShareButton"; +import useCurrentTeam from "hooks/useCurrentTeam"; import useMobile from "hooks/useMobile"; import useStores from "hooks/useStores"; import DocumentMenu from "menus/DocumentMenu"; @@ -67,7 +68,8 @@ function DocumentHeader({ headings, }: Props) { const { t } = useTranslation(); - const { auth, ui, policies } = useStores(); + const team = useCurrentTeam(); + const { ui, policies } = useStores(); const isMobile = useMobile(); const handleSave = React.useCallback(() => { @@ -81,7 +83,7 @@ function DocumentHeader({ const isNew = document.isNewDocument; const isTemplate = document.isTemplate; const can = policies.abilities(document.id); - const canToggleEmbeds = auth.team && auth.team.documentEmbeds; + const canToggleEmbeds = team?.documentEmbeds; const canEdit = can.update && !isEditing; const toc = ( @@ -162,11 +164,10 @@ function DocumentHeader({ )} - {!isPublishing && isSaving && {t("Saving")}…} - + {!isPublishing && isSaving && !team.collaborativeEditing && ( + {t("Saving")}… + )} + {isEditing && !isTemplate && isNew && ( { }); Event.afterCreate((event) => { - globalEventQueue.add(event, { removeOnComplete: true }); + globalEventQueue.add(event); }); // add can be used to send events into the event system without recording them -// in the database / audit trail +// in the database or audit trail Event.add = (event) => { - globalEventQueue.add(Event.build(event), { removeOnComplete: true }); + const now = new Date(); + + globalEventQueue.add( + Event.build({ + createdAt: now, + updatedAt: now, + ...event, + }) + ); }; Event.ACTIVITY_EVENTS = [ diff --git a/server/services/collaboration.js b/server/services/collaboration.js index ff2886d2..fe34c232 100644 --- a/server/services/collaboration.js +++ b/server/services/collaboration.js @@ -1,12 +1,13 @@ // @flow import http from "http"; -import { Logger } from "@hocuspocus/extension-logger"; import { Server } from "@hocuspocus/server"; import Koa from "koa"; import websocket from "koa-easy-ws"; import Router from "koa-router"; import AuthenticationExtension from "../collaboration/authentication"; +import LoggerExtension from "../collaboration/logger"; import PersistenceExtension from "../collaboration/persistence"; +import TracingExtension from "../collaboration/tracing"; export default function init(app: Koa, server: http.Server) { const router = new Router(); @@ -15,7 +16,8 @@ export default function init(app: Koa, server: http.Server) { extensions: [ new AuthenticationExtension(), new PersistenceExtension(), - new Logger(), + new LoggerExtension(), + new TracingExtension(), ], }); diff --git a/server/services/worker.js b/server/services/worker.js index 2c86da3c..8b9150b6 100644 --- a/server/services/worker.js +++ b/server/services/worker.js @@ -36,13 +36,10 @@ export default function init(app: Koa, server?: http.Server) { // this queue processes global events and hands them off to services globalEventQueue.process(function (job) { Object.keys(eventProcessors).forEach((name) => { - processorEventQueue.add( - { ...job.data, service: name }, - { removeOnComplete: true } - ); + processorEventQueue.add({ ...job.data, service: name }); }); - websocketsQueue.add(job.data, { removeOnComplete: true }); + websocketsQueue.add(job.data); }); processorEventQueue.process(function (job) {