clean up actions, implement cache-first sync strategy
This commit is contained in:
parent
1d25fa641e
commit
fee954bf27
|
@ -1,6 +1,6 @@
|
|||
import { getAccount, getRelationship } from '../../_api/user'
|
||||
import { database } from '../../_database/database'
|
||||
import { store } from '../../_store/store'
|
||||
import { getAccount, getRelationship } from '../_api/user'
|
||||
import { database } from '../_database/database'
|
||||
import { store } from '../_store/store'
|
||||
|
||||
async function updateAccount(accountId, instanceName, accessToken) {
|
||||
let localPromise = database.getAccount(instanceName, accountId)
|
|
@ -1,10 +1,10 @@
|
|||
import { getAccessTokenFromAuthCode, registerApplication, generateAuthLink } from '../../../_api/oauth'
|
||||
import { getInstanceInfo } from '../../../_api/instance'
|
||||
import { getAccessTokenFromAuthCode, registerApplication, generateAuthLink } from '../_api/oauth'
|
||||
import { getInstanceInfo } from '../_api/instance'
|
||||
import { goto } from 'sapper/runtime.js'
|
||||
import { switchToTheme } from '../../../_utils/themeEngine'
|
||||
import { database } from '../../../_database/database'
|
||||
import { store } from '../../../_store/store'
|
||||
import { updateVerifyCredentialsForInstance } from './[instanceName]'
|
||||
import { switchToTheme } from '../_utils/themeEngine'
|
||||
import { database } from '../_database/database'
|
||||
import { store } from '../_store/store'
|
||||
import { updateVerifyCredentialsForInstance } from './instances'
|
||||
|
||||
const REDIRECT_URI = (typeof location !== 'undefined' ?
|
||||
location.origin : 'https://pinafore.social') + '/settings/instances/add'
|
|
@ -1,10 +1,10 @@
|
|||
import { getVerifyCredentials } from '../../../_api/user'
|
||||
import { store } from '../../../_store/store'
|
||||
import { switchToTheme } from '../../../_utils/themeEngine'
|
||||
import { toast } from '../../../_utils/toast'
|
||||
import { database } from '../../../_database/database'
|
||||
import { getVerifyCredentials } from '../_api/user'
|
||||
import { store } from '../_store/store'
|
||||
import { switchToTheme } from '../_utils/themeEngine'
|
||||
import { toast } from '../_utils/toast'
|
||||
import { database } from '../_database/database'
|
||||
import { goto } from 'sapper/runtime.js'
|
||||
import pAny from 'p-any'
|
||||
import { cacheFirstUpdateAfter } from '../_utils/sync'
|
||||
|
||||
export function changeTheme(instanceName, newTheme) {
|
||||
let instanceThemes = store.get('instanceThemes')
|
||||
|
@ -55,14 +55,11 @@ function setStoreVerifyCredentials(instanceName, thisVerifyCredentials) {
|
|||
|
||||
export async function updateVerifyCredentialsForInstance(instanceName) {
|
||||
let loggedInInstances = store.get('loggedInInstances')
|
||||
let instanceData = loggedInInstances[instanceName]
|
||||
await pAny([
|
||||
database.getInstanceVerifyCredentials(instanceName).then(verifyCredentials => {
|
||||
setStoreVerifyCredentials(instanceName, verifyCredentials)
|
||||
}),
|
||||
getVerifyCredentials(instanceName, instanceData.access_token).then(verifyCredentials => {
|
||||
setStoreVerifyCredentials(instanceName, verifyCredentials)
|
||||
return database.setInstanceVerifyCredentials(instanceName, verifyCredentials)
|
||||
})
|
||||
])
|
||||
let accessToken = loggedInInstances[instanceName].access_token
|
||||
await cacheFirstUpdateAfter(
|
||||
() => getVerifyCredentials(instanceName, accessToken),
|
||||
() => database.getInstanceVerifyCredentials(instanceName),
|
||||
verifyCredentials => database.setInstanceVerifyCredentials(instanceName, verifyCredentials),
|
||||
verifyCredentials => setStoreVerifyCredentials(instanceName, verifyCredentials)
|
||||
)
|
||||
}
|
20
routes/_actions/lists.js
Normal file
20
routes/_actions/lists.js
Normal file
|
@ -0,0 +1,20 @@
|
|||
import { store } from '../_store/store'
|
||||
import { database } from '../_database/database'
|
||||
import { getLists } from '../_api/lists'
|
||||
import { cacheFirstUpdateAfter } from '../_utils/sync'
|
||||
|
||||
export async function updateLists() {
|
||||
let instanceName = store.get('currentInstance')
|
||||
let accessToken = store.get('accessToken')
|
||||
|
||||
await cacheFirstUpdateAfter(
|
||||
() => getLists(instanceName, accessToken),
|
||||
() => database.getLists(instanceName),
|
||||
lists => database.setLists(instanceName, lists),
|
||||
lists => {
|
||||
let instanceLists = store.get('instanceLists')
|
||||
instanceLists[instanceName] = lists
|
||||
store.set({instanceLists: instanceLists})
|
||||
}
|
||||
)
|
||||
}
|
|
@ -63,9 +63,6 @@ export function initializeTimeline() {
|
|||
|
||||
export async function setupTimeline() {
|
||||
mark('setupTimeline')
|
||||
let timelineName = store.get('currentTimeline')
|
||||
let instanceName = store.get('currentInstance')
|
||||
let accessToken = store.get('accessToken')
|
||||
if (!store.get('timelineItemIds').length) {
|
||||
await fetchTimelineItemsAndPossiblyFallBack()
|
||||
}
|
||||
|
|
|
@ -64,15 +64,8 @@
|
|||
<script>
|
||||
import NavItem from './NavItem'
|
||||
import { store } from '../_store/store'
|
||||
import { fetchLists } from '../community/_actions/community'
|
||||
|
||||
export default {
|
||||
async oncreate() {
|
||||
let pinnedPage = this.store.get('pinnedPage')
|
||||
if (pinnedPage.startsWith('/lists')) {
|
||||
await fetchLists()
|
||||
}
|
||||
},
|
||||
store: () => store,
|
||||
components: {
|
||||
NavItem
|
||||
|
|
|
@ -1,11 +1,11 @@
|
|||
import { updateVerifyCredentialsForInstance } from '../settings/instances/_actions/[instanceName]'
|
||||
import { fetchLists } from '../community/_actions/community'
|
||||
import { updateVerifyCredentialsForInstance } from '../_actions/instances'
|
||||
import { updateLists } from '../_actions/lists'
|
||||
|
||||
export function observers(store) {
|
||||
store.observe('currentInstance', (currentInstance) => {
|
||||
if (currentInstance) {
|
||||
updateVerifyCredentialsForInstance(currentInstance)
|
||||
fetchLists()
|
||||
updateLists()
|
||||
}
|
||||
})
|
||||
}
|
18
routes/_utils/sync.js
Normal file
18
routes/_utils/sync.js
Normal file
|
@ -0,0 +1,18 @@
|
|||
// Hit both the cache and the network, setting state for the cached version first,
|
||||
// then the network version (as it's assumed to be fresher). Also update the db afterwards.
|
||||
export async function cacheFirstUpdateAfter(networkFetcher, dbFetcher, dbUpdater, stateSetter) {
|
||||
let networkPromise = networkFetcher() // kick off network request immediately
|
||||
let dbResponse
|
||||
try {
|
||||
dbResponse = await dbFetcher()
|
||||
stateSetter(dbResponse)
|
||||
} finally {
|
||||
let fetchAndUpdatePromise = networkPromise.then(networkResponse => {
|
||||
/* no await */ dbUpdater(networkResponse)
|
||||
stateSetter(networkResponse)
|
||||
})
|
||||
if (!dbResponse) { // no cached result available, await the network
|
||||
await fetchAndUpdatePromise
|
||||
}
|
||||
}
|
||||
}
|
|
@ -31,9 +31,9 @@
|
|||
import { store } from '../_store/store.js'
|
||||
import HiddenFromSSR from '../_components/HiddenFromSSR'
|
||||
import DynamicPageBanner from '../_components/DynamicPageBanner.html'
|
||||
import { updateProfileAndRelationship } from './_actions/[accountId]'
|
||||
import { updateProfileAndRelationship } from '../_actions/accounts'
|
||||
import AccountProfile from '../_components/AccountProfile.html'
|
||||
import { updateVerifyCredentialsForInstance } from '../settings/instances/_actions/[instanceName]'
|
||||
import { updateVerifyCredentialsForInstance } from '../_actions/instances'
|
||||
|
||||
export default {
|
||||
oncreate() {
|
||||
|
|
|
@ -1,19 +0,0 @@
|
|||
import { store } from '../../_store/store'
|
||||
import pAny from 'p-any'
|
||||
import { database } from '../../_database/database'
|
||||
import { getLists } from '../../_api/lists'
|
||||
|
||||
export async function fetchLists() {
|
||||
let instanceName = store.get('currentInstance')
|
||||
let accessToken = store.get('accessToken')
|
||||
let lists = await pAny([
|
||||
getLists(instanceName, accessToken).then(lists => {
|
||||
/* no await */ database.setLists(instanceName, lists)
|
||||
return lists
|
||||
}),
|
||||
database.getLists(instanceName)
|
||||
])
|
||||
let instanceLists = store.get('instanceLists')
|
||||
instanceLists[instanceName] = lists
|
||||
store.set({instanceLists: instanceLists})
|
||||
}
|
|
@ -54,11 +54,11 @@
|
|||
import HiddenFromSSR from '../_components/HiddenFromSSR'
|
||||
import PageList from './_components/PageList.html'
|
||||
import PageListItem from './_components/PageListItem.html'
|
||||
import { fetchLists } from './_actions/community'
|
||||
import { updateLists } from '../_actions/lists'
|
||||
|
||||
export default {
|
||||
async oncreate() {
|
||||
await fetchLists()
|
||||
await updateLists()
|
||||
},
|
||||
store: () => store,
|
||||
components: {
|
||||
|
|
|
@ -25,12 +25,8 @@
|
|||
import { store } from '../_store/store.js'
|
||||
import HiddenFromSSR from '../_components/HiddenFromSSR'
|
||||
import DynamicPageBanner from '../_components/DynamicPageBanner.html'
|
||||
import { fetchLists } from '../community/_actions/community'
|
||||
|
||||
export default {
|
||||
async oncreate() {
|
||||
await fetchLists()
|
||||
},
|
||||
computed: {
|
||||
list: (params, $lists) => $lists && $lists.find(_ => _.id === params['listId']),
|
||||
listTitle: (list) => list ? list.title : ''
|
||||
|
|
|
@ -106,7 +106,7 @@
|
|||
switchToInstance,
|
||||
logOutOfInstance,
|
||||
updateVerifyCredentialsForInstance
|
||||
} from './_actions/[instanceName]'
|
||||
} from '../../_actions/instances'
|
||||
import { themes } from '../../_static/themes'
|
||||
|
||||
export default {
|
||||
|
|
|
@ -72,7 +72,7 @@
|
|||
import SettingsLayout from '../_components/SettingsLayout.html'
|
||||
import { store } from '../../_store/store'
|
||||
import LoadingMask from '../../_components/LoadingMask'
|
||||
import { logInToInstance, handleOauthCode } from './_actions/add'
|
||||
import { logInToInstance, handleOauthCode } from '../../_actions/addInstance'
|
||||
import ExternalLink from '../../_components/ExternalLink.html'
|
||||
|
||||
export default {
|
||||
|
|
Loading…
Reference in a new issue