@datlv-trustshop/shopify-inapp-components 0.2.10 → 0.2.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/WhatsNew.d.ts +2 -0
- package/dist/components/WhatsNew.d.ts.map +1 -1
- package/dist/components/WhatsNew.js +10 -13
- package/dist/components/WhatsNew.js.map +1 -1
- package/dist/hooks/usePartnerIntegration.d.ts.map +1 -1
- package/dist/hooks/usePartnerIntegration.js +47 -9
- package/dist/hooks/usePartnerIntegration.js.map +1 -1
- package/package.json +1 -1
|
@@ -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,
|
|
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
|
-
|
|
134
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
-
//
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
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;
|
|
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"]}
|