refactor
This commit is contained in:
parent
35282666cc
commit
66801fbc96
|
@ -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}`)
|
||||
|
|
|
@ -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())
|
||||
}
|
||||
|
|
6
routes/_actions/postPrivacy.js
Normal file
6
routes/_actions/postPrivacy.js
Normal file
|
@ -0,0 +1,6 @@
|
|||
|
||||
import { store } from '../_store/store'
|
||||
|
||||
export function setPostPrivacy (realm, postPrivacyKey) {
|
||||
store.setComposeData(realm, 'postPrivacy', postPrivacyKey)
|
||||
}
|
|
@ -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 || ''
|
||||
}
|
||||
}
|
||||
</script>
|
|
@ -1,6 +1,6 @@
|
|||
{{#if uploadedMedia.length}}
|
||||
<div class="compose-media-container" style="grid-template-columns: repeat({{uploadedMedia.length}}, 1fr);">
|
||||
{{#each uploadedMedia as media, i}}
|
||||
{{#if composeMedia.length}}
|
||||
<div class="compose-media-container" style="grid-template-columns: repeat({{composeMedia.length}}, 1fr);">
|
||||
{{#each composeMedia as media, i}}
|
||||
<div class="compose-media">
|
||||
<img src="{{media.data.preview_url}}" alt="{{media.file.name}}"/>
|
||||
<div class="compose-media-delete">
|
||||
|
@ -100,7 +100,8 @@
|
|||
}
|
||||
},
|
||||
computed: {
|
||||
uploadedMedia: ($currentUploadedMedia, realm) => $currentUploadedMedia[realm] || []
|
||||
composeData: ($currentComposeData, realm) => $currentComposeData[realm] || {},
|
||||
composeMedia: (composeData) => composeData.media || []
|
||||
}
|
||||
}
|
||||
</script>
|
|
@ -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)}}"
|
||||
/>
|
||||
<IconButton
|
||||
label="Adjust privacy (currently {{postPrivacy.label}})"
|
||||
|
@ -78,12 +78,13 @@
|
|||
}
|
||||
},
|
||||
computed: {
|
||||
uploadedMedia: ($currentUploadedMedia, realm) => $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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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',
|
|
@ -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',
|
18
routes/_store/mixins/instanceMixins.js
Normal file
18
routes/_store/mixins/instanceMixins.js
Normal file
|
@ -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]
|
||||
}
|
||||
}
|
7
routes/_store/mixins/mixins.js
Normal file
7
routes/_store/mixins/mixins.js
Normal file
|
@ -0,0 +1,7 @@
|
|||
import { timelineMixins } from './timelineMixins'
|
||||
import { instanceMixins } from './instanceMixins'
|
||||
|
||||
export function mixins (Store) {
|
||||
instanceMixins(Store)
|
||||
timelineMixins(Store)
|
||||
}
|
|
@ -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)
|
||||
}
|
|
@ -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
|
|
@ -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
|
||||
|
|
@ -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
|
|
@ -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: {}
|
||||
})
|
||||
|
||||
|
|
Loading…
Reference in a new issue