@luxfi/core 5.3.1 → 5.3.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (183) hide show
  1. package/commerce/ui/conf.ts +13 -13
  2. package/commerce/ui/context.tsx +123 -126
  3. package/commerce/ui/store.ts +289 -304
  4. package/components/access-code-input.tsx +71 -71
  5. package/components/auth/auth-listener.tsx +29 -29
  6. package/components/auth/auth-token/clear-auth-token.tsx +12 -12
  7. package/components/auth/auth-token/set-auth-token.tsx +16 -16
  8. package/components/auth/common-auth-domains.ts +16 -16
  9. package/components/auth/login-panel.tsx +107 -107
  10. package/components/back-button.tsx +49 -42
  11. package/components/chat-widget.tsx +85 -85
  12. package/components/commerce/{checkout-widget → _to_deprecate_checkout-widget}/const.ts +13 -13
  13. package/components/commerce/{checkout-widget/index.tsx → _to_deprecate_checkout-widget/index.tsx_} +188 -192
  14. package/components/commerce/{checkout-widget → _to_deprecate_checkout-widget}/obs-string-set.ts +48 -48
  15. package/components/commerce/{checkout-widget → _to_deprecate_checkout-widget}/use-anim-clx-set.ts +58 -58
  16. package/components/commerce/bag-button.tsx +98 -98
  17. package/components/commerce/buy-button.tsx +34 -34
  18. package/components/commerce/checkout-button.tsx +129 -129
  19. package/components/commerce/checkout-panel/cart-accordian.tsx +66 -0
  20. package/components/commerce/checkout-panel/checkout-panel-props.ts +10 -0
  21. package/components/commerce/checkout-panel/{dt-bag-carousel.tsx → desktop-bag-carousel.tsx} +36 -36
  22. package/components/commerce/checkout-panel/desktop-cp.tsx +83 -0
  23. package/components/commerce/checkout-panel/index.tsx +126 -129
  24. package/components/commerce/checkout-panel/mobile-cp.tsx +67 -0
  25. package/components/commerce/checkout-panel/policy-links.tsx +29 -0
  26. package/components/commerce/checkout-panel/steps-indicator.tsx +39 -39
  27. package/components/commerce/checkout-panel/thank-you.tsx +18 -18
  28. package/components/commerce/desktop-bag-popup.tsx +78 -78
  29. package/components/commerce/desktop-nav-menu.tsx +130 -130
  30. package/components/commerce/drawer/index.tsx +88 -99
  31. package/components/commerce/drawer/micro.tsx +145 -144
  32. package/components/commerce/drawer/shell.tsx +85 -85
  33. package/components/commerce/mobile-bag-drawer.tsx +51 -51
  34. package/components/commerce/mobile-login-button.tsx +107 -107
  35. package/components/commerce/mobile-menu-toggle-button.tsx +35 -35
  36. package/components/commerce/mobile-nav-menu-ai.tsx +50 -51
  37. package/components/commerce/mobile-nav-menu-item.tsx +49 -49
  38. package/components/commerce/mobile-nav-menu.tsx +101 -101
  39. package/components/contact-dialog/contact-form.tsx +113 -113
  40. package/components/contact-dialog/disclaimer.tsx +13 -13
  41. package/components/contact-dialog/index.tsx +64 -64
  42. package/components/copyright.tsx +21 -21
  43. package/components/drawer-margin.tsx +25 -25
  44. package/components/footer.tsx +77 -77
  45. package/components/header/desktop.tsx +51 -51
  46. package/components/header/index.tsx +50 -50
  47. package/components/header/mobile.tsx +163 -163
  48. package/components/header/theme-toggle.tsx +26 -26
  49. package/components/icons/24k-gold-card.tsx +43 -43
  50. package/components/icons/ai-chat-act.tsx +47 -47
  51. package/components/icons/ai-chat.tsx +29 -29
  52. package/components/icons/anodized-titanium.tsx +45 -45
  53. package/components/icons/avatar.tsx +11 -11
  54. package/components/icons/bag-icon.tsx +10 -10
  55. package/components/icons/blog-act.tsx +14 -14
  56. package/components/icons/blog.tsx +20 -20
  57. package/components/icons/bridge-act.tsx +18 -18
  58. package/components/icons/bridge.tsx +68 -68
  59. package/components/icons/changelog-act.tsx +15 -15
  60. package/components/icons/changelog.tsx +21 -21
  61. package/components/icons/chrome.tsx +45 -45
  62. package/components/icons/coins-act.tsx +29 -29
  63. package/components/icons/coins.tsx +20 -20
  64. package/components/icons/compare-cards-act.tsx +30 -30
  65. package/components/icons/compare-cards.tsx +21 -21
  66. package/components/icons/credit-act.tsx +29 -29
  67. package/components/icons/credit.tsx +20 -20
  68. package/components/icons/customer-support-act.tsx +27 -27
  69. package/components/icons/customer-support.tsx +21 -21
  70. package/components/icons/customers-act.tsx +65 -65
  71. package/components/icons/customers.tsx +33 -33
  72. package/components/icons/developer-docs-act.tsx +26 -26
  73. package/components/icons/developer-docs.tsx +20 -20
  74. package/components/icons/exchange-act.tsx +27 -27
  75. package/components/icons/exchange.tsx +21 -21
  76. package/components/icons/explorer-act.tsx +27 -27
  77. package/components/icons/explorer.tsx +22 -22
  78. package/components/icons/faqs-act.tsx +27 -27
  79. package/components/icons/faqs.tsx +21 -21
  80. package/components/icons/github.tsx +14 -14
  81. package/components/icons/guides-act.tsx +26 -26
  82. package/components/icons/guides.tsx +21 -21
  83. package/components/icons/gun-metal.tsx +44 -44
  84. package/components/icons/index.tsx +43 -43
  85. package/components/icons/integrations-act.tsx +41 -41
  86. package/components/icons/integrations.tsx +25 -25
  87. package/components/icons/irradescent.tsx +41 -41
  88. package/components/icons/launch-subnet.tsx +21 -21
  89. package/components/icons/launchsubnet-act.tsx +29 -29
  90. package/components/icons/left-arrow.tsx +11 -11
  91. package/components/icons/lux-finance-act.tsx +34 -34
  92. package/components/icons/lux-finance.tsx +23 -23
  93. package/components/icons/lux-logo.tsx +10 -10
  94. package/components/icons/lux-pass-act.tsx +41 -41
  95. package/components/icons/lux-pass.tsx +25 -25
  96. package/components/icons/lux-quests-act.tsx +15 -15
  97. package/components/icons/lux-quests.tsx +21 -21
  98. package/components/icons/market-act.tsx +39 -39
  99. package/components/icons/market.tsx +24 -24
  100. package/components/icons/mirrored-titanium.tsx +46 -46
  101. package/components/icons/more-benefits-act.tsx +29 -29
  102. package/components/icons/more-benefits.tsx +21 -21
  103. package/components/icons/open-source-act.tsx +41 -41
  104. package/components/icons/open-source.tsx +26 -26
  105. package/components/icons/right-arrow.tsx +10 -10
  106. package/components/icons/safe-act.tsx +77 -77
  107. package/components/icons/safe.tsx +37 -37
  108. package/components/icons/search.tsx +12 -12
  109. package/components/icons/secure-delivery.tsx +13 -13
  110. package/components/icons/shop-act.tsx +29 -29
  111. package/components/icons/shop.tsx +20 -20
  112. package/components/icons/social-icon.tsx +35 -35
  113. package/components/icons/social-svg.css +3 -3
  114. package/components/icons/sterling-silver-card.tsx +44 -44
  115. package/components/icons/templates-act.tsx +29 -29
  116. package/components/icons/templates.tsx +21 -21
  117. package/components/icons/validators-act.tsx +42 -42
  118. package/components/icons/validators.tsx +41 -41
  119. package/components/icons/view-all-card-act.tsx +28 -28
  120. package/components/icons/view-all-card.tsx +20 -20
  121. package/components/icons/wallet-act.tsx +29 -29
  122. package/components/icons/wallet.tsx +20 -20
  123. package/components/icons/warpcast.tsx +58 -58
  124. package/components/icons/youtube-logo.tsx +59 -59
  125. package/components/index.ts +25 -27
  126. package/components/logo.tsx +89 -89
  127. package/components/main.tsx +27 -27
  128. package/components/mini-chart/index.tsx +7 -7
  129. package/components/mini-chart/mini-chart-props.ts +43 -43
  130. package/components/mini-chart/mini-chart.tsx +85 -85
  131. package/components/mini-chart/wrapper.tsx +23 -23
  132. package/components/not-found/index.tsx +28 -28
  133. package/components/not-found/not-found-content.mdx +5 -5
  134. package/components/scripts.tsx +24 -24
  135. package/components/tooltip.tsx +31 -31
  136. package/environment.d.ts +5 -5
  137. package/next/analytics/fpixel.ts +15 -15
  138. package/next/analytics/google-analytics.ts +13 -13
  139. package/next/analytics/index.ts +3 -3
  140. package/next/analytics/pixel-analytics.tsx +54 -54
  141. package/next/font/get-app-router-font-classes.ts +12 -12
  142. package/next/font/load-and-return-lux-next-fonts-on-import.ts +68 -68
  143. package/next/font/next-font-desc.ts +27 -27
  144. package/next/font/pages-router-font-vars.tsx +18 -18
  145. package/next/head-metadata/from-next/metadata-types.ts +158 -158
  146. package/next/head-metadata/from-next/opengraph-types.ts +267 -267
  147. package/next/head-metadata/from-next/twitter-types.ts +92 -92
  148. package/next/head-metadata/index.tsx +208 -208
  149. package/next/middleware/determine-device-mw.ts +16 -16
  150. package/package.json +79 -79
  151. package/root-layout/WHY_THIS_IS_SEPARATE.txt +1 -1
  152. package/root-layout/index.tsx +112 -112
  153. package/server-actions/firebase-app.ts +14 -14
  154. package/server-actions/index.ts +5 -5
  155. package/server-actions/store-contact.ts +51 -51
  156. package/site-def/footer/community.tsx +67 -67
  157. package/site-def/footer/company.ts +37 -37
  158. package/site-def/footer/ecosystem.ts +37 -37
  159. package/site-def/footer/index.tsx +26 -26
  160. package/site-def/footer/legal.ts +28 -28
  161. package/site-def/footer/network.ts +45 -45
  162. package/site-def/footer/svg/warpcast-logo.svg +11 -11
  163. package/site-def/index.ts +2 -2
  164. package/site-def/main-nav.tsx +458 -458
  165. package/style/cart-animation.css +29 -29
  166. package/style/checkout-animation.css +23 -23
  167. package/style/drawer-handle-overrides.css +160 -160
  168. package/style/lux-colors.css +85 -85
  169. package/style/lux-global.css +50 -50
  170. package/tailwind/fontFamily.tailwind.lux.ts +18 -18
  171. package/tailwind/index.ts +2 -2
  172. package/tailwind/lux-tw-fonts.ts +39 -39
  173. package/tailwind/tailwind.config.lux-preset.ts +10 -10
  174. package/tsconfig.json +15 -15
  175. package/types/chatbot-config.ts +6 -6
  176. package/types/chatbot-suggested-question.ts +7 -7
  177. package/types/contact-info.ts +10 -10
  178. package/types/index.ts +4 -4
  179. package/types/site-def.ts +43 -43
  180. package/components/commerce/add-widget.tsx +0 -20
  181. package/components/commerce/checkout-panel/dt-checkout-panel.tsx +0 -85
  182. package/components/commerce/checkout-panel/links-row.tsx +0 -21
  183. package/components/commerce/checkout-panel/mb-checkout-panel.tsx +0 -55
@@ -1,131 +1,131 @@
1
- "use client"
2
-
3
- import * as React from "react"
4
- import Link from "next/link"
5
- import { cn } from '@hanzo/ui/util'
6
- import type { LinkDef } from '@hanzo/ui/types'
7
- import type { ChildMenu, LinkDefExtended } from "../../site-def/main-nav"
8
- import {
9
- NavigationMenu,
10
- NavigationMenuContent,
11
- NavigationMenuItem,
12
- NavigationMenuLink,
13
- NavigationMenuList,
14
- NavigationMenuTrigger,
15
- navigationMenuTriggerStyle
16
- } from '@hanzo/ui/primitives'
17
- import Warpcast from "../icons/warpcast"
18
-
19
- const DesktopNav: React.FC<{ links: LinkDefExtended[] }> = ({ links }) => (
20
- links.length > 0 ? (
21
- <NavigationMenu>
22
- <NavigationMenuList>
23
- {links.map((el, index) => {
24
- if (el.isAIMenu) {
25
- return (
26
- <NavigationMenuItem key={index}>
27
- <Link href={el.href} legacyBehavior passHref >
28
- <NavigationMenuLink className={cn('!rounded-2xl ', navigationMenuTriggerStyle())}>
29
- {el.title}
30
- </NavigationMenuLink>
31
- </Link>
32
- </NavigationMenuItem>
33
- )
34
- } else if (el.title === "Cards") {
35
- return (
36
- <NavigationMenuItem key={index}>
37
- <NavigationMenuTrigger className="!rounded-2xl">{el.title}</NavigationMenuTrigger>
38
- <NavigationMenuContent className="!left-0 overflow-scroll xl:w-[720px]">
39
- <div className="grid xl:grid-cols-3 xl:h-auto h-[600px] w-full ">
40
- <GroupChildMenu childs={el.childMenu} />
41
- </div>
42
- </NavigationMenuContent>
43
- </NavigationMenuItem>
44
- )
45
- } else {
46
- return (
47
- <NavigationMenuItem key={index}>
48
- <NavigationMenuTrigger className="!rounded-2xl">{el.title}</NavigationMenuTrigger>
49
- <NavigationMenuContent className="!left-0 overflow-scroll">
50
- <div className="xl:flex xl:flex-row w-full xl:h-auto h-[600px]">
51
- <GroupChildMenu childs={el.childMenu} />
52
- </div>
53
- </NavigationMenuContent>
54
- </NavigationMenuItem>
55
- )
56
- }
57
- })}
58
- </NavigationMenuList>
59
- </NavigationMenu>
60
- ) : null
61
- )
62
- export default DesktopNav
63
-
64
- const ListItem = React.forwardRef<
65
- React.ElementRef<"a">,
66
- React.ComponentPropsWithoutRef<"a">
67
- >(({ className, title, children, ...props }, ref) => {
68
- return (
69
- <li>
70
- <NavigationMenuLink asChild>
71
- <a
72
- ref={ref}
73
- className={cn(
74
- "block select-none space-y-1 rounded-md p-3 leading-none no-underline outline-none transition-colors hover:bg-level-1 hover:text-accent-foreground focus:bg-level-1 focus:text-accent-foreground",
75
- className
76
- )}
77
- {...props}
78
- >
79
- <div className="text-sm font-medium leading-none">{title}</div>
80
- <p className="line-clamp-3 text-sm leading-snug text-muted-foreground">
81
- {children}
82
- </p>
83
- </a>
84
- </NavigationMenuLink>
85
- </li>
86
- )
87
- })
88
- ListItem.displayName = "ListItem"
89
-
90
- const GroupChildMenu: React.FC<{ childs: ChildMenu[] | undefined }> = ({ childs }) => {
91
- if (!childs) {
92
- return null
93
- }
94
-
95
- let groupedChildMenus = childs.reduce((grouped: Record<string, ChildMenu[]>, childLink) => {
96
- if (childLink.groupName) {
97
- if (!grouped[childLink.groupName]) {
98
- grouped[childLink.groupName] = []
99
- }
100
- grouped[childLink.groupName].push(childLink)
101
- }
102
- return grouped
103
- }, {} as Record<string, ChildMenu[]>)
104
-
105
- return Object.entries(groupedChildMenus).map(([groupName, childLinks]: [string, ChildMenu[]]) => (
106
- <div key={groupName} className={`xl:p-4 p-2 ${groupName === "Elite Card" || groupName === "Sovereign Card" ? "xl:-mt-34" : ""}`}>
107
- <h2 className="text-muted-1">{groupName}</h2>
108
- <ul className="w-[200px] gap-3 2xl:w-[250px]">
109
- {childLinks.map((link) => (
110
- <div className="flex items-center element-container text-muted-1 hover:text-primary" key={link.title}>
111
- {
112
- link.icon_act ? (
113
- <>
114
- <div className="icon-container-nor">{link.icon}</div>
115
- <div className="icon-container-hov">{link.icon_act}</div>
116
- </>
117
- ):(
118
- <div>{link.icon}</div>
119
- )
120
- }
121
- <div className="text-container">
122
- <ListItem key={link.title} title={link.title} href={link.href} className="hover:bg-transparent">
123
- {link.contents}
124
- </ListItem>
125
- </div>
126
- </div>
127
- ))}
128
- </ul>
129
- </div>
130
- ))
1
+ "use client"
2
+
3
+ import * as React from "react"
4
+ import Link from "next/link"
5
+ import { cn } from '@hanzo/ui/util'
6
+ import type { LinkDef } from '@hanzo/ui/types'
7
+ import type { ChildMenu, LinkDefExtended } from "../../site-def/main-nav"
8
+ import {
9
+ NavigationMenu,
10
+ NavigationMenuContent,
11
+ NavigationMenuItem,
12
+ NavigationMenuLink,
13
+ NavigationMenuList,
14
+ NavigationMenuTrigger,
15
+ navigationMenuTriggerStyle
16
+ } from '@hanzo/ui/primitives'
17
+ import Warpcast from "../icons/warpcast"
18
+
19
+ const DesktopNav: React.FC<{ links: LinkDefExtended[] }> = ({ links }) => (
20
+ links.length > 0 ? (
21
+ <NavigationMenu>
22
+ <NavigationMenuList>
23
+ {links.map((el, index) => {
24
+ if (el.isAIMenu) {
25
+ return (
26
+ <NavigationMenuItem key={index}>
27
+ <Link href={el.href} legacyBehavior passHref >
28
+ <NavigationMenuLink className={cn('!rounded-2xl ', navigationMenuTriggerStyle())}>
29
+ {el.title}
30
+ </NavigationMenuLink>
31
+ </Link>
32
+ </NavigationMenuItem>
33
+ )
34
+ } else if (el.title === "Cards") {
35
+ return (
36
+ <NavigationMenuItem key={index}>
37
+ <NavigationMenuTrigger className="!rounded-2xl">{el.title}</NavigationMenuTrigger>
38
+ <NavigationMenuContent className="!left-0 overflow-scroll xl:w-[720px]">
39
+ <div className="grid xl:grid-cols-3 xl:h-auto h-[600px] w-full ">
40
+ <GroupChildMenu childs={el.childMenu} />
41
+ </div>
42
+ </NavigationMenuContent>
43
+ </NavigationMenuItem>
44
+ )
45
+ } else {
46
+ return (
47
+ <NavigationMenuItem key={index}>
48
+ <NavigationMenuTrigger className="!rounded-2xl">{el.title}</NavigationMenuTrigger>
49
+ <NavigationMenuContent className="!left-0 overflow-scroll">
50
+ <div className="xl:flex xl:flex-row w-full xl:h-auto h-[600px]">
51
+ <GroupChildMenu childs={el.childMenu} />
52
+ </div>
53
+ </NavigationMenuContent>
54
+ </NavigationMenuItem>
55
+ )
56
+ }
57
+ })}
58
+ </NavigationMenuList>
59
+ </NavigationMenu>
60
+ ) : null
61
+ )
62
+ export default DesktopNav
63
+
64
+ const ListItem = React.forwardRef<
65
+ React.ElementRef<"a">,
66
+ React.ComponentPropsWithoutRef<"a">
67
+ >(({ className, title, children, ...props }, ref) => {
68
+ return (
69
+ <li>
70
+ <NavigationMenuLink asChild>
71
+ <a
72
+ ref={ref}
73
+ className={cn(
74
+ "block select-none space-y-1 rounded-md p-3 leading-none no-underline outline-none transition-colors hover:bg-level-1 hover:text-accent-foreground focus:bg-level-1 focus:text-accent-foreground",
75
+ className
76
+ )}
77
+ {...props}
78
+ >
79
+ <div className="text-sm font-medium leading-none">{title}</div>
80
+ <p className="line-clamp-3 text-sm leading-snug text-muted-foreground">
81
+ {children}
82
+ </p>
83
+ </a>
84
+ </NavigationMenuLink>
85
+ </li>
86
+ )
87
+ })
88
+ ListItem.displayName = "ListItem"
89
+
90
+ const GroupChildMenu: React.FC<{ childs: ChildMenu[] | undefined }> = ({ childs }) => {
91
+ if (!childs) {
92
+ return null
93
+ }
94
+
95
+ let groupedChildMenus = childs.reduce((grouped: Record<string, ChildMenu[]>, childLink) => {
96
+ if (childLink.groupName) {
97
+ if (!grouped[childLink.groupName]) {
98
+ grouped[childLink.groupName] = []
99
+ }
100
+ grouped[childLink.groupName].push(childLink)
101
+ }
102
+ return grouped
103
+ }, {} as Record<string, ChildMenu[]>)
104
+
105
+ return Object.entries(groupedChildMenus).map(([groupName, childLinks]: [string, ChildMenu[]]) => (
106
+ <div key={groupName} className={`xl:p-4 p-2 ${groupName === "Elite Card" || groupName === "Sovereign Card" ? "xl:-mt-34" : ""}`}>
107
+ <h2 className="text-muted-1">{groupName}</h2>
108
+ <ul className="w-[200px] gap-3 2xl:w-[250px]">
109
+ {childLinks.map((link) => (
110
+ <div className="flex items-center element-container text-muted-1 hover:text-primary" key={link.title}>
111
+ {
112
+ link.icon_act ? (
113
+ <>
114
+ <div className="icon-container-nor">{link.icon}</div>
115
+ <div className="icon-container-hov">{link.icon_act}</div>
116
+ </>
117
+ ):(
118
+ <div>{link.icon}</div>
119
+ )
120
+ }
121
+ <div className="text-container">
122
+ <ListItem key={link.title} title={link.title} href={link.href} className="hover:bg-transparent">
123
+ {link.contents}
124
+ </ListItem>
125
+ </div>
126
+ </div>
127
+ ))}
128
+ </ul>
129
+ </div>
130
+ ))
131
131
  }
@@ -1,99 +1,88 @@
1
- 'use client'
2
- import React from 'react'
3
- import { useRouter } from 'next/navigation'
4
- import { observer } from 'mobx-react-lite'
5
-
6
- import { CarouselBuyCard } from '@hanzo/commerce'
7
-
8
- import {
9
- useSelectAndBuy,
10
- useCommerceDrawer,
11
- useRecentActivity
12
- } from '../../../commerce/ui/context'
13
-
14
- import CommerceDrawer from './shell'
15
- import CheckoutButton from '../checkout-button'
16
- import Micro from './micro'
17
-
18
- const CommerceUIComponent: React.FC = observer(() => {
19
-
20
- const buy = useSelectAndBuy()
21
- const drawer = useCommerceDrawer()
22
- const recent = useRecentActivity()
23
- const router = useRouter()
24
-
25
-
26
- const handleCheckout = (): void => {
27
- router.push('/checkout')
28
- }
29
-
30
-
31
- const handleHandleClicked = (): void => {
32
-
33
- if (drawer.state === 'full') {
34
- buy.hideVariants()
35
- }
36
- else if (drawer.state === 'micro') {
37
- if (drawer.showAdded) {
38
- buy.showVariants(recent.item?.sku ?? '')
39
- }
40
- // checkout only
41
- else {
42
- drawer.setClosedByUser(true)
43
- }
44
- }
45
- }
46
-
47
- const handleItemClicked = () => {
48
- buy.showVariants(recent.item?.sku ?? '')
49
- }
50
-
51
- const handleCloseGesture = (): boolean => {
52
- if (drawer.state === 'full') {
53
- buy.hideVariants()
54
- return true // "handled!"
55
- }
56
- return false
57
- }
58
-
59
- return (
60
- <CommerceDrawer
61
- handleHandleClicked={handleHandleClicked}
62
- handleCloseGesture={handleCloseGesture}
63
- drawerClx='flex flex-col'
64
- >
65
- {drawer.state === 'full' && (
66
- /* The actual drawer is larger than the visible area (due to awkward
67
- vaul impl. So we have to ask the drawer for its currect snappoint
68
- and constrain layout to that.
69
- */
70
- <div style={{height: drawer.snapPointPx - 24 /* fudge factor for handle area */}}>
71
- <CarouselBuyCard
72
- skuPath={buy.currentSkuPath!}
73
- checkoutButton={
74
- <CheckoutButton
75
- handleCheckout={handleCheckout}
76
- className='w-full min-w-[160px] sm:max-w-[320px]'
77
- />
78
- }
79
- onQuantityChanged={recent.quantityChanged.bind(recent)}
80
- clx='justify-between h-full pb-3 gap-8'
81
- addBtnClx='w-full min-w-[160px] sm:max-w-[320px]'
82
- buttonsAreaClx='grow-0 shrink-0 mt-0'
83
- selectorClx='max-w-[475px] justify-between grow'
84
-
85
- />
86
- </div>
87
- )}
88
- {drawer.state === 'micro' && (
89
- <Micro
90
- handleCheckout={handleCheckout}
91
- handleItemClicked={handleItemClicked}
92
- clx='w-full px-2 sm:w-[460px] sm:mx-auto md:w-[550px]'
93
- />
94
- )}
95
- </CommerceDrawer>
96
- )
97
- })
98
-
99
- export default CommerceUIComponent
1
+ 'use client'
2
+ import React from 'react'
3
+ import { useRouter } from 'next/navigation'
4
+ import { observer } from 'mobx-react-lite'
5
+
6
+ import { CarouselBuyCard } from '@hanzo/commerce'
7
+
8
+ import {
9
+ useSelectAndBuy,
10
+ useCommerceDrawer,
11
+ } from '../../../commerce/ui/context'
12
+
13
+ import CommerceDrawer from './shell'
14
+ import CheckoutButton from '../checkout-button'
15
+ import Micro from './micro'
16
+
17
+ const CommerceUIComponent: React.FC = observer(() => {
18
+
19
+ const buy = useSelectAndBuy()
20
+ const drawer = useCommerceDrawer()
21
+ const router = useRouter()
22
+
23
+ const handleCheckout = (): void => {
24
+ router.push('/checkout')
25
+ }
26
+
27
+ const handleHandleClicked = (): void => {
28
+
29
+ if (drawer.state === 'full') {
30
+ buy.hideVariants()
31
+ }
32
+ else if (drawer.state === 'micro') {
33
+ buy.showRecentVariants()
34
+ }
35
+ }
36
+
37
+ const handleItemClicked = () => {
38
+ buy.showRecentVariants()
39
+ }
40
+
41
+ const handleCloseGesture = (): boolean => {
42
+ if (drawer.state === 'full') {
43
+ buy.hideVariants()
44
+ return true // "handled!"
45
+ }
46
+ return false
47
+ }
48
+
49
+ return (
50
+ <CommerceDrawer
51
+ handleHandleClicked={handleHandleClicked}
52
+ handleCloseGesture={handleCloseGesture}
53
+ drawerClx='flex flex-col'
54
+ >
55
+ {drawer.state === 'full' && (
56
+ /* The actual drawer is larger than the visible area (due to awkward
57
+ vaul impl. So we have to ask the drawer for its currect snappoint
58
+ and constrain layout to that.
59
+ */
60
+ <div style={{height: drawer.snapPointPx - 24 /* fudge factor for handle area */}} >
61
+ <CarouselBuyCard
62
+ skuPath={buy.currentSkuPath!}
63
+ checkoutButton={
64
+ <CheckoutButton
65
+ handleCheckout={handleCheckout}
66
+ className='w-full min-w-[160px] sm:max-w-[320px]'
67
+ />
68
+ }
69
+ clx='justify-between h-full pb-3 gap-8'
70
+ addBtnClx='w-full min-w-[160px] sm:max-w-[320px]'
71
+ buttonsAreaClx='grow-0 shrink-0 mt-0'
72
+ selectorClx='max-w-[475px] justify-between grow'
73
+
74
+ />
75
+ </div>
76
+ )}
77
+ {drawer.state === 'micro' && (
78
+ <Micro
79
+ handleCheckout={handleCheckout}
80
+ handleItemClicked={handleItemClicked}
81
+ clx='w-full px-2 sm:w-[460px] sm:mx-auto md:w-[550px]'
82
+ />
83
+ )}
84
+ </CommerceDrawer>
85
+ )
86
+ })
87
+
88
+ export default CommerceUIComponent