@@ -17,6 +17,7 @@ export class ImageBlot extends BlockEmbed {
1717 static className = 'image-container'
1818
1919 static quill : Quill
20+ static remoteCounter = 1
2021 static eventEmitter = new EventEmitter ( )
2122 static uploadStatus : { [ key : string ] : any } = { }
2223
@@ -31,7 +32,7 @@ export class ImageBlot extends BlockEmbed {
3132
3233 const {
3334 img,
34- value : { id, src, width = 0 , height = 0 } ,
35+ value : { id, src, srcNode , width = 0 , height = 0 } ,
3536 } = ImageBlot . getImgAndValue ( node )
3637
3738 if ( id ) {
@@ -50,27 +51,9 @@ export class ImageBlot extends BlockEmbed {
5051
5152 if ( img && src ) {
5253 const appendEls = ( width : number , height : number ) => {
53- const wrap = node . querySelector ( '.image-wrap' )
54+ const wrap = node . querySelector ( '.image-wrap' ) !
5455
55- if ( ! wrap ) return
56-
57- if ( id && ! node . querySelector ( '.progress-bar' ) ) {
58- const div = ImageBlot . createDiv ( 'progress-bar' )
59- div . appendChild ( ImageBlot . createDiv ( 'progress' ) )
60- wrap . appendChild ( div )
61- }
62-
63- if ( id && ! node . querySelector ( '.error' ) ) {
64- const div = ImageBlot . createDiv ( 'error' )
65- div . addEventListener ( 'click' , ( ) => {
66- ImageBlot . uploadStatus [ id ] = { }
67- this . domNode . classList . remove ( 'fail' )
68- ImageBlot . eventEmitter . emit ( 'reupload' , { id } )
69- } )
70- wrap . appendChild ( div )
71- }
72-
73- if ( width >= 100 && height >= 100 ) {
56+ if ( width >= 50 && height >= 50 ) {
7457 if ( ! node . querySelector ( '.remove' ) ) {
7558 const div = ImageBlot . createDiv ( 'remove' )
7659 div . addEventListener ( 'click' , ( ) => {
@@ -80,7 +63,18 @@ export class ImageBlot extends BlockEmbed {
8063 }
8164 }
8265
83- if ( id ) ImageBlot . refreshUpload ( id )
66+ if ( id ) {
67+ ImageBlot . refreshUpload ( id )
68+ } else if ( ! srcNode ) {
69+ const remoteId = `remote-${ ImageBlot . remoteCounter ++ } `
70+ node . classList . add ( remoteId )
71+ ImageBlot . eventEmitter . emit ( 'insertRemoteImage' , {
72+ remoteId,
73+ src,
74+ width,
75+ height,
76+ } )
77+ }
8478 }
8579
8680 if ( width && height ) {
@@ -112,6 +106,19 @@ export class ImageBlot extends BlockEmbed {
112106 } , 0 )
113107 }
114108
109+ static uploadRemoteImage ( remoteId : string , id : string ) {
110+ if ( ImageBlot . uploadStatus [ id ] ) return
111+
112+ const node = document . querySelector ( `div.${ remoteId } ` )
113+ if ( node ) {
114+ ImageBlot . uploadStatus [ id ] = { }
115+ node . classList . add ( `image-${ id } ` )
116+ node . classList . remove ( remoteId )
117+
118+ node . querySelector < HTMLImageElement > ( 'img.image' ) ! . dataset . id = id
119+ }
120+ }
121+
115122 static updateUploadProgress ( id : string , progress : number ) {
116123 if ( ( ImageBlot . uploadStatus [ id ] || { } ) . status === 'SUCCESS' ) return
117124
@@ -120,7 +127,17 @@ export class ImageBlot extends BlockEmbed {
120127 document . querySelectorAll < HTMLDivElement > ( `div.image-${ id } ` ) . forEach ( node => {
121128 node . classList . remove ( 'fail' )
122129
123- node . querySelector < HTMLDivElement > ( 'div.progress' ) ! . style . width = `${ Math . round ( progress ) } %`
130+ const wrap = node . querySelector ( '.image-wrap' ) !
131+ if ( ! wrap . querySelector ( '.progress-bar' ) ) {
132+ const div = ImageBlot . createDiv ( 'progress-bar' )
133+ const child = ImageBlot . createDiv ( 'progress' )
134+ child . style . width = `${ Math . round ( progress ) } %`
135+ div . appendChild ( child )
136+ wrap . appendChild ( div )
137+ } else {
138+ const child = wrap . querySelector < HTMLDivElement > ( '.progress' ) !
139+ child . style . width = `${ Math . round ( progress ) } %`
140+ }
124141 } )
125142 }
126143
@@ -132,25 +149,36 @@ export class ImageBlot extends BlockEmbed {
132149 document . querySelectorAll < HTMLDivElement > ( `div.image-${ id } ` ) . forEach ( node => {
133150 if ( ! node . classList . contains ( 'fail' ) ) node . classList . add ( 'fail' )
134151
135- const div = node . querySelector < HTMLDivElement > ( 'div.error' )
152+ const wrap = node . querySelector < HTMLDivElement > ( '.image-wrap' ) !
153+ let div = wrap . querySelector < HTMLDivElement > ( 'div.error' )
136154
137- if ( div ) {
138- let html = '<span>上传失败,点击重试</span>'
139- if ( error ) {
140- html += `<span>${ error } </span>`
141- }
155+ if ( ! div ) {
156+ div = ImageBlot . createDiv ( 'error' )
157+ div . addEventListener ( 'click' , ( ) => {
158+ node . classList . remove ( 'fail' )
159+ ImageBlot . uploadStatus [ id ] = { }
160+ ImageBlot . eventEmitter . emit ( 'reupload' , { id } )
161+ } )
162+ wrap . appendChild ( div )
163+ }
142164
143- div . innerHTML = html
165+ let html = '<span>上传失败,点击重试</span>'
166+ if ( error ) {
167+ html += `<span>${ error } </span>`
144168 }
169+
170+ div . innerHTML = html
145171 } )
146172 }
147173
148174 static setUploadSuccess ( id : string , src : string , srcNode ?: string ) {
149175 ImageBlot . uploadStatus [ id ] = { status : 'SUCCESS' , src }
150176
151177 document . querySelectorAll < HTMLDivElement > ( `div.image-${ id } ` ) . forEach ( node => {
152- node . querySelector < HTMLDivElement > ( 'div.progress-bar' ) ! . remove ( )
153- node . querySelector < HTMLDivElement > ( 'div.error' ) ! . remove ( )
178+ const p = node . querySelector < HTMLDivElement > ( 'div.progress-bar' )
179+ const e = node . querySelector < HTMLDivElement > ( 'div.error' )
180+ if ( p ) p . remove ( )
181+ if ( e ) e . remove ( )
154182
155183 const img = node . querySelector < HTMLImageElement > ( 'img.image' )
156184
0 commit comments