@datlv-trustshop/shopify-inapp-components 0.2.8 → 0.2.10
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.
- package/dist/components/AppList.d.ts +1 -0
- package/dist/components/AppList.d.ts.map +1 -0
- package/dist/components/AppList.js +1 -0
- package/dist/components/AppList.js.map +1 -0
- package/dist/components/ArticleList.d.ts +1 -0
- package/dist/components/ArticleList.d.ts.map +1 -0
- package/dist/components/ArticleList.js +1 -0
- package/dist/components/ArticleList.js.map +1 -0
- package/dist/components/ArticleSlide.d.ts +1 -0
- package/dist/components/ArticleSlide.d.ts.map +1 -0
- package/dist/components/ArticleSlide.js +1 -0
- package/dist/components/ArticleSlide.js.map +1 -0
- package/dist/components/FloatingCard.d.ts +1 -0
- package/dist/components/FloatingCard.d.ts.map +1 -0
- package/dist/components/FloatingCard.js +5 -4
- package/dist/components/FloatingCard.js.map +1 -0
- package/dist/components/FooterBanner.d.ts +1 -0
- package/dist/components/FooterBanner.d.ts.map +1 -0
- package/dist/components/FooterBanner.js +1 -0
- package/dist/components/FooterBanner.js.map +1 -0
- package/dist/components/GrowApps.d.ts +6 -6
- package/dist/components/GrowApps.d.ts.map +1 -0
- package/dist/components/GrowApps.js +11 -3
- package/dist/components/GrowApps.js.map +1 -0
- package/dist/components/ImageLoading.d.ts +1 -0
- package/dist/components/ImageLoading.d.ts.map +1 -0
- package/dist/components/ImageLoading.js +1 -0
- package/dist/components/ImageLoading.js.map +1 -0
- package/dist/components/PartnerIntegration.d.ts +8 -8
- package/dist/components/PartnerIntegration.d.ts.map +1 -0
- package/dist/components/PartnerIntegration.js +15 -76
- package/dist/components/PartnerIntegration.js.map +1 -0
- package/dist/components/PartnerList.d.ts +1 -0
- package/dist/components/PartnerList.d.ts.map +1 -0
- package/dist/components/PartnerList.js +1 -0
- package/dist/components/PartnerList.js.map +1 -0
- package/dist/components/PopupBanner.d.ts +4 -4
- package/dist/components/PopupBanner.d.ts.map +1 -0
- package/dist/components/PopupBanner.js +5 -1
- package/dist/components/PopupBanner.js.map +1 -0
- package/dist/components/TopBanner.d.ts +7 -7
- package/dist/components/TopBanner.d.ts.map +1 -0
- package/dist/components/TopBanner.js +15 -30
- package/dist/components/TopBanner.js.map +1 -0
- package/dist/components/WhatsNew.d.ts +6 -7
- package/dist/components/WhatsNew.d.ts.map +1 -0
- package/dist/components/WhatsNew.js +23 -25
- package/dist/components/WhatsNew.js.map +1 -0
- package/dist/components/index.d.ts +1 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/index.js +1 -0
- package/dist/components/index.js.map +1 -0
- package/dist/components/inlineStyles.d.ts +1 -0
- package/dist/components/inlineStyles.d.ts.map +1 -0
- package/dist/components/inlineStyles.js +1 -0
- package/dist/components/inlineStyles.js.map +1 -0
- package/dist/components/styles.d.ts +1 -0
- package/dist/components/styles.d.ts.map +1 -0
- package/dist/components/styles.js +1 -0
- package/dist/components/styles.js.map +1 -0
- package/dist/config/component-defaults.d.ts +71 -0
- package/dist/config/component-defaults.d.ts.map +1 -0
- package/dist/config/component-defaults.js +106 -0
- package/dist/config/component-defaults.js.map +1 -0
- package/dist/config/internal-config.d.ts +28 -0
- package/dist/config/internal-config.d.ts.map +1 -0
- package/dist/config/internal-config.js +100 -0
- package/dist/config/internal-config.js.map +1 -0
- package/dist/core/SDKManager.d.ts +262 -0
- package/dist/core/SDKManager.d.ts.map +1 -0
- package/dist/core/SDKManager.js +527 -0
- package/dist/core/SDKManager.js.map +1 -0
- package/dist/core/adapter.d.ts +1 -0
- package/dist/core/adapter.d.ts.map +1 -0
- package/dist/core/adapter.js +1 -0
- package/dist/core/adapter.js.map +1 -0
- package/dist/core/engine.d.ts +1 -0
- package/dist/core/engine.d.ts.map +1 -0
- package/dist/core/engine.js +1 -0
- package/dist/core/engine.js.map +1 -0
- package/dist/core/fetcher.d.ts +1 -0
- package/dist/core/fetcher.d.ts.map +1 -0
- package/dist/core/fetcher.js +1 -0
- package/dist/core/fetcher.js.map +1 -0
- package/dist/core/global-manager.d.ts +1 -0
- package/dist/core/global-manager.d.ts.map +1 -0
- package/dist/core/global-manager.js +1 -0
- package/dist/core/global-manager.js.map +1 -0
- package/dist/hooks/index.d.ts +2 -3
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +2 -3
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/useApps.d.ts +1 -0
- package/dist/hooks/useApps.d.ts.map +1 -0
- package/dist/hooks/useApps.js +10 -9
- package/dist/hooks/useApps.js.map +1 -0
- package/dist/hooks/useArticles.d.ts +1 -0
- package/dist/hooks/useArticles.d.ts.map +1 -0
- package/dist/hooks/useArticles.js +10 -14
- package/dist/hooks/useArticles.js.map +1 -0
- package/dist/hooks/useBanner.d.ts +1 -0
- package/dist/hooks/useBanner.d.ts.map +1 -0
- package/dist/hooks/useBanner.js +6 -5
- package/dist/hooks/useBanner.js.map +1 -0
- package/dist/hooks/useCampaignTracking.d.ts +1 -0
- package/dist/hooks/useCampaignTracking.d.ts.map +1 -0
- package/dist/hooks/useCampaignTracking.js +1 -0
- package/dist/hooks/useCampaignTracking.js.map +1 -0
- package/dist/hooks/useDashboard.d.ts +1 -0
- package/dist/hooks/useDashboard.d.ts.map +1 -0
- package/dist/hooks/useDashboard.js +18 -9
- package/dist/hooks/useDashboard.js.map +1 -0
- package/dist/hooks/useFloatingCards.d.ts +4 -2
- package/dist/hooks/useFloatingCards.d.ts.map +1 -0
- package/dist/hooks/useFloatingCards.js +52 -76
- package/dist/hooks/useFloatingCards.js.map +1 -0
- package/dist/hooks/usePartnerIntegration.d.ts +7 -2
- package/dist/hooks/usePartnerIntegration.d.ts.map +1 -0
- package/dist/hooks/usePartnerIntegration.js +26 -37
- package/dist/hooks/usePartnerIntegration.js.map +1 -0
- package/dist/hooks/useTranslations.d.ts +1 -0
- package/dist/hooks/useTranslations.d.ts.map +1 -0
- package/dist/hooks/useTranslations.js +5 -3
- package/dist/hooks/useTranslations.js.map +1 -0
- package/dist/hooks/useWhatsNew.d.ts +1 -0
- package/dist/hooks/useWhatsNew.d.ts.map +1 -0
- package/dist/hooks/useWhatsNew.js +9 -8
- package/dist/hooks/useWhatsNew.js.map +1 -0
- package/dist/index.d.ts +38 -22
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +76 -22
- package/dist/index.js.map +1 -0
- package/dist/translations/default.d.ts +1 -0
- package/dist/translations/default.d.ts.map +1 -0
- package/dist/translations/default.js +1 -0
- package/dist/translations/default.js.map +1 -0
- package/dist/translations/locales/cn.json +39 -0
- package/dist/translations/locales/de.json +39 -0
- package/dist/translations/locales/dk.json +39 -0
- package/dist/translations/locales/en.json +39 -0
- package/dist/translations/locales/es.json +39 -0
- package/dist/translations/locales/fr.json +39 -0
- package/dist/translations/locales/ie.json +39 -0
- package/dist/translations/locales/in.json +39 -0
- package/dist/translations/locales/it.json +39 -0
- package/dist/translations/locales/jp.json +39 -0
- package/dist/translations/locales/nl.json +39 -0
- package/dist/translations/locales/nz.json +39 -0
- package/dist/translations/locales/pt.json +39 -0
- package/dist/translations/locales/se.json +39 -0
- package/dist/translations/locales/vi.json +39 -0
- package/dist/translations/translation-manager.d.ts +89 -0
- package/dist/translations/translation-manager.d.ts.map +1 -0
- package/dist/translations/translation-manager.js +239 -0
- package/dist/translations/translation-manager.js.map +1 -0
- package/dist/types/app.d.ts +1 -0
- package/dist/types/app.d.ts.map +1 -0
- package/dist/types/app.js +1 -0
- package/dist/types/app.js.map +1 -0
- package/dist/types/article.d.ts +1 -0
- package/dist/types/article.d.ts.map +1 -0
- package/dist/types/article.js +1 -0
- package/dist/types/article.js.map +1 -0
- package/dist/types/banner.d.ts +1 -0
- package/dist/types/banner.d.ts.map +1 -0
- package/dist/types/banner.js +1 -0
- package/dist/types/banner.js.map +1 -0
- package/dist/types/component-props.d.ts +140 -0
- package/dist/types/component-props.d.ts.map +1 -0
- package/dist/types/component-props.js +6 -0
- package/dist/types/component-props.js.map +1 -0
- package/dist/types/dashboard.d.ts +1 -0
- package/dist/types/dashboard.d.ts.map +1 -0
- package/dist/types/dashboard.js +1 -0
- package/dist/types/dashboard.js.map +1 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +1 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/integration.d.ts +1 -0
- package/dist/types/integration.d.ts.map +1 -0
- package/dist/types/integration.js +1 -0
- package/dist/types/integration.js.map +1 -0
- package/dist/types/partner.d.ts +1 -0
- package/dist/types/partner.d.ts.map +1 -0
- package/dist/types/partner.js +1 -0
- package/dist/types/partner.js.map +1 -0
- package/dist/types/product-update.d.ts +1 -0
- package/dist/types/product-update.d.ts.map +1 -0
- package/dist/types/product-update.js +1 -0
- package/dist/types/product-update.js.map +1 -0
- package/dist/types/translations.d.ts +1 -0
- package/dist/types/translations.d.ts.map +1 -0
- package/dist/types/translations.js +1 -0
- package/dist/types/translations.js.map +1 -0
- package/dist/utils/campaignTracking.d.ts +1 -0
- package/dist/utils/campaignTracking.d.ts.map +1 -0
- package/dist/utils/campaignTracking.js +1 -0
- package/dist/utils/campaignTracking.js.map +1 -0
- package/dist/utils/cls-monitor.d.ts +1 -0
- package/dist/utils/cls-monitor.d.ts.map +1 -0
- package/dist/utils/cls-monitor.js +1 -0
- package/dist/utils/cls-monitor.js.map +1 -0
- package/dist/utils/injectStyles.d.ts +1 -0
- package/dist/utils/injectStyles.d.ts.map +1 -0
- package/dist/utils/injectStyles.js +1 -0
- package/dist/utils/injectStyles.js.map +1 -0
- package/dist/utils/sessionManager.d.ts +1 -0
- package/dist/utils/sessionManager.d.ts.map +1 -0
- package/dist/utils/sessionManager.js +1 -0
- package/dist/utils/sessionManager.js.map +1 -0
- package/package.json +4 -3
- package/dist/hooks/useFloatingCardActions.d.ts +0 -17
- package/dist/hooks/useFloatingCardActions.js +0 -54
- package/dist/hooks/useFloatingCardEngine.d.ts +0 -21
- package/dist/hooks/useFloatingCardEngine.js +0 -39
- package/dist/hooks/useGrowApps.d.ts +0 -10
- package/dist/hooks/useGrowApps.js +0 -14
- package/dist/provider/DashboardProvider.d.ts +0 -36
- package/dist/provider/DashboardProvider.js +0 -200
|
@@ -0,0 +1,527 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SDK Manager - Internal singleton for managing global state
|
|
3
|
+
* Components automatically connect to this without manual provider setup
|
|
4
|
+
*/
|
|
5
|
+
import { loadTranslations, getTranslations, mergeTranslations, } from "../translations/translation-manager";
|
|
6
|
+
import { generateDashboardConfig, } from "../config/internal-config";
|
|
7
|
+
import { COMPONENT_DEFAULTS } from "../config/component-defaults";
|
|
8
|
+
import { DashboardEngine } from "./engine";
|
|
9
|
+
// ============================================
|
|
10
|
+
// SDK Manager Singleton
|
|
11
|
+
// ============================================
|
|
12
|
+
class SDKManagerClass {
|
|
13
|
+
constructor() {
|
|
14
|
+
this.listeners = new Set();
|
|
15
|
+
/**
|
|
16
|
+
* Handle custom locale change events
|
|
17
|
+
*/
|
|
18
|
+
this.handleCustomLocaleChange = (event) => {
|
|
19
|
+
const newLocale = event.detail?.locale || event.detail;
|
|
20
|
+
if (newLocale && typeof newLocale === "string") {
|
|
21
|
+
const normalizedLocale = this.normalizeLocale(newLocale);
|
|
22
|
+
// console.log("Received locale change event:", normalizedLocale);
|
|
23
|
+
this.handleLocaleChange(normalizedLocale);
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
this.state = {
|
|
27
|
+
initialized: false,
|
|
28
|
+
locale: "en",
|
|
29
|
+
translations: getTranslations("en"),
|
|
30
|
+
config: generateDashboardConfig(),
|
|
31
|
+
loading: false,
|
|
32
|
+
};
|
|
33
|
+
// Try to auto-detect Shopify context and locale
|
|
34
|
+
this.autoDetectShopInfo();
|
|
35
|
+
this.autoDetectLocale();
|
|
36
|
+
this.setupLocaleWatcher();
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Auto-detect current locale from browser/Shopify context
|
|
40
|
+
*/
|
|
41
|
+
autoDetectLocale() {
|
|
42
|
+
if (typeof window === "undefined")
|
|
43
|
+
return;
|
|
44
|
+
try {
|
|
45
|
+
// Method 1: Check Shopify Admin locale (if available)
|
|
46
|
+
const shopifyLocale = this.getShopifyAdminLocale();
|
|
47
|
+
if (shopifyLocale) {
|
|
48
|
+
this.currentDetectedLocale = shopifyLocale;
|
|
49
|
+
this.updateLocale(shopifyLocale);
|
|
50
|
+
// console.log("Auto-detected Shopify locale:", shopifyLocale);
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
// Method 2: Browser language
|
|
54
|
+
const browserLocale = navigator.language || navigator.languages?.[0];
|
|
55
|
+
if (browserLocale) {
|
|
56
|
+
const normalizedLocale = this.normalizeLocale(browserLocale);
|
|
57
|
+
this.currentDetectedLocale = normalizedLocale;
|
|
58
|
+
this.updateLocale(normalizedLocale);
|
|
59
|
+
// console.log("Auto-detected browser locale:", normalizedLocale);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
catch (error) {
|
|
63
|
+
console.warn("Failed to auto-detect locale:", error);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Get locale from Shopify Admin context
|
|
68
|
+
*/
|
|
69
|
+
getShopifyAdminLocale() {
|
|
70
|
+
try {
|
|
71
|
+
// Check if we can detect locale from Shopify admin
|
|
72
|
+
const html = document.documentElement;
|
|
73
|
+
const lang = html.getAttribute("lang") || html.getAttribute("xml:lang");
|
|
74
|
+
if (lang) {
|
|
75
|
+
return this.normalizeLocale(lang);
|
|
76
|
+
}
|
|
77
|
+
// Check meta tags
|
|
78
|
+
const metaLang = document.querySelector('meta[http-equiv="content-language"]');
|
|
79
|
+
if (metaLang) {
|
|
80
|
+
const content = metaLang.getAttribute("content");
|
|
81
|
+
if (content) {
|
|
82
|
+
return this.normalizeLocale(content);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return null;
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
return null;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Setup watcher for locale changes in the DOM
|
|
93
|
+
*/
|
|
94
|
+
setupLocaleWatcher() {
|
|
95
|
+
if (typeof window === "undefined")
|
|
96
|
+
return;
|
|
97
|
+
try {
|
|
98
|
+
this.localeObserver = new MutationObserver((mutations) => {
|
|
99
|
+
mutations.forEach((mutation) => {
|
|
100
|
+
if (mutation.type === "attributes" &&
|
|
101
|
+
(mutation.attributeName === "lang" ||
|
|
102
|
+
mutation.attributeName === "xml:lang")) {
|
|
103
|
+
const newLocale = this.getShopifyAdminLocale();
|
|
104
|
+
if (newLocale && newLocale !== this.currentDetectedLocale) {
|
|
105
|
+
// console.log(
|
|
106
|
+
// "Detected locale change:",
|
|
107
|
+
// this.currentDetectedLocale,
|
|
108
|
+
// "→",
|
|
109
|
+
// newLocale,
|
|
110
|
+
// );
|
|
111
|
+
this.currentDetectedLocale = newLocale;
|
|
112
|
+
this.handleLocaleChange(newLocale);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
});
|
|
116
|
+
});
|
|
117
|
+
// Watch for changes to document element attributes
|
|
118
|
+
this.localeObserver.observe(document.documentElement, {
|
|
119
|
+
attributes: true,
|
|
120
|
+
attributeFilter: ["lang", "xml:lang"],
|
|
121
|
+
});
|
|
122
|
+
// Also listen for custom locale change events
|
|
123
|
+
window.addEventListener("trustshop-locale-change", this.handleCustomLocaleChange.bind(this));
|
|
124
|
+
window.addEventListener("shopify-locale-change", this.handleCustomLocaleChange.bind(this));
|
|
125
|
+
// console.log("Locale watcher initialized");
|
|
126
|
+
}
|
|
127
|
+
catch (error) {
|
|
128
|
+
console.warn("Failed to setup locale watcher:", error);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Handle locale changes (re-fetch data and translations)
|
|
133
|
+
*/
|
|
134
|
+
async handleLocaleChange(newLocale) {
|
|
135
|
+
if (newLocale === this.state.locale)
|
|
136
|
+
return;
|
|
137
|
+
try {
|
|
138
|
+
// console.log(Updating SDK locale:", this.state.locale, "→", newLocale);
|
|
139
|
+
this.updateState({ loading: true });
|
|
140
|
+
// Load new translations
|
|
141
|
+
const baseTranslations = await loadTranslations(newLocale);
|
|
142
|
+
const translations = mergeTranslations(baseTranslations);
|
|
143
|
+
// Update config with new locale
|
|
144
|
+
const newConfig = { ...this.state.config, locale: newLocale };
|
|
145
|
+
// Update state
|
|
146
|
+
this.updateState({
|
|
147
|
+
locale: newLocale,
|
|
148
|
+
translations,
|
|
149
|
+
config: newConfig,
|
|
150
|
+
loading: false,
|
|
151
|
+
});
|
|
152
|
+
// Trigger re-fetch of API data with new locale
|
|
153
|
+
await this.refreshDashboardData(newLocale);
|
|
154
|
+
// console.log("SDK locale updated successfully");
|
|
155
|
+
}
|
|
156
|
+
catch (error) {
|
|
157
|
+
console.error(" Failed to update SDK locale:", error);
|
|
158
|
+
this.updateState({ loading: false, error: error });
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Refresh dashboard data with new locale
|
|
163
|
+
*/
|
|
164
|
+
async refreshDashboardData(locale) {
|
|
165
|
+
try {
|
|
166
|
+
this.updateState({ dashboardLoading: true, dashboardError: null });
|
|
167
|
+
const currentLocale = locale || this.state.locale;
|
|
168
|
+
const config = { ...this.state.config, locale: currentLocale };
|
|
169
|
+
// Initialize or update dashboard engine
|
|
170
|
+
if (!this.dashboardEngine) {
|
|
171
|
+
this.dashboardEngine = DashboardEngine.getInstance(config);
|
|
172
|
+
}
|
|
173
|
+
else {
|
|
174
|
+
// Update engine config with new locale
|
|
175
|
+
await this.dashboardEngine.setLocale(currentLocale);
|
|
176
|
+
}
|
|
177
|
+
// Fetch dashboard data
|
|
178
|
+
await this.dashboardEngine.init();
|
|
179
|
+
const dashboardData = this.dashboardEngine.getData();
|
|
180
|
+
this.updateState({
|
|
181
|
+
dashboardData,
|
|
182
|
+
dashboardLoading: false,
|
|
183
|
+
dashboardError: null,
|
|
184
|
+
});
|
|
185
|
+
// Also refresh campaigns data
|
|
186
|
+
await this.refreshCampaignsData(currentLocale);
|
|
187
|
+
// Emit event for components to refresh
|
|
188
|
+
window.dispatchEvent(new CustomEvent("trustshop-data-refresh", {
|
|
189
|
+
detail: {
|
|
190
|
+
locale: currentLocale,
|
|
191
|
+
reason: "locale-change",
|
|
192
|
+
data: dashboardData,
|
|
193
|
+
},
|
|
194
|
+
}));
|
|
195
|
+
// console.log(`Dashboard data refreshed for locale: ${currentLocale}`);
|
|
196
|
+
}
|
|
197
|
+
catch (error) {
|
|
198
|
+
console.error("Failed to refresh dashboard data:", error);
|
|
199
|
+
this.updateState({
|
|
200
|
+
dashboardLoading: false,
|
|
201
|
+
dashboardError: error,
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Refresh campaigns data with new locale
|
|
207
|
+
*/
|
|
208
|
+
async refreshCampaignsData(locale) {
|
|
209
|
+
try {
|
|
210
|
+
// Only fetch campaigns if we have a shop ID
|
|
211
|
+
if (!this.state.shopInfo?.id) {
|
|
212
|
+
// console.log("Skipping campaigns fetch - no shop ID available");
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
215
|
+
this.updateState({ campaignsLoading: true, campaignsError: null });
|
|
216
|
+
const currentLocale = locale || this.state.locale;
|
|
217
|
+
const shopId = this.state.shopInfo.id;
|
|
218
|
+
// Build campaigns API URL
|
|
219
|
+
let baseUrl;
|
|
220
|
+
if (this.state.config?.apiUrl) {
|
|
221
|
+
const configUrl = this.state.config.apiUrl;
|
|
222
|
+
if (configUrl.includes("/dashboard")) {
|
|
223
|
+
baseUrl = configUrl.replace("/dashboard", "");
|
|
224
|
+
}
|
|
225
|
+
else {
|
|
226
|
+
baseUrl = configUrl;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
else {
|
|
230
|
+
baseUrl =
|
|
231
|
+
typeof window !== "undefined" &&
|
|
232
|
+
window.location.hostname === "localhost"
|
|
233
|
+
? "/api"
|
|
234
|
+
: "https://ops.trustshop.io/api";
|
|
235
|
+
}
|
|
236
|
+
const apiUrl = `${baseUrl}/campaigns?shop_id=${shopId}&locale=${currentLocale}`;
|
|
237
|
+
const response = await fetch(apiUrl, {
|
|
238
|
+
method: "GET",
|
|
239
|
+
headers: {
|
|
240
|
+
Accept: "application/json",
|
|
241
|
+
"Content-Type": "application/json",
|
|
242
|
+
"Accept-Language": currentLocale,
|
|
243
|
+
...(this.state.config?.headers || {}),
|
|
244
|
+
},
|
|
245
|
+
credentials: "include",
|
|
246
|
+
});
|
|
247
|
+
if (!response.ok) {
|
|
248
|
+
throw new Error(`Failed to fetch campaigns: ${response.statusText}`);
|
|
249
|
+
}
|
|
250
|
+
const data = await response.json();
|
|
251
|
+
const campaignsData = data.success && Array.isArray(data.data) ? data.data : [];
|
|
252
|
+
this.updateState({
|
|
253
|
+
campaignsData,
|
|
254
|
+
campaignsLoading: false,
|
|
255
|
+
campaignsError: null,
|
|
256
|
+
});
|
|
257
|
+
// Emit event for campaigns refresh
|
|
258
|
+
window.dispatchEvent(new CustomEvent("trustshop-campaigns-refresh", {
|
|
259
|
+
detail: { locale: currentLocale, data: campaignsData, shopId },
|
|
260
|
+
}));
|
|
261
|
+
}
|
|
262
|
+
catch (error) {
|
|
263
|
+
console.error("Failed to refresh campaigns data:", error);
|
|
264
|
+
this.updateState({
|
|
265
|
+
campaignsLoading: false,
|
|
266
|
+
campaignsError: error,
|
|
267
|
+
});
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* Normalize locale string to supported format
|
|
272
|
+
*/
|
|
273
|
+
normalizeLocale(locale) {
|
|
274
|
+
if (!locale)
|
|
275
|
+
return "en";
|
|
276
|
+
// Use the same normalization as translation manager
|
|
277
|
+
const SUPPORTED_LOCALES = [
|
|
278
|
+
"cn",
|
|
279
|
+
"de",
|
|
280
|
+
"dk",
|
|
281
|
+
"en",
|
|
282
|
+
"es",
|
|
283
|
+
"fr",
|
|
284
|
+
"ie",
|
|
285
|
+
"in",
|
|
286
|
+
"it",
|
|
287
|
+
"jp",
|
|
288
|
+
"nl",
|
|
289
|
+
"nz",
|
|
290
|
+
"pt",
|
|
291
|
+
"se",
|
|
292
|
+
"vi",
|
|
293
|
+
];
|
|
294
|
+
// Direct match
|
|
295
|
+
if (SUPPORTED_LOCALES.includes(locale)) {
|
|
296
|
+
return locale;
|
|
297
|
+
}
|
|
298
|
+
// Extract base locale (en-US → en)
|
|
299
|
+
const base = locale.split(/[-_]/)[0].toLowerCase();
|
|
300
|
+
// Special mappings
|
|
301
|
+
const mappings = {
|
|
302
|
+
zh: "cn",
|
|
303
|
+
da: "dk",
|
|
304
|
+
ga: "ie",
|
|
305
|
+
hi: "in",
|
|
306
|
+
ja: "jp",
|
|
307
|
+
mi: "nz",
|
|
308
|
+
sv: "se",
|
|
309
|
+
};
|
|
310
|
+
const mapped = mappings[base] || base;
|
|
311
|
+
if (SUPPORTED_LOCALES.includes(mapped)) {
|
|
312
|
+
return mapped;
|
|
313
|
+
}
|
|
314
|
+
return "en";
|
|
315
|
+
}
|
|
316
|
+
/**
|
|
317
|
+
* Manually update locale (for programmatic changes)
|
|
318
|
+
*/
|
|
319
|
+
async updateLocale(newLocale) {
|
|
320
|
+
const normalizedLocale = this.normalizeLocale(newLocale);
|
|
321
|
+
await this.handleLocaleChange(normalizedLocale);
|
|
322
|
+
}
|
|
323
|
+
/**
|
|
324
|
+
* Auto-detect shop info from Shopify App Bridge or URL
|
|
325
|
+
*/
|
|
326
|
+
autoDetectShopInfo() {
|
|
327
|
+
if (typeof window === "undefined")
|
|
328
|
+
return;
|
|
329
|
+
try {
|
|
330
|
+
// Method 1: Check if Shopify App Bridge is available
|
|
331
|
+
const shopifyApp = window.ShopifyApp;
|
|
332
|
+
if (shopifyApp) {
|
|
333
|
+
}
|
|
334
|
+
// Method 2: Parse from URL (admin.shopify.com)
|
|
335
|
+
const currentUrl = window.location.href;
|
|
336
|
+
const shopifyAdminMatch = currentUrl.match(/https:\/\/admin\.shopify\.com\/store\/([^\/]+)/);
|
|
337
|
+
if (shopifyAdminMatch) {
|
|
338
|
+
const [, storeName] = shopifyAdminMatch;
|
|
339
|
+
this.updateState({
|
|
340
|
+
shopInfo: {
|
|
341
|
+
domain: `${storeName}.myshopify.com`,
|
|
342
|
+
id: storeName,
|
|
343
|
+
},
|
|
344
|
+
});
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
catch (error) {
|
|
348
|
+
console.warn("Failed to auto-detect shop info:", error);
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
/**
|
|
352
|
+
* Initialize SDK with options (called automatically by components)
|
|
353
|
+
*/
|
|
354
|
+
async initialize(options = {}) {
|
|
355
|
+
if (this.initPromise) {
|
|
356
|
+
return this.initPromise;
|
|
357
|
+
}
|
|
358
|
+
this.initPromise = this.performInitialization(options);
|
|
359
|
+
return this.initPromise;
|
|
360
|
+
}
|
|
361
|
+
async performInitialization(options) {
|
|
362
|
+
try {
|
|
363
|
+
this.updateState({ loading: true });
|
|
364
|
+
const locale = options.locale || this.state.locale;
|
|
365
|
+
const shopInfo = options.shopInfo || this.state.shopInfo;
|
|
366
|
+
// Load translations
|
|
367
|
+
const baseTranslations = await loadTranslations(locale);
|
|
368
|
+
const translations = mergeTranslations(baseTranslations, options.translations);
|
|
369
|
+
// Generate config with locale
|
|
370
|
+
const config = {
|
|
371
|
+
...generateDashboardConfig(shopInfo, options.config),
|
|
372
|
+
locale,
|
|
373
|
+
};
|
|
374
|
+
this.updateState({
|
|
375
|
+
initialized: true,
|
|
376
|
+
locale,
|
|
377
|
+
shopInfo,
|
|
378
|
+
translations,
|
|
379
|
+
config,
|
|
380
|
+
loading: false,
|
|
381
|
+
error: undefined,
|
|
382
|
+
});
|
|
383
|
+
// Automatically fetch dashboard data after initialization
|
|
384
|
+
await this.refreshDashboardData(locale);
|
|
385
|
+
// console.log("SDK initialized successfully with dashboard data", {
|
|
386
|
+
// locale,
|
|
387
|
+
// shopInfo,
|
|
388
|
+
// });
|
|
389
|
+
}
|
|
390
|
+
catch (error) {
|
|
391
|
+
this.updateState({
|
|
392
|
+
loading: false,
|
|
393
|
+
error: error,
|
|
394
|
+
});
|
|
395
|
+
console.error("SDK initialization failed:", error);
|
|
396
|
+
throw error;
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
/**
|
|
400
|
+
* Update SDK state and notify listeners
|
|
401
|
+
*/
|
|
402
|
+
updateState(updates) {
|
|
403
|
+
this.state = { ...this.state, ...updates };
|
|
404
|
+
this.notifyListeners();
|
|
405
|
+
}
|
|
406
|
+
/**
|
|
407
|
+
* Update configuration (called when components pass new props)
|
|
408
|
+
*/
|
|
409
|
+
async updateConfig(options) {
|
|
410
|
+
const hasChanges = options.locale !== this.state.locale ||
|
|
411
|
+
JSON.stringify(options.shopInfo) !== JSON.stringify(this.state.shopInfo);
|
|
412
|
+
if (hasChanges) {
|
|
413
|
+
this.initPromise = undefined; // Reset init promise to allow re-initialization
|
|
414
|
+
await this.initialize(options);
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
/**
|
|
418
|
+
* Get current state
|
|
419
|
+
*/
|
|
420
|
+
getState() {
|
|
421
|
+
return this.state;
|
|
422
|
+
}
|
|
423
|
+
/**
|
|
424
|
+
* Subscribe to state changes
|
|
425
|
+
*/
|
|
426
|
+
subscribe(listener) {
|
|
427
|
+
this.listeners.add(listener);
|
|
428
|
+
return () => this.listeners.delete(listener);
|
|
429
|
+
}
|
|
430
|
+
notifyListeners() {
|
|
431
|
+
this.listeners.forEach((listener) => listener());
|
|
432
|
+
}
|
|
433
|
+
/**
|
|
434
|
+
* Get component defaults
|
|
435
|
+
*/
|
|
436
|
+
getDefaults() {
|
|
437
|
+
return COMPONENT_DEFAULTS;
|
|
438
|
+
}
|
|
439
|
+
/**
|
|
440
|
+
* Get dashboard engine instance
|
|
441
|
+
*/
|
|
442
|
+
getDashboardEngine() {
|
|
443
|
+
return this.dashboardEngine;
|
|
444
|
+
}
|
|
445
|
+
/**
|
|
446
|
+
* Get dashboard data
|
|
447
|
+
*/
|
|
448
|
+
getDashboardData() {
|
|
449
|
+
return this.state.dashboardData;
|
|
450
|
+
}
|
|
451
|
+
/**
|
|
452
|
+
* Get campaigns data
|
|
453
|
+
*/
|
|
454
|
+
getCampaignsData() {
|
|
455
|
+
return this.state.campaignsData;
|
|
456
|
+
}
|
|
457
|
+
/**
|
|
458
|
+
* Check if SDK is ready for use
|
|
459
|
+
*/
|
|
460
|
+
isReady() {
|
|
461
|
+
return (this.state.initialized &&
|
|
462
|
+
!this.state.loading &&
|
|
463
|
+
!this.state.error &&
|
|
464
|
+
!this.state.dashboardLoading);
|
|
465
|
+
}
|
|
466
|
+
/**
|
|
467
|
+
* Cleanup observers and listeners
|
|
468
|
+
*/
|
|
469
|
+
destroy() {
|
|
470
|
+
if (this.localeObserver) {
|
|
471
|
+
this.localeObserver.disconnect();
|
|
472
|
+
}
|
|
473
|
+
if (typeof window !== "undefined") {
|
|
474
|
+
window.removeEventListener("trustshop-locale-change", this.handleCustomLocaleChange);
|
|
475
|
+
window.removeEventListener("shopify-locale-change", this.handleCustomLocaleChange);
|
|
476
|
+
}
|
|
477
|
+
this.listeners.clear();
|
|
478
|
+
// console.log("SDK Manager cleaned up");
|
|
479
|
+
}
|
|
480
|
+
}
|
|
481
|
+
// ============================================
|
|
482
|
+
// Export Singleton Instance
|
|
483
|
+
// ============================================
|
|
484
|
+
export const SDKManager = new SDKManagerClass();
|
|
485
|
+
// ============================================
|
|
486
|
+
// React Hook for Components
|
|
487
|
+
// ============================================
|
|
488
|
+
import { useState, useEffect } from "react";
|
|
489
|
+
/**
|
|
490
|
+
* Hook for components to connect to SDK Manager
|
|
491
|
+
* Automatically initializes SDK on first use
|
|
492
|
+
*/
|
|
493
|
+
export function useSDK(options = {}) {
|
|
494
|
+
const [state, setState] = useState(() => SDKManager.getState());
|
|
495
|
+
const [isInitializing, setIsInitializing] = useState(false);
|
|
496
|
+
// Subscribe to state changes
|
|
497
|
+
useEffect(() => {
|
|
498
|
+
const unsubscribe = SDKManager.subscribe(() => {
|
|
499
|
+
setState(SDKManager.getState());
|
|
500
|
+
});
|
|
501
|
+
return unsubscribe;
|
|
502
|
+
}, []);
|
|
503
|
+
// Auto-initialize SDK when component mounts
|
|
504
|
+
useEffect(() => {
|
|
505
|
+
if (!state.initialized && !isInitializing) {
|
|
506
|
+
setIsInitializing(true);
|
|
507
|
+
SDKManager.initialize(options).finally(() => {
|
|
508
|
+
setIsInitializing(false);
|
|
509
|
+
});
|
|
510
|
+
}
|
|
511
|
+
}, [state.initialized, isInitializing]);
|
|
512
|
+
// Update config if options change
|
|
513
|
+
useEffect(() => {
|
|
514
|
+
if (state.initialized) {
|
|
515
|
+
SDKManager.updateConfig(options);
|
|
516
|
+
}
|
|
517
|
+
}, [state.initialized, JSON.stringify(options)]);
|
|
518
|
+
return {
|
|
519
|
+
...state,
|
|
520
|
+
isInitializing,
|
|
521
|
+
defaults: SDKManager.getDefaults(),
|
|
522
|
+
isReady: SDKManager.isReady(),
|
|
523
|
+
dashboardEngine: SDKManager.getDashboardEngine(),
|
|
524
|
+
};
|
|
525
|
+
}
|
|
526
|
+
export default SDKManager;
|
|
527
|
+
//# sourceMappingURL=SDKManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SDKManager.js","sourceRoot":"","sources":["../../src/core/SDKManager.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * SDK Manager - Internal singleton for managing global state\n * Components automatically connect to this without manual provider setup\n */\n\nimport {\n loadTranslations,\n getTranslations,\n mergeTranslations,\n type SupportedLocale,\n type SDKTranslations,\n} from \"../translations/translation-manager\";\nimport {\n generateDashboardConfig,\n type ShopInfo,\n type SDKInternalConfig,\n} from \"../config/internal-config\";\nimport { COMPONENT_DEFAULTS } from \"../config/component-defaults\";\nimport { DashboardEngine } from \"./engine\";\nimport { DashboardData } from \"../types\";\n\n// ============================================\n// SDK Global State\n// ============================================\n\ninterface SDKState {\n initialized: boolean;\n shopInfo?: ShopInfo;\n locale: SupportedLocale;\n translations: SDKTranslations;\n config: SDKInternalConfig;\n loading: boolean;\n error?: Error;\n dashboardData?: DashboardData | null;\n dashboardLoading?: boolean;\n dashboardError?: Error | null;\n campaignsData?: any[] | null;\n campaignsLoading?: boolean;\n campaignsError?: Error | null;\n}\n\ninterface SDKOptions {\n shopInfo?: ShopInfo;\n locale?: SupportedLocale;\n translations?: Partial<SDKTranslations>;\n config?: Partial<SDKInternalConfig>;\n}\n\n// ============================================\n// SDK Manager Singleton\n// ============================================\n\nclass SDKManagerClass {\n private state: SDKState;\n private listeners: Set<() => void> = new Set();\n private initPromise?: Promise<void>;\n private localeObserver?: MutationObserver;\n private currentDetectedLocale?: SupportedLocale;\n private dashboardEngine?: DashboardEngine;\n\n constructor() {\n this.state = {\n initialized: false,\n locale: \"en\",\n translations: getTranslations(\"en\"),\n config: generateDashboardConfig(),\n loading: false,\n };\n\n // Try to auto-detect Shopify context and locale\n this.autoDetectShopInfo();\n this.autoDetectLocale();\n this.setupLocaleWatcher();\n }\n\n /**\n * Auto-detect current locale from browser/Shopify context\n */\n private autoDetectLocale(): void {\n if (typeof window === \"undefined\") return;\n\n try {\n // Method 1: Check Shopify Admin locale (if available)\n const shopifyLocale = this.getShopifyAdminLocale();\n if (shopifyLocale) {\n this.currentDetectedLocale = shopifyLocale;\n this.updateLocale(shopifyLocale);\n // console.log(\"Auto-detected Shopify locale:\", shopifyLocale);\n return;\n }\n\n // Method 2: Browser language\n const browserLocale = navigator.language || navigator.languages?.[0];\n if (browserLocale) {\n const normalizedLocale = this.normalizeLocale(browserLocale);\n this.currentDetectedLocale = normalizedLocale;\n this.updateLocale(normalizedLocale);\n // console.log(\"Auto-detected browser locale:\", normalizedLocale);\n }\n } catch (error) {\n console.warn(\"Failed to auto-detect locale:\", error);\n }\n }\n\n /**\n * Get locale from Shopify Admin context\n */\n private getShopifyAdminLocale(): SupportedLocale | null {\n try {\n // Check if we can detect locale from Shopify admin\n const html = document.documentElement;\n const lang = html.getAttribute(\"lang\") || html.getAttribute(\"xml:lang\");\n\n if (lang) {\n return this.normalizeLocale(lang);\n }\n\n // Check meta tags\n const metaLang = document.querySelector(\n 'meta[http-equiv=\"content-language\"]',\n );\n if (metaLang) {\n const content = metaLang.getAttribute(\"content\");\n if (content) {\n return this.normalizeLocale(content);\n }\n }\n\n return null;\n } catch {\n return null;\n }\n }\n\n /**\n * Setup watcher for locale changes in the DOM\n */\n private setupLocaleWatcher(): void {\n if (typeof window === \"undefined\") return;\n\n try {\n this.localeObserver = new MutationObserver((mutations) => {\n mutations.forEach((mutation) => {\n if (\n mutation.type === \"attributes\" &&\n (mutation.attributeName === \"lang\" ||\n mutation.attributeName === \"xml:lang\")\n ) {\n const newLocale = this.getShopifyAdminLocale();\n if (newLocale && newLocale !== this.currentDetectedLocale) {\n // console.log(\n // \"Detected locale change:\",\n // this.currentDetectedLocale,\n // \"→\",\n // newLocale,\n // );\n this.currentDetectedLocale = newLocale;\n this.handleLocaleChange(newLocale);\n }\n }\n });\n });\n\n // Watch for changes to document element attributes\n this.localeObserver.observe(document.documentElement, {\n attributes: true,\n attributeFilter: [\"lang\", \"xml:lang\"],\n });\n\n // Also listen for custom locale change events\n window.addEventListener(\n \"trustshop-locale-change\",\n this.handleCustomLocaleChange.bind(this),\n );\n window.addEventListener(\n \"shopify-locale-change\",\n this.handleCustomLocaleChange.bind(this),\n );\n\n // console.log(\"Locale watcher initialized\");\n } catch (error) {\n console.warn(\"Failed to setup locale watcher:\", error);\n }\n }\n\n /**\n * Handle custom locale change events\n */\n private handleCustomLocaleChange = (event: any) => {\n const newLocale = event.detail?.locale || event.detail;\n if (newLocale && typeof newLocale === \"string\") {\n const normalizedLocale = this.normalizeLocale(newLocale);\n // console.log(\"Received locale change event:\", normalizedLocale);\n this.handleLocaleChange(normalizedLocale);\n }\n };\n\n /**\n * Handle locale changes (re-fetch data and translations)\n */\n private async handleLocaleChange(newLocale: SupportedLocale): Promise<void> {\n if (newLocale === this.state.locale) return;\n\n try {\n // console.log(Updating SDK locale:\", this.state.locale, \"→\", newLocale);\n this.updateState({ loading: true });\n\n // Load new translations\n const baseTranslations = await loadTranslations(newLocale);\n const translations = mergeTranslations(baseTranslations);\n\n // Update config with new locale\n const newConfig = { ...this.state.config, locale: newLocale };\n\n // Update state\n this.updateState({\n locale: newLocale,\n translations,\n config: newConfig,\n loading: false,\n });\n\n // Trigger re-fetch of API data with new locale\n await this.refreshDashboardData(newLocale);\n\n // console.log(\"SDK locale updated successfully\");\n } catch (error) {\n console.error(\" Failed to update SDK locale:\", error);\n this.updateState({ loading: false, error: error as Error });\n }\n }\n\n /**\n * Refresh dashboard data with new locale\n */\n private async refreshDashboardData(locale?: SupportedLocale): Promise<void> {\n try {\n this.updateState({ dashboardLoading: true, dashboardError: null });\n\n const currentLocale = locale || this.state.locale;\n const config = { ...this.state.config, locale: currentLocale };\n\n // Initialize or update dashboard engine\n if (!this.dashboardEngine) {\n this.dashboardEngine = DashboardEngine.getInstance(config);\n } else {\n // Update engine config with new locale\n await this.dashboardEngine.setLocale(currentLocale);\n }\n\n // Fetch dashboard data\n await this.dashboardEngine.init();\n const dashboardData = this.dashboardEngine.getData();\n\n this.updateState({\n dashboardData,\n dashboardLoading: false,\n dashboardError: null,\n });\n\n // Also refresh campaigns data\n await this.refreshCampaignsData(currentLocale);\n\n // Emit event for components to refresh\n window.dispatchEvent(\n new CustomEvent(\"trustshop-data-refresh\", {\n detail: {\n locale: currentLocale,\n reason: \"locale-change\",\n data: dashboardData,\n },\n }),\n );\n\n // console.log(`Dashboard data refreshed for locale: ${currentLocale}`);\n } catch (error) {\n console.error(\"Failed to refresh dashboard data:\", error);\n this.updateState({\n dashboardLoading: false,\n dashboardError: error as Error,\n });\n }\n }\n\n /**\n * Refresh campaigns data with new locale\n */\n private async refreshCampaignsData(locale?: SupportedLocale): Promise<void> {\n try {\n // Only fetch campaigns if we have a shop ID\n if (!this.state.shopInfo?.id) {\n // console.log(\"Skipping campaigns fetch - no shop ID available\");\n return;\n }\n\n this.updateState({ campaignsLoading: true, campaignsError: null });\n\n const currentLocale = locale || this.state.locale;\n const shopId = this.state.shopInfo.id;\n\n // Build campaigns API URL\n let baseUrl: string;\n if (this.state.config?.apiUrl) {\n const configUrl = this.state.config.apiUrl;\n if (configUrl.includes(\"/dashboard\")) {\n baseUrl = configUrl.replace(\"/dashboard\", \"\");\n } else {\n baseUrl = configUrl;\n }\n } else {\n baseUrl =\n typeof window !== \"undefined\" &&\n window.location.hostname === \"localhost\"\n ? \"/api\"\n : \"https://ops.trustshop.io/api\";\n }\n\n const apiUrl = `${baseUrl}/campaigns?shop_id=${shopId}&locale=${currentLocale}`;\n\n const response = await fetch(apiUrl, {\n method: \"GET\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n \"Accept-Language\": currentLocale,\n ...(this.state.config?.headers || {}),\n },\n credentials: \"include\",\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch campaigns: ${response.statusText}`);\n }\n\n const data = await response.json();\n\n const campaignsData =\n data.success && Array.isArray(data.data) ? data.data : [];\n\n this.updateState({\n campaignsData,\n campaignsLoading: false,\n campaignsError: null,\n });\n\n // Emit event for campaigns refresh\n window.dispatchEvent(\n new CustomEvent(\"trustshop-campaigns-refresh\", {\n detail: { locale: currentLocale, data: campaignsData, shopId },\n }),\n );\n } catch (error) {\n console.error(\"Failed to refresh campaigns data:\", error);\n this.updateState({\n campaignsLoading: false,\n campaignsError: error as Error,\n });\n }\n }\n\n /**\n * Normalize locale string to supported format\n */\n private normalizeLocale(locale: string): SupportedLocale {\n if (!locale) return \"en\";\n\n // Use the same normalization as translation manager\n const SUPPORTED_LOCALES: SupportedLocale[] = [\n \"cn\",\n \"de\",\n \"dk\",\n \"en\",\n \"es\",\n \"fr\",\n \"ie\",\n \"in\",\n \"it\",\n \"jp\",\n \"nl\",\n \"nz\",\n \"pt\",\n \"se\",\n \"vi\",\n ];\n\n // Direct match\n if (SUPPORTED_LOCALES.includes(locale as SupportedLocale)) {\n return locale as SupportedLocale;\n }\n\n // Extract base locale (en-US → en)\n const base = locale.split(/[-_]/)[0].toLowerCase();\n\n // Special mappings\n const mappings: Record<string, SupportedLocale> = {\n zh: \"cn\",\n da: \"dk\",\n ga: \"ie\",\n hi: \"in\",\n ja: \"jp\",\n mi: \"nz\",\n sv: \"se\",\n };\n\n const mapped = mappings[base] || base;\n\n if (SUPPORTED_LOCALES.includes(mapped as SupportedLocale)) {\n return mapped as SupportedLocale;\n }\n\n return \"en\";\n }\n\n /**\n * Manually update locale (for programmatic changes)\n */\n async updateLocale(newLocale: string | SupportedLocale): Promise<void> {\n const normalizedLocale = this.normalizeLocale(newLocale);\n await this.handleLocaleChange(normalizedLocale);\n }\n\n /**\n * Auto-detect shop info from Shopify App Bridge or URL\n */\n private autoDetectShopInfo(): void {\n if (typeof window === \"undefined\") return;\n\n try {\n // Method 1: Check if Shopify App Bridge is available\n const shopifyApp = (window as any).ShopifyApp;\n if (shopifyApp) {\n }\n\n // Method 2: Parse from URL (admin.shopify.com)\n const currentUrl = window.location.href;\n const shopifyAdminMatch = currentUrl.match(\n /https:\\/\\/admin\\.shopify\\.com\\/store\\/([^\\/]+)/,\n );\n\n if (shopifyAdminMatch) {\n const [, storeName] = shopifyAdminMatch;\n this.updateState({\n shopInfo: {\n domain: `${storeName}.myshopify.com`,\n id: storeName,\n },\n });\n }\n } catch (error) {\n console.warn(\"Failed to auto-detect shop info:\", error);\n }\n }\n\n /**\n * Initialize SDK with options (called automatically by components)\n */\n async initialize(options: SDKOptions = {}): Promise<void> {\n if (this.initPromise) {\n return this.initPromise;\n }\n\n this.initPromise = this.performInitialization(options);\n return this.initPromise;\n }\n\n private async performInitialization(options: SDKOptions): Promise<void> {\n try {\n this.updateState({ loading: true });\n\n const locale = options.locale || this.state.locale;\n const shopInfo = options.shopInfo || this.state.shopInfo;\n\n // Load translations\n const baseTranslations = await loadTranslations(locale);\n const translations = mergeTranslations(\n baseTranslations,\n options.translations,\n );\n\n // Generate config with locale\n const config = {\n ...generateDashboardConfig(shopInfo, options.config),\n locale,\n };\n\n this.updateState({\n initialized: true,\n locale,\n shopInfo,\n translations,\n config,\n loading: false,\n error: undefined,\n });\n\n // Automatically fetch dashboard data after initialization\n await this.refreshDashboardData(locale);\n\n // console.log(\"SDK initialized successfully with dashboard data\", {\n // locale,\n // shopInfo,\n // });\n } catch (error) {\n this.updateState({\n loading: false,\n error: error as Error,\n });\n console.error(\"SDK initialization failed:\", error);\n throw error;\n }\n }\n\n /**\n * Update SDK state and notify listeners\n */\n private updateState(updates: Partial<SDKState>): void {\n this.state = { ...this.state, ...updates };\n this.notifyListeners();\n }\n\n /**\n * Update configuration (called when components pass new props)\n */\n async updateConfig(options: SDKOptions): Promise<void> {\n const hasChanges =\n options.locale !== this.state.locale ||\n JSON.stringify(options.shopInfo) !== JSON.stringify(this.state.shopInfo);\n\n if (hasChanges) {\n this.initPromise = undefined; // Reset init promise to allow re-initialization\n await this.initialize(options);\n }\n }\n\n /**\n * Get current state\n */\n getState(): SDKState {\n return this.state;\n }\n\n /**\n * Subscribe to state changes\n */\n subscribe(listener: () => void): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n private notifyListeners(): void {\n this.listeners.forEach((listener) => listener());\n }\n\n /**\n * Get component defaults\n */\n getDefaults() {\n return COMPONENT_DEFAULTS;\n }\n\n /**\n * Get dashboard engine instance\n */\n getDashboardEngine(): DashboardEngine | undefined {\n return this.dashboardEngine;\n }\n\n /**\n * Get dashboard data\n */\n getDashboardData(): DashboardData | null | undefined {\n return this.state.dashboardData;\n }\n\n /**\n * Get campaigns data\n */\n getCampaignsData(): any[] | null | undefined {\n return this.state.campaignsData;\n }\n\n /**\n * Check if SDK is ready for use\n */\n isReady(): boolean {\n return (\n this.state.initialized &&\n !this.state.loading &&\n !this.state.error &&\n !this.state.dashboardLoading\n );\n }\n\n /**\n * Cleanup observers and listeners\n */\n destroy(): void {\n if (this.localeObserver) {\n this.localeObserver.disconnect();\n }\n\n if (typeof window !== \"undefined\") {\n window.removeEventListener(\n \"trustshop-locale-change\",\n this.handleCustomLocaleChange,\n );\n window.removeEventListener(\n \"shopify-locale-change\",\n this.handleCustomLocaleChange,\n );\n }\n\n this.listeners.clear();\n // console.log(\"SDK Manager cleaned up\");\n }\n}\n\n// ============================================\n// Export Singleton Instance\n// ============================================\n\nexport const SDKManager = new SDKManagerClass();\n\n// ============================================\n// React Hook for Components\n// ============================================\n\nimport { useState, useEffect } from \"react\";\n\nexport interface UseSDKOptions {\n shopInfo?: ShopInfo;\n locale?: SupportedLocale;\n translations?: Partial<SDKTranslations>;\n config?: Partial<SDKInternalConfig>;\n}\n\n/**\n * Hook for components to connect to SDK Manager\n * Automatically initializes SDK on first use\n */\nexport function useSDK(options: UseSDKOptions = {}) {\n const [state, setState] = useState(() => SDKManager.getState());\n const [isInitializing, setIsInitializing] = useState(false);\n\n // Subscribe to state changes\n useEffect(() => {\n const unsubscribe = SDKManager.subscribe(() => {\n setState(SDKManager.getState());\n });\n return unsubscribe;\n }, []);\n\n // Auto-initialize SDK when component mounts\n useEffect(() => {\n if (!state.initialized && !isInitializing) {\n setIsInitializing(true);\n SDKManager.initialize(options).finally(() => {\n setIsInitializing(false);\n });\n }\n }, [state.initialized, isInitializing]);\n\n // Update config if options change\n useEffect(() => {\n if (state.initialized) {\n SDKManager.updateConfig(options);\n }\n }, [state.initialized, JSON.stringify(options)]);\n\n return {\n ...state,\n isInitializing,\n defaults: SDKManager.getDefaults(),\n isReady: SDKManager.isReady(),\n dashboardEngine: SDKManager.getDashboardEngine(),\n };\n}\n\nexport default SDKManager;\n"]}
|
package/dist/core/adapter.d.ts
CHANGED
|
@@ -4,3 +4,4 @@ export declare function adaptBanner(apiData: any): BannerItem;
|
|
|
4
4
|
export declare function adaptApp(apiData: any, defaultGroup?: AppGroup): AppItem;
|
|
5
5
|
export declare function adaptArticle(apiData: any): ArticleItem;
|
|
6
6
|
export declare function adaptProductUpdate(apiData: any): ProductUpdateItem;
|
|
7
|
+
//# sourceMappingURL=adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../src/core/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,UAAU,EACV,OAAO,EACP,WAAW,EACX,iBAAiB,EAEjB,QAAQ,EACT,MAAM,UAAU,CAAC;AAElB,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,GAAG,GAAG,aAAa,CAoC9D;AAQD,wBAAgB,WAAW,CAAC,OAAO,EAAE,GAAG,GAAG,UAAU,CAwCpD;AAoFD,wBAAgB,QAAQ,CAAC,OAAO,EAAE,GAAG,EAAE,YAAY,CAAC,EAAE,QAAQ,GAAG,OAAO,CAyBvE;AAQD,wBAAgB,YAAY,CAAC,OAAO,EAAE,GAAG,GAAG,WAAW,CAkCtD;AAgBD,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,GAAG,GAAG,iBAAiB,CAiElE"}
|
package/dist/core/adapter.js
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../src/core/adapter.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n DashboardData,\n BannerItem,\n AppItem,\n ArticleItem,\n ProductUpdateItem,\n BannerType,\n AppGroup,\n} from \"../types\";\n\nexport function adaptDashboardData(rawData: any): DashboardData {\n const data = rawData.data || rawData;\n\n const banners = [];\n if (data.banner) {\n banners.push({\n ...data.banner,\n type: \"top_banner\",\n });\n }\n\n const allApps = [\n ...(data.partner_list || []),\n ...(data.seo_apps || []),\n ...(data.integrations || []),\n ];\n\n const articles = data.whats_new?.articles || [];\n\n const whatsNew = data.whats_new?.product_update || [];\n\n const growApps = data.grow_apps || [];\n const growAppsDisplayLimit = data.grow_apps_display_limit;\n \n // Keep the raw integrations data for the Integration component\n const integrations = data.integrations || [];\n\n return {\n banners: adaptBanners(banners),\n apps: adaptApps(allApps),\n articles: adaptArticles(articles),\n whatsNew: adaptProductUpdates(whatsNew),\n grow_apps: growApps,\n grow_apps_display_limit: growAppsDisplayLimit,\n integrations: integrations, // Add raw integrations\n };\n}\n\nfunction adaptBanners(banners: any[]): BannerItem[] {\n if (!Array.isArray(banners)) return [];\n\n return banners.map((banner) => adaptBanner(banner)).filter(Boolean);\n}\n\nexport function adaptBanner(apiData: any): BannerItem {\n const type = determineBannerType(apiData);\n\n return {\n id: apiData.id || generateId(),\n type,\n title: apiData.title || \"\",\n description:\n apiData.description || apiData.content || apiData.subtitle || \"\",\n image: apiData.image || apiData.image_url || apiData.imageUrl,\n icon: apiData.icon || apiData.icon_url || apiData.iconUrl,\n link:\n apiData.link ||\n apiData.button_url ||\n apiData.buttonUrl ||\n apiData.url ||\n \"#\",\n linkText:\n apiData.linkText ||\n apiData.button_text ||\n apiData.buttonText ||\n \"Learn More\",\n openType: apiData.openType || apiData.open_type || \"new_tab\",\n style: {\n backgroundColor:\n apiData.background_color || apiData.backgroundColor || apiData.bgColor,\n textColor: apiData.text_color || apiData.textColor,\n buttonColor: apiData.button_color || apiData.buttonColor,\n buttonTextColor: apiData.button_text_color || apiData.buttonTextColor,\n },\n priority: apiData.priority || apiData.order || 0,\n isActive:\n apiData.isActive !== undefined\n ? apiData.isActive\n : apiData.active !== undefined\n ? apiData.active\n : apiData.enabled !== undefined\n ? apiData.enabled\n : true,\n };\n}\n\nfunction determineBannerType(apiData: any): BannerType {\n if (apiData.type) {\n const typeMap: Record<string, BannerType> = {\n popup: \"popup\",\n pop_up: \"popup\",\n modal: \"popup\",\n top: \"top_banner\",\n top_banner: \"top_banner\",\n header: \"top_banner\",\n footer: \"footer_banner\",\n footer_banner: \"footer_banner\",\n bottom: \"footer_banner\",\n };\n\n const normalizedType = apiData.type.toLowerCase().replace(/-/g, \"_\");\n return typeMap[normalizedType] || \"top_banner\";\n }\n\n if (apiData.position) {\n const positionMap: Record<string, BannerType> = {\n top: \"top_banner\",\n header: \"top_banner\",\n bottom: \"footer_banner\",\n footer: \"footer_banner\",\n center: \"popup\",\n modal: \"popup\",\n };\n\n const normalizedPosition = apiData.position.toLowerCase();\n return positionMap[normalizedPosition] || \"top_banner\";\n }\n\n return \"top_banner\";\n}\n\nfunction adaptApps(apps: any): Record<AppGroup, AppItem[]> {\n const result: Record<AppGroup, AppItem[]> = {\n grow_faster: [],\n integration: [],\n marketing: [],\n analytics: [],\n other: [],\n };\n\n if (Array.isArray(apps)) {\n const adaptedApps = apps.map((app) => adaptApp(app)).filter(Boolean);\n adaptedApps.forEach((app) => {\n const group = app.group || \"other\";\n if (result[group]) {\n result[group].push(app);\n }\n });\n } else if (typeof apps === \"object\") {\n Object.entries(apps).forEach(([key, value]) => {\n const group = normalizeAppGroup(key);\n if (Array.isArray(value)) {\n result[group] = value\n .map((app) => adaptApp(app, group))\n .filter(Boolean);\n }\n });\n }\n\n return result;\n}\n\nfunction normalizeAppGroup(group: string): AppGroup {\n const groupMap: Record<string, AppGroup> = {\n grow_faster: \"grow_faster\",\n growfaster: \"grow_faster\",\n \"grow-faster\": \"grow_faster\",\n integration: \"integration\",\n integrations: \"integration\",\n marketing: \"marketing\",\n analytics: \"analytics\",\n analysis: \"analytics\",\n };\n\n const normalized = group.toLowerCase().replace(/[\\s_-]/g, \"\");\n return groupMap[normalized] || \"other\";\n}\n\nexport function adaptApp(apiData: any, defaultGroup?: AppGroup): AppItem {\n const group =\n defaultGroup ||\n normalizeAppGroup(apiData.group || apiData.category || \"other\");\n\n return {\n id: apiData.id || generateId(),\n key:\n apiData.key ||\n apiData.slug ||\n apiData.name?.toLowerCase().replace(/\\s+/g, \"-\") ||\n generateKey(),\n title: apiData.title || apiData.name || \"\",\n description: apiData.description || apiData.subtitle || \"\",\n icon:\n apiData.icon || apiData.icon_url || apiData.iconUrl || apiData.logo || \"\",\n link:\n apiData.link || apiData.url || apiData.app_url || apiData.appUrl || \"#\",\n group,\n rating: apiData.rating || apiData.score,\n installs:\n apiData.installs || apiData.installations || apiData.install_count,\n price: apiData.price || apiData.pricing,\n featured: apiData.featured || apiData.is_featured || false,\n };\n}\n\nfunction adaptArticles(articles: any[]): ArticleItem[] {\n if (!Array.isArray(articles)) return [];\n\n return articles.map((article) => adaptArticle(article)).filter(Boolean);\n}\n\nexport function adaptArticle(apiData: any): ArticleItem {\n return {\n id: apiData.id || generateId(),\n title: apiData.title || apiData.headline || \"\",\n description:\n apiData.description || apiData.summary || apiData.excerpt || \"\",\n content: apiData.content || apiData.body || apiData.text,\n thumbnail:\n apiData.thumbnail ||\n apiData.image ||\n apiData.cover_image ||\n apiData.coverImage,\n imageUrl:\n apiData.imageUrl ||\n apiData.image_url ||\n apiData.image ||\n apiData.thumbnail,\n link:\n apiData.link ||\n apiData.url ||\n apiData.article_url ||\n apiData.button_url ||\n \"#\",\n author: apiData.author || apiData.author_name || apiData.authorName,\n publishedDate:\n apiData.published_date ||\n apiData.publishedDate ||\n apiData.date ||\n apiData.created_at,\n category: apiData.category || apiData.section || apiData.label,\n readTime: apiData.read_time || apiData.readTime || apiData.reading_time,\n tags: apiData.tags || apiData.keywords || [],\n buttonText: apiData.button_text || apiData.buttonText,\n };\n}\n\nfunction adaptProductUpdates(updates: any[]): ProductUpdateItem[] {\n if (!Array.isArray(updates)) return [];\n\n const mappedUpdates = updates\n .map((update) => adaptProductUpdate(update))\n .filter(Boolean);\n\n return mappedUpdates.sort((a, b) => {\n const posA = a.position ?? Number.MAX_VALUE;\n const posB = b.position ?? Number.MAX_VALUE;\n return posA - posB;\n });\n}\n\nexport function adaptProductUpdate(apiData: any): ProductUpdateItem {\n const description =\n apiData.description ||\n apiData.content?.text ||\n apiData.content ||\n apiData.summary ||\n \"\";\n\n const features =\n apiData.features || apiData.content?.list || apiData.new_features;\n\n // Handle new nested buttons structure\n const tryButton = apiData.buttons?.try;\n const learnButton = apiData.buttons?.learn;\n\n // Fallback to old format if new format not available\n const link =\n tryButton?.url ||\n learnButton?.url ||\n apiData.link ||\n apiData.button_try_url ||\n apiData.button_learn_url ||\n apiData.url ||\n apiData.release_notes_url;\n\n return {\n id: apiData.id || generateId(),\n title: apiData.title || apiData.name || \"\",\n description,\n version: apiData.version || apiData.release_version,\n releaseDate:\n apiData.version || // New: use version field for date display\n apiData.date_time ||\n apiData.release_date ||\n apiData.releaseDate ||\n apiData.date ||\n new Date().toISOString(),\n date_time: apiData.version || apiData.date_time, // New: prioritize version field\n features: adaptStringArray(features),\n improvements: adaptStringArray(\n apiData.improvements || apiData.enhancements,\n ),\n fixes: adaptStringArray(\n apiData.fixes || apiData.bug_fixes || apiData.bugFixes,\n ),\n link,\n imageUrl:\n apiData.image_url ||\n apiData.imageUrl ||\n apiData.image ||\n apiData.thumbnail,\n image_url: apiData.image_url,\n type: determineUpdateType(apiData),\n position: apiData.position || apiData.order || apiData.priority,\n // Handle new button structure with fallbacks\n button_try_it_now: tryButton?.text || apiData.button_try_it_now || \"Try it now\",\n button_try_url: tryButton?.url || apiData.button_try_url,\n button_learn_more: learnButton?.text || apiData.button_learn_more || \"Learn more\", \n button_learn_url: learnButton?.url || apiData.button_learn_url,\n content: apiData.content\n ? {\n text: apiData.content.text || apiData.content,\n }\n : undefined,\n };\n}\n\nfunction determineUpdateType(apiData: any): \"major\" | \"minor\" | \"patch\" {\n if (apiData.type) {\n const type = apiData.type.toLowerCase();\n if (type.includes(\"major\")) return \"major\";\n if (type.includes(\"minor\")) return \"minor\";\n if (type.includes(\"patch\")) return \"patch\";\n }\n\n if (apiData.version) {\n const version = apiData.version.toString();\n const parts = version.split(\".\");\n if (parts.length >= 3) {\n const [, minor, patch] = parts;\n if (patch !== \"0\") return \"patch\";\n if (minor !== \"0\") return \"minor\";\n return \"major\";\n }\n }\n\n return \"minor\";\n}\n\nfunction adaptStringArray(data: any): string[] {\n if (Array.isArray(data)) {\n return data.filter((item) => typeof item === \"string\");\n }\n\n if (typeof data === \"string\") {\n return data\n .split(/[,;|\\n]/)\n .map((s) => s.trim())\n .filter(Boolean);\n }\n\n return [];\n}\n\nfunction generateId(): string {\n return `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n}\n\nfunction generateKey(): string {\n return `item-${Math.random().toString(36).substr(2, 9)}`;\n}\n"]}
|