Add profile info caching
parent
723dee5704
commit
6e93301542
|
@ -0,0 +1,44 @@
|
||||||
|
import {makeAutoObservable} from 'mobx'
|
||||||
|
import {LRUMap} from 'lru_map'
|
||||||
|
import {RootStoreModel} from './root-store'
|
||||||
|
import * as GetProfile from '../../third-party/api/src/client/types/app/bsky/actor/getProfile'
|
||||||
|
|
||||||
|
type CacheValue = Promise<GetProfile.Response> | GetProfile.Response
|
||||||
|
export class ProfilesViewModel {
|
||||||
|
cache: LRUMap<string, CacheValue> = new LRUMap(100)
|
||||||
|
|
||||||
|
constructor(public rootStore: RootStoreModel) {
|
||||||
|
makeAutoObservable(
|
||||||
|
this,
|
||||||
|
{
|
||||||
|
rootStore: false,
|
||||||
|
cache: false,
|
||||||
|
},
|
||||||
|
{autoBind: true},
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
// public api
|
||||||
|
// =
|
||||||
|
|
||||||
|
async getProfile(did: string) {
|
||||||
|
const cached = this.cache.get(did)
|
||||||
|
if (cached) {
|
||||||
|
try {
|
||||||
|
return await cached
|
||||||
|
} catch (e) {
|
||||||
|
// ignore, we'll try again
|
||||||
|
}
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
const promise = this.rootStore.api.app.bsky.actor.getProfile({actor: did})
|
||||||
|
this.cache.set(did, promise)
|
||||||
|
const res = await promise
|
||||||
|
this.cache.set(did, res)
|
||||||
|
return res
|
||||||
|
} catch (e) {
|
||||||
|
this.cache.delete(did)
|
||||||
|
throw e
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -10,6 +10,7 @@ import {isObj, hasProp} from '../lib/type-guards'
|
||||||
import {SessionModel} from './session'
|
import {SessionModel} from './session'
|
||||||
import {NavigationModel} from './navigation'
|
import {NavigationModel} from './navigation'
|
||||||
import {ShellUiModel} from './shell-ui'
|
import {ShellUiModel} from './shell-ui'
|
||||||
|
import {ProfilesViewModel} from './profiles-view'
|
||||||
import {MeModel} from './me'
|
import {MeModel} from './me'
|
||||||
import {OnboardModel} from './onboard'
|
import {OnboardModel} from './onboard'
|
||||||
|
|
||||||
|
@ -19,6 +20,7 @@ export class RootStoreModel {
|
||||||
shell = new ShellUiModel()
|
shell = new ShellUiModel()
|
||||||
me = new MeModel(this)
|
me = new MeModel(this)
|
||||||
onboard = new OnboardModel()
|
onboard = new OnboardModel()
|
||||||
|
profiles = new ProfilesViewModel(this)
|
||||||
|
|
||||||
constructor(public api: SessionServiceClient) {
|
constructor(public api: SessionServiceClient) {
|
||||||
makeAutoObservable(this, {
|
makeAutoObservable(this, {
|
||||||
|
|
|
@ -33,8 +33,7 @@ export function UserInfoText({
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
let aborted = false
|
let aborted = false
|
||||||
// TODO use caching to reduce loads
|
store.profiles.getProfile(did).then(
|
||||||
store.api.app.bsky.actor.getProfile({actor: did}).then(
|
|
||||||
v => {
|
v => {
|
||||||
if (aborted) return
|
if (aborted) return
|
||||||
setProfile(v.data)
|
setProfile(v.data)
|
||||||
|
|
Loading…
Reference in New Issue