homebox/frontend/composables/use-api.ts

51 lines
1.3 KiB
TypeScript
Raw Normal View History

import { PublicApi } from "~~/lib/api/public";
import { UserClient } from "~~/lib/api/user";
import { Requests } from "~~/lib/requests";
2022-09-01 22:32:03 +00:00
export type Observer = {
handler: (r: Response, req?: RequestInit) => 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];
};
}
2022-09-04 06:19:19 +00:00
function logger(r: Response) {
console.log(`${r.status} ${r.url} ${r.statusText}`);
2022-09-01 22:32:03 +00:00
}
export function usePublicApi(): PublicApi {
const requests = new Requests("", "", {});
2022-09-01 22:32:03 +00:00
return new PublicApi(requests);
}
export function useUserApi(): UserClient {
const authCtx = useAuthContext();
2022-09-04 06:19:13 +00:00
const requests = new Requests("", "", {});
2022-09-04 06:19:19 +00:00
requests.addResponseInterceptor(logger);
2022-09-04 06:19:13 +00:00
requests.addResponseInterceptor(r => {
if (r.status === 401) {
console.error("unauthorized request, invalidating session");
authCtx.invalidateSession();
if (window.location.pathname !== "/") {
window.location.href = "/";
}
2022-09-04 06:19:13 +00:00
}
});
for (const [_, observer] of Object.entries(observers)) {
requests.addResponseInterceptor(observer.handler);
}
return new UserClient(requests, authCtx.attachmentToken || "");
2022-09-01 22:32:03 +00:00
}