pull/3534/head^2
Mime Čuvalo 2024-04-23 10:51:03 +01:00
rodzic 5359aacc05
commit d96389418a
Nie znaleziono w bazie danych klucza dla tego podpisu
ID klucza GPG: BA84499022AC984D
10 zmienionych plików z 51 dodań i 49 usunięć

Wyświetl plik

@ -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 }))

Wyświetl plik

@ -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)

Wyświetl plik

@ -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)

Wyświetl plik

@ -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) => {

Wyświetl plik

@ -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'

Wyświetl plik

@ -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>
)
}

Wyświetl plik

@ -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>
)
}

Wyświetl plik

@ -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>
)
}

Wyświetl plik

@ -1,4 +1,4 @@
export { RoomOpenMode, RoomOpenModeToPath } from './routes'
export { ROOM_OPEN_MODE, RoomOpenModeToPath, type RoomOpenMode } from './routes'
export type {
CreateRoomRequestBody,
CreateSnapshotRequestBody,

Wyświetl plik

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