@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.
Files changed (50) hide show
  1. package/dist/components/WhatsNew.d.ts +2 -0
  2. package/dist/components/WhatsNew.d.ts.map +1 -1
  3. package/dist/components/WhatsNew.js +10 -13
  4. package/dist/components/WhatsNew.js.map +1 -1
  5. package/dist/core/SDKManager.d.ts +36 -4
  6. package/dist/core/SDKManager.d.ts.map +1 -1
  7. package/dist/core/SDKManager.js +210 -63
  8. package/dist/core/SDKManager.js.map +1 -1
  9. package/dist/hooks/index.d.ts +1 -3
  10. package/dist/hooks/index.d.ts.map +1 -1
  11. package/dist/hooks/index.js +1 -3
  12. package/dist/hooks/index.js.map +1 -1
  13. package/dist/hooks/useApps.d.ts +1 -1
  14. package/dist/hooks/useApps.d.ts.map +1 -1
  15. package/dist/hooks/useApps.js +15 -7
  16. package/dist/hooks/useApps.js.map +1 -1
  17. package/dist/hooks/useArticles.d.ts.map +1 -1
  18. package/dist/hooks/useArticles.js +12 -12
  19. package/dist/hooks/useArticles.js.map +1 -1
  20. package/dist/hooks/useBanner.d.ts +1 -1
  21. package/dist/hooks/useBanner.d.ts.map +1 -1
  22. package/dist/hooks/useBanner.js +15 -13
  23. package/dist/hooks/useBanner.js.map +1 -1
  24. package/dist/hooks/useDashboard.d.ts.map +1 -1
  25. package/dist/hooks/useDashboard.js +13 -7
  26. package/dist/hooks/useDashboard.js.map +1 -1
  27. package/dist/hooks/useFloatingCards.d.ts +1 -0
  28. package/dist/hooks/useFloatingCards.d.ts.map +1 -1
  29. package/dist/hooks/useFloatingCards.js +45 -94
  30. package/dist/hooks/useFloatingCards.js.map +1 -1
  31. package/dist/hooks/usePartnerIntegration.d.ts +7 -3
  32. package/dist/hooks/usePartnerIntegration.d.ts.map +1 -1
  33. package/dist/hooks/usePartnerIntegration.js +62 -7
  34. package/dist/hooks/usePartnerIntegration.js.map +1 -1
  35. package/dist/hooks/useWhatsNew.d.ts.map +1 -1
  36. package/dist/hooks/useWhatsNew.js +10 -10
  37. package/dist/hooks/useWhatsNew.js.map +1 -1
  38. package/package.json +1 -1
  39. package/dist/hooks/useFloatingCardActions.d.ts +0 -18
  40. package/dist/hooks/useFloatingCardActions.d.ts.map +0 -1
  41. package/dist/hooks/useFloatingCardActions.js +0 -55
  42. package/dist/hooks/useFloatingCardActions.js.map +0 -1
  43. package/dist/hooks/useFloatingCardEngine.d.ts +0 -22
  44. package/dist/hooks/useFloatingCardEngine.d.ts.map +0 -1
  45. package/dist/hooks/useFloatingCardEngine.js +0 -40
  46. package/dist/hooks/useFloatingCardEngine.js.map +0 -1
  47. package/dist/hooks/useGrowApps.d.ts +0 -11
  48. package/dist/hooks/useGrowApps.d.ts.map +0 -1
  49. package/dist/hooks/useGrowApps.js +0 -15
  50. package/dist/hooks/useGrowApps.js.map +0 -1
@@ -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,eAAe,CAAC;AAC9B,cAAc,yBAAyB,CAAC;AACxC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AACzC,cAAc,yBAAyB,CAAC","sourcesContent":["export * from \"./useDashboard\";\nexport * from \"./useBanner\";\nexport * from \"./useApps\";\nexport * from \"./useArticles\";\nexport * from \"./useWhatsNew\";\nexport * from \"./useGrowApps\";\nexport * from \"./usePartnerIntegration\";\nexport * from \"./useFloatingCards\";\nexport * from \"./useCampaignTracking\";\nexport * from \"./useFloatingCardActions\";\nexport * from \"./useFloatingCardEngine\";\n"]}
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"]}
@@ -1,4 +1,4 @@
1
1
  import { AppItem, AppGroup } from "../types";
2
- export declare function useApps(_group?: AppGroup): AppItem[];
2
+ export declare function useApps(group?: AppGroup): AppItem[];
3
3
  export declare function useAppGroups(): AppGroup[];
4
4
  //# sourceMappingURL=useApps.d.ts.map
@@ -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;AAE7C,wBAAgB,OAAO,CAAC,MAAM,CAAC,EAAE,QAAQ,GAAG,OAAO,EAAE,CAIpD;AAED,wBAAgB,YAAY,IAAI,QAAQ,EAAE,CAIzC"}
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"}
@@ -1,11 +1,19 @@
1
- export function useApps(_group) {
2
- // Legacy hook - components should use SDK directly
3
- // Returning empty for backward compatibility
4
- return [];
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
- // Legacy hook - components should use SDK directly
8
- // Returning empty for backward compatibility
9
- return [];
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":"AAEA,MAAM,UAAU,OAAO,CAAC,MAAiB;IACvC,mDAAmD;IACnD,6CAA6C;IAC7C,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,qDAAqD;IACrD,6CAA6C;IAC7C,OAAO,EAAE,CAAC;AACZ,CAAC","sourcesContent":["import { AppItem, AppGroup } from \"../types\";\n\nexport function useApps(_group?: AppGroup): AppItem[] {\n // Legacy hook - components should use SDK directly\n // Returning empty for backward compatibility\n return [];\n}\n\nexport function useAppGroups(): AppGroup[] {\n // Legacy hook - components should use SDK directly \n // Returning empty for backward compatibility\n return [];\n}\n"]}
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,CA4B7D;AAED,wBAAgB,iBAAiB,CAAC,KAAK,GAAE,MAAU,GAAG,WAAW,EAAE,CAMlE;AAED,wBAAgB,oBAAoB,IAAI,MAAM,EAAE,CAc/C"}
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
- // Legacy hook - components should use SDK directly
5
- const sdk = useSDK({});
4
+ const sdk = useSDK();
6
5
  const articles = useMemo(() => {
7
- // Returning empty for backward compatibility
8
- return [];
9
- }, [limit]);
10
- const getArticle = (_id) => {
11
- return undefined; // Legacy compatibility
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 = (_category) => {
14
- return []; // Legacy compatibility
13
+ const getArticlesByCategory = (category) => {
14
+ return articles.filter(article => article.category === category);
15
15
  };
16
- const getLatestArticles = (_limitCount) => {
17
- return []; // Legacy compatibility
16
+ const getLatestArticles = (limitCount) => {
17
+ return articles.slice(0, limitCount);
18
18
  };
19
19
  return {
20
20
  articles,
21
- loading: sdk.loading,
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,mDAAmD;IACnD,MAAM,GAAG,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC;IAEvB,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,EAAE;QAC5B,6CAA6C;QAC7C,OAAO,EAAE,CAAC;IACZ,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAEZ,MAAM,UAAU,GAAG,CAAC,GAAoB,EAA2B,EAAE;QACnE,OAAO,SAAS,CAAC,CAAC,uBAAuB;IAC3C,CAAC,CAAC;IAEF,MAAM,qBAAqB,GAAG,CAAC,SAAiB,EAAiB,EAAE;QACjE,OAAO,EAAE,CAAC,CAAC,uBAAuB;IACpC,CAAC,CAAC;IAEF,MAAM,iBAAiB,GAAG,CAAC,WAAmB,EAAiB,EAAE;QAC/D,OAAO,EAAE,CAAC,CAAC,uBAAuB;IACpC,CAAC,CAAC;IAEF,OAAO;QACL,QAAQ;QACR,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,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 // Legacy hook - components should use SDK directly\n const sdk = useSDK({});\n\n const articles = useMemo(() => {\n // Returning empty for backward compatibility\n return [];\n }, [limit]);\n\n const getArticle = (_id: string | number): ArticleItem | undefined => {\n return undefined; // Legacy compatibility\n };\n\n const getArticlesByCategory = (_category: string): ArticleItem[] => {\n return []; // Legacy compatibility\n };\n\n const getLatestArticles = (_limitCount: number): ArticleItem[] => {\n return []; // Legacy compatibility\n };\n\n return {\n articles,\n loading: sdk.loading,\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
+ {"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(_type?: BannerType): BannerItem[];
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;AAElD,wBAAgB,UAAU,CAAC,KAAK,CAAC,EAAE,UAAU,GAAG,UAAU,EAAE,CAI3D;AAED,wBAAgB,YAAY,IAAI,UAAU,GAAG,IAAI,CAIhD;AAED,wBAAgB,cAAc,IAAI,UAAU,GAAG,IAAI,CAIlD;AAED,wBAAgB,eAAe,IAAI,UAAU,GAAG,IAAI,CAInD"}
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"}
@@ -1,21 +1,23 @@
1
- export function useBanners(_type) {
2
- // This is a legacy hook - components should use the SDK directly
3
- // Keeping for backward compatibility but returning empty for now
4
- return [];
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
- // This is a legacy hook - TopBanner component should use SDK directly
8
- // Keeping for backward compatibility but returning null for now
9
- return null;
12
+ const banners = useBanners("top_banner");
13
+ return banners[0] || null;
10
14
  }
11
15
  export function usePopupBanner() {
12
- // This is a legacy hook - PopupBanner component should use SDK directly
13
- // Keeping for backward compatibility but returning null for now
14
- return null;
16
+ const banners = useBanners("popup");
17
+ return banners[0] || null;
15
18
  }
16
19
  export function useFooterBanner() {
17
- // This is a legacy hook - FooterBanner component should use SDK directly
18
- // Keeping for backward compatibility but returning null for now
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":"AAEA,MAAM,UAAU,UAAU,CAAC,KAAkB;IAC3C,iEAAiE;IACjE,iEAAiE;IACjE,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,wEAAwE;IACxE,gEAAgE;IAChE,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,wEAAwE;IACxE,kEAAkE;IAClE,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,yEAAyE;IACzE,gEAAgE;IAChE,OAAO,IAAI,CAAC;AACd,CAAC","sourcesContent":["import { BannerItem, BannerType } from \"../types\";\n\nexport function useBanners(_type?: BannerType): BannerItem[] {\n // This is a legacy hook - components should use the SDK directly\n // Keeping for backward compatibility but returning empty for now\n return [];\n}\n\nexport function useTopBanner(): BannerItem | null {\n // This is a legacy hook - TopBanner component should use SDK directly \n // Keeping for backward compatibility but returning null for now\n return null;\n}\n\nexport function usePopupBanner(): BannerItem | null {\n // This is a legacy hook - PopupBanner component should use SDK directly\n // Keeping for backward compatibility but returning null for now \n return null;\n}\n\nexport function useFooterBanner(): BannerItem | null {\n // This is a legacy hook - FooterBanner component should use SDK directly\n // Keeping for backward compatibility but returning null for now\n return null;\n}\n"]}
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":"AACA,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,CAcjD"}
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
- // Return a compatible structure for backward compatibility
5
+ // Get dashboard data from SDK
6
+ const dashboardData = SDKManager.getDashboardData();
6
7
  return {
7
- data: null, // Dashboard data not available in provider-less architecture
8
- loading: sdk.loading,
9
- error: sdk.error || null,
10
- refresh: async () => { }, // No-op for backward compatibility
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: null, // Not tracked in provider-less architecture
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,mCAAmC;IACnC,MAAM,GAAG,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC;IAEvB,2DAA2D;IAC3D,OAAO;QACL,IAAI,EAAE,IAAI,EAAE,6DAA6D;QACzE,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,KAAK,EAAE,GAAG,CAAC,KAAK,IAAI,IAAI;QACxB,OAAO,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC,EAAE,mCAAmC;QAC5D,aAAa,EAAE,GAAG,CAAC,WAAW;QAC9B,SAAS,EAAE,IAAI,EAAE,4CAA4C;QAC7D,MAAM,EAAE,GAAG,CAAC,MAAM;KACnB,CAAC;AACJ,CAAC","sourcesContent":["import { useSDK } 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 // Legacy hook - use useSDK instead\n const sdk = useSDK({});\n \n // Return a compatible structure for backward compatibility\n return {\n data: null, // Dashboard data not available in provider-less architecture\n loading: sdk.loading,\n error: sdk.error || null,\n refresh: async () => {}, // No-op for backward compatibility\n isInitialized: sdk.initialized,\n lastFetch: null, // Not tracked in provider-less architecture\n locale: sdk.locale,\n };\n}\n"]}
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"]}
@@ -17,6 +17,7 @@ interface UseFloatingCardsReturn {
17
17
  }
18
18
  /**
19
19
  * Hook to fetch and manage floating cards (campaigns)
20
+ * Now uses SDK-managed campaigns data
20
21
  */
21
22
  export declare function useFloatingCards(options?: UseFloatingCardsOptions): UseFloatingCardsReturn;
22
23
  /**
@@ -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;AAChE,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;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,GAAE,uBAA4B,GACpC,sBAAsB,CAqKxB;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
+ {"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 { shopId: propsShopId, autoFetch = true,
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
- const fetchCards = useCallback(async () => {
21
- if (!shopId) {
22
- setError(new Error("Shop ID is required"));
23
- return;
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
- setLoading(true);
26
- setError(null);
27
- try {
28
- const id = shopId;
29
- // Extract base URL from SDK config or use defaults
30
- // sdk.config.apiUrl is typically "/api/dashboard", we need just the base "/api" part
31
- let baseUrl;
32
- if (sdk.config?.apiUrl) {
33
- // Extract base URL from dashboard API URL
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
- else {
46
- // Default fallback
47
- baseUrl = typeof window !== "undefined" &&
48
- window.location.hostname === "localhost"
49
- ? "/api"
50
- : "https://ops.trustshop.io/api";
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
- // Auto-fetch on mount or when shopId/locale changes
78
+ // Listen for campaigns refresh events from SDK
132
79
  useEffect(() => {
133
- if (autoFetch && shopId) {
134
- fetchCards();
135
- }
136
- }, [autoFetch, shopId, fetchCards]); // fetchCards already depends on locale
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
- cardId: card.id,
182
- currentRoute,
183
- currentPage,
184
- display_pages: card.display_pages,
185
- matches: card.display_pages.includes(currentPage),
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: any[];
6
+ groups: {
7
+ key: string;
8
+ title: string;
9
+ items: any[];
10
+ }[];
7
11
  loading: boolean;
8
- error: Error | undefined;
9
- integrations: never[];
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":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD;;GAEG;AACH,wBAAgB,sBAAsB;;;;;EAerC;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
+ {"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
- // Returning empty for backward compatibility
11
- return [];
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.loading,
16
- error: sdk.error,
17
- integrations: [],
70
+ loading: sdk.dashboardLoading || false,
71
+ error: sdk.dashboardError || null,
72
+ integrations,
18
73
  };
19
74
  }
20
75
  /**