use database for account caching
This commit is contained in:
parent
47c058a19f
commit
48d47160d7
|
@ -38,22 +38,6 @@
|
|||
this.fire('initialized')
|
||||
}))
|
||||
})
|
||||
this.observe('statuses', statuses => {
|
||||
let cachedAccountNames = this.store.get('cachedAccountNames') || {}
|
||||
for (let status of statuses) {
|
||||
cachedAccountNames[status.account.id] = {
|
||||
username: status.account.username,
|
||||
acct: status.account.acct
|
||||
}
|
||||
if (status.reblog) {
|
||||
cachedAccountNames[status.reblog.account.id] = {
|
||||
username: status.reblog.account.username,
|
||||
acct: status.reblog.account.acct
|
||||
}
|
||||
}
|
||||
}
|
||||
this.store.set({'cachedAccountNames': cachedAccountNames})
|
||||
})
|
||||
},
|
||||
data: () => ({
|
||||
StatusListItem: StatusListItem,
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
export const STATUSES_STORE = 'statuses'
|
||||
export const TIMELINE_STORE = 'timelines'
|
||||
export const META_STORE = 'meta'
|
||||
export const ACCOUNTS_STORE= 'accounts'
|
|
@ -10,7 +10,7 @@ import {
|
|||
import {
|
||||
META_STORE,
|
||||
TIMELINE_STORE,
|
||||
STATUSES_STORE
|
||||
STATUSES_STORE, ACCOUNTS_STORE
|
||||
} from './constants'
|
||||
|
||||
export async function getTimeline(instanceName, timeline, maxId = null, limit = 20) {
|
||||
|
@ -38,16 +38,19 @@ export async function getTimeline(instanceName, timeline, maxId = null, limit =
|
|||
|
||||
export async function insertStatuses(instanceName, timeline, statuses) {
|
||||
const db = await getDatabase(instanceName, timeline)
|
||||
await dbPromise(db, [TIMELINE_STORE, STATUSES_STORE], 'readwrite', (stores) => {
|
||||
let [ timelineStore, statusesStore ] = stores
|
||||
await dbPromise(db, [TIMELINE_STORE, STATUSES_STORE, ACCOUNTS_STORE], 'readwrite', (stores) => {
|
||||
let [ timelineStore, statusesStore, accountsStore ] = stores
|
||||
for (let status of statuses) {
|
||||
statusesStore.put(status)
|
||||
// reverse chronological order, prefixed by timeline
|
||||
let id = timeline + '\u0000' + toReversePaddedBigInt(status.id)
|
||||
timelineStore.put({
|
||||
id: id,
|
||||
id: (timeline + '\u0000' + toReversePaddedBigInt(status.id)),
|
||||
statusId: status.id
|
||||
})
|
||||
accountsStore.put(status.account)
|
||||
if (status.reblog) {
|
||||
accountsStore.put(status.reblog.account)
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
|
@ -71,6 +74,15 @@ export async function setInstanceVerifyCredentials(instanceName, verifyCredentia
|
|||
})
|
||||
}
|
||||
|
||||
export async function getAccount(instanceName, accountId) {
|
||||
const db = await getDatabase(instanceName)
|
||||
return await dbPromise(db, ACCOUNTS_STORE, 'readonly', (store, callback) => {
|
||||
store.get(accountId).onsuccess = (e) => {
|
||||
callback(e.target.result && e.target.result)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
export async function clearDatabaseForInstance(instanceName) {
|
||||
await deleteDatabase(instanceName)
|
||||
}
|
|
@ -4,7 +4,8 @@ const databaseCache = {}
|
|||
import {
|
||||
META_STORE,
|
||||
TIMELINE_STORE,
|
||||
STATUSES_STORE
|
||||
STATUSES_STORE,
|
||||
ACCOUNTS_STORE
|
||||
} from './constants'
|
||||
|
||||
export function getDatabase(instanceName) {
|
||||
|
@ -23,6 +24,7 @@ export function getDatabase(instanceName) {
|
|||
let db = req.result;
|
||||
db.createObjectStore(META_STORE, {keyPath: 'key'})
|
||||
db.createObjectStore(STATUSES_STORE, {keyPath: 'id'})
|
||||
db.createObjectStore(ACCOUNTS_STORE, {keyPath: 'id'})
|
||||
let timelineStore = db.createObjectStore(TIMELINE_STORE, {keyPath: 'id'})
|
||||
timelineStore.createIndex('statusId', 'statusId')
|
||||
}
|
||||
|
|
|
@ -1,14 +1,14 @@
|
|||
<:Head>
|
||||
<title>{{'Pinafore – ' + (cachedProfileName || profileName || '')}}</title>
|
||||
<title>{{'Pinafore – ' + profileName}}</title>
|
||||
</:Head>
|
||||
|
||||
<Layout page='tags'
|
||||
dynamicPage="{{cachedProfileName || profileName || ''}}"
|
||||
dynamicPage="{{profileName}}"
|
||||
dynamicHref="/accounts/{{params.accountId}}"
|
||||
dynamicLabel="{{cachedShortProfileName || shortProfileName || ''}}"
|
||||
dynamicLabel="{{shortProfileName}}"
|
||||
dynamicIcon="#fa-user" >
|
||||
{{#if $isUserLoggedIn}}
|
||||
<DynamicPageBanner title="{{cachedProfileName || profileName || ''}}" />
|
||||
<DynamicPageBanner title="{{profileName}}" />
|
||||
<LazyTimeline timeline='account/{{params.accountId}}' />
|
||||
{{else}}
|
||||
<HiddenFromSSR>
|
||||
|
@ -28,28 +28,39 @@
|
|||
import HiddenFromSSR from '../_components/HiddenFromSSR'
|
||||
import DynamicPageBanner from '../_components/DynamicPageBanner.html'
|
||||
import { getAccount } from '../_utils/mastodon/user'
|
||||
import { database } from '../_utils/database/database'
|
||||
|
||||
export default {
|
||||
async oncreate() {
|
||||
oncreate() {
|
||||
let currentInstance = this.store.get('currentInstance')
|
||||
let accessToken = this.store.get('accessToken')
|
||||
let accountId = this.get('params').accountId
|
||||
let account = await getAccount(currentInstance, accessToken, accountId)
|
||||
database.getAccount(currentInstance, accountId).then(account => {
|
||||
this.set({cachedAccount: account})
|
||||
})
|
||||
getAccount(currentInstance, accessToken, accountId).then(account => {
|
||||
this.set({account: account})
|
||||
})
|
||||
},
|
||||
store: () => store,
|
||||
computed: {
|
||||
profileName: (account) => {
|
||||
remoteProfileName: (account) => {
|
||||
return account && ('@' + account.acct)
|
||||
},
|
||||
shortProfileName: (account) => {
|
||||
remoteShortProfileName: (account) => {
|
||||
return account && ('@' + account.username)
|
||||
},
|
||||
cachedProfileName: ($cachedAccountNames, params) => {
|
||||
return $cachedAccountNames && $cachedAccountNames[params.accountId] && ('@' + $cachedAccountNames[params.accountId].acct)
|
||||
cachedProfileName: (cachedAccount) => {
|
||||
return cachedAccount && ('@' + cachedAccount.acct)
|
||||
},
|
||||
cachedShortProfileName: ($cachedAccountNames, params) => {
|
||||
return $cachedAccountNames && $cachedAccountNames[params.accountId] && ('@' + $cachedAccountNames[params.accountId].username)
|
||||
cachedShortProfileName: (cachedAccount) => {
|
||||
return cachedAccount && ('@' + cachedAccount.username)
|
||||
},
|
||||
profileName: (remoteProfileName, cachedProfileName) => {
|
||||
return remoteProfileName || cachedProfileName || ''
|
||||
},
|
||||
shortProfileName: (remoteShortProfileName, cachedShortProfileName) => {
|
||||
return remoteShortProfileName || cachedShortProfileName || ''
|
||||
}
|
||||
},
|
||||
components: {
|
||||
|
|
Loading…
Reference in a new issue