@datlv-trustshop/shopify-inapp-components 0.3.4 → 0.3.6

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.
@@ -31,6 +31,8 @@ export interface FloatingCardData {
31
31
  reappear_interval?: number | null;
32
32
  display_pages?: string[];
33
33
  campaign_id?: string | number;
34
+ start_at?: string;
35
+ end_at?: string;
34
36
  }
35
37
  interface FloatingCardProps {
36
38
  data: FloatingCardData;
@@ -1 +1 @@
1
- {"version":3,"file":"FloatingCard.d.ts","sourceRoot":"","sources":["../../src/components/FloatingCard.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAwB,MAAM,OAAO,CAAC;AAc7C,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,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,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,CA2OpD,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;AAc7C,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,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,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;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;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,CA2OpD,CAAC;AAEF,eAAe,YAAY,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"FloatingCard.js","sourceRoot":"","sources":["../../src/components/FloatingCard.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAwB,MAAM,OAAO,CAAC;AAC7C,OAAO,EACL,IAAI,EACJ,UAAU,EACV,WAAW,EACX,IAAI,EACJ,KAAK,EACL,MAAM,EACN,GAAG,GACJ,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AA+CtD,MAAM,CAAC,MAAM,YAAY,GAAgC,CAAC,EACxD,IAAI,EACJ,MAAM,EAAE,WAAW,EACnB,SAAS,EACT,eAAe,EACf,iBAAiB,EACjB,QAAQ,GAAG,cAAc,EACzB,eAAe,GAAG,IAAI,GACvB,EAAE,EAAE;IACH,MAAM,GAAG,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC;IACvB,MAAM,aAAa,GAAG,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC;IACvC,MAAM,MAAM,GAAG,WAAW,IAAI,aAAa,CAAC;IAE5C,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,EAAE,CAAC;IAE/C,MAAM,QAAQ,GACZ,MAAM,IAAI,UAAU;QAClB,CAAC,CAAC,mBAAmB,CAAC;YAClB,MAAM;YACN,UAAU;YACV,SAAS,EAAE,GAAG;YACd,kBAAkB,EAAE,IAAI;YACxB,QAAQ,EAAE;gBACR,SAAS,EAAE,IAAI,CAAC,IAAI;gBACpB,QAAQ,EAAE,IAAI,CAAC,GAAG;aACnB;SACF,CAAC;QACJ,CAAC,CAAC,IAAI,CAAC;IACX,MAAM,mBAAmB,GAAG,GAAG,EAAE;QAC/B,QAAQ,EAAE,kBAAkB,EAAE,CAAC;QAE/B,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,eAAe,EAAE,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,qBAAqB,GAAG,GAAG,EAAE;QACjC,QAAQ,EAAE,oBAAoB,EAAE,CAAC;QACjC,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC1B,iBAAiB,EAAE,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,aAAa,GAAG,GAAG,EAAE;QACzB,QAAQ,EAAE,YAAY,EAAE,CAAC;QACzB,SAAS,EAAE,EAAE,CAAC;IAChB,CAAC,CAAC;IAEF,MAAM,kBAAkB,GAAkB;QACxC,QAAQ,EAAE,OAAO;QACjB,MAAM,EAAE,IAAI;QACZ,KAAK,EAAE,OAAO;QACd,OAAO,EAAE,MAAM;QACf,aAAa,EAAE,QAAQ;QACvB,UAAU,EAAE,YAAY;QACxB,YAAY,EAAE,KAAK;QACnB,SAAS,EAAE,kCAAkC;QAC7C,QAAQ,EAAE,QAAQ;QAClB,SAAS,EAAE,yBAAyB;QACpC,GAAG,CAAC,QAAQ,KAAK,cAAc,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;QACrE,GAAG,CAAC,QAAQ,KAAK,aAAa,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QACnE,GAAG,CAAC,QAAQ,KAAK,WAAW,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;QAC/D,GAAG,CAAC,QAAQ,KAAK,UAAU,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;KAC9D,CAAC;IAEF,MAAM,iBAAiB,GAAkB;QACvC,OAAO,EAAE,MAAM;QACf,MAAM,EAAE,MAAM;QACd,KAAK,EAAE,MAAM;QACb,OAAO,EAAE,QAAQ;QACjB,cAAc,EAAE,QAAQ;QACxB,UAAU,EAAE,QAAQ;QACpB,GAAG,EAAE,QAAQ;QACb,QAAQ,EAAE,UAAU;QACpB,KAAK,EAAE,KAAK;QACZ,GAAG,EAAE,KAAK;QACV,YAAY,EAAE,QAAQ;QACtB,MAAM,EAAE,mCAAmC;QAC3C,UAAU,EAAE,MAAM;QAClB,MAAM,EAAE,SAAS;QACjB,UAAU,EAAE,eAAe;QAC3B,MAAM,EAAE,EAAE;QACV,SAAS,EAAE,8BAA8B;KAC1C,CAAC;IAEF,MAAM,oBAAoB,GAAkB;QAC1C,QAAQ,EAAE,UAAU;QACpB,MAAM,EAAE,UAAU;QAClB,WAAW,EAAE,MAAM;QACnB,KAAK,EAAE,MAAM;QACb,QAAQ,EAAE,QAAQ;QAClB,YAAY,EAAE,aAAa;QAC3B,eAAe,EAAE,SAAS;KAC3B,CAAC;IAEF,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,MAAM,OAAO,GAAG,0BAA0B,CAAC;QAC3C,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC;YACtC,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;YAC9C,KAAK,CAAC,EAAE,GAAG,OAAO,CAAC;YACnB,KAAK,CAAC,SAAS,GAAG;;;;;;;;;;;;;;;OAejB,CAAC;YACF,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QACnC,CAAC;IACH,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO,CACL,cAAK,GAAG,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAE,kBAAkB,YACvD,MAAC,IAAI,IAAC,OAAO,EAAC,GAAG,EAAC,YAAY,EAAC,IAAI,aAChC,eAAe,IAAI,IAAI,CAAC,WAAW,KAAK,KAAK,IAAI,CAChD,iBACE,KAAK,EAAE,iBAAiB,EACxB,OAAO,EAAE,aAAa,gBACX,OAAO,YAElB,cACE,KAAK,EAAC,4BAA4B,EAClC,KAAK,EAAC,IAAI,EACV,MAAM,EAAC,IAAI,EACX,OAAO,EAAC,WAAW,EACnB,IAAI,EAAC,SAAS,YAEd,eACE,CAAC,EAAC,mjBAAmjB,EACrjB,IAAI,EAAC,SAAS,GACd,GACE,GACC,CACV,EAED,MAAC,UAAU,IAAC,GAAG,EAAC,GAAG,aAChB,IAAI,CAAC,OAAO,IAAI,CACf,cAAK,KAAK,EAAE,oBAAoB,YAC9B,cACE,GAAG,EAAE,IAAI,CAAC,OAAO,EACjB,GAAG,EAAE,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,KAAK,EACjC,KAAK,EAAE;oCACL,KAAK,EAAE,MAAM;oCACb,MAAM,EAAE,MAAM;oCACd,SAAS,EAAE,OAAO;iCACnB,EACD,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE;oCACb,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;oCACpD,CAAC,CAAC,MAA2B,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;gCACxD,CAAC,GACD,GACE,CACP,EAED,KAAC,GAAG,IAAC,OAAO,EAAC,KAAK,YAChB,MAAC,UAAU,IAAC,GAAG,EAAC,KAAK,aACnB,MAAC,UAAU,IAAC,GAAG,EAAC,KAAK,aACnB,eACE,KAAK,EAAE;oDACL,OAAO,EAAE,MAAM;oDACf,aAAa,EAAE,QAAQ;oDACvB,GAAG,EAAE,KAAK;iDACX,aAED,eACE,KAAK,EAAE;4DACL,OAAO,EAAE,MAAM;4DACf,aAAa,EAAE,QAAQ;4DACvB,GAAG,EAAE,KAAK;4DACV,UAAU,EAAE,OAAO;yDACpB,aAEA,IAAI,CAAC,GAAG,IAAI,CACX,KAAC,KAAK;4DACJ,oCAAoC;;gEAApC,oCAAoC;gEACpC,IAAI,EAAC,SAAS,YAEb,IAAI,CAAC,GAAG,CAAC,KAAK,GACT,CACT,EACD,KAAC,IAAI,IAAC,EAAE,EAAC,IAAI,EAAC,OAAO,EAAC,QAAQ,EAAC,UAAU,EAAC,UAAU,YACjD,IAAI,CAAC,KAAK,GACN,IACH,EAEL,IAAI,CAAC,IAAI,IAAI,CACZ,KAAC,IAAI,IAAC,EAAE,EAAC,GAAG,EAAC,OAAO,EAAC,QAAQ,YAC1B,IAAI,CAAC,IAAI,GACL,CACR,IACG,EAEN,KAAC,IAAI,IAAC,EAAE,EAAC,GAAG,EAAC,OAAO,EAAC,QAAQ,YAC1B,IAAI,CAAC,WAAW,GACZ,IACI,EACb,MAAC,WAAW,IAAC,GAAG,EAAC,KAAK,aACnB,IAAI,CAAC,cAAc,IAAI,CACtB,KAAC,MAAM,IACL,IAAI,EAAE,YAAY,EAClB,OAAO,EACL,IAAI,CAAC,cAAc,CAAC,OAAO,KAAK,SAAS;oDACvC,CAAC,CAAC,SAAS;oDACX,CAAC,CAAC,OAAO,EAEb,OAAO,EAAE,mBAAmB,YAE3B,IAAI,CAAC,cAAc,CAAC,KAAK,GACnB,CACV,EACA,IAAI,CAAC,gBAAgB,IAAI,CACxB,KAAC,MAAM,IAAC,OAAO,EAAC,UAAU,EAAC,OAAO,EAAE,qBAAqB,YACtD,IAAI,CAAC,gBAAgB,CAAC,KAAK,GACrB,CACV,IACW,IACH,GACT,IACK,IACR,GACH,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,YAAY,CAAC","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\";\nimport { ExternalIcon } from \"@shopify/polaris-icons\";\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 | null;\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;\n}\n\ninterface FloatingCardProps {\n data: FloatingCardData;\n shopId?: string;\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 const sdk = useSDK({});\n const contextShopId = sdk.shopInfo?.id;\n const shopId = propsShopId || contextShopId;\n\n if (!data) {\n return null;\n }\n\n const campaignId = data.campaign_id || data.id;\n\n const tracking =\n shopId && campaignId\n ? useCampaignTracking({\n shopId,\n campaignId,\n threshold: 0.5,\n visibilityDuration: 1000,\n metadata: {\n card_type: data.type,\n card_key: data.key,\n },\n })\n : null;\n const handlePrimaryAction = () => {\n tracking?.trackPrimaryAction();\n\n if (data.primary_action) {\n onPrimaryAction?.(data);\n }\n };\n\n const handleSecondaryAction = () => {\n tracking?.trackSecondaryAction();\n if (data.secondary_action) {\n onSecondaryAction?.(data);\n }\n };\n\n const handleDismiss = () => {\n tracking?.trackDismiss();\n onDismiss?.();\n };\n\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 height: \"28px\",\n width: \"28px\",\n padding: \"8.75px\",\n justifyContent: \"center\",\n alignItems: \"center\",\n gap: \"8.75px\",\n position: \"absolute\",\n right: \"7px\",\n top: \"7px\",\n borderRadius: \"7875px\",\n border: \"1.167px solid rgba(0, 0, 0, 0.08)\",\n background: \"#FFF\",\n cursor: \"pointer\",\n transition: \"all 0.2s ease\",\n zIndex: 10,\n boxShadow: \"0 2px 4px rgba(0, 0, 0, 0.1)\",\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 React.useEffect(() => {\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 <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"10\"\n height=\"10\"\n viewBox=\"0 0 10 10\"\n fill=\"#111111\"\n >\n <path\n d=\"M8.06721 8.99529C8.32349 9.25157 8.73901 9.25157 8.99529 8.99529C9.25157 8.73901 9.25157 8.32349 8.99529 8.06721L5.52183 4.59375L8.99529 1.12029C9.25157 0.864008 9.25157 0.448493 8.99529 0.192212C8.73901 -0.06407 8.32349 -0.06407 8.06721 0.192212L4.59375 3.66567L1.12029 0.192211C0.864007 -0.0640704 0.448493 -0.0640704 0.192211 0.192211C-0.0640704 0.448493 -0.0640705 0.864007 0.192211 1.12029L3.66567 4.59375L0.192212 8.06721C-0.06407 8.32349 -0.06407 8.73901 0.192212 8.99529C0.448493 9.25157 0.864008 9.25157 1.12029 8.99529L4.59375 5.52183L8.06721 8.99529Z\"\n fill=\"#111111\"\n />\n </svg>\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\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"6px\",\n alignItems: \"start\",\n }}\n >\n {data.tag && (\n <Badge\n // tone={data.tag.tone || \"success\"}\n tone=\"success\"\n >\n {data.tag.label}\n </Badge>\n )}\n <Text as=\"h2\" variant=\"bodyLg\" fontWeight=\"semibold\">\n {data.title}\n </Text>\n </div>\n\n {data.date && (\n <Text as=\"p\" variant=\"bodySm\">\n {data.date}\n </Text>\n )}\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 icon={ExternalIcon}\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\";\nimport { ExternalIcon } from \"@shopify/polaris-icons\";\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 | null;\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;\n start_at?: string;\n end_at?: string;\n}\n\ninterface FloatingCardProps {\n data: FloatingCardData;\n shopId?: string;\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 const sdk = useSDK({});\n const contextShopId = sdk.shopInfo?.id;\n const shopId = propsShopId || contextShopId;\n\n if (!data) {\n return null;\n }\n\n const campaignId = data.campaign_id || data.id;\n\n const tracking =\n shopId && campaignId\n ? useCampaignTracking({\n shopId,\n campaignId,\n threshold: 0.5,\n visibilityDuration: 1000,\n metadata: {\n card_type: data.type,\n card_key: data.key,\n },\n })\n : null;\n const handlePrimaryAction = () => {\n tracking?.trackPrimaryAction();\n\n if (data.primary_action) {\n onPrimaryAction?.(data);\n }\n };\n\n const handleSecondaryAction = () => {\n tracking?.trackSecondaryAction();\n if (data.secondary_action) {\n onSecondaryAction?.(data);\n }\n };\n\n const handleDismiss = () => {\n tracking?.trackDismiss();\n onDismiss?.();\n };\n\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 height: \"28px\",\n width: \"28px\",\n padding: \"8.75px\",\n justifyContent: \"center\",\n alignItems: \"center\",\n gap: \"8.75px\",\n position: \"absolute\",\n right: \"7px\",\n top: \"7px\",\n borderRadius: \"7875px\",\n border: \"1.167px solid rgba(0, 0, 0, 0.08)\",\n background: \"#FFF\",\n cursor: \"pointer\",\n transition: \"all 0.2s ease\",\n zIndex: 10,\n boxShadow: \"0 2px 4px rgba(0, 0, 0, 0.1)\",\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 React.useEffect(() => {\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 <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"10\"\n height=\"10\"\n viewBox=\"0 0 10 10\"\n fill=\"#111111\"\n >\n <path\n d=\"M8.06721 8.99529C8.32349 9.25157 8.73901 9.25157 8.99529 8.99529C9.25157 8.73901 9.25157 8.32349 8.99529 8.06721L5.52183 4.59375L8.99529 1.12029C9.25157 0.864008 9.25157 0.448493 8.99529 0.192212C8.73901 -0.06407 8.32349 -0.06407 8.06721 0.192212L4.59375 3.66567L1.12029 0.192211C0.864007 -0.0640704 0.448493 -0.0640704 0.192211 0.192211C-0.0640704 0.448493 -0.0640705 0.864007 0.192211 1.12029L3.66567 4.59375L0.192212 8.06721C-0.06407 8.32349 -0.06407 8.73901 0.192212 8.99529C0.448493 9.25157 0.864008 9.25157 1.12029 8.99529L4.59375 5.52183L8.06721 8.99529Z\"\n fill=\"#111111\"\n />\n </svg>\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\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"6px\",\n alignItems: \"start\",\n }}\n >\n {data.tag && (\n <Badge\n // tone={data.tag.tone || \"success\"}\n tone=\"success\"\n >\n {data.tag.label}\n </Badge>\n )}\n <Text as=\"h2\" variant=\"bodyLg\" fontWeight=\"semibold\">\n {data.title}\n </Text>\n </div>\n\n {data.date && (\n <Text as=\"p\" variant=\"bodySm\">\n {data.date}\n </Text>\n )}\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 icon={ExternalIcon}\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"]}
@@ -31,6 +31,8 @@ export interface MarketingCampaignData {
31
31
  };
32
32
  dismissible: boolean;
33
33
  campaign_id?: string | number;
34
+ start_at?: string;
35
+ end_at?: string;
34
36
  }
35
37
  export interface MarketingCampaignCardProps {
36
38
  shopId?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"MarketingCampaignCard.d.ts","sourceRoot":"","sources":["../../src/components/MarketingCampaignCard.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA8B,MAAM,OAAO,CAAC;AAkBnD,MAAM,WAAW,qBAAqB;IACpC,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,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,SAAS,GAAG,MAAM,GAAG,SAAS,GAAG,UAAU,GAAG,KAAK,CAAC;IACjE,GAAG,CAAC,EAAE;QACJ,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,CAAC,EAAE,SAAS,GAAG,MAAM,GAAG,SAAS,GAAG,UAAU,GAAG,KAAK,GAAG,SAAS,CAAC;KACxE,CAAC;IACF,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,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,CAAC,EAAE,SAAS,GAAG,WAAW,CAAC;KACnC,CAAC;IACF,gBAAgB,CAAC,EAAE;QACjB,KAAK,EAAE,MAAM,CAAC;QACd,GAAG,EAAE,MAAM,CAAC;QACZ,QAAQ,EAAE,OAAO,CAAC;QAClB,OAAO,CAAC,EAAE,SAAS,GAAG,WAAW,CAAC;KACnC,CAAC;IACF,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,0BAA0B;IACzC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,qBAAqB,KAAK,IAAI,CAAC;IAClD,eAAe,CAAC,EAAE,CAAC,IAAI,EAAE,qBAAqB,KAAK,IAAI,CAAC;IACxD,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE,qBAAqB,KAAK,IAAI,CAAC;CAC3D;AAED,eAAO,MAAM,qBAAqB,EAAE,KAAK,CAAC,EAAE,CAAC,0BAA0B,CAsYtE,CAAC;AAEF,eAAe,qBAAqB,CAAC"}
1
+ {"version":3,"file":"MarketingCampaignCard.d.ts","sourceRoot":"","sources":["../../src/components/MarketingCampaignCard.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA8B,MAAM,OAAO,CAAC;AAsBnD,MAAM,WAAW,qBAAqB;IACpC,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,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,SAAS,GAAG,MAAM,GAAG,SAAS,GAAG,UAAU,GAAG,KAAK,CAAC;IACjE,GAAG,CAAC,EAAE;QACJ,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,CAAC,EAAE,SAAS,GAAG,MAAM,GAAG,SAAS,GAAG,UAAU,GAAG,KAAK,GAAG,SAAS,CAAC;KACxE,CAAC;IACF,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,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,CAAC,EAAE,SAAS,GAAG,WAAW,CAAC;KACnC,CAAC;IACF,gBAAgB,CAAC,EAAE;QACjB,KAAK,EAAE,MAAM,CAAC;QACd,GAAG,EAAE,MAAM,CAAC;QACZ,QAAQ,EAAE,OAAO,CAAC;QAClB,OAAO,CAAC,EAAE,SAAS,GAAG,WAAW,CAAC;KACnC,CAAC;IACF,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,0BAA0B;IACzC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,qBAAqB,KAAK,IAAI,CAAC;IAClD,eAAe,CAAC,EAAE,CAAC,IAAI,EAAE,qBAAqB,KAAK,IAAI,CAAC;IACxD,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE,qBAAqB,KAAK,IAAI,CAAC;CAC3D;AAED,eAAO,MAAM,qBAAqB,EAAE,KAAK,CAAC,EAAE,CAAC,0BAA0B,CAgRtE,CAAC;AAEF,eAAe,qBAAqB,CAAC"}
@@ -1,19 +1,17 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import React, { useState, useEffect } from "react";
2
+ import { useState, useEffect } from "react";
3
3
  import { Card, BlockStack, InlineGrid, Text, Button, Box, Badge, InlineStack, Icon, Popover, ActionList, } from "@shopify/polaris";
4
- import { MenuHorizontalIcon, XIcon } from "@shopify/polaris-icons";
4
+ import { MenuHorizontalIcon, XIcon, ExternalIcon, } from "@shopify/polaris-icons";
5
5
  import { useCampaignTracking } from "../hooks/useCampaignTracking";
6
- import { useSDK } from "../core/SDKManager";
7
- export const MarketingCampaignCard = ({ shopId: propsShopId, locale = "en", onDismiss, onPrimaryAction, onSecondaryAction, }) => {
8
- const [campaignData, setCampaignData] = useState(null);
9
- const [loading, setLoading] = useState(true);
10
- const [isDismissed, setIsDismissed] = useState(false);
6
+ import { useMarketingCampaign } from "../hooks/useMarketingCampaign";
7
+ export const MarketingCampaignCard = ({ shopId: propsShopId, locale, onDismiss, onPrimaryAction, onSecondaryAction, }) => {
11
8
  const [isHovered, setIsHovered] = useState(false);
12
9
  const [popoverActive, setPopoverActive] = useState(false);
13
- const sdk = useSDK({});
14
- const contextShopId = sdk.shopInfo?.id;
15
- const shopId = propsShopId || contextShopId;
16
- const currentLocale = locale || sdk.locale || "en";
10
+ const { campaignData, loading, isDismissed, dismissCampaign } = useMarketingCampaign({
11
+ shopId: propsShopId,
12
+ locale,
13
+ });
14
+ const shopId = propsShopId || "";
17
15
  const tracking = useCampaignTracking(shopId && campaignData
18
16
  ? {
19
17
  shopId,
@@ -31,90 +29,6 @@ export const MarketingCampaignCard = ({ shopId: propsShopId, locale = "en", onDi
31
29
  threshold: 0.5,
32
30
  visibilityDuration: 1000,
33
31
  });
34
- useEffect(() => {
35
- const fetchCampaignData = async () => {
36
- if (!shopId) {
37
- setLoading(false);
38
- return;
39
- }
40
- try {
41
- setLoading(true);
42
- let baseUrl;
43
- if (sdk.config?.apiUrl) {
44
- const configUrl = sdk.config.apiUrl;
45
- if (configUrl.includes("/dashboard")) {
46
- baseUrl = configUrl.replace("/dashboard", "");
47
- }
48
- else {
49
- baseUrl = configUrl;
50
- }
51
- }
52
- else {
53
- baseUrl =
54
- typeof window !== "undefined" &&
55
- window.location.hostname === "localhost"
56
- ? "/api"
57
- : "https://ops.trustshop.io/api";
58
- }
59
- const apiUrl = `${baseUrl}/campaigns?shop_id=${shopId}&locale=${currentLocale}`;
60
- const response = await fetch(apiUrl, {
61
- method: "GET",
62
- headers: {
63
- Accept: "application/json",
64
- "Content-Type": "application/json",
65
- "Accept-Language": currentLocale,
66
- ...(sdk.config?.headers || {}),
67
- },
68
- credentials: "include",
69
- });
70
- if (!response.ok) {
71
- throw new Error(`Failed to fetch campaigns: ${response.statusText}`);
72
- }
73
- const data = await response.json();
74
- if (data.success && Array.isArray(data.data) && data.data.length > 0) {
75
- const marketingCampaigns = data.data.filter((campaign) => campaign.type === "marketing-card");
76
- if (marketingCampaigns.length > 0) {
77
- const campaign = marketingCampaigns[0];
78
- const dismissKey = `trustshop_marketing_campaign_dismissed_${campaign.key || campaign.id}`;
79
- try {
80
- const dismissedData = localStorage.getItem(dismissKey);
81
- if (dismissedData) {
82
- const parsed = JSON.parse(dismissedData);
83
- const sevenDaysAgo = Date.now() - 7 * 24 * 60 * 60 * 1000;
84
- if (parsed.timestamp > sevenDaysAgo) {
85
- setIsDismissed(true);
86
- return;
87
- }
88
- }
89
- }
90
- catch (error) {
91
- console.error("Failed to check dismiss state:", error);
92
- }
93
- setCampaignData(campaign);
94
- }
95
- }
96
- }
97
- catch (err) {
98
- console.error("Failed to fetch marketing campaign:", err);
99
- }
100
- finally {
101
- setLoading(false);
102
- }
103
- };
104
- fetchCampaignData();
105
- const handleCampaignsRefresh = (event) => {
106
- if (event.detail?.data && Array.isArray(event.detail.data)) {
107
- const marketingCampaigns = event.detail.data.filter((campaign) => campaign.type === "marketing-card");
108
- if (marketingCampaigns.length > 0) {
109
- setCampaignData(marketingCampaigns[0]);
110
- }
111
- }
112
- };
113
- window.addEventListener("trustshop-campaigns-refresh", handleCampaignsRefresh);
114
- return () => {
115
- window.removeEventListener("trustshop-campaigns-refresh", handleCampaignsRefresh);
116
- };
117
- }, [shopId, currentLocale, sdk.config]);
118
32
  const handlePrimaryAction = () => {
119
33
  tracking?.trackPrimaryAction();
120
34
  if (campaignData?.primary_action) {
@@ -129,27 +43,12 @@ export const MarketingCampaignCard = ({ shopId: propsShopId, locale = "en", onDi
129
43
  };
130
44
  const handleDismiss = () => {
131
45
  tracking?.trackDismiss();
132
- setIsDismissed(true);
133
46
  setPopoverActive(false);
134
- if (campaignData) {
135
- const dismissKey = `trustshop_marketing_campaign_dismissed_${campaignData.key || campaignData.id}`;
136
- const dismissData = {
137
- timestamp: Date.now(),
138
- dismissed: true,
139
- campaignId: campaignData.id,
140
- campaignKey: campaignData.key,
141
- };
142
- try {
143
- localStorage.setItem(dismissKey, JSON.stringify(dismissData));
144
- }
145
- catch (error) {
146
- console.error("Failed to save dismiss state:", error);
147
- }
148
- }
47
+ dismissCampaign();
149
48
  onDismiss?.(campaignData);
150
49
  };
151
50
  const togglePopoverActive = () => setPopoverActive((active) => !active);
152
- React.useEffect(() => {
51
+ useEffect(() => {
153
52
  const styleId = "marketing-campaign-responsive";
154
53
  if (!document.getElementById(styleId)) {
155
54
  const style = document.createElement("style");
@@ -179,6 +78,7 @@ export const MarketingCampaignCard = ({ shopId: propsShopId, locale = "en", onDi
179
78
  }
180
79
  };
181
80
  }, []);
81
+ // Return null if loading, no data, or dismissed
182
82
  if (loading || !campaignData || isDismissed) {
183
83
  return null;
184
84
  }
@@ -190,7 +90,7 @@ export const MarketingCampaignCard = ({ shopId: propsShopId, locale = "en", onDi
190
90
  xl: ["twoThirds", "oneThird"],
191
91
  }, gap: "1000", children: [_jsx("div", { className: "marketing-campaign-content", children: _jsx(Box, { paddingInline: { xs: "200", sm: "200", md: "300" }, children: _jsxs(BlockStack, { gap: "300", children: [_jsxs(BlockStack, { gap: "100", children: [_jsx(Box, { children: campaignData.tag?.label && (_jsx(Badge, { tone: campaignData.tag.tone === "primary"
192
92
  ? "success"
193
- : campaignData.tag.tone || "success", children: campaignData.tag.label })) }), _jsxs(BlockStack, { gap: "100", children: [_jsx(Text, { as: "h2", variant: "headingLg", fontWeight: "bold", children: campaignData.title }), campaignData.subtitle && (_jsx(Text, { as: "p", variant: "headingXl", fontWeight: "bold", children: campaignData.subtitle })), _jsx(Text, { as: "p", variant: "bodyMd", tone: "subdued", children: campaignData.description })] })] }), _jsxs(InlineStack, { gap: "200", children: [campaignData.primary_action && (_jsx(Button, { variant: "primary", onClick: handlePrimaryAction, children: campaignData.primary_action.label })), campaignData.secondary_action && (_jsx(Button, { onClick: handleSecondaryAction, children: campaignData.secondary_action.label }))] })] }) }) }), _jsx("div", { className: "marketing-campaign-image", children: _jsxs(Box, { padding: "0", position: "relative", minHeight: "200", children: [campaignData.dismissible && isHovered && (_jsx("div", { style: {
93
+ : campaignData.tag.tone || "success", children: campaignData.tag.label })) }), _jsxs(BlockStack, { gap: "100", children: [_jsx(Text, { as: "h2", variant: "headingLg", fontWeight: "bold", children: campaignData.title }), campaignData.subtitle && (_jsx(Text, { as: "p", variant: "headingXl", fontWeight: "bold", children: campaignData.subtitle })), _jsx(Text, { as: "p", variant: "bodyMd", tone: "subdued", children: campaignData.description })] })] }), _jsxs(InlineStack, { gap: "200", children: [campaignData.primary_action && (_jsx(Button, { variant: "primary", onClick: handlePrimaryAction, icon: ExternalIcon, children: campaignData.primary_action.label })), campaignData.secondary_action && (_jsx(Button, { onClick: handleSecondaryAction, children: campaignData.secondary_action.label }))] })] }) }) }), _jsx("div", { className: "marketing-campaign-image", children: _jsxs(Box, { padding: "0", position: "relative", minHeight: "200", children: [campaignData.dismissible && isHovered && (_jsx("div", { style: {
194
94
  position: "absolute",
195
95
  right: "-5px",
196
96
  top: "-5px",
@@ -1 +1 @@
1
- {"version":3,"file":"MarketingCampaignCard.js","sourceRoot":"","sources":["../../src/components/MarketingCampaignCard.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useState, useEffect } from \"react\";\nimport {\n Card,\n BlockStack,\n InlineGrid,\n Text,\n Button,\n Box,\n Badge,\n InlineStack,\n Icon,\n Popover,\n ActionList,\n} from \"@shopify/polaris\";\nimport { MenuHorizontalIcon, XIcon } from \"@shopify/polaris-icons\";\nimport { useCampaignTracking } from \"../hooks/useCampaignTracking\";\nimport { useSDK } from \"../core/SDKManager\";\n\nexport interface MarketingCampaignData {\n id: number;\n key: string;\n type: string;\n priority: number;\n title: string;\n subtitle?: string;\n description: string;\n badge_text?: string;\n badge_tone?: \"success\" | \"info\" | \"warning\" | \"critical\" | \"new\";\n tag?: {\n label: string;\n tone?: \"success\" | \"info\" | \"warning\" | \"critical\" | \"new\" | \"primary\";\n };\n highlight_text?: string;\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 campaign_id?: string | number;\n}\n\nexport interface MarketingCampaignCardProps {\n shopId?: string;\n locale?: string;\n onDismiss?: (data: MarketingCampaignData) => void;\n onPrimaryAction?: (data: MarketingCampaignData) => void;\n onSecondaryAction?: (data: MarketingCampaignData) => void;\n}\n\nexport const MarketingCampaignCard: React.FC<MarketingCampaignCardProps> = ({\n shopId: propsShopId,\n locale = \"en\",\n onDismiss,\n onPrimaryAction,\n onSecondaryAction,\n}) => {\n const [campaignData, setCampaignData] =\n useState<MarketingCampaignData | null>(null);\n const [loading, setLoading] = useState(true);\n const [isDismissed, setIsDismissed] = useState(false);\n const [isHovered, setIsHovered] = useState(false);\n const [popoverActive, setPopoverActive] = useState(false);\n\n const sdk = useSDK({});\n const contextShopId = sdk.shopInfo?.id;\n const shopId = propsShopId || contextShopId;\n const currentLocale = locale || sdk.locale || \"en\";\n\n const tracking = useCampaignTracking(\n shopId && campaignData\n ? {\n shopId,\n campaignId: campaignData.campaign_id || campaignData.id,\n threshold: 0.5,\n visibilityDuration: 1000,\n metadata: {\n card_type: campaignData.type,\n card_key: campaignData.key,\n },\n }\n : {\n shopId: \"\",\n campaignId: \"\",\n threshold: 0.5,\n visibilityDuration: 1000,\n },\n );\n\n useEffect(() => {\n const fetchCampaignData = async () => {\n if (!shopId) {\n setLoading(false);\n return;\n }\n\n try {\n setLoading(true);\n\n let baseUrl: string;\n if (sdk.config?.apiUrl) {\n const configUrl = sdk.config.apiUrl;\n if (configUrl.includes(\"/dashboard\")) {\n baseUrl = configUrl.replace(\"/dashboard\", \"\");\n } else {\n baseUrl = configUrl;\n }\n } else {\n baseUrl =\n typeof window !== \"undefined\" &&\n window.location.hostname === \"localhost\"\n ? \"/api\"\n : \"https://ops.trustshop.io/api\";\n }\n\n const apiUrl = `${baseUrl}/campaigns?shop_id=${shopId}&locale=${currentLocale}`;\n\n const response = await fetch(apiUrl, {\n method: \"GET\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n \"Accept-Language\": currentLocale,\n ...(sdk.config?.headers || {}),\n },\n credentials: \"include\",\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch campaigns: ${response.statusText}`);\n }\n\n const data = await response.json();\n\n if (data.success && Array.isArray(data.data) && data.data.length > 0) {\n const marketingCampaigns = data.data.filter(\n (campaign: any) => campaign.type === \"marketing-card\",\n );\n\n if (marketingCampaigns.length > 0) {\n const campaign = marketingCampaigns[0];\n\n const dismissKey = `trustshop_marketing_campaign_dismissed_${campaign.key || campaign.id}`;\n try {\n const dismissedData = localStorage.getItem(dismissKey);\n if (dismissedData) {\n const parsed = JSON.parse(dismissedData);\n const sevenDaysAgo = Date.now() - 7 * 24 * 60 * 60 * 1000;\n if (parsed.timestamp > sevenDaysAgo) {\n setIsDismissed(true);\n return;\n }\n }\n } catch (error) {\n console.error(\"Failed to check dismiss state:\", error);\n }\n\n setCampaignData(campaign);\n }\n }\n } catch (err) {\n console.error(\"Failed to fetch marketing campaign:\", err);\n } finally {\n setLoading(false);\n }\n };\n\n fetchCampaignData();\n\n const handleCampaignsRefresh = (event: CustomEvent) => {\n if (event.detail?.data && Array.isArray(event.detail.data)) {\n const marketingCampaigns = event.detail.data.filter(\n (campaign: any) => campaign.type === \"marketing-card\",\n );\n\n if (marketingCampaigns.length > 0) {\n setCampaignData(marketingCampaigns[0]);\n }\n }\n };\n\n window.addEventListener(\n \"trustshop-campaigns-refresh\",\n handleCampaignsRefresh as EventListener,\n );\n\n return () => {\n window.removeEventListener(\n \"trustshop-campaigns-refresh\",\n handleCampaignsRefresh as EventListener,\n );\n };\n }, [shopId, currentLocale, sdk.config]);\n\n const handlePrimaryAction = () => {\n tracking?.trackPrimaryAction();\n\n if (campaignData?.primary_action) {\n onPrimaryAction?.(campaignData);\n }\n };\n\n const handleSecondaryAction = () => {\n tracking?.trackSecondaryAction();\n\n if (campaignData?.secondary_action) {\n onSecondaryAction?.(campaignData);\n }\n };\n\n const handleDismiss = () => {\n tracking?.trackDismiss();\n setIsDismissed(true);\n setPopoverActive(false);\n\n if (campaignData) {\n const dismissKey = `trustshop_marketing_campaign_dismissed_${campaignData.key || campaignData.id}`;\n const dismissData = {\n timestamp: Date.now(),\n dismissed: true,\n campaignId: campaignData.id,\n campaignKey: campaignData.key,\n };\n\n try {\n localStorage.setItem(dismissKey, JSON.stringify(dismissData));\n } catch (error) {\n console.error(\"Failed to save dismiss state:\", error);\n }\n }\n\n onDismiss?.(campaignData!);\n };\n\n const togglePopoverActive = () => setPopoverActive((active) => !active);\n\n React.useEffect(() => {\n const styleId = \"marketing-campaign-responsive\";\n if (!document.getElementById(styleId)) {\n const style = document.createElement(\"style\");\n style.id = styleId;\n style.innerHTML = `\n @media (max-width: 768px) {\n .marketing-campaign-grid {\n display: flex !important;\n flex-direction: column !important;\n }\n .marketing-campaign-content {\n order: 2;\n }\n .marketing-campaign-image {\n order: 1;\n padding: 16px 16px 0 16px !important;\n }\n }\n `;\n document.head.appendChild(style);\n }\n return () => {\n const existingStyle = document.getElementById(styleId);\n if (\n existingStyle &&\n document.querySelectorAll(\".marketing-campaign-grid\").length === 0\n ) {\n existingStyle.remove();\n }\n };\n }, []);\n\n if (loading || !campaignData || isDismissed) {\n return null;\n }\n\n return (\n <div\n ref={tracking?.elementRef}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n style={{ position: \"relative\" }}\n >\n <Card>\n <div className=\"marketing-campaign-grid\">\n <InlineGrid\n columns={{\n xs: 1,\n sm: 1,\n md: [\"twoThirds\", \"oneThird\"],\n lg: [\"twoThirds\", \"oneThird\"],\n xl: [\"twoThirds\", \"oneThird\"],\n }}\n gap=\"1000\"\n >\n <div className=\"marketing-campaign-content\">\n <Box paddingInline={{ xs: \"200\", sm: \"200\", md: \"300\" }}>\n <BlockStack gap=\"300\">\n <BlockStack gap=\"100\">\n <Box>\n {campaignData.tag?.label && (\n <Badge\n tone={\n campaignData.tag.tone === \"primary\"\n ? \"success\"\n : (campaignData.tag.tone as any) || \"success\"\n }\n >\n {campaignData.tag.label}\n </Badge>\n )}\n </Box>\n\n <BlockStack gap=\"100\">\n <Text as=\"h2\" variant=\"headingLg\" fontWeight=\"bold\">\n {campaignData.title}\n </Text>\n\n {campaignData.subtitle && (\n <Text as=\"p\" variant=\"headingXl\" fontWeight=\"bold\">\n {campaignData.subtitle}\n </Text>\n )}\n\n <Text as=\"p\" variant=\"bodyMd\" tone=\"subdued\">\n {campaignData.description}\n </Text>\n </BlockStack>\n </BlockStack>\n\n <InlineStack gap=\"200\">\n {campaignData.primary_action && (\n <Button variant=\"primary\" onClick={handlePrimaryAction}>\n {campaignData.primary_action.label}\n </Button>\n )}\n\n {campaignData.secondary_action && (\n <Button onClick={handleSecondaryAction}>\n {campaignData.secondary_action.label}\n </Button>\n )}\n </InlineStack>\n </BlockStack>\n </Box>\n </div>\n\n <div className=\"marketing-campaign-image\">\n <Box padding=\"0\" position=\"relative\" minHeight=\"200\">\n {campaignData.dismissible && isHovered && (\n <div\n style={{\n position: \"absolute\",\n right: \"-5px\",\n top: \"-5px\",\n zIndex: 10,\n }}\n >\n <Popover\n active={popoverActive}\n activator={\n <Button\n size=\"slim\"\n icon={<Icon source={MenuHorizontalIcon} />}\n onClick={togglePopoverActive}\n accessibilityLabel=\"More actions\"\n />\n }\n onClose={togglePopoverActive}\n preferredPosition=\"below\"\n preferredAlignment=\"right\"\n >\n <ActionList\n items={[\n {\n content: \"Dismiss\",\n icon: XIcon,\n onAction: handleDismiss,\n },\n ]}\n />\n </Popover>\n </div>\n )}\n\n <div\n style={{\n width: \"100%\",\n height: \"100%\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n position: \"relative\",\n }}\n >\n {campaignData.img_url && (\n <img\n src={campaignData.img_url}\n alt={campaignData.image_alt || campaignData.title}\n style={{\n width: \"100%\",\n maxWidth: \"300px\",\n height: \"auto\",\n objectFit: \"contain\",\n margin: \"0 auto\",\n }}\n onError={(e) => {\n console.error(\n \"Image failed to load:\",\n campaignData.img_url,\n );\n (e.target as HTMLImageElement).style.display = \"none\";\n }}\n />\n )}\n\n {campaignData.highlight_text && (\n <div\n style={{\n position: \"absolute\",\n top: \"20px\",\n right: \"40px\",\n background: \"#00B251\",\n color: \"white\",\n padding: \"12px 24px\",\n borderRadius: \"8px\",\n fontWeight: \"bold\",\n fontSize: \"24px\",\n transform: \"rotate(-5deg)\",\n boxShadow: \"0 4px 6px rgba(0, 0, 0, 0.1)\",\n }}\n >\n {campaignData.highlight_text}\n </div>\n )}\n </div>\n </Box>\n </div>\n </InlineGrid>\n </div>\n </Card>\n </div>\n );\n};\n\nexport default MarketingCampaignCard;\n"]}
1
+ {"version":3,"file":"MarketingCampaignCard.js","sourceRoot":"","sources":["../../src/components/MarketingCampaignCard.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useState, useEffect } from \"react\";\nimport {\n Card,\n BlockStack,\n InlineGrid,\n Text,\n Button,\n Box,\n Badge,\n InlineStack,\n Icon,\n Popover,\n ActionList,\n} from \"@shopify/polaris\";\nimport {\n MenuHorizontalIcon,\n XIcon,\n ExternalIcon,\n} from \"@shopify/polaris-icons\";\nimport { useCampaignTracking } from \"../hooks/useCampaignTracking\";\nimport { useMarketingCampaign } from \"../hooks/useMarketingCampaign\";\n\nexport interface MarketingCampaignData {\n id: number;\n key: string;\n type: string;\n priority: number;\n title: string;\n subtitle?: string;\n description: string;\n badge_text?: string;\n badge_tone?: \"success\" | \"info\" | \"warning\" | \"critical\" | \"new\";\n tag?: {\n label: string;\n tone?: \"success\" | \"info\" | \"warning\" | \"critical\" | \"new\" | \"primary\";\n };\n highlight_text?: string;\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 campaign_id?: string | number;\n start_at?: string;\n end_at?: string;\n}\n\nexport interface MarketingCampaignCardProps {\n shopId?: string;\n locale?: string;\n onDismiss?: (data: MarketingCampaignData) => void;\n onPrimaryAction?: (data: MarketingCampaignData) => void;\n onSecondaryAction?: (data: MarketingCampaignData) => void;\n}\n\nexport const MarketingCampaignCard: React.FC<MarketingCampaignCardProps> = ({\n shopId: propsShopId,\n locale,\n onDismiss,\n onPrimaryAction,\n onSecondaryAction,\n}) => {\n const [isHovered, setIsHovered] = useState(false);\n const [popoverActive, setPopoverActive] = useState(false);\n\n const { campaignData, loading, isDismissed, dismissCampaign } =\n useMarketingCampaign({\n shopId: propsShopId,\n locale,\n });\n\n const shopId = propsShopId || \"\";\n\n const tracking = useCampaignTracking(\n shopId && campaignData\n ? {\n shopId,\n campaignId: campaignData.campaign_id || campaignData.id,\n threshold: 0.5,\n visibilityDuration: 1000,\n metadata: {\n card_type: campaignData.type,\n card_key: campaignData.key,\n },\n }\n : {\n shopId: \"\",\n campaignId: \"\",\n threshold: 0.5,\n visibilityDuration: 1000,\n },\n );\n\n const handlePrimaryAction = () => {\n tracking?.trackPrimaryAction();\n\n if (campaignData?.primary_action) {\n onPrimaryAction?.(campaignData);\n }\n };\n\n const handleSecondaryAction = () => {\n tracking?.trackSecondaryAction();\n\n if (campaignData?.secondary_action) {\n onSecondaryAction?.(campaignData);\n }\n };\n\n const handleDismiss = () => {\n tracking?.trackDismiss();\n setPopoverActive(false);\n dismissCampaign();\n onDismiss?.(campaignData!);\n };\n\n const togglePopoverActive = () => setPopoverActive((active) => !active);\n\n useEffect(() => {\n const styleId = \"marketing-campaign-responsive\";\n if (!document.getElementById(styleId)) {\n const style = document.createElement(\"style\");\n style.id = styleId;\n style.innerHTML = `\n @media (max-width: 768px) {\n .marketing-campaign-grid {\n display: flex !important;\n flex-direction: column !important;\n }\n .marketing-campaign-content {\n order: 2;\n }\n .marketing-campaign-image {\n order: 1;\n padding: 16px 16px 0 16px !important;\n }\n }\n `;\n document.head.appendChild(style);\n }\n return () => {\n const existingStyle = document.getElementById(styleId);\n if (\n existingStyle &&\n document.querySelectorAll(\".marketing-campaign-grid\").length === 0\n ) {\n existingStyle.remove();\n }\n };\n }, []);\n\n // Return null if loading, no data, or dismissed\n if (loading || !campaignData || isDismissed) {\n return null;\n }\n\n return (\n <div\n ref={tracking?.elementRef}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n style={{ position: \"relative\" }}\n >\n <Card>\n <div className=\"marketing-campaign-grid\">\n <InlineGrid\n columns={{\n xs: 1,\n sm: 1,\n md: [\"twoThirds\", \"oneThird\"],\n lg: [\"twoThirds\", \"oneThird\"],\n xl: [\"twoThirds\", \"oneThird\"],\n }}\n gap=\"1000\"\n >\n <div className=\"marketing-campaign-content\">\n <Box paddingInline={{ xs: \"200\", sm: \"200\", md: \"300\" }}>\n <BlockStack gap=\"300\">\n <BlockStack gap=\"100\">\n <Box>\n {campaignData.tag?.label && (\n <Badge\n tone={\n campaignData.tag.tone === \"primary\"\n ? \"success\"\n : (campaignData.tag.tone as any) || \"success\"\n }\n >\n {campaignData.tag.label}\n </Badge>\n )}\n </Box>\n\n <BlockStack gap=\"100\">\n <Text as=\"h2\" variant=\"headingLg\" fontWeight=\"bold\">\n {campaignData.title}\n </Text>\n\n {campaignData.subtitle && (\n <Text as=\"p\" variant=\"headingXl\" fontWeight=\"bold\">\n {campaignData.subtitle}\n </Text>\n )}\n\n <Text as=\"p\" variant=\"bodyMd\" tone=\"subdued\">\n {campaignData.description}\n </Text>\n </BlockStack>\n </BlockStack>\n\n <InlineStack gap=\"200\">\n {campaignData.primary_action && (\n <Button\n variant=\"primary\"\n onClick={handlePrimaryAction}\n icon={ExternalIcon}\n >\n {campaignData.primary_action.label}\n </Button>\n )}\n\n {campaignData.secondary_action && (\n <Button onClick={handleSecondaryAction}>\n {campaignData.secondary_action.label}\n </Button>\n )}\n </InlineStack>\n </BlockStack>\n </Box>\n </div>\n\n <div className=\"marketing-campaign-image\">\n <Box padding=\"0\" position=\"relative\" minHeight=\"200\">\n {campaignData.dismissible && isHovered && (\n <div\n style={{\n position: \"absolute\",\n right: \"-5px\",\n top: \"-5px\",\n zIndex: 10,\n }}\n >\n <Popover\n active={popoverActive}\n activator={\n <Button\n size=\"slim\"\n icon={<Icon source={MenuHorizontalIcon} />}\n onClick={togglePopoverActive}\n accessibilityLabel=\"More actions\"\n />\n }\n onClose={togglePopoverActive}\n preferredPosition=\"below\"\n preferredAlignment=\"right\"\n >\n <ActionList\n items={[\n {\n content: \"Dismiss\",\n icon: XIcon,\n onAction: handleDismiss,\n },\n ]}\n />\n </Popover>\n </div>\n )}\n\n <div\n style={{\n width: \"100%\",\n height: \"100%\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n position: \"relative\",\n }}\n >\n {campaignData.img_url && (\n <img\n src={campaignData.img_url}\n alt={campaignData.image_alt || campaignData.title}\n style={{\n width: \"100%\",\n maxWidth: \"300px\",\n height: \"auto\",\n objectFit: \"contain\",\n margin: \"0 auto\",\n }}\n onError={(e) => {\n console.error(\n \"Image failed to load:\",\n campaignData.img_url,\n );\n (e.target as HTMLImageElement).style.display = \"none\";\n }}\n />\n )}\n\n {campaignData.highlight_text && (\n <div\n style={{\n position: \"absolute\",\n top: \"20px\",\n right: \"40px\",\n background: \"#00B251\",\n color: \"white\",\n padding: \"12px 24px\",\n borderRadius: \"8px\",\n fontWeight: \"bold\",\n fontSize: \"24px\",\n transform: \"rotate(-5deg)\",\n boxShadow: \"0 4px 6px rgba(0, 0, 0, 0.1)\",\n }}\n >\n {campaignData.highlight_text}\n </div>\n )}\n </div>\n </Box>\n </div>\n </InlineGrid>\n </div>\n </Card>\n </div>\n );\n};\n\nexport default MarketingCampaignCard;\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"SDKManager.d.ts","sourceRoot":"","sources":["../../src/core/SDKManager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAIL,KAAK,eAAe,EACpB,KAAK,eAAe,EACrB,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EAEL,KAAK,QAAQ,EACb,KAAK,iBAAiB,EACvB,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAMzC,UAAU,QAAQ;IAChB,WAAW,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,MAAM,EAAE,eAAe,CAAC;IACxB,YAAY,EAAE,eAAe,CAAC;IAC9B,MAAM,EAAE,iBAAiB,CAAC;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,aAAa,CAAC,EAAE,aAAa,GAAG,IAAI,CAAC;IACrC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,cAAc,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC;IAC9B,aAAa,CAAC,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;IAC7B,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,cAAc,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC;CAC/B;AAED,UAAU,UAAU;IAClB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,MAAM,CAAC,EAAE,eAAe,CAAC;IACzB,YAAY,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC;IACxC,MAAM,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC;CACrC;AAMD,cAAM,eAAe;IACnB,OAAO,CAAC,KAAK,CAAW;IACxB,OAAO,CAAC,SAAS,CAA8B;IAC/C,OAAO,CAAC,WAAW,CAAC,CAAgB;IACpC,OAAO,CAAC,cAAc,CAAC,CAAmB;IAC1C,OAAO,CAAC,qBAAqB,CAAC,CAAkB;IAChD,OAAO,CAAC,eAAe,CAAC,CAAkB;;IAiB1C;;OAEG;IACH,OAAO,CAAC,gBAAgB;IA0BxB;;OAEG;IACH,OAAO,CAAC,qBAAqB;IA2B7B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAgD1B;;OAEG;IACH,OAAO,CAAC,wBAAwB,CAO9B;IAEF;;OAEG;YACW,kBAAkB;IAgChC;;OAEG;YACW,oBAAoB;IAiDlC;;OAEG;YACW,oBAAoB;IAiFlC;;OAEG;IACH,OAAO,CAAC,eAAe;IAkDvB;;OAEG;IACG,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAKtE;;OAEG;IACH,OAAO,CAAC,kBAAkB;IA6B1B;;OAEG;IACG,UAAU,CAAC,OAAO,GAAE,UAAe,GAAG,OAAO,CAAC,IAAI,CAAC;YAS3C,qBAAqB;IA+CnC;;OAEG;IACH,OAAO,CAAC,WAAW;IAKnB;;OAEG;IACG,YAAY,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAWtD;;OAEG;IACH,QAAQ,IAAI,QAAQ;IAIpB;;OAEG;IACH,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI;IAK3C,OAAO,CAAC,eAAe;IAIvB;;OAEG;IACH,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAIX;;OAEG;IACH,kBAAkB,IAAI,eAAe,GAAG,SAAS;IAIjD;;OAEG;IACH,gBAAgB,IAAI,aAAa,GAAG,IAAI,GAAG,SAAS;IAIpD;;OAEG;IACH,gBAAgB,IAAI,GAAG,EAAE,GAAG,IAAI,GAAG,SAAS;IAI5C;;OAEG;IACH,OAAO,IAAI,OAAO;IASlB;;OAEG;IACH,OAAO,IAAI,IAAI;CAmBhB;AAMD,eAAO,MAAM,UAAU,iBAAwB,CAAC;AAQhD,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,MAAM,CAAC,EAAE,eAAe,CAAC;IACzB,YAAY,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC;IACxC,MAAM,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC;CACrC;AAED;;;GAGG;AACH,wBAAgB,MAAM,CAAC,OAAO,GAAE,aAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA9mBnC,OAAO;eACT,QAAQ;YACX,eAAe;kBACT,eAAe;YACrB,iBAAiB;aAChB,OAAO;YACR,KAAK;oBACG,aAAa,GAAG,IAAI;uBACjB,OAAO;qBACT,KAAK,GAAG,IAAI;oBACb,GAAG,EAAE,GAAG,IAAI;uBACT,OAAO;qBACT,KAAK,GAAG,IAAI;EAsoB9B;AAED,eAAe,UAAU,CAAC"}
1
+ {"version":3,"file":"SDKManager.d.ts","sourceRoot":"","sources":["../../src/core/SDKManager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAIL,KAAK,eAAe,EACpB,KAAK,eAAe,EACrB,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EAEL,KAAK,QAAQ,EACb,KAAK,iBAAiB,EACvB,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAOzC,UAAU,QAAQ;IAChB,WAAW,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,MAAM,EAAE,eAAe,CAAC;IACxB,YAAY,EAAE,eAAe,CAAC;IAC9B,MAAM,EAAE,iBAAiB,CAAC;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,aAAa,CAAC,EAAE,aAAa,GAAG,IAAI,CAAC;IACrC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,cAAc,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC;IAC9B,aAAa,CAAC,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;IAC7B,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,cAAc,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC;CAC/B;AAED,UAAU,UAAU;IAClB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,MAAM,CAAC,EAAE,eAAe,CAAC;IACzB,YAAY,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC;IACxC,MAAM,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC;CACrC;AAMD,cAAM,eAAe;IACnB,OAAO,CAAC,KAAK,CAAW;IACxB,OAAO,CAAC,SAAS,CAA8B;IAC/C,OAAO,CAAC,WAAW,CAAC,CAAgB;IACpC,OAAO,CAAC,cAAc,CAAC,CAAmB;IAC1C,OAAO,CAAC,qBAAqB,CAAC,CAAkB;IAChD,OAAO,CAAC,eAAe,CAAC,CAAkB;;IAiB1C;;OAEG;IACH,OAAO,CAAC,gBAAgB;IA0BxB;;OAEG;IACH,OAAO,CAAC,qBAAqB;IA2B7B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAgD1B;;OAEG;IACH,OAAO,CAAC,wBAAwB,CAO9B;IAEF;;OAEG;YACW,kBAAkB;IAgChC;;OAEG;YACW,oBAAoB;IA8ClC;;OAEG;YACW,oBAAoB;IA2ElC;;OAEG;IACH,OAAO,CAAC,eAAe;IAkDvB;;OAEG;IACG,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAKtE;;OAEG;IACH,OAAO,CAAC,kBAAkB;IA6B1B;;OAEG;IACG,UAAU,CAAC,OAAO,GAAE,UAAe,GAAG,OAAO,CAAC,IAAI,CAAC;YAS3C,qBAAqB;IAiDnC;;OAEG;IACH,OAAO,CAAC,WAAW;IAKnB;;OAEG;IACG,YAAY,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAWtD;;OAEG;IACH,QAAQ,IAAI,QAAQ;IAIpB;;OAEG;IACH,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI;IAK3C,OAAO,CAAC,eAAe;IAIvB;;OAEG;IACH,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAIX;;OAEG;IACH,kBAAkB,IAAI,eAAe,GAAG,SAAS;IAIjD;;OAEG;IACH,gBAAgB,IAAI,aAAa,GAAG,IAAI,GAAG,SAAS;IAIpD;;OAEG;IACH,gBAAgB,IAAI,GAAG,EAAE,GAAG,IAAI,GAAG,SAAS;IAI5C;;OAEG;IACH,OAAO,IAAI,OAAO;IASlB;;OAEG;IACH,OAAO,IAAI,IAAI;CAmBhB;AAMD,eAAO,MAAM,UAAU,iBAAwB,CAAC;AAQhD,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,MAAM,CAAC,EAAE,eAAe,CAAC;IACzB,YAAY,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC;IACxC,MAAM,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC;CACrC;AAED;;;GAGG;AACH,wBAAgB,MAAM,CAAC,OAAO,GAAE,aAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAvmBnC,OAAO;eACT,QAAQ;YACX,eAAe;kBACT,eAAe;YACrB,iBAAiB;aAChB,OAAO;YACR,KAAK;oBACG,aAAa,GAAG,IAAI;uBACjB,OAAO;qBACT,KAAK,GAAG,IAAI;oBACb,GAAG,EAAE,GAAG,IAAI;uBACT,OAAO;qBACT,KAAK,GAAG,IAAI;EA+nB9B;AAED,eAAe,UAAU,CAAC"}
@@ -6,6 +6,7 @@ import { loadTranslations, getTranslations, mergeTranslations, } from "../transl
6
6
  import { generateDashboardConfig, } from "../config/internal-config";
7
7
  import { COMPONENT_DEFAULTS } from "../config/component-defaults";
8
8
  import { DashboardEngine } from "./engine";
9
+ import { campaignCache } from "../utils/campaignCache";
9
10
  // ============================================
10
11
  // SDK Manager Singleton
11
12
  // ============================================
@@ -182,8 +183,6 @@ class SDKManagerClass {
182
183
  dashboardLoading: false,
183
184
  dashboardError: null,
184
185
  });
185
- // Also refresh campaigns data
186
- await this.refreshCampaignsData(currentLocale);
187
186
  // Emit event for components to refresh
188
187
  window.dispatchEvent(new CustomEvent("trustshop-data-refresh", {
189
188
  detail: {
@@ -235,26 +234,17 @@ class SDKManagerClass {
235
234
  : "https://ops.trustshop.io/api";
236
235
  }
237
236
  const apiUrl = `${baseUrl}/campaigns?shop_id=${shopId}&locale=${currentLocale}`;
238
- const response = await fetch(apiUrl, {
239
- method: "GET",
240
- headers: {
241
- Accept: "application/json",
242
- "Content-Type": "application/json",
243
- "Accept-Language": currentLocale,
244
- ...(this.state.config?.headers || {}),
245
- },
246
- credentials: "include",
237
+ // Use campaignCache to prevent duplicate requests
238
+ const data = await campaignCache.fetchCampaigns(shopId, currentLocale, apiUrl, {
239
+ "Accept-Language": currentLocale,
240
+ ...(this.state.config?.headers || {}),
247
241
  });
248
- if (!response.ok) {
249
- throw new Error(`Failed to fetch campaigns: ${response.statusText}`);
250
- }
251
- const data = await response.json();
252
242
  const campaignsData = data.success && Array.isArray(data.data) ? data.data : [];
253
- console.log('[SDK] Campaigns fetched:', {
243
+ console.log('[SDK] Campaigns fetched from cache/API:', {
254
244
  shopId,
255
245
  locale: currentLocale,
256
246
  campaignsCount: campaignsData.length,
257
- campaigns: campaignsData
247
+ timestamp: new Date().toISOString()
258
248
  });
259
249
  this.updateState({
260
250
  campaignsData,
@@ -387,8 +377,10 @@ class SDKManagerClass {
387
377
  loading: false,
388
378
  error: undefined,
389
379
  });
390
- // Automatically fetch dashboard data after initialization
391
- await this.refreshDashboardData(locale);
380
+ await Promise.all([
381
+ this.refreshDashboardData(locale),
382
+ this.refreshCampaignsData(locale)
383
+ ]);
392
384
  // console.log("SDK initialized successfully with dashboard data", {
393
385
  // locale,
394
386
  // shopInfo,