232232
233233<script >
234234import  { reactive , toRefs , watch , nextTick  } from  ' vue' 
235- //  import { useRoute, useRouter } from 'vue-router'
236235import  ImageUploader  from  ' @/components/images/ImageUploader.vue' 
237236import  PollCreator  from  ' @/components/polls/PollCreator.vue' 
238237import  Multiselect  from  ' @vueform/multiselect' 
239- import  { usersApi  } from  ' @/api' 
238+ import  { usersApi ,  postsApi ,  messagesApi  } from  ' @/api' 
240239
241240export  default  {
242241  props:  [' editorConvoMode' ' threadEditorMode' ' postEditorMode' ' createAction' ' updateAction' ' showEditor' ' thread' ' currentMessage' ' post' ' quote' ' canCreate' ' canUpdate' ' canLock' ' canSticky' ' canModerate' ' canCreatePoll'  
@@ -249,6 +248,11 @@ export default {
249248      else  emit (' close'  
250249    } 
251250    const  closeEditor  =  () =>  { 
251+       if  (v .draftTimeout ) { 
252+         clearTimeout (v .draftTimeout ) 
253+         v .draftTimeout  =  null  
254+         saveDraft (true ) 
255+       } 
252256      v .posting  =  { post:  { title:  ' RE: ' +  props? .thread ? .title , body:  ' ' :  props? .thread ? .id  } } 
253257      v .newMessage  =  { receiver_ids:  [], content:  { subject:  ' ' :  ' '  
254258      v .threadCopy  =  { title:  ' ' :  v .threadCopy ? .data ? .board .id  } 
@@ -259,9 +263,44 @@ export default {
259263      v .threadCopy .pollValid  =  valid 
260264      v .threadCopy .poll  =  poll 
261265    } 
262-     /*  Internal Data */  
263-     //  const $route = useRoute() 
264-     //  const $router = useRouter() 
266+     const  saveDraft  =  clear  =>  { 
267+       let  rawText =  v .posting .post .body  ||  v .threadCopy .body  ||  v .newMessage .content .body  
268+       v .draftTimeout  =  setTimeout (() =>  saveDraft (), 10000 ) 
269+       if  (clear ||  rawText .length  &&  v .oldDraft  !==  rawText) { 
270+         let  draftPromise 
271+         if  (props .postEditorMode  ||  props .threadEditorMode ) { 
272+           draftPromise =  postsApi .updatePostDraft  
273+         } 
274+         else  draftPromise =  messagesApi .updateMessageDraft  
275+         draftPromise (clear ?  null  :  rawText) 
276+         .then (draft  =>  { 
277+           v .draftStatus  =  ' Draft saved...'  
278+           v .oldDraft  =  rawText 
279+           setTimeout (() =>  v .draftStatus  =  ' ' 5000 ) 
280+           return  draft 
281+         }) 
282+         .catch (err  =>  { 
283+           console .log (err) 
284+           v .draftStatus  =  ' Error saving draft!'  
285+           setTimeout (() =>  v .draftStatus  =  ' ' 5000 ) 
286+         }) 
287+       } 
288+     } 
289+ 
290+     const  loadDraft  =  () =>  { 
291+       let  draftPromise 
292+       if  (props .postEditorMode  ||  props .threadEditorMode ) { 
293+         draftPromise =  postsApi .getPostDraft  
294+       } 
295+       else  draftPromise =  messagesApi .getMessageDraft  
296+       draftPromise ().then (data  =>  { 
297+         if  (data .draft   &&  confirm (' Load Draft?'  
298+           if  (props .postEditorMode ) v .posting .post .body  =  data .draft  
299+           else  if  (props .threadEditorMode ) v .threadCopy .body  =  data .draft  
300+           else  v .newMessage .content .body  =  data .draft  
301+         } 
302+       }); 
303+     }; 
265304
266305    /*  View Data */  
267306    const  v  =  reactive ({ 
@@ -272,7 +311,9 @@ export default {
272311      preview:  false , 
273312      showEditor:  props .showEditor , 
274313      showDropzone:  false , 
314+       oldDraft:  null , 
275315      draftStatus:  null , 
316+       draftTimeout:  null , 
276317      postMaxLength:  window .post_max_length , 
277318      posting:  { post:  { title:  ' ' :  ' ' :  props? .thread ? .id  } }, 
278319      newMessage:  { receiver_ids:  [], conversation_id:  null , content:  { subject:  ' ' :  ' '  
@@ -337,6 +378,13 @@ export default {
337378        }) 
338379        else  nextTick (() =>  v .messageEditorEl .focus ()) 
339380      } 
381+ 
382+       if  (visible &&  ! props .quote  &&  ! v .posting .post .body .lenth ) { 
383+         nextTick (() =>  { 
384+           loadDraft () 
385+           saveDraft () 
386+         }) 
387+       } 
340388    }) 
341389
342390    return  { ... toRefs (v), cancel, closeEditor, onPollValidation } 
0 commit comments