add flags for enabling notifications for product updates & new releases

This commit is contained in:
Fred KISSIE
2025-11-08 00:51:56 +01:00
parent 94e1c534ca
commit 579a4e1021
6 changed files with 112 additions and 60 deletions

View File

@@ -21,6 +21,14 @@ const envSchema = z.object({
.transform((val) => val === "true"),
APP_VERSION: z.string(),
DASHBOARD_URL: z.string(),
PRODUCT_UPDATES_NOTIFICATION_ENABLED: z
.string()
.default("true")
.transform((val) => val === "true"),
NEW_RELEASES_NOTIFICATION_ENABLED: z
.string()
.default("true")
.transform((val) => val === "true"),
// Email configuration
EMAIL_ENABLED: z
@@ -112,7 +120,11 @@ export function pullEnv(): Env {
environment: env.ENVIRONMENT,
sandbox_mode: env.SANDBOX_MODE,
version: env.APP_VERSION,
dashboardUrl: env.DASHBOARD_URL
dashboardUrl: env.DASHBOARD_URL,
notifications: {
product_updates: env.PRODUCT_UPDATES_NOTIFICATION_ENABLED,
new_releases: env.NEW_RELEASES_NOTIFICATION_ENABLED
}
},
email: {
emailEnabled: env.EMAIL_ENABLED

View File

@@ -15,47 +15,53 @@ export type ProductUpdate = {
showUntil: Date;
};
export const productUpdatesQueries = {
list: queryOptions({
queryKey: ["PRODUCT_UPDATES"] as const,
queryFn: async ({ signal }) => {
const sp = new URLSearchParams({
build
});
const data = await remote.get<ResponseT<ProductUpdate[]>>(
`/product-updates?${sp.toString()}`,
{ signal }
);
return data.data;
},
refetchInterval: (query) => {
if (query.state.data) {
return durationToMs(5, "minutes");
}
return false;
}
}),
latestVersion: queryOptions({
queryKey: ["LATEST_VERSION"] as const,
queryFn: async ({ signal }) => {
const data = await remote.get<
ResponseT<{
pangolin: {
latestVersion: string;
releaseNotes: string;
};
}>
>("/versions", { signal });
return data.data;
},
placeholderData: keepPreviousData,
refetchInterval: (query) => {
if (query.state.data) {
return durationToMs(30, "minutes");
}
return false;
},
enabled: build === "oss" || build === "enterprise" // disabled in cloud version
// because we don't need to listen for new versions there
})
export type LatestVersionResponse = {
pangolin: {
latestVersion: string;
releaseNotes: string;
};
};
export const productUpdatesQueries = {
list: (enabled: boolean) =>
queryOptions({
queryKey: ["PRODUCT_UPDATES"] as const,
queryFn: async ({ signal }) => {
const sp = new URLSearchParams({
build
});
const data = await remote.get<ResponseT<ProductUpdate[]>>(
`/product-updates?${sp.toString()}`,
{ signal }
);
return data.data;
},
refetchInterval: (query) => {
if (query.state.data) {
return durationToMs(5, "minutes");
}
return false;
},
enabled
}),
latestVersion: (enabled: boolean) =>
queryOptions({
queryKey: ["LATEST_VERSION"] as const,
queryFn: async ({ signal }) => {
const data = await remote.get<ResponseT<LatestVersionResponse>>(
"/versions",
{ signal }
);
return data.data;
},
placeholderData: keepPreviousData,
refetchInterval: (query) => {
if (query.state.data) {
return durationToMs(30, "minutes");
}
return false;
},
enabled: enabled && (build === "oss" || build === "enterprise") // disabled in cloud version
// because we don't need to listen for new versions there
})
};

View File

@@ -4,6 +4,10 @@ export type Env = {
sandbox_mode: boolean;
version: string;
dashboardUrl: string;
notifications: {
product_updates: boolean;
new_releases: boolean;
};
};
server: {
externalPort: string;