1
1
import type { ProgressPromise } from '@prezly/progress-promise' ;
2
2
import type { CoverageNode } from '@prezly/slate-types' ;
3
+ import type { PrezlyFileInfo } from '@prezly/uploadcare' ;
4
+ import { toProgressPromise , UploadcareFile } from '@prezly/uploadcare' ;
3
5
import type { UploadInfo } from '@prezly/uploadcare-widget' ;
6
+ import uploadcare from '@prezly/uploadcare-widget' ;
4
7
import type { ReactNode } from 'react' ;
5
- import React , { /* type DragEvent,*/ useEffect , useState } from 'react' ;
8
+ import React , { type DragEvent , useEffect , useState } from 'react' ;
6
9
import { Transforms } from 'slate' ;
7
10
import { useSelected , useSlateStatic } from 'slate-react' ;
8
11
@@ -29,6 +32,7 @@ export function CoveragePlaceholderElement({
29
32
children,
30
33
element,
31
34
format = 'card' ,
35
+ onCreateCoverage,
32
36
removable,
33
37
renderPlaceholder,
34
38
} : CoveragePlaceholderElement . Props ) {
@@ -43,23 +47,27 @@ export function CoveragePlaceholderElement({
43
47
} ,
44
48
) ;
45
49
46
- // const handleDrop = useFunction((event: DragEvent) => {
47
- // event.preventDefault();
48
- // event.stopPropagation();
49
-
50
- // const [file] = Array.from(event.dataTransfer.files)
51
- // .slice(0, 1)
52
- // .map((file) => uploadcare.fileFrom('object', file));
50
+ const handleDragOver = useFunction ( ( ) => {
51
+ setCustomRendered ( false ) ;
52
+ } ) ;
53
53
54
- // if (file) {
55
- // const uploading = toProgressPromise(file).then(async (fileInfo: PrezlyFileInfo) => {
56
- // const file = UploadcareFile.createFromUploadcareWidgetPayload(fileInfo);
57
- // const ref = await onCreateCoverage(file);
58
- // return { coverage: { id: ref.coverage.id } };
59
- // });
60
- // PlaceholdersManager.register(element.type, element.uuid, uploading);
61
- // }
62
- // });
54
+ const handleDrop = useFunction ( ( event : DragEvent ) => {
55
+ event . preventDefault ( ) ;
56
+ event . stopPropagation ( ) ;
57
+
58
+ const [ file ] = Array . from ( event . dataTransfer . files )
59
+ . slice ( 0 , 1 )
60
+ . map ( ( file ) => uploadcare . fileFrom ( 'object' , file ) ) ;
61
+
62
+ if ( file ) {
63
+ const uploading = toProgressPromise ( file ) . then ( async ( fileInfo : PrezlyFileInfo ) => {
64
+ const file = UploadcareFile . createFromUploadcareWidgetPayload ( fileInfo ) ;
65
+ const ref = await onCreateCoverage ( file ) ;
66
+ return { coverage : { id : ref . coverage . id } } ;
67
+ } ) ;
68
+ PlaceholdersManager . register ( element . type , element . uuid , uploading ) ;
69
+ }
70
+ } ) ;
63
71
64
72
const handleSelect = useFunction ( ( data : CoverageRef ) => {
65
73
EventsEditor . dispatchEvent ( editor , 'coverage-placeholder-submitted' , {
@@ -94,11 +102,13 @@ export function CoveragePlaceholderElement({
94
102
title = { Title }
95
103
description = { Description }
96
104
onClick = { ( ) => setCustomRendered ( true ) }
105
+ onDrop = { handleDrop }
97
106
removable = { removable }
98
107
renderFrame = {
99
108
isCustomRendered
100
109
? ( ) =>
101
110
renderPlaceholder ( {
111
+ onDragOver : handleDragOver ,
102
112
onRemove : removable ? handleRemove : undefined ,
103
113
onSelect : handleSelect ,
104
114
onUpload : handleUpload ,
@@ -117,7 +127,9 @@ export namespace CoveragePlaceholderElement {
117
127
extends Pick < BaseProps < CoverageRef > , 'attributes' | 'children' | 'format' > ,
118
128
Pick < PlaceholderElementProps , 'removable' > {
119
129
element : PlaceholderNode < PlaceholderNode . Type . COVERAGE > ;
130
+ onCreateCoverage ( input : UploadcareFile ) : Promise < CoverageRef > ;
120
131
renderPlaceholder : ( props : {
132
+ onDragOver : ( ) => void ;
121
133
onRemove : ( ( ) => void ) | undefined ;
122
134
onSelect : ( data : CoverageRef ) => void ;
123
135
onUpload : (
0 commit comments