lifeto-shop/src/lib/lifeto/stateful.ts
2022-07-07 02:54:36 -05:00

50 lines
1.4 KiB
TypeScript

import { RefStore } from "../../state/state";
import { bank_endpoint, Session } from "../session";
import { TricksterAccount, TricksterInventory } from "../trickster";
import { BankEndpoint, LTOApi } from "./api";
export interface SessionBinding {
new(s:Session):LTOApi
}
export const getLTOState = <A extends LTOApi>(c: new (s:Session) => A,s:Session, r:RefStore): LTOApi => {
return new StatefulLTOApi(new c(s),r);
}
export class StatefulLTOApi implements LTOApi {
u: LTOApi
r: RefStore
constructor(s:LTOApi, r:RefStore){
this.u = s
this.r=r
}
BankAction = <T,D>(e: BankEndpoint, t: T):Promise<D> => {
return this.u.BankAction(e,t)
}
GetInventory = async (path:string):Promise<TricksterInventory>=>{
const inv = await this.u.GetInventory(path)
if(this.r.invs.value.get(inv.path)){
this.r.invs.value.get(inv.path)!.items = inv.items
}else{
this.r.invs.value.set(inv.path,inv)
}
if(inv.galders) {
this.r.invs.value.get(inv.path)!.galders = inv.galders
}
this.r.dirty.value = this.r.dirty.value + 1
return inv
}
GetAccounts = async ():Promise<TricksterAccount[]> => {
const xs = await this.u.GetAccounts()
xs.forEach((x)=>{
x.characters.forEach((ch)=>{
this.r.chars.value.set(ch.path,ch)
})
})
return xs
}
GetLoggedin= async ():Promise<boolean>=>{
return this.u.GetLoggedin()
}
}