Skip to content

Commit 4024063

Browse files
committed
fix upload in doc preview
1 parent ffc62bd commit 4024063

File tree

3 files changed

+46
-1
lines changed

3 files changed

+46
-1
lines changed

src/cloud/components/DocPreview/DocPreviewRealtime.tsx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,11 @@ import cc from 'classcat'
3030
import WithTooltip from '../../../design/components/atoms/WithTooltip'
3131
import { useEffectOnUnmount } from '../../../lib/hooks'
3232
import { useDocEditor } from '../../lib/hooks/editor/docEditor'
33+
import { SerializedSubscription } from '../../interfaces/db/subscription'
3334

3435
interface DocPreviewRealtimeProps {
3536
team: SerializedTeam
37+
subscription?: SerializedSubscription
3638
doc: SerializedDocWithSupplemental
3739
token: string
3840
mode?: 'preview' | 'editor'
@@ -46,6 +48,7 @@ const DocPreviewRealtime = ({
4648
doc,
4749
token,
4850
user,
51+
subscription,
4952
setRenderHeader,
5053
}: DocPreviewRealtimeProps) => {
5154
const [loaded, setLoaded] = useState(false)
@@ -77,6 +80,7 @@ const DocPreviewRealtime = ({
7780
team,
7881
doc,
7982
collaborationToken: token,
83+
subscription,
8084
})
8185

8286
const onEditorTemplateToolClick = useCallback(() => {

src/cloud/components/DocPreview/index.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ const DocPreviewModal = ({ doc, team, fallbackUrl }: DocPreviewModalProps) => {
4848
const { openContextModal, closeLastModal } = useModal()
4949
const { docsMap } = useNav()
5050
const { push } = useRouter()
51-
const { currentUserIsCoreMember, permissions } = usePage()
51+
const { currentUserIsCoreMember, permissions, subscription } = usePage()
5252
const [fetching, setFetching] = useState(true)
5353
const [mode, setMode] = useState<'preview' | 'editor'>('preview')
5454
const [collabToken, setCollabToken] = useState(
@@ -226,6 +226,7 @@ const DocPreviewModal = ({ doc, team, fallbackUrl }: DocPreviewModalProps) => {
226226
token={collabToken}
227227
user={currentUser}
228228
mode={mode}
229+
subscription={subscription}
229230
/>
230231
)}
231232
</div>

src/cloud/lib/hooks/editor/docEditor.ts

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,12 @@ import { Hint } from 'codemirror'
22
import throttle from 'lodash.throttle'
33
import { useCallback, useEffect, useMemo, useRef, useState } from 'react'
44
import { YText, YEvent } from 'yjs/dist/src/internals'
5+
import { useToast } from '../../../../design/lib/stores/toast'
56
import { buildIconUrl } from '../../../api/files'
7+
import { buildTeamFileUrl, uploadFile } from '../../../api/teams/files'
68
import { getDocLinkHref } from '../../../components/Link/DocLink'
79
import { SerializedDocWithSupplemental } from '../../../interfaces/db/doc'
10+
import { SerializedSubscription } from '../../../interfaces/db/subscription'
811
import { SerializedTeam } from '../../../interfaces/db/team'
912
import { SerializedTemplate } from '../../../interfaces/db/template'
1013
import { SerializedUser } from '../../../interfaces/db/user'
@@ -20,20 +23,25 @@ import {
2023
import { useLocalSnapshot } from '../../stores/localSnapshots'
2124
import { useNav } from '../../stores/nav'
2225
import { CodeMirrorKeyMap, useSettings } from '../../stores/settings'
26+
import { freePlanUploadSizeMb, paidPlanUploadSizeMb } from '../../subscription'
27+
import { nginxSizeLimitInMb } from '../../upload'
28+
import { bytesToMegaBytes } from '../../utils/bytes'
2329
import { getColorFromString, getRandomColor } from '../../utils/string'
2430

2531
interface DocEditorHookProps {
2632
doc: SerializedDocWithSupplemental
2733
collaborationToken: string
2834
team?: SerializedTeam
2935
user?: SerializedUser
36+
subscription?: SerializedSubscription
3037
}
3138

3239
export function useDocEditor({
3340
doc,
3441
collaborationToken,
3542
user,
3643
team,
44+
subscription,
3745
}: DocEditorHookProps) {
3846
const { settings } = useSettings()
3947
const [editorContent, setEditorContent] = useState('')
@@ -45,6 +53,7 @@ export function useDocEditor({
4553
} | null>(null)
4654
const suggestionsRef = useRef<Hint[]>([])
4755
const { loadDoc } = useNav()
56+
const { pushApiErrorMessage, pushMessage } = useToast()
4857
const [selection, setSelection] = useState<SelectionState>({
4958
currentCursor: {
5059
line: 0,
@@ -342,6 +351,37 @@ export function useDocEditor({
342351
return undefined
343352
}, [realtime, updateContent])
344353

354+
useEffect(() => {
355+
if (team != null) {
356+
fileUploadHandlerRef.current = async (file) => {
357+
if (bytesToMegaBytes(file.size) > nginxSizeLimitInMb) {
358+
pushMessage({
359+
title: '',
360+
description: `File size exceeding limit. ${
361+
subscription == null ? freePlanUploadSizeMb : paidPlanUploadSizeMb
362+
}Mb limit per upload allowed.`,
363+
})
364+
return null
365+
}
366+
try {
367+
const { file: fileInfo } = await uploadFile(team, file, doc)
368+
const url = buildTeamFileUrl(team, fileInfo.name)
369+
if (file.type.match(/image\/.*/)) {
370+
return { type: 'img', url, alt: file.name }
371+
} else {
372+
return { type: 'file', url, title: file.name }
373+
}
374+
} catch (err) {
375+
console.log(err)
376+
pushApiErrorMessage(err)
377+
return null
378+
}
379+
}
380+
} else {
381+
fileUploadHandlerRef.current = undefined
382+
}
383+
}, [team, pushMessage, pushApiErrorMessage, subscription, doc])
384+
345385
return {
346386
editorConfig,
347387
editorContent,

0 commit comments

Comments
 (0)