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

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.
@@ -1 +1 @@
1
- {"version":3,"file":"FloatingCard.d.ts","sourceRoot":"","sources":["../../src/components/FloatingCard.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAwB,MAAM,OAAO,CAAC;AAa7C,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE;QACJ,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,SAAS,GAAG,MAAM,GAAG,SAAS,GAAG,UAAU,GAAG,KAAK,CAAC;KAC3D,CAAC;IACF,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE;QACf,KAAK,EAAE,MAAM,CAAC;QACd,GAAG,EAAE,MAAM,CAAC;QACZ,QAAQ,EAAE,OAAO,CAAC;QAClB,OAAO,EAAE,SAAS,GAAG,WAAW,CAAC;KAClC,CAAC;IACF,gBAAgB,CAAC,EAAE;QACjB,KAAK,EAAE,MAAM,CAAC;QACd,GAAG,EAAE,MAAM,CAAC;QACZ,QAAQ,EAAE,OAAO,CAAC;QAClB,OAAO,EAAE,SAAS,GAAG,WAAW,CAAC;KAClC,CAAC;IACF,WAAW,EAAE,OAAO,CAAC;IACrB,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAC/B;AAED,UAAU,iBAAiB;IACzB,IAAI,EAAE,gBAAgB,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,eAAe,CAAC,EAAE,CAAC,IAAI,EAAE,gBAAgB,KAAK,IAAI,CAAC;IACnD,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE,gBAAgB,KAAK,IAAI,CAAC;IACrD,QAAQ,CAAC,EAAE,cAAc,GAAG,aAAa,GAAG,WAAW,GAAG,UAAU,CAAC;IACrE,aAAa,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IACjC,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,eAAO,MAAM,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC,iBAAiB,CA6PpD,CAAC;AAEF,eAAe,YAAY,CAAC"}
1
+ {"version":3,"file":"FloatingCard.d.ts","sourceRoot":"","sources":["../../src/components/FloatingCard.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAwB,MAAM,OAAO,CAAC;AAa7C,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE;QACJ,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,SAAS,GAAG,MAAM,GAAG,SAAS,GAAG,UAAU,GAAG,KAAK,CAAC;KAC3D,CAAC;IACF,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE;QACf,KAAK,EAAE,MAAM,CAAC;QACd,GAAG,EAAE,MAAM,CAAC;QACZ,QAAQ,EAAE,OAAO,CAAC;QAClB,OAAO,EAAE,SAAS,GAAG,WAAW,CAAC;KAClC,CAAC;IACF,gBAAgB,CAAC,EAAE;QACjB,KAAK,EAAE,MAAM,CAAC;QACd,GAAG,EAAE,MAAM,CAAC;QACZ,QAAQ,EAAE,OAAO,CAAC;QAClB,OAAO,EAAE,SAAS,GAAG,WAAW,CAAC;KAClC,CAAC;IACF,WAAW,EAAE,OAAO,CAAC;IACrB,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAC/B;AAED,UAAU,iBAAiB;IACzB,IAAI,EAAE,gBAAgB,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,eAAe,CAAC,EAAE,CAAC,IAAI,EAAE,gBAAgB,KAAK,IAAI,CAAC;IACnD,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE,gBAAgB,KAAK,IAAI,CAAC;IACrD,QAAQ,CAAC,EAAE,cAAc,GAAG,aAAa,GAAG,WAAW,GAAG,UAAU,CAAC;IACrE,aAAa,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IACjC,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,eAAO,MAAM,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC,iBAAiB,CAkQpD,CAAC;AAEF,eAAe,YAAY,CAAC"}
@@ -8,6 +8,10 @@ export const FloatingCard = ({ data, shopId: propsShopId, onDismiss, onPrimaryAc
8
8
  const sdk = useSDK({});
9
9
  const contextShopId = sdk.shopInfo?.id;
10
10
  const shopId = propsShopId || contextShopId;
11
+ // Early return if no data
12
+ if (!data) {
13
+ return null;
14
+ }
11
15
  // Use the campaign ID from data or fallback to regular id
12
16
  const campaignId = data.campaign_id || data.id;
13
17
  // Set up campaign tracking
@@ -1 +1 @@
1
- {"version":3,"file":"FloatingCard.js","sourceRoot":"","sources":["../../src/components/FloatingCard.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { CSSProperties } from \"react\";\nimport {\n Card,\n BlockStack,\n InlineStack,\n Text,\n Badge,\n Button,\n Box,\n} from \"@shopify/polaris\";\nimport { useCampaignTracking } from \"../hooks/useCampaignTracking\";\nimport { useSDK } from \"../core/SDKManager\";\n\nexport interface FloatingCardData {\n id: number;\n key: string;\n type: string;\n priority: number;\n title: string;\n description: string;\n date: string;\n tag?: {\n label: string;\n tone: \"success\" | \"info\" | \"warning\" | \"critical\" | \"new\";\n };\n img_url: string;\n image_alt?: string | null;\n image_type: string;\n primary_action?: {\n label: string;\n url: string;\n external: boolean;\n variant: \"primary\" | \"secondary\";\n };\n secondary_action?: {\n label: string;\n url: string;\n external: boolean;\n variant: \"primary\" | \"secondary\";\n };\n dismissible: boolean;\n auto_close_after?: number | null;\n reappear_interval?: number | null;\n display_pages?: string[];\n campaign_id?: string | number; // Added for tracking purposes\n}\n\ninterface FloatingCardProps {\n data: FloatingCardData;\n shopId?: string; // Required for tracking\n onDismiss?: () => void;\n onPrimaryAction?: (data: FloatingCardData) => void;\n onSecondaryAction?: (data: FloatingCardData) => void;\n position?: 'bottom-right' | 'bottom-left' | 'top-right' | 'top-left';\n animationType?: 'slide' | 'fade';\n showCloseButton?: boolean;\n}\n\nexport const FloatingCard: React.FC<FloatingCardProps> = ({\n data,\n shopId: propsShopId,\n onDismiss,\n onPrimaryAction,\n onSecondaryAction,\n position = 'bottom-right',\n showCloseButton = true,\n}) => {\n // Get shopId from SDK shopInfo if not provided via props\n const sdk = useSDK({});\n const contextShopId = sdk.shopInfo?.id;\n const shopId = propsShopId || contextShopId;\n \n // Use the campaign ID from data or fallback to regular id\n const campaignId = data.campaign_id || data.id;\n \n // Set up campaign tracking\n const tracking = shopId && campaignId ? useCampaignTracking({\n shopId,\n campaignId,\n threshold: 0.5, // Track when 50% visible\n visibilityDuration: 1000, // Track view after 1 second\n metadata: {\n card_type: data.type,\n card_key: data.key,\n },\n }) : null;\n const handlePrimaryAction = () => {\n // Track the click\n tracking?.trackPrimaryAction();\n \n if (data.primary_action) {\n const url = data.primary_action.url;\n \n // Check if it's an external URL\n if (data.primary_action.external) {\n window.open(url, \"_blank\");\n } \n // Check if it's a modal trigger\n else if (url === \"modal\" || url === \"/pricing\") {\n // Pass the full card data to the handler for modal handling\n onPrimaryAction?.(data);\n }\n // Check if it's an internal route\n else if (url?.startsWith(\"/\")) {\n // Pass the full card data for internal navigation\n onPrimaryAction?.(data);\n }\n // Default: just call the handler\n else {\n onPrimaryAction?.(data);\n }\n }\n };\n\n const handleSecondaryAction = () => {\n // Track the click\n tracking?.trackSecondaryAction();\n \n if (data.secondary_action) {\n const url = data.secondary_action.url;\n \n if (data.secondary_action.external) {\n window.open(url, \"_blank\");\n } else if (url?.startsWith(\"/\") || url === \"modal\") {\n // Pass the full card data for internal handling\n onSecondaryAction?.(data);\n } else {\n onSecondaryAction?.(data);\n }\n }\n };\n \n const handleDismiss = () => {\n // Track the dismiss\n tracking?.trackDismiss();\n onDismiss?.();\n };\n\n // CSS-in-JS styles - no external CSS file needed\n const floatingCardStyles: CSSProperties = {\n position: 'fixed',\n zIndex: 9999,\n width: '300px',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'flex-start',\n borderRadius: '8px',\n boxShadow: '0 4px 26px 0 rgba(0, 0, 0, 0.10)',\n overflow: 'hidden',\n animation: 'slideInUp 0.3s ease-out',\n ...(position === 'bottom-right' && { bottom: '20px', right: '20px' }),\n ...(position === 'bottom-left' && { bottom: '20px', left: '20px' }),\n ...(position === 'top-right' && { top: '20px', right: '20px' }),\n ...(position === 'top-left' && { top: '20px', left: '20px' }),\n };\n\n const closeButtonStyles: CSSProperties = {\n display: 'flex',\n padding: '4px 2px',\n justifyContent: 'center',\n alignItems: 'center',\n gap: '2px',\n position: 'absolute',\n right: '7px',\n top: '7px',\n borderRadius: '8px',\n background: 'rgba(255, 255, 255, 0.10)',\n border: 'none',\n cursor: 'pointer',\n transition: 'background 0.2s ease',\n zIndex: 10,\n backdropFilter: 'blur(10px)',\n WebkitBackdropFilter: 'blur(10px)',\n };\n\n const imageContainerStyles: CSSProperties = {\n position: 'relative',\n height: '168.75px',\n aspectRatio: '16/9',\n width: '100%',\n overflow: 'hidden',\n borderRadius: '8px 8px 0 0',\n backgroundColor: '#f5f5f5',\n };\n\n // Add keyframe animation dynamically\n React.useEffect(() => {\n // Check if animation already exists\n const styleId = 'floating-card-animations';\n if (!document.getElementById(styleId)) {\n const style = document.createElement('style');\n style.id = styleId;\n style.innerHTML = `\n @keyframes slideInUp {\n from {\n transform: translateY(100%);\n opacity: 0;\n }\n to {\n transform: translateY(0);\n opacity: 1;\n }\n }\n @keyframes fadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n }\n `;\n document.head.appendChild(style);\n }\n }, []);\n\n return (\n <div ref={tracking?.elementRef} style={floatingCardStyles}>\n <Card padding=\"0\" roundedAbove=\"sm\">\n {(showCloseButton && data.dismissible !== false) && (\n <button\n style={closeButtonStyles}\n onClick={handleDismiss}\n aria-label=\"Close\"\n >\n <div style={{\n width: \"20px\",\n height: \"20ox\"\n }}>\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"8\" height=\"8\" viewBox=\"0 0 8 8\" fill=\"none\">\n <path d=\"M6.71967 7.78033C7.01256 8.07322 7.48744 8.07322 7.78033 7.78033C8.07322 7.48744 8.07322 7.01256 7.78033 6.71967L5.06066 4L7.78033 1.28033C8.07322 0.987437 8.07322 0.512563 7.78033 0.21967C7.48744 -0.073223 7.01256 -0.073223 6.71967 0.21967L4 2.93934L1.28033 0.21967C0.987437 -0.0732233 0.512564 -0.0732233 0.21967 0.21967C-0.0732225 0.512563 -0.0732226 0.987437 0.21967 1.28033L2.93934 4L0.21967 6.71967C-0.0732233 7.01256 -0.0732233 7.48744 0.21967 7.78033C0.512563 8.07322 0.987437 8.07322 1.28033 7.78033L4 5.06066L6.71967 7.78033Z\" fill=\"white\" fillOpacity=\"0.6\"/>\n </svg>\n </div>\n </button>\n )}\n\n <BlockStack gap=\"0\">\n {data.img_url && (\n <div style={imageContainerStyles}>\n <img\n src={data.img_url}\n alt={data.image_alt || data.title}\n style={{\n width: \"100%\",\n height: \"100%\",\n objectFit: \"cover\",\n }}\n onError={(e) => {\n console.error(\"Image failed to load:\", data.img_url);\n (e.target as HTMLImageElement).style.display = \"none\";\n }}\n />\n </div>\n )}\n\n <Box padding=\"400\">\n <BlockStack gap=\"500\">\n <BlockStack gap=\"300\">\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"6px\",\n }}\n >\n <div style={{\n display: \"flex\",\n flexDirection: \"row\",\n gap: \"6px\",\n alignItems: \"start\"\n }}>\n <Text as=\"h2\" variant=\"bodyLg\" fontWeight=\"semibold\">\n {data.title}\n </Text>\n {data.tag && (\n <Badge tone={data.tag.tone || \"success\"}>\n {data.tag.label}\n </Badge>\n )}\n </div>\n\n <Text as=\"p\" variant=\"bodySm\">\n {data.date}\n </Text>\n </div>\n\n <Text as=\"p\" variant=\"bodyMd\">\n {data.description}\n </Text>\n </BlockStack>\n <InlineStack gap=\"200\">\n {data.primary_action && (\n <Button\n variant={\n data.primary_action.variant === \"primary\"\n ? \"primary\"\n : \"plain\"\n }\n onClick={handlePrimaryAction}\n >\n {data.primary_action.label}\n </Button>\n )}\n {data.secondary_action && (\n <Button variant=\"tertiary\" onClick={handleSecondaryAction}>\n {data.secondary_action.label}\n </Button>\n )}\n </InlineStack>\n </BlockStack>\n </Box>\n </BlockStack>\n </Card>\n </div>\n );\n};\n\nexport default FloatingCard;\n"]}
1
+ {"version":3,"file":"FloatingCard.js","sourceRoot":"","sources":["../../src/components/FloatingCard.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { CSSProperties } from \"react\";\nimport {\n Card,\n BlockStack,\n InlineStack,\n Text,\n Badge,\n Button,\n Box,\n} from \"@shopify/polaris\";\nimport { useCampaignTracking } from \"../hooks/useCampaignTracking\";\nimport { useSDK } from \"../core/SDKManager\";\n\nexport interface FloatingCardData {\n id: number;\n key: string;\n type: string;\n priority: number;\n title: string;\n description: string;\n date: string;\n tag?: {\n label: string;\n tone: \"success\" | \"info\" | \"warning\" | \"critical\" | \"new\";\n };\n img_url: string;\n image_alt?: string | null;\n image_type: string;\n primary_action?: {\n label: string;\n url: string;\n external: boolean;\n variant: \"primary\" | \"secondary\";\n };\n secondary_action?: {\n label: string;\n url: string;\n external: boolean;\n variant: \"primary\" | \"secondary\";\n };\n dismissible: boolean;\n auto_close_after?: number | null;\n reappear_interval?: number | null;\n display_pages?: string[];\n campaign_id?: string | number; // Added for tracking purposes\n}\n\ninterface FloatingCardProps {\n data: FloatingCardData;\n shopId?: string; // Required for tracking\n onDismiss?: () => void;\n onPrimaryAction?: (data: FloatingCardData) => void;\n onSecondaryAction?: (data: FloatingCardData) => void;\n position?: 'bottom-right' | 'bottom-left' | 'top-right' | 'top-left';\n animationType?: 'slide' | 'fade';\n showCloseButton?: boolean;\n}\n\nexport const FloatingCard: React.FC<FloatingCardProps> = ({\n data,\n shopId: propsShopId,\n onDismiss,\n onPrimaryAction,\n onSecondaryAction,\n position = 'bottom-right',\n showCloseButton = true,\n}) => {\n // Get shopId from SDK shopInfo if not provided via props\n const sdk = useSDK({});\n const contextShopId = sdk.shopInfo?.id;\n const shopId = propsShopId || contextShopId;\n \n // Early return if no data\n if (!data) {\n return null;\n }\n \n // Use the campaign ID from data or fallback to regular id\n const campaignId = data.campaign_id || data.id;\n \n // Set up campaign tracking\n const tracking = shopId && campaignId ? useCampaignTracking({\n shopId,\n campaignId,\n threshold: 0.5, // Track when 50% visible\n visibilityDuration: 1000, // Track view after 1 second\n metadata: {\n card_type: data.type,\n card_key: data.key,\n },\n }) : null;\n const handlePrimaryAction = () => {\n // Track the click\n tracking?.trackPrimaryAction();\n \n if (data.primary_action) {\n const url = data.primary_action.url;\n \n // Check if it's an external URL\n if (data.primary_action.external) {\n window.open(url, \"_blank\");\n } \n // Check if it's a modal trigger\n else if (url === \"modal\" || url === \"/pricing\") {\n // Pass the full card data to the handler for modal handling\n onPrimaryAction?.(data);\n }\n // Check if it's an internal route\n else if (url?.startsWith(\"/\")) {\n // Pass the full card data for internal navigation\n onPrimaryAction?.(data);\n }\n // Default: just call the handler\n else {\n onPrimaryAction?.(data);\n }\n }\n };\n\n const handleSecondaryAction = () => {\n // Track the click\n tracking?.trackSecondaryAction();\n \n if (data.secondary_action) {\n const url = data.secondary_action.url;\n \n if (data.secondary_action.external) {\n window.open(url, \"_blank\");\n } else if (url?.startsWith(\"/\") || url === \"modal\") {\n // Pass the full card data for internal handling\n onSecondaryAction?.(data);\n } else {\n onSecondaryAction?.(data);\n }\n }\n };\n \n const handleDismiss = () => {\n // Track the dismiss\n tracking?.trackDismiss();\n onDismiss?.();\n };\n\n // CSS-in-JS styles - no external CSS file needed\n const floatingCardStyles: CSSProperties = {\n position: 'fixed',\n zIndex: 9999,\n width: '300px',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'flex-start',\n borderRadius: '8px',\n boxShadow: '0 4px 26px 0 rgba(0, 0, 0, 0.10)',\n overflow: 'hidden',\n animation: 'slideInUp 0.3s ease-out',\n ...(position === 'bottom-right' && { bottom: '20px', right: '20px' }),\n ...(position === 'bottom-left' && { bottom: '20px', left: '20px' }),\n ...(position === 'top-right' && { top: '20px', right: '20px' }),\n ...(position === 'top-left' && { top: '20px', left: '20px' }),\n };\n\n const closeButtonStyles: CSSProperties = {\n display: 'flex',\n padding: '4px 2px',\n justifyContent: 'center',\n alignItems: 'center',\n gap: '2px',\n position: 'absolute',\n right: '7px',\n top: '7px',\n borderRadius: '8px',\n background: 'rgba(255, 255, 255, 0.10)',\n border: 'none',\n cursor: 'pointer',\n transition: 'background 0.2s ease',\n zIndex: 10,\n backdropFilter: 'blur(10px)',\n WebkitBackdropFilter: 'blur(10px)',\n };\n\n const imageContainerStyles: CSSProperties = {\n position: 'relative',\n height: '168.75px',\n aspectRatio: '16/9',\n width: '100%',\n overflow: 'hidden',\n borderRadius: '8px 8px 0 0',\n backgroundColor: '#f5f5f5',\n };\n\n // Add keyframe animation dynamically\n React.useEffect(() => {\n // Check if animation already exists\n const styleId = 'floating-card-animations';\n if (!document.getElementById(styleId)) {\n const style = document.createElement('style');\n style.id = styleId;\n style.innerHTML = `\n @keyframes slideInUp {\n from {\n transform: translateY(100%);\n opacity: 0;\n }\n to {\n transform: translateY(0);\n opacity: 1;\n }\n }\n @keyframes fadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n }\n `;\n document.head.appendChild(style);\n }\n }, []);\n\n return (\n <div ref={tracking?.elementRef} style={floatingCardStyles}>\n <Card padding=\"0\" roundedAbove=\"sm\">\n {(showCloseButton && data.dismissible !== false) && (\n <button\n style={closeButtonStyles}\n onClick={handleDismiss}\n aria-label=\"Close\"\n >\n <div style={{\n width: \"20px\",\n height: \"20ox\"\n }}>\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"8\" height=\"8\" viewBox=\"0 0 8 8\" fill=\"none\">\n <path d=\"M6.71967 7.78033C7.01256 8.07322 7.48744 8.07322 7.78033 7.78033C8.07322 7.48744 8.07322 7.01256 7.78033 6.71967L5.06066 4L7.78033 1.28033C8.07322 0.987437 8.07322 0.512563 7.78033 0.21967C7.48744 -0.073223 7.01256 -0.073223 6.71967 0.21967L4 2.93934L1.28033 0.21967C0.987437 -0.0732233 0.512564 -0.0732233 0.21967 0.21967C-0.0732225 0.512563 -0.0732226 0.987437 0.21967 1.28033L2.93934 4L0.21967 6.71967C-0.0732233 7.01256 -0.0732233 7.48744 0.21967 7.78033C0.512563 8.07322 0.987437 8.07322 1.28033 7.78033L4 5.06066L6.71967 7.78033Z\" fill=\"white\" fillOpacity=\"0.6\"/>\n </svg>\n </div>\n </button>\n )}\n\n <BlockStack gap=\"0\">\n {data.img_url && (\n <div style={imageContainerStyles}>\n <img\n src={data.img_url}\n alt={data.image_alt || data.title}\n style={{\n width: \"100%\",\n height: \"100%\",\n objectFit: \"cover\",\n }}\n onError={(e) => {\n console.error(\"Image failed to load:\", data.img_url);\n (e.target as HTMLImageElement).style.display = \"none\";\n }}\n />\n </div>\n )}\n\n <Box padding=\"400\">\n <BlockStack gap=\"500\">\n <BlockStack gap=\"300\">\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"6px\",\n }}\n >\n <div style={{\n display: \"flex\",\n flexDirection: \"row\",\n gap: \"6px\",\n alignItems: \"start\"\n }}>\n <Text as=\"h2\" variant=\"bodyLg\" fontWeight=\"semibold\">\n {data.title}\n </Text>\n {data.tag && (\n <Badge tone={data.tag.tone || \"success\"}>\n {data.tag.label}\n </Badge>\n )}\n </div>\n\n <Text as=\"p\" variant=\"bodySm\">\n {data.date}\n </Text>\n </div>\n\n <Text as=\"p\" variant=\"bodyMd\">\n {data.description}\n </Text>\n </BlockStack>\n <InlineStack gap=\"200\">\n {data.primary_action && (\n <Button\n variant={\n data.primary_action.variant === \"primary\"\n ? \"primary\"\n : \"plain\"\n }\n onClick={handlePrimaryAction}\n >\n {data.primary_action.label}\n </Button>\n )}\n {data.secondary_action && (\n <Button variant=\"tertiary\" onClick={handleSecondaryAction}>\n {data.secondary_action.label}\n </Button>\n )}\n </InlineStack>\n </BlockStack>\n </Box>\n </BlockStack>\n </Card>\n </div>\n );\n};\n\nexport default FloatingCard;\n"]}
@@ -0,0 +1,21 @@
1
+ import React from "react";
2
+ import { type UseSDKOptions } from "../core/SDKManager";
3
+ export interface FloatingCardContainerProps extends UseSDKOptions {
4
+ /** Current route for page-specific display */
5
+ currentRoute?: string;
6
+ /** Position of the cards */
7
+ position?: "bottom-right" | "bottom-left" | "top-right" | "top-left";
8
+ /** Callback when card is dismissed */
9
+ onDismiss?: (cardId: number) => void;
10
+ /** Callback for primary action */
11
+ onPrimaryAction?: (card: any) => void;
12
+ /** Callback for secondary action */
13
+ onSecondaryAction?: (card: any) => void;
14
+ }
15
+ /**
16
+ * Container component that automatically fetches and displays floating cards
17
+ * This is what the in-app team should use when they don't have specific card data
18
+ */
19
+ export declare const FloatingCardContainer: React.FC<FloatingCardContainerProps>;
20
+ export default FloatingCardContainer;
21
+ //# sourceMappingURL=FloatingCardContainer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FloatingCardContainer.d.ts","sourceRoot":"","sources":["../../src/components/FloatingCardContainer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,EAAU,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEhE,MAAM,WAAW,0BAA2B,SAAQ,aAAa;IAC/D,8CAA8C;IAC9C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,4BAA4B;IAC5B,QAAQ,CAAC,EAAE,cAAc,GAAG,aAAa,GAAG,WAAW,GAAG,UAAU,CAAC;IACrE,sCAAsC;IACtC,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,kCAAkC;IAClC,eAAe,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,CAAC;IACtC,oCAAoC;IACpC,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,CAAC;CACzC;AAED;;;GAGG;AACH,eAAO,MAAM,qBAAqB,EAAE,KAAK,CAAC,EAAE,CAAC,0BAA0B,CAiDtE,CAAC;AAGF,eAAe,qBAAqB,CAAC"}
@@ -0,0 +1,38 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { FloatingCard } from "./FloatingCard";
3
+ import { useVisibleFloatingCards } from "../hooks/useFloatingCards";
4
+ import { useSDK } from "../core/SDKManager";
5
+ /**
6
+ * Container component that automatically fetches and displays floating cards
7
+ * This is what the in-app team should use when they don't have specific card data
8
+ */
9
+ export const FloatingCardContainer = ({ currentRoute = "/", position = "bottom-right", onDismiss, onPrimaryAction, onSecondaryAction,
10
+ // SDK options
11
+ shopInfo, locale, translations, config, }) => {
12
+ // Initialize SDK
13
+ const sdk = useSDK({ shopInfo, locale, translations, config });
14
+ // Get visible floating cards from campaigns
15
+ const { visibleCards, dismissCard } = useVisibleFloatingCards({
16
+ currentRoute,
17
+ shopInfo,
18
+ locale,
19
+ translations,
20
+ config,
21
+ });
22
+ // Handle card dismissal
23
+ const handleDismiss = (cardId) => {
24
+ dismissCard(cardId);
25
+ onDismiss?.(cardId);
26
+ };
27
+ // If no cards, return null
28
+ if (!visibleCards || visibleCards.length === 0) {
29
+ return null;
30
+ }
31
+ // For now, show only the first card (highest priority)
32
+ // In future, you might want to stack multiple cards
33
+ const card = visibleCards[0];
34
+ return (_jsx(FloatingCard, { data: card, shopId: sdk.shopInfo?.id, position: position, onDismiss: () => handleDismiss(card.id), onPrimaryAction: onPrimaryAction, onSecondaryAction: onSecondaryAction }));
35
+ };
36
+ // Default export for backward compatibility
37
+ export default FloatingCardContainer;
38
+ //# sourceMappingURL=FloatingCardContainer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FloatingCardContainer.js","sourceRoot":"","sources":["../../src/components/FloatingCardContainer.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,EAAE,MAAM,EAAsB,MAAM,oBAAoB,CAAC;AAehE;;;GAGG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAyC,CAAC,EAC1E,YAAY,GAAG,GAAG,EAClB,QAAQ,GAAG,cAAc,EACzB,SAAS,EACT,eAAe,EACf,iBAAiB;AACjB,cAAc;AACd,QAAQ,EACR,MAAM,EACN,YAAY,EACZ,MAAM,GACP,EAAE,EAAE;IACH,iBAAiB;IACjB,MAAM,GAAG,GAAG,MAAM,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC,CAAC;IAE/D,4CAA4C;IAC5C,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,GAAG,uBAAuB,CAAC;QAC5D,YAAY;QACZ,QAAQ;QACR,MAAM;QACN,YAAY;QACZ,MAAM;KACP,CAAC,CAAC;IAEH,wBAAwB;IACxB,MAAM,aAAa,GAAG,CAAC,MAAc,EAAE,EAAE;QACvC,WAAW,CAAC,MAAM,CAAC,CAAC;QACpB,SAAS,EAAE,CAAC,MAAM,CAAC,CAAC;IACtB,CAAC,CAAC;IAEF,2BAA2B;IAC3B,IAAI,CAAC,YAAY,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,uDAAuD;IACvD,oDAAoD;IACpD,MAAM,IAAI,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;IAE7B,OAAO,CACL,KAAC,YAAY,IACX,IAAI,EAAE,IAAI,EACV,MAAM,EAAE,GAAG,CAAC,QAAQ,EAAE,EAAE,EACxB,QAAQ,EAAE,QAAQ,EAClB,SAAS,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,EACvC,eAAe,EAAE,eAAe,EAChC,iBAAiB,EAAE,iBAAiB,GACpC,CACH,CAAC;AACJ,CAAC,CAAC;AAEF,4CAA4C;AAC5C,eAAe,qBAAqB,CAAC","sourcesContent":["import React from \"react\";\nimport { FloatingCard } from \"./FloatingCard\";\nimport { useVisibleFloatingCards } from \"../hooks/useFloatingCards\";\nimport { useSDK, type UseSDKOptions } from \"../core/SDKManager\";\n\nexport interface FloatingCardContainerProps extends UseSDKOptions {\n /** Current route for page-specific display */\n currentRoute?: string;\n /** Position of the cards */\n position?: \"bottom-right\" | \"bottom-left\" | \"top-right\" | \"top-left\";\n /** Callback when card is dismissed */\n onDismiss?: (cardId: number) => void;\n /** Callback for primary action */\n onPrimaryAction?: (card: any) => void;\n /** Callback for secondary action */\n onSecondaryAction?: (card: any) => void;\n}\n\n/**\n * Container component that automatically fetches and displays floating cards\n * This is what the in-app team should use when they don't have specific card data\n */\nexport const FloatingCardContainer: React.FC<FloatingCardContainerProps> = ({\n currentRoute = \"/\",\n position = \"bottom-right\",\n onDismiss,\n onPrimaryAction,\n onSecondaryAction,\n // SDK options\n shopInfo,\n locale,\n translations,\n config,\n}) => {\n // Initialize SDK\n const sdk = useSDK({ shopInfo, locale, translations, config });\n\n // Get visible floating cards from campaigns\n const { visibleCards, dismissCard } = useVisibleFloatingCards({\n currentRoute,\n shopInfo,\n locale,\n translations,\n config,\n });\n\n // Handle card dismissal\n const handleDismiss = (cardId: number) => {\n dismissCard(cardId);\n onDismiss?.(cardId);\n };\n\n // If no cards, return null\n if (!visibleCards || visibleCards.length === 0) {\n return null;\n }\n\n // For now, show only the first card (highest priority)\n // In future, you might want to stack multiple cards\n const card = visibleCards[0];\n\n return (\n <FloatingCard\n data={card}\n shopId={sdk.shopInfo?.id}\n position={position}\n onDismiss={() => handleDismiss(card.id)}\n onPrimaryAction={onPrimaryAction}\n onSecondaryAction={onSecondaryAction}\n />\n );\n};\n\n// Default export for backward compatibility\nexport default FloatingCardContainer;\n"]}
@@ -15,6 +15,8 @@ export type IntegrationStatusProvider = (integration: IntegrationItem) => Integr
15
15
  export interface PartnerIntegrationProps extends UseSDKOptions {
16
16
  /** Optional CSS class */
17
17
  className?: string;
18
+ /** Status provider for custom integration statuses */
19
+ statusProvider?: IntegrationStatusProvider;
18
20
  /** Handle manage action */
19
21
  onManage?: (item: IntegrationItem) => void;
20
22
  /** Handle install action */
@@ -23,6 +25,8 @@ export interface PartnerIntegrationProps extends UseSDKOptions {
23
25
  onOpen?: (item: IntegrationItem) => void;
24
26
  /** Handle upgrade click */
25
27
  onUpgradeClick?: (item: IntegrationItem) => void;
28
+ /** Show empty state when no integrations available */
29
+ showEmptyState?: boolean;
26
30
  }
27
31
  export declare const PartnerIntegration: React.FC<PartnerIntegrationProps>;
28
32
  export default PartnerIntegration;
@@ -1 +1 @@
1
- {"version":3,"file":"PartnerIntegration.d.ts","sourceRoot":"","sources":["../../src/components/PartnerIntegration.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAe1B,OAAO,EAAU,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAGvD,MAAM,MAAM,qBAAqB,GAAG;IAClC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,gBAAgB,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACnC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,gBAAgB,CAAC,EAAE,OAAO,GAAG,KAAK,CAAC;CACpC,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG,CACtC,WAAW,EAAE,eAAe,KACzB,qBAAqB,GAAG,SAAS,CAAC;AAEvC,MAAM,WAAW,uBAAwB,SAAQ,aAAa;IAC5D,yBAAyB;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,2BAA2B;IAC3B,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,eAAe,KAAK,IAAI,CAAC;IAE3C,4BAA4B;IAC5B,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,eAAe,KAAK,IAAI,CAAC;IAE5C,yBAAyB;IACzB,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,eAAe,KAAK,IAAI,CAAC;IAEzC,2BAA2B;IAC3B,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,eAAe,KAAK,IAAI,CAAC;CAClD;AAED,eAAO,MAAM,kBAAkB,EAAE,KAAK,CAAC,EAAE,CAAC,uBAAuB,CAgNhE,CAAC;AAEF,eAAe,kBAAkB,CAAC"}
1
+ {"version":3,"file":"PartnerIntegration.d.ts","sourceRoot":"","sources":["../../src/components/PartnerIntegration.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAe1B,OAAO,EAAU,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD,MAAM,MAAM,qBAAqB,GAAG;IAClC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,gBAAgB,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACnC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,gBAAgB,CAAC,EAAE,OAAO,GAAG,KAAK,CAAC;CACpC,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG,CACtC,WAAW,EAAE,eAAe,KACzB,qBAAqB,GAAG,SAAS,CAAC;AAEvC,MAAM,WAAW,uBAAwB,SAAQ,aAAa;IAC5D,yBAAyB;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,sDAAsD;IACtD,cAAc,CAAC,EAAE,yBAAyB,CAAC;IAE3C,2BAA2B;IAC3B,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,eAAe,KAAK,IAAI,CAAC;IAE3C,4BAA4B;IAC5B,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,eAAe,KAAK,IAAI,CAAC;IAE5C,yBAAyB;IACzB,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,eAAe,KAAK,IAAI,CAAC;IAEzC,2BAA2B;IAC3B,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,eAAe,KAAK,IAAI,CAAC;IAEjD,sDAAsD;IACtD,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,eAAO,MAAM,kBAAkB,EAAE,KAAK,CAAC,EAAE,CAAC,uBAAuB,CA+ShE,CAAC;AAEF,eAAe,kBAAkB,CAAC"}
@@ -1,14 +1,11 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } 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
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
6
+ export const PartnerIntegration = ({ className = "", statusProvider, onManage, onInstall, onOpen, onUpgradeClick, showEmptyState = true,
8
7
  // SDK options (optional)
9
8
  shopInfo, locale, translations: translationOverrides, config, }) => {
10
- // Use internal defaults
11
- const { showEmptyState } = COMPONENT_DEFAULTS.partnerIntegration;
12
9
  const { groups, loading, error } = usePartnerIntegrations();
13
10
  const sdk = useSDK({ shopInfo, locale, translations: translationOverrides, config });
14
11
  const translations = sdk.translations;
@@ -35,8 +32,42 @@ shopInfo, locale, translations: translationOverrides, config, }) => {
35
32
  onInstall?.(item);
36
33
  };
37
34
  const renderIntegrationCard = (item) => {
38
- // SDK now handles status internally
35
+ // Get status from provider if available
36
+ const status = statusProvider?.(item);
39
37
  const getBadgeInfo = () => {
38
+ // Check status provider first
39
+ if (status) {
40
+ if (status.isConnected === true) {
41
+ return {
42
+ text: translations.partnerIntegration?.active || "Active",
43
+ tone: "success",
44
+ };
45
+ }
46
+ if (status.isConnected === false) {
47
+ return {
48
+ text: translations.partnerIntegration?.inactive || "Inactive",
49
+ tone: undefined,
50
+ };
51
+ }
52
+ if (status.isActive === true) {
53
+ return {
54
+ text: translations.partnerIntegration?.active || "Active",
55
+ tone: "success",
56
+ };
57
+ }
58
+ if (status.isPending) {
59
+ return {
60
+ text: "Pending",
61
+ tone: "warning",
62
+ };
63
+ }
64
+ if (status.isActive === false) {
65
+ return {
66
+ text: translations.partnerIntegration?.inactive || "Inactive",
67
+ tone: undefined,
68
+ };
69
+ }
70
+ }
40
71
  // Fall back to button-based logic only if no status provider
41
72
  if (item.button_manage_text && item.button_install_text) {
42
73
  return {
@@ -57,7 +88,27 @@ shopInfo, locale, translations: translationOverrides, config, }) => {
57
88
  width: "40px",
58
89
  height: "40px",
59
90
  borderRadius: "8px",
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}`));
91
+ } })), _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: {
92
+ cursor: "pointer",
93
+ display: "inline-flex",
94
+ alignItems: "center",
95
+ padding: "4px 6px",
96
+ gap: "4px",
97
+ borderRadius: "var(--p-border-radius-150)",
98
+ backgroundColor: status.upgradeBadgePlan === "pro"
99
+ ? "#F0F2FF"
100
+ : "#FFF1E3",
101
+ color: status.upgradeBadgePlan === "pro"
102
+ ? "#7126FF"
103
+ : "#4F4700",
104
+ fontSize: "12px",
105
+ fontWeight: 500,
106
+ }, title: status.upgradeBadgeTooltip, children: [status.upgradeBadgeIcon && (_jsx("span", { style: {
107
+ display: "inline-flex",
108
+ alignItems: "center",
109
+ }, children: status.upgradeBadgeIcon })), _jsx("span", { style: {
110
+ fontSize: "13px",
111
+ }, children: status.upgradeBadgeText || "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" || item.key === "aftership" ? (status.showUpgradeBadge === true) : false, children: item.button_manage_text }))] })) : (_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), children: item.button_manage_text }))] })) })] }) })] }) }) }, `integration--${item.id || item.key}`));
61
112
  };
62
113
  // Loading state
63
114
  if (loading) {
@@ -1 +1 @@
1
- {"version":3,"file":"PartnerIntegration.js","sourceRoot":"","sources":["../../src/components/PartnerIntegration.tsx"],"names":[],"mappings":"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","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"]}
1
+ {"version":3,"file":"PartnerIntegration.js","sourceRoot":"","sources":["../../src/components/PartnerIntegration.tsx"],"names":[],"mappings":"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","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\";\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 /** Status provider for custom integration statuses */\n statusProvider?: IntegrationStatusProvider;\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 /** Show empty state when no integrations available */\n showEmptyState?: boolean;\n}\n\nexport const PartnerIntegration: React.FC<PartnerIntegrationProps> = ({\n className = \"\",\n statusProvider,\n onManage,\n onInstall,\n onOpen,\n onUpgradeClick,\n showEmptyState = true,\n // SDK options (optional)\n shopInfo,\n locale,\n translations: translationOverrides,\n config,\n}) => {\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 // Get status from provider if available\n const status = statusProvider?.(item);\n\n const getBadgeInfo = () => {\n // Check status provider first\n if (status) {\n if (status.isConnected === true) {\n return {\n text: translations.partnerIntegration?.active || \"Active\",\n tone: \"success\" as const,\n };\n }\n if (status.isConnected === false) {\n return {\n text: translations.partnerIntegration?.inactive || \"Inactive\",\n tone: undefined,\n };\n }\n if (status.isActive === true) {\n return {\n text: translations.partnerIntegration?.active || \"Active\",\n tone: \"success\" as const,\n };\n }\n if (status.isPending) {\n return {\n text: \"Pending\",\n tone: \"warning\" as const,\n };\n }\n if (status.isActive === false) {\n return {\n text: translations.partnerIntegration?.inactive || \"Inactive\",\n tone: undefined,\n };\n }\n }\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 - controlled by status provider */}\n {status?.showUpgradeBadge && (\n <div\n onClick={() => onUpgradeClick?.(item)}\n style={{\n cursor: \"pointer\",\n display: \"inline-flex\",\n alignItems: \"center\",\n padding: \"4px 6px\",\n gap: \"4px\",\n borderRadius: \"var(--p-border-radius-150)\",\n backgroundColor:\n status.upgradeBadgePlan === \"pro\"\n ? \"#F0F2FF\"\n : \"#FFF1E3\",\n color:\n status.upgradeBadgePlan === \"pro\"\n ? \"#7126FF\"\n : \"#4F4700\",\n fontSize: \"12px\",\n fontWeight: 500,\n }}\n title={status.upgradeBadgeTooltip}\n >\n {status.upgradeBadgeIcon && (\n <span\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n }}\n >\n {status.upgradeBadgeIcon}\n </span>\n )}\n <span style={{\n fontSize: \"13px\",\n }}>{status.upgradeBadgeText || \"Upgrade\"}</span>\n </div>\n )}\n </InlineStack>\n {item.content && (\n <Text as=\"p\" variant=\"bodyMd\">\n {item.content}\n </Text>\n )}\n </BlockStack>\n <InlineStack gap=\"200\">\n {status ? (\n <>\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 disabled={item.key === \"after_ship\" || item.key === \"aftership\" ? (status.showUpgradeBadge === true) : false}\n >\n {item.button_manage_text}\n </Button>\n )}\n </>\n ) : (\n <>\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 </>\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"]}
@@ -4,6 +4,8 @@ import { type UseSDKOptions } from "../core/SDKManager";
4
4
  export interface WhatsNewProps extends UseSDKOptions {
5
5
  /** Optional CSS class */
6
6
  className?: string;
7
+ /** Navigation function for internal routing */
8
+ navigate?: (path: string) => void;
7
9
  /** Handle product update clicks */
8
10
  onProductUpdateClick?: (update: ProductUpdateItem) => void;
9
11
  /** Handle article clicks */
@@ -1 +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"}
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,+CAA+C;IAC/C,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAElC,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,CA8iB5C,CAAC"}
@@ -11,7 +11,7 @@ import { COMPONENT_DEFAULTS } from "../config/component-defaults";
11
11
  import { useSDK } from "../core/SDKManager";
12
12
  // Fixed dimensions to prevent CLS - reduced to avoid excessive white space
13
13
  const CONTAINER_MIN_HEIGHT = 300; // Reduced from 450
14
- export const WhatsNew = ({ className = "", onProductUpdateClick, onArticleClick,
14
+ export const WhatsNew = ({ className = "", navigate, onProductUpdateClick, onArticleClick,
15
15
  // SDK options (optional)
16
16
  shopInfo, locale, translations, config, }) => {
17
17
  // Connect to SDK Manager (auto-initializes)
@@ -130,27 +130,24 @@ shopInfo, locale, translations, config, }) => {
130
130
  }
131
131
  if (tryUrl && tryUrl !== "modal") {
132
132
  if (tryUrl.startsWith("/")) {
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;
140
- }
141
- else {
142
- window.location.href = tryUrl;
133
+ if (navigate) {
134
+ navigate(tryUrl);
143
135
  }
136
+ onProductUpdateClick?.(update);
137
+ return;
144
138
  }
145
139
  else if (tryUrl.startsWith("http://") ||
146
140
  tryUrl.startsWith("https://")) {
147
141
  window.open(tryUrl, "_blank");
142
+ onProductUpdateClick?.(update);
148
143
  }
149
144
  }
150
145
  else if (tryUrl === "modal") {
151
- // console.log("Modal action for:", update.id);
146
+ onProductUpdateClick?.(update);
147
+ }
148
+ else {
149
+ onProductUpdateClick?.(update);
152
150
  }
153
- onProductUpdateClick?.(update);
154
151
  };
155
152
  const handleArticleClick = (article) => {
156
153
  if (article.link) {
@@ -1 +1 @@
1
- {"version":3,"file":"WhatsNew.js","sourceRoot":"","sources":["../../src/components/WhatsNew.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useState, useRef, useEffect, useMemo } from \"react\";\nimport {\n Button,\n Tabs,\n Text,\n BlockStack,\n InlineStack,\n Box,\n Card,\n SkeletonBodyText,\n SkeletonThumbnail,\n} from \"@shopify/polaris\";\nimport { ExternalIcon } from \"@shopify/polaris-icons\";\nimport { ArticleList } from \"./ArticleList\";\nimport ImageLoading from \"./ImageLoading\";\nimport { useArticles, useWhatsNew } from \"../hooks\";\nimport { useTranslation } from \"../hooks/useTranslations\";\nimport { ArticleItem, ProductUpdateItem } from \"../types\";\nimport { sdkStyles, mergeStyles } from \"./styles\";\nimport { COMPONENT_DEFAULTS } from \"../config/component-defaults\";\nimport { useSDK, type UseSDKOptions } from \"../core/SDKManager\";\n\n// Fixed dimensions to prevent CLS - reduced to avoid excessive white space\nconst CONTAINER_MIN_HEIGHT = 300; // Reduced from 450\n\nexport interface WhatsNewProps extends UseSDKOptions {\n /** Optional CSS class */\n className?: string;\n \n /** Handle product update clicks */\n onProductUpdateClick?: (update: ProductUpdateItem) => void;\n \n /** Handle article clicks */\n onArticleClick?: (article: ArticleItem) => void;\n}\n\nexport const WhatsNew: React.FC<WhatsNewProps> = ({\n className = \"\",\n onProductUpdateClick,\n onArticleClick,\n // SDK options (optional)\n shopInfo,\n locale,\n translations,\n config,\n}) => {\n // Connect to SDK Manager (auto-initializes)\n // @ts-ignore - Will be used in future refactoring\n const _sdk = useSDK({ shopInfo, locale, translations, config });\n \n // Use internal defaults\n const { \n maxUpdates,\n showNavigation,\n showViewAllButton,\n } = COMPONENT_DEFAULTS.whatsNew;\n const [productUpdateIndex, setProductUpdateIndex] = useState(0);\n const [articleIndex, setArticleIndex] = useState(0);\n const [selectedTab, setSelectedTab] = useState(0);\n const [isMobile, setIsMobile] = useState(false);\n const [isContentReady, setIsContentReady] = useState(false);\n const [touchDelta, setTouchDelta] = useState(0);\n const [isSwiping, setIsSwiping] = useState(false);\n\n const touchStartX = useRef<number | null>(null);\n const touchEndX = useRef<number | null>(null);\n const swiping = useRef(false);\n const slideContainerRef = useRef<HTMLDivElement>(null);\n\n const articles = useArticles();\n const whatsNew = useWhatsNew();\n const t = useTranslation('whatsNew');\n\n const limitedUpdates = useMemo(() => \n whatsNew.updates.slice(0, maxUpdates), \n [whatsNew.updates, maxUpdates]\n );\n\n useEffect(() => {\n const handleResize = () => {\n setIsMobile(window.innerWidth <= 768);\n };\n\n handleResize();\n window.addEventListener(\"resize\", handleResize);\n return () => window.removeEventListener(\"resize\", handleResize);\n }, []);\n\n // Mark content as ready when data loads\n useEffect(() => {\n if (limitedUpdates.length > 0 || articlesList.length > 0) {\n requestAnimationFrame(() => {\n setIsContentReady(true);\n });\n }\n }, [limitedUpdates.length, articles.articles.length]);\n \n const articlesList = articles.articles;\n\n const nextSlide = () => {\n if (selectedTab === 0) {\n setProductUpdateIndex((prevIndex) => {\n const newIndex = Math.min(prevIndex + 1, limitedUpdates.length - 1);\n return newIndex;\n });\n } else {\n setArticleIndex((prevIndex) => {\n if (isMobile) {\n const newIndex = Math.min(prevIndex + 1, articlesList.length - 1);\n return newIndex;\n } else {\n const visibleItems = 3;\n const maxIndex = Math.max(0, articlesList.length - visibleItems);\n const newIndex = Math.min(prevIndex + 1, maxIndex);\n return newIndex;\n }\n });\n }\n };\n\n const prevSlide = () => {\n if (selectedTab === 0) {\n setProductUpdateIndex((prevIndex) => {\n const newIndex = Math.max(prevIndex - 1, 0);\n return newIndex;\n });\n } else {\n setArticleIndex((prevIndex) => {\n const newIndex = Math.max(prevIndex - 1, 0);\n return newIndex;\n });\n }\n };\n\n const handleTouchStart = (e: React.TouchEvent) => {\n touchStartX.current = e.touches[0].clientX;\n swiping.current = true;\n setIsSwiping(true);\n setTouchDelta(0);\n };\n\n const handleTouchMove = (e: React.TouchEvent) => {\n if (!swiping.current || touchStartX.current === null) return;\n touchEndX.current = e.touches[0].clientX;\n const delta = touchEndX.current - touchStartX.current;\n setTouchDelta(delta);\n };\n\n const handleTouchEnd = () => {\n if (!swiping.current) return;\n\n const swipeThreshold = 50;\n const diff = (touchStartX.current || 0) - (touchEndX.current || 0);\n\n if (Math.abs(diff) > swipeThreshold) {\n if (diff > 0) {\n nextSlide();\n } else {\n prevSlide();\n }\n }\n\n swiping.current = false;\n touchStartX.current = null;\n touchEndX.current = null;\n setIsSwiping(false);\n setTouchDelta(0);\n };\n\n const handleProductUpdateClick = (update: ProductUpdateItem) => {\n const tryUrl = update.button_try_url || update.link;\n\n if (update.id === \"feature_up_vote\") {\n window.dispatchEvent(\n new CustomEvent(\"openFeatureBoard\", {\n detail: { source: \"whatsnew\" },\n }),\n );\n onProductUpdateClick?.(update);\n return;\n }\n\n if (tryUrl && tryUrl !== \"modal\") {\n if (tryUrl.startsWith(\"/\")) {\n // Internal navigation - use SDK default behavior\n const currentUrl = window.location.href;\n const shopifyAdminMatch = currentUrl.match(\n /https:\\/\\/admin\\.shopify\\.com\\/store\\/([^\\/]+)\\/apps\\/([^\\/]+)/,\n );\n\n if (shopifyAdminMatch) {\n const [, storeName, appName] = shopifyAdminMatch;\n const shopifyAppUrl = `https://admin.shopify.com/store/${storeName}/apps/${appName}${tryUrl}`;\n window.location.href = shopifyAppUrl;\n } else {\n window.location.href = tryUrl;\n }\n } else if (\n tryUrl.startsWith(\"http://\") ||\n tryUrl.startsWith(\"https://\")\n ) {\n window.open(tryUrl, \"_blank\");\n }\n } else if (tryUrl === \"modal\") {\n // console.log(\"Modal action for:\", update.id);\n }\n\n onProductUpdateClick?.(update);\n };\n\n const handleArticleClick = (article: ArticleItem) => {\n if (article.link) {\n window.open(article.link, \"_blank\");\n }\n onArticleClick?.(article);\n };\n\n const handleViewAllUpdates = () => {\n // Use SDK default behavior\n window.open(\"https://trust1.io/updates/\", \"_blank\");\n };\n\n const handleViewAllArticles = () => {\n // Use SDK default behavior\n window.open(\"https://trust1.io/blog/\", \"_blank\");\n };\n\n const tabs = [\n { id: \"product-update\", content: t.tabs?.productUpdate || \"Product Updates\" },\n { id: \"article\", content: t.tabs?.article || \"Articles\" },\n ];\n\n const isPrevDisabled =\n selectedTab === 0 ? productUpdateIndex === 0 : articleIndex === 0;\n const isNextDisabled =\n selectedTab === 0\n ? productUpdateIndex === limitedUpdates.length - 1\n : (() => {\n if (isMobile) {\n return articleIndex === articlesList.length - 1;\n } else {\n const visibleItems = 3;\n const maxIndex = Math.max(0, articlesList.length - visibleItems);\n return articleIndex >= maxIndex;\n }\n })();\n\n // Show skeleton while loading\n if (!isContentReady) {\n return (\n <div style={{ ...sdkStyles.dashboardWhatsNew, minHeight: `${CONTAINER_MIN_HEIGHT}px` }} className={className}>\n <Card>\n <BlockStack gap=\"400\">\n <BlockStack gap=\"100\">\n <SkeletonBodyText lines={1} />\n <InlineStack gap=\"300\" blockAlign=\"center\" align=\"space-between\">\n <div style={{ width: \"200px\" }}>\n <SkeletonBodyText lines={1} />\n </div>\n </InlineStack>\n </BlockStack>\n <Box>\n <BlockStack gap=\"400\">\n <SkeletonThumbnail size=\"large\" />\n <SkeletonBodyText lines={3} />\n </BlockStack>\n </Box>\n </BlockStack>\n </Card>\n </div>\n );\n }\n\n // Empty state\n if (limitedUpdates.length === 0 && articlesList.length === 0) {\n return (\n <div style={{ ...sdkStyles.dashboardWhatsNew, minHeight: `${CONTAINER_MIN_HEIGHT}px` }} className={className}>\n <Card>\n <BlockStack gap=\"400\">\n <Text variant=\"bodyMd\" tone=\"subdued\" as=\"p\">\n {t.noData || \"No updates available\"}\n </Text>\n </BlockStack>\n </Card>\n </div>\n );\n }\n\n const mobileStyles = isMobile\n ? {\n slidesContainer: {\n overflow: \"auto\",\n scrollSnapType: \"x mandatory\",\n WebkitOverflowScrolling: \"touch\" as any,\n scrollbarWidth: \"none\" as const,\n msOverflowStyle: \"none\" as const,\n },\n slidesWrapper: {\n scrollSnapAlign: \"start\" as const,\n },\n slideBox: {\n scrollSnapAlign: \"center\" as const,\n flex: \"0 0 85%\",\n maxWidth: \"85%\",\n minHeight: \"280px\",\n },\n slideImage: {\n display: \"none\",\n },\n hideScrollbar: {\n \"&::-webkit-scrollbar\": {\n display: \"none\",\n },\n },\n }\n : {};\n\n return (\n <div style={mergeStyles(sdkStyles.dashboardWhatsNew)} className={className}>\n <style>{`\n .whats-new-mobile-scrollbar::-webkit-scrollbar {\n display: none;\n }\n `}</style>\n <Card>\n <BlockStack gap=\"400\">\n <BlockStack gap=\"100\">\n <div\n style={{\n fontSize: \"16px\",\n fontWeight: \"650\",\n lineHeight: \"24px\",\n color: \"#303030\",\n marginBottom: \"8px\",\n margin: 0,\n }}\n >\n {t.title || \"What's New\"}\n </div>\n\n <InlineStack gap=\"300\" blockAlign=\"center\" align=\"space-between\">\n <div\n className=\"custom-tabs--wrapper-dashboard\"\n style={{\n margin: \"0\",\n padding: \"0\",\n }}\n >\n <style>{`\n .custom-tabs--wrapper-dashboard .Polaris-Box {\n --pc-box-padding-inline-start-md: 0 !important;\n --pc-box-padding-inline-end-md: 0 !important;\n }\n .custom-tabs--wrapper-dashboard .Polaris-Tabs {\n padding: 0 !important;\n }\n .custom-tabs--wrapper-dashboard .Polaris-Tabs__Wrapper {\n padding: 0 !important;\n overflow-y: hidden;\n }\n `}</style>\n <Tabs\n tabs={tabs}\n selected={selectedTab}\n onSelect={setSelectedTab}\n />\n </div>\n\n <InlineStack gap=\"200\">\n {showViewAllButton && (\n <Button\n icon={ExternalIcon}\n onClick={\n selectedTab === 0\n ? handleViewAllUpdates\n : handleViewAllArticles\n }\n >\n {selectedTab === 0\n ? (t.buttonViewAll?.productUpdate || \"View all updates\")\n : (t.buttonViewAll?.article || \"View all articles\")}\n </Button>\n )}\n\n {showNavigation && (\n <div style={sdkStyles.slideNavigation}>\n <button\n onClick={prevSlide}\n disabled={isPrevDisabled}\n style={mergeStyles(\n sdkStyles.slideButton,\n isPrevDisabled ? sdkStyles.slideButtonDisabled : {},\n {\n cursor: isPrevDisabled ? \"not-allowed\" : \"pointer\",\n opacity: isPrevDisabled ? 0.5 : 1,\n },\n )}\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"currentColor\"\n >\n <path\n d=\"M10.5 13L5.5 8l5-5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n fill=\"none\"\n />\n </svg>\n </button>\n <button\n onClick={nextSlide}\n disabled={isNextDisabled}\n style={mergeStyles(\n sdkStyles.slideButton,\n isNextDisabled ? sdkStyles.slideButtonDisabled : {},\n {\n cursor: isNextDisabled ? \"not-allowed\" : \"pointer\",\n opacity: isNextDisabled ? 0.5 : 1,\n },\n )}\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"currentColor\"\n >\n <path\n d=\"M5.5 13l5-5-5-5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n fill=\"none\"\n />\n </svg>\n </button>\n </div>\n )}\n </InlineStack>\n </InlineStack>\n </BlockStack>\n\n <Box>\n {selectedTab === 0 ? (\n <div\n ref={slideContainerRef}\n style={mergeStyles(\n sdkStyles.slidesContainer,\n mobileStyles.slidesContainer,\n { \n scrollbarWidth: \"none\" as any,\n }\n )}\n className={isMobile ? \"whats-new-mobile-scrollbar\" : \"\"}\n onTouchStart={isMobile ? handleTouchStart : undefined}\n onTouchMove={isMobile ? handleTouchMove : undefined}\n onTouchEnd={isMobile ? handleTouchEnd : undefined}\n >\n <div\n style={mergeStyles(\n sdkStyles.slidesWrapper,\n mobileStyles.slidesWrapper,\n {\n transform: isMobile\n ? `translateX(calc(-${productUpdateIndex * 85}% + ${touchDelta}px))` // 85% for mobile with swipe delta\n : `translateX(calc(-${productUpdateIndex * 90}% + ${touchDelta}px))`,\n transition: isSwiping ? \"none\" : \"transform 0.3s cubic-bezier(0.4, 0, 0.2, 1)\",\n willChange: \"transform\", // GPU acceleration\n },\n )}\n >\n {limitedUpdates.map((update) => (\n <div\n key={update.id}\n style={mergeStyles(\n sdkStyles.slideBox,\n isMobile ? mobileStyles.slideBox : {},\n )}\n >\n <div style={sdkStyles.slideContent}>\n <Text variant=\"headingMd\" as=\"h3\">\n {update.title}\n </Text>\n {(update.releaseDate || update.date_time) && (\n <Text variant=\"bodySm\" tone=\"subdued\" as=\"p\">\n {update.releaseDate || update.date_time}\n </Text>\n )}\n {(update.description || update.content?.text) && (\n <Text as=\"p\">\n {update.description || update.content?.text}\n </Text>\n )}\n {update.features && update.features.length > 0 && (\n <ul style={{ paddingLeft: \"20px\", margin: 0 }}>\n {update.features.map(\n (item: string, idx: number) => (\n <li\n key={idx}\n style={{\n fontSize: \"13px\",\n lineHeight: 1.4,\n marginBottom: \"4px\",\n }}\n >\n {item}\n </li>\n ),\n )}\n </ul>\n )}\n <InlineStack gap=\"200\">\n {(update.button_try_url || update.link) && (\n <Button\n onClick={() => handleProductUpdateClick(update)}\n >\n {update.button_try_it_now || \"Try it now\"}\n </Button>\n )}\n {(update.button_learn_url || update.link) && (\n <Button\n variant={\n !(update.button_try_url || update.link)\n ? \"secondary\"\n : \"monochromePlain\"\n }\n onClick={() => {\n const learnUrl =\n update.button_learn_url || update.link;\n\n if (learnUrl && learnUrl !== \"modal\") {\n window.open(learnUrl, \"_blank\");\n }\n }}\n >\n {update.button_learn_more || \"Learn more\"}\n </Button>\n )}\n </InlineStack>\n </div>\n <div\n style={mergeStyles(\n sdkStyles.slideImage,\n isMobile ? mobileStyles.slideImage : {},\n )}\n >\n <ImageLoading\n src={\n update.imageUrl ||\n update.image_url ||\n \"https://asset.trustshop.io/dashboard/news-review-summary.png\"\n }\n alt={`what-new-${update.id}`}\n width={712}\n height={400}\n borderRadius={12}\n />\n </div>\n </div>\n ))}\n </div>\n </div>\n ) : (\n <div\n ref={slideContainerRef}\n style={mergeStyles(\n sdkStyles.slidesContainer,\n { \n scrollbarWidth: \"none\" as any,\n },\n mobileStyles.slidesContainer,\n )}\n className={isMobile ? \"whats-new-mobile-scrollbar\" : \"\"}\n onTouchStart={isMobile ? handleTouchStart : undefined}\n onTouchMove={isMobile ? handleTouchMove : undefined}\n onTouchEnd={isMobile ? handleTouchEnd : undefined}\n >\n <ArticleList\n layout=\"slide\"\n onArticleClick={handleArticleClick}\n showThumbnail={true}\n showAuthor={true}\n showDate={true}\n currentIndex={articleIndex}\n onSlideChange={setArticleIndex}\n showNavigation={false}\n />\n </div>\n )}\n </Box>\n </BlockStack>\n </Card>\n </div>\n );\n};\n"]}
1
+ {"version":3,"file":"WhatsNew.js","sourceRoot":"","sources":["../../src/components/WhatsNew.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useState, useRef, useEffect, useMemo } from \"react\";\nimport {\n Button,\n Tabs,\n Text,\n BlockStack,\n InlineStack,\n Box,\n Card,\n SkeletonBodyText,\n SkeletonThumbnail,\n} from \"@shopify/polaris\";\nimport { ExternalIcon } from \"@shopify/polaris-icons\";\nimport { ArticleList } from \"./ArticleList\";\nimport ImageLoading from \"./ImageLoading\";\nimport { useArticles, useWhatsNew } from \"../hooks\";\nimport { useTranslation } from \"../hooks/useTranslations\";\nimport { ArticleItem, ProductUpdateItem } from \"../types\";\nimport { sdkStyles, mergeStyles } from \"./styles\";\nimport { COMPONENT_DEFAULTS } from \"../config/component-defaults\";\nimport { useSDK, type UseSDKOptions } from \"../core/SDKManager\";\n\n// Fixed dimensions to prevent CLS - reduced to avoid excessive white space\nconst CONTAINER_MIN_HEIGHT = 300; // Reduced from 450\n\nexport interface WhatsNewProps extends UseSDKOptions {\n /** Optional CSS class */\n className?: string;\n \n /** Navigation function for internal routing */\n navigate?: (path: string) => void;\n \n /** Handle product update clicks */\n onProductUpdateClick?: (update: ProductUpdateItem) => void;\n \n /** Handle article clicks */\n onArticleClick?: (article: ArticleItem) => void;\n}\n\nexport const WhatsNew: React.FC<WhatsNewProps> = ({\n className = \"\",\n navigate,\n onProductUpdateClick,\n onArticleClick,\n // SDK options (optional)\n shopInfo,\n locale,\n translations,\n config,\n}) => {\n // Connect to SDK Manager (auto-initializes)\n // @ts-ignore - Will be used in future refactoring\n const _sdk = useSDK({ shopInfo, locale, translations, config });\n \n // Use internal defaults\n const { \n maxUpdates,\n showNavigation,\n showViewAllButton,\n } = COMPONENT_DEFAULTS.whatsNew;\n const [productUpdateIndex, setProductUpdateIndex] = useState(0);\n const [articleIndex, setArticleIndex] = useState(0);\n const [selectedTab, setSelectedTab] = useState(0);\n const [isMobile, setIsMobile] = useState(false);\n const [isContentReady, setIsContentReady] = useState(false);\n const [touchDelta, setTouchDelta] = useState(0);\n const [isSwiping, setIsSwiping] = useState(false);\n\n const touchStartX = useRef<number | null>(null);\n const touchEndX = useRef<number | null>(null);\n const swiping = useRef(false);\n const slideContainerRef = useRef<HTMLDivElement>(null);\n\n const articles = useArticles();\n const whatsNew = useWhatsNew();\n const t = useTranslation('whatsNew');\n\n const limitedUpdates = useMemo(() => \n whatsNew.updates.slice(0, maxUpdates), \n [whatsNew.updates, maxUpdates]\n );\n\n useEffect(() => {\n const handleResize = () => {\n setIsMobile(window.innerWidth <= 768);\n };\n\n handleResize();\n window.addEventListener(\"resize\", handleResize);\n return () => window.removeEventListener(\"resize\", handleResize);\n }, []);\n\n // Mark content as ready when data loads\n useEffect(() => {\n if (limitedUpdates.length > 0 || articlesList.length > 0) {\n requestAnimationFrame(() => {\n setIsContentReady(true);\n });\n }\n }, [limitedUpdates.length, articles.articles.length]);\n \n const articlesList = articles.articles;\n\n const nextSlide = () => {\n if (selectedTab === 0) {\n setProductUpdateIndex((prevIndex) => {\n const newIndex = Math.min(prevIndex + 1, limitedUpdates.length - 1);\n return newIndex;\n });\n } else {\n setArticleIndex((prevIndex) => {\n if (isMobile) {\n const newIndex = Math.min(prevIndex + 1, articlesList.length - 1);\n return newIndex;\n } else {\n const visibleItems = 3;\n const maxIndex = Math.max(0, articlesList.length - visibleItems);\n const newIndex = Math.min(prevIndex + 1, maxIndex);\n return newIndex;\n }\n });\n }\n };\n\n const prevSlide = () => {\n if (selectedTab === 0) {\n setProductUpdateIndex((prevIndex) => {\n const newIndex = Math.max(prevIndex - 1, 0);\n return newIndex;\n });\n } else {\n setArticleIndex((prevIndex) => {\n const newIndex = Math.max(prevIndex - 1, 0);\n return newIndex;\n });\n }\n };\n\n const handleTouchStart = (e: React.TouchEvent) => {\n touchStartX.current = e.touches[0].clientX;\n swiping.current = true;\n setIsSwiping(true);\n setTouchDelta(0);\n };\n\n const handleTouchMove = (e: React.TouchEvent) => {\n if (!swiping.current || touchStartX.current === null) return;\n touchEndX.current = e.touches[0].clientX;\n const delta = touchEndX.current - touchStartX.current;\n setTouchDelta(delta);\n };\n\n const handleTouchEnd = () => {\n if (!swiping.current) return;\n\n const swipeThreshold = 50;\n const diff = (touchStartX.current || 0) - (touchEndX.current || 0);\n\n if (Math.abs(diff) > swipeThreshold) {\n if (diff > 0) {\n nextSlide();\n } else {\n prevSlide();\n }\n }\n\n swiping.current = false;\n touchStartX.current = null;\n touchEndX.current = null;\n setIsSwiping(false);\n setTouchDelta(0);\n };\n\n const handleProductUpdateClick = (update: ProductUpdateItem) => {\n const tryUrl = update.button_try_url || update.link;\n\n if (update.id === \"feature_up_vote\") {\n window.dispatchEvent(\n new CustomEvent(\"openFeatureBoard\", {\n detail: { source: \"whatsnew\" },\n }),\n );\n onProductUpdateClick?.(update);\n return;\n }\n\n if (tryUrl && tryUrl !== \"modal\") {\n if (tryUrl.startsWith(\"/\")) {\n if (navigate) {\n navigate(tryUrl);\n }\n onProductUpdateClick?.(update);\n return;\n } else if (\n tryUrl.startsWith(\"http://\") ||\n tryUrl.startsWith(\"https://\")\n ) {\n window.open(tryUrl, \"_blank\");\n onProductUpdateClick?.(update);\n }\n } else if (tryUrl === \"modal\") {\n onProductUpdateClick?.(update);\n } else {\n onProductUpdateClick?.(update);\n }\n };\n\n const handleArticleClick = (article: ArticleItem) => {\n if (article.link) {\n window.open(article.link, \"_blank\");\n }\n onArticleClick?.(article);\n };\n\n const handleViewAllUpdates = () => {\n // Use SDK default behavior\n window.open(\"https://trust1.io/updates/\", \"_blank\");\n };\n\n const handleViewAllArticles = () => {\n // Use SDK default behavior\n window.open(\"https://trust1.io/blog/\", \"_blank\");\n };\n\n const tabs = [\n { id: \"product-update\", content: t.tabs?.productUpdate || \"Product Updates\" },\n { id: \"article\", content: t.tabs?.article || \"Articles\" },\n ];\n\n const isPrevDisabled =\n selectedTab === 0 ? productUpdateIndex === 0 : articleIndex === 0;\n const isNextDisabled =\n selectedTab === 0\n ? productUpdateIndex === limitedUpdates.length - 1\n : (() => {\n if (isMobile) {\n return articleIndex === articlesList.length - 1;\n } else {\n const visibleItems = 3;\n const maxIndex = Math.max(0, articlesList.length - visibleItems);\n return articleIndex >= maxIndex;\n }\n })();\n\n // Show skeleton while loading\n if (!isContentReady) {\n return (\n <div style={{ ...sdkStyles.dashboardWhatsNew, minHeight: `${CONTAINER_MIN_HEIGHT}px` }} className={className}>\n <Card>\n <BlockStack gap=\"400\">\n <BlockStack gap=\"100\">\n <SkeletonBodyText lines={1} />\n <InlineStack gap=\"300\" blockAlign=\"center\" align=\"space-between\">\n <div style={{ width: \"200px\" }}>\n <SkeletonBodyText lines={1} />\n </div>\n </InlineStack>\n </BlockStack>\n <Box>\n <BlockStack gap=\"400\">\n <SkeletonThumbnail size=\"large\" />\n <SkeletonBodyText lines={3} />\n </BlockStack>\n </Box>\n </BlockStack>\n </Card>\n </div>\n );\n }\n\n // Empty state\n if (limitedUpdates.length === 0 && articlesList.length === 0) {\n return (\n <div style={{ ...sdkStyles.dashboardWhatsNew, minHeight: `${CONTAINER_MIN_HEIGHT}px` }} className={className}>\n <Card>\n <BlockStack gap=\"400\">\n <Text variant=\"bodyMd\" tone=\"subdued\" as=\"p\">\n {t.noData || \"No updates available\"}\n </Text>\n </BlockStack>\n </Card>\n </div>\n );\n }\n\n const mobileStyles = isMobile\n ? {\n slidesContainer: {\n overflow: \"auto\",\n scrollSnapType: \"x mandatory\",\n WebkitOverflowScrolling: \"touch\" as any,\n scrollbarWidth: \"none\" as const,\n msOverflowStyle: \"none\" as const,\n },\n slidesWrapper: {\n scrollSnapAlign: \"start\" as const,\n },\n slideBox: {\n scrollSnapAlign: \"center\" as const,\n flex: \"0 0 85%\",\n maxWidth: \"85%\",\n minHeight: \"280px\",\n },\n slideImage: {\n display: \"none\",\n },\n hideScrollbar: {\n \"&::-webkit-scrollbar\": {\n display: \"none\",\n },\n },\n }\n : {};\n\n return (\n <div style={mergeStyles(sdkStyles.dashboardWhatsNew)} className={className}>\n <style>{`\n .whats-new-mobile-scrollbar::-webkit-scrollbar {\n display: none;\n }\n `}</style>\n <Card>\n <BlockStack gap=\"400\">\n <BlockStack gap=\"100\">\n <div\n style={{\n fontSize: \"16px\",\n fontWeight: \"650\",\n lineHeight: \"24px\",\n color: \"#303030\",\n marginBottom: \"8px\",\n margin: 0,\n }}\n >\n {t.title || \"What's New\"}\n </div>\n\n <InlineStack gap=\"300\" blockAlign=\"center\" align=\"space-between\">\n <div\n className=\"custom-tabs--wrapper-dashboard\"\n style={{\n margin: \"0\",\n padding: \"0\",\n }}\n >\n <style>{`\n .custom-tabs--wrapper-dashboard .Polaris-Box {\n --pc-box-padding-inline-start-md: 0 !important;\n --pc-box-padding-inline-end-md: 0 !important;\n }\n .custom-tabs--wrapper-dashboard .Polaris-Tabs {\n padding: 0 !important;\n }\n .custom-tabs--wrapper-dashboard .Polaris-Tabs__Wrapper {\n padding: 0 !important;\n overflow-y: hidden;\n }\n `}</style>\n <Tabs\n tabs={tabs}\n selected={selectedTab}\n onSelect={setSelectedTab}\n />\n </div>\n\n <InlineStack gap=\"200\">\n {showViewAllButton && (\n <Button\n icon={ExternalIcon}\n onClick={\n selectedTab === 0\n ? handleViewAllUpdates\n : handleViewAllArticles\n }\n >\n {selectedTab === 0\n ? (t.buttonViewAll?.productUpdate || \"View all updates\")\n : (t.buttonViewAll?.article || \"View all articles\")}\n </Button>\n )}\n\n {showNavigation && (\n <div style={sdkStyles.slideNavigation}>\n <button\n onClick={prevSlide}\n disabled={isPrevDisabled}\n style={mergeStyles(\n sdkStyles.slideButton,\n isPrevDisabled ? sdkStyles.slideButtonDisabled : {},\n {\n cursor: isPrevDisabled ? \"not-allowed\" : \"pointer\",\n opacity: isPrevDisabled ? 0.5 : 1,\n },\n )}\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"currentColor\"\n >\n <path\n d=\"M10.5 13L5.5 8l5-5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n fill=\"none\"\n />\n </svg>\n </button>\n <button\n onClick={nextSlide}\n disabled={isNextDisabled}\n style={mergeStyles(\n sdkStyles.slideButton,\n isNextDisabled ? sdkStyles.slideButtonDisabled : {},\n {\n cursor: isNextDisabled ? \"not-allowed\" : \"pointer\",\n opacity: isNextDisabled ? 0.5 : 1,\n },\n )}\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"currentColor\"\n >\n <path\n d=\"M5.5 13l5-5-5-5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n fill=\"none\"\n />\n </svg>\n </button>\n </div>\n )}\n </InlineStack>\n </InlineStack>\n </BlockStack>\n\n <Box>\n {selectedTab === 0 ? (\n <div\n ref={slideContainerRef}\n style={mergeStyles(\n sdkStyles.slidesContainer,\n mobileStyles.slidesContainer,\n { \n scrollbarWidth: \"none\" as any,\n }\n )}\n className={isMobile ? \"whats-new-mobile-scrollbar\" : \"\"}\n onTouchStart={isMobile ? handleTouchStart : undefined}\n onTouchMove={isMobile ? handleTouchMove : undefined}\n onTouchEnd={isMobile ? handleTouchEnd : undefined}\n >\n <div\n style={mergeStyles(\n sdkStyles.slidesWrapper,\n mobileStyles.slidesWrapper,\n {\n transform: isMobile\n ? `translateX(calc(-${productUpdateIndex * 85}% + ${touchDelta}px))` // 85% for mobile with swipe delta\n : `translateX(calc(-${productUpdateIndex * 90}% + ${touchDelta}px))`,\n transition: isSwiping ? \"none\" : \"transform 0.3s cubic-bezier(0.4, 0, 0.2, 1)\",\n willChange: \"transform\", // GPU acceleration\n },\n )}\n >\n {limitedUpdates.map((update) => (\n <div\n key={update.id}\n style={mergeStyles(\n sdkStyles.slideBox,\n isMobile ? mobileStyles.slideBox : {},\n )}\n >\n <div style={sdkStyles.slideContent}>\n <Text variant=\"headingMd\" as=\"h3\">\n {update.title}\n </Text>\n {(update.releaseDate || update.date_time) && (\n <Text variant=\"bodySm\" tone=\"subdued\" as=\"p\">\n {update.releaseDate || update.date_time}\n </Text>\n )}\n {(update.description || update.content?.text) && (\n <Text as=\"p\">\n {update.description || update.content?.text}\n </Text>\n )}\n {update.features && update.features.length > 0 && (\n <ul style={{ paddingLeft: \"20px\", margin: 0 }}>\n {update.features.map(\n (item: string, idx: number) => (\n <li\n key={idx}\n style={{\n fontSize: \"13px\",\n lineHeight: 1.4,\n marginBottom: \"4px\",\n }}\n >\n {item}\n </li>\n ),\n )}\n </ul>\n )}\n <InlineStack gap=\"200\">\n {(update.button_try_url || update.link) && (\n <Button\n onClick={() => handleProductUpdateClick(update)}\n >\n {update.button_try_it_now || \"Try it now\"}\n </Button>\n )}\n {(update.button_learn_url || update.link) && (\n <Button\n variant={\n !(update.button_try_url || update.link)\n ? \"secondary\"\n : \"monochromePlain\"\n }\n onClick={() => {\n const learnUrl =\n update.button_learn_url || update.link;\n\n if (learnUrl && learnUrl !== \"modal\") {\n window.open(learnUrl, \"_blank\");\n }\n }}\n >\n {update.button_learn_more || \"Learn more\"}\n </Button>\n )}\n </InlineStack>\n </div>\n <div\n style={mergeStyles(\n sdkStyles.slideImage,\n isMobile ? mobileStyles.slideImage : {},\n )}\n >\n <ImageLoading\n src={\n update.imageUrl ||\n update.image_url ||\n \"https://asset.trustshop.io/dashboard/news-review-summary.png\"\n }\n alt={`what-new-${update.id}`}\n width={712}\n height={400}\n borderRadius={12}\n />\n </div>\n </div>\n ))}\n </div>\n </div>\n ) : (\n <div\n ref={slideContainerRef}\n style={mergeStyles(\n sdkStyles.slidesContainer,\n { \n scrollbarWidth: \"none\" as any,\n },\n mobileStyles.slidesContainer,\n )}\n className={isMobile ? \"whats-new-mobile-scrollbar\" : \"\"}\n onTouchStart={isMobile ? handleTouchStart : undefined}\n onTouchMove={isMobile ? handleTouchMove : undefined}\n onTouchEnd={isMobile ? handleTouchEnd : undefined}\n >\n <ArticleList\n layout=\"slide\"\n onArticleClick={handleArticleClick}\n showThumbnail={true}\n showAuthor={true}\n showDate={true}\n currentIndex={articleIndex}\n onSlideChange={setArticleIndex}\n showNavigation={false}\n />\n </div>\n )}\n </Box>\n </BlockStack>\n </Card>\n </div>\n );\n};\n"]}
@@ -1 +1 @@
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;;;;;;;;;EAiCrC;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"}
@@ -13,20 +13,58 @@ export function usePartnerIntegrations() {
13
13
  if (!dashboardData?.integrations) {
14
14
  return [];
15
15
  }
16
- return dashboardData.integrations;
16
+ // Filter out Google Reviews
17
+ return dashboardData.integrations.filter((item) => item.key !== "google_reviews" && item.title !== "Google Reviews");
17
18
  }, [dashboardData]);
18
- // Group integrations for backward compatibility
19
+ // Group integrations by category using the API's category_key field
19
20
  const groups = useMemo(() => {
20
21
  if (!integrations || integrations.length === 0) {
21
22
  return [];
22
23
  }
23
- // Create a single group with all integrations for now
24
- return [{
25
- key: 'all',
26
- title: 'All Integrations',
27
- items: integrations
28
- }];
29
- }, [integrations]);
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]);
30
68
  return {
31
69
  groups,
32
70
  loading: sdk.dashboardLoading || false,
@@ -1 +1 @@
1
- {"version":3,"file":"usePartnerIntegration.js","sourceRoot":"","sources":["../../src/hooks/usePartnerIntegration.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAChC,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,UAAU,MAAM,oBAAoB,CAAC;AAG5C;;GAEG;AACH,MAAM,UAAU,sBAAsB;IACpC,MAAM,GAAG,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC;IAEvB,8BAA8B;IAC9B,MAAM,aAAa,GAAG,UAAU,CAAC,gBAAgB,EAAE,CAAC;IAEpD,qEAAqE;IACrE,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,EAAE;QAChC,IAAI,CAAC,aAAa,EAAE,YAAY,EAAE,CAAC;YACjC,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,OAAO,aAAa,CAAC,YAAY,CAAC;IACpC,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC;IAEpB,gDAAgD;IAChD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE;QAC1B,IAAI,CAAC,YAAY,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/C,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,sDAAsD;QACtD,OAAO,CAAC;gBACN,GAAG,EAAE,KAAK;gBACV,KAAK,EAAE,kBAAkB;gBACzB,KAAK,EAAE,YAAY;aACpB,CAAC,CAAC;IACL,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC;IAEnB,OAAO;QACL,MAAM;QACN,OAAO,EAAE,GAAG,CAAC,gBAAgB,IAAI,KAAK;QACtC,KAAK,EAAE,GAAG,CAAC,cAAc,IAAI,IAAI;QACjC,YAAY;KACb,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,0BAA0B,CACxC,GAAW;IAEX,MAAM,EAAE,YAAY,EAAE,GAAG,sBAAsB,EAAE,CAAC;IAElD,OAAO,OAAO,CAAC,GAAG,EAAE;QAClB,OAAO,YAAY,CAAC,IAAI,CAAC,CAAC,IAAS,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,KAAK,GAAG,CAAC,IAAI,IAAI,CAAC;IACpE,CAAC,EAAE,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,2BAA2B,CAAC,GAAW;IAKrD,MAAM,WAAW,GAAG,0BAA0B,CAAC,GAAG,CAAC,CAAC;IAEpD,OAAO,OAAO,CAAC,GAAG,EAAE;QAClB,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;QACrE,CAAC;QAED,mDAAmD;QACnD,MAAM,WAAW,GAAG,GAAG,KAAK,gBAAgB,CAAC;QAC7C,MAAM,QAAQ,GAAG,GAAG,KAAK,YAAY,CAAC;QACtC,MAAM,WAAW,GAAG,CAAC,WAAW,CAAC,mBAAmB,CAAC;QAErD,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC;IAChD,CAAC,EAAE,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC;AACzB,CAAC","sourcesContent":["import { useMemo } from \"react\";\nimport { useSDK } from \"../core/SDKManager\";\nimport SDKManager from \"../core/SDKManager\";\nimport { IntegrationItem } from \"../types/integration\";\n\n/**\n * Hook to get all partner integrations from dashboard data\n */\nexport function usePartnerIntegrations() {\n const sdk = useSDK({});\n \n // Get dashboard data from SDK\n const dashboardData = SDKManager.getDashboardData();\n\n // Partner integrations are stored directly in the integrations field\n const integrations = useMemo(() => {\n if (!dashboardData?.integrations) {\n return [];\n }\n return dashboardData.integrations;\n }, [dashboardData]);\n\n // Group integrations for backward compatibility\n const groups = useMemo(() => {\n if (!integrations || integrations.length === 0) {\n return [];\n }\n // Create a single group with all integrations for now\n return [{\n key: 'all',\n title: 'All Integrations',\n items: integrations\n }];\n }, [integrations]);\n\n return {\n groups,\n loading: sdk.dashboardLoading || false,\n error: sdk.dashboardError || null,\n integrations,\n };\n}\n\n/**\n * Hook to get a specific integration by key\n */\nexport function usePartnerIntegrationByKey(\n key: string,\n): IntegrationItem | null {\n const { integrations } = usePartnerIntegrations();\n\n return useMemo(() => {\n return integrations.find((item: any) => item.key === key) || null;\n }, [integrations, key]);\n}\n\n/**\n * Hook to get integration status\n */\nexport function usePartnerIntegrationStatus(key: string): {\n isConnected: boolean;\n isActive: boolean;\n isInstalled: boolean;\n} {\n const integration = usePartnerIntegrationByKey(key);\n\n return useMemo(() => {\n if (!integration) {\n return { isConnected: false, isActive: false, isInstalled: false };\n }\n\n // Check based on integration key and button states\n const isConnected = key === \"google_reviews\";\n const isActive = key !== \"after_ship\";\n const isInstalled = !integration.button_install_text;\n\n return { isConnected, isActive, isInstalled };\n }, [integration, key]);\n}\n"]}
1
+ {"version":3,"file":"usePartnerIntegration.js","sourceRoot":"","sources":["../../src/hooks/usePartnerIntegration.ts"],"names":[],"mappings":"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","sourcesContent":["import { useMemo } from \"react\";\nimport { useSDK } from \"../core/SDKManager\";\nimport SDKManager from \"../core/SDKManager\";\nimport { IntegrationItem } from \"../types/integration\";\n\n/**\n * Hook to get all partner integrations from dashboard data\n */\nexport function usePartnerIntegrations() {\n const sdk = useSDK({});\n\n // Get dashboard data from SDK\n const dashboardData = SDKManager.getDashboardData();\n\n // Partner integrations are stored directly in the integrations field\n const integrations = useMemo(() => {\n if (!dashboardData?.integrations) {\n return [];\n }\n // Filter out Google Reviews\n return dashboardData.integrations.filter(\n (item: any) =>\n item.key !== \"google_reviews\" && item.title !== \"Google Reviews\",\n );\n }, [dashboardData]);\n\n // Group integrations by category using the API's category_key field\n const groups = useMemo(() => {\n if (!integrations || integrations.length === 0) {\n return [];\n }\n\n // Group by category_key from API\n const categoryGroups: Record<string, any[]> = {};\n const categoryTitles: Record<string, string> = {};\n \n integrations.forEach((item: any) => {\n const categoryKey = item.category_key || 'other';\n const categoryTitle = item.category || 'Other';\n \n if (!categoryGroups[categoryKey]) {\n categoryGroups[categoryKey] = [];\n categoryTitles[categoryKey] = categoryTitle;\n }\n categoryGroups[categoryKey].push(item);\n });\n\n // Get translations\n const translations = sdk.translations?.partnerIntegration || {};\n\n // Define category order and translation mapping\n const categoryOrder = ['review_sources', 'post_purchase_automation', 'seo_rich_snippets'];\n const translationMap: Record<string, string> = {\n 'review_sources': translations.reviewSourcesTitle || 'Review Sources',\n 'post_purchase_automation': translations.postPurchaseTitle || 'Post-purchase & Automation',\n 'seo_rich_snippets': translations.seoSnippetsTitle || 'SEO & Rich Snippets'\n };\n\n // Build groups in order\n const allGroups: Array<{\n key: string;\n title: string;\n items: any[];\n }> = [];\n \n // Add categories in preferred order first\n categoryOrder.forEach(categoryKey => {\n if (categoryGroups[categoryKey]) {\n allGroups.push({\n key: categoryKey,\n title: translationMap[categoryKey] || categoryTitles[categoryKey],\n items: categoryGroups[categoryKey]\n });\n delete categoryGroups[categoryKey];\n }\n });\n \n // Add any remaining categories\n Object.entries(categoryGroups).forEach(([categoryKey, items]) => {\n allGroups.push({\n key: categoryKey,\n title: categoryTitles[categoryKey],\n items\n });\n });\n\n return allGroups;\n }, [integrations, sdk.translations]);\n\n return {\n groups,\n loading: sdk.dashboardLoading || false,\n error: sdk.dashboardError || null,\n integrations,\n };\n}\n\n/**\n * Hook to get a specific integration by key\n */\nexport function usePartnerIntegrationByKey(\n key: string,\n): IntegrationItem | null {\n const { integrations } = usePartnerIntegrations();\n\n return useMemo(() => {\n return integrations.find((item: any) => item.key === key) || null;\n }, [integrations, key]);\n}\n\n/**\n * Hook to get integration status\n */\nexport function usePartnerIntegrationStatus(key: string): {\n isConnected: boolean;\n isActive: boolean;\n isInstalled: boolean;\n} {\n const integration = usePartnerIntegrationByKey(key);\n\n return useMemo(() => {\n if (!integration) {\n return { isConnected: false, isActive: false, isInstalled: false };\n }\n\n // Check based on integration key and button states\n const isConnected = key === \"google_reviews\";\n const isActive = key !== \"after_ship\";\n const isInstalled = !integration.button_install_text;\n\n return { isConnected, isActive, isInstalled };\n }, [integration, key]);\n}\n"]}
package/dist/index.d.ts CHANGED
@@ -11,12 +11,14 @@ export { PopupBanner } from "./components/PopupBanner";
11
11
  export { PartnerIntegration } from "./components/PartnerIntegration";
12
12
  export { PartnerList } from "./components/PartnerList";
13
13
  export { FloatingCard } from "./components/FloatingCard";
14
+ export { FloatingCardContainer } from "./components/FloatingCardContainer";
14
15
  export type { TopBannerProps } from "./components/TopBanner";
15
16
  export type { WhatsNewProps } from "./components/WhatsNew";
16
17
  export type { GrowAppsProps } from "./components/GrowApps";
17
18
  export type { PopupBannerProps } from "./components/PopupBanner";
18
19
  export type { PartnerIntegrationProps, IntegrationStatusInfo } from "./components/PartnerIntegration";
19
20
  export type { PartnerListProps } from "./components/PartnerList";
21
+ export type { FloatingCardContainerProps } from "./components/FloatingCardContainer";
20
22
  export { SDKManager } from "./core/SDKManager";
21
23
  export { useSDK } from "./core/SDKManager";
22
24
  export type { UseSDKOptions } from "./core/SDKManager";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAGzD,YAAY,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,YAAY,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC3D,YAAY,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC3D,YAAY,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AACjE,YAAY,EAAE,uBAAuB,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AACtG,YAAY,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAQjE,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,YAAY,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAGvD,YAAY,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAG5E,YAAY,EACV,eAAe,EACf,eAAe,GAChB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EACL,gBAAgB,EAChB,eAAe,EACf,eAAe,EACf,iBAAiB,EACjB,eAAe,EACf,cAAc,GACf,MAAM,oCAAoC,CAAC;AAO5C,YAAY,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACjD,YAAY,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACnD,YAAY,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAChE,YAAY,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAClE,YAAY,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC3D,YAAY,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACnD,YAAY,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAOlE,OAAO,EACL,UAAU,EACV,kBAAkB,EAClB,iBAAiB,EACjB,aAAa,GACd,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAGzE,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,sBAAsB,GACvB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAChF,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACzF,OAAO,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAC;AAG3E,YAAY,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,YAAY,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC3D,YAAY,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC3D,YAAY,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AACjE,YAAY,EAAE,uBAAuB,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AACtG,YAAY,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AACjE,YAAY,EAAE,0BAA0B,EAAE,MAAM,oCAAoC,CAAC;AAQrF,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,YAAY,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAGvD,YAAY,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAG5E,YAAY,EACV,eAAe,EACf,eAAe,GAChB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EACL,gBAAgB,EAChB,eAAe,EACf,eAAe,EACf,iBAAiB,EACjB,eAAe,EACf,cAAc,GACf,MAAM,oCAAoC,CAAC;AAO5C,YAAY,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACjD,YAAY,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACnD,YAAY,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAChE,YAAY,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAClE,YAAY,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC3D,YAAY,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACnD,YAAY,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAOlE,OAAO,EACL,UAAU,EACV,kBAAkB,EAClB,iBAAiB,EACjB,aAAa,GACd,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAGzE,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,sBAAsB,GACvB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAChF,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACzF,OAAO,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC"}
package/dist/index.js CHANGED
@@ -15,6 +15,7 @@ export { PopupBanner } from "./components/PopupBanner";
15
15
  export { PartnerIntegration } from "./components/PartnerIntegration";
16
16
  export { PartnerList } from "./components/PartnerList";
17
17
  export { FloatingCard } from "./components/FloatingCard";
18
+ export { FloatingCardContainer } from "./components/FloatingCardContainer";
18
19
  // FloatingCard props defined inline in component
19
20
  // ============================================
20
21
  // ADVANCED CUSTOMIZATION (Optional)
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,+CAA+C;AAC/C,yCAAyC;AACzC,+CAA+C;AAE/C,2DAA2D;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AASzD,iDAAiD;AAEjD,+CAA+C;AAC/C,oCAAoC;AACpC,+CAA+C;AAE/C,mDAAmD;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAW3C,OAAO,EACL,gBAAgB,EAChB,eAAe,EACf,eAAe,EACf,iBAAiB,EACjB,eAAe,EACf,cAAc,GACf,MAAM,oCAAoC,CAAC;AAe5C,+CAA+C;AAC/C,uBAAuB;AACvB,+CAA+C;AAE/C,6CAA6C;AAC7C,OAAO,EACL,UAAU,EACV,kBAAkB,EAClB,iBAAiB,EACjB,aAAa,GACd,MAAM,qBAAqB,CAAC;AAG7B,oBAAoB;AACpB,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,sBAAsB,GACvB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAChF,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACzF,OAAO,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AAGnE,+CAA+C;AAC/C,oBAAoB;AACpB,+CAA+C;AAE/C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAoCE","sourcesContent":["/**\n * @trustshop/shopify-inapp-components\n *\n * Provider-less component architecture for Shopify in-app dashboards\n * Components work standalone without any provider wrapper required\n */\n\n// ============================================\n// PRIMARY EXPORTS - Component-Driven API\n// ============================================\n\n// Main UI components (auto-initialize, no provider needed)\nexport { TopBanner } from \"./components/TopBanner\";\nexport { WhatsNew } from \"./components/WhatsNew\";\nexport { GrowApps } from \"./components/GrowApps\";\nexport { PopupBanner } from \"./components/PopupBanner\";\nexport { PartnerIntegration } from \"./components/PartnerIntegration\";\nexport { PartnerList } from \"./components/PartnerList\";\nexport { FloatingCard } from \"./components/FloatingCard\";\n\n// Component prop types\nexport type { TopBannerProps } from \"./components/TopBanner\";\nexport type { WhatsNewProps } from \"./components/WhatsNew\";\nexport type { GrowAppsProps } from \"./components/GrowApps\";\nexport type { PopupBannerProps } from \"./components/PopupBanner\";\nexport type { PartnerIntegrationProps, IntegrationStatusInfo } from \"./components/PartnerIntegration\";\nexport type { PartnerListProps } from \"./components/PartnerList\";\n// FloatingCard props defined inline in component\n\n// ============================================\n// ADVANCED CUSTOMIZATION (Optional)\n// ============================================\n\n// SDK Manager for advanced control (rarely needed)\nexport { SDKManager } from \"./core/SDKManager\";\nexport { useSDK } from \"./core/SDKManager\";\nexport type { UseSDKOptions } from \"./core/SDKManager\";\n\n// Configuration types\nexport type { ShopInfo, SDKInternalConfig } from \"./config/internal-config\";\n\n// Translation types and utilities\nexport type {\n SupportedLocale,\n SDKTranslations,\n} from \"./translations/translation-manager\";\nexport {\n loadTranslations,\n getTranslations,\n normalizeLocale,\n SUPPORTED_LOCALES,\n LOCALE_METADATA,\n DEFAULT_LOCALE,\n} from \"./translations/translation-manager\";\n\n// ============================================\n// DATA TYPES\n// ============================================\n\n// Core data types\nexport type { BannerItem } from \"./types/banner\";\nexport type { ArticleItem } from \"./types/article\";\nexport type { ProductUpdateItem } from \"./types/product-update\";\nexport type { GrowApp, DashboardConfig } from \"./types/dashboard\";\nexport type { IntegrationItem } from \"./types/integration\";\nexport type { PartnerItem } from \"./types/partner\";\nexport type { FloatingCardData } from \"./components/FloatingCard\";\n\n// ============================================\n// UTILITIES (Optional)\n// ============================================\n\n// CLS monitoring (for performance debugging)\nexport {\n CLSMonitor,\n startCLSMonitoring,\n stopCLSMonitoring,\n getCLSMetrics,\n} from \"./utils/cls-monitor\";\nexport type { CLSMetrics, CLSMonitorOptions } from \"./utils/cls-monitor\";\n\n// Campaign tracking\nexport {\n trackCampaignView,\n trackCampaignClick,\n clearViewTrackingCache,\n} from \"./utils/campaignTracking\";\nexport { getSessionId, clearSession, hasSession } from \"./utils/sessionManager\";\nexport { useCampaignTracking, useCampaignVisibility } from \"./hooks/useCampaignTracking\";\nexport { useVisibleFloatingCards } from \"./hooks/useFloatingCards\";\n\n\n// ============================================\n// RECOMMENDED USAGE\n// ============================================\n\n/*\n\n✨ SIMPLE USAGE (Recommended)\n\nimport { TopBanner, WhatsNew, GrowApps } from '@trustshop/shopify-inapp-components';\n\nexport default function Dashboard() {\n return (\n <>\n <TopBanner />\n <WhatsNew />\n <GrowApps />\n </>\n );\n}\n\n🎨 WITH CUSTOMIZATION\n\nimport { TopBanner, WhatsNew } from '@trustshop/shopify-inapp-components';\n\nexport default function Dashboard() {\n return (\n <>\n <TopBanner \n shopInfo={{ id: \"12345\", domain: \"shop.myshopify.com\" }}\n config={{ apiUrl: \"/api/dashboard\" }}\n onClose={() => console.log('Banner closed')}\n />\n <WhatsNew \n locale=\"fr\"\n onProductUpdateClick={(update) => handleUpdate(update)}\n />\n </>\n );\n}\n\n*/\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,+CAA+C;AAC/C,yCAAyC;AACzC,+CAA+C;AAE/C,2DAA2D;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAC;AAU3E,iDAAiD;AAEjD,+CAA+C;AAC/C,oCAAoC;AACpC,+CAA+C;AAE/C,mDAAmD;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAW3C,OAAO,EACL,gBAAgB,EAChB,eAAe,EACf,eAAe,EACf,iBAAiB,EACjB,eAAe,EACf,cAAc,GACf,MAAM,oCAAoC,CAAC;AAe5C,+CAA+C;AAC/C,uBAAuB;AACvB,+CAA+C;AAE/C,6CAA6C;AAC7C,OAAO,EACL,UAAU,EACV,kBAAkB,EAClB,iBAAiB,EACjB,aAAa,GACd,MAAM,qBAAqB,CAAC;AAG7B,oBAAoB;AACpB,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,sBAAsB,GACvB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAChF,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACzF,OAAO,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AAGnE,+CAA+C;AAC/C,oBAAoB;AACpB,+CAA+C;AAE/C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAoCE","sourcesContent":["/**\n * @trustshop/shopify-inapp-components\n *\n * Provider-less component architecture for Shopify in-app dashboards\n * Components work standalone without any provider wrapper required\n */\n\n// ============================================\n// PRIMARY EXPORTS - Component-Driven API\n// ============================================\n\n// Main UI components (auto-initialize, no provider needed)\nexport { TopBanner } from \"./components/TopBanner\";\nexport { WhatsNew } from \"./components/WhatsNew\";\nexport { GrowApps } from \"./components/GrowApps\";\nexport { PopupBanner } from \"./components/PopupBanner\";\nexport { PartnerIntegration } from \"./components/PartnerIntegration\";\nexport { PartnerList } from \"./components/PartnerList\";\nexport { FloatingCard } from \"./components/FloatingCard\";\nexport { FloatingCardContainer } from \"./components/FloatingCardContainer\";\n\n// Component prop types\nexport type { TopBannerProps } from \"./components/TopBanner\";\nexport type { WhatsNewProps } from \"./components/WhatsNew\";\nexport type { GrowAppsProps } from \"./components/GrowApps\";\nexport type { PopupBannerProps } from \"./components/PopupBanner\";\nexport type { PartnerIntegrationProps, IntegrationStatusInfo } from \"./components/PartnerIntegration\";\nexport type { PartnerListProps } from \"./components/PartnerList\";\nexport type { FloatingCardContainerProps } from \"./components/FloatingCardContainer\";\n// FloatingCard props defined inline in component\n\n// ============================================\n// ADVANCED CUSTOMIZATION (Optional)\n// ============================================\n\n// SDK Manager for advanced control (rarely needed)\nexport { SDKManager } from \"./core/SDKManager\";\nexport { useSDK } from \"./core/SDKManager\";\nexport type { UseSDKOptions } from \"./core/SDKManager\";\n\n// Configuration types\nexport type { ShopInfo, SDKInternalConfig } from \"./config/internal-config\";\n\n// Translation types and utilities\nexport type {\n SupportedLocale,\n SDKTranslations,\n} from \"./translations/translation-manager\";\nexport {\n loadTranslations,\n getTranslations,\n normalizeLocale,\n SUPPORTED_LOCALES,\n LOCALE_METADATA,\n DEFAULT_LOCALE,\n} from \"./translations/translation-manager\";\n\n// ============================================\n// DATA TYPES\n// ============================================\n\n// Core data types\nexport type { BannerItem } from \"./types/banner\";\nexport type { ArticleItem } from \"./types/article\";\nexport type { ProductUpdateItem } from \"./types/product-update\";\nexport type { GrowApp, DashboardConfig } from \"./types/dashboard\";\nexport type { IntegrationItem } from \"./types/integration\";\nexport type { PartnerItem } from \"./types/partner\";\nexport type { FloatingCardData } from \"./components/FloatingCard\";\n\n// ============================================\n// UTILITIES (Optional)\n// ============================================\n\n// CLS monitoring (for performance debugging)\nexport {\n CLSMonitor,\n startCLSMonitoring,\n stopCLSMonitoring,\n getCLSMetrics,\n} from \"./utils/cls-monitor\";\nexport type { CLSMetrics, CLSMonitorOptions } from \"./utils/cls-monitor\";\n\n// Campaign tracking\nexport {\n trackCampaignView,\n trackCampaignClick,\n clearViewTrackingCache,\n} from \"./utils/campaignTracking\";\nexport { getSessionId, clearSession, hasSession } from \"./utils/sessionManager\";\nexport { useCampaignTracking, useCampaignVisibility } from \"./hooks/useCampaignTracking\";\nexport { useVisibleFloatingCards } from \"./hooks/useFloatingCards\";\n\n\n// ============================================\n// RECOMMENDED USAGE\n// ============================================\n\n/*\n\n✨ SIMPLE USAGE (Recommended)\n\nimport { TopBanner, WhatsNew, GrowApps } from '@trustshop/shopify-inapp-components';\n\nexport default function Dashboard() {\n return (\n <>\n <TopBanner />\n <WhatsNew />\n <GrowApps />\n </>\n );\n}\n\n🎨 WITH CUSTOMIZATION\n\nimport { TopBanner, WhatsNew } from '@trustshop/shopify-inapp-components';\n\nexport default function Dashboard() {\n return (\n <>\n <TopBanner \n shopInfo={{ id: \"12345\", domain: \"shop.myshopify.com\" }}\n config={{ apiUrl: \"/api/dashboard\" }}\n onClose={() => console.log('Banner closed')}\n />\n <WhatsNew \n locale=\"fr\"\n onProductUpdateClick={(update) => handleUpdate(update)}\n />\n </>\n );\n}\n\n*/\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@datlv-trustshop/shopify-inapp-components",
3
- "version": "0.2.10",
3
+ "version": "0.2.12",
4
4
  "private": false,
5
5
  "description": "React TypeScript components for Shopify in-app dashboard content",
6
6
  "main": "dist/index.js",