diff --git a/apps/dotcom-worker/src/lib/TLDrawDurableObject.ts b/apps/dotcom-worker/src/lib/TLDrawDurableObject.ts index 5a203f8e0..723b55a23 100644 --- a/apps/dotcom-worker/src/lib/TLDrawDurableObject.ts +++ b/apps/dotcom-worker/src/lib/TLDrawDurableObject.ts @@ -89,22 +89,22 @@ export class TLDrawDurableObject extends TLServer { readonly router = Router() .get( '/r/:roomId', - (req) => this.extractDocumentInfoFromRequest(req, 'read-write'), + (req) => this.extractDocumentInfoFromRequest(req, RoomOpenMode.READ_WRITE), (req) => this.onRequest(req) ) .get( '/v/:roomId', - (req) => this.extractDocumentInfoFromRequest(req, 'readonly-legacy'), + (req) => this.extractDocumentInfoFromRequest(req, RoomOpenMode.READ_ONLY_LEGACY), (req) => this.onRequest(req) ) .get( '/ro/:roomId', - (req) => this.extractDocumentInfoFromRequest(req, 'readonly'), + (req) => this.extractDocumentInfoFromRequest(req, RoomOpenMode.READ_ONLY), (req) => this.onRequest(req) ) .post( '/r/:roomId/restore', - (req) => this.extractDocumentInfoFromRequest(req, 'read-write'), + (req) => this.extractDocumentInfoFromRequest(req, RoomOpenMode.READ_WRITE), (req) => this.onRestore(req) ) .all('*', () => new Response('Not found', { status: 404 })) diff --git a/apps/dotcom-worker/src/lib/utils/roomOpenMode.ts b/apps/dotcom-worker/src/lib/utils/roomOpenMode.ts index ec451ab40..ec705d7d0 100644 --- a/apps/dotcom-worker/src/lib/utils/roomOpenMode.ts +++ b/apps/dotcom-worker/src/lib/utils/roomOpenMode.ts @@ -4,11 +4,11 @@ import { Environment } from '../types' export async function getSlug(env: Environment, slug: string | null, roomOpenMode: RoomOpenMode) { if (!slug) return null switch (roomOpenMode) { - case 'read-write': + case RoomOpenMode.READ_WRITE: return slug - case 'readonly': + case RoomOpenMode.READ_ONLY: return await env.READONLY_SLUG_TO_SLUG.get(slug) - case 'readonly-legacy': + case RoomOpenMode.READ_ONLY_LEGACY: return lns(slug) default: exhaustiveSwitchError(roomOpenMode) diff --git a/apps/dotcom-worker/src/lib/worker.ts b/apps/dotcom-worker/src/lib/worker.ts index c7480e84d..9163687d2 100644 --- a/apps/dotcom-worker/src/lib/worker.ts +++ b/apps/dotcom-worker/src/lib/worker.ts @@ -1,5 +1,6 @@ /// /// +import { RoomOpenMode } from '@tldraw/utils' import { Router, createCors } from 'itty-router' import { env } from 'process' import Toucan from 'toucan-js' @@ -25,9 +26,9 @@ const router = Router() .post('/new-room', createRoom) .post('/snapshots', createRoomSnapshot) .get('/snapshot/:roomId', getRoomSnapshot) - .get('/r/:roomId', (req, env) => joinExistingRoom(req, env, 'read-write')) - .get('/v/:roomId', (req, env) => joinExistingRoom(req, env, 'readonly-legacy')) - .get('/ro/:roomId', (req, env) => joinExistingRoom(req, env, 'readonly')) + .get('/r/:roomId', (req, env) => joinExistingRoom(req, env, RoomOpenMode.READ_WRITE)) + .get('/v/:roomId', (req, env) => joinExistingRoom(req, env, RoomOpenMode.READ_ONLY_LEGACY)) + .get('/ro/:roomId', (req, env) => joinExistingRoom(req, env, RoomOpenMode.READ_ONLY)) .get('/r/:roomId/history', getRoomHistory) .get('/r/:roomId/history/:timestamp', getRoomHistorySnapshot) .get('/readonly-slug/:roomId', getReadonlySlug) diff --git a/apps/dotcom/src/components/MultiplayerEditor.tsx b/apps/dotcom/src/components/MultiplayerEditor.tsx index f45f4348e..c28956d70 100644 --- a/apps/dotcom/src/components/MultiplayerEditor.tsx +++ b/apps/dotcom/src/components/MultiplayerEditor.tsx @@ -127,7 +127,8 @@ export function MultiplayerEditor({ const sharingUiOverrides = useSharing() const fileSystemUiOverrides = useFileSystem({ isMultiplayer: true }) const cursorChatOverrides = useCursorChat() - const isReadonly = roomOpenMode === 'readonly' || roomOpenMode === 'readonly-legacy' + const isReadonly = + roomOpenMode === RoomOpenMode.READ_ONLY || roomOpenMode === RoomOpenMode.READ_ONLY_LEGACY const handleMount = useCallback( (editor: Editor) => { diff --git a/apps/dotcom/src/components/ShareMenu.tsx b/apps/dotcom/src/components/ShareMenu.tsx index bf420641b..54a82810e 100644 --- a/apps/dotcom/src/components/ShareMenu.tsx +++ b/apps/dotcom/src/components/ShareMenu.tsx @@ -1,6 +1,7 @@ import * as Popover from '@radix-ui/react-popover' import React, { useEffect, useState } from 'react' import { + RoomOpenMode, RoomOpenModeToPath, TldrawUiMenuContextProvider, TldrawUiMenuGroup, @@ -26,8 +27,8 @@ type ShareState = { function isReadonlyUrl(url: string) { return ( - url.includes(`/${RoomOpenModeToPath['readonly']}/`) || - url.includes(`/${RoomOpenModeToPath['readonly-legacy']}/`) + url.includes(`/${RoomOpenModeToPath[RoomOpenMode.READ_ONLY]}/`) || + url.includes(`/${RoomOpenModeToPath[RoomOpenMode.READ_ONLY_LEGACY]}/`) ) } @@ -41,7 +42,7 @@ function getFreshShareState(): ShareState { const isReadOnly = isReadonlyUrl(href) return { - state: isShared ? 'shared' : isReadOnly ? 'readonly' : 'offline', + state: isShared ? 'shared' : isReadOnly ? RoomOpenMode.READ_ONLY : 'offline', url: window.location.href, readonlyUrl: isReadOnly ? window.location.href : null, qrCodeDataUrl: '', @@ -55,7 +56,7 @@ async function getReadonlyUrl() { if (isReadOnly) return href const segs = href.split('/') - segs[segs.length - 2] = RoomOpenModeToPath['readonly'] + segs[segs.length - 2] = RoomOpenModeToPath[RoomOpenMode.READ_ONLY] const [roomId, params] = segs[segs.length - 1].split('?') const result = await fetch(`/api/readonly-slug/${roomId}`) diff --git a/apps/dotcom/src/pages/public-multiplayer.tsx b/apps/dotcom/src/pages/public-multiplayer.tsx index b35f8f107..a6899b68b 100644 --- a/apps/dotcom/src/pages/public-multiplayer.tsx +++ b/apps/dotcom/src/pages/public-multiplayer.tsx @@ -1,4 +1,5 @@ import { useParams } from 'react-router-dom' +import { RoomOpenMode } from 'tldraw' import '../../styles/globals.css' import { IFrameProtector } from '../components/IFrameProtector' import { MultiplayerEditor } from '../components/MultiplayerEditor' @@ -7,7 +8,7 @@ export function Component() { const id = useParams()['roomId'] as string return ( - + ) } diff --git a/apps/dotcom/src/pages/public-readonly-legacy.tsx b/apps/dotcom/src/pages/public-readonly-legacy.tsx index 3b19288ac..f4926bc8b 100644 --- a/apps/dotcom/src/pages/public-readonly-legacy.tsx +++ b/apps/dotcom/src/pages/public-readonly-legacy.tsx @@ -1,4 +1,5 @@ import { useParams } from 'react-router-dom' +import { RoomOpenMode } from 'tldraw' import '../../styles/globals.css' import { IFrameProtector } from '../components/IFrameProtector' import { MultiplayerEditor } from '../components/MultiplayerEditor' @@ -7,7 +8,7 @@ export function Component() { const id = useParams()['roomId'] as string return ( - + ) } diff --git a/apps/dotcom/src/pages/public-readonly.tsx b/apps/dotcom/src/pages/public-readonly.tsx index 7e2cb2627..0f4a647d1 100644 --- a/apps/dotcom/src/pages/public-readonly.tsx +++ b/apps/dotcom/src/pages/public-readonly.tsx @@ -1,4 +1,5 @@ import { useParams } from 'react-router-dom' +import { RoomOpenMode } from 'tldraw' import '../../styles/globals.css' import { IFrameProtector } from '../components/IFrameProtector' import { MultiplayerEditor } from '../components/MultiplayerEditor' @@ -7,7 +8,7 @@ export function Component() { const id = useParams()['roomId'] as string return ( - + ) } diff --git a/packages/utils/api-report.md b/packages/utils/api-report.md index ac1298086..6708f05a4 100644 --- a/packages/utils/api-report.md +++ b/packages/utils/api-report.md @@ -298,7 +298,14 @@ export const Result: { export function rng(seed?: string): () => number; // @public (undocumented) -export type RoomOpenMode = 'read-write' | 'readonly-legacy' | 'readonly'; +export enum RoomOpenMode { + // (undocumented) + READ_ONLY = "readonly", + // (undocumented) + READ_ONLY_LEGACY = "readonly-legacy", + // (undocumented) + READ_WRITE = "read-write" +} // @public (undocumented) export const RoomOpenModeToPath: Record; diff --git a/packages/utils/api/api.json b/packages/utils/api/api.json index 89d84849f..c3db87f07 100644 --- a/packages/utils/api/api.json +++ b/packages/utils/api/api.json @@ -2984,30 +2984,84 @@ "name": "rng" }, { - "kind": "TypeAlias", - "canonicalReference": "@tldraw/utils!RoomOpenMode:type", + "kind": "Enum", + "canonicalReference": "@tldraw/utils!RoomOpenMode:enum", "docComment": "/**\n * @public\n */\n", "excerptTokens": [ { "kind": "Content", - "text": "export type RoomOpenMode = " - }, - { - "kind": "Content", - "text": "'read-write' | 'readonly-legacy' | 'readonly'" - }, - { - "kind": "Content", - "text": ";" + "text": "export declare enum RoomOpenMode " } ], "fileUrlPath": "packages/utils/src/lib/routes.ts", "releaseTag": "Public", "name": "RoomOpenMode", - "typeTokenRange": { - "startIndex": 1, - "endIndex": 2 - } + "preserveMemberOrder": false, + "members": [ + { + "kind": "EnumMember", + "canonicalReference": "@tldraw/utils!RoomOpenMode.READ_ONLY:member", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "READ_ONLY = " + }, + { + "kind": "Content", + "text": "\"readonly\"" + } + ], + "initializerTokenRange": { + "startIndex": 1, + "endIndex": 2 + }, + "releaseTag": "Public", + "name": "READ_ONLY" + }, + { + "kind": "EnumMember", + "canonicalReference": "@tldraw/utils!RoomOpenMode.READ_ONLY_LEGACY:member", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "READ_ONLY_LEGACY = " + }, + { + "kind": "Content", + "text": "\"readonly-legacy\"" + } + ], + "initializerTokenRange": { + "startIndex": 1, + "endIndex": 2 + }, + "releaseTag": "Public", + "name": "READ_ONLY_LEGACY" + }, + { + "kind": "EnumMember", + "canonicalReference": "@tldraw/utils!RoomOpenMode.READ_WRITE:member", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "READ_WRITE = " + }, + { + "kind": "Content", + "text": "\"read-write\"" + } + ], + "initializerTokenRange": { + "startIndex": 1, + "endIndex": 2 + }, + "releaseTag": "Public", + "name": "READ_WRITE" + } + ] }, { "kind": "Variable", @@ -3030,7 +3084,7 @@ { "kind": "Reference", "text": "RoomOpenMode", - "canonicalReference": "@tldraw/utils!RoomOpenMode:type" + "canonicalReference": "@tldraw/utils!RoomOpenMode:enum" }, { "kind": "Content", diff --git a/packages/utils/src/index.ts b/packages/utils/src/index.ts index 560cc9d2a..a7325eef3 100644 --- a/packages/utils/src/index.ts +++ b/packages/utils/src/index.ts @@ -51,7 +51,7 @@ export { sortByIndex, validateIndexKey, } from './lib/reordering/reordering' -export { RoomOpenModeToPath, type RoomOpenMode } from './lib/routes' +export { RoomOpenMode, RoomOpenModeToPath } from './lib/routes' export { sortById } from './lib/sort' export { clearLocalStorage, diff --git a/packages/utils/src/lib/routes.ts b/packages/utils/src/lib/routes.ts index f9c7f7c29..00b719aae 100644 --- a/packages/utils/src/lib/routes.ts +++ b/packages/utils/src/lib/routes.ts @@ -1,8 +1,13 @@ /** @public */ -export type RoomOpenMode = 'readonly' | 'readonly-legacy' | 'read-write' +export enum RoomOpenMode { + READ_ONLY = 'readonly', + READ_ONLY_LEGACY = 'readonly-legacy', + READ_WRITE = 'read-write', +} + /** @public */ export const RoomOpenModeToPath: Record = { - readonly: 'ro', - 'readonly-legacy': 'v', - 'read-write': 'r', + [RoomOpenMode.READ_ONLY]: 'ro', + [RoomOpenMode.READ_ONLY_LEGACY]: 'v', + [RoomOpenMode.READ_WRITE]: 'r', }