@fluid-app/portal-sdk 0.1.64 → 0.1.66
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/{AppDownloadScreen-DUGGDlr4.mjs → AppDownloadScreen-BVrUR6lm.mjs} +1 -1
- package/dist/{AppDownloadScreen-pm8fLxZX.mjs → AppDownloadScreen-BXS02LRb.mjs} +2 -2
- package/dist/AppDownloadScreen-BXS02LRb.mjs.map +1 -0
- package/dist/{AppDownloadScreen-oMzxBETr.cjs → AppDownloadScreen-BXWBVnQM.cjs} +2 -2
- package/dist/AppDownloadScreen-BXWBVnQM.cjs.map +1 -0
- package/dist/{AppDownloadScreen-DW3cBnbI.cjs → AppDownloadScreen-BtwySuUY.cjs} +1 -1
- package/dist/{ShopScreen-DCKr0cbB.cjs → ShopScreen-Bo9Bbpg8.cjs} +1 -1
- package/dist/{ShopScreen-Bg696rqv.mjs → ShopScreen-CMkEtT1s.mjs} +1 -1
- package/dist/{ShopScreen-qgOXPdUf.cjs → ShopScreen-D-1WO4sB.cjs} +175 -10
- package/dist/ShopScreen-D-1WO4sB.cjs.map +1 -0
- package/dist/{ShopScreen-DFWQY8hT.mjs → ShopScreen-XGC180Ts.mjs} +176 -12
- package/dist/ShopScreen-XGC180Ts.mjs.map +1 -0
- package/dist/index.cjs +6 -6
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +6 -6
- package/dist/vite/index.cjs +92 -76
- package/dist/vite/index.cjs.map +1 -1
- package/dist/vite/index.d.cts +6 -11
- package/dist/vite/index.d.cts.map +1 -1
- package/dist/vite/index.d.mts +6 -11
- package/dist/vite/index.d.mts.map +1 -1
- package/dist/vite/index.mjs +92 -76
- package/dist/vite/index.mjs.map +1 -1
- package/package.json +11 -9
- package/dist/AppDownloadScreen-oMzxBETr.cjs.map +0 -1
- package/dist/AppDownloadScreen-pm8fLxZX.mjs.map +0 -1
- package/dist/ShopScreen-DFWQY8hT.mjs.map +0 -1
- package/dist/ShopScreen-qgOXPdUf.cjs.map +0 -1
|
@@ -31,5 +31,5 @@ import "./SpacerWidget-DgVU58BC.mjs";
|
|
|
31
31
|
import "./TableWidget-DjYabx1e.mjs";
|
|
32
32
|
import "./ToDoWidget-Cmvf7I6c.mjs";
|
|
33
33
|
import "./VideoWidget-51MxnPRZ.mjs";
|
|
34
|
-
import { n as appDownloadScreenPropertySchema, t as AppDownloadScreen } from "./AppDownloadScreen-
|
|
34
|
+
import { n as appDownloadScreenPropertySchema, t as AppDownloadScreen } from "./AppDownloadScreen-BXS02LRb.mjs";
|
|
35
35
|
export { AppDownloadScreen, appDownloadScreenPropertySchema };
|
|
@@ -24,7 +24,7 @@ function GooglePlayIcon() {
|
|
|
24
24
|
}
|
|
25
25
|
function AppStoreButtons({ appstoreUrl, playstoreUrl }) {
|
|
26
26
|
return /* @__PURE__ */ jsxs("div", {
|
|
27
|
-
className: `grid gap-4 ${playstoreUrl ? "grid-cols-2" : "grid-cols-1"}`,
|
|
27
|
+
className: `grid gap-4 ${playstoreUrl ? "grid-cols-1 sm:grid-cols-2" : "grid-cols-1"}`,
|
|
28
28
|
children: [/* @__PURE__ */ jsx("a", {
|
|
29
29
|
href: appstoreUrl,
|
|
30
30
|
target: "_blank",
|
|
@@ -208,4 +208,4 @@ function AppDownloadScreen() {
|
|
|
208
208
|
//#endregion
|
|
209
209
|
export { appDownloadScreenPropertySchema as n, AppDownloadScreen as t };
|
|
210
210
|
|
|
211
|
-
//# sourceMappingURL=AppDownloadScreen-
|
|
211
|
+
//# sourceMappingURL=AppDownloadScreen-BXS02LRb.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AppDownloadScreen-BXS02LRb.mjs","names":["AppDownloadScreen","AppDownloadScreenUI"],"sources":["../../app-download-ui/src/components/AppStoreButtons.tsx","../../app-download-ui/src/components/QrCodeSection.tsx","../../app-download-ui/src/components/ImageSection.tsx","../../app-download-ui/src/lib/cn.ts","../../app-download-ui/src/components/AppDownloadScreen.tsx","../src/screens/AppDownloadScreen.tsx"],"sourcesContent":["import { ExternalLink } from \"lucide-react\";\n\nexport interface AppStoreButtonsProps {\n appstoreUrl: string;\n playstoreUrl?: string;\n}\n\nfunction AppleIcon() {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 384 512\"\n fill=\"currentColor\"\n className=\"size-5\"\n >\n <path d=\"M318.7 268.7c-.2-36.7 16.4-64.4 50-84.8-18.8-26.9-47.2-41.7-84.7-44.6-35.5-2.8-74.3 20.7-88.5 20.7-15 0-49.4-19.7-76.4-19.7C63.3 141.2 4 184.8 4 273.5q0 39.3 14.4 81.2c12.8 36.7 59 126.7 107.2 125.2 25.2-.6 43-17.9 75.8-17.9 31.8 0 48.3 17.9 76.4 17.9 48.6-.7 90.4-82.5 102.6-119.3-65.2-30.7-61.7-90-61.7-91.9zm-56.6-164.2c27.3-32.4 24.8-62.1 24-72.5-24.1 1.4-52 16.4-67.9 34.9-17.5 19.8-27.8 44.3-25.6 71.9 26.1 2 49.9-11.4 69.5-34.3z\" />\n </svg>\n );\n}\n\nfunction GooglePlayIcon() {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 512 512\"\n fill=\"currentColor\"\n className=\"size-5\"\n >\n <path d=\"M325.3 234.3L104.6 13l280.8 161.2-60.1 60.1zM47 0C34 6.8 25.3 19.2 25.3 35.3v441.3c0 16.1 8.7 28.5 21.7 35.3l256.6-256L47 0zm425.2 225.6l-58.9-34.1-65.7 64.5 65.7 64.5 60.1-34.1c18-14.3 18-46.5-1.2-60.8zM104.6 499l280.8-161.2-60.1-60.1L104.6 499z\" />\n </svg>\n );\n}\n\nexport function AppStoreButtons({\n appstoreUrl,\n playstoreUrl,\n}: AppStoreButtonsProps) {\n return (\n <div\n className={`grid gap-4 ${playstoreUrl ? \"grid-cols-1 sm:grid-cols-2\" : \"grid-cols-1\"}`}\n >\n <a\n href={appstoreUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"block cursor-pointer rounded-sm border bg-white px-4 py-4 text-gray-900 transition-colors hover:bg-gray-50\"\n >\n <div className=\"flex justify-between\">\n <div className=\"flex flex-col items-baseline\">\n <AppleIcon />\n <div className=\"mt-1 text-left text-xs font-semibold\">\n Open\n <br />\n App Store\n </div>\n </div>\n <div className=\"flex items-start\">\n <ExternalLink className=\"size-4\" />\n </div>\n </div>\n </a>\n\n {playstoreUrl && (\n <a\n href={playstoreUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"block cursor-pointer rounded-sm border bg-white px-4 py-4 text-gray-900 transition-colors hover:bg-gray-50\"\n >\n <div className=\"flex justify-between\">\n <div className=\"flex flex-col items-baseline\">\n <GooglePlayIcon />\n <div className=\"mt-1 text-left text-xs font-semibold\">\n Open\n <br />\n Play Store\n </div>\n </div>\n <div className=\"flex items-start\">\n <ExternalLink className=\"size-4\" />\n </div>\n </div>\n </a>\n )}\n </div>\n );\n}\n","export interface QrCodeSectionProps {\n companyId: number;\n}\n\nexport function QrCodeSection({ companyId }: QrCodeSectionProps) {\n const redirectUrl = `https://api.fluid.app/mobile_app_download/${companyId}`;\n const qrCodeUrl = `https://api.qrserver.com/v1/create-qr-code/?size=200x200&data=${encodeURIComponent(redirectUrl)}`;\n\n return (\n <a\n href={redirectUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"block cursor-pointer rounded-sm border bg-white px-4 py-4 text-gray-900 transition-colors hover:bg-gray-50\"\n >\n <div className=\"flex items-end justify-between\">\n <div className=\"flex flex-col items-baseline\">\n <div className=\"mt-1 text-left text-xs font-semibold\">\n Scan to\n <br />\n Download\n </div>\n </div>\n <div className=\"flex\">\n <img\n src={qrCodeUrl}\n alt=\"QR code for mobile app download\"\n className=\"h-16 w-16\"\n loading=\"lazy\"\n />\n </div>\n </div>\n </a>\n );\n}\n","const DEFAULT_IMAGE =\n \"https://assets.fluid.app/fluid-admin/images/we-commerce/iphone_product.png\";\n\nconst DEFAULT_LOGO =\n \"https://assets.fluid.app/fluid-admin/images/we-commerce/we-commerce.png\";\n\nexport interface ImageSectionProps {\n logoUrl?: string | null;\n screenshotUrl?: string | null;\n appName?: string;\n}\n\nexport function ImageSection({\n logoUrl,\n screenshotUrl,\n appName = \"App\",\n}: ImageSectionProps) {\n return (\n <div className=\"flex flex-col overflow-hidden\">\n <div className=\"-mb-px flex flex-1 flex-col\">\n <div className=\"flex h-20 px-3 pt-8\">\n <img\n src={logoUrl || DEFAULT_LOGO}\n alt={appName}\n width={150}\n height={150}\n className=\"object-contain\"\n />\n </div>\n <div\n className={\n screenshotUrl\n ? \"mt-8 flex flex-1 items-end justify-start\"\n : \"-ml-20 flex flex-1 items-end justify-start\"\n }\n >\n <img\n src={screenshotUrl || DEFAULT_IMAGE}\n alt=\"Mobile app interface\"\n width={480}\n height={500}\n className=\"h-full w-auto object-cover\"\n />\n </div>\n </div>\n </div>\n );\n}\n","import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import { AppStoreButtons } from \"./AppStoreButtons\";\nimport { QrCodeSection } from \"./QrCodeSection\";\nimport { ImageSection } from \"./ImageSection\";\nimport { cn } from \"../lib/cn\";\n\nconst DEFAULT_APPSTORE_URL =\n \"https://apps.apple.com/app/wecommerce/id1564463740\";\nconst DEFAULT_PLAYSTORE_URL =\n \"https://play.google.com/store/apps/details?id=com.fluid.crm\";\n\nexport interface AppDownloadScreenProps {\n companyId: number;\n appstoreUrl?: string | null;\n playstoreUrl?: string | null;\n logoUrl?: string | null;\n screenshotUrl?: string | null;\n appName?: string;\n className?: string;\n}\n\nexport function AppDownloadScreen({\n companyId,\n appstoreUrl,\n playstoreUrl,\n logoUrl,\n screenshotUrl,\n appName,\n className,\n}: AppDownloadScreenProps) {\n const resolvedAppstoreUrl = appstoreUrl?.trim() || DEFAULT_APPSTORE_URL;\n const resolvedPlaystoreUrl = playstoreUrl?.trim() || DEFAULT_PLAYSTORE_URL;\n\n return (\n <div\n className={cn(\"flex h-full items-center justify-center p-4\", className)}\n >\n <div className=\"bg-muted relative mx-4 w-full max-w-6xl overflow-hidden rounded-xl px-6 shadow-xl\">\n <div className=\"grid h-150 w-full grid-cols-1 lg:grid-cols-2\">\n {/* Left side - Images */}\n <ImageSection\n logoUrl={logoUrl}\n screenshotUrl={screenshotUrl}\n appName={appName}\n />\n\n {/* Right side - Content */}\n <div className=\"space-y-2 pt-8 pb-8\">\n <h1 className=\"mt-12 text-left text-[32px] leading-tight font-black text-gray-900\">\n EVERYTHING YOU NEED\n </h1>\n <h1 className=\"-mt-2 text-left text-[32px] leading-tight font-black text-gray-900\">\n AT YOUR FINGERTIPS\n </h1>\n <p className=\"-mt-1 text-left text-[14px] leading-relaxed text-gray-600\">\n Everything you need at your fingertips. Run your business from one\n place while on the go. Share, message, sell, and manage from the\n mobile app.\n </p>\n\n <h3 className=\"mt-16 text-left text-[12px] font-bold text-gray-900\">\n Download the App\n </h3>\n\n <AppStoreButtons\n appstoreUrl={resolvedAppstoreUrl}\n playstoreUrl={resolvedPlaystoreUrl}\n />\n\n <QrCodeSection companyId={companyId} />\n </div>\n </div>\n </div>\n </div>\n );\n}\n","import type { WidgetPropertySchema } from \"../registries/property-schema-types\";\nimport { AppDownloadScreen as AppDownloadScreenUI } from \"@fluid-app/portal-app-download-ui\";\nimport { useCurrentUser } from \"../hooks/use-current-user\";\n\nexport const appDownloadScreenPropertySchema = {\n widgetType: \"AppDownloadScreen\",\n displayName: \"App Download Screen\",\n fields: [],\n} as const satisfies WidgetPropertySchema;\n\nexport function AppDownloadScreen(): React.JSX.Element {\n const { data: user } = useCurrentUser();\n\n return (\n <AppDownloadScreenUI\n companyId={user?.company?.id ?? 0}\n appstoreUrl={user?.company?.appstore_url}\n playstoreUrl={user?.company?.playstore_url}\n logoUrl={user?.company?.logo_url}\n />\n );\n}\n"],"mappings":"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"}
|
|
@@ -25,7 +25,7 @@ function GooglePlayIcon() {
|
|
|
25
25
|
}
|
|
26
26
|
function AppStoreButtons({ appstoreUrl, playstoreUrl }) {
|
|
27
27
|
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
28
|
-
className: `grid gap-4 ${playstoreUrl ? "grid-cols-2" : "grid-cols-1"}`,
|
|
28
|
+
className: `grid gap-4 ${playstoreUrl ? "grid-cols-1 sm:grid-cols-2" : "grid-cols-1"}`,
|
|
29
29
|
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("a", {
|
|
30
30
|
href: appstoreUrl,
|
|
31
31
|
target: "_blank",
|
|
@@ -220,4 +220,4 @@ Object.defineProperty(exports, "appDownloadScreenPropertySchema", {
|
|
|
220
220
|
}
|
|
221
221
|
});
|
|
222
222
|
|
|
223
|
-
//# sourceMappingURL=AppDownloadScreen-
|
|
223
|
+
//# sourceMappingURL=AppDownloadScreen-BXWBVnQM.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AppDownloadScreen-BXWBVnQM.cjs","names":["ExternalLink","AppDownloadScreen","useCurrentUser","AppDownloadScreenUI"],"sources":["../../app-download-ui/src/components/AppStoreButtons.tsx","../../app-download-ui/src/components/QrCodeSection.tsx","../../app-download-ui/src/components/ImageSection.tsx","../../app-download-ui/src/lib/cn.ts","../../app-download-ui/src/components/AppDownloadScreen.tsx","../src/screens/AppDownloadScreen.tsx"],"sourcesContent":["import { ExternalLink } from \"lucide-react\";\n\nexport interface AppStoreButtonsProps {\n appstoreUrl: string;\n playstoreUrl?: string;\n}\n\nfunction AppleIcon() {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 384 512\"\n fill=\"currentColor\"\n className=\"size-5\"\n >\n <path d=\"M318.7 268.7c-.2-36.7 16.4-64.4 50-84.8-18.8-26.9-47.2-41.7-84.7-44.6-35.5-2.8-74.3 20.7-88.5 20.7-15 0-49.4-19.7-76.4-19.7C63.3 141.2 4 184.8 4 273.5q0 39.3 14.4 81.2c12.8 36.7 59 126.7 107.2 125.2 25.2-.6 43-17.9 75.8-17.9 31.8 0 48.3 17.9 76.4 17.9 48.6-.7 90.4-82.5 102.6-119.3-65.2-30.7-61.7-90-61.7-91.9zm-56.6-164.2c27.3-32.4 24.8-62.1 24-72.5-24.1 1.4-52 16.4-67.9 34.9-17.5 19.8-27.8 44.3-25.6 71.9 26.1 2 49.9-11.4 69.5-34.3z\" />\n </svg>\n );\n}\n\nfunction GooglePlayIcon() {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 512 512\"\n fill=\"currentColor\"\n className=\"size-5\"\n >\n <path d=\"M325.3 234.3L104.6 13l280.8 161.2-60.1 60.1zM47 0C34 6.8 25.3 19.2 25.3 35.3v441.3c0 16.1 8.7 28.5 21.7 35.3l256.6-256L47 0zm425.2 225.6l-58.9-34.1-65.7 64.5 65.7 64.5 60.1-34.1c18-14.3 18-46.5-1.2-60.8zM104.6 499l280.8-161.2-60.1-60.1L104.6 499z\" />\n </svg>\n );\n}\n\nexport function AppStoreButtons({\n appstoreUrl,\n playstoreUrl,\n}: AppStoreButtonsProps) {\n return (\n <div\n className={`grid gap-4 ${playstoreUrl ? \"grid-cols-1 sm:grid-cols-2\" : \"grid-cols-1\"}`}\n >\n <a\n href={appstoreUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"block cursor-pointer rounded-sm border bg-white px-4 py-4 text-gray-900 transition-colors hover:bg-gray-50\"\n >\n <div className=\"flex justify-between\">\n <div className=\"flex flex-col items-baseline\">\n <AppleIcon />\n <div className=\"mt-1 text-left text-xs font-semibold\">\n Open\n <br />\n App Store\n </div>\n </div>\n <div className=\"flex items-start\">\n <ExternalLink className=\"size-4\" />\n </div>\n </div>\n </a>\n\n {playstoreUrl && (\n <a\n href={playstoreUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"block cursor-pointer rounded-sm border bg-white px-4 py-4 text-gray-900 transition-colors hover:bg-gray-50\"\n >\n <div className=\"flex justify-between\">\n <div className=\"flex flex-col items-baseline\">\n <GooglePlayIcon />\n <div className=\"mt-1 text-left text-xs font-semibold\">\n Open\n <br />\n Play Store\n </div>\n </div>\n <div className=\"flex items-start\">\n <ExternalLink className=\"size-4\" />\n </div>\n </div>\n </a>\n )}\n </div>\n );\n}\n","export interface QrCodeSectionProps {\n companyId: number;\n}\n\nexport function QrCodeSection({ companyId }: QrCodeSectionProps) {\n const redirectUrl = `https://api.fluid.app/mobile_app_download/${companyId}`;\n const qrCodeUrl = `https://api.qrserver.com/v1/create-qr-code/?size=200x200&data=${encodeURIComponent(redirectUrl)}`;\n\n return (\n <a\n href={redirectUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"block cursor-pointer rounded-sm border bg-white px-4 py-4 text-gray-900 transition-colors hover:bg-gray-50\"\n >\n <div className=\"flex items-end justify-between\">\n <div className=\"flex flex-col items-baseline\">\n <div className=\"mt-1 text-left text-xs font-semibold\">\n Scan to\n <br />\n Download\n </div>\n </div>\n <div className=\"flex\">\n <img\n src={qrCodeUrl}\n alt=\"QR code for mobile app download\"\n className=\"h-16 w-16\"\n loading=\"lazy\"\n />\n </div>\n </div>\n </a>\n );\n}\n","const DEFAULT_IMAGE =\n \"https://assets.fluid.app/fluid-admin/images/we-commerce/iphone_product.png\";\n\nconst DEFAULT_LOGO =\n \"https://assets.fluid.app/fluid-admin/images/we-commerce/we-commerce.png\";\n\nexport interface ImageSectionProps {\n logoUrl?: string | null;\n screenshotUrl?: string | null;\n appName?: string;\n}\n\nexport function ImageSection({\n logoUrl,\n screenshotUrl,\n appName = \"App\",\n}: ImageSectionProps) {\n return (\n <div className=\"flex flex-col overflow-hidden\">\n <div className=\"-mb-px flex flex-1 flex-col\">\n <div className=\"flex h-20 px-3 pt-8\">\n <img\n src={logoUrl || DEFAULT_LOGO}\n alt={appName}\n width={150}\n height={150}\n className=\"object-contain\"\n />\n </div>\n <div\n className={\n screenshotUrl\n ? \"mt-8 flex flex-1 items-end justify-start\"\n : \"-ml-20 flex flex-1 items-end justify-start\"\n }\n >\n <img\n src={screenshotUrl || DEFAULT_IMAGE}\n alt=\"Mobile app interface\"\n width={480}\n height={500}\n className=\"h-full w-auto object-cover\"\n />\n </div>\n </div>\n </div>\n );\n}\n","import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import { AppStoreButtons } from \"./AppStoreButtons\";\nimport { QrCodeSection } from \"./QrCodeSection\";\nimport { ImageSection } from \"./ImageSection\";\nimport { cn } from \"../lib/cn\";\n\nconst DEFAULT_APPSTORE_URL =\n \"https://apps.apple.com/app/wecommerce/id1564463740\";\nconst DEFAULT_PLAYSTORE_URL =\n \"https://play.google.com/store/apps/details?id=com.fluid.crm\";\n\nexport interface AppDownloadScreenProps {\n companyId: number;\n appstoreUrl?: string | null;\n playstoreUrl?: string | null;\n logoUrl?: string | null;\n screenshotUrl?: string | null;\n appName?: string;\n className?: string;\n}\n\nexport function AppDownloadScreen({\n companyId,\n appstoreUrl,\n playstoreUrl,\n logoUrl,\n screenshotUrl,\n appName,\n className,\n}: AppDownloadScreenProps) {\n const resolvedAppstoreUrl = appstoreUrl?.trim() || DEFAULT_APPSTORE_URL;\n const resolvedPlaystoreUrl = playstoreUrl?.trim() || DEFAULT_PLAYSTORE_URL;\n\n return (\n <div\n className={cn(\"flex h-full items-center justify-center p-4\", className)}\n >\n <div className=\"bg-muted relative mx-4 w-full max-w-6xl overflow-hidden rounded-xl px-6 shadow-xl\">\n <div className=\"grid h-150 w-full grid-cols-1 lg:grid-cols-2\">\n {/* Left side - Images */}\n <ImageSection\n logoUrl={logoUrl}\n screenshotUrl={screenshotUrl}\n appName={appName}\n />\n\n {/* Right side - Content */}\n <div className=\"space-y-2 pt-8 pb-8\">\n <h1 className=\"mt-12 text-left text-[32px] leading-tight font-black text-gray-900\">\n EVERYTHING YOU NEED\n </h1>\n <h1 className=\"-mt-2 text-left text-[32px] leading-tight font-black text-gray-900\">\n AT YOUR FINGERTIPS\n </h1>\n <p className=\"-mt-1 text-left text-[14px] leading-relaxed text-gray-600\">\n Everything you need at your fingertips. Run your business from one\n place while on the go. Share, message, sell, and manage from the\n mobile app.\n </p>\n\n <h3 className=\"mt-16 text-left text-[12px] font-bold text-gray-900\">\n Download the App\n </h3>\n\n <AppStoreButtons\n appstoreUrl={resolvedAppstoreUrl}\n playstoreUrl={resolvedPlaystoreUrl}\n />\n\n <QrCodeSection companyId={companyId} />\n </div>\n </div>\n </div>\n </div>\n );\n}\n","import type { WidgetPropertySchema } from \"../registries/property-schema-types\";\nimport { AppDownloadScreen as AppDownloadScreenUI } from \"@fluid-app/portal-app-download-ui\";\nimport { useCurrentUser } from \"../hooks/use-current-user\";\n\nexport const appDownloadScreenPropertySchema = {\n widgetType: \"AppDownloadScreen\",\n displayName: \"App Download Screen\",\n fields: [],\n} as const satisfies WidgetPropertySchema;\n\nexport function AppDownloadScreen(): React.JSX.Element {\n const { data: user } = useCurrentUser();\n\n return (\n <AppDownloadScreenUI\n companyId={user?.company?.id ?? 0}\n appstoreUrl={user?.company?.appstore_url}\n playstoreUrl={user?.company?.playstore_url}\n logoUrl={user?.company?.logo_url}\n />\n );\n}\n"],"mappings":"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"}
|
|
@@ -32,6 +32,6 @@ require("./SpacerWidget-Br2IZFFv.cjs");
|
|
|
32
32
|
require("./TableWidget-Cri6r5Yr.cjs");
|
|
33
33
|
require("./ToDoWidget-Bv6POc5R.cjs");
|
|
34
34
|
require("./VideoWidget-DnnuIvW1.cjs");
|
|
35
|
-
const require_AppDownloadScreen = require("./AppDownloadScreen-
|
|
35
|
+
const require_AppDownloadScreen = require("./AppDownloadScreen-BXWBVnQM.cjs");
|
|
36
36
|
exports.AppDownloadScreen = require_AppDownloadScreen.AppDownloadScreen;
|
|
37
37
|
exports.appDownloadScreenPropertySchema = require_AppDownloadScreen.appDownloadScreenPropertySchema;
|
|
@@ -33,6 +33,6 @@ require("./TableWidget-Cri6r5Yr.cjs");
|
|
|
33
33
|
require("./ToDoWidget-Bv6POc5R.cjs");
|
|
34
34
|
require("./VideoWidget-DnnuIvW1.cjs");
|
|
35
35
|
require("./ScreenHeaderContext-eyKPyDoQ.cjs");
|
|
36
|
-
const require_ShopScreen = require("./ShopScreen-
|
|
36
|
+
const require_ShopScreen = require("./ShopScreen-D-1WO4sB.cjs");
|
|
37
37
|
exports.ShopScreen = require_ShopScreen.ShopScreen;
|
|
38
38
|
exports.shopScreenPropertySchema = require_ShopScreen.shopScreenPropertySchema;
|
|
@@ -32,5 +32,5 @@ import "./TableWidget-DjYabx1e.mjs";
|
|
|
32
32
|
import "./ToDoWidget-Cmvf7I6c.mjs";
|
|
33
33
|
import "./VideoWidget-51MxnPRZ.mjs";
|
|
34
34
|
import "./ScreenHeaderContext-CrdfLGKk.mjs";
|
|
35
|
-
import { n as shopScreenPropertySchema, t as ShopScreen } from "./ShopScreen-
|
|
35
|
+
import { n as shopScreenPropertySchema, t as ShopScreen } from "./ShopScreen-XGC180Ts.mjs";
|
|
36
36
|
export { ShopScreen, shopScreenPropertySchema };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
require("./chunk-DAgNkxik.cjs");
|
|
1
|
+
const require_chunk = require("./chunk-DAgNkxik.cjs");
|
|
2
2
|
const require_FluidProvider = require("./FluidProvider-SnHdl4ww.cjs");
|
|
3
3
|
const require_src = require("./src-DqIS-4ns.cjs");
|
|
4
4
|
const require_use_account_clients = require("./use-account-clients-Bem920_7.cjs");
|
|
@@ -7,9 +7,11 @@ const require_use_current_user = require("./use-current-user-Bld9wMVT.cjs");
|
|
|
7
7
|
const require_AppNavigationContext = require("./AppNavigationContext-B88_pXjo.cjs");
|
|
8
8
|
const require_products = require("./products-BtHCYNv6.cjs");
|
|
9
9
|
let react = require("react");
|
|
10
|
+
react = require_chunk.__toESM(react);
|
|
10
11
|
let _tanstack_react_query = require("@tanstack/react-query");
|
|
11
12
|
let react_jsx_runtime = require("react/jsx-runtime");
|
|
12
13
|
let lucide_react = require("lucide-react");
|
|
14
|
+
let react_dom = require("react-dom");
|
|
13
15
|
let _home_runner__work_fluid_mono_fluid_mono_node_modules__pnpm_zustand_5_0_9__types_react_19_2_13_immer_10_2_0_react_19_2_4_use_sync_external_store_1_6_0_react_19_2_4__node_modules_zustand_esm_index_mjs = require("/home/runner/_work/fluid-mono/fluid-mono/node_modules/.pnpm/zustand@5.0.9_@types+react@19.2.13_immer@10.2.0_react@19.2.4_use-sync-external-store@1.6.0_react@19.2.4_/node_modules/zustand/esm/index.mjs");
|
|
14
16
|
let _home_runner__work_fluid_mono_fluid_mono_node_modules__pnpm_zustand_5_0_9__types_react_19_2_13_immer_10_2_0_react_19_2_4_use_sync_external_store_1_6_0_react_19_2_4__node_modules_zustand_esm_middleware_mjs = require("/home/runner/_work/fluid-mono/fluid-mono/node_modules/.pnpm/zustand@5.0.9_@types+react@19.2.13_immer@10.2.0_react@19.2.4_use-sync-external-store@1.6.0_react@19.2.4_/node_modules/zustand/esm/middleware.mjs");
|
|
15
17
|
//#region ../../products/api-client/src/utils/product-price.ts
|
|
@@ -1550,13 +1552,165 @@ function ShopApp({ countryCode, companyLogoUrl, renderImage, onAddToCart, produc
|
|
|
1550
1552
|
});
|
|
1551
1553
|
}
|
|
1552
1554
|
//#endregion
|
|
1555
|
+
//#region ../../cart/ui/src/components/cart-script.tsx
|
|
1556
|
+
const SCRIPT_ID = "fluid-cdn-script";
|
|
1557
|
+
const LEAD_CAPTURE_ID = "fluid-lead-capture-suppress";
|
|
1558
|
+
const SCRIPT_SRC = "https://assets.fluid.app/scripts/fluid-sdk/latest/web-widgets/index.js";
|
|
1559
|
+
function CartScript({ subdomain, authJwt }) {
|
|
1560
|
+
const authJwtRef = (0, react.useRef)(authJwt);
|
|
1561
|
+
authJwtRef.current = authJwt;
|
|
1562
|
+
(0, react.useEffect)(() => {
|
|
1563
|
+
if (!subdomain) return;
|
|
1564
|
+
if (document.getElementById(SCRIPT_ID)) return;
|
|
1565
|
+
const script = document.createElement("script");
|
|
1566
|
+
script.id = SCRIPT_ID;
|
|
1567
|
+
script.src = SCRIPT_SRC;
|
|
1568
|
+
script.type = "module";
|
|
1569
|
+
script.crossOrigin = "anonymous";
|
|
1570
|
+
script.dataset.fluidShop = subdomain;
|
|
1571
|
+
if (authJwtRef.current) script.dataset.authJwt = authJwtRef.current;
|
|
1572
|
+
document.head.appendChild(script);
|
|
1573
|
+
const leadCapture = document.createElement("fluid-lead-capture");
|
|
1574
|
+
leadCapture.id = LEAD_CAPTURE_ID;
|
|
1575
|
+
leadCapture.setAttribute("hide-widget", "true");
|
|
1576
|
+
document.body.appendChild(leadCapture);
|
|
1577
|
+
return () => {
|
|
1578
|
+
const existing = document.getElementById(SCRIPT_ID);
|
|
1579
|
+
if (existing) existing.remove();
|
|
1580
|
+
const existingLeadCapture = document.getElementById(LEAD_CAPTURE_ID);
|
|
1581
|
+
if (existingLeadCapture) existingLeadCapture.remove();
|
|
1582
|
+
};
|
|
1583
|
+
}, [subdomain]);
|
|
1584
|
+
return null;
|
|
1585
|
+
}
|
|
1586
|
+
//#endregion
|
|
1587
|
+
//#region ../../cart/ui/src/components/cart-widget.tsx
|
|
1588
|
+
function CartWidget({ theme }) {
|
|
1589
|
+
const [mounted, setMounted] = (0, react.useState)(false);
|
|
1590
|
+
const widgetRef = (0, react.useRef)(null);
|
|
1591
|
+
(0, react.useEffect)(() => {
|
|
1592
|
+
setMounted(true);
|
|
1593
|
+
}, []);
|
|
1594
|
+
(0, react.useEffect)(() => {
|
|
1595
|
+
if (!mounted) return;
|
|
1596
|
+
const el = widgetRef.current;
|
|
1597
|
+
if (!el) return;
|
|
1598
|
+
if (theme) el.setAttribute("theme", JSON.stringify(theme));
|
|
1599
|
+
else el.removeAttribute("theme");
|
|
1600
|
+
}, [theme, mounted]);
|
|
1601
|
+
const widget = react.default.createElement("fluid-cart-widget", {
|
|
1602
|
+
ref: (el) => {
|
|
1603
|
+
widgetRef.current = el;
|
|
1604
|
+
},
|
|
1605
|
+
"data-fluid-widget": "true",
|
|
1606
|
+
"hide-widget": "true",
|
|
1607
|
+
"is-primary": "true"
|
|
1608
|
+
});
|
|
1609
|
+
if (mounted) return (0, react_dom.createPortal)(widget, document.body);
|
|
1610
|
+
return null;
|
|
1611
|
+
}
|
|
1612
|
+
//#endregion
|
|
1613
|
+
//#region ../../cart/ui/src/components/cart-button.tsx
|
|
1614
|
+
const MAX_SDK_POLL_ATTEMPTS = 50;
|
|
1615
|
+
function CartButton({ onCheckout }) {
|
|
1616
|
+
const [initialCount, setInitialCount] = (0, react.useState)(0);
|
|
1617
|
+
const navigateToCheckout = (0, react.useCallback)(() => {
|
|
1618
|
+
if (!window.FluidCommerceSDK) {
|
|
1619
|
+
console.error("FluidCommerceSDK not available");
|
|
1620
|
+
return;
|
|
1621
|
+
}
|
|
1622
|
+
try {
|
|
1623
|
+
const checkoutUrl = window.FluidCommerceSDK.getCheckoutUrl();
|
|
1624
|
+
if (!checkoutUrl) {
|
|
1625
|
+
console.error("No checkout URL available");
|
|
1626
|
+
return;
|
|
1627
|
+
}
|
|
1628
|
+
onCheckout?.(checkoutUrl);
|
|
1629
|
+
} catch (error) {
|
|
1630
|
+
console.error("Error getting checkout URL:", error);
|
|
1631
|
+
}
|
|
1632
|
+
}, [onCheckout]);
|
|
1633
|
+
(0, react.useEffect)(() => {
|
|
1634
|
+
let timeoutId = null;
|
|
1635
|
+
let attempts = 0;
|
|
1636
|
+
let cancelled = false;
|
|
1637
|
+
const setupSDK = () => {
|
|
1638
|
+
if (cancelled) return;
|
|
1639
|
+
if (window.FluidCommerceSDK) {
|
|
1640
|
+
if (onCheckout) window.FluidCommerceSDK.setOnCheckout(navigateToCheckout);
|
|
1641
|
+
const count = window.FairShareSDK?.getCartItemCount?.();
|
|
1642
|
+
if (count != null) setInitialCount(count);
|
|
1643
|
+
} else if (attempts < MAX_SDK_POLL_ATTEMPTS) {
|
|
1644
|
+
attempts++;
|
|
1645
|
+
timeoutId = setTimeout(setupSDK, 100);
|
|
1646
|
+
}
|
|
1647
|
+
};
|
|
1648
|
+
setupSDK();
|
|
1649
|
+
return () => {
|
|
1650
|
+
cancelled = true;
|
|
1651
|
+
if (timeoutId) clearTimeout(timeoutId);
|
|
1652
|
+
};
|
|
1653
|
+
}, [navigateToCheckout, onCheckout]);
|
|
1654
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(require_src.Button, {
|
|
1655
|
+
className: "bg-primary text-primary-foreground hover:bg-primary-700 relative flex items-center gap-4 rounded-sm px-4 py-1.5",
|
|
1656
|
+
onClick: () => {
|
|
1657
|
+
window.fluidCart?.open();
|
|
1658
|
+
},
|
|
1659
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
1660
|
+
className: "relative",
|
|
1661
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(lucide_react.ShoppingCart, { className: "size-5" }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
1662
|
+
id: "fluid-cart-count",
|
|
1663
|
+
className: "bg-primary-foreground text-primary absolute -top-1 -right-2 flex h-4 w-4 items-center justify-center rounded-full text-[8px] font-bold",
|
|
1664
|
+
children: initialCount
|
|
1665
|
+
})]
|
|
1666
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: "Cart" })]
|
|
1667
|
+
});
|
|
1668
|
+
}
|
|
1669
|
+
//#endregion
|
|
1670
|
+
//#region ../../cart/ui/src/components/shop-container.tsx
|
|
1671
|
+
function ShopContainer({ children, className = "", cartScript, cartWidget }) {
|
|
1672
|
+
const containerRef = (0, react.useRef)(null);
|
|
1673
|
+
const [portalContainer, setPortalContainer] = (0, react.useState)(null);
|
|
1674
|
+
(0, react.useEffect)(() => {
|
|
1675
|
+
const currentContainer = containerRef.current;
|
|
1676
|
+
if (!currentContainer) return;
|
|
1677
|
+
const reactContentWrapper = document.createElement("div");
|
|
1678
|
+
reactContentWrapper.id = "react-content-wrapper";
|
|
1679
|
+
reactContentWrapper.style.cssText = `
|
|
1680
|
+
position: relative;
|
|
1681
|
+
`;
|
|
1682
|
+
reactContentWrapper.className = "min-h-full";
|
|
1683
|
+
currentContainer.appendChild(reactContentWrapper);
|
|
1684
|
+
setPortalContainer(reactContentWrapper);
|
|
1685
|
+
return () => {
|
|
1686
|
+
if (currentContainer && reactContentWrapper) try {
|
|
1687
|
+
currentContainer.removeChild(reactContentWrapper);
|
|
1688
|
+
} catch (e) {
|
|
1689
|
+
console.warn("Failed to cleanup isolated container:", e);
|
|
1690
|
+
}
|
|
1691
|
+
setPortalContainer(null);
|
|
1692
|
+
};
|
|
1693
|
+
}, []);
|
|
1694
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_jsx_runtime.Fragment, { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
1695
|
+
ref: containerRef,
|
|
1696
|
+
className: `isolated-shop-wrapper ${className} h-full`,
|
|
1697
|
+
children: portalContainer && (0, react_dom.createPortal)(/* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
|
|
1698
|
+
cartScript,
|
|
1699
|
+
cartWidget,
|
|
1700
|
+
children
|
|
1701
|
+
] }), portalContainer)
|
|
1702
|
+
}) });
|
|
1703
|
+
}
|
|
1704
|
+
//#endregion
|
|
1553
1705
|
//#region src/screens/ShopScreen.tsx
|
|
1554
1706
|
function ShopScreen({ background, textColor, accentColor, padding, borderRadius, ...divProps }) {
|
|
1555
1707
|
const { config } = require_FluidProvider.useFluidContext();
|
|
1556
1708
|
const domainClient = require_use_account_clients.useSdkClient();
|
|
1709
|
+
const { token } = require_use_account_clients.useFluidAuth();
|
|
1557
1710
|
const { data: userData } = require_use_current_user.useCurrentUser();
|
|
1558
1711
|
const { currentSlug, navigate } = require_AppNavigationContext.useAppNavigation();
|
|
1559
1712
|
const countryCode = config.countryIso ?? userData?.country?.iso ?? "US";
|
|
1713
|
+
const subdomain = userData?.company?.subdomain;
|
|
1560
1714
|
require_ScreenHeaderContext.useScreenHeaderBreadcrumbs((0, react.useMemo)(() => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_src.Breadcrumb, { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_src.BreadcrumbList, {
|
|
1561
1715
|
className: "text-lg",
|
|
1562
1716
|
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_src.BreadcrumbItem, { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_src.BreadcrumbPage, {
|
|
@@ -1564,18 +1718,29 @@ function ShopScreen({ background, textColor, accentColor, padding, borderRadius,
|
|
|
1564
1718
|
children: "Shop"
|
|
1565
1719
|
}) })
|
|
1566
1720
|
}) }), []));
|
|
1721
|
+
require_ScreenHeaderContext.useScreenHeaderActions((0, react.useMemo)(() => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
1722
|
+
className: "flex items-center gap-4",
|
|
1723
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(CartButton, {})
|
|
1724
|
+
}), []));
|
|
1567
1725
|
const productId = currentSlug.split("/")[1] ?? null;
|
|
1568
1726
|
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
1569
1727
|
...divProps,
|
|
1570
1728
|
className: `h-full ${divProps.className ?? ""}`,
|
|
1571
|
-
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(
|
|
1572
|
-
|
|
1573
|
-
|
|
1574
|
-
|
|
1575
|
-
|
|
1576
|
-
|
|
1577
|
-
|
|
1578
|
-
|
|
1729
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ShopContainer, {
|
|
1730
|
+
cartScript: subdomain ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(CartScript, {
|
|
1731
|
+
subdomain,
|
|
1732
|
+
authJwt: token ?? void 0
|
|
1733
|
+
}) : null,
|
|
1734
|
+
cartWidget: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(CartWidget, {}),
|
|
1735
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ProductsCoreProvider, {
|
|
1736
|
+
client: domainClient,
|
|
1737
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ShopApp, {
|
|
1738
|
+
countryCode,
|
|
1739
|
+
companyLogoUrl: userData?.company?.logo_url,
|
|
1740
|
+
productId,
|
|
1741
|
+
onSelectProduct: (id) => navigate(`shop/${id}`),
|
|
1742
|
+
onBack: () => navigate("shop")
|
|
1743
|
+
})
|
|
1579
1744
|
})
|
|
1580
1745
|
})
|
|
1581
1746
|
});
|
|
@@ -1603,4 +1768,4 @@ Object.defineProperty(exports, "shopScreenPropertySchema", {
|
|
|
1603
1768
|
}
|
|
1604
1769
|
});
|
|
1605
1770
|
|
|
1606
|
-
//# sourceMappingURL=ShopScreen-
|
|
1771
|
+
//# sourceMappingURL=ShopScreen-D-1WO4sB.cjs.map
|