Files
bodyshop-desktop/src/main/graphql/graphql-client.ts
2025-10-20 14:52:37 -07:00

54 lines
1.5 KiB
TypeScript

import { BrowserWindow, ipcMain } from "electron";
import log from "electron-log/main";
import { GraphQLClient, RequestMiddleware } from "graphql-request";
import errorTypeCheck from "../../util/errorTypeCheck.js";
import ipcTypes from "../../util/ipcTypes.json";
import store from "../store/store.js";
import getMainWindow from "../../util/getMainWindow.js";
const requestMiddleware: RequestMiddleware = async (request) => {
const token = await getTokenFromRenderer();
log.info(
`%c[Graphql Request]%c${request.operationName}`,
"color: red",
"color: green",
request,
);
return {
...request,
headers: { ...request.headers, Authorization: `Bearer ${token}` },
};
};
const client: GraphQLClient = new GraphQLClient(
store.get("app.isTest") || false
? import.meta.env.VITE_GRAPHQL_ENDPOINT_TEST
: import.meta.env.VITE_GRAPHQL_ENDPOINT,
{
requestMiddleware,
},
);
export async function getTokenFromRenderer(): Promise<string> {
return new Promise((resolve) => {
try {
const mainWindow = getMainWindow();
//TODO: Verify that this will work if the app is minimized/closed.
mainWindow?.webContents.send(ipcTypes.toRenderer.user.getToken);
} catch (error) {
log.error(
"Unable to send request to renderer process for token",
errorTypeCheck(error),
);
}
// Set up one-time listener for the response
ipcMain.once(ipcTypes.toMain.user.getTokenResponse, (_, token: string) => {
resolve(token);
});
});
}
export default client;