commit: 86f6fbeb46546e81954606c8e9eb6e6ca83bcd78
parent 8a58de5c9fd7b275df2c79eafa8260a9e1fb706e
Author: tusooa <tusooa@kazv.moe>
Date: Thu, 6 Apr 2023 15:08:35 -0400
Give the option to auto save drafts
Diffstat:
6 files changed, 55 insertions(+), 8 deletions(-)
diff --git a/src/components/post_status_form/post_status_form.js b/src/components/post_status_form/post_status_form.js
@@ -324,12 +324,24 @@ const PostStatusForm = {
return false
},
- // debouncedSaveDraft () {
- // return debounce(this.saveDraft, 3000)
- // },
+ debouncedMaybeAutoSaveDraft () {
+ return debounce(this.maybeAutoSaveDraft, 3000)
+ },
pollFormVisible () {
return this.newStatus.hasPoll
},
+ shouldAutoSaveDraft () {
+ return this.$store.getters.mergedConfig.autoSaveDraft
+ },
+ autoSaveState () {
+ if (this.savable) {
+ return this.$t('post_status.auto_save_saving')
+ } else if (this.newStatus.id) {
+ return this.$t('post_status.auto_save_saved')
+ } else {
+ return this.$t('post_status.auto_save_nothing_new')
+ }
+ },
...mapGetters(['mergedConfig']),
...mapState({
mobileLayout: state => state.interface.mobileLayout
@@ -344,13 +356,13 @@ const PostStatusForm = {
}
},
beforeUnmount () {
- // this.saveDraft()
+ this.maybeAutoSaveDraft()
},
methods: {
statusChanged () {
this.autoPreview()
this.updateIdempotencyKey()
- // this.debouncedSaveDraft()
+ this.debouncedMaybeAutoSaveDraft()
this.savable = true
this.saveInhibited = false
},
@@ -722,12 +734,17 @@ const PostStatusForm = {
.then(id => {
if (this.newStatus.id !== id) {
this.newStatus.id = id
- this.savable = false
}
+ this.savable = false
})
}
return Promise.resolve()
},
+ maybeAutoSaveDraft () {
+ if (this.shouldAutoSaveDraft) {
+ this.saveDraft()
+ }
+ },
abandonDraft () {
return this.$store.dispatch('abandonDraft', { id: this.newStatus.id })
},
diff --git a/src/components/post_status_form/post_status_form.vue b/src/components/post_status_form/post_status_form.vue
@@ -297,6 +297,18 @@
<FAIcon icon="poll-h" />
</button>
</div>
+ <span
+ v-if="shouldAutoSaveDraft"
+ class="auto-save-status"
+ >
+ {{ autoSaveState }}
+ </span>
+ <button
+ v-else
+ class="btn button-default"
+ >
+ {{ $t('post_status.save_to_drafts_button') }}
+ </button>
<button
v-if="posting"
disabled
@@ -612,5 +624,9 @@
border-radius: var(--roundness);
border: 2px dashed var(--text);
}
+
+ .auto-save-status {
+ align-self: center;
+ }
}
</style>
diff --git a/src/components/settings_modal/tabs/general_tab.vue b/src/components/settings_modal/tabs/general_tab.vue
@@ -454,6 +454,13 @@
</BooleanSetting>
</li>
<li>
+ <BooleanSetting
+ path="autoSaveDraft"
+ >
+ {{ $t('settings.auto_save_draft') }}
+ </BooleanSetting>
+ </li>
+ <li>
<ChoiceSetting
id="unsavedPostAction"
path="unsavedPostAction"
diff --git a/src/i18n/en.json b/src/i18n/en.json
@@ -313,7 +313,11 @@
"close_confirm": "What do you want to do with your current writing?",
"close_confirm_save_button": "Save",
"close_confirm_discard_button": "Discard",
- "close_confirm_continue_composing_button": "Continue composing"
+ "close_confirm_continue_composing_button": "Continue composing",
+ "auto_save_nothing_new": "Nothing new to save.",
+ "auto_save_saved": "Saved.",
+ "auto_save_saving": "Saving...",
+ "save_to_drafts_button": "Save to drafts"
},
"registration": {
"bio_optional": "Bio (optional)",
@@ -514,6 +518,7 @@
"unsaved_post_action_save": "Save it to drafts",
"unsaved_post_action_discard": "Discard it",
"unsaved_post_action_confirm": "Ask every time",
+ "auto_save_draft": "Save drafts as you compose",
"emoji_reactions_on_timeline": "Show emoji reactions on timeline",
"emoji_reactions_scale": "Reactions scale factor",
"export_theme": "Save preset",
diff --git a/src/modules/config.js b/src/modules/config.js
@@ -182,7 +182,8 @@ export const defaultState = {
closingDrawerMarksAsSeen: undefined, // instance default
unseenAtTop: undefined, // instance default
ignoreInactionableSeen: undefined, // instance default
- unsavedPostAction: undefined // instance default
+ unsavedPostAction: undefined, // instance default
+ autoSaveDraft: undefined // instance default
}
// caching the instance default properties
diff --git a/src/modules/instance.js b/src/modules/instance.js
@@ -120,6 +120,7 @@ const defaultState = {
unseenAtTop: false,
ignoreInactionableSeen: false,
unsavedPostAction: 'confirm',
+ autoSaveDraft: false,
// Nasty stuff
customEmoji: [],