diff --git a/packages/api/src/controllers/cloud.js b/packages/api/src/controllers/cloud.js
index d1cbc00dd..4eb72caee 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,18 @@ module.exports = {
return getAiGatewayServer();
},
+ premiumPromoWidget_meta: true,
+ async premiumPromoWidget() {
+ 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: {
// raw: true,
// method: 'post',
diff --git a/packages/api/src/utility/cloudIntf.js b/packages/api/src/utility/cloudIntf.js
index 61ff78cf1..9b3286768 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,36 @@ 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 ?? 'empty'}&tags=${tags}`,
+ {
+ headers: {
+ ...(await getCloudInstanceHeaders()),
+ 'x-app-version': currentVersion.version,
+ },
+ }
+ );
+
+ 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 +299,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 +466,10 @@ async function getPublicIpInfo() {
}
}
+function getPromoWidgetData() {
+ return promoWidgetData;
+}
+
module.exports = {
createDbGateIdentitySession,
startCloudTokenChecking,
@@ -449,4 +487,5 @@ module.exports = {
readCloudTokenHolder,
readCloudTestTokenHolder,
getPublicIpInfo,
+ getPromoWidgetData,
};
diff --git a/packages/web/src/stores.ts b/packages/web/src/stores.ts
index a89e76540..6ab382f5e 100644
--- a/packages/web/src/stores.ts
+++ b/packages/web/src/stores.ts
@@ -183,6 +183,7 @@ export const focusedConnectionOrDatabase = writable<{ conid: string; database?:
export const focusedTreeDbKey = writable<{ key: string; root: string; type: string; text: string }>(null);
export const cloudSigninTokenHolder = writableSettingsValue(null, 'cloudSigninTokenHolder');
+export const seenPremiumPromoWidget = writableWithStorage(null, 'seenPremiumPromoWidget');
export const cloudConnectionsStore = writable({});
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);
+}
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}