Add profile info caching

zio/stable
Paul Frazee 2022-11-14 16:56:59 -06:00
parent 723dee5704
commit 6e93301542
3 changed files with 47 additions and 2 deletions

View File

@ -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
}
}
}

View File

@ -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, {

View File

@ -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)