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',
}