From 59c33819625a89bcbbadc700ffb1d59ff5815ed7 Mon Sep 17 00:00:00 2001 From: "SPRINX0\\prochazka" Date: Fri, 17 Oct 2025 17:30:27 +0200 Subject: [PATCH 1/4] promo widget WIP --- packages/api/src/controllers/cloud.js | 6 ++++ packages/api/src/utility/cloudIntf.js | 33 +++++++++++++++++++++ packages/web/src/utility/metadataLoaders.ts | 13 +++++++- 3 files changed, 51 insertions(+), 1 deletion(-) diff --git a/packages/api/src/controllers/cloud.js b/packages/api/src/controllers/cloud.js index d1cbc00dd..fe1dfd36b 100644 --- a/packages/api/src/controllers/cloud.js +++ b/packages/api/src/controllers/cloud.js @@ -8,6 +8,7 @@ const { getCloudContent, putCloudContent, removeCloudCachedConnection, + getPromoWidgetData, } = require('../utility/cloudIntf'); const connections = require('./connections'); const socket = require('../utility/socket'); @@ -283,6 +284,11 @@ module.exports = { return getAiGatewayServer(); }, + premiumPromoWidget_meta: true, + async premiumPromoWidget() { + return getPromoWidgetData(); + }, + // chatStream_meta: { // raw: true, // method: 'post', diff --git a/packages/api/src/utility/cloudIntf.js b/packages/api/src/utility/cloudIntf.js index 61ff78cf1..2decd76ff 100644 --- a/packages/api/src/utility/cloudIntf.js +++ b/packages/api/src/utility/cloudIntf.js @@ -17,6 +17,7 @@ const currentVersion = require('../currentVersion'); const logger = getLogger('cloudIntf'); let cloudFiles = null; +let promoWidgetData = null; const DBGATE_IDENTITY_URL = process.env.LOCAL_DBGATE_IDENTITY ? 'http://localhost:3103' @@ -259,6 +260,30 @@ async function getPublicFileData(path) { return resp.data; } +async function updatePremiumPromoWidget() { + try { + const fileContent = await fs.readFile(path.join(datadir(), 'promo-widget.json'), 'utf-8'); + promoWidgetData = JSON.parse(fileContent); + } catch (err) { + promoWidgetData = null; + } + + const tags = (await collectCloudFilesSearchTags()).join(','); + + const resp = await axios.default.get( + `${DBGATE_CLOUD_URL}/premium-promo-widget?identifier=${promoWidgetData?.identifier ?? 'nope'}&tags=${tags}` + ); + + if (!resp.data || resp.data?.state == 'unchanged') { + return; + } + + promoWidgetData = resp.data; + await fs.writeFile(path.join(datadir(), 'promo-widget.json'), JSON.stringify(promoWidgetData, null, 2)); + + socket.emitChanged(`promo-widget-changed`); +} + async function refreshPublicFiles(isRefresh) { if (!cloudFiles) { await loadCloudFiles(); @@ -268,6 +293,9 @@ async function refreshPublicFiles(isRefresh) { } catch (err) { logger.error(extractErrorLogData(err), 'DBGM-00166 Error updating cloud files'); } + if (!isProApp()) { + await updatePremiumPromoWidget(); + } } async function callCloudApiGet(endpoint, signinHolder = null, additionalHeaders = {}) { @@ -432,6 +460,10 @@ async function getPublicIpInfo() { } } +function getPromoWidgetData() { + return promoWidgetData; +} + module.exports = { createDbGateIdentitySession, startCloudTokenChecking, @@ -449,4 +481,5 @@ module.exports = { readCloudTokenHolder, readCloudTestTokenHolder, getPublicIpInfo, + getPromoWidgetData, }; diff --git a/packages/web/src/utility/metadataLoaders.ts b/packages/web/src/utility/metadataLoaders.ts index cb975fc47..997d53e27 100644 --- a/packages/web/src/utility/metadataLoaders.ts +++ b/packages/web/src/utility/metadataLoaders.ts @@ -183,12 +183,16 @@ const cloudContentListLoader = () => ({ params: {}, reloadTrigger: { key: `cloud-content-changed` }, }); - const teamFilesLoader = () => ({ url: 'team-files/list', params: {}, reloadTrigger: { key: `team-files-changed` }, }); +const promoWidgetLoader = () => ({ + url: 'cloud/premium-promo-widget', + params: {}, + reloadTrigger: { key: `promo-widget-changed` }, +}); async function getCore(loader, args) { const { url, params, reloadTrigger, transform, onLoaded, errorValue } = loader(args); @@ -536,3 +540,10 @@ export function getTeamFiles(args) { export function useTeamFiles(args) { return useCore(teamFilesLoader, args); } + +export function getPromoWidget(args) { + return getCore(promoWidgetLoader, args); +} +export function usePromoWidget(args) { + return useCore(promoWidgetLoader, args); +} From 5bdf072cdfff1f020569d9defbc4f6aed9152d1d Mon Sep 17 00:00:00 2001 From: "SPRINX0\\prochazka" Date: Mon, 20 Oct 2025 12:54:24 +0200 Subject: [PATCH 2/4] promo widget validity --- packages/api/src/controllers/cloud.js | 9 ++++++++- packages/api/src/utility/cloudIntf.js | 8 +++++++- packages/web/src/widgets/WidgetIconPanel.svelte | 5 ++++- 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/packages/api/src/controllers/cloud.js b/packages/api/src/controllers/cloud.js index fe1dfd36b..4eb72caee 100644 --- a/packages/api/src/controllers/cloud.js +++ b/packages/api/src/controllers/cloud.js @@ -286,7 +286,14 @@ module.exports = { premiumPromoWidget_meta: true, async premiumPromoWidget() { - return getPromoWidgetData(); + const data = getPromoWidgetData(); + if (data?.state != 'data') { + return null; + } + if (data.validTo && new Date().getTime() > new Date(data.validTo).getTime()) { + return null; + } + return data; }, // chatStream_meta: { diff --git a/packages/api/src/utility/cloudIntf.js b/packages/api/src/utility/cloudIntf.js index 2decd76ff..9b3286768 100644 --- a/packages/api/src/utility/cloudIntf.js +++ b/packages/api/src/utility/cloudIntf.js @@ -271,7 +271,13 @@ async function updatePremiumPromoWidget() { const tags = (await collectCloudFilesSearchTags()).join(','); const resp = await axios.default.get( - `${DBGATE_CLOUD_URL}/premium-promo-widget?identifier=${promoWidgetData?.identifier ?? 'nope'}&tags=${tags}` + `${DBGATE_CLOUD_URL}/premium-promo-widget?identifier=${promoWidgetData?.identifier ?? 'empty'}&tags=${tags}`, + { + headers: { + ...(await getCloudInstanceHeaders()), + 'x-app-version': currentVersion.version, + }, + } ); if (!resp.data || resp.data?.state == 'unchanged') { diff --git a/packages/web/src/widgets/WidgetIconPanel.svelte b/packages/web/src/widgets/WidgetIconPanel.svelte index ad5c41975..17e0922fe 100644 --- a/packages/web/src/widgets/WidgetIconPanel.svelte +++ b/packages/web/src/widgets/WidgetIconPanel.svelte @@ -20,11 +20,14 @@ import { showModal } from '../modals/modalTools'; import NewObjectModal from '../modals/NewObjectModal.svelte'; import openNewTab from '../utility/openNewTab'; + import { usePromoWidget } from '../utility/metadataLoaders'; let domSettings; let domCloudAccount; let domMainMenu; + const promoWidget = usePromoWidget({}); + const widgets = [ getCurrentConfig().storageDatabase && { icon: 'icon admin', @@ -169,7 +172,7 @@ {/if} {#each widgets .filter(x => x && hasPermission(`widgets/${x.name}`)) - .filter(x => !x.isPremiumPromo || !isProApp()) + .filter(x => !x.isPremiumPromo || (!isProApp() && $promoWidget?.state == 'data')) // .filter(x => !x.isPremiumOnly || isProApp()) .filter(x => x.name != 'cloud-private' || $cloudSigninTokenHolder) as item}
Date: Mon, 20 Oct 2025 14:00:59 +0200 Subject: [PATCH 3/4] dynamic promo widget data --- .../widgets/AdminPremiumPromoWidget.svelte | 56 ++----------------- 1 file changed, 6 insertions(+), 50 deletions(-) diff --git a/packages/web/src/widgets/AdminPremiumPromoWidget.svelte b/packages/web/src/widgets/AdminPremiumPromoWidget.svelte index b6717c27c..d3f80daed 100644 --- a/packages/web/src/widgets/AdminPremiumPromoWidget.svelte +++ b/packages/web/src/widgets/AdminPremiumPromoWidget.svelte @@ -1,59 +1,15 @@ - - + {#if $promoWidget?.state == 'data'} + + {/if}