(WIP) Add initial API client

This commit is contained in:
Paul Frazee 2022-06-10 11:55:09 -05:00
parent 967f9fc474
commit faddda83f0
9 changed files with 260 additions and 27 deletions

View file

@ -4,8 +4,11 @@
*/
import {getEnv, IStateTreeNode} from 'mobx-state-tree'
import {API} from '../api'
export class Environment {
api = new API()
constructor() {}
async setup() {}

View file

@ -1,14 +1,69 @@
import {Instance, SnapshotOut, types} from 'mobx-state-tree'
import {Instance, SnapshotOut, types, flow} from 'mobx-state-tree'
import {UserConfig} from '../../api'
import {withEnvironment} from '../env'
export const SessionModel = types
.model('Session')
.props({
isAuthed: types.boolean,
uiState: types.enumeration('idle', ['idle', 'working']),
uiError: types.maybe(types.string),
// TODO: these should be stored somewhere secret
serverUrl: types.maybe(types.string),
secretKeyStr: types.maybe(types.string),
rootAuthToken: types.maybe(types.string),
})
.views(self => ({
get hasAccount() {
return self.serverUrl && self.secretKeyStr && self.rootAuthToken
},
}))
.extend(withEnvironment)
.actions(self => ({
setAuthed: (v: boolean) => {
self.isAuthed = v
},
loadAccount: flow(function* () {
if (!self.hasAccount) {
return false
}
self.uiState = 'working'
self.uiError = undefined
try {
const cfg = yield UserConfig.hydrate({
serverUrl: self.serverUrl,
secretKeyStr: self.secretKeyStr,
rootAuthToken: self.rootAuthToken,
})
self.environment.api.setUserCfg(cfg)
self.isAuthed = true
self.uiState = 'idle'
return true
} catch (e: any) {
console.error('Failed to create test account', e)
self.uiError = e.toString()
self.uiState = 'idle'
return false
}
}),
createTestAccount: flow(function* (serverUrl: string) {
self.uiState = 'working'
self.uiError = undefined
try {
const cfg = yield UserConfig.createTest(serverUrl)
const state = yield cfg.serialize()
self.serverUrl = state.serverUrl
self.secretKeyStr = state.secretKeyStr
self.rootAuthToken = state.rootAuthToken
self.isAuthed = true
self.environment.api.setUserCfg(cfg)
} catch (e: any) {
console.error('Failed to create test account', e)
self.uiError = e.toString()
}
self.uiState = 'idle'
}),
}))
export interface Session extends Instance<typeof SessionModel> {}
@ -17,5 +72,6 @@ export interface SessionSnapshot extends SnapshotOut<typeof SessionModel> {}
export function createDefaultSession() {
return {
isAuthed: false,
uiState: 'idle',
}
}