@datlv-trustshop/shopify-inapp-components 0.2.9 → 0.2.11
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/WhatsNew.d.ts +2 -0
- package/dist/components/WhatsNew.d.ts.map +1 -1
- package/dist/components/WhatsNew.js +10 -13
- package/dist/components/WhatsNew.js.map +1 -1
- package/dist/core/SDKManager.d.ts +36 -4
- package/dist/core/SDKManager.d.ts.map +1 -1
- package/dist/core/SDKManager.js +210 -63
- package/dist/core/SDKManager.js.map +1 -1
- package/dist/hooks/index.d.ts +1 -3
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +1 -3
- package/dist/hooks/index.js.map +1 -1
- package/dist/hooks/useApps.d.ts +1 -1
- package/dist/hooks/useApps.d.ts.map +1 -1
- package/dist/hooks/useApps.js +15 -7
- package/dist/hooks/useApps.js.map +1 -1
- package/dist/hooks/useArticles.d.ts.map +1 -1
- package/dist/hooks/useArticles.js +12 -12
- package/dist/hooks/useArticles.js.map +1 -1
- package/dist/hooks/useBanner.d.ts +1 -1
- package/dist/hooks/useBanner.d.ts.map +1 -1
- package/dist/hooks/useBanner.js +15 -13
- package/dist/hooks/useBanner.js.map +1 -1
- package/dist/hooks/useDashboard.d.ts.map +1 -1
- package/dist/hooks/useDashboard.js +13 -7
- package/dist/hooks/useDashboard.js.map +1 -1
- package/dist/hooks/useFloatingCards.d.ts +1 -0
- package/dist/hooks/useFloatingCards.d.ts.map +1 -1
- package/dist/hooks/useFloatingCards.js +45 -94
- package/dist/hooks/useFloatingCards.js.map +1 -1
- package/dist/hooks/usePartnerIntegration.d.ts +7 -3
- package/dist/hooks/usePartnerIntegration.d.ts.map +1 -1
- package/dist/hooks/usePartnerIntegration.js +62 -7
- package/dist/hooks/usePartnerIntegration.js.map +1 -1
- package/dist/hooks/useWhatsNew.d.ts.map +1 -1
- package/dist/hooks/useWhatsNew.js +10 -10
- package/dist/hooks/useWhatsNew.js.map +1 -1
- package/package.json +1 -1
- package/dist/hooks/useFloatingCardActions.d.ts +0 -18
- package/dist/hooks/useFloatingCardActions.d.ts.map +0 -1
- package/dist/hooks/useFloatingCardActions.js +0 -55
- package/dist/hooks/useFloatingCardActions.js.map +0 -1
- package/dist/hooks/useFloatingCardEngine.d.ts +0 -22
- package/dist/hooks/useFloatingCardEngine.d.ts.map +0 -1
- package/dist/hooks/useFloatingCardEngine.js +0 -40
- package/dist/hooks/useFloatingCardEngine.js.map +0 -1
- package/dist/hooks/useGrowApps.d.ts +0 -11
- package/dist/hooks/useGrowApps.d.ts.map +0 -1
- package/dist/hooks/useGrowApps.js +0 -15
- package/dist/hooks/useGrowApps.js.map +0 -1
package/dist/hooks/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,yBAAyB,CAAC;AACxC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC","sourcesContent":["export * from \"./useDashboard\";\nexport * from \"./useBanner\";\nexport * from \"./useApps\";\nexport * from \"./useArticles\";\nexport * from \"./useWhatsNew\";\nexport * from \"./usePartnerIntegration\";\nexport * from \"./useFloatingCards\";\nexport * from \"./useCampaignTracking\";\nexport * from \"./useTranslations\";\n"]}
|
package/dist/hooks/useApps.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useApps.d.ts","sourceRoot":"","sources":["../../src/hooks/useApps.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"useApps.d.ts","sourceRoot":"","sources":["../../src/hooks/useApps.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAI7C,wBAAgB,OAAO,CAAC,KAAK,CAAC,EAAE,QAAQ,GAAG,OAAO,EAAE,CAOnD;AAED,wBAAgB,YAAY,IAAI,QAAQ,EAAE,CAOzC"}
|
package/dist/hooks/useApps.js
CHANGED
|
@@ -1,11 +1,19 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
import { useSDK } from "../core/SDKManager";
|
|
2
|
+
import { useMemo } from "react";
|
|
3
|
+
export function useApps(group) {
|
|
4
|
+
const sdk = useSDK();
|
|
5
|
+
return useMemo(() => {
|
|
6
|
+
if (!sdk.dashboardEngine)
|
|
7
|
+
return [];
|
|
8
|
+
return sdk.dashboardEngine.getApps(group);
|
|
9
|
+
}, [sdk.dashboardEngine, sdk.dashboardData, group]);
|
|
5
10
|
}
|
|
6
11
|
export function useAppGroups() {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
12
|
+
const sdk = useSDK();
|
|
13
|
+
return useMemo(() => {
|
|
14
|
+
if (!sdk.dashboardEngine)
|
|
15
|
+
return [];
|
|
16
|
+
return sdk.dashboardEngine.getAppGroups();
|
|
17
|
+
}, [sdk.dashboardEngine, sdk.dashboardData]);
|
|
10
18
|
}
|
|
11
19
|
//# sourceMappingURL=useApps.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useApps.js","sourceRoot":"","sources":["../../src/hooks/useApps.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"useApps.js","sourceRoot":"","sources":["../../src/hooks/useApps.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAEhC,MAAM,UAAU,OAAO,CAAC,KAAgB;IACtC,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC;IAErB,OAAO,OAAO,CAAC,GAAG,EAAE;QAClB,IAAI,CAAC,GAAG,CAAC,eAAe;YAAE,OAAO,EAAE,CAAC;QACpC,OAAO,GAAG,CAAC,eAAe,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAC5C,CAAC,EAAE,CAAC,GAAG,CAAC,eAAe,EAAE,GAAG,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC,CAAC;AACtD,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC;IAErB,OAAO,OAAO,CAAC,GAAG,EAAE;QAClB,IAAI,CAAC,GAAG,CAAC,eAAe;YAAE,OAAO,EAAE,CAAC;QACpC,OAAO,GAAG,CAAC,eAAe,CAAC,YAAY,EAAE,CAAC;IAC5C,CAAC,EAAE,CAAC,GAAG,CAAC,eAAe,EAAE,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC;AAC/C,CAAC","sourcesContent":["import { AppItem, AppGroup } from \"../types\";\nimport { useSDK } from \"../core/SDKManager\";\nimport { useMemo } from \"react\";\n\nexport function useApps(group?: AppGroup): AppItem[] {\n const sdk = useSDK();\n \n return useMemo(() => {\n if (!sdk.dashboardEngine) return [];\n return sdk.dashboardEngine.getApps(group);\n }, [sdk.dashboardEngine, sdk.dashboardData, group]);\n}\n\nexport function useAppGroups(): AppGroup[] {\n const sdk = useSDK();\n \n return useMemo(() => {\n if (!sdk.dashboardEngine) return [];\n return sdk.dashboardEngine.getAppGroups();\n }, [sdk.dashboardEngine, sdk.dashboardData]);\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useArticles.d.ts","sourceRoot":"","sources":["../../src/hooks/useArticles.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAEvC,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,KAAK,WAAW,GAAG,SAAS,CAAC;IAC7D,qBAAqB,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,WAAW,EAAE,CAAC;IAC3D,iBAAiB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,WAAW,EAAE,CAAC;CACrD;AAED,wBAAgB,WAAW,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,iBAAiB,
|
|
1
|
+
{"version":3,"file":"useArticles.d.ts","sourceRoot":"","sources":["../../src/hooks/useArticles.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAEvC,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,KAAK,WAAW,GAAG,SAAS,CAAC;IAC7D,qBAAqB,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,WAAW,EAAE,CAAC;IAC3D,iBAAiB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,WAAW,EAAE,CAAC;CACrD;AAED,wBAAgB,WAAW,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,iBAAiB,CA6B7D;AAED,wBAAgB,iBAAiB,CAAC,KAAK,GAAE,MAAU,GAAG,WAAW,EAAE,CAMlE;AAED,wBAAgB,oBAAoB,IAAI,MAAM,EAAE,CAc/C"}
|
|
@@ -1,24 +1,24 @@
|
|
|
1
1
|
import { useMemo } from "react";
|
|
2
2
|
import { useSDK } from "../core/SDKManager";
|
|
3
3
|
export function useArticles(limit) {
|
|
4
|
-
|
|
5
|
-
const sdk = useSDK({});
|
|
4
|
+
const sdk = useSDK();
|
|
6
5
|
const articles = useMemo(() => {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
6
|
+
if (!sdk.dashboardEngine)
|
|
7
|
+
return [];
|
|
8
|
+
return sdk.dashboardEngine.getArticles(limit);
|
|
9
|
+
}, [sdk.dashboardEngine, sdk.dashboardData, limit]);
|
|
10
|
+
const getArticle = (id) => {
|
|
11
|
+
return articles.find(article => article.id === id || article.id === String(id) || article.id === Number(id));
|
|
12
12
|
};
|
|
13
|
-
const getArticlesByCategory = (
|
|
14
|
-
return
|
|
13
|
+
const getArticlesByCategory = (category) => {
|
|
14
|
+
return articles.filter(article => article.category === category);
|
|
15
15
|
};
|
|
16
|
-
const getLatestArticles = (
|
|
17
|
-
return
|
|
16
|
+
const getLatestArticles = (limitCount) => {
|
|
17
|
+
return articles.slice(0, limitCount);
|
|
18
18
|
};
|
|
19
19
|
return {
|
|
20
20
|
articles,
|
|
21
|
-
loading: sdk.
|
|
21
|
+
loading: sdk.dashboardLoading || false,
|
|
22
22
|
getArticle,
|
|
23
23
|
getArticlesByCategory,
|
|
24
24
|
getLatestArticles,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useArticles.js","sourceRoot":"","sources":["../../src/hooks/useArticles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAChC,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAW5C,MAAM,UAAU,WAAW,CAAC,KAAc;IACxC,
|
|
1
|
+
{"version":3,"file":"useArticles.js","sourceRoot":"","sources":["../../src/hooks/useArticles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAChC,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAW5C,MAAM,UAAU,WAAW,CAAC,KAAc;IACxC,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC;IAErB,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,EAAE;QAC5B,IAAI,CAAC,GAAG,CAAC,eAAe;YAAE,OAAO,EAAE,CAAC;QACpC,OAAO,GAAG,CAAC,eAAe,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IAChD,CAAC,EAAE,CAAC,GAAG,CAAC,eAAe,EAAE,GAAG,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC,CAAC;IAEpD,MAAM,UAAU,GAAG,CAAC,EAAmB,EAA2B,EAAE;QAClE,OAAO,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAC7B,OAAO,CAAC,EAAE,KAAK,EAAE,IAAI,OAAO,CAAC,EAAE,KAAK,MAAM,CAAC,EAAE,CAAC,IAAI,OAAO,CAAC,EAAE,KAAK,MAAM,CAAC,EAAE,CAAC,CAC5E,CAAC;IACJ,CAAC,CAAC;IAEF,MAAM,qBAAqB,GAAG,CAAC,QAAgB,EAAiB,EAAE;QAChE,OAAO,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;IACnE,CAAC,CAAC;IAEF,MAAM,iBAAiB,GAAG,CAAC,UAAkB,EAAiB,EAAE;QAC9D,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;IACvC,CAAC,CAAC;IAEF,OAAO;QACL,QAAQ;QACR,OAAO,EAAE,GAAG,CAAC,gBAAgB,IAAI,KAAK;QACtC,UAAU;QACV,qBAAqB;QACrB,iBAAiB;KAClB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,QAAgB,CAAC;IACjD,MAAM,EAAE,QAAQ,EAAE,iBAAiB,EAAE,GAAG,WAAW,EAAE,CAAC;IAEtD,OAAO,OAAO,CAAC,GAAG,EAAE;QAClB,OAAO,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAClC,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,oBAAoB;IAClC,MAAM,EAAE,QAAQ,EAAE,GAAG,WAAW,EAAE,CAAC;IAEnC,OAAO,OAAO,CAAC,GAAG,EAAE;QAClB,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;QAErC,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC3B,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;gBACrB,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YACnC,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,OAAO,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAChC,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;AACjB,CAAC","sourcesContent":["import { useMemo } from \"react\";\nimport { useSDK } from \"../core/SDKManager\";\nimport { ArticleItem } from \"../types\";\n\nexport interface UseArticlesResult {\n articles: ArticleItem[];\n loading: boolean;\n getArticle: (id: string | number) => ArticleItem | undefined;\n getArticlesByCategory: (category: string) => ArticleItem[];\n getLatestArticles: (limit: number) => ArticleItem[];\n}\n\nexport function useArticles(limit?: number): UseArticlesResult {\n const sdk = useSDK();\n\n const articles = useMemo(() => {\n if (!sdk.dashboardEngine) return [];\n return sdk.dashboardEngine.getArticles(limit);\n }, [sdk.dashboardEngine, sdk.dashboardData, limit]);\n\n const getArticle = (id: string | number): ArticleItem | undefined => {\n return articles.find(article => \n article.id === id || article.id === String(id) || article.id === Number(id)\n );\n };\n\n const getArticlesByCategory = (category: string): ArticleItem[] => {\n return articles.filter(article => article.category === category);\n };\n\n const getLatestArticles = (limitCount: number): ArticleItem[] => {\n return articles.slice(0, limitCount);\n };\n\n return {\n articles,\n loading: sdk.dashboardLoading || false,\n getArticle,\n getArticlesByCategory,\n getLatestArticles,\n };\n}\n\nexport function useLatestArticles(limit: number = 5): ArticleItem[] {\n const { articles, getLatestArticles } = useArticles();\n\n return useMemo(() => {\n return getLatestArticles(limit);\n }, [articles, limit]);\n}\n\nexport function useArticleCategories(): string[] {\n const { articles } = useArticles();\n\n return useMemo(() => {\n const categories = new Set<string>();\n\n articles.forEach((article) => {\n if (article.category) {\n categories.add(article.category);\n }\n });\n\n return Array.from(categories);\n }, [articles]);\n}\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { BannerItem, BannerType } from "../types";
|
|
2
|
-
export declare function useBanners(
|
|
2
|
+
export declare function useBanners(type?: BannerType): BannerItem[];
|
|
3
3
|
export declare function useTopBanner(): BannerItem | null;
|
|
4
4
|
export declare function usePopupBanner(): BannerItem | null;
|
|
5
5
|
export declare function useFooterBanner(): BannerItem | null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useBanner.d.ts","sourceRoot":"","sources":["../../src/hooks/useBanner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"useBanner.d.ts","sourceRoot":"","sources":["../../src/hooks/useBanner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAIlD,wBAAgB,UAAU,CAAC,IAAI,CAAC,EAAE,UAAU,GAAG,UAAU,EAAE,CAO1D;AAED,wBAAgB,YAAY,IAAI,UAAU,GAAG,IAAI,CAGhD;AAED,wBAAgB,cAAc,IAAI,UAAU,GAAG,IAAI,CAGlD;AAED,wBAAgB,eAAe,IAAI,UAAU,GAAG,IAAI,CAGnD"}
|
package/dist/hooks/useBanner.js
CHANGED
|
@@ -1,21 +1,23 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
import { useSDK } from "../core/SDKManager";
|
|
2
|
+
import { useMemo } from "react";
|
|
3
|
+
export function useBanners(type) {
|
|
4
|
+
const sdk = useSDK();
|
|
5
|
+
return useMemo(() => {
|
|
6
|
+
if (!sdk.dashboardEngine)
|
|
7
|
+
return [];
|
|
8
|
+
return sdk.dashboardEngine.getActiveBanners(type);
|
|
9
|
+
}, [sdk.dashboardEngine, sdk.dashboardData, type]);
|
|
5
10
|
}
|
|
6
11
|
export function useTopBanner() {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
return null;
|
|
12
|
+
const banners = useBanners("top_banner");
|
|
13
|
+
return banners[0] || null;
|
|
10
14
|
}
|
|
11
15
|
export function usePopupBanner() {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
return null;
|
|
16
|
+
const banners = useBanners("popup");
|
|
17
|
+
return banners[0] || null;
|
|
15
18
|
}
|
|
16
19
|
export function useFooterBanner() {
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
return null;
|
|
20
|
+
const banners = useBanners("footer_banner");
|
|
21
|
+
return banners[0] || null;
|
|
20
22
|
}
|
|
21
23
|
//# sourceMappingURL=useBanner.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useBanner.js","sourceRoot":"","sources":["../../src/hooks/useBanner.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"useBanner.js","sourceRoot":"","sources":["../../src/hooks/useBanner.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAEhC,MAAM,UAAU,UAAU,CAAC,IAAiB;IAC1C,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC;IAErB,OAAO,OAAO,CAAC,GAAG,EAAE;QAClB,IAAI,CAAC,GAAG,CAAC,eAAe;YAAE,OAAO,EAAE,CAAC;QACpC,OAAO,GAAG,CAAC,eAAe,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACpD,CAAC,EAAE,CAAC,GAAG,CAAC,eAAe,EAAE,GAAG,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,MAAM,OAAO,GAAG,UAAU,CAAC,YAAY,CAAC,CAAC;IACzC,OAAO,OAAO,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;IACpC,OAAO,OAAO,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,MAAM,OAAO,GAAG,UAAU,CAAC,eAAe,CAAC,CAAC;IAC5C,OAAO,OAAO,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;AAC5B,CAAC","sourcesContent":["import { BannerItem, BannerType } from \"../types\";\nimport { useSDK } from \"../core/SDKManager\";\nimport { useMemo } from \"react\";\n\nexport function useBanners(type?: BannerType): BannerItem[] {\n const sdk = useSDK();\n\n return useMemo(() => {\n if (!sdk.dashboardEngine) return [];\n return sdk.dashboardEngine.getActiveBanners(type);\n }, [sdk.dashboardEngine, sdk.dashboardData, type]);\n}\n\nexport function useTopBanner(): BannerItem | null {\n const banners = useBanners(\"top_banner\");\n return banners[0] || null;\n}\n\nexport function usePopupBanner(): BannerItem | null {\n const banners = useBanners(\"popup\");\n return banners[0] || null;\n}\n\nexport function useFooterBanner(): BannerItem | null {\n const banners = useBanners(\"footer_banner\");\n return banners[0] || null;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useDashboard.d.ts","sourceRoot":"","sources":["../../src/hooks/useDashboard.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"useDashboard.d.ts","sourceRoot":"","sources":["../../src/hooks/useDashboard.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,aAAa,GAAG,IAAI,CAAC;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,aAAa,EAAE,OAAO,CAAC;IACvB,SAAS,EAAE,IAAI,GAAG,IAAI,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,YAAY,IAAI,kBAAkB,CAoBjD"}
|
|
@@ -1,15 +1,21 @@
|
|
|
1
1
|
import { useSDK } from "../core/SDKManager";
|
|
2
|
+
import SDKManager from "../core/SDKManager";
|
|
2
3
|
export function useDashboard() {
|
|
3
|
-
// Legacy hook - use useSDK instead
|
|
4
4
|
const sdk = useSDK({});
|
|
5
|
-
//
|
|
5
|
+
// Get dashboard data from SDK
|
|
6
|
+
const dashboardData = SDKManager.getDashboardData();
|
|
6
7
|
return {
|
|
7
|
-
data: null,
|
|
8
|
-
loading: sdk.
|
|
9
|
-
error: sdk.
|
|
10
|
-
refresh: async () => {
|
|
8
|
+
data: dashboardData || null,
|
|
9
|
+
loading: sdk.dashboardLoading || false,
|
|
10
|
+
error: sdk.dashboardError || null,
|
|
11
|
+
refresh: async () => {
|
|
12
|
+
// Trigger a refresh through SDK
|
|
13
|
+
if (SDKManager.getDashboardEngine()) {
|
|
14
|
+
await SDKManager.getDashboardEngine().refresh();
|
|
15
|
+
}
|
|
16
|
+
},
|
|
11
17
|
isInitialized: sdk.initialized,
|
|
12
|
-
lastFetch:
|
|
18
|
+
lastFetch: dashboardData ? new Date() : null,
|
|
13
19
|
locale: sdk.locale,
|
|
14
20
|
};
|
|
15
21
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useDashboard.js","sourceRoot":"","sources":["../../src/hooks/useDashboard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAa5C,MAAM,UAAU,YAAY;IAC1B,
|
|
1
|
+
{"version":3,"file":"useDashboard.js","sourceRoot":"","sources":["../../src/hooks/useDashboard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,UAAU,MAAM,oBAAoB,CAAC;AAa5C,MAAM,UAAU,YAAY;IAC1B,MAAM,GAAG,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC;IAEvB,8BAA8B;IAC9B,MAAM,aAAa,GAAG,UAAU,CAAC,gBAAgB,EAAE,CAAC;IAEpD,OAAO;QACL,IAAI,EAAE,aAAa,IAAI,IAAI;QAC3B,OAAO,EAAE,GAAG,CAAC,gBAAgB,IAAI,KAAK;QACtC,KAAK,EAAE,GAAG,CAAC,cAAc,IAAI,IAAI;QACjC,OAAO,EAAE,KAAK,IAAI,EAAE;YAClB,gCAAgC;YAChC,IAAI,UAAU,CAAC,kBAAkB,EAAE,EAAE,CAAC;gBACpC,MAAM,UAAU,CAAC,kBAAkB,EAAG,CAAC,OAAO,EAAE,CAAC;YACnD,CAAC;QACH,CAAC;QACD,aAAa,EAAE,GAAG,CAAC,WAAW;QAC9B,SAAS,EAAE,aAAa,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI;QAC5C,MAAM,EAAE,GAAG,CAAC,MAAM;KACnB,CAAC;AACJ,CAAC","sourcesContent":["import { useSDK } from \"../core/SDKManager\";\nimport SDKManager from \"../core/SDKManager\";\nimport { DashboardData } from \"../types\";\n\nexport interface UseDashboardResult {\n data: DashboardData | null;\n loading: boolean;\n error: Error | null;\n refresh: () => Promise<void>;\n isInitialized: boolean;\n lastFetch: Date | null;\n locale: string;\n}\n\nexport function useDashboard(): UseDashboardResult {\n const sdk = useSDK({});\n \n // Get dashboard data from SDK\n const dashboardData = SDKManager.getDashboardData();\n \n return {\n data: dashboardData || null,\n loading: sdk.dashboardLoading || false,\n error: sdk.dashboardError || null,\n refresh: async () => {\n // Trigger a refresh through SDK\n if (SDKManager.getDashboardEngine()) {\n await SDKManager.getDashboardEngine()!.refresh();\n }\n },\n isInitialized: sdk.initialized,\n lastFetch: dashboardData ? new Date() : null,\n locale: sdk.locale,\n };\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useFloatingCards.d.ts","sourceRoot":"","sources":["../../src/hooks/useFloatingCards.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAU,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"useFloatingCards.d.ts","sourceRoot":"","sources":["../../src/hooks/useFloatingCards.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAU,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEhE,YAAY,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAEnE,UAAU,uBAAwB,SAAQ,aAAa;IACrD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,UAAU,sBAAsB;IAC9B,KAAK,EAAE,gBAAgB,EAAE,CAAC;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC5B,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,mBAAmB,EAAE,MAAM,IAAI,CAAC;IAChC,UAAU,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACjC;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,GAAE,uBAA4B,GACpC,sBAAsB,CAkHxB;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,OAAO,GAAE,uBAA4B,GACpC;IACD,YAAY,EAAE,gBAAgB,EAAE,CAAC;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,mBAAmB,EAAE,MAAM,IAAI,CAAC;IAChC,iBAAiB,EAAE,OAAO,CAAC;CAC5B,CA2EA"}
|
|
@@ -1,95 +1,42 @@
|
|
|
1
|
-
import { useState, useEffect, useCallback } from "react";
|
|
1
|
+
import { useState, useEffect, useCallback, useMemo } from "react";
|
|
2
2
|
import { useSDK } from "../core/SDKManager";
|
|
3
|
+
import SDKManager from "../core/SDKManager";
|
|
3
4
|
/**
|
|
4
5
|
* Hook to fetch and manage floating cards (campaigns)
|
|
6
|
+
* Now uses SDK-managed campaigns data
|
|
5
7
|
*/
|
|
6
8
|
export function useFloatingCards(options = {}) {
|
|
7
|
-
const {
|
|
9
|
+
const {
|
|
8
10
|
// SDK options
|
|
9
11
|
shopInfo, locale: propsLocale, translations, config, } = options;
|
|
10
12
|
// Get SDK state and auto-initialize
|
|
11
13
|
const sdk = useSDK({ shopInfo, locale: propsLocale, translations, config });
|
|
12
|
-
// Use shopId from props or SDK shopInfo
|
|
13
|
-
const shopId = propsShopId || sdk.shopInfo?.id;
|
|
14
|
-
// Use locale from SDK
|
|
15
|
-
const locale = sdk.locale;
|
|
16
|
-
const [cards, setCards] = useState([]);
|
|
17
|
-
const [loading, setLoading] = useState(false);
|
|
18
|
-
const [error, setError] = useState(null);
|
|
19
14
|
const [dismissedCards, setDismissedCards] = useState(new Set());
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
15
|
+
// Get campaigns data directly from SDK
|
|
16
|
+
const campaignsData = SDKManager.getCampaignsData();
|
|
17
|
+
// Transform campaigns data to FloatingCardData format
|
|
18
|
+
const cards = useMemo(() => {
|
|
19
|
+
if (!campaignsData || !Array.isArray(campaignsData)) {
|
|
20
|
+
return [];
|
|
24
21
|
}
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
//
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
// "/api/dashboard" -> "/api"
|
|
35
|
-
// "https://ops.trustshop.io/api/dashboard" -> "https://ops.trustshop.io/api"
|
|
36
|
-
const configUrl = sdk.config.apiUrl;
|
|
37
|
-
if (configUrl.includes('/dashboard')) {
|
|
38
|
-
baseUrl = configUrl.replace('/dashboard', '');
|
|
39
|
-
}
|
|
40
|
-
else {
|
|
41
|
-
// Fallback: assume it's already the base API URL
|
|
42
|
-
baseUrl = configUrl;
|
|
22
|
+
return campaignsData.map((card) => ({
|
|
23
|
+
...card,
|
|
24
|
+
// Ensure date format
|
|
25
|
+
date: card.date || `Updated: ${new Date().toLocaleDateString()}`,
|
|
26
|
+
// Transform tag tone if needed
|
|
27
|
+
tag: card.tag
|
|
28
|
+
? {
|
|
29
|
+
...card.tag,
|
|
30
|
+
tone: card.tag.tone || "info",
|
|
43
31
|
}
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
const apiUrl = `${baseUrl}/campaigns?shop_id=${id}&locale=${locale}`;
|
|
53
|
-
const response = await fetch(apiUrl, {
|
|
54
|
-
method: "GET",
|
|
55
|
-
headers: {
|
|
56
|
-
Accept: "application/json",
|
|
57
|
-
"Content-Type": "application/json",
|
|
58
|
-
...(sdk.config?.headers || {}),
|
|
59
|
-
},
|
|
60
|
-
credentials: "include",
|
|
61
|
-
});
|
|
62
|
-
if (!response.ok) {
|
|
63
|
-
throw new Error(`Failed to fetch campaigns: ${response.statusText}`);
|
|
64
|
-
}
|
|
65
|
-
const data = await response.json();
|
|
66
|
-
if (data.success && Array.isArray(data.data)) {
|
|
67
|
-
const transformedCards = data.data.map((card) => ({
|
|
68
|
-
...card,
|
|
69
|
-
// Ensure date format
|
|
70
|
-
date: card.date || `Updated: ${new Date().toLocaleDateString()}`,
|
|
71
|
-
// Transform tag tone if needed
|
|
72
|
-
tag: card.tag
|
|
73
|
-
? {
|
|
74
|
-
...card.tag,
|
|
75
|
-
tone: card.tag.tone || "info",
|
|
76
|
-
}
|
|
77
|
-
: undefined,
|
|
78
|
-
}));
|
|
79
|
-
setCards(transformedCards);
|
|
80
|
-
}
|
|
81
|
-
else {
|
|
82
|
-
setCards([]);
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
catch (err) {
|
|
86
|
-
setError(err instanceof Error ? err : new Error("Unknown error"));
|
|
87
|
-
setCards([]);
|
|
88
|
-
}
|
|
89
|
-
finally {
|
|
90
|
-
setLoading(false);
|
|
91
|
-
}
|
|
92
|
-
}, [shopId, locale, sdk.config?.apiUrl, sdk.config?.headers]);
|
|
32
|
+
: undefined,
|
|
33
|
+
}));
|
|
34
|
+
}, [campaignsData]);
|
|
35
|
+
// Dummy fetchCards for backward compatibility
|
|
36
|
+
const fetchCards = useCallback(async () => {
|
|
37
|
+
// Data is now managed by SDK, this is a no-op
|
|
38
|
+
// console.log("Campaigns data is now managed by SDK automatically");
|
|
39
|
+
}, []);
|
|
93
40
|
const dismissCard = useCallback((cardId) => {
|
|
94
41
|
setDismissedCards((prev) => {
|
|
95
42
|
const newSet = new Set(prev);
|
|
@@ -128,16 +75,20 @@ export function useFloatingCards(options = {}) {
|
|
|
128
75
|
console.error("Failed to load dismissed cards:", e);
|
|
129
76
|
}
|
|
130
77
|
}, []);
|
|
131
|
-
//
|
|
78
|
+
// Listen for campaigns refresh events from SDK
|
|
132
79
|
useEffect(() => {
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
}
|
|
136
|
-
|
|
80
|
+
const handleCampaignsRefresh = (_event) => {
|
|
81
|
+
// console.log("Campaigns refreshed via SDK:", _event.detail);
|
|
82
|
+
};
|
|
83
|
+
window.addEventListener("trustshop-campaigns-refresh", handleCampaignsRefresh);
|
|
84
|
+
return () => {
|
|
85
|
+
window.removeEventListener("trustshop-campaigns-refresh", handleCampaignsRefresh);
|
|
86
|
+
};
|
|
87
|
+
}, []);
|
|
137
88
|
return {
|
|
138
89
|
cards,
|
|
139
|
-
loading,
|
|
140
|
-
error,
|
|
90
|
+
loading: sdk.campaignsLoading || false,
|
|
91
|
+
error: sdk.campaignsError || null,
|
|
141
92
|
dismissedCards,
|
|
142
93
|
dismissCard,
|
|
143
94
|
resetDismissedCards,
|
|
@@ -177,13 +128,13 @@ export function useVisibleFloatingCards(options = {}) {
|
|
|
177
128
|
// Debug log for development
|
|
178
129
|
if (typeof window !== "undefined" &&
|
|
179
130
|
window.location.hostname === "localhost") {
|
|
180
|
-
console.log("[FloatingCard] Route matching:", {
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
});
|
|
131
|
+
// console.log("[FloatingCard] Route matching:", {
|
|
132
|
+
// cardId: card.id,
|
|
133
|
+
// currentRoute,
|
|
134
|
+
// currentPage,
|
|
135
|
+
// display_pages: card.display_pages,
|
|
136
|
+
// matches: card.display_pages.includes(currentPage),
|
|
137
|
+
// });
|
|
187
138
|
}
|
|
188
139
|
// Check if current page is in display_pages
|
|
189
140
|
return card.display_pages.includes(currentPage);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useFloatingCards.js","sourceRoot":"","sources":["../../src/hooks/useFloatingCards.ts"],"names":[],"mappings":"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","sourcesContent":["import { useState, useEffect, useCallback } from \"react\";\nimport type { FloatingCardData } from \"../components/FloatingCard\";\nimport { useSDK, type UseSDKOptions } from \"../core/SDKManager\";\nexport type { FloatingCardData } from \"../components/FloatingCard\";\n\ninterface UseFloatingCardsOptions extends UseSDKOptions {\n shopId?: string;\n autoFetch?: boolean;\n currentRoute?: string;\n}\n\ninterface UseFloatingCardsReturn {\n cards: FloatingCardData[];\n loading: boolean;\n error: Error | null;\n dismissedCards: Set<number>;\n dismissCard: (cardId: number) => void;\n resetDismissedCards: () => void;\n fetchCards: () => Promise<void>;\n}\n\n/**\n * Hook to fetch and manage floating cards (campaigns)\n */\nexport function useFloatingCards(\n options: UseFloatingCardsOptions = {},\n): UseFloatingCardsReturn {\n const { \n shopId: propsShopId, \n autoFetch = true, \n // SDK options\n shopInfo,\n locale: propsLocale,\n translations,\n config,\n } = options;\n\n // Get SDK state and auto-initialize\n const sdk = useSDK({ shopInfo, locale: propsLocale, translations, config });\n \n // Use shopId from props or SDK shopInfo\n const shopId = propsShopId || sdk.shopInfo?.id;\n \n // Use locale from SDK\n const locale = sdk.locale;\n\n const [cards, setCards] = useState<FloatingCardData[]>([]);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [dismissedCards, setDismissedCards] = useState<Set<number>>(new Set());\n\n const fetchCards = useCallback(async () => {\n if (!shopId) {\n setError(new Error(\"Shop ID is required\"));\n return;\n }\n\n setLoading(true);\n setError(null);\n\n try {\n const id = shopId;\n \n // Extract base URL from SDK config or use defaults\n // sdk.config.apiUrl is typically \"/api/dashboard\", we need just the base \"/api\" part\n let baseUrl: string;\n \n if (sdk.config?.apiUrl) {\n // Extract base URL from dashboard API URL\n // \"/api/dashboard\" -> \"/api\"\n // \"https://ops.trustshop.io/api/dashboard\" -> \"https://ops.trustshop.io/api\"\n const configUrl = sdk.config.apiUrl;\n if (configUrl.includes('/dashboard')) {\n baseUrl = configUrl.replace('/dashboard', '');\n } else {\n // Fallback: assume it's already the base API URL\n baseUrl = configUrl;\n }\n } else {\n // Default fallback\n baseUrl = 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=${id}&locale=${locale}`;\n\n const response = await fetch(apiUrl, {\n method: \"GET\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n ...(sdk.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 if (data.success && Array.isArray(data.data)) {\n const transformedCards: FloatingCardData[] = data.data.map(\n (card: any) => ({\n ...card,\n // Ensure date format\n date: card.date || `Updated: ${new Date().toLocaleDateString()}`,\n // Transform tag tone if needed\n tag: card.tag\n ? {\n ...card.tag,\n tone: card.tag.tone || \"info\",\n }\n : undefined,\n }),\n );\n\n setCards(transformedCards);\n } else {\n setCards([]);\n }\n } catch (err) {\n setError(err instanceof Error ? err : new Error(\"Unknown error\"));\n setCards([]);\n } finally {\n setLoading(false);\n }\n }, [shopId, locale, sdk.config?.apiUrl, sdk.config?.headers]);\n\n const dismissCard = useCallback((cardId: number) => {\n setDismissedCards((prev) => {\n const newSet = new Set(prev);\n newSet.add(cardId);\n\n // Store in localStorage for persistence\n try {\n localStorage.setItem(\n \"trustshop_dismissed_cards\",\n JSON.stringify(Array.from(newSet)),\n );\n } catch (e) {\n console.error(\"Failed to save dismissed cards:\", e);\n }\n\n return newSet;\n });\n }, []);\n\n const resetDismissedCards = useCallback(() => {\n setDismissedCards(new Set());\n try {\n localStorage.removeItem(\"trustshop_dismissed_cards\");\n } catch (e) {\n console.error(\"Failed to clear dismissed cards:\", e);\n }\n }, []);\n\n // Load dismissed cards from localStorage on mount\n useEffect(() => {\n try {\n const stored = localStorage.getItem(\"trustshop_dismissed_cards\");\n if (stored) {\n const parsed = JSON.parse(stored);\n if (Array.isArray(parsed)) {\n setDismissedCards(new Set(parsed));\n }\n }\n } catch (e) {\n console.error(\"Failed to load dismissed cards:\", e);\n }\n }, []);\n\n // Auto-fetch on mount or when shopId/locale changes\n useEffect(() => {\n if (autoFetch && shopId) {\n fetchCards();\n }\n }, [autoFetch, shopId, fetchCards]); // fetchCards already depends on locale\n\n return {\n cards,\n loading,\n error,\n dismissedCards,\n dismissCard,\n resetDismissedCards,\n fetchCards,\n };\n}\n\n/**\n * Get visible (non-dismissed) cards\n */\nexport function useVisibleFloatingCards(\n options: UseFloatingCardsOptions = {},\n): {\n visibleCards: FloatingCardData[];\n loading: boolean;\n error: Error | null;\n dismissCard: (cardId: number) => void;\n resetDismissedCards: () => void;\n hasDismissedCards: boolean;\n} {\n const { currentRoute, ...restOptions } = options;\n // Note: locale is passed through in restOptions\n const {\n cards,\n loading,\n error,\n dismissedCards,\n dismissCard,\n resetDismissedCards,\n } = useFloatingCards(restOptions);\n\n // Filter cards based on:\n // 1. Not dismissed\n // 2. Route matching (if display_pages is set)\n const visibleCards = cards.filter((card) => {\n // Check if card is dismissed\n if (dismissedCards.has(card.id)) {\n return false;\n }\n\n // Check display_pages logic\n if (card.display_pages !== undefined && card.display_pages !== null) {\n // If display_pages is empty array, show on all pages\n if (card.display_pages.length === 0) {\n return true;\n }\n\n // If display_pages has values, check if current route matches\n if (currentRoute !== undefined) {\n // Extract the page key from the route\n // Special handling: \"/\" or \"\" should map to \"dashboard\"\n let currentPage = currentRoute.replace(/^\\//, \"\").split(\"/\")[0];\n\n // Map root route to dashboard (in-app convention)\n if (!currentPage || currentPage === \"\" || currentRoute === \"/\") {\n currentPage = \"dashboard\";\n }\n\n // Debug log for development\n if (\n typeof window !== \"undefined\" &&\n window.location.hostname === \"localhost\"\n ) {\n console.log(\"[FloatingCard] Route matching:\", {\n cardId: card.id,\n currentRoute,\n currentPage,\n display_pages: card.display_pages,\n matches: card.display_pages.includes(currentPage),\n });\n }\n\n // Check if current page is in display_pages\n return card.display_pages.includes(currentPage);\n }\n\n // If no current route provided, assume dashboard\n return card.display_pages.includes(\"dashboard\");\n }\n\n // If display_pages is not defined, show on all pages (backward compatibility)\n return true;\n });\n\n const hasDismissedCards = dismissedCards.size > 0;\n\n return {\n visibleCards,\n loading,\n error,\n dismissCard,\n resetDismissedCards,\n hasDismissedCards,\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"useFloatingCards.js","sourceRoot":"","sources":["../../src/hooks/useFloatingCards.ts"],"names":[],"mappings":"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","sourcesContent":["import { useState, useEffect, useCallback, useMemo } from \"react\";\nimport type { FloatingCardData } from \"../components/FloatingCard\";\nimport { useSDK, type UseSDKOptions } from \"../core/SDKManager\";\nimport SDKManager from \"../core/SDKManager\";\nexport type { FloatingCardData } from \"../components/FloatingCard\";\n\ninterface UseFloatingCardsOptions extends UseSDKOptions {\n shopId?: string;\n autoFetch?: boolean;\n currentRoute?: string;\n}\n\ninterface UseFloatingCardsReturn {\n cards: FloatingCardData[];\n loading: boolean;\n error: Error | null;\n dismissedCards: Set<number>;\n dismissCard: (cardId: number) => void;\n resetDismissedCards: () => void;\n fetchCards: () => Promise<void>;\n}\n\n/**\n * Hook to fetch and manage floating cards (campaigns)\n * Now uses SDK-managed campaigns data\n */\nexport function useFloatingCards(\n options: UseFloatingCardsOptions = {},\n): UseFloatingCardsReturn {\n const {\n // SDK options\n shopInfo,\n locale: propsLocale,\n translations,\n config,\n } = options;\n\n // Get SDK state and auto-initialize\n const sdk = useSDK({ shopInfo, locale: propsLocale, translations, config });\n\n const [dismissedCards, setDismissedCards] = useState<Set<number>>(new Set());\n\n // Get campaigns data directly from SDK\n const campaignsData = SDKManager.getCampaignsData();\n\n // Transform campaigns data to FloatingCardData format\n const cards = useMemo(() => {\n if (!campaignsData || !Array.isArray(campaignsData)) {\n return [];\n }\n\n return campaignsData.map((card: any) => ({\n ...card,\n // Ensure date format\n date: card.date || `Updated: ${new Date().toLocaleDateString()}`,\n // Transform tag tone if needed\n tag: card.tag\n ? {\n ...card.tag,\n tone: card.tag.tone || \"info\",\n }\n : undefined,\n })) as FloatingCardData[];\n }, [campaignsData]);\n\n // Dummy fetchCards for backward compatibility\n const fetchCards = useCallback(async () => {\n // Data is now managed by SDK, this is a no-op\n // console.log(\"Campaigns data is now managed by SDK automatically\");\n }, []);\n\n const dismissCard = useCallback((cardId: number) => {\n setDismissedCards((prev) => {\n const newSet = new Set(prev);\n newSet.add(cardId);\n\n // Store in localStorage for persistence\n try {\n localStorage.setItem(\n \"trustshop_dismissed_cards\",\n JSON.stringify(Array.from(newSet)),\n );\n } catch (e) {\n console.error(\"Failed to save dismissed cards:\", e);\n }\n\n return newSet;\n });\n }, []);\n\n const resetDismissedCards = useCallback(() => {\n setDismissedCards(new Set());\n try {\n localStorage.removeItem(\"trustshop_dismissed_cards\");\n } catch (e) {\n console.error(\"Failed to clear dismissed cards:\", e);\n }\n }, []);\n\n // Load dismissed cards from localStorage on mount\n useEffect(() => {\n try {\n const stored = localStorage.getItem(\"trustshop_dismissed_cards\");\n if (stored) {\n const parsed = JSON.parse(stored);\n if (Array.isArray(parsed)) {\n setDismissedCards(new Set(parsed));\n }\n }\n } catch (e) {\n console.error(\"Failed to load dismissed cards:\", e);\n }\n }, []);\n\n // Listen for campaigns refresh events from SDK\n useEffect(() => {\n const handleCampaignsRefresh = (_event: any) => {\n // console.log(\"Campaigns refreshed via SDK:\", _event.detail);\n };\n\n window.addEventListener(\n \"trustshop-campaigns-refresh\",\n handleCampaignsRefresh,\n );\n\n return () => {\n window.removeEventListener(\n \"trustshop-campaigns-refresh\",\n handleCampaignsRefresh,\n );\n };\n }, []);\n\n return {\n cards,\n loading: sdk.campaignsLoading || false,\n error: sdk.campaignsError || null,\n dismissedCards,\n dismissCard,\n resetDismissedCards,\n fetchCards,\n };\n}\n\n/**\n * Get visible (non-dismissed) cards\n */\nexport function useVisibleFloatingCards(\n options: UseFloatingCardsOptions = {},\n): {\n visibleCards: FloatingCardData[];\n loading: boolean;\n error: Error | null;\n dismissCard: (cardId: number) => void;\n resetDismissedCards: () => void;\n hasDismissedCards: boolean;\n} {\n const { currentRoute, ...restOptions } = options;\n // Note: locale is passed through in restOptions\n const {\n cards,\n loading,\n error,\n dismissedCards,\n dismissCard,\n resetDismissedCards,\n } = useFloatingCards(restOptions);\n\n // Filter cards based on:\n // 1. Not dismissed\n // 2. Route matching (if display_pages is set)\n const visibleCards = cards.filter((card) => {\n // Check if card is dismissed\n if (dismissedCards.has(card.id)) {\n return false;\n }\n\n // Check display_pages logic\n if (card.display_pages !== undefined && card.display_pages !== null) {\n // If display_pages is empty array, show on all pages\n if (card.display_pages.length === 0) {\n return true;\n }\n\n // If display_pages has values, check if current route matches\n if (currentRoute !== undefined) {\n // Extract the page key from the route\n // Special handling: \"/\" or \"\" should map to \"dashboard\"\n let currentPage = currentRoute.replace(/^\\//, \"\").split(\"/\")[0];\n\n // Map root route to dashboard (in-app convention)\n if (!currentPage || currentPage === \"\" || currentRoute === \"/\") {\n currentPage = \"dashboard\";\n }\n\n // Debug log for development\n if (\n typeof window !== \"undefined\" &&\n window.location.hostname === \"localhost\"\n ) {\n // console.log(\"[FloatingCard] Route matching:\", {\n // cardId: card.id,\n // currentRoute,\n // currentPage,\n // display_pages: card.display_pages,\n // matches: card.display_pages.includes(currentPage),\n // });\n }\n\n // Check if current page is in display_pages\n return card.display_pages.includes(currentPage);\n }\n\n // If no current route provided, assume dashboard\n return card.display_pages.includes(\"dashboard\");\n }\n\n // If display_pages is not defined, show on all pages (backward compatibility)\n return true;\n });\n\n const hasDismissedCards = dismissedCards.size > 0;\n\n return {\n visibleCards,\n loading,\n error,\n dismissCard,\n resetDismissedCards,\n hasDismissedCards,\n };\n}\n"]}
|
|
@@ -3,10 +3,14 @@ import { IntegrationItem } from "../types/integration";
|
|
|
3
3
|
* Hook to get all partner integrations from dashboard data
|
|
4
4
|
*/
|
|
5
5
|
export declare function usePartnerIntegrations(): {
|
|
6
|
-
groups:
|
|
6
|
+
groups: {
|
|
7
|
+
key: string;
|
|
8
|
+
title: string;
|
|
9
|
+
items: any[];
|
|
10
|
+
}[];
|
|
7
11
|
loading: boolean;
|
|
8
|
-
error: Error |
|
|
9
|
-
integrations:
|
|
12
|
+
error: Error | null;
|
|
13
|
+
integrations: any[];
|
|
10
14
|
};
|
|
11
15
|
/**
|
|
12
16
|
* Hook to get a specific integration by key
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usePartnerIntegration.d.ts","sourceRoot":"","sources":["../../src/hooks/usePartnerIntegration.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"usePartnerIntegration.d.ts","sourceRoot":"","sources":["../../src/hooks/usePartnerIntegration.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD;;GAEG;AACH,wBAAgB,sBAAsB;;aAoD3B,MAAM;eACJ,MAAM;eACN,GAAG,EAAE;;;;;EAiCjB;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CACxC,GAAG,EAAE,MAAM,GACV,eAAe,GAAG,IAAI,CAMxB;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,MAAM,GAAG;IACxD,WAAW,EAAE,OAAO,CAAC;IACrB,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,EAAE,OAAO,CAAC;CACtB,CAeA"}
|
|
@@ -1,20 +1,75 @@
|
|
|
1
1
|
import { useMemo } from "react";
|
|
2
2
|
import { useSDK } from "../core/SDKManager";
|
|
3
|
+
import SDKManager from "../core/SDKManager";
|
|
3
4
|
/**
|
|
4
5
|
* Hook to get all partner integrations from dashboard data
|
|
5
6
|
*/
|
|
6
7
|
export function usePartnerIntegrations() {
|
|
7
|
-
// Legacy hook - components should use SDK directly
|
|
8
8
|
const sdk = useSDK({});
|
|
9
|
+
// Get dashboard data from SDK
|
|
10
|
+
const dashboardData = SDKManager.getDashboardData();
|
|
11
|
+
// Partner integrations are stored directly in the integrations field
|
|
12
|
+
const integrations = useMemo(() => {
|
|
13
|
+
if (!dashboardData?.integrations) {
|
|
14
|
+
return [];
|
|
15
|
+
}
|
|
16
|
+
// Filter out Google Reviews
|
|
17
|
+
return dashboardData.integrations.filter((item) => item.key !== "google_reviews" && item.title !== "Google Reviews");
|
|
18
|
+
}, [dashboardData]);
|
|
19
|
+
// Group integrations by category using the API's category_key field
|
|
9
20
|
const groups = useMemo(() => {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
21
|
+
if (!integrations || integrations.length === 0) {
|
|
22
|
+
return [];
|
|
23
|
+
}
|
|
24
|
+
// Group by category_key from API
|
|
25
|
+
const categoryGroups = {};
|
|
26
|
+
const categoryTitles = {};
|
|
27
|
+
integrations.forEach((item) => {
|
|
28
|
+
const categoryKey = item.category_key || 'other';
|
|
29
|
+
const categoryTitle = item.category || 'Other';
|
|
30
|
+
if (!categoryGroups[categoryKey]) {
|
|
31
|
+
categoryGroups[categoryKey] = [];
|
|
32
|
+
categoryTitles[categoryKey] = categoryTitle;
|
|
33
|
+
}
|
|
34
|
+
categoryGroups[categoryKey].push(item);
|
|
35
|
+
});
|
|
36
|
+
// Get translations
|
|
37
|
+
const translations = sdk.translations?.partnerIntegration || {};
|
|
38
|
+
// Define category order and translation mapping
|
|
39
|
+
const categoryOrder = ['review_sources', 'post_purchase_automation', 'seo_rich_snippets'];
|
|
40
|
+
const translationMap = {
|
|
41
|
+
'review_sources': translations.reviewSourcesTitle || 'Review Sources',
|
|
42
|
+
'post_purchase_automation': translations.postPurchaseTitle || 'Post-purchase & Automation',
|
|
43
|
+
'seo_rich_snippets': translations.seoSnippetsTitle || 'SEO & Rich Snippets'
|
|
44
|
+
};
|
|
45
|
+
// Build groups in order
|
|
46
|
+
const allGroups = [];
|
|
47
|
+
// Add categories in preferred order first
|
|
48
|
+
categoryOrder.forEach(categoryKey => {
|
|
49
|
+
if (categoryGroups[categoryKey]) {
|
|
50
|
+
allGroups.push({
|
|
51
|
+
key: categoryKey,
|
|
52
|
+
title: translationMap[categoryKey] || categoryTitles[categoryKey],
|
|
53
|
+
items: categoryGroups[categoryKey]
|
|
54
|
+
});
|
|
55
|
+
delete categoryGroups[categoryKey];
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
// Add any remaining categories
|
|
59
|
+
Object.entries(categoryGroups).forEach(([categoryKey, items]) => {
|
|
60
|
+
allGroups.push({
|
|
61
|
+
key: categoryKey,
|
|
62
|
+
title: categoryTitles[categoryKey],
|
|
63
|
+
items
|
|
64
|
+
});
|
|
65
|
+
});
|
|
66
|
+
return allGroups;
|
|
67
|
+
}, [integrations, sdk.translations]);
|
|
13
68
|
return {
|
|
14
69
|
groups,
|
|
15
|
-
loading: sdk.
|
|
16
|
-
error: sdk.
|
|
17
|
-
integrations
|
|
70
|
+
loading: sdk.dashboardLoading || false,
|
|
71
|
+
error: sdk.dashboardError || null,
|
|
72
|
+
integrations,
|
|
18
73
|
};
|
|
19
74
|
}
|
|
20
75
|
/**
|