kopia lustrzana https://github.com/Tldraw/Tldraw
enum -> const
rodzic
5359aacc05
commit
d96389418a
|
@ -2,7 +2,7 @@
|
|||
/// <reference types="@cloudflare/workers-types" />
|
||||
|
||||
import { SupabaseClient } from '@supabase/supabase-js'
|
||||
import { RoomOpenMode } from '@tldraw/dotcom-shared'
|
||||
import { ROOM_OPEN_MODE, type RoomOpenMode } from '@tldraw/dotcom-shared'
|
||||
import {
|
||||
RoomSnapshot,
|
||||
TLServer,
|
||||
|
@ -90,22 +90,22 @@ export class TLDrawDurableObject extends TLServer {
|
|||
readonly router = Router()
|
||||
.get(
|
||||
'/r/:roomId',
|
||||
(req) => this.extractDocumentInfoFromRequest(req, RoomOpenMode.READ_WRITE),
|
||||
(req) => this.extractDocumentInfoFromRequest(req, ROOM_OPEN_MODE.READ_WRITE),
|
||||
(req) => this.onRequest(req)
|
||||
)
|
||||
.get(
|
||||
'/v/:roomId',
|
||||
(req) => this.extractDocumentInfoFromRequest(req, RoomOpenMode.READ_ONLY_LEGACY),
|
||||
(req) => this.extractDocumentInfoFromRequest(req, ROOM_OPEN_MODE.READ_ONLY_LEGACY),
|
||||
(req) => this.onRequest(req)
|
||||
)
|
||||
.get(
|
||||
'/ro/:roomId',
|
||||
(req) => this.extractDocumentInfoFromRequest(req, RoomOpenMode.READ_ONLY),
|
||||
(req) => this.extractDocumentInfoFromRequest(req, ROOM_OPEN_MODE.READ_ONLY),
|
||||
(req) => this.onRequest(req)
|
||||
)
|
||||
.post(
|
||||
'/r/:roomId/restore',
|
||||
(req) => this.extractDocumentInfoFromRequest(req, RoomOpenMode.READ_WRITE),
|
||||
(req) => this.extractDocumentInfoFromRequest(req, ROOM_OPEN_MODE.READ_WRITE),
|
||||
(req) => this.onRestore(req)
|
||||
)
|
||||
.all('*', () => new Response('Not found', { status: 404 }))
|
||||
|
|
|
@ -1,15 +1,15 @@
|
|||
import { RoomOpenMode } from '@tldraw/dotcom-shared'
|
||||
import { ROOM_OPEN_MODE, RoomOpenMode } from '@tldraw/dotcom-shared'
|
||||
import { exhaustiveSwitchError, lns } from '@tldraw/utils'
|
||||
import { Environment } from '../types'
|
||||
|
||||
export async function getSlug(env: Environment, slug: string | null, roomOpenMode: RoomOpenMode) {
|
||||
if (!slug) return null
|
||||
switch (roomOpenMode) {
|
||||
case RoomOpenMode.READ_WRITE:
|
||||
case ROOM_OPEN_MODE.READ_WRITE:
|
||||
return slug
|
||||
case RoomOpenMode.READ_ONLY:
|
||||
case ROOM_OPEN_MODE.READ_ONLY:
|
||||
return await env.READONLY_SLUG_TO_SLUG.get(slug)
|
||||
case RoomOpenMode.READ_ONLY_LEGACY:
|
||||
case ROOM_OPEN_MODE.READ_ONLY_LEGACY:
|
||||
return lns(slug)
|
||||
default:
|
||||
exhaustiveSwitchError(roomOpenMode)
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/// <reference no-default-lib="true"/>
|
||||
/// <reference types="@cloudflare/workers-types" />
|
||||
import { RoomOpenMode } from '@tldraw/dotcom-shared'
|
||||
import { ROOM_OPEN_MODE } from '@tldraw/dotcom-shared'
|
||||
import { Router, createCors } from 'itty-router'
|
||||
import { env } from 'process'
|
||||
import Toucan from 'toucan-js'
|
||||
|
@ -26,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, 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', (req, env) => joinExistingRoom(req, env, ROOM_OPEN_MODE.READ_WRITE))
|
||||
.get('/v/:roomId', (req, env) => joinExistingRoom(req, env, ROOM_OPEN_MODE.READ_ONLY_LEGACY))
|
||||
.get('/ro/:roomId', (req, env) => joinExistingRoom(req, env, ROOM_OPEN_MODE.READ_ONLY))
|
||||
.get('/r/:roomId/history', getRoomHistory)
|
||||
.get('/r/:roomId/history/:timestamp', getRoomHistorySnapshot)
|
||||
.get('/readonly-slug/:roomId', getReadonlySlug)
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import { RoomOpenMode, RoomOpenModeToPath } from '@tldraw/dotcom-shared'
|
||||
import { ROOM_OPEN_MODE, RoomOpenModeToPath, type RoomOpenMode } from '@tldraw/dotcom-shared'
|
||||
import { useCallback, useEffect } from 'react'
|
||||
import {
|
||||
DefaultContextMenu,
|
||||
|
@ -127,7 +127,7 @@ export function MultiplayerEditor({
|
|||
const fileSystemUiOverrides = useFileSystem({ isMultiplayer: true })
|
||||
const cursorChatOverrides = useCursorChat()
|
||||
const isReadonly =
|
||||
roomOpenMode === RoomOpenMode.READ_ONLY || roomOpenMode === RoomOpenMode.READ_ONLY_LEGACY
|
||||
roomOpenMode === ROOM_OPEN_MODE.READ_ONLY || roomOpenMode === ROOM_OPEN_MODE.READ_ONLY_LEGACY
|
||||
|
||||
const handleMount = useCallback(
|
||||
(editor: Editor) => {
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
import * as Popover from '@radix-ui/react-popover'
|
||||
import {
|
||||
GetReadonlySlugResponseBody,
|
||||
RoomOpenMode,
|
||||
ROOM_OPEN_MODE,
|
||||
RoomOpenModeToPath,
|
||||
} from '@tldraw/dotcom-shared'
|
||||
import React, { useEffect, useState } from 'react'
|
||||
|
@ -20,11 +20,12 @@ import { createQRCodeImageDataString } from '../utils/qrcode'
|
|||
import { SHARE_PROJECT_ACTION, SHARE_SNAPSHOT_ACTION } from '../utils/sharing'
|
||||
import { ShareButton } from './ShareButton'
|
||||
|
||||
enum ShareCurrentState {
|
||||
OFFLINE = 'offline',
|
||||
SHARED_READ_WRITE = 'shared-read-write',
|
||||
SHARED_READ_ONLY = 'shared-read-only',
|
||||
}
|
||||
const SHARE_CURRENT_STATE = {
|
||||
OFFLINE: 'offline',
|
||||
SHARED_READ_WRITE: 'shared-read-write',
|
||||
SHARED_READ_ONLY: 'shared-read-only',
|
||||
} as const
|
||||
type ShareCurrentState = (typeof SHARE_CURRENT_STATE)[keyof typeof SHARE_CURRENT_STATE]
|
||||
|
||||
type ShareState = {
|
||||
state: ShareCurrentState
|
||||
|
@ -36,8 +37,8 @@ type ShareState = {
|
|||
|
||||
function isSharedReadonlyUrl(pathname: string) {
|
||||
return (
|
||||
pathname.startsWith(`/${RoomOpenModeToPath[RoomOpenMode.READ_ONLY]}/`) ||
|
||||
pathname.startsWith(`/${RoomOpenModeToPath[RoomOpenMode.READ_ONLY_LEGACY]}/`)
|
||||
pathname.startsWith(`/${RoomOpenModeToPath[ROOM_OPEN_MODE.READ_ONLY]}/`) ||
|
||||
pathname.startsWith(`/${RoomOpenModeToPath[ROOM_OPEN_MODE.READ_ONLY_LEGACY]}/`)
|
||||
)
|
||||
}
|
||||
|
||||
|
@ -51,10 +52,10 @@ function getFreshShareState(): ShareState {
|
|||
|
||||
return {
|
||||
state: isSharedReadWrite
|
||||
? ShareCurrentState.SHARED_READ_WRITE
|
||||
? SHARE_CURRENT_STATE.SHARED_READ_WRITE
|
||||
: isSharedReadOnly
|
||||
? ShareCurrentState.SHARED_READ_ONLY
|
||||
: ShareCurrentState.OFFLINE,
|
||||
? SHARE_CURRENT_STATE.SHARED_READ_ONLY
|
||||
: SHARE_CURRENT_STATE.OFFLINE,
|
||||
url: window.location.href,
|
||||
readonlyUrl: isSharedReadOnly ? window.location.href : null,
|
||||
qrCodeDataUrl: '',
|
||||
|
@ -77,7 +78,7 @@ async function getReadonlyUrl() {
|
|||
if (!data.slug) return
|
||||
|
||||
segments[1] =
|
||||
RoomOpenModeToPath[data.isLegacy ? RoomOpenMode.READ_ONLY_LEGACY : RoomOpenMode.READ_ONLY]
|
||||
RoomOpenModeToPath[data.isLegacy ? ROOM_OPEN_MODE.READ_ONLY_LEGACY : ROOM_OPEN_MODE.READ_ONLY]
|
||||
segments[2] = data.slug
|
||||
const newPathname = segments.join('/')
|
||||
|
||||
|
@ -96,7 +97,7 @@ export const ShareMenu = React.memo(function ShareMenu() {
|
|||
|
||||
const [isUploading, setIsUploading] = useState(false)
|
||||
const [isUploadingSnapshot, setIsUploadingSnapshot] = useState(false)
|
||||
const isReadOnlyLink = shareState.state === ShareCurrentState.SHARED_READ_ONLY
|
||||
const isReadOnlyLink = shareState.state === SHARE_CURRENT_STATE.SHARED_READ_ONLY
|
||||
const currentShareLinkUrl = isReadOnlyLink ? shareState.readonlyUrl : shareState.url
|
||||
const currentQrCodeUrl = isReadOnlyLink
|
||||
? shareState.readonlyQrCodeDataUrl
|
||||
|
@ -106,14 +107,14 @@ export const ShareMenu = React.memo(function ShareMenu() {
|
|||
const [didCopySnapshotLink, setDidCopySnapshotLink] = useState(false)
|
||||
|
||||
useEffect(() => {
|
||||
if (shareState.state === ShareCurrentState.OFFLINE) {
|
||||
if (shareState.state === SHARE_CURRENT_STATE.OFFLINE) {
|
||||
return
|
||||
}
|
||||
|
||||
let cancelled = false
|
||||
|
||||
const shareUrl = getShareUrl(window.location.href, false)
|
||||
if (!shareState.qrCodeDataUrl && shareState.state === ShareCurrentState.SHARED_READ_WRITE) {
|
||||
if (!shareState.qrCodeDataUrl && shareState.state === SHARE_CURRENT_STATE.SHARED_READ_WRITE) {
|
||||
// Fetch the QR code data URL
|
||||
createQRCodeImageDataString(shareUrl).then((dataUrl) => {
|
||||
if (!cancelled) {
|
||||
|
@ -162,8 +163,8 @@ export const ShareMenu = React.memo(function ShareMenu() {
|
|||
alignOffset={4}
|
||||
>
|
||||
<TldrawUiMenuContextProvider type="panel" sourceId="share-menu">
|
||||
{shareState.state === ShareCurrentState.SHARED_READ_WRITE ||
|
||||
shareState.state === ShareCurrentState.SHARED_READ_ONLY ? (
|
||||
{shareState.state === SHARE_CURRENT_STATE.SHARED_READ_WRITE ||
|
||||
shareState.state === SHARE_CURRENT_STATE.SHARED_READ_ONLY ? (
|
||||
<>
|
||||
<button
|
||||
className="tlui-share-zone__qr-code"
|
||||
|
@ -180,7 +181,7 @@ export const ShareMenu = React.memo(function ShareMenu() {
|
|||
/>
|
||||
|
||||
<TldrawUiMenuGroup id="copy">
|
||||
{shareState.state === ShareCurrentState.SHARED_READ_WRITE && (
|
||||
{shareState.state === SHARE_CURRENT_STATE.SHARED_READ_WRITE && (
|
||||
<TldrawUiMenuItem
|
||||
id="copy-to-clipboard"
|
||||
readonlyOk
|
||||
|
@ -247,7 +248,7 @@ export const ShareMenu = React.memo(function ShareMenu() {
|
|||
/>
|
||||
<p className="tlui-menu__group tlui-share-zone__details">
|
||||
{msg(
|
||||
shareState.state === ShareCurrentState.OFFLINE
|
||||
shareState.state === SHARE_CURRENT_STATE.OFFLINE
|
||||
? 'share-menu.offline-note'
|
||||
: isReadOnlyLink
|
||||
? 'share-menu.copy-readonly-link-note'
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import { RoomOpenMode } from '@tldraw/dotcom-shared'
|
||||
import { ROOM_OPEN_MODE } from '@tldraw/dotcom-shared'
|
||||
import { useParams } from 'react-router-dom'
|
||||
import '../../styles/globals.css'
|
||||
import { IFrameProtector } from '../components/IFrameProtector'
|
||||
|
@ -8,7 +8,7 @@ export function Component() {
|
|||
const id = useParams()['roomId'] as string
|
||||
return (
|
||||
<IFrameProtector slug={id} context="public-multiplayer">
|
||||
<MultiplayerEditor roomOpenMode={RoomOpenMode.READ_WRITE} roomSlug={id} />
|
||||
<MultiplayerEditor roomOpenMode={ROOM_OPEN_MODE.READ_WRITE} roomSlug={id} />
|
||||
</IFrameProtector>
|
||||
)
|
||||
}
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import { RoomOpenMode } from '@tldraw/dotcom-shared'
|
||||
import { ROOM_OPEN_MODE } from '@tldraw/dotcom-shared'
|
||||
import { useParams } from 'react-router-dom'
|
||||
import '../../styles/globals.css'
|
||||
import { IFrameProtector } from '../components/IFrameProtector'
|
||||
|
@ -8,7 +8,7 @@ export function Component() {
|
|||
const id = useParams()['roomId'] as string
|
||||
return (
|
||||
<IFrameProtector slug={id} context="public-readonly">
|
||||
<MultiplayerEditor roomOpenMode={RoomOpenMode.READ_ONLY_LEGACY} roomSlug={id} />
|
||||
<MultiplayerEditor roomOpenMode={ROOM_OPEN_MODE.READ_ONLY_LEGACY} roomSlug={id} />
|
||||
</IFrameProtector>
|
||||
)
|
||||
}
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import { RoomOpenMode } from '@tldraw/dotcom-shared'
|
||||
import { ROOM_OPEN_MODE } from '@tldraw/dotcom-shared'
|
||||
import { useParams } from 'react-router-dom'
|
||||
import '../../styles/globals.css'
|
||||
import { IFrameProtector } from '../components/IFrameProtector'
|
||||
|
@ -8,7 +8,7 @@ export function Component() {
|
|||
const id = useParams()['roomId'] as string
|
||||
return (
|
||||
<IFrameProtector slug={id} context="public-readonly">
|
||||
<MultiplayerEditor roomOpenMode={RoomOpenMode.READ_ONLY} roomSlug={id} />
|
||||
<MultiplayerEditor roomOpenMode={ROOM_OPEN_MODE.READ_ONLY} roomSlug={id} />
|
||||
</IFrameProtector>
|
||||
)
|
||||
}
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
export { RoomOpenMode, RoomOpenModeToPath } from './routes'
|
||||
export { ROOM_OPEN_MODE, RoomOpenModeToPath, type RoomOpenMode } from './routes'
|
||||
export type {
|
||||
CreateRoomRequestBody,
|
||||
CreateSnapshotRequestBody,
|
||||
|
|
|
@ -1,13 +1,14 @@
|
|||
/** @public */
|
||||
export enum RoomOpenMode {
|
||||
READ_ONLY = 'readonly',
|
||||
READ_ONLY_LEGACY = 'readonly-legacy',
|
||||
READ_WRITE = 'read-write',
|
||||
}
|
||||
export const ROOM_OPEN_MODE = {
|
||||
READ_ONLY: 'readonly',
|
||||
READ_ONLY_LEGACY: 'readonly-legacy',
|
||||
READ_WRITE: 'read-write',
|
||||
} as const
|
||||
export type RoomOpenMode = (typeof ROOM_OPEN_MODE)[keyof typeof ROOM_OPEN_MODE]
|
||||
|
||||
/** @public */
|
||||
export const RoomOpenModeToPath: Record<RoomOpenMode, string> = {
|
||||
[RoomOpenMode.READ_ONLY]: 'ro',
|
||||
[RoomOpenMode.READ_ONLY_LEGACY]: 'v',
|
||||
[RoomOpenMode.READ_WRITE]: 'r',
|
||||
[ROOM_OPEN_MODE.READ_ONLY]: 'ro',
|
||||
[ROOM_OPEN_MODE.READ_ONLY_LEGACY]: 'v',
|
||||
[ROOM_OPEN_MODE.READ_WRITE]: 'r',
|
||||
}
|
||||
|
|
Ładowanie…
Reference in New Issue