Skip to content

Commit 05616bc

Browse files
authored
Merge pull request #123 from whale4113/fix/lujunji/whiteboard
fix(lark): whiteboard export failed (#121)
2 parents d767a51 + 67654b0 commit 05616bc

4 files changed

Lines changed: 475 additions & 387 deletions

File tree

.changeset/curly-teeth-brake.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@dolphin/lark': patch
3+
---
4+
5+
fix: whiteboard export failed

packages/lark/src/docx.ts

Lines changed: 70 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import {
88
waitForFunction,
99
OneHundred,
1010
Second,
11+
checkCanvasDimensions,
1112
} from '@dolphin/common'
1213
import { toMarkdown, type Options } from 'mdast-util-to-markdown'
1314
import { gfmStrikethroughToMarkdown } from 'mdast-util-gfm-strikethrough'
@@ -318,16 +319,43 @@ interface RatioApp {
318319
i: 24,
319320
o: [''],
320321
r: false,
321-
n: 2,
322+
n: number,
322323
) => Promise<ImageDataWrapper | null>
323324
}
325+
app?: {
326+
application: {
327+
nodeManager: {
328+
getNodesBounds: () => {
329+
minX: number
330+
maxX: number
331+
minY: number
332+
maxY: number
333+
}
334+
}
335+
}
336+
renderManager: {
337+
getImageOffscreenCanvas: (
338+
bounds: {
339+
minX: number
340+
maxX: number
341+
minY: number
342+
maxY: number
343+
},
344+
r: number,
345+
bgColor: string,
346+
) => HTMLCanvasElement | null
347+
}
348+
}
324349
}
325350

326351
interface WhiteboardBlock {
327352
isolateEnv: {
328353
hasRatioApp: () => boolean
329354
getRatioApp: () => RatioApp
330355
}
356+
abilityKit: {
357+
getRatioApp: () => RatioApp
358+
}
331359
}
332360

333361
interface Whiteboard extends Block {
@@ -910,27 +938,54 @@ const fetchImageSources = (imageBlock: ImageBlock) =>
910938
.catch(reject)
911939
})
912940

913-
const whiteboardToImageData = async (
941+
const whiteboardToBlob = async (
914942
whiteboard: Whiteboard,
915-
): Promise<ImageDataWrapper | null> => {
943+
): Promise<Blob | null> => {
916944
if (!whiteboard.whiteboardBlock) return null
917945

918-
const { isolateEnv } = whiteboard.whiteboardBlock
946+
const padding = 24
947+
const ratio = window.devicePixelRatio
948+
const backgroundColor = '#ffffff'
919949

920-
if (!isolateEnv.hasRatioApp()) return null
950+
let rationApp = whiteboard.whiteboardBlock.abilityKit.getRatioApp()
921951

922-
const rationApp = isolateEnv.getRatioApp()
952+
if (rationApp.app) {
953+
const bounds = rationApp.app.application.nodeManager.getNodesBounds()
954+
bounds.maxX += padding
955+
bounds.minX -= padding
956+
bounds.maxY += padding
957+
bounds.minY -= padding
958+
959+
const canvas = rationApp.app.renderManager.getImageOffscreenCanvas(
960+
bounds,
961+
ratio,
962+
backgroundColor,
963+
)
923964

924-
const imageData = await rationApp.ratioAppProxy.getOriginImageDataByNodeId(
925-
24,
926-
[''],
927-
false,
928-
2,
929-
)
965+
if (!canvas) return null
930966

931-
if (!imageData) return null
967+
return new Promise(resolve => {
968+
checkCanvasDimensions(canvas)
932969

933-
return imageData
970+
canvas.toBlob(resolve)
971+
})
972+
}
973+
974+
rationApp = whiteboard.whiteboardBlock.isolateEnv.getRatioApp()
975+
976+
const imageDataWrapper =
977+
await rationApp.ratioAppProxy.getOriginImageDataByNodeId(
978+
padding,
979+
[''],
980+
false,
981+
ratio,
982+
)
983+
984+
if (!imageDataWrapper) return null
985+
986+
return await imageDataToBlob(imageDataWrapper.data, {
987+
onDispose: imageDataWrapper.release,
988+
})
934989
}
935990

936991
const diagramToSVGElement = (diagram: DiagramBlock): SVGElement | null => {
@@ -1321,12 +1376,7 @@ export class Transformer {
13211376
console.error(error)
13221377
}
13231378

1324-
const imageDataWrapper = await whiteboardToImageData(whiteboard)
1325-
if (!imageDataWrapper) return null
1326-
1327-
return await imageDataToBlob(imageDataWrapper.data, {
1328-
onDispose: imageDataWrapper.release,
1329-
})
1379+
return await whiteboardToBlob(whiteboard)
13301380
},
13311381
},
13321382
}

0 commit comments

Comments
 (0)