@datlv-trustshop/shopify-inapp-components 0.2.8 → 0.2.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (220) hide show
  1. package/dist/components/AppList.d.ts +1 -0
  2. package/dist/components/AppList.d.ts.map +1 -0
  3. package/dist/components/AppList.js +1 -0
  4. package/dist/components/AppList.js.map +1 -0
  5. package/dist/components/ArticleList.d.ts +1 -0
  6. package/dist/components/ArticleList.d.ts.map +1 -0
  7. package/dist/components/ArticleList.js +1 -0
  8. package/dist/components/ArticleList.js.map +1 -0
  9. package/dist/components/ArticleSlide.d.ts +1 -0
  10. package/dist/components/ArticleSlide.d.ts.map +1 -0
  11. package/dist/components/ArticleSlide.js +1 -0
  12. package/dist/components/ArticleSlide.js.map +1 -0
  13. package/dist/components/FloatingCard.d.ts +1 -0
  14. package/dist/components/FloatingCard.d.ts.map +1 -0
  15. package/dist/components/FloatingCard.js +5 -4
  16. package/dist/components/FloatingCard.js.map +1 -0
  17. package/dist/components/FooterBanner.d.ts +1 -0
  18. package/dist/components/FooterBanner.d.ts.map +1 -0
  19. package/dist/components/FooterBanner.js +1 -0
  20. package/dist/components/FooterBanner.js.map +1 -0
  21. package/dist/components/GrowApps.d.ts +6 -6
  22. package/dist/components/GrowApps.d.ts.map +1 -0
  23. package/dist/components/GrowApps.js +11 -3
  24. package/dist/components/GrowApps.js.map +1 -0
  25. package/dist/components/ImageLoading.d.ts +1 -0
  26. package/dist/components/ImageLoading.d.ts.map +1 -0
  27. package/dist/components/ImageLoading.js +1 -0
  28. package/dist/components/ImageLoading.js.map +1 -0
  29. package/dist/components/PartnerIntegration.d.ts +8 -8
  30. package/dist/components/PartnerIntegration.d.ts.map +1 -0
  31. package/dist/components/PartnerIntegration.js +15 -76
  32. package/dist/components/PartnerIntegration.js.map +1 -0
  33. package/dist/components/PartnerList.d.ts +1 -0
  34. package/dist/components/PartnerList.d.ts.map +1 -0
  35. package/dist/components/PartnerList.js +1 -0
  36. package/dist/components/PartnerList.js.map +1 -0
  37. package/dist/components/PopupBanner.d.ts +4 -4
  38. package/dist/components/PopupBanner.d.ts.map +1 -0
  39. package/dist/components/PopupBanner.js +5 -1
  40. package/dist/components/PopupBanner.js.map +1 -0
  41. package/dist/components/TopBanner.d.ts +7 -7
  42. package/dist/components/TopBanner.d.ts.map +1 -0
  43. package/dist/components/TopBanner.js +15 -30
  44. package/dist/components/TopBanner.js.map +1 -0
  45. package/dist/components/WhatsNew.d.ts +6 -7
  46. package/dist/components/WhatsNew.d.ts.map +1 -0
  47. package/dist/components/WhatsNew.js +23 -25
  48. package/dist/components/WhatsNew.js.map +1 -0
  49. package/dist/components/index.d.ts +1 -0
  50. package/dist/components/index.d.ts.map +1 -0
  51. package/dist/components/index.js +1 -0
  52. package/dist/components/index.js.map +1 -0
  53. package/dist/components/inlineStyles.d.ts +1 -0
  54. package/dist/components/inlineStyles.d.ts.map +1 -0
  55. package/dist/components/inlineStyles.js +1 -0
  56. package/dist/components/inlineStyles.js.map +1 -0
  57. package/dist/components/styles.d.ts +1 -0
  58. package/dist/components/styles.d.ts.map +1 -0
  59. package/dist/components/styles.js +1 -0
  60. package/dist/components/styles.js.map +1 -0
  61. package/dist/config/component-defaults.d.ts +71 -0
  62. package/dist/config/component-defaults.d.ts.map +1 -0
  63. package/dist/config/component-defaults.js +106 -0
  64. package/dist/config/component-defaults.js.map +1 -0
  65. package/dist/config/internal-config.d.ts +28 -0
  66. package/dist/config/internal-config.d.ts.map +1 -0
  67. package/dist/config/internal-config.js +100 -0
  68. package/dist/config/internal-config.js.map +1 -0
  69. package/dist/core/SDKManager.d.ts +262 -0
  70. package/dist/core/SDKManager.d.ts.map +1 -0
  71. package/dist/core/SDKManager.js +527 -0
  72. package/dist/core/SDKManager.js.map +1 -0
  73. package/dist/core/adapter.d.ts +1 -0
  74. package/dist/core/adapter.d.ts.map +1 -0
  75. package/dist/core/adapter.js +1 -0
  76. package/dist/core/adapter.js.map +1 -0
  77. package/dist/core/engine.d.ts +1 -0
  78. package/dist/core/engine.d.ts.map +1 -0
  79. package/dist/core/engine.js +1 -0
  80. package/dist/core/engine.js.map +1 -0
  81. package/dist/core/fetcher.d.ts +1 -0
  82. package/dist/core/fetcher.d.ts.map +1 -0
  83. package/dist/core/fetcher.js +1 -0
  84. package/dist/core/fetcher.js.map +1 -0
  85. package/dist/core/global-manager.d.ts +1 -0
  86. package/dist/core/global-manager.d.ts.map +1 -0
  87. package/dist/core/global-manager.js +1 -0
  88. package/dist/core/global-manager.js.map +1 -0
  89. package/dist/hooks/index.d.ts +2 -3
  90. package/dist/hooks/index.d.ts.map +1 -0
  91. package/dist/hooks/index.js +2 -3
  92. package/dist/hooks/index.js.map +1 -0
  93. package/dist/hooks/useApps.d.ts +1 -0
  94. package/dist/hooks/useApps.d.ts.map +1 -0
  95. package/dist/hooks/useApps.js +10 -9
  96. package/dist/hooks/useApps.js.map +1 -0
  97. package/dist/hooks/useArticles.d.ts +1 -0
  98. package/dist/hooks/useArticles.d.ts.map +1 -0
  99. package/dist/hooks/useArticles.js +10 -14
  100. package/dist/hooks/useArticles.js.map +1 -0
  101. package/dist/hooks/useBanner.d.ts +1 -0
  102. package/dist/hooks/useBanner.d.ts.map +1 -0
  103. package/dist/hooks/useBanner.js +6 -5
  104. package/dist/hooks/useBanner.js.map +1 -0
  105. package/dist/hooks/useCampaignTracking.d.ts +1 -0
  106. package/dist/hooks/useCampaignTracking.d.ts.map +1 -0
  107. package/dist/hooks/useCampaignTracking.js +1 -0
  108. package/dist/hooks/useCampaignTracking.js.map +1 -0
  109. package/dist/hooks/useDashboard.d.ts +1 -0
  110. package/dist/hooks/useDashboard.d.ts.map +1 -0
  111. package/dist/hooks/useDashboard.js +18 -9
  112. package/dist/hooks/useDashboard.js.map +1 -0
  113. package/dist/hooks/useFloatingCards.d.ts +4 -2
  114. package/dist/hooks/useFloatingCards.d.ts.map +1 -0
  115. package/dist/hooks/useFloatingCards.js +52 -76
  116. package/dist/hooks/useFloatingCards.js.map +1 -0
  117. package/dist/hooks/usePartnerIntegration.d.ts +7 -2
  118. package/dist/hooks/usePartnerIntegration.d.ts.map +1 -0
  119. package/dist/hooks/usePartnerIntegration.js +26 -37
  120. package/dist/hooks/usePartnerIntegration.js.map +1 -0
  121. package/dist/hooks/useTranslations.d.ts +1 -0
  122. package/dist/hooks/useTranslations.d.ts.map +1 -0
  123. package/dist/hooks/useTranslations.js +5 -3
  124. package/dist/hooks/useTranslations.js.map +1 -0
  125. package/dist/hooks/useWhatsNew.d.ts +1 -0
  126. package/dist/hooks/useWhatsNew.d.ts.map +1 -0
  127. package/dist/hooks/useWhatsNew.js +9 -8
  128. package/dist/hooks/useWhatsNew.js.map +1 -0
  129. package/dist/index.d.ts +38 -22
  130. package/dist/index.d.ts.map +1 -0
  131. package/dist/index.js +76 -22
  132. package/dist/index.js.map +1 -0
  133. package/dist/translations/default.d.ts +1 -0
  134. package/dist/translations/default.d.ts.map +1 -0
  135. package/dist/translations/default.js +1 -0
  136. package/dist/translations/default.js.map +1 -0
  137. package/dist/translations/locales/cn.json +39 -0
  138. package/dist/translations/locales/de.json +39 -0
  139. package/dist/translations/locales/dk.json +39 -0
  140. package/dist/translations/locales/en.json +39 -0
  141. package/dist/translations/locales/es.json +39 -0
  142. package/dist/translations/locales/fr.json +39 -0
  143. package/dist/translations/locales/ie.json +39 -0
  144. package/dist/translations/locales/in.json +39 -0
  145. package/dist/translations/locales/it.json +39 -0
  146. package/dist/translations/locales/jp.json +39 -0
  147. package/dist/translations/locales/nl.json +39 -0
  148. package/dist/translations/locales/nz.json +39 -0
  149. package/dist/translations/locales/pt.json +39 -0
  150. package/dist/translations/locales/se.json +39 -0
  151. package/dist/translations/locales/vi.json +39 -0
  152. package/dist/translations/translation-manager.d.ts +89 -0
  153. package/dist/translations/translation-manager.d.ts.map +1 -0
  154. package/dist/translations/translation-manager.js +239 -0
  155. package/dist/translations/translation-manager.js.map +1 -0
  156. package/dist/types/app.d.ts +1 -0
  157. package/dist/types/app.d.ts.map +1 -0
  158. package/dist/types/app.js +1 -0
  159. package/dist/types/app.js.map +1 -0
  160. package/dist/types/article.d.ts +1 -0
  161. package/dist/types/article.d.ts.map +1 -0
  162. package/dist/types/article.js +1 -0
  163. package/dist/types/article.js.map +1 -0
  164. package/dist/types/banner.d.ts +1 -0
  165. package/dist/types/banner.d.ts.map +1 -0
  166. package/dist/types/banner.js +1 -0
  167. package/dist/types/banner.js.map +1 -0
  168. package/dist/types/component-props.d.ts +140 -0
  169. package/dist/types/component-props.d.ts.map +1 -0
  170. package/dist/types/component-props.js +6 -0
  171. package/dist/types/component-props.js.map +1 -0
  172. package/dist/types/dashboard.d.ts +1 -0
  173. package/dist/types/dashboard.d.ts.map +1 -0
  174. package/dist/types/dashboard.js +1 -0
  175. package/dist/types/dashboard.js.map +1 -0
  176. package/dist/types/index.d.ts +1 -0
  177. package/dist/types/index.d.ts.map +1 -0
  178. package/dist/types/index.js +1 -0
  179. package/dist/types/index.js.map +1 -0
  180. package/dist/types/integration.d.ts +1 -0
  181. package/dist/types/integration.d.ts.map +1 -0
  182. package/dist/types/integration.js +1 -0
  183. package/dist/types/integration.js.map +1 -0
  184. package/dist/types/partner.d.ts +1 -0
  185. package/dist/types/partner.d.ts.map +1 -0
  186. package/dist/types/partner.js +1 -0
  187. package/dist/types/partner.js.map +1 -0
  188. package/dist/types/product-update.d.ts +1 -0
  189. package/dist/types/product-update.d.ts.map +1 -0
  190. package/dist/types/product-update.js +1 -0
  191. package/dist/types/product-update.js.map +1 -0
  192. package/dist/types/translations.d.ts +1 -0
  193. package/dist/types/translations.d.ts.map +1 -0
  194. package/dist/types/translations.js +1 -0
  195. package/dist/types/translations.js.map +1 -0
  196. package/dist/utils/campaignTracking.d.ts +1 -0
  197. package/dist/utils/campaignTracking.d.ts.map +1 -0
  198. package/dist/utils/campaignTracking.js +1 -0
  199. package/dist/utils/campaignTracking.js.map +1 -0
  200. package/dist/utils/cls-monitor.d.ts +1 -0
  201. package/dist/utils/cls-monitor.d.ts.map +1 -0
  202. package/dist/utils/cls-monitor.js +1 -0
  203. package/dist/utils/cls-monitor.js.map +1 -0
  204. package/dist/utils/injectStyles.d.ts +1 -0
  205. package/dist/utils/injectStyles.d.ts.map +1 -0
  206. package/dist/utils/injectStyles.js +1 -0
  207. package/dist/utils/injectStyles.js.map +1 -0
  208. package/dist/utils/sessionManager.d.ts +1 -0
  209. package/dist/utils/sessionManager.d.ts.map +1 -0
  210. package/dist/utils/sessionManager.js +1 -0
  211. package/dist/utils/sessionManager.js.map +1 -0
  212. package/package.json +4 -3
  213. package/dist/hooks/useFloatingCardActions.d.ts +0 -17
  214. package/dist/hooks/useFloatingCardActions.js +0 -54
  215. package/dist/hooks/useFloatingCardEngine.d.ts +0 -21
  216. package/dist/hooks/useFloatingCardEngine.js +0 -39
  217. package/dist/hooks/useGrowApps.d.ts +0 -10
  218. package/dist/hooks/useGrowApps.js +0 -14
  219. package/dist/provider/DashboardProvider.d.ts +0 -36
  220. package/dist/provider/DashboardProvider.js +0 -200
@@ -1,11 +1,17 @@
1
- import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { Badge, BlockStack, Box, Button, Card, InlineStack, Text, Grid, SkeletonBodyText, EmptyState, } from "@shopify/polaris";
3
3
  import { ExternalIcon } from "@shopify/polaris-icons";
4
4
  import { usePartnerIntegrations } from "../hooks/usePartnerIntegration";
5
- import { useDashboardContext } from "../provider/DashboardProvider";
6
- export const PartnerIntegration = ({ className = "", onManage, onInstall, onOpen, onUpgradeClick, renderCard, showEmptyState = true, statusProvider, }) => {
5
+ import { useSDK } from "../core/SDKManager";
6
+ import { COMPONENT_DEFAULTS } from "../config/component-defaults";
7
+ export const PartnerIntegration = ({ className = "", onManage, onInstall, onOpen, onUpgradeClick: _onUpgradeClick, // Keep for API compatibility
8
+ // SDK options (optional)
9
+ shopInfo, locale, translations: translationOverrides, config, }) => {
10
+ // Use internal defaults
11
+ const { showEmptyState } = COMPONENT_DEFAULTS.partnerIntegration;
7
12
  const { groups, loading, error } = usePartnerIntegrations();
8
- const { translations } = useDashboardContext();
13
+ const sdk = useSDK({ shopInfo, locale, translations: translationOverrides, config });
14
+ const translations = sdk.translations;
9
15
  const handleManage = (item) => {
10
16
  const url = item.button_manage_url;
11
17
  if (url) {
@@ -29,52 +35,8 @@ export const PartnerIntegration = ({ className = "", onManage, onInstall, onOpen
29
35
  onInstall?.(item);
30
36
  };
31
37
  const renderIntegrationCard = (item) => {
32
- if (renderCard) {
33
- return renderCard(item, {
34
- onManage: () => handleManage(item),
35
- onInstall: () => handleInstall(item),
36
- onOpen: () => {
37
- if (item.app_url) {
38
- window.open(item.app_url, "_blank");
39
- }
40
- onOpen?.(item);
41
- },
42
- });
43
- }
44
- const status = statusProvider?.(item);
38
+ // SDK now handles status internally
45
39
  const getBadgeInfo = () => {
46
- if (status) {
47
- if (status.isConnected === true) {
48
- return {
49
- text: translations.partnerIntegration?.active || "Active",
50
- tone: "success",
51
- };
52
- }
53
- if (status.isConnected === false) {
54
- return {
55
- text: translations.partnerIntegration?.inactive || "Inactive",
56
- tone: undefined,
57
- };
58
- }
59
- if (status.isActive === true) {
60
- return {
61
- text: translations.partnerIntegration?.active || "Active",
62
- tone: "success",
63
- };
64
- }
65
- if (status.isPending) {
66
- return {
67
- text: translations.partnerIntegration?.pending || "Pending",
68
- tone: "warning",
69
- };
70
- }
71
- if (status.isActive === false) {
72
- return {
73
- text: translations.partnerIntegration?.inactive || "Inactive",
74
- tone: undefined,
75
- };
76
- }
77
- }
78
40
  // Fall back to button-based logic only if no status provider
79
41
  if (item.button_manage_text && item.button_install_text) {
80
42
  return {
@@ -95,46 +57,23 @@ export const PartnerIntegration = ({ className = "", onManage, onInstall, onOpen
95
57
  width: "40px",
96
58
  height: "40px",
97
59
  borderRadius: "8px",
98
- } })), _jsx(Box, { minHeight: "130px", children: _jsxs(BlockStack, { gap: "300", children: [_jsxs(BlockStack, { gap: "100", children: [_jsxs(InlineStack, { gap: "200", align: "start", children: [_jsx(Text, { as: "p", variant: "bodyLg", fontWeight: "bold", children: item.title }), badgeInfo && (_jsx(Badge, { tone: badgeInfo.tone, children: badgeInfo.text })), status?.showUpgradeBadge && (_jsxs("div", { onClick: () => onUpgradeClick?.(item), style: {
99
- cursor: "pointer",
100
- display: "inline-flex",
101
- alignItems: "center",
102
- padding: "4px 6px",
103
- gap: "4px",
104
- borderRadius: "var(--p-border-radius-150)",
105
- backgroundColor: status.upgradeBadgePlan === "pro"
106
- ? "#F0F2FF"
107
- : "#FFF1E3",
108
- color: status.upgradeBadgePlan === "pro"
109
- ? "#7126FF"
110
- : "#4F4700",
111
- fontSize: "12px",
112
- fontWeight: 500,
113
- }, title: status.upgradeBadgeTooltip, children: [status.upgradeBadgeIcon && (_jsx("span", { style: {
114
- display: "inline-flex",
115
- alignItems: "center",
116
- }, children: status.upgradeBadgeIcon })), _jsx("span", { style: {
117
- fontSize: "13px",
118
- }, children: status.upgradeBadgeText || translations.partnerIntegration?.upgradeBadge?.upgrade || "Upgrade" })] }))] }), item.content && (_jsx(Text, { as: "p", variant: "bodyMd", children: item.content }))] }), _jsx(InlineStack, { gap: "200", children: status ? (_jsxs(_Fragment, { children: [item.button_install_text && (_jsx(Button, { icon: ExternalIcon, onClick: () => handleInstall(item), children: item.button_install_text })), item.button_manage_text && (_jsx(Button, { onClick: () => handleManage(item), disabled: item.key === "after_ship" ? (status.showUpgradeBadge === true) : status.showUpgradeBadge === true, children: item.button_manage_text }))] })) : (_jsxs(_Fragment, { children: [item.button_manage_text && (_jsx(Button, { onClick: () => handleManage(item), children: item.button_manage_text })), item.button_install_text && (_jsx(Button, { icon: ExternalIcon, onClick: () => handleInstall(item), children: item.button_install_text }))] })) })] }) })] }) }) }, `integration--${item.id || item.key}`));
60
+ } })), _jsx(Box, { minHeight: "130px", children: _jsxs(BlockStack, { gap: "300", children: [_jsxs(BlockStack, { gap: "100", children: [_jsxs(InlineStack, { gap: "200", align: "start", children: [_jsx(Text, { as: "p", variant: "bodyLg", fontWeight: "bold", children: item.title }), badgeInfo && (_jsx(Badge, { tone: badgeInfo.tone, children: badgeInfo.text }))] }), item.content && (_jsx(Text, { as: "p", variant: "bodyMd", children: item.content }))] }), _jsxs(InlineStack, { gap: "200", children: [item.button_install_text && (_jsx(Button, { icon: ExternalIcon, onClick: () => handleInstall(item), children: item.button_install_text })), item.button_manage_text && (_jsx(Button, { onClick: () => handleManage(item), children: item.button_manage_text }))] })] }) })] }) }) }, `integration--${item.id || item.key}`));
119
61
  };
120
62
  // Loading state
121
63
  if (loading) {
122
64
  return (_jsx("div", { className: className, children: _jsx(BlockStack, { gap: "600", children: [1, 2, 3].map((groupIndex) => (_jsxs(BlockStack, { gap: "400", children: [_jsx(Box, { paddingInlineStart: { xs: "200", md: "0" }, children: _jsx(SkeletonBodyText, { lines: 1 }) }), _jsx(Grid, { columns: { xs: 1, sm: 1, md: 2, lg: 2, xl: 2 }, children: [1, 2].map((cardIndex) => (_jsx(Grid.Cell, { children: _jsx(Card, { children: _jsx(BlockStack, { gap: "300", children: _jsx(SkeletonBodyText, { lines: 3 }) }) }) }, `skeleton-card-${groupIndex}-${cardIndex}`))) })] }, `skeleton-group-${groupIndex}`))) }) }));
123
65
  }
124
66
  if (error) {
125
- return (_jsx("div", { className: className, children: _jsx(Card, { children: _jsx(EmptyState, { heading: translations.partnerIntegration?.errorTitle ||
126
- "Unable to load integrations", image: "", children: _jsx("p", { children: translations.partnerIntegration?.errorMessage ||
127
- "Please try again later" }) }) }) }));
67
+ return (_jsx("div", { className: className, children: _jsx(Card, { children: _jsx(EmptyState, { heading: "Unable to load integrations", image: "", children: _jsx("p", { children: "Please try again later" }) }) }) }));
128
68
  }
129
69
  // Empty state
130
70
  if (groups.length === 0) {
131
71
  if (!showEmptyState)
132
72
  return null;
133
- return (_jsx("div", { className: className, children: _jsx(Card, { children: _jsx(EmptyState, { heading: translations.partnerIntegration?.noData ||
134
- "No integrations available", image: "", children: _jsx("p", { children: translations.partnerIntegration?.noDataMessage ||
135
- "Check back later for available integrations" }) }) }) }));
73
+ return (_jsx("div", { className: className, children: _jsx(Card, { children: _jsx(EmptyState, { heading: "No integrations available", image: "", children: _jsx("p", { children: "Check back later for available integrations" }) }) }) }));
136
74
  }
137
75
  // Render groups
138
76
  return (_jsx("div", { className: className, children: _jsx(BlockStack, { gap: "600", children: groups.map((group) => (_jsxs(BlockStack, { gap: "400", children: [_jsx(Box, { paddingInlineStart: { xs: "200", md: "0" }, children: _jsx(Text, { as: "h3", variant: "headingMd", fontWeight: "semibold", children: group.title }) }), _jsx(Grid, { columns: { xs: 1, sm: 1, md: 2, lg: 2, xl: 2 }, children: group.items.map((item) => (_jsx(Grid.Cell, { children: renderIntegrationCard(item) }, `integration-cell--${item.id || item.key}`))) })] }, `integration-group--${group.key}`))) }) }));
139
77
  };
140
78
  export default PartnerIntegration;
79
+ //# sourceMappingURL=PartnerIntegration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PartnerIntegration.js","sourceRoot":"","sources":["../../src/components/PartnerIntegration.tsx"],"names":[],"mappings":";AACA,OAAO,EACL,KAAK,EACL,UAAU,EACV,GAAG,EACH,MAAM,EACN,IAAI,EACJ,WAAW,EACX,IAAI,EACJ,IAAI,EACJ,gBAAgB,EAChB,UAAU,GACX,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,EAAE,MAAM,EAAsB,MAAM,oBAAoB,CAAC;AAEhE,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAkClE,MAAM,CAAC,MAAM,kBAAkB,GAAsC,CAAC,EACpE,SAAS,GAAG,EAAE,EACd,QAAQ,EACR,SAAS,EACT,MAAM,EACN,cAAc,EAAE,eAAe,EAAE,6BAA6B;AAC9D,yBAAyB;AACzB,QAAQ,EACR,MAAM,EACN,YAAY,EAAE,oBAAoB,EAClC,MAAM,GACP,EAAE,EAAE;IACH,wBAAwB;IACxB,MAAM,EAAE,cAAc,EAAE,GAAG,kBAAkB,CAAC,kBAAkB,CAAC;IACjE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,sBAAsB,EAAE,CAAC;IAC5D,MAAM,GAAG,GAAG,MAAM,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,EAAE,CAAC,CAAC;IACrF,MAAM,YAAY,GAAG,GAAG,CAAC,YAAY,CAAC;IAEtC,MAAM,YAAY,GAAG,CAAC,IAAqB,EAAE,EAAE;QAC7C,MAAM,GAAG,GAAG,IAAI,CAAC,iBAAiB,CAAC;QACnC,IAAI,GAAG,EAAE,CAAC;YACR,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBACxB,QAAQ,EAAE,CAAC,IAAI,CAAC,CAAC;YACnB,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;gBAC3B,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC;YACjB,CAAC;QACH,CAAC;aAAM,CAAC;YACN,QAAQ,EAAE,CAAC,IAAI,CAAC,CAAC;QACnB,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,aAAa,GAAG,CAAC,IAAqB,EAAE,EAAE;QAC9C,MAAM,GAAG,GACP,IAAI,CAAC,mBAAmB,IAAI,IAAI,CAAC,kBAAkB,IAAI,IAAI,CAAC,OAAO,CAAC;QACtE,IAAI,GAAG,EAAE,CAAC;YACR,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QAC7B,CAAC;QACD,SAAS,EAAE,CAAC,IAAI,CAAC,CAAC;IACpB,CAAC,CAAC;IAEF,MAAM,qBAAqB,GAAG,CAAC,IAAqB,EAAE,EAAE;QACtD,oCAAoC;QAEpC,MAAM,YAAY,GAAG,GAAG,EAAE;YAExB,6DAA6D;YAC7D,IAAI,IAAI,CAAC,kBAAkB,IAAI,IAAI,CAAC,mBAAmB,EAAE,CAAC;gBACxD,OAAO;oBACL,IAAI,EAAE,YAAY,CAAC,kBAAkB,EAAE,QAAQ,IAAI,UAAU;oBAC7D,IAAI,EAAE,SAAS;iBAChB,CAAC;YACJ,CAAC;YAED,IAAI,IAAI,CAAC,kBAAkB,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,CAAC;gBACzD,OAAO;oBACL,IAAI,EAAE,YAAY,CAAC,kBAAkB,EAAE,MAAM,IAAI,QAAQ;oBACzD,IAAI,EAAE,SAAkB;iBACzB,CAAC;YACJ,CAAC;YAED,OAAO,IAAI,CAAC;QACd,CAAC,CAAC;QAEF,MAAM,SAAS,GAAG,YAAY,EAAE,CAAC;QAEjC,OAAO,CACL,KAAC,IAAI,cACH,KAAC,WAAW,IAAC,GAAG,EAAC,KAAK,YACpB,MAAC,WAAW,IAAC,GAAG,EAAC,KAAK,EAAC,IAAI,EAAE,KAAK,aAC/B,IAAI,CAAC,QAAQ,IAAI,CAChB,cACE,GAAG,EAAE,IAAI,CAAC,QAAQ,EAClB,GAAG,EAAE,IAAI,CAAC,KAAK,EACf,KAAK,EAAE;gCACL,KAAK,EAAE,MAAM;gCACb,MAAM,EAAE,MAAM;gCACd,YAAY,EAAE,KAAK;6BACpB,GACD,CACH,EACD,KAAC,GAAG,IAAC,SAAS,EAAC,OAAO,YACpB,MAAC,UAAU,IAAC,GAAG,EAAC,KAAK,aACnB,MAAC,UAAU,IAAC,GAAG,EAAC,KAAK,aACnB,MAAC,WAAW,IAAC,GAAG,EAAC,KAAK,EAAC,KAAK,EAAC,OAAO,aAClC,KAAC,IAAI,IAAC,EAAE,EAAC,GAAG,EAAC,OAAO,EAAC,QAAQ,EAAC,UAAU,EAAC,MAAM,YAC5C,IAAI,CAAC,KAAK,GACN,EACN,SAAS,IAAI,CACZ,KAAC,KAAK,IAAC,IAAI,EAAE,SAAS,CAAC,IAAI,YAAG,SAAS,CAAC,IAAI,GAAS,CACtD,IAEW,EACb,IAAI,CAAC,OAAO,IAAI,CACf,KAAC,IAAI,IAAC,EAAE,EAAC,GAAG,EAAC,OAAO,EAAC,QAAQ,YAC1B,IAAI,CAAC,OAAO,GACR,CACR,IACU,EACb,MAAC,WAAW,IAAC,GAAG,EAAC,KAAK,aACnB,IAAI,CAAC,mBAAmB,IAAI,CAC3B,KAAC,MAAM,IACL,IAAI,EAAE,YAAY,EAClB,OAAO,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,YAEjC,IAAI,CAAC,mBAAmB,GAClB,CACV,EACA,IAAI,CAAC,kBAAkB,IAAI,CAC1B,KAAC,MAAM,IACL,OAAO,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,YAEhC,IAAI,CAAC,kBAAkB,GACjB,CACV,IACW,IACH,GACT,IACM,GACF,IApDL,gBAAgB,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,GAAG,EAAE,CAqDzC,CACR,CAAC;IACJ,CAAC,CAAC;IAEF,gBAAgB;IAChB,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,CACL,cAAK,SAAS,EAAE,SAAS,YACvB,KAAC,UAAU,IAAC,GAAG,EAAC,KAAK,YAClB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,CAC7B,MAAC,UAAU,IAAsC,GAAG,EAAC,KAAK,aACxD,KAAC,GAAG,IAAC,kBAAkB,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,GAAG,EAAE,YAC7C,KAAC,gBAAgB,IAAC,KAAK,EAAE,CAAC,GAAI,GAC1B,EACN,KAAC,IAAI,IAAC,OAAO,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,YACjD,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CACzB,KAAC,IAAI,CAAC,IAAI,cACR,KAAC,IAAI,cACH,KAAC,UAAU,IAAC,GAAG,EAAC,KAAK,YACnB,KAAC,gBAAgB,IAAC,KAAK,EAAE,CAAC,GAAI,GACnB,GACR,IALO,iBAAiB,UAAU,IAAI,SAAS,EAAE,CAM9C,CACb,CAAC,GACG,KAdQ,kBAAkB,UAAU,EAAE,CAelC,CACd,CAAC,GACS,GACT,CACP,CAAC;IACJ,CAAC;IAED,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,CACL,cAAK,SAAS,EAAE,SAAS,YACvB,KAAC,IAAI,cACH,KAAC,UAAU,IACT,OAAO,EAAC,6BAA6B,EACrC,KAAK,EAAC,EAAE,YAER,iDAA6B,GAClB,GACR,GACH,CACP,CAAC;IACJ,CAAC;IAED,cAAc;IACd,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,IAAI,CAAC,cAAc;YAAE,OAAO,IAAI,CAAC;QAEjC,OAAO,CACL,cAAK,SAAS,EAAE,SAAS,YACvB,KAAC,IAAI,cACH,KAAC,UAAU,IACT,OAAO,EAAC,2BAA2B,EACnC,KAAK,EAAC,EAAE,YAER,sEAAkD,GACvC,GACR,GACH,CACP,CAAC;IACJ,CAAC;IAED,gBAAgB;IAChB,OAAO,CACL,cAAK,SAAS,EAAE,SAAS,YACvB,KAAC,UAAU,IAAC,GAAG,EAAC,KAAK,YAClB,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CACrB,MAAC,UAAU,IAAyC,GAAG,EAAC,KAAK,aAC3D,KAAC,GAAG,IAAC,kBAAkB,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,GAAG,EAAE,YAC7C,KAAC,IAAI,IAAC,EAAE,EAAC,IAAI,EAAC,OAAO,EAAC,WAAW,EAAC,UAAU,EAAC,UAAU,YACpD,KAAK,CAAC,KAAK,GACP,GACH,EACN,KAAC,IAAI,IAAC,OAAO,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,YACjD,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAS,EAAE,EAAE,CAAC,CAC9B,KAAC,IAAI,CAAC,IAAI,cACP,qBAAqB,CAAC,IAAI,CAAC,IADd,qBAAqB,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,GAAG,EAAE,CAE9C,CACb,CAAC,GACG,KAZQ,sBAAsB,KAAK,CAAC,GAAG,EAAE,CAarC,CACd,CAAC,GACS,GACT,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,kBAAkB,CAAC","sourcesContent":["import React from \"react\";\nimport {\n Badge,\n BlockStack,\n Box,\n Button,\n Card,\n InlineStack,\n Text,\n Grid,\n SkeletonBodyText,\n EmptyState,\n} from \"@shopify/polaris\";\nimport { ExternalIcon } from \"@shopify/polaris-icons\";\nimport { usePartnerIntegrations } from \"../hooks/usePartnerIntegration\";\nimport { useSDK, type UseSDKOptions } from \"../core/SDKManager\";\nimport { IntegrationItem } from \"../types/integration\";\nimport { COMPONENT_DEFAULTS } from \"../config/component-defaults\";\n\nexport type IntegrationStatusInfo = {\n isConnected?: boolean;\n isActive?: boolean;\n isPending?: boolean;\n showUpgradeBadge?: boolean;\n upgradeBadgeText?: string;\n upgradeBadgeIcon?: React.ReactNode;\n upgradeBadgeTooltip?: string;\n upgradeBadgePlan?: \"basic\" | \"pro\";\n};\n\nexport type IntegrationStatusProvider = (\n integration: IntegrationItem,\n) => IntegrationStatusInfo | undefined;\n\nexport interface PartnerIntegrationProps extends UseSDKOptions {\n /** Optional CSS class */\n className?: string;\n \n /** Handle manage action */\n onManage?: (item: IntegrationItem) => void;\n \n /** Handle install action */\n onInstall?: (item: IntegrationItem) => void;\n \n /** Handle open action */\n onOpen?: (item: IntegrationItem) => void;\n \n /** Handle upgrade click */\n onUpgradeClick?: (item: IntegrationItem) => void;\n}\n\nexport const PartnerIntegration: React.FC<PartnerIntegrationProps> = ({\n className = \"\",\n onManage,\n onInstall,\n onOpen,\n onUpgradeClick: _onUpgradeClick, // Keep for API compatibility\n // SDK options (optional)\n shopInfo,\n locale,\n translations: translationOverrides,\n config,\n}) => {\n // Use internal defaults\n const { showEmptyState } = COMPONENT_DEFAULTS.partnerIntegration;\n const { groups, loading, error } = usePartnerIntegrations();\n const sdk = useSDK({ shopInfo, locale, translations: translationOverrides, config });\n const translations = sdk.translations;\n\n const handleManage = (item: IntegrationItem) => {\n const url = item.button_manage_url;\n if (url) {\n if (url.startsWith(\"/\")) {\n onManage?.(item);\n } else {\n window.open(url, \"_blank\");\n onOpen?.(item);\n }\n } else {\n onManage?.(item);\n }\n };\n\n const handleInstall = (item: IntegrationItem) => {\n const url =\n item.button_install_link || item.button_install_url || item.app_url;\n if (url) {\n window.open(url, \"_blank\");\n }\n onInstall?.(item);\n };\n\n const renderIntegrationCard = (item: IntegrationItem) => {\n // SDK now handles status internally\n\n const getBadgeInfo = () => {\n\n // Fall back to button-based logic only if no status provider\n if (item.button_manage_text && item.button_install_text) {\n return {\n text: translations.partnerIntegration?.inactive || \"Inactive\",\n tone: undefined,\n };\n }\n\n if (item.button_manage_text && !item.button_install_text) {\n return {\n text: translations.partnerIntegration?.active || \"Active\",\n tone: \"success\" as const,\n };\n }\n\n return null;\n };\n\n const badgeInfo = getBadgeInfo();\n\n return (\n <Card key={`integration--${item.id || item.key}`}>\n <InlineStack gap=\"300\">\n <InlineStack gap=\"300\" wrap={false}>\n {item.icon_url && (\n <img\n src={item.icon_url}\n alt={item.title}\n style={{\n width: \"40px\",\n height: \"40px\",\n borderRadius: \"8px\",\n }}\n />\n )}\n <Box minHeight=\"130px\">\n <BlockStack gap=\"300\">\n <BlockStack gap=\"100\">\n <InlineStack gap=\"200\" align=\"start\">\n <Text as=\"p\" variant=\"bodyLg\" fontWeight=\"bold\">\n {item.title}\n </Text>\n {badgeInfo && (\n <Badge tone={badgeInfo.tone}>{badgeInfo.text}</Badge>\n )}\n {/* Upgrade badge handled internally */}\n </InlineStack>\n {item.content && (\n <Text as=\"p\" variant=\"bodyMd\">\n {item.content}\n </Text>\n )}\n </BlockStack>\n <InlineStack gap=\"200\">\n {item.button_install_text && (\n <Button\n icon={ExternalIcon}\n onClick={() => handleInstall(item)}\n >\n {item.button_install_text}\n </Button>\n )}\n {item.button_manage_text && (\n <Button\n onClick={() => handleManage(item)}\n >\n {item.button_manage_text}\n </Button>\n )}\n </InlineStack>\n </BlockStack>\n </Box>\n </InlineStack>\n </InlineStack>\n </Card>\n );\n };\n\n // Loading state\n if (loading) {\n return (\n <div className={className}>\n <BlockStack gap=\"600\">\n {[1, 2, 3].map((groupIndex) => (\n <BlockStack key={`skeleton-group-${groupIndex}`} gap=\"400\">\n <Box paddingInlineStart={{ xs: \"200\", md: \"0\" }}>\n <SkeletonBodyText lines={1} />\n </Box>\n <Grid columns={{ xs: 1, sm: 1, md: 2, lg: 2, xl: 2 }}>\n {[1, 2].map((cardIndex) => (\n <Grid.Cell key={`skeleton-card-${groupIndex}-${cardIndex}`}>\n <Card>\n <BlockStack gap=\"300\">\n <SkeletonBodyText lines={3} />\n </BlockStack>\n </Card>\n </Grid.Cell>\n ))}\n </Grid>\n </BlockStack>\n ))}\n </BlockStack>\n </div>\n );\n }\n\n if (error) {\n return (\n <div className={className}>\n <Card>\n <EmptyState\n heading=\"Unable to load integrations\"\n image=\"\"\n >\n <p>Please try again later</p>\n </EmptyState>\n </Card>\n </div>\n );\n }\n\n // Empty state\n if (groups.length === 0) {\n if (!showEmptyState) return null;\n\n return (\n <div className={className}>\n <Card>\n <EmptyState\n heading=\"No integrations available\"\n image=\"\"\n >\n <p>Check back later for available integrations</p>\n </EmptyState>\n </Card>\n </div>\n );\n }\n\n // Render groups\n return (\n <div className={className}>\n <BlockStack gap=\"600\">\n {groups.map((group) => (\n <BlockStack key={`integration-group--${group.key}`} gap=\"400\">\n <Box paddingInlineStart={{ xs: \"200\", md: \"0\" }}>\n <Text as=\"h3\" variant=\"headingMd\" fontWeight=\"semibold\">\n {group.title}\n </Text>\n </Box>\n <Grid columns={{ xs: 1, sm: 1, md: 2, lg: 2, xl: 2 }}>\n {group.items.map((item: any) => (\n <Grid.Cell key={`integration-cell--${item.id || item.key}`}>\n {renderIntegrationCard(item)}\n </Grid.Cell>\n ))}\n </Grid>\n </BlockStack>\n ))}\n </BlockStack>\n </div>\n );\n};\n\nexport default PartnerIntegration;\n"]}
@@ -7,3 +7,4 @@ export interface PartnerListProps {
7
7
  showIntegrationStatus?: boolean;
8
8
  }
9
9
  export declare const PartnerList: React.FC<PartnerListProps>;
10
+ //# sourceMappingURL=PartnerList.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PartnerList.d.ts","sourceRoot":"","sources":["../../src/components/PartnerList.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmB,MAAM,OAAO,CAAC;AAcxC,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAEvC,MAAM,WAAW,gBAAgB;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,IAAI,CAAC;IAChD,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,IAAI,CAAC;IAC9C,qBAAqB,CAAC,EAAE,OAAO,CAAC;CACjC;AAQD,eAAO,MAAM,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC,gBAAgB,CAqPlD,CAAC"}
@@ -100,3 +100,4 @@ export const PartnerList = ({ className = "", onPartnerClick, onSetupClick, show
100
100
  objectFit: "cover",
101
101
  } }) })), _jsx(Text, { as: "p", variant: "bodyMd", children: modalContent.type === "setup" ? (_jsxs(_Fragment, { children: ["To use ", modalContent.partner?.title, ", you'll need to:", _jsx("br", {}), _jsx("br", {}), "1. Install the app from the Shopify App Store", _jsx("br", {}), "2. Connect your account", _jsx("br", {}), "3. Configure your settings", _jsx("br", {}), _jsx("br", {}), "Click \"Continue Setup\" to open the app page."] })) : (modalContent.partner?.content) }), modalContent.partner?.app_url && (_jsxs(Text, { as: "p", variant: "bodySm", tone: "subdued", children: ["This will open:", " ", new URL(modalContent.partner.app_url).hostname] }))] }) }) }) })] }));
102
102
  };
103
+ //# sourceMappingURL=PartnerList.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PartnerList.js","sourceRoot":"","sources":["../../src/components/PartnerList.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACxC,OAAO,EACL,KAAK,EACL,UAAU,EACV,GAAG,EACH,MAAM,EACN,IAAI,EACJ,WAAW,EACX,KAAK,EACL,IAAI,EACJ,aAAa,GACd,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAgBxC,MAAM,CAAC,MAAM,WAAW,GAA+B,CAAC,EACtD,SAAS,GAAG,EAAE,EACd,cAAc,EACd,YAAY,EACZ,qBAAqB,GAAG,KAAK,GAC9B,EAAE,EAAE;IACH,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAe;QAC7D,MAAM,EAAE,KAAK;QACb,OAAO,EAAE,IAAI;QACb,IAAI,EAAE,IAAI;KACX,CAAC,CAAC;IAEH,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,GAAG,YAAY,EAAE,CAAC;IAC/C,MAAM,WAAW,GAAG,aAAa,EAAE,YAAY,IAAI,EAAE,CAAC;IAEtD,MAAM,mBAAmB,GAAG,CAAC,OAAoB,EAAE,EAAE;QACnD,IAAI,eAAe,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YACjC,eAAe,CAAC;gBACd,MAAM,EAAE,IAAI;gBACZ,OAAO;gBACP,IAAI,EAAE,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC;aAChC,CAAC,CAAC;QACL,CAAC;aAAM,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YAC3B,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QACzC,CAAC;QAED,cAAc,EAAE,CAAC,OAAO,CAAC,CAAC;IAC5B,CAAC,CAAC;IAEF,MAAM,eAAe,GAAG,CAAC,GAAW,EAAW,EAAE;QAC/C,MAAM,aAAa,GAAG;YACpB,WAAW;YACX,YAAY;YACZ,UAAU;YACV,WAAW;YACX,aAAa;YACb,OAAO;SACR,CAAC;QAEF,OAAO,aAAa,CAAC,QAAQ,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;IACnD,CAAC,CAAC;IAEF,MAAM,YAAY,GAAG,CAAC,GAAW,EAAoB,EAAE;QACrD,MAAM,aAAa,GAAG,CAAC,WAAW,EAAE,YAAY,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;QAC3E,OAAO,aAAa,CAAC,QAAQ,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;IACtE,CAAC,CAAC;IAEF,MAAM,gBAAgB,GAAG,GAAG,EAAE;QAC5B,eAAe,CAAC;YACd,MAAM,EAAE,KAAK;YACb,OAAO,EAAE,IAAI;YACb,IAAI,EAAE,IAAI;SACX,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,MAAM,gBAAgB,GAAG,GAAG,EAAE;QAC5B,IAAI,YAAY,CAAC,OAAO,EAAE,CAAC;YACzB,YAAY,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;YAErC,IAAI,YAAY,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;gBACjC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;YACtD,CAAC;QACH,CAAC;QACD,gBAAgB,EAAE,CAAC;IACrB,CAAC,CAAC;IAEF,MAAM,oBAAoB,GAAG,CAAC,OAAoB,EAAW,EAAE;QAC7D,MAAM,cAAc,GAAG,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;QACnD,OAAO,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;IAC5D,CAAC,CAAC;IAEF,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,OAAO,CACL,cAAK,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,YACjD,KAAC,IAAI,cACH,KAAC,GAAG,IAAC,OAAO,EAAC,KAAK,YAChB,KAAC,IAAI,IAAC,EAAE,EAAC,GAAG,EAAC,OAAO,EAAC,QAAQ,EAAC,IAAI,EAAC,SAAS,0CAErC,GACH,GACD,GACH,CACP,CAAC;IACJ,CAAC;IAED,OAAO,CACL,eAAK,SAAS,EAAE,0BAA0B,SAAS,EAAE,aACnD,KAAC,IAAI,cACH,MAAC,UAAU,IAAC,GAAG,EAAC,KAAK,aACnB,KAAC,GAAG,IAAC,kBAAkB,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,GAAG,EAAE,YAC7C,KAAC,IAAI,IAAC,OAAO,EAAC,WAAW,EAAC,EAAE,EAAC,IAAI,4CAE1B,GACH,EAEN,KAAC,UAAU,IAAC,GAAG,EAAC,KAAK,YAClB,WAAW,CAAC,GAAG,CAAC,CAAC,OAAoB,EAAE,KAAa,EAAE,EAAE;gCACvD,MAAM,SAAS,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,KAAK,EAAE,CAAC;gCAC5C,MAAM,QAAQ,GACZ,qBAAqB,IAAI,oBAAoB,CAAC,OAAO,CAAC,CAAC;gCACzD,MAAM,aAAa,GAAG,eAAe,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;gCAEnD,OAAO,CACL,KAAC,IAAI,cACH,MAAC,UAAU,IAAC,GAAG,EAAC,KAAK,aACnB,MAAC,WAAW,IACV,UAAU,EAAC,QAAQ,EACnB,KAAK,EAAC,eAAe,EACrB,GAAG,EAAC,KAAK,aAET,MAAC,WAAW,IAAC,UAAU,EAAC,QAAQ,EAAC,GAAG,EAAC,KAAK,aACvC,OAAO,CAAC,QAAQ,IAAI,CACnB,cACE,GAAG,EAAE,OAAO,CAAC,QAAQ,EACrB,GAAG,EAAE,OAAO,CAAC,KAAK,EAClB,KAAK,EAAE;oEACL,KAAK,EAAE,MAAM;oEACb,MAAM,EAAE,MAAM;oEACd,YAAY,EAAE,KAAK;oEACnB,SAAS,EAAE,OAAO;iEACnB,GACD,CACH,EACD,KAAC,IAAI,IAAC,EAAE,EAAC,IAAI,EAAC,OAAO,EAAC,QAAQ,EAAC,UAAU,EAAC,UAAU,YACjD,OAAO,CAAC,KAAK,GACT,EACN,qBAAqB,IAAI,CACxB,KAAC,KAAK,IAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,YACvC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,GAC3B,CACT,IACW,EAEd,MAAC,WAAW,IAAC,GAAG,EAAC,KAAK,aACpB,KAAC,MAAM,IACL,IAAI,EAAE,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,YAAY,EAC9C,OAAO,EAAE,GAAG,EAAE,CAAC,mBAAmB,CAAC,OAAO,CAAC,YAE1C,OAAO,CAAC,WAAW,IAAI,aAAa,GAC9B,EAER,QAAQ,IAAI,CACX,KAAC,MAAM,IACL,OAAO,EAAC,OAAO,EACf,OAAO,EAAE,GAAG,EAAE;oEACZ,eAAe,CAAC;wEACd,MAAM,EAAE,IAAI;wEACZ,OAAO;wEACP,IAAI,EAAE,OAAO;qEACd,CAAC,CAAC;gEACL,CAAC,uBAGM,CACV,IACW,IACF,EAEd,KAAC,IAAI,IAAC,EAAE,EAAC,GAAG,EAAC,OAAO,EAAC,QAAQ,YAC1B,OAAO,CAAC,OAAO,GACX,IACI,IA1DJ,SAAS,CA2Db,CACR,CAAC;4BACJ,CAAC,CAAC,GACS,IACF,GACR,EAEP,KAAC,KAAK,IACJ,IAAI,EAAE,YAAY,CAAC,MAAM,EACzB,OAAO,EAAE,gBAAgB,EACzB,KAAK,EACH,YAAY,CAAC,IAAI,KAAK,OAAO;oBAC3B,CAAC,CAAC,UAAU,YAAY,CAAC,OAAO,EAAE,KAAK,EAAE;oBACzC,CAAC,CAAC,YAAY,CAAC,OAAO,EAAE,KAAK,IAAI,aAAa,EAElD,aAAa,EACX,YAAY,CAAC,IAAI,KAAK,OAAO;oBAC3B,CAAC,CAAC;wBACE,OAAO,EAAE,gBAAgB;wBACzB,QAAQ,EAAE,gBAAgB;qBAC3B;oBACH,CAAC,CAAC;wBACE,OAAO,EAAE,QAAQ;wBACjB,QAAQ,EAAE,gBAAgB;qBAC3B,EAEP,gBAAgB,EAAE;oBAChB;wBACE,OAAO,EAAE,QAAQ;wBACjB,QAAQ,EAAE,gBAAgB;qBAC3B;iBACF,YAED,KAAC,KAAK,CAAC,OAAO,cACZ,KAAC,aAAa,cACZ,MAAC,UAAU,IAAC,GAAG,EAAC,KAAK,aAClB,YAAY,CAAC,OAAO,EAAE,QAAQ,IAAI,CACjC,KAAC,GAAG,cACF,cACE,GAAG,EAAE,YAAY,CAAC,OAAO,CAAC,QAAQ,EAClC,GAAG,EAAE,YAAY,CAAC,OAAO,CAAC,KAAK,EAC/B,KAAK,EAAE;4CACL,KAAK,EAAE,MAAM;4CACb,MAAM,EAAE,MAAM;4CACd,YAAY,EAAE,MAAM;4CACpB,SAAS,EAAE,OAAO;yCACnB,GACD,GACE,CACP,EAED,KAAC,IAAI,IAAC,EAAE,EAAC,GAAG,EAAC,OAAO,EAAC,QAAQ,YAC1B,YAAY,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,CAC/B,yCACU,YAAY,CAAC,OAAO,EAAE,KAAK,uBACnC,cAAM,EACN,cAAM,mDAEN,cAAM,6BAEN,cAAM,gCAEN,cAAM,EACN,cAAM,sDAEL,CACJ,CAAC,CAAC,CAAC,CACF,YAAY,CAAC,OAAO,EAAE,OAAO,CAC9B,GACI,EAEN,YAAY,CAAC,OAAO,EAAE,OAAO,IAAI,CAChC,MAAC,IAAI,IAAC,EAAE,EAAC,GAAG,EAAC,OAAO,EAAC,QAAQ,EAAC,IAAI,EAAC,SAAS,gCAC1B,GAAG,EAClB,IAAI,GAAG,CAAC,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,QAAQ,IAC1C,CACR,IACU,GACC,GACF,GACV,IACJ,CACP,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import React, { useState } from \"react\";\nimport {\n Badge,\n BlockStack,\n Box,\n Button,\n Card,\n InlineStack,\n Modal,\n Text,\n TextContainer,\n} from \"@shopify/polaris\";\nimport { ExternalIcon } from \"@shopify/polaris-icons\";\nimport { useDashboard } from \"../hooks\";\nimport { PartnerItem } from \"../types\";\n\nexport interface PartnerListProps {\n className?: string;\n onPartnerClick?: (partner: PartnerItem) => void;\n onSetupClick?: (partner: PartnerItem) => void;\n showIntegrationStatus?: boolean;\n}\n\ninterface ModalContent {\n isOpen: boolean;\n partner: PartnerItem | null;\n type: \"setup\" | \"info\" | null;\n}\n\nexport const PartnerList: React.FC<PartnerListProps> = ({\n className = \"\",\n onPartnerClick,\n onSetupClick,\n showIntegrationStatus = false,\n}) => {\n const [modalContent, setModalContent] = useState<ModalContent>({\n isOpen: false,\n partner: null,\n type: null,\n });\n\n const { data: dashboardData } = useDashboard();\n const partnerList = dashboardData?.partner_list || [];\n\n const handlePartnerAction = (partner: PartnerItem) => {\n if (shouldShowModal(partner.key)) {\n setModalContent({\n isOpen: true,\n partner,\n type: getModalType(partner.key),\n });\n } else if (partner.app_url) {\n window.open(partner.app_url, \"_blank\");\n }\n\n onPartnerClick?.(partner);\n };\n\n const shouldShowModal = (key: string): boolean => {\n const modalPartners = [\n \"aftership\",\n \"after_ship\",\n \"langwill\",\n \"lang_will\",\n \"searchanise\",\n \"tidio\",\n ];\n\n return modalPartners.includes(key.toLowerCase());\n };\n\n const getModalType = (key: string): \"setup\" | \"info\" => {\n const setupPartners = [\"aftership\", \"after_ship\", \"langwill\", \"lang_will\"];\n return setupPartners.includes(key.toLowerCase()) ? \"setup\" : \"info\";\n };\n\n const handleModalClose = () => {\n setModalContent({\n isOpen: false,\n partner: null,\n type: null,\n });\n };\n\n const handleModalSetup = () => {\n if (modalContent.partner) {\n onSetupClick?.(modalContent.partner);\n\n if (modalContent.partner.app_url) {\n window.open(modalContent.partner.app_url, \"_blank\");\n }\n }\n handleModalClose();\n };\n\n const getIntegrationStatus = (partner: PartnerItem): boolean => {\n const activePartners = [\"aftership\", \"after_ship\"];\n return activePartners.includes(partner.key.toLowerCase());\n };\n\n if (partnerList.length === 0) {\n return (\n <div className={className} style={{ width: \"100%\" }}>\n <Card>\n <Box padding=\"400\">\n <Text as=\"p\" variant=\"bodyMd\" tone=\"subdued\">\n No partner apps available\n </Text>\n </Box>\n </Card>\n </div>\n );\n }\n\n return (\n <div className={`dashboard-partner-list ${className}`}>\n <Card>\n <BlockStack gap=\"400\">\n <Box paddingInlineStart={{ xs: \"200\", md: \"0\" }}>\n <Text variant=\"headingMd\" as=\"h2\">\n Partner Apps & Integrations\n </Text>\n </Box>\n\n <BlockStack gap=\"400\">\n {partnerList.map((partner: PartnerItem, index: number) => {\n const uniqueKey = `${partner.key}-${index}`;\n const isActive =\n showIntegrationStatus && getIntegrationStatus(partner);\n const requiresModal = shouldShowModal(partner.key);\n\n return (\n <Card key={uniqueKey}>\n <BlockStack gap=\"200\">\n <InlineStack\n blockAlign=\"center\"\n align=\"space-between\"\n gap=\"100\"\n >\n <InlineStack blockAlign=\"center\" gap=\"200\">\n {partner.icon_url && (\n <img\n src={partner.icon_url}\n alt={partner.title}\n style={{\n width: \"40px\",\n height: \"40px\",\n borderRadius: \"8px\",\n objectFit: \"cover\",\n }}\n />\n )}\n <Text as=\"h3\" variant=\"bodyLg\" fontWeight=\"semibold\">\n {partner.title}\n </Text>\n {showIntegrationStatus && (\n <Badge tone={isActive ? \"success\" : \"info\"}>\n {isActive ? \"Active\" : \"Inactive\"}\n </Badge>\n )}\n </InlineStack>\n\n <InlineStack gap=\"200\">\n <Button\n icon={requiresModal ? undefined : ExternalIcon}\n onClick={() => handlePartnerAction(partner)}\n >\n {partner.button_text || \"Install App\"}\n </Button>\n\n {isActive && (\n <Button\n variant=\"plain\"\n onClick={() => {\n setModalContent({\n isOpen: true,\n partner,\n type: \"setup\",\n });\n }}\n >\n Manage\n </Button>\n )}\n </InlineStack>\n </InlineStack>\n\n <Text as=\"p\" variant=\"bodyMd\">\n {partner.content}\n </Text>\n </BlockStack>\n </Card>\n );\n })}\n </BlockStack>\n </BlockStack>\n </Card>\n\n <Modal\n open={modalContent.isOpen}\n onClose={handleModalClose}\n title={\n modalContent.type === \"setup\"\n ? `Set up ${modalContent.partner?.title}`\n : modalContent.partner?.title || \"Partner App\"\n }\n primaryAction={\n modalContent.type === \"setup\"\n ? {\n content: \"Continue Setup\",\n onAction: handleModalSetup,\n }\n : {\n content: \"Got it\",\n onAction: handleModalClose,\n }\n }\n secondaryActions={[\n {\n content: \"Cancel\",\n onAction: handleModalClose,\n },\n ]}\n >\n <Modal.Section>\n <TextContainer>\n <BlockStack gap=\"300\">\n {modalContent.partner?.icon_url && (\n <Box>\n <img\n src={modalContent.partner.icon_url}\n alt={modalContent.partner.title}\n style={{\n width: \"60px\",\n height: \"60px\",\n borderRadius: \"12px\",\n objectFit: \"cover\",\n }}\n />\n </Box>\n )}\n\n <Text as=\"p\" variant=\"bodyMd\">\n {modalContent.type === \"setup\" ? (\n <>\n To use {modalContent.partner?.title}, you'll need to:\n <br />\n <br />\n 1. Install the app from the Shopify App Store\n <br />\n 2. Connect your account\n <br />\n 3. Configure your settings\n <br />\n <br />\n Click \"Continue Setup\" to open the app page.\n </>\n ) : (\n modalContent.partner?.content\n )}\n </Text>\n\n {modalContent.partner?.app_url && (\n <Text as=\"p\" variant=\"bodySm\" tone=\"subdued\">\n This will open:{\" \"}\n {new URL(modalContent.partner.app_url).hostname}\n </Text>\n )}\n </BlockStack>\n </TextContainer>\n </Modal.Section>\n </Modal>\n </div>\n );\n};\n"]}
@@ -1,12 +1,12 @@
1
1
  import React from "react";
2
2
  import { BannerItem } from "../types";
3
3
  export interface PopupBannerProps {
4
+ /** Optional CSS class */
4
5
  className?: string;
6
+ /** Handle close */
5
7
  onClose?: () => void;
8
+ /** Handle action */
6
9
  onAction?: (banner: BannerItem) => void;
7
- autoShow?: boolean;
8
- showDelay?: number;
9
- persistClose?: boolean;
10
- storageKey?: string;
11
10
  }
12
11
  export declare const PopupBanner: React.FC<PopupBannerProps>;
12
+ //# sourceMappingURL=PopupBanner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PopupBanner.d.ts","sourceRoot":"","sources":["../../src/components/PopupBanner.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA8B,MAAM,OAAO,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAItC,MAAM,WAAW,gBAAgB;IAC/B,yBAAyB;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,mBAAmB;IACnB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IAErB,oBAAoB;IACpB,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,IAAI,CAAC;CACzC;AAED,eAAO,MAAM,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC,gBAAgB,CAyLlD,CAAC"}
@@ -1,7 +1,10 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
2
  import { useState, useEffect } from "react";
3
3
  import { usePopupBanner } from "../hooks/useBanner";
4
- export const PopupBanner = ({ className = "", onClose, onAction, autoShow = true, showDelay = 0, persistClose = true, storageKey = "shopify-dashboard-popup-closed", }) => {
4
+ import { COMPONENT_DEFAULTS } from "../config/component-defaults";
5
+ export const PopupBanner = ({ className = "", onClose, onAction, }) => {
6
+ // Use internal defaults
7
+ const { autoShow, showDelay, persistClose, storageKey, } = COMPONENT_DEFAULTS.popupBanner;
5
8
  const banner = usePopupBanner();
6
9
  const [isVisible, setIsVisible] = useState(false);
7
10
  const [hasBeenClosed, setHasBeenClosed] = useState(false);
@@ -98,3 +101,4 @@ export const PopupBanner = ({ className = "", onClose, onAction, autoShow = true
98
101
  cursor: "pointer",
99
102
  }, children: banner.linkText || "Learn More" }))] })] }));
100
103
  };
104
+ //# sourceMappingURL=PopupBanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PopupBanner.js","sourceRoot":"","sources":["../../src/components/PopupBanner.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useState, useEffect } from \"react\";\nimport { BannerItem } from \"../types\";\nimport { usePopupBanner } from \"../hooks/useBanner\";\nimport { COMPONENT_DEFAULTS } from \"../config/component-defaults\";\n\nexport interface PopupBannerProps {\n /** Optional CSS class */\n className?: string;\n \n /** Handle close */\n onClose?: () => void;\n \n /** Handle action */\n onAction?: (banner: BannerItem) => void;\n}\n\nexport const PopupBanner: React.FC<PopupBannerProps> = ({\n className = \"\",\n onClose,\n onAction,\n}) => {\n // Use internal defaults\n const {\n autoShow,\n showDelay,\n persistClose,\n storageKey,\n } = COMPONENT_DEFAULTS.popupBanner;\n const banner = usePopupBanner();\n const [isVisible, setIsVisible] = useState(false);\n const [hasBeenClosed, setHasBeenClosed] = useState(false);\n\n useEffect(() => {\n if (!banner || !autoShow) return;\n\n if (persistClose && typeof window !== \"undefined\") {\n const closedBanners = localStorage.getItem(storageKey);\n if (closedBanners) {\n const closed = JSON.parse(closedBanners);\n if (closed[banner.id]) {\n setHasBeenClosed(true);\n return;\n }\n }\n }\n\n const timer = setTimeout(() => {\n setIsVisible(true);\n }, showDelay);\n\n return () => clearTimeout(timer);\n }, [banner, autoShow, showDelay, persistClose, storageKey]);\n\n const handleClose = () => {\n setIsVisible(false);\n\n if (persistClose && banner && typeof window !== \"undefined\") {\n const closedBanners = localStorage.getItem(storageKey);\n const closed = closedBanners ? JSON.parse(closedBanners) : {};\n closed[banner.id] = true;\n localStorage.setItem(storageKey, JSON.stringify(closed));\n }\n\n onClose?.();\n };\n\n const handleAction = () => {\n if (banner) {\n if (banner.link) {\n window.open(\n banner.link,\n banner.openType === \"new_tab\" ? \"_blank\" : \"_self\",\n );\n }\n onAction?.(banner);\n }\n };\n\n if (!banner || hasBeenClosed || !isVisible) {\n return null;\n }\n\n const styles: React.CSSProperties = {\n backgroundColor: banner.style?.backgroundColor || \"#ffffff\",\n color: banner.style?.textColor || \"#000000\",\n };\n\n const buttonStyles: React.CSSProperties = {\n backgroundColor: banner.style?.buttonColor || \"#007bff\",\n color: banner.style?.buttonTextColor || \"#ffffff\",\n };\n\n return (\n <>\n <div\n className={`popup-banner-overlay ${className}`}\n style={{\n position: \"fixed\",\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n backgroundColor: \"rgba(0, 0, 0, 0.5)\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n zIndex: 9999,\n }}\n onClick={handleClose}\n />\n <div\n className={`popup-banner ${className}`}\n style={{\n ...styles,\n position: \"fixed\",\n top: \"50%\",\n left: \"50%\",\n transform: \"translate(-50%, -50%)\",\n maxWidth: \"500px\",\n width: \"90%\",\n padding: \"24px\",\n borderRadius: \"8px\",\n boxShadow: \"0 4px 6px rgba(0, 0, 0, 0.1)\",\n zIndex: 10000,\n }}\n onClick={(e) => e.stopPropagation()}\n >\n <button\n onClick={handleClose}\n style={{\n position: \"absolute\",\n top: \"12px\",\n right: \"12px\",\n background: \"none\",\n border: \"none\",\n fontSize: \"24px\",\n cursor: \"pointer\",\n color: styles.color,\n }}\n aria-label=\"Close popup\"\n >\n ×\n </button>\n\n {banner.icon && (\n <div style={{ marginBottom: \"16px\" }}>\n <img\n src={banner.icon}\n alt=\"\"\n style={{ width: \"48px\", height: \"48px\" }}\n />\n </div>\n )}\n\n {banner.image && (\n <div style={{ marginBottom: \"16px\" }}>\n <img\n src={banner.image}\n alt=\"\"\n style={{ width: \"100%\", borderRadius: \"4px\" }}\n />\n </div>\n )}\n\n <h2\n style={{ margin: \"0 0 12px 0\", fontSize: \"20px\", fontWeight: \"bold\" }}\n >\n {banner.title}\n </h2>\n\n {banner.description && (\n <p\n style={{\n margin: \"0 0 20px 0\",\n fontSize: \"14px\",\n lineHeight: \"1.5\",\n }}\n >\n {banner.description}\n </p>\n )}\n\n {banner.link && (\n <button\n onClick={handleAction}\n style={{\n ...buttonStyles,\n padding: \"10px 20px\",\n border: \"none\",\n borderRadius: \"4px\",\n fontSize: \"14px\",\n fontWeight: \"bold\",\n cursor: \"pointer\",\n }}\n >\n {banner.linkText || \"Learn More\"}\n </button>\n )}\n </div>\n </>\n );\n};\n"]}
@@ -1,15 +1,15 @@
1
1
  import React from "react";
2
2
  import { BannerItem } from "../types";
3
- export interface TopBannerProps {
3
+ import { type UseSDKOptions } from "../core/SDKManager";
4
+ export interface TopBannerProps extends UseSDKOptions {
5
+ /** Optional CSS class for styling */
4
6
  className?: string;
7
+ /** Control visibility (default: true) */
5
8
  open?: boolean;
9
+ /** Handle close event */
6
10
  onClose?: () => void;
11
+ /** Handle primary action click */
7
12
  onAction?: (banner: BannerItem) => void;
8
- closable?: boolean;
9
- sticky?: boolean;
10
- renderBanner?: (banner: BannerItem, handlers: {
11
- onClose: () => void;
12
- onAction: () => void;
13
- }) => React.ReactNode;
14
13
  }
15
14
  export declare const TopBanner: React.FC<TopBannerProps>;
15
+ //# sourceMappingURL=TopBanner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TopBanner.d.ts","sourceRoot":"","sources":["../../src/components/TopBanner.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA8B,MAAM,OAAO,CAAC;AASnD,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAEtC,OAAO,EAAU,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGhE,MAAM,WAAW,cAAe,SAAQ,aAAa;IACnD,qCAAqC;IACrC,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,yCAAyC;IACzC,IAAI,CAAC,EAAE,OAAO,CAAC;IAEf,yBAAyB;IACzB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IAErB,kCAAkC;IAClC,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,IAAI,CAAC;CACzC;AA6FD,eAAO,MAAM,SAAS,EAAE,KAAK,CAAC,EAAE,CAAC,cAAc,CA8J9C,CAAC"}
@@ -1,9 +1,10 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { useState, useEffect, useContext } from "react";
2
+ import { useState, useEffect } from "react";
3
3
  import { Banner, Button, Text, BlockStack, InlineStack, } from "@shopify/polaris";
4
4
  import { ExternalIcon } from "@shopify/polaris-icons";
5
5
  import { useTopBanner } from "../hooks/useBanner";
6
- import { DashboardContext } from "../provider/DashboardProvider";
6
+ import { useSDK } from "../core/SDKManager";
7
+ import { COMPONENT_DEFAULTS } from "../config/component-defaults";
7
8
  const BANNER_MIN_HEIGHT = 100;
8
9
  const TopBannerSkeleton = ({ className, visible }) => {
9
10
  // When not visible, return zero-space container
@@ -61,13 +62,16 @@ const TopBannerSkeleton = ({ className, visible }) => {
61
62
  }
62
63
  ` })] }));
63
64
  };
64
- export const TopBanner = ({ className = "", open = true, onClose, onAction, closable = true, renderBanner, }) => {
65
- const context = useContext(DashboardContext);
66
- const isInitialized = context?.isInitialized ?? false;
67
- const isLoading = context?.state?.loading ?? true;
65
+ export const TopBanner = ({ className = "", open = true, onClose, onAction,
66
+ // SDK options (optional - for customization)
67
+ shopInfo, locale, translations, config, }) => {
68
+ // Connect to SDK Manager (auto-initializes)
69
+ const sdk = useSDK({ shopInfo, locale, translations, config });
68
70
  const banner = useTopBanner();
69
71
  const [isDismissed, setIsDismissed] = useState(false);
70
72
  const [dismissChecked, setDismissChecked] = useState(false);
73
+ // Use internal defaults
74
+ const { closable } = COMPONENT_DEFAULTS.topBanner;
71
75
  const DISMISS_KEY = "ts-top-banner-dismissed";
72
76
  const DISMISS_DURATION = 7 * 24 * 60 * 60 * 1000;
73
77
  useEffect(() => {
@@ -107,10 +111,10 @@ export const TopBanner = ({ className = "", open = true, onClose, onAction, clos
107
111
  }
108
112
  };
109
113
  const shouldShow = open && !isDismissed;
110
- const showSkeleton = shouldShow && (!dismissChecked || !isInitialized || isLoading);
111
- const showBanner = shouldShow && dismissChecked && isInitialized && !isLoading && banner;
114
+ const showSkeleton = shouldShow && (!dismissChecked || !sdk.initialized || sdk.loading || sdk.isInitializing);
115
+ const showBanner = shouldShow && dismissChecked && sdk.initialized && !sdk.loading && !sdk.isInitializing && banner;
112
116
  // Always render skeleton during loading, but control visibility
113
- if (!dismissChecked || !isInitialized || isLoading) {
117
+ if (!dismissChecked || !sdk.initialized || sdk.loading || sdk.isInitializing) {
114
118
  return _jsx(TopBannerSkeleton, { className: className, visible: showSkeleton });
115
119
  }
116
120
  // No banner data available - render invisible container to maintain mount
@@ -123,27 +127,7 @@ export const TopBanner = ({ className = "", open = true, onClose, onAction, clos
123
127
  pointerEvents: "none",
124
128
  }, "aria-hidden": "true" }));
125
129
  }
126
- // Custom render function with visibility control
127
- if (renderBanner) {
128
- // When not showing, render zero-space container
129
- if (!showBanner) {
130
- return (_jsx("div", { className: className, style: {
131
- width: "100%",
132
- height: 0,
133
- overflow: "hidden",
134
- position: "absolute",
135
- pointerEvents: "none",
136
- }, "aria-hidden": "true" }));
137
- }
138
- return (_jsx("div", { style: {
139
- opacity: 1,
140
- visibility: "visible",
141
- transition: "opacity 0.3s ease",
142
- }, children: renderBanner(banner, {
143
- onClose: handleClose,
144
- onAction: handleAction,
145
- }) }));
146
- }
130
+ // Removed custom render function - using SDK default rendering
147
131
  // Default banner render with visibility control
148
132
  // When not showing, render zero-space container
149
133
  if (!showBanner) {
@@ -160,3 +144,4 @@ export const TopBanner = ({ className = "", open = true, onClose, onAction, clos
160
144
  minHeight: `${BANNER_MIN_HEIGHT}px`,
161
145
  }, children: _jsx(Banner, { hideIcon: true, onDismiss: closable ? handleClose : undefined, children: _jsxs(InlineStack, { gap: "400", blockAlign: "center", wrap: false, children: [banner.icon && (_jsx("div", { style: { flexShrink: 0 }, children: _jsx("img", { src: banner.icon, alt: "", width: 72, height: 72, style: { borderRadius: "8px" }, loading: "eager" }) })), _jsx("div", { style: { flex: 1, minWidth: 0 }, children: _jsxs(BlockStack, { gap: "100", align: "space-between", children: [_jsxs(BlockStack, { gap: "100", children: [_jsx(Text, { variant: "headingSm", as: "h3", children: banner.title }), banner.description && (_jsx(Text, { variant: "bodyMd", tone: "subdued", as: "p", children: banner.description }))] }), banner.link && (_jsx("div", { style: { flexShrink: 0 }, children: _jsx(Button, { icon: ExternalIcon, onClick: handleAction, children: banner.linkText || "Learn More" }) }))] }) })] }) }) }));
162
146
  };
147
+ //# sourceMappingURL=TopBanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TopBanner.js","sourceRoot":"","sources":["../../src/components/TopBanner.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useState, useEffect } from \"react\";\nimport {\n Banner,\n Button,\n Text,\n BlockStack,\n InlineStack,\n} from \"@shopify/polaris\";\nimport { ExternalIcon } from \"@shopify/polaris-icons\";\nimport { BannerItem } from \"../types\";\nimport { useTopBanner } from \"../hooks/useBanner\";\nimport { useSDK, type UseSDKOptions } from \"../core/SDKManager\";\nimport { COMPONENT_DEFAULTS } from \"../config/component-defaults\";\n\nexport interface TopBannerProps extends UseSDKOptions {\n /** Optional CSS class for styling */\n className?: string;\n \n /** Control visibility (default: true) */\n open?: boolean;\n \n /** Handle close event */\n onClose?: () => void;\n \n /** Handle primary action click */\n onAction?: (banner: BannerItem) => void;\n}\n\nconst BANNER_MIN_HEIGHT = 100;\n\nconst TopBannerSkeleton: React.FC<{ \n className?: string;\n visible: boolean;\n}> = ({ className, visible }) => {\n // When not visible, return zero-space container\n if (!visible) {\n return (\n <div \n className={className}\n style={{\n width: \"100%\",\n height: 0,\n overflow: \"hidden\",\n position: \"absolute\",\n pointerEvents: \"none\",\n }}\n aria-hidden=\"true\"\n />\n );\n }\n\n return (\n <div \n className={className} \n style={{ \n width: \"100%\",\n }}\n >\n <div\n style={{\n minHeight: `${BANNER_MIN_HEIGHT}px`,\n padding: \"16px\",\n borderRadius: \"8px\",\n border: \"1px solid var(--p-color-border-subdued)\",\n backgroundColor: \"var(--p-color-bg-surface)\",\n display: \"flex\",\n alignItems: \"center\",\n gap: \"16px\",\n }}\n >\n <div\n style={{\n width: 72,\n height: 72,\n borderRadius: \"8px\",\n backgroundColor: \"var(--p-color-bg-surface-secondary)\",\n flexShrink: 0,\n animation: \"pulse 1.5s ease-in-out infinite\",\n }}\n />\n <div style={{ flex: 1, minWidth: 0 }}>\n <div\n style={{\n height: 20,\n width: \"30%\",\n backgroundColor: \"var(--p-color-bg-surface-secondary)\",\n borderRadius: \"4px\",\n marginBottom: \"8px\",\n animation: \"pulse 1.5s ease-in-out infinite\",\n }}\n />\n <div\n style={{\n height: 16,\n width: \"70%\",\n backgroundColor: \"var(--p-color-bg-surface-secondary)\",\n borderRadius: \"4px\",\n animation: \"pulse 1.5s ease-in-out infinite\",\n }}\n />\n </div>\n </div>\n <style>{`\n @keyframes pulse {\n 0% {\n opacity: 1;\n }\n 50% {\n opacity: 0.6;\n }\n 100% {\n opacity: 1;\n }\n }\n `}</style>\n </div>\n );\n};\n\nexport const TopBanner: React.FC<TopBannerProps> = ({\n className = \"\",\n open = true,\n onClose,\n onAction,\n // SDK options (optional - for customization)\n shopInfo,\n locale,\n translations,\n config,\n}) => {\n // Connect to SDK Manager (auto-initializes)\n const sdk = useSDK({ shopInfo, locale, translations, config });\n \n const banner = useTopBanner();\n const [isDismissed, setIsDismissed] = useState(false);\n const [dismissChecked, setDismissChecked] = useState(false);\n\n // Use internal defaults\n const { closable } = COMPONENT_DEFAULTS.topBanner;\n const DISMISS_KEY = \"ts-top-banner-dismissed\";\n const DISMISS_DURATION = 7 * 24 * 60 * 60 * 1000;\n\n useEffect(() => {\n const dismissedData = localStorage.getItem(DISMISS_KEY);\n if (dismissedData) {\n try {\n const { timestamp } = JSON.parse(dismissedData);\n const now = Date.now();\n\n if (now - timestamp < DISMISS_DURATION) {\n setIsDismissed(true);\n } else {\n localStorage.removeItem(DISMISS_KEY);\n }\n } catch (error) {\n localStorage.removeItem(DISMISS_KEY);\n }\n }\n setDismissChecked(true);\n }, []);\n\n const handleClose = () => {\n const dismissData = {\n timestamp: Date.now(),\n dismissed: true,\n };\n localStorage.setItem(DISMISS_KEY, JSON.stringify(dismissData));\n\n setIsDismissed(true);\n onClose?.();\n };\n\n const handleAction = () => {\n if (banner) {\n if (banner.link) {\n window.open(\n banner.link,\n banner.openType === \"new_tab\" ? \"_blank\" : \"_self\",\n );\n }\n onAction?.(banner);\n }\n };\n\n const shouldShow = open && !isDismissed;\n const showSkeleton = shouldShow && (!dismissChecked || !sdk.initialized || sdk.loading || sdk.isInitializing);\n const showBanner = shouldShow && dismissChecked && sdk.initialized && !sdk.loading && !sdk.isInitializing && banner;\n\n // Always render skeleton during loading, but control visibility\n if (!dismissChecked || !sdk.initialized || sdk.loading || sdk.isInitializing) {\n return <TopBannerSkeleton className={className} visible={showSkeleton} />;\n }\n\n // No banner data available - render invisible container to maintain mount\n if (!banner) {\n return (\n <div \n className={className}\n style={{\n width: \"100%\",\n height: 0,\n overflow: \"hidden\",\n position: \"absolute\",\n pointerEvents: \"none\",\n }}\n aria-hidden=\"true\"\n />\n );\n }\n\n // Removed custom render function - using SDK default rendering\n\n // Default banner render with visibility control\n // When not showing, render zero-space container\n if (!showBanner) {\n return (\n <div \n className={className}\n style={{\n width: \"100%\",\n height: 0,\n overflow: \"hidden\",\n position: \"absolute\",\n pointerEvents: \"none\",\n }}\n aria-hidden=\"true\"\n />\n );\n }\n\n return (\n <div\n className={className}\n style={{\n width: \"100%\",\n minHeight: `${BANNER_MIN_HEIGHT}px`,\n }}\n >\n <Banner hideIcon onDismiss={closable ? handleClose : undefined}>\n <InlineStack gap=\"400\" blockAlign=\"center\" wrap={false}>\n {banner.icon && (\n <div style={{ flexShrink: 0 }}>\n <img\n src={banner.icon}\n alt=\"\"\n width={72}\n height={72}\n style={{ borderRadius: \"8px\" }}\n loading=\"eager\"\n />\n </div>\n )}\n <div style={{ flex: 1, minWidth: 0 }}>\n <BlockStack gap=\"100\" align=\"space-between\">\n <BlockStack gap=\"100\">\n <Text variant=\"headingSm\" as=\"h3\">\n {banner.title}\n </Text>\n {banner.description && (\n <Text variant=\"bodyMd\" tone=\"subdued\" as=\"p\">\n {banner.description}\n </Text>\n )}\n </BlockStack>\n {banner.link && (\n <div style={{ flexShrink: 0 }}>\n <Button icon={ExternalIcon} onClick={handleAction}>\n {banner.linkText || \"Learn More\"}\n </Button>\n </div>\n )}\n </BlockStack>\n </div>\n </InlineStack>\n </Banner>\n </div>\n );\n};"]}
@@ -1,14 +1,13 @@
1
1
  import React from "react";
2
2
  import { ArticleItem, ProductUpdateItem } from "../types";
3
- export interface WhatsNewProps {
3
+ import { type UseSDKOptions } from "../core/SDKManager";
4
+ export interface WhatsNewProps extends UseSDKOptions {
5
+ /** Optional CSS class */
4
6
  className?: string;
7
+ /** Handle product update clicks */
5
8
  onProductUpdateClick?: (update: ProductUpdateItem) => void;
9
+ /** Handle article clicks */
6
10
  onArticleClick?: (article: ArticleItem) => void;
7
- onViewAllUpdates?: () => void;
8
- onViewAllArticles?: () => void;
9
- maxUpdates?: number;
10
- showNavigation?: boolean;
11
- showViewAllButton?: boolean;
12
- navigate?: (url: string) => void;
13
11
  }
14
12
  export declare const WhatsNew: React.FC<WhatsNewProps>;
13
+ //# sourceMappingURL=WhatsNew.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WhatsNew.d.ts","sourceRoot":"","sources":["../../src/components/WhatsNew.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA+C,MAAM,OAAO,CAAC;AAiBpE,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAG1D,OAAO,EAAU,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAKhE,MAAM,WAAW,aAAc,SAAQ,aAAa;IAClD,yBAAyB;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,mCAAmC;IACnC,oBAAoB,CAAC,EAAE,CAAC,MAAM,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAE3D,4BAA4B;IAC5B,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,IAAI,CAAC;CACjD;AAED,eAAO,MAAM,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC,aAAa,CAojB5C,CAAC"}
@@ -7,9 +7,18 @@ import ImageLoading from "./ImageLoading";
7
7
  import { useArticles, useWhatsNew } from "../hooks";
8
8
  import { useTranslation } from "../hooks/useTranslations";
9
9
  import { sdkStyles, mergeStyles } from "./styles";
10
+ import { COMPONENT_DEFAULTS } from "../config/component-defaults";
11
+ import { useSDK } from "../core/SDKManager";
10
12
  // Fixed dimensions to prevent CLS - reduced to avoid excessive white space
11
13
  const CONTAINER_MIN_HEIGHT = 300; // Reduced from 450
12
- export const WhatsNew = ({ className = "", onProductUpdateClick, onArticleClick, onViewAllUpdates, onViewAllArticles, maxUpdates = 5, showNavigation = true, showViewAllButton = true, navigate, }) => {
14
+ export const WhatsNew = ({ className = "", onProductUpdateClick, onArticleClick,
15
+ // SDK options (optional)
16
+ shopInfo, locale, translations, config, }) => {
17
+ // Connect to SDK Manager (auto-initializes)
18
+ // @ts-ignore - Will be used in future refactoring
19
+ const _sdk = useSDK({ shopInfo, locale, translations, config });
20
+ // Use internal defaults
21
+ const { maxUpdates, showNavigation, showViewAllButton, } = COMPONENT_DEFAULTS.whatsNew;
13
22
  const [productUpdateIndex, setProductUpdateIndex] = useState(0);
14
23
  const [articleIndex, setArticleIndex] = useState(0);
15
24
  const [selectedTab, setSelectedTab] = useState(0);
@@ -121,20 +130,16 @@ export const WhatsNew = ({ className = "", onProductUpdateClick, onArticleClick,
121
130
  }
122
131
  if (tryUrl && tryUrl !== "modal") {
123
132
  if (tryUrl.startsWith("/")) {
124
- if (navigate) {
125
- navigate(tryUrl);
133
+ // Internal navigation - use SDK default behavior
134
+ const currentUrl = window.location.href;
135
+ const shopifyAdminMatch = currentUrl.match(/https:\/\/admin\.shopify\.com\/store\/([^\/]+)\/apps\/([^\/]+)/);
136
+ if (shopifyAdminMatch) {
137
+ const [, storeName, appName] = shopifyAdminMatch;
138
+ const shopifyAppUrl = `https://admin.shopify.com/store/${storeName}/apps/${appName}${tryUrl}`;
139
+ window.location.href = shopifyAppUrl;
126
140
  }
127
141
  else {
128
- const currentUrl = window.location.href;
129
- const shopifyAdminMatch = currentUrl.match(/https:\/\/admin\.shopify\.com\/store\/([^\/]+)\/apps\/([^\/]+)/);
130
- if (shopifyAdminMatch) {
131
- const [, storeName, appName] = shopifyAdminMatch;
132
- const shopifyAppUrl = `https://admin.shopify.com/store/${storeName}/apps/${appName}${tryUrl}`;
133
- window.location.href = shopifyAppUrl;
134
- }
135
- else {
136
- window.location.href = tryUrl;
137
- }
142
+ window.location.href = tryUrl;
138
143
  }
139
144
  }
140
145
  else if (tryUrl.startsWith("http://") ||
@@ -154,20 +159,12 @@ export const WhatsNew = ({ className = "", onProductUpdateClick, onArticleClick,
154
159
  onArticleClick?.(article);
155
160
  };
156
161
  const handleViewAllUpdates = () => {
157
- if (onViewAllUpdates) {
158
- onViewAllUpdates();
159
- }
160
- else {
161
- window.open("https://trust1.io/updates/", "_blank");
162
- }
162
+ // Use SDK default behavior
163
+ window.open("https://trust1.io/updates/", "_blank");
163
164
  };
164
165
  const handleViewAllArticles = () => {
165
- if (onViewAllArticles) {
166
- onViewAllArticles();
167
- }
168
- else {
169
- window.open("https://trust1.io/blog/", "_blank");
170
- }
166
+ // Use SDK default behavior
167
+ window.open("https://trust1.io/blog/", "_blank");
171
168
  };
172
169
  const tabs = [
173
170
  { id: "product-update", content: t.tabs?.productUpdate || "Product Updates" },
@@ -283,3 +280,4 @@ export const WhatsNew = ({ className = "", onProductUpdateClick, onArticleClick,
283
280
  scrollbarWidth: "none",
284
281
  }, mobileStyles.slidesContainer), className: isMobile ? "whats-new-mobile-scrollbar" : "", onTouchStart: isMobile ? handleTouchStart : undefined, onTouchMove: isMobile ? handleTouchMove : undefined, onTouchEnd: isMobile ? handleTouchEnd : undefined, children: _jsx(ArticleList, { layout: "slide", onArticleClick: handleArticleClick, showThumbnail: true, showAuthor: true, showDate: true, currentIndex: articleIndex, onSlideChange: setArticleIndex, showNavigation: false }) })) })] }) })] }));
285
282
  };
283
+ //# sourceMappingURL=WhatsNew.js.map