homebox/frontend/composables/use-api.ts
Hayden 79f7ad40cb
feat: user profiles (#32)
* add user profiles and theme selectors

* lowercase buttons by default

* basic layout

* (wip) init token APIs

* refactor server to support variable options

* fix types

* api refactor / registration tests

* implement UI for url and join

* remove console.logs

* rename repository factory

* fix upload size
2022-10-06 21:54:09 -05:00

47 lines
1.2 KiB
TypeScript

import { PublicApi } from "~~/lib/api/public";
import { UserClient } from "~~/lib/api/user";
import { Requests } from "~~/lib/requests";
import { useAuthStore } from "~~/stores/auth";
export type Observer = {
handler: (r: Response) => void;
};
export type RemoveObserver = () => void;
const observers: Record<string, Observer> = {};
export function defineObserver(key: string, observer: Observer): RemoveObserver {
observers[key] = observer;
return () => {
delete observers[key];
};
}
function logger(r: Response) {
console.log(`${r.status} ${r.url} ${r.statusText}`);
}
export function usePublicApi(): PublicApi {
const requests = new Requests("", "", {});
return new PublicApi(requests);
}
export function useUserApi(): UserClient {
const authStore = useAuthStore();
const requests = new Requests("", () => authStore.token, {});
requests.addResponseInterceptor(logger);
requests.addResponseInterceptor(r => {
if (r.status === 401) {
authStore.clearSession();
}
});
for (const [_, observer] of Object.entries(observers)) {
requests.addResponseInterceptor(observer.handler);
}
return new UserClient(requests);
}