diff --git a/routes/_actions/instances.js b/routes/_actions/instances.js index ba3b59d..76eebf5 100644 --- a/routes/_actions/instances.js +++ b/routes/_actions/instances.js @@ -33,8 +33,7 @@ export async function logOutOfInstance (instanceName) { let loggedInInstances = store.get('loggedInInstances') let instanceThemes = store.get('instanceThemes') let loggedInInstancesInOrder = store.get('loggedInInstancesInOrder') - let composeText = store.get('composeText') - let uploadedMedia = store.get('uploadedMedia') + let composeData = store.get('composeData') let currentInstance = store.get('currentInstance') loggedInInstancesInOrder.splice(loggedInInstancesInOrder.indexOf(instanceName), 1) let newInstance = instanceName === currentInstance @@ -42,8 +41,7 @@ export async function logOutOfInstance (instanceName) { : currentInstance delete loggedInInstances[instanceName] delete instanceThemes[instanceName] - delete composeText[instanceName] - delete uploadedMedia[instanceName] + delete composeData[instanceName] store.set({ loggedInInstances: loggedInInstances, instanceThemes: instanceThemes, @@ -52,8 +50,7 @@ export async function logOutOfInstance (instanceName) { searchResults: null, queryInSearch: '', rawComposeText: '', - composeText: composeText, - uploadedMedia: uploadedMedia + composeData: composeData }) store.save() toast.say(`Logged out of ${instanceName}`) diff --git a/routes/_actions/media.js b/routes/_actions/media.js index 7ad9c7b..4068d42 100644 --- a/routes/_actions/media.js +++ b/routes/_actions/media.js @@ -9,21 +9,15 @@ export async function doMediaUpload (realm, file) { store.set({uploadingMedia: true}) try { let response = await uploadMedia(instanceName, accessToken, file) - let uploadedMedia = store.get('uploadedMedia') - uploadedMedia[instanceName] = uploadedMedia[instanceName] || {} - uploadedMedia[instanceName][realm] = uploadedMedia[instanceName][realm] || [] - uploadedMedia[instanceName][realm].push({ + let composeMedia = store.getComposeData(realm, 'media') || [] + composeMedia.push({ data: response, - file: { - name: file.name - } + file: { name: file.name } }) let rawComposeText = store.get('rawComposeText') || '' rawComposeText += ' ' + response.text_url - store.set({ - uploadedMedia, - rawComposeText - }) + store.setComposeData(realm, 'media', composeMedia) + store.set({rawComposeText}) scheduleIdleTask(() => store.save()) } catch (e) { console.error(e) @@ -34,18 +28,14 @@ export async function doMediaUpload (realm, file) { } export function deleteMedia (realm, i) { - let uploadedMedia = store.get('uploadedMedia') - let instanceName = store.get('currentInstance') - let uploadedMediaArray = uploadedMedia[instanceName][realm] - let deletedMedia = uploadedMediaArray.splice(i, 1)[0] + let composeMedia = store.getComposeData(realm, 'media') + let deletedMedia = composeMedia.splice(i, 1)[0] let rawComposeText = store.get('rawComposeText') || '' rawComposeText = rawComposeText.replace(' ' + deletedMedia.data.text_url, '') - store.set({ - uploadedMedia, - rawComposeText - }) + store.setComposeData(realm, 'media', composeMedia) + store.set({rawComposeText}) scheduleIdleTask(() => store.save()) } diff --git a/routes/_actions/postPrivacy.js b/routes/_actions/postPrivacy.js new file mode 100644 index 0000000..753b226 --- /dev/null +++ b/routes/_actions/postPrivacy.js @@ -0,0 +1,6 @@ + +import { store } from '../_store/store' + +export function setPostPrivacy (realm, postPrivacyKey) { + store.setComposeData(realm, 'postPrivacy', postPrivacyKey) +} diff --git a/routes/_components/compose/ComposeInput.html b/routes/_components/compose/ComposeInput.html index f46f05f..35ca2bf 100644 --- a/routes/_components/compose/ComposeInput.html +++ b/routes/_components/compose/ComposeInput.html @@ -41,22 +41,17 @@ }, methods: { setupSyncFromStore() { - let currentComposeText = store.get('currentComposeText') - let realm = this.get('realm') + let composeText = this.get('composeText') this.store.set({ - rawComposeText: currentComposeText[realm] || '' + rawComposeText: composeText }) }, setupSyncToStore() { const saveText = debounce(() => scheduleIdleTask(() => this.store.save()), 1000) this.observe('rawComposeText', rawComposeText => { - let composeText = this.store.get('composeText') - let currentInstance = this.store.get('currentInstance') let realm = this.get('realm') - composeText[currentInstance] = composeText[currentInstance] || {} - composeText[currentInstance][realm] = rawComposeText || '' - this.store.set({composeText: composeText}) + this.store.setComposeData(realm, 'text', rawComposeText) saveText() }, {init: false}) }, @@ -79,8 +74,8 @@ store: () => store, computed: { rawComposeText: ($rawComposeText) => $rawComposeText, - currentComposeText: ($currentComposeText) => $currentComposeText, - uploadedMedia: ($currentUploadedMedia, realm) => $currentUploadedMedia[realm] || [] + composeData: ($currentComposeData, realm) => $currentComposeData[realm] || {}, + composeText: (composeData) => composeData.text || '' } } \ No newline at end of file diff --git a/routes/_components/compose/ComposeMedia.html b/routes/_components/compose/ComposeMedia.html index b2126dd..fb762fe 100644 --- a/routes/_components/compose/ComposeMedia.html +++ b/routes/_components/compose/ComposeMedia.html @@ -1,6 +1,6 @@ -{{#if uploadedMedia.length}} -
- {{#each uploadedMedia as media, i}} +{{#if composeMedia.length}} +
+ {{#each composeMedia as media, i}}
{{media.file.name}}
@@ -100,7 +100,8 @@ } }, computed: { - uploadedMedia: ($currentUploadedMedia, realm) => $currentUploadedMedia[realm] || [] + composeData: ($currentComposeData, realm) => $currentComposeData[realm] || {}, + composeMedia: (composeData) => composeData.media || [] } } \ No newline at end of file diff --git a/routes/_components/compose/ComposeToolbar.html b/routes/_components/compose/ComposeToolbar.html index f3ff181..36531e3 100644 --- a/routes/_components/compose/ComposeToolbar.html +++ b/routes/_components/compose/ComposeToolbar.html @@ -9,7 +9,7 @@ label="Add media" href="{{$uploadingMedia ? '#fa-spinner' : '#fa-camera'}}" on:click="onMediaClick()" - disabled="{{$uploadingMedia || (uploadedMedia.length === 4)}}" + disabled="{{$uploadingMedia || (composeMedia.length === 4)}}" /> $currentUploadedMedia[realm] || [], + composeData: ($currentComposeData, realm) => $currentComposeData[realm] || {}, + composeMedia: (composeData) => composeData.media || [], postPrivacy: (postPrivacyKey) => { return POST_PRIVACY_OPTIONS.find(_ => _.key === postPrivacyKey) }, - postPrivacyKey: ($currentPostPrivacy, $currentVerifyCredentials, realm) => { - return $currentPostPrivacy[realm] || $currentVerifyCredentials.source.privacy + postPrivacyKey: (composeData, $currentVerifyCredentials) => { + return composeData.postPrivacy || $currentVerifyCredentials.source.privacy } } } diff --git a/routes/_components/dialog/PostPrivacyDialog.html b/routes/_components/dialog/PostPrivacyDialog.html index 417ffd8..33e97a3 100644 --- a/routes/_components/dialog/PostPrivacyDialog.html +++ b/routes/_components/dialog/PostPrivacyDialog.html @@ -60,6 +60,7 @@ import ModalDialog from './ModalDialog.html' import { store } from '../../_store/store' import { POST_PRIVACY_OPTIONS } from '../../_static/statuses' + import { setPostPrivacy } from '../../_actions/postPrivacy' export default { components: { @@ -77,21 +78,17 @@ this.set({shown: true}) }, onClick(option) { - let postPrivacy = store.get('postPrivacy') - let instanceName = store.get('currentInstance') - let realm = this.get('realm') - postPrivacy[instanceName] = postPrivacy[instanceName] || {} - postPrivacy[instanceName][realm] = option.key - store.set({postPrivacy}) + setPostPrivacy(this.get('realm'), option.key) this.set({closed: true}) } }, computed: { + composeData: ($currentComposeData, realm) => $currentComposeData[realm] || {}, postPrivacy: (postPrivacyKey) => { return POST_PRIVACY_OPTIONS.find(_ => _.key === postPrivacyKey) }, - postPrivacyKey: ($currentPostPrivacy, $currentVerifyCredentials, realm) => { - return $currentPostPrivacy[realm] || $currentVerifyCredentials.source.privacy + postPrivacyKey: (composeData, $currentVerifyCredentials) => { + return composeData.postPrivacy || $currentVerifyCredentials.source.privacy } } } diff --git a/routes/_store/computations.js b/routes/_store/computations/computations.js similarity index 100% rename from routes/_store/computations.js rename to routes/_store/computations/computations.js diff --git a/routes/_store/instanceComputations.js b/routes/_store/computations/instanceComputations.js similarity index 93% rename from routes/_store/instanceComputations.js rename to routes/_store/computations/instanceComputations.js index 1ae6095..7d8eaaf 100644 --- a/routes/_store/instanceComputations.js +++ b/routes/_store/computations/instanceComputations.js @@ -11,10 +11,8 @@ export function instanceComputations (store) { computeForInstance(store, 'pinnedPage', 'pinnedPages', '/local') computeForInstance(store, 'lists', 'instanceLists', []) computeForInstance(store, 'currentStatusModifications', 'statusModifications', null) - computeForInstance(store, 'currentComposeText', 'composeText', {}) - computeForInstance(store, 'currentUploadedMedia', 'uploadedMedia', {}) computeForInstance(store, 'currentCustomEmoji', 'customEmoji', []) - computeForInstance(store, 'currentPostPrivacy', 'postPrivacy', {}) + computeForInstance(store, 'currentComposeData', 'composeData', {}) store.compute( 'isUserLoggedIn', diff --git a/routes/_store/statusComputations.js b/routes/_store/computations/statusComputations.js similarity index 74% rename from routes/_store/statusComputations.js rename to routes/_store/computations/statusComputations.js index d3fae67..edc9301 100644 --- a/routes/_store/statusComputations.js +++ b/routes/_store/computations/statusComputations.js @@ -1,5 +1,5 @@ -import { CHAR_LIMIT } from '../_static/statuses' -import { measureText } from '../_utils/measureText' +import { CHAR_LIMIT } from '../../_static/statuses' +import { measureText } from '../../_utils/measureText' export function statusComputations (store) { store.compute('rawComposeTextLength', diff --git a/routes/_store/timelineComputations.js b/routes/_store/computations/timelineComputations.js similarity index 100% rename from routes/_store/timelineComputations.js rename to routes/_store/computations/timelineComputations.js diff --git a/routes/_store/mixins/instanceMixins.js b/routes/_store/mixins/instanceMixins.js new file mode 100644 index 0000000..b70ead4 --- /dev/null +++ b/routes/_store/mixins/instanceMixins.js @@ -0,0 +1,18 @@ +export function instanceMixins (Store) { + Store.prototype.setComposeData = function (realm, key, value) { + let composeData = this.get('composeData') + let instanceName = this.get('currentInstance') + composeData[instanceName] = composeData[instanceName] || {} + composeData[instanceName][realm] = composeData[instanceName][realm] || {} + composeData[instanceName][realm][key] = value + this.set({composeData}) + } + + Store.prototype.getComposeData = function (realm, key) { + let composeData = this.get('composeData') + let instanceName = this.get('currentInstance') + return composeData[instanceName] && + composeData[instanceName][realm] && + composeData[instanceName][realm][key] + } +} diff --git a/routes/_store/mixins/mixins.js b/routes/_store/mixins/mixins.js new file mode 100644 index 0000000..bfa8ed1 --- /dev/null +++ b/routes/_store/mixins/mixins.js @@ -0,0 +1,7 @@ +import { timelineMixins } from './timelineMixins' +import { instanceMixins } from './instanceMixins' + +export function mixins (Store) { + instanceMixins(Store) + timelineMixins(Store) +} diff --git a/routes/_store/mixins.js b/routes/_store/mixins/timelineMixins.js similarity index 89% rename from routes/_store/mixins.js rename to routes/_store/mixins/timelineMixins.js index 1a247c1..9fd09e8 100644 --- a/routes/_store/mixins.js +++ b/routes/_store/mixins/timelineMixins.js @@ -1,4 +1,4 @@ -function timelineMixins (Store) { +export function timelineMixins (Store) { Store.prototype.setForTimeline = function (instanceName, timelineName, obj) { let timelines = this.get('timelines') || {} let timelineData = timelines[instanceName] || {} @@ -19,7 +19,3 @@ function timelineMixins (Store) { this.setForTimeline(instanceName, timelineName, obj) } } - -export function mixins (Store) { - timelineMixins(Store) -} diff --git a/routes/_store/instanceObservers.js b/routes/_store/observers/instanceObservers.js similarity index 89% rename from routes/_store/instanceObservers.js rename to routes/_store/observers/instanceObservers.js index 0dcdc50..3a983b0 100644 --- a/routes/_store/instanceObservers.js +++ b/routes/_store/observers/instanceObservers.js @@ -1,6 +1,6 @@ -import { updateInstanceInfo, updateVerifyCredentialsForInstance } from '../_actions/instances' -import { updateLists } from '../_actions/lists' -import { createStream } from '../_actions/streaming' +import { updateInstanceInfo, updateVerifyCredentialsForInstance } from '../../_actions/instances' +import { updateLists } from '../../_actions/lists' +import { createStream } from '../../_actions/streaming' export function instanceObservers (store) { // stream to watch for home timeline updates and notifications diff --git a/routes/_store/notificationObservers.js b/routes/_store/observers/notificationObservers.js similarity index 79% rename from routes/_store/notificationObservers.js rename to routes/_store/observers/notificationObservers.js index 627dbdd..e743e4b 100644 --- a/routes/_store/notificationObservers.js +++ b/routes/_store/observers/notificationObservers.js @@ -1,5 +1,5 @@ -import { setFavicon } from '../_utils/setFavicon' -import { scheduleIdleTask } from '../_utils/scheduleIdleTask' +import { setFavicon } from '../../_utils/setFavicon' +import { scheduleIdleTask } from '../../_utils/scheduleIdleTask' let currentFaviconHasNotifications = false diff --git a/routes/_store/observers.js b/routes/_store/observers/observers.js similarity index 100% rename from routes/_store/observers.js rename to routes/_store/observers/observers.js diff --git a/routes/_store/timelineObservers.js b/routes/_store/observers/timelineObservers.js similarity index 92% rename from routes/_store/timelineObservers.js rename to routes/_store/observers/timelineObservers.js index ece1719..8ae57c7 100644 --- a/routes/_store/timelineObservers.js +++ b/routes/_store/observers/timelineObservers.js @@ -1,5 +1,5 @@ -import { updateInstanceInfo } from '../_actions/instances' -import { createStream } from '../_actions/streaming' +import { updateInstanceInfo } from '../../_actions/instances' +import { createStream } from '../../_actions/streaming' export function timelineObservers (store) { // stream to watch for local/federated/etc. updates. home and notification diff --git a/routes/_store/store.js b/routes/_store/store.js index 32147f7..13cd16e 100644 --- a/routes/_store/store.js +++ b/routes/_store/store.js @@ -1,6 +1,6 @@ -import { observers } from './observers' -import { computations } from './computations' -import { mixins } from './mixins' +import { observers } from './observers/observers' +import { computations } from './computations/computations' +import { mixins } from './mixins/mixins' import { LocalStorageStore } from './LocalStorageStore' const KEYS_TO_STORE_IN_LOCAL_STORAGE = new Set([ @@ -14,9 +14,7 @@ const KEYS_TO_STORE_IN_LOCAL_STORAGE = new Set([ 'autoplayGifs', 'markMediaAsSensitive', 'pinnedPages', - 'composeText', - 'uploadedMedia', - 'postPrivacy' + 'composeData' ]) class PinaforeStore extends LocalStorageStore { @@ -41,11 +39,9 @@ export const store = new PinaforeStore({ pinnedStatuses: {}, instanceInfos: {}, statusModifications: {}, - composeText: {}, rawComposeText: '', customEmoji: {}, - uploadedMedia: {}, - postPrivacy: {}, + composeData: {}, verifyCredentials: {} })