From 6fab907ed3f286191c9db9f71d49ea17df2a9eeb Mon Sep 17 00:00:00 2001 From: Innei Date: Mon, 8 Jul 2024 17:51:00 +0800 Subject: [PATCH] chore: add app meta header to request headers Signed-off-by: Innei --- electron.vite.config.ts | 1 + src/renderer/src/components/site-icon.tsx | 5 ++++- src/renderer/src/lib/api-fetch.ts | 17 ++++++++++++++++- tsconfig.web.json | 3 ++- vite.config.ts | 1 + 5 files changed, 24 insertions(+), 3 deletions(-) diff --git a/electron.vite.config.ts b/electron.vite.config.ts index 3a86b4ff2..1173c940f 100644 --- a/electron.vite.config.ts +++ b/electron.vite.config.ts @@ -20,6 +20,7 @@ export default defineConfig({ alias: { "@renderer": resolve("src/renderer/src"), "@shared": resolve("src/shared/src"), + "@pkg": resolve("./package.json"), }, }, plugins: [react()], diff --git a/src/renderer/src/components/site-icon.tsx b/src/renderer/src/components/site-icon.tsx index 421a588c8..7384e1226 100644 --- a/src/renderer/src/components/site-icon.tsx +++ b/src/renderer/src/components/site-icon.tsx @@ -32,8 +32,11 @@ export function SiteIcon({ className={cn("mr-2 size-5 shrink-0 rounded-sm", className)} loading="lazy" onError={(e) => { - if (fallback) { + if (fallback && e.currentTarget.src !== fallback) { e.currentTarget.src = fallback + } else { + // Empty svg + e.currentTarget.src = "data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3C/svg%3E" } }} style={style} diff --git a/src/renderer/src/lib/api-fetch.ts b/src/renderer/src/lib/api-fetch.ts index f99298504..5b145f5f9 100644 --- a/src/renderer/src/lib/api-fetch.ts +++ b/src/renderer/src/lib/api-fetch.ts @@ -1,11 +1,11 @@ import { getCsrfToken } from "@hono/auth-js/react" +import PKG from "@pkg" import { setLoginModalShow } from "@renderer/atoms/user" import type { AppType } from "@renderer/hono" import { hc } from "hono/client" import { FetchError, ofetch } from "ofetch" let csrfTokenPromise: Promise | null = null - export const apiFetch = ofetch.create({ baseURL: import.meta.env.VITE_API_URL, credentials: "include", @@ -28,6 +28,15 @@ export const apiFetch = ofetch.create({ } else { (options.body as Record).csrfToken = csrfToken } + + const header = new Headers(options.headers) + + header.set("x-app-version", PKG.version) + header.set( + "X-App-Dev", + process.env.NODE_ENV === "development" ? "1" : "0", + ) + options.headers = header } }, onResponseError(context) { @@ -51,6 +60,12 @@ export const apiFetch = ofetch.create({ export const apiClient = hc("", { fetch: async (input, options = {}) => apiFetch(input.toString(), options), + headers() { + return { + "X-App-Version": PKG.version, + "X-App-Dev": process.env.NODE_ENV === "development" ? "1" : "0", + } + }, }) export const getFetchErrorMessage = (error: Error) => { diff --git a/tsconfig.web.json b/tsconfig.web.json index c5541d447..4efc0f43d 100644 --- a/tsconfig.web.json +++ b/tsconfig.web.json @@ -24,7 +24,8 @@ ], "@shared/*": [ "src/shared/src/*" - ] + ], + "@pkg": ["./package.json"] } } } diff --git a/vite.config.ts b/vite.config.ts index 7c4a319db..b9a41bbfa 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -17,6 +17,7 @@ export default defineConfig({ alias: { "@renderer": resolve("src/renderer/src"), "@shared": resolve("src/shared/src"), + "@pkg": resolve("./package.json"), }, }, base: "/",