@designcrowd/library.brand-page 5.16.28 → 5.16.29-pre-temp-13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. package/lib/src/{CreatedOnBrandCrowd-de-de-C-CdtuLf.js → CreatedOnBrandCrowd-de-de-C5cvDYY0.js} +1 -1
  2. package/lib/src/{CreatedOnBrandCrowd-en-us-DrL7aiqj.js → CreatedOnBrandCrowd-en-us-D0KCSK_6.js} +1 -1
  3. package/lib/src/{CreatedOnBrandCrowd-es-es-DDJFsUyp.js → CreatedOnBrandCrowd-es-es-BtlaguF9.js} +1 -1
  4. package/lib/src/{CreatedOnBrandCrowd-fr-fr-Dv8j7UDI.js → CreatedOnBrandCrowd-fr-ca-RGdnURaa.js} +1 -1
  5. package/lib/src/{CreatedOnBrandCrowd-fr-ca-Dv8j7UDI.js → CreatedOnBrandCrowd-fr-fr-RGdnURaa.js} +1 -1
  6. package/lib/src/{CreatedOnBrandCrowd-pt-pt-Dp52qW0V.js → CreatedOnBrandCrowd-pt-br-BJwt5ATI.js} +1 -1
  7. package/lib/src/{CreatedOnBrandCrowd-pt-br-Dp52qW0V.js → CreatedOnBrandCrowd-pt-pt-BJwt5ATI.js} +1 -1
  8. package/lib/src/{CreatedOnDcom-de-de-Df9pkq3U.js → CreatedOnDcom-de-de-LUA5Wvy5.js} +1 -1
  9. package/lib/src/{CreatedOnDcom-en-us-DqHPayYQ.js → CreatedOnDcom-en-us-Dd1UPBVq.js} +1 -1
  10. package/lib/src/{CreatedOnDcom-es-es-BcyOZFjl.js → CreatedOnDcom-es-es-CD923NVo.js} +1 -1
  11. package/lib/src/{CreatedOnDcom-fr-ca-DdjkYDpz.js → CreatedOnDcom-fr-ca-C6Mc--2a.js} +1 -1
  12. package/lib/src/{CreatedOnDcom-fr-fr-B3v0x4gQ.js → CreatedOnDcom-fr-fr-Ffrd6Erx.js} +1 -1
  13. package/lib/src/{CreatedOnDcom-pt-br-DJe-M_Ue.js → CreatedOnDcom-pt-br-BfoY5gWJ.js} +1 -1
  14. package/lib/src/{CreatedOnDcom-pt-pt-B1aOyZ5I.js → CreatedOnDcom-pt-pt-f0ywi387.js} +1 -1
  15. package/lib/src/brand-page-maker/components/brand-page-maker/BrandPageMakerTemplateSettings.mixin.js +2 -5
  16. package/lib/src/brand-page-maker/components/template-preview/TemplatePreview.mixin.js +4 -4
  17. package/lib/src/brand-page-maker/composables/useEventTracker.d.ts +6 -0
  18. package/lib/src/brand-page-maker/composables/useEventTracker.js +6 -0
  19. package/lib/src/brand-page-maker/constants/template-constants.d.ts +1 -2
  20. package/lib/src/brand-page-maker/constants/template-constants.js +1 -2
  21. package/lib/src/brand-page-maker/stores/brandpage-maker/brandpage-maker-store.js +21 -0
  22. package/lib/src/brand-page-maker/utils/rich-text-editor.util.js +10 -2
  23. package/lib/src/{bundled-translations-DAA_muNW.js → bundled-translations-CMyG8Azk.js} +54 -54
  24. package/lib/src/{bundled-translations.de-DE-DmZSAEA4.js → bundled-translations.de-DE-BJPw07Ba.js} +36 -36
  25. package/lib/src/{bundled-translations.es-ES-CGUGm_zy.js → bundled-translations.es-ES-DqQ7zLxJ.js} +58 -58
  26. package/lib/src/{bundled-translations.fr-CA-UkcZ1_qS.js → bundled-translations.fr-CA-2dy4OokC.js} +47 -47
  27. package/lib/src/{bundled-translations.fr-FR-D43nbl6A.js → bundled-translations.fr-FR-Bjh3iNSg.js} +25 -25
  28. package/lib/src/{bundled-translations.pt-BR-B0o-8NGd.js → bundled-translations.pt-BR-BRC_B0LW.js} +13 -13
  29. package/lib/src/{bundled-translations.pt-PT-Cx-eIl9m.js → bundled-translations.pt-PT-Ka3E8T1F.js} +56 -56
  30. package/lib/src/bundles/bundled-translations.de-DE.json +13 -1
  31. package/lib/src/bundles/bundled-translations.es-ES.json +13 -1
  32. package/lib/src/bundles/bundled-translations.fr-CA.json +13 -1
  33. package/lib/src/bundles/bundled-translations.fr-FR.json +13 -1
  34. package/lib/src/bundles/bundled-translations.json +13 -1
  35. package/lib/src/bundles/bundled-translations.pt-BR.json +13 -1
  36. package/lib/src/bundles/bundled-translations.pt-PT.json +13 -1
  37. package/lib/src/clients/design-template-client.d.ts +2 -0
  38. package/lib/src/clients/fabric-render-client.d.ts +3 -0
  39. package/lib/src/css/library.brand-page-brandCrowd.min.css +69 -20
  40. package/lib/src/css/library.brand-page-brandPage.min.css +69 -20
  41. package/lib/src/css/library.brand-page-designCom.min.css +69 -20
  42. package/lib/src/css/library.brand-page-preview.min.css +69 -20
  43. package/lib/src/index.d.ts +1 -1
  44. package/lib/src/index.mjs +92 -92
  45. package/lib/src/{lib-5LK-vR4z.js → lib-BcLmSEKI.js} +17326 -17136
  46. package/lib/src/lib.js +1 -1
  47. package/lib/src/shared/logo-settings/components/EditLogoSettings.mixin.d.ts +10 -0
  48. package/lib/src/shared/logo-settings/components/LogoSettings.mixin.d.ts +10 -0
  49. package/lib/src/shared/logo-settings/store/editable-logo-store.d.ts +14 -0
  50. package/lib/src/shared/logo-settings/store/editable-logo-store.js +46 -0
  51. package/lib/src/shared/page-settings/components/page-settings-section-styles/PageSettingsSectionStyles.mixin.d.ts +10 -0
  52. package/lib/src/shared/template-settings/components/TemplatesSettings.mixin.d.ts +1 -0
  53. package/lib/src/shared/template-settings/components/TemplatesSettings.mixin.js +33 -0
  54. package/lib/src/shared/template-settings/store/template-settings-store.js +57 -9
  55. package/package.json +2 -2
  56. package/src/brand-page-maker/components/brand-page-maker/BrandPageMakerTemplateSettings.mixin.ts +1 -6
  57. package/src/brand-page-maker/components/template-preview/TemplatePreview.mixin.ts +4 -4
  58. package/src/brand-page-maker/composables/useEventTracker.ts +8 -0
  59. package/src/brand-page-maker/constants/template-constants.ts +1 -2
  60. package/src/brand-page-maker/stores/brandpage-maker/brandpage-maker-store.ts +24 -0
  61. package/src/brand-page-maker/utils/rich-text-editor.util.ts +11 -2
  62. package/src/bundles/bundled-translations.de-DE.json +13 -1
  63. package/src/bundles/bundled-translations.es-ES.json +13 -1
  64. package/src/bundles/bundled-translations.fr-CA.json +13 -1
  65. package/src/bundles/bundled-translations.fr-FR.json +13 -1
  66. package/src/bundles/bundled-translations.json +13 -1
  67. package/src/bundles/bundled-translations.pt-BR.json +13 -1
  68. package/src/bundles/bundled-translations.pt-PT.json +13 -1
  69. package/src/clients/design-template-client.ts +2 -0
  70. package/src/clients/fabric-render-client.ts +3 -0
  71. package/src/lib.ts +1 -0
  72. package/src/shared/content-settings/components/generate-ai-modal/GenerateAiModal.vue +209 -12
  73. package/src/shared/content-settings/components/generate-ai-modal/i18n/generate-ai.de-DE.json +13 -1
  74. package/src/shared/content-settings/components/generate-ai-modal/i18n/generate-ai.es-ES.json +13 -1
  75. package/src/shared/content-settings/components/generate-ai-modal/i18n/generate-ai.fr-CA.json +13 -1
  76. package/src/shared/content-settings/components/generate-ai-modal/i18n/generate-ai.fr-FR.json +13 -1
  77. package/src/shared/content-settings/components/generate-ai-modal/i18n/generate-ai.json +13 -1
  78. package/src/shared/content-settings/components/generate-ai-modal/i18n/generate-ai.pt-BR.json +13 -1
  79. package/src/shared/content-settings/components/generate-ai-modal/i18n/generate-ai.pt-PT.json +13 -1
  80. package/src/shared/logo-settings/store/editable-logo-store.ts +67 -0
  81. package/src/shared/template-settings/components/TemplatesSettings.mixin.ts +46 -0
  82. package/src/shared/template-settings/store/template-settings-store.ts +78 -10
package/lib/src/lib.js CHANGED
@@ -26,7 +26,7 @@ export { default as SensitiveContentModal } from './brand-page/components/sensit
26
26
  // functions
27
27
  export { getBrandPageViewModelFromBrandPageModel, migrateBrandPageModel, } from './brand-page/utils';
28
28
  export * as brandPageUtils from './brand-page/utils';
29
- export { getOptimalLogoSize, calculateOptimizedLogoDimensions, } from './brand-page/utils/logo.util';
29
+ export { getOptimalLogoSize, calculateOptimizedLogoDimensions, applyLogoImageBase64UrlToBrandPageTemplateModel, } from './brand-page/utils/logo.util';
30
30
  export { sanitizeRTEHtml } from './brand-page-maker/utils';
31
31
  export { getPageSlugFromPageTitle } from './brand-page-maker/utils/slug.util';
32
32
  // stores
@@ -81,6 +81,14 @@ declare const _default: import("vue").DefineComponent<{}, {
81
81
  variationType: string | undefined;
82
82
  width: number;
83
83
  height: number;
84
+ expiryDate?: string | undefined;
85
+ s3Token?: string | undefined;
86
+ logoTheme?: {
87
+ backgroundColors: string[];
88
+ textColors: string[];
89
+ textOpacities: number[];
90
+ textValues: any;
91
+ } | undefined;
84
92
  }[];
85
93
  logoTemplateMetadata: string;
86
94
  isLogoDraftSaved: boolean;
@@ -105,6 +113,8 @@ declare const _default: import("vue").DefineComponent<{}, {
105
113
  updateEditableLogoImageByVariationAsync(editableLogoVariation: import("../store/editable-logo-store").EditableLogoVariation, defaultPrimaryText?: string | undefined): Promise<import("../../../clients/fabric-render-client").ModifyLogoDataResponse | null>;
106
114
  getDraftMetadata(logoDraftToken: string): string | undefined;
107
115
  upsertDraftMetadata(metadata: string): void;
116
+ isS3TokenExpired(expiryDate: string | undefined): boolean;
117
+ refreshS3TokenIfExpiredAsync(logoVariation: number): Promise<boolean>;
108
118
  postEditableLogoRequestAsync(payload: {
109
119
  returnJson: boolean;
110
120
  dimensionType: string;
@@ -253,6 +253,14 @@ declare const _default: import("vue").DefineComponent<{}, {
253
253
  variationType: string | undefined;
254
254
  width: number;
255
255
  height: number;
256
+ expiryDate?: string | undefined;
257
+ s3Token?: string | undefined;
258
+ logoTheme?: {
259
+ backgroundColors: string[];
260
+ textColors: string[];
261
+ textOpacities: number[];
262
+ textValues: any;
263
+ } | undefined;
256
264
  }[];
257
265
  logoTemplateMetadata: string;
258
266
  isLogoDraftSaved: boolean;
@@ -277,6 +285,8 @@ declare const _default: import("vue").DefineComponent<{}, {
277
285
  updateEditableLogoImageByVariationAsync(editableLogoVariation: import("../store").EditableLogoVariation, defaultPrimaryText?: string | undefined): Promise<import("../../../clients/fabric-render-client").ModifyLogoDataResponse | null>;
278
286
  getDraftMetadata(logoDraftToken: string): string | undefined;
279
287
  upsertDraftMetadata(metadata: string): void;
288
+ isS3TokenExpired(expiryDate: string | undefined): boolean;
289
+ refreshS3TokenIfExpiredAsync(logoVariation: number): Promise<boolean>;
280
290
  postEditableLogoRequestAsync(payload: {
281
291
  returnJson: boolean;
282
292
  dimensionType: string;
@@ -1,4 +1,5 @@
1
1
  import { type ModifyLogoDataResponse } from '../../../clients/fabric-render-client';
2
+ import { type FabricLogoTheme } from '../../../brand-page';
2
3
  export interface GradientObject {
3
4
  type: string;
4
5
  angle: number | undefined;
@@ -60,6 +61,9 @@ export interface EditableLogoVariation {
60
61
  variationType: string | undefined;
61
62
  width: number;
62
63
  height: number;
64
+ expiryDate?: string;
65
+ s3Token?: string;
66
+ logoTheme?: FabricLogoTheme;
63
67
  }
64
68
  export interface EditableLogoState {
65
69
  enableEditMode: boolean;
@@ -151,6 +155,14 @@ export declare const useUiEditableLogoStore: import("pinia").StoreDefinition<"ui
151
155
  variationType: string | undefined;
152
156
  width: number;
153
157
  height: number;
158
+ expiryDate?: string | undefined;
159
+ s3Token?: string | undefined;
160
+ logoTheme?: {
161
+ backgroundColors: string[];
162
+ textColors: string[];
163
+ textOpacities: number[];
164
+ textValues: any;
165
+ } | undefined;
154
166
  }[];
155
167
  logoTemplateMetadata: string;
156
168
  isLogoDraftSaved: boolean;
@@ -175,6 +187,8 @@ export declare const useUiEditableLogoStore: import("pinia").StoreDefinition<"ui
175
187
  updateEditableLogoImageByVariationAsync(editableLogoVariation: EditableLogoVariation, defaultPrimaryText?: string): Promise<ModifyLogoDataResponse | null>;
176
188
  getDraftMetadata(logoDraftToken: string): string | undefined;
177
189
  upsertDraftMetadata(metadata: string): void;
190
+ isS3TokenExpired(expiryDate: string | undefined): boolean;
191
+ refreshS3TokenIfExpiredAsync(logoVariation: number): Promise<boolean>;
178
192
  postEditableLogoRequestAsync(payload: {
179
193
  returnJson: boolean;
180
194
  dimensionType: string;
@@ -19,6 +19,9 @@ export const useUiEditableLogoStore = defineStore('uiEditableLogo', {
19
19
  variationType: undefined,
20
20
  width: 0,
21
21
  height: 0,
22
+ expiryDate: undefined,
23
+ s3Token: undefined,
24
+ logoTheme: undefined,
22
25
  },
23
26
  {
24
27
  variationId: LOGO_VARIATION.LOGO_WITH_BACKGROUND,
@@ -27,6 +30,9 @@ export const useUiEditableLogoStore = defineStore('uiEditableLogo', {
27
30
  variationType: undefined,
28
31
  width: 0,
29
32
  height: 0,
33
+ expiryDate: undefined,
34
+ s3Token: undefined,
35
+ logoTheme: undefined,
30
36
  },
31
37
  {
32
38
  variationId: LOGO_VARIATION.LOGO_ONLY_WITH_TRANSPARENT_BACKGROUND,
@@ -35,6 +41,9 @@ export const useUiEditableLogoStore = defineStore('uiEditableLogo', {
35
41
  variationType: LOGO_VARIATION_TYPES.ICON_TRANSPARENT_BACKGROUND_ONLY,
36
42
  width: 0,
37
43
  height: 0,
44
+ expiryDate: undefined,
45
+ s3Token: undefined,
46
+ logoTheme: undefined,
38
47
  },
39
48
  {
40
49
  variationId: LOGO_VARIATION.TEXT_ONLY_WITH_TRANSPARENT_BACKGROUND,
@@ -43,6 +52,9 @@ export const useUiEditableLogoStore = defineStore('uiEditableLogo', {
43
52
  variationType: LOGO_VARIATION_TYPES.TEXT_TRANSPARENT_BACKGROUND_ONLY,
44
53
  width: 0,
45
54
  height: 0,
55
+ expiryDate: undefined,
56
+ s3Token: undefined,
57
+ logoTheme: undefined,
46
58
  },
47
59
  ],
48
60
  logoEdits: {
@@ -254,6 +266,9 @@ export const useUiEditableLogoStore = defineStore('uiEditableLogo', {
254
266
  editableLogoVariation.base64 = result.base64;
255
267
  editableLogoVariation.width = result.width;
256
268
  editableLogoVariation.height = result.height;
269
+ editableLogoVariation.expiryDate = result.expiryDate;
270
+ editableLogoVariation.s3Token = result.s3Token;
271
+ editableLogoVariation.logoTheme = result.logoTheme;
257
272
  return result;
258
273
  },
259
274
  getDraftMetadata(logoDraftToken) {
@@ -278,10 +293,41 @@ export const useUiEditableLogoStore = defineStore('uiEditableLogo', {
278
293
  });
279
294
  }
280
295
  },
296
+ isS3TokenExpired(expiryDate) {
297
+ if (!expiryDate) {
298
+ return true;
299
+ }
300
+ const expiryTime = new Date(expiryDate).getTime();
301
+ const currentTime = Date.now();
302
+ // Add a 5-minute buffer to refresh before actual expiry
303
+ const bufferMs = 5 * 60 * 1000;
304
+ return currentTime >= expiryTime - bufferMs;
305
+ },
306
+ async refreshS3TokenIfExpiredAsync(logoVariation) {
307
+ const editableLogoVariation = this.editableLogoVariations[logoVariation];
308
+ if (!editableLogoVariation) {
309
+ return false;
310
+ }
311
+ const isExpired = this.isS3TokenExpired(editableLogoVariation.expiryDate);
312
+ if (isExpired) {
313
+ const logoStore = useLogoStore();
314
+ // Only refresh if logo template asset is available
315
+ if (!logoStore.logoTemplateAsset?.token) {
316
+ if (process.env.NODE_ENV !== 'production') {
317
+ console.warn('Cannot refresh expired S3 token: logo template asset not available');
318
+ }
319
+ return false;
320
+ }
321
+ await this.updateEditableLogoImageUrlAsync();
322
+ return true;
323
+ }
324
+ return false;
325
+ },
281
326
  async postEditableLogoRequestAsync(payload) {
282
327
  const logoStore = useLogoStore();
283
328
  const body = {
284
329
  returnJson: payload?.returnJson || false,
330
+ generateS3Url: true,
285
331
  dimensionsType: payload?.dimensionType,
286
332
  variation: payload?.variationType,
287
333
  primaryText: payload?.defaultPrimaryText,
@@ -4191,6 +4191,14 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
4191
4191
  variationType: string | undefined;
4192
4192
  width: number;
4193
4193
  height: number;
4194
+ expiryDate?: string | undefined;
4195
+ s3Token?: string | undefined;
4196
+ logoTheme?: {
4197
+ backgroundColors: string[];
4198
+ textColors: string[];
4199
+ textOpacities: number[];
4200
+ textValues: any;
4201
+ } | undefined;
4194
4202
  }[];
4195
4203
  logoTemplateMetadata: string;
4196
4204
  isLogoDraftSaved: boolean;
@@ -4215,6 +4223,8 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
4215
4223
  updateEditableLogoImageByVariationAsync(editableLogoVariation: import("../../../logo-settings/store/editable-logo-store").EditableLogoVariation, defaultPrimaryText?: string | undefined): Promise<import("../../../../clients/fabric-render-client").ModifyLogoDataResponse | null>;
4216
4224
  getDraftMetadata(logoDraftToken: string): string | undefined;
4217
4225
  upsertDraftMetadata(metadata: string): void;
4226
+ isS3TokenExpired(expiryDate: string | undefined): boolean;
4227
+ refreshS3TokenIfExpiredAsync(logoVariation: number): Promise<boolean>;
4218
4228
  postEditableLogoRequestAsync(payload: {
4219
4229
  returnJson: boolean;
4220
4230
  dimensionType: string;
@@ -601,6 +601,7 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
601
601
  tabMenuClasses(): string;
602
602
  visibleTabs(): any;
603
603
  }, {
604
+ checkAndRefreshS3TokenIfExpired(): Promise<void>;
604
605
  onNextClicked(): Promise<void>;
605
606
  onPreviousClicked(): Promise<void>;
606
607
  internalOnTemplateSelected(templateId: string): Promise<void>;
@@ -6,6 +6,8 @@ import { debounce } from '../../functions';
6
6
  import { useBrandPageContainerStore, useBrandPageMakerStore, useUiStore, } from '../../../brand-page-maker/stores';
7
7
  import { templateSettingsTr } from '../../../composables/useTranslate';
8
8
  import { useEventTracker } from '../../../brand-page-maker/composables/useEventTracker';
9
+ import { useUiEditableLogoStore, useUiLogoSettingsStore, } from '../../logo-settings/store';
10
+ import { useLogoStore } from '../../../brand-page-maker/stores/logo-store';
9
11
  export default defineComponent({
10
12
  props: {
11
13
  numColumns: {
@@ -107,6 +109,8 @@ export default defineComponent({
107
109
  },
108
110
  },
109
111
  async mounted() {
112
+ // Check and refresh S3 token if expired before loading templates
113
+ await this.checkAndRefreshS3TokenIfExpired();
110
114
  // load templates on mounted if it is not initialised
111
115
  if (!this.pageCount) {
112
116
  await this.templateSettingsStore.loadPageNo({
@@ -118,6 +122,35 @@ export default defineComponent({
118
122
  this.debounceOnSearch = debounce(this.setSearchText, 500);
119
123
  },
120
124
  methods: {
125
+ async checkAndRefreshS3TokenIfExpired() {
126
+ const brandPageMakerContainerStore = useBrandPageContainerStore();
127
+ const editableLogoStore = useUiEditableLogoStore();
128
+ const logoStore = useLogoStore();
129
+ const logoSettingsStore = useUiLogoSettingsStore();
130
+ // Only check for non-admin (pre-purchase) and non-BYO logos
131
+ if (brandPageMakerContainerStore.isAdmin) {
132
+ return;
133
+ }
134
+ const isByo = logoStore.logoTemplateAsset?.isByo ?? false;
135
+ if (isByo) {
136
+ return;
137
+ }
138
+ const logoVariation = logoSettingsStore.selectedLogoImage.logoVariation;
139
+ if (logoVariation === undefined) {
140
+ return;
141
+ }
142
+ try {
143
+ const wasRefreshed = await editableLogoStore.refreshS3TokenIfExpiredAsync(logoVariation);
144
+ if (wasRefreshed && process.env.NODE_ENV !== 'production') {
145
+ console.log('S3 token was expired in TemplatesSettings and has been refreshed');
146
+ }
147
+ }
148
+ catch (error) {
149
+ if (process.env.NODE_ENV !== 'production') {
150
+ console.error('Error checking/refreshing S3 token:', error);
151
+ }
152
+ }
153
+ },
121
154
  async onNextClicked() {
122
155
  if (!this.isLoadMoreBtnEnabled) {
123
156
  return;
@@ -3,12 +3,12 @@ import * as DesignTemplateClient from '../../../clients/design-template-client';
3
3
  import {} from '../../../clients/models';
4
4
  import { BP_DEFAULT_TEMPLATE_TYPE_NAME, SIDE_BAR_TAB_NAMES, } from '../../../brand-page-maker/constants';
5
5
  import { defineStore, storeToRefs } from 'pinia';
6
- import { useBrandPageContainerStore, useBrandPageMakerStore, useBrandPageMakerUserStore, useUiStore, } from '../../../brand-page-maker/stores';
6
+ import { useBrandPageContainerStore, useBrandPageMakerStore, useBrandPageMakerUserStore, useLogoStore, useUiStore, } from '../../../brand-page-maker/stores';
7
7
  import { useUiSideBarStore } from '../../side-bar/store';
8
8
  import { BrandPageModel } from '../../../brand-page/models';
9
9
  import { migrateBrandPageModel } from '../../../brand-page/utils';
10
10
  import { getAiContentIndexByTemplateTokenAndNumberOfVariations } from '../../../brand-page-maker/utils/ai-content-selection.util';
11
- import { useUiLogoSettingsStore } from '../../logo-settings/store';
11
+ import { useUiEditableLogoStore, useUiLogoSettingsStore, } from '../../logo-settings/store';
12
12
  import { templateSettingsTr, getCurrentLocale, } from '../../../composables/useTranslate';
13
13
  import { watch } from 'vue';
14
14
  export const DEFAULT_PAGE_SIZE = 6;
@@ -18,8 +18,7 @@ export const useUiTemplateSettingsStore = defineStore('uiTemplateSettings', {
18
18
  const brandPageContainerStore = useBrandPageContainerStore();
19
19
  const brandPageMakerUserStore = useBrandPageMakerUserStore();
20
20
  // Set renderAsImage to true if not admin AND not pre-purchase
21
- const renderAsImage = !brandPageMakerUserStore.isAdmin &&
22
- !brandPageContainerStore.isPrePurchase;
21
+ const renderAsImage = !brandPageMakerUserStore.isAdmin;
23
22
  return {
24
23
  isBusy: false,
25
24
  pageCount: 0,
@@ -144,6 +143,8 @@ export const useUiTemplateSettingsStore = defineStore('uiTemplateSettings', {
144
143
  const brandPageContainerStore = useBrandPageContainerStore();
145
144
  const brandPageMakerUserStore = useBrandPageMakerUserStore();
146
145
  const logoSettingsStore = useUiLogoSettingsStore();
146
+ const logoStore = useLogoStore();
147
+ const editableLogoStore = useUiEditableLogoStore();
147
148
  const designTemplateToken = brandPageContainerStore.designTemplateToken;
148
149
  if (brandPageMakerStore.isInitialising) {
149
150
  setTimeout(() => {
@@ -168,6 +169,20 @@ export const useUiTemplateSettingsStore = defineStore('uiTemplateSettings', {
168
169
  try {
169
170
  const designTemplateClient = DesignTemplateClient.getInstance();
170
171
  const currentLocale = getCurrentLocale();
172
+ const isByo = logoStore.logoTemplateAsset?.isByo ?? false;
173
+ const logoTemplateToken = logoStore.logoTemplateAsset?.token ?? undefined;
174
+ const logoVariation = logoSettingsStore.selectedLogoImage.logoVariation;
175
+ // Check if S3 token is expired and refresh if needed
176
+ if (!isByo) {
177
+ const wasRefreshed = await editableLogoStore.refreshS3TokenIfExpiredAsync(logoVariation);
178
+ if (wasRefreshed) {
179
+ setTimeout(() => {
180
+ this.loadPageNo({ pageNo });
181
+ }, LOAD_PAGE_RETRY_DELAY);
182
+ return;
183
+ }
184
+ }
185
+ const editableLogoVariation = editableLogoStore.editableLogoVariations[logoVariation];
171
186
  const result = await designTemplateClient.getTemplateItemsByTemplateType(this.templateType, {
172
187
  page: pageNo,
173
188
  pageSize: DEFAULT_PAGE_SIZE,
@@ -178,6 +193,8 @@ export const useUiTemplateSettingsStore = defineStore('uiTemplateSettings', {
178
193
  personalisable: this.selectedTab.key === TEMPLATE_TABS.AI,
179
194
  selectedTemplateToken: designTemplateToken,
180
195
  locale: currentLocale,
196
+ logoS3Token: !isByo ? editableLogoVariation.s3Token : undefined,
197
+ logoTemplateToken: isByo ? logoTemplateToken : undefined,
181
198
  });
182
199
  if (!result) {
183
200
  return;
@@ -185,8 +202,7 @@ export const useUiTemplateSettingsStore = defineStore('uiTemplateSettings', {
185
202
  this._setPageCount({ pageCount: result.pageCount });
186
203
  const templates = await Promise.all(result.paginatedItems.map(async (item) => {
187
204
  try {
188
- if (brandPageContainerStore.isPrePurchase ||
189
- brandPageMakerUserStore.isAdmin) {
205
+ if (brandPageMakerUserStore.isAdmin) {
190
206
  // Pre-purchase: full template with brandPageModel for live rendering
191
207
  const template = await designTemplateClient.getTemplateByTemplateToken(item.designTemplateToken);
192
208
  return this.safeMapToTemplateSettingsTemplate(template);
@@ -245,6 +261,13 @@ export const useUiTemplateSettingsStore = defineStore('uiTemplateSettings', {
245
261
  templateId: payload.templateId,
246
262
  forceApply: payload.forceApply,
247
263
  });
264
+ if (payload.forceApply) {
265
+ await this._setTemplates({
266
+ templates: [],
267
+ });
268
+ await this._setPageNoLoaded({ pageNoLoaded: 0 });
269
+ await this.loadPageNo({ pageNo: 1 });
270
+ }
248
271
  },
249
272
  async onCategorySelected(payload) {
250
273
  await this._setTemplates({
@@ -319,9 +342,11 @@ export const useUiTemplateSettingsStore = defineStore('uiTemplateSettings', {
319
342
  */
320
343
  setupLogoChangeWatcher() {
321
344
  const logoSettingsStore = useUiLogoSettingsStore();
322
- const brandPageContainerStore = useBrandPageContainerStore();
345
+ const editableLogoStore = useUiEditableLogoStore();
323
346
  const brandPageMakerUserStore = useBrandPageMakerUserStore();
324
347
  const { selectedLogoImage } = storeToRefs(logoSettingsStore);
348
+ const { editableLogoVariations } = storeToRefs(editableLogoStore);
349
+ let s3TokenDebounceTimer = null;
325
350
  // Watch for changes to logoImage (token or variation changes)
326
351
  watch(() => selectedLogoImage.value, async (newLogoImage, oldLogoImage) => {
327
352
  // Skip initial load when oldLogoImage is undefined
@@ -331,8 +356,7 @@ export const useUiTemplateSettingsStore = defineStore('uiTemplateSettings', {
331
356
  // Only refetch for post-purchase users and when logo actually changes
332
357
  const hasLogoChanged = newLogoImage.logoDraftToken !== oldLogoImage.logoDraftToken ||
333
358
  newLogoImage.logoVariation !== oldLogoImage.logoVariation;
334
- if (!brandPageContainerStore.isPrePurchase &&
335
- !brandPageMakerUserStore.isAdmin &&
359
+ if (!brandPageMakerUserStore.isAdmin &&
336
360
  newLogoImage.logoDraftToken &&
337
361
  hasLogoChanged) {
338
362
  // Reset templates state and reload with new logo
@@ -343,6 +367,30 @@ export const useUiTemplateSettingsStore = defineStore('uiTemplateSettings', {
343
367
  await this.loadPageNo({ pageNo: 1 });
344
368
  }
345
369
  }, { deep: true });
370
+ // Watch for S3 token changes (when user edits logo colors, text, etc.)
371
+ // Debounced to avoid excessive reloads during rapid edits
372
+ watch(() => editableLogoVariations.value[selectedLogoImage.value.logoVariation]
373
+ ?.s3Token, async (newS3Token, oldS3Token) => {
374
+ if (s3TokenDebounceTimer) {
375
+ clearTimeout(s3TokenDebounceTimer);
376
+ }
377
+ if (!oldS3Token) {
378
+ return;
379
+ }
380
+ if (newS3Token === oldS3Token) {
381
+ return;
382
+ }
383
+ if (brandPageMakerUserStore.isAdmin) {
384
+ return;
385
+ }
386
+ // Debounce the reload by 500ms to avoid rapid successive reloads
387
+ s3TokenDebounceTimer = setTimeout(async () => {
388
+ await this._setTemplates({ templates: [] });
389
+ await this._setPageNoLoaded({ pageNoLoaded: 0 });
390
+ await this._setPageNo({ pageNo: 1 });
391
+ await this.loadPageNo({ pageNo: 1 });
392
+ }, 500);
393
+ });
346
394
  },
347
395
  },
348
396
  });
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@designcrowd/library.brand-page",
3
3
  "description": "A collection of Maker/Designer applications",
4
- "version": "5.16.28",
4
+ "version": "5.16.29-pre-temp-13",
5
5
  "author": "Design.com Eng",
6
6
  "license": "UNLICENSED",
7
7
  "type": "module",
@@ -12,7 +12,7 @@
12
12
  "src"
13
13
  ],
14
14
  "scripts": {
15
- "dev": "nuxt dev nuxtapp",
15
+ "dev": "export NODE_TLS_REJECT_UNAUTHORIZED=0 && nuxt dev nuxtapp",
16
16
  "dev:dcom": "export tailwindTheme=designCom && nuxt dev nuxtapp",
17
17
  "docker:publish": "docker build -t bp-maker:latest . --file ./build/Dockerfile.brand-page-lib-publish --build-arg NPM_TOKEN=$NPM_TOKEN --no-cache && cross-env NPM_TOKEN=",
18
18
  "lint": "eslint . && tsc --project tsconfig.lint.json --noEmit",
@@ -4,7 +4,6 @@ import {
4
4
  DESKTOP_WIDTH,
5
5
  MOBILE_HEIGHT,
6
6
  MOBILE_WIDTH,
7
- MOBILE_HEIGHT_POST_PURCHASE,
8
7
  } from '../../constants';
9
8
  import {
10
9
  useBrandPageMakerStore,
@@ -36,11 +35,7 @@ export default defineComponent({
36
35
  },
37
36
 
38
37
  height(): number {
39
- if (this.isBrandSite) {
40
- return DESKTOP_HEIGHT;
41
- }
42
-
43
- return this.isPrePurchase ? MOBILE_HEIGHT : MOBILE_HEIGHT_POST_PURCHASE;
38
+ return this.isBrandSite ? DESKTOP_HEIGHT : MOBILE_HEIGHT;
44
39
  },
45
40
  },
46
41
  });
@@ -265,7 +265,7 @@ export default defineComponent({
265
265
  },
266
266
  watch: {
267
267
  template() {
268
- if (this.isAdmin || this.isPrePurchase) {
268
+ if (this.isAdmin) {
269
269
  this.updateViewModel();
270
270
  } else {
271
271
  // Reset loading state when template changes for image-based previews
@@ -275,7 +275,7 @@ export default defineComponent({
275
275
  },
276
276
  logoTheme: {
277
277
  handler() {
278
- if (this.isAdmin || this.isPrePurchase) {
278
+ if (this.isAdmin) {
279
279
  this.updateViewModel();
280
280
  }
281
281
  },
@@ -283,7 +283,7 @@ export default defineComponent({
283
283
  },
284
284
  previewImageUrl() {
285
285
  // Reset loading state whenever the preview URL changes
286
- if (!this.isAdmin && !this.isPrePurchase) {
286
+ if (!this.isAdmin) {
287
287
  this.imageLoading = true;
288
288
  this.imageLoadError = false;
289
289
  }
@@ -353,7 +353,7 @@ export default defineComponent({
353
353
 
354
354
  async updateViewModel(forceUpdate = true) {
355
355
  // Only update view model for admin or pre-purchase mode
356
- if (!this.isAdmin && !this.isPrePurchase) {
356
+ if (!this.isAdmin) {
357
357
  return;
358
358
  }
359
359
 
@@ -60,6 +60,8 @@ export const EVENTS = {
60
60
  WEBSITE_MAKER_AI_STOP_GENERATION: 'website_maker_ai_stop_generation',
61
61
  WEBSITE_SAVE_CONTACT: 'website_save_contact',
62
62
  WEBSITE_START_FOR_FREE: 'website_start_for_free',
63
+ WEBSITE_MAKER_AI_CLICK_SUGGESTED_PROMPT:
64
+ 'website_maker_ai_click_suggested_prompt',
63
65
  };
64
66
 
65
67
  export const SELECT_LOCATIONS = {
@@ -92,6 +94,12 @@ export const GENERATE_AI_TEXT_CTA_LOCATIONS = {
92
94
  TESTIMONIAL_ITEM: 'testimonial_item',
93
95
  };
94
96
 
97
+ export const GENERATE_AI_SUGGESTED_PROMPT = {
98
+ GENERATE_TEXT: 'generate_text',
99
+ IMPROVE_TEXT: 'improve_text',
100
+ SPELL_CHECK: 'spell_check',
101
+ };
102
+
95
103
  export const TRIGGER_TYPE = {
96
104
  AUTOMATIC: 'automatic',
97
105
  USER_TRIGGERED: 'user_triggered',
@@ -1,5 +1,4 @@
1
- export const MOBILE_HEIGHT = 734;
2
- export const MOBILE_HEIGHT_POST_PURCHASE = 636;
1
+ export const MOBILE_HEIGHT = 636;
3
2
  export const MOBILE_WIDTH = 358;
4
3
 
5
4
  export const DESKTOP_HEIGHT = 600;
@@ -100,6 +100,7 @@ import { commonTr, errorTr } from '../../../composables/useTranslate';
100
100
  import { UPGRADE_CTA_LOCATIONS } from '../../composables/useEventTracker';
101
101
  import { useVideoStore } from '../video';
102
102
  import { findValuesByKey } from '../../../helpers/ts.helper';
103
+ import { useLogoStore } from '../logo-store';
103
104
 
104
105
  export interface NotificationMessage {
105
106
  type: 'success' | 'warning' | 'error';
@@ -358,6 +359,8 @@ export const useBrandPageMakerStore = defineStore('brandPageMaker', {
358
359
  const userStore = useBrandPageMakerUserStore();
359
360
  const containerStore = useBrandPageContainerStore();
360
361
  const uiContentSettings = useUiContentSettingsStore();
362
+ const editableLogoStore = useUiEditableLogoStore();
363
+ const logoStore = useLogoStore();
361
364
 
362
365
  if (!this.selectedTemplateId) {
363
366
  return;
@@ -409,6 +412,27 @@ export const useBrandPageMakerStore = defineStore('brandPageMaker', {
409
412
  );
410
413
  }
411
414
  } else {
415
+ if (containerStore.isPrePurchase) {
416
+ if (logoStore.logoTemplateAsset?.isByo) {
417
+ if (uiStore.logoTheme)
418
+ uiStore.setLogoTheme({
419
+ logoTheme: uiStore.logoTheme,
420
+ });
421
+ } else {
422
+ const logoVariation =
423
+ logoSettingsStore.selectedLogoTemplateImage
424
+ ?.logoTemplateVersion ?? 0;
425
+ const logoTheme =
426
+ editableLogoStore.editableLogoVariations[logoVariation]
427
+ ?.logoTheme;
428
+
429
+ if (logoTheme)
430
+ uiStore.setLogoTheme({
431
+ logoTheme: parseLogoThemeToCssStyles(logoTheme),
432
+ });
433
+ }
434
+ }
435
+
412
436
  const logoImage =
413
437
  logoUtil.safeGetLogoImageFromLogoImageUrl(logoImageUrl);
414
438
 
@@ -171,12 +171,21 @@ export const getPlainTextFromRTE = (content: string): string => {
171
171
  return '';
172
172
  }
173
173
 
174
+ let plainText = content;
175
+
174
176
  // Only strip HTML tags if the value contains HTML
175
177
  if (hasRTEContent(content)) {
176
- return content.replace(/<[^>]*>/g, '').trim();
178
+ plainText = content.replace(/<[^>]*>/g, '');
179
+ }
180
+
181
+ // Decode URL-encoded characters (like %0A for line breaks)
182
+ try {
183
+ plainText = decodeURIComponent(plainText);
184
+ } catch (e) {
185
+ // If decoding fails, use the text as-is
177
186
  }
178
187
 
179
- return content.trim();
188
+ return plainText.trim();
180
189
  };
181
190
 
182
191
  export const replaceTextInRTE = (
@@ -638,7 +638,19 @@
638
638
  "generateInputPlaceholder": "Geben Sie Ihre Eingabeaufforderung ein, um den Text zu beschreiben ...",
639
639
  "stopGeneration": "Generierung anhalten",
640
640
  "useText": "Text verwenden",
641
- "promptTooLong": "Der Prompt darf maximal {{maxLength}} Zeichen lang sein ({{currentLength}})"
641
+ "promptTooLong": "Der Prompt darf maximal {{maxLength}} Zeichen lang sein ({{currentLength}})",
642
+ "generateText": "Erstellen Sie {{ location }}",
643
+ "improveText": "Meinen Text verbessern",
644
+ "spellCheck": "Rechtschreibprüfung",
645
+ "generateTextPrompt": "Schreiben Sie ein einprägsames {{fieldName}} für {{businessName}}, ein {{industry}} Unternehmen. Gestalten Sie es freundlich und einladend.",
646
+ "generateTextPromptWithIndustry": "Ein einprägsames {{fieldName}} schreiben für ein Unternehmen in der folgenden Branche: {{industry}}. Freundlich und einladend gestalten.",
647
+ "generateTextPromptWithBusinessName": "Ein einprägsames {{fieldName}} schreiben für {{businessName}}. Freundlich und einladend gestalten.",
648
+ "generateTextPromptSimple": "Ein einprägsames {{fieldName}} schreiben. Freundlich und einladend gestalten.",
649
+ "improveTextPrompt": "Diesen Text für {{businessName}} verbessern, ein Unternehmen in der folgenden Branche: {{industry}}. Natürlicher, klarer und professioneller formulieren.",
650
+ "improveTextPromptWithIndustry": "Diesen Text für {{industry}} verbessern. Natürlicher, klarer und professioneller formulieren.",
651
+ "improveTextPromptWithBusinessName": "Diesen Text für {{businessName}} verbessern. Natürlicher, klarer und professioneller formulieren.",
652
+ "improveTextPromptSimple": "Diesen Text verbessern. Natürlicher, klarer und professioneller formulieren.",
653
+ "spellCheckPrompt": "Rechtschreibung und Grammatik für diesen Text prüfen."
642
654
  },
643
655
  "googleAddressField": {
644
656
  "addressPlaceholder": "Geben Sie einen Ort ein"
@@ -638,7 +638,19 @@
638
638
  "generateInputPlaceholder": "Introduce tu mensaje para describir el texto...",
639
639
  "stopGeneration": "Detén la generación",
640
640
  "useText": "Usa texto",
641
- "promptTooLong": "El mensaje debe tener {{maxLength}} caracteres como máximo ({{currentLength}})"
641
+ "promptTooLong": "El mensaje debe tener {{maxLength}} caracteres como máximo ({{currentLength}})",
642
+ "generateText": "Genera {{ location }}",
643
+ "improveText": "Mejora mi texto",
644
+ "spellCheck": "Comprueba la ortografía",
645
+ "generateTextPrompt": "Escribe un {{fieldName}} pegadizo para {{businessName}}, un negocio {{industry}}. Hazlo amigable y acogedor.",
646
+ "generateTextPromptWithIndustry": "Escribe una {{fieldName}} que llame la atención para un negocio en el sector de {{industry}}. Haz que resulte cordial y agradable.",
647
+ "generateTextPromptWithBusinessName": "Escribe una {{fieldName}} que llame la atención para {{businessName}}. Haz que resulte cordial y agradable.",
648
+ "generateTextPromptSimple": "Escribe una {{fieldName}} que llame la atención. Haz que resulte cordial y agradable.",
649
+ "improveTextPrompt": "Mejora este texto para {{businessName}}, un negocio de {{industry}}. Haz que suene más natural, claro y profesional.",
650
+ "improveTextPromptWithIndustry": "Mejora este texto para un negocio de {{industry}}. Haz que suene más natural, claro y profesional.",
651
+ "improveTextPromptWithBusinessName": "Mejora este texto para {{businessName}}. Haz que suene más natural, claro y profesional.",
652
+ "improveTextPromptSimple": "Mejora este texto. Haz que suene más natural, claro y profesional.",
653
+ "spellCheckPrompt": "Verifica la ortografía y la gramática de este texto."
642
654
  },
643
655
  "googleAddressField": {
644
656
  "addressPlaceholder": "Introduce una ubicación"