Skip to content

Commit bdaa3a1

Browse files
committed
feat: WIP initial port of drafts, still need to work out proper use cases for when draft should be loaded, currently it loads unnecessarily at times
1 parent 21690fd commit bdaa3a1

File tree

1 file changed

+53
-5
lines changed

1 file changed

+53
-5
lines changed

src/components/layout/Editor.vue

Lines changed: 53 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -232,11 +232,10 @@
232232

233233
<script>
234234
import { reactive, toRefs, watch, nextTick } from 'vue'
235-
// import { useRoute, useRouter } from 'vue-router'
236235
import ImageUploader from '@/components/images/ImageUploader.vue'
237236
import PollCreator from '@/components/polls/PollCreator.vue'
238237
import Multiselect from '@vueform/multiselect'
239-
import { usersApi } from '@/api'
238+
import { usersApi, postsApi, messagesApi } from '@/api'
240239
241240
export 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: '', thread_id: props?.thread?.id } }
253257
v.newMessage = { receiver_ids: [], content: { subject: '', body: '' } }
254258
v.threadCopy = { title: '', board_id: 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: '', body: '', thread_id: props?.thread?.id } },
278319
newMessage: { receiver_ids: [], conversation_id: null, content: { subject: '', body: '' } },
@@ -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

Comments
 (0)