@luxfi/core 5.2.4 → 5.2.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (114) hide show
  1. package/commerce/ui/conf.ts +13 -13
  2. package/commerce/ui/context.tsx +102 -102
  3. package/commerce/ui/store.ts +276 -276
  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/chat-widget.tsx +85 -85
  11. package/components/commerce/add-widget.tsx +20 -20
  12. package/components/commerce/bag-button.tsx +98 -98
  13. package/components/commerce/buy-button.tsx +34 -34
  14. package/components/commerce/checkout-button.tsx +129 -129
  15. package/components/commerce/checkout-panel/close-button.tsx +26 -26
  16. package/components/commerce/checkout-panel/dt-bag-carousel.tsx +36 -36
  17. package/components/commerce/checkout-panel/dt-checkout-panel.tsx +66 -66
  18. package/components/commerce/checkout-panel/index.tsx +129 -129
  19. package/components/commerce/checkout-panel/links-row.tsx +21 -21
  20. package/components/commerce/checkout-panel/mb-checkout-panel.tsx +54 -54
  21. package/components/commerce/checkout-panel/steps-indicator.tsx +39 -39
  22. package/components/commerce/checkout-panel/thank-you.tsx +18 -18
  23. package/components/commerce/checkout-widget/const.ts +13 -13
  24. package/components/commerce/checkout-widget/index.tsx +192 -192
  25. package/components/commerce/checkout-widget/obs-string-set.ts +48 -48
  26. package/components/commerce/checkout-widget/use-anim-clx-set.ts +58 -58
  27. package/components/commerce/desktop-bag-popup.tsx +78 -78
  28. package/components/commerce/desktop-nav-menu.tsx +235 -0
  29. package/components/commerce/drawer/index.tsx +116 -116
  30. package/components/commerce/drawer/micro.tsx +144 -144
  31. package/components/commerce/drawer/shell.tsx +83 -83
  32. package/components/commerce/mobile-bag-drawer.tsx +51 -51
  33. package/components/commerce/mobile-login-button.tsx +101 -100
  34. package/components/commerce/mobile-menu-toggle-button.tsx +35 -35
  35. package/components/commerce/mobile-nav-menu-ai.tsx +45 -98
  36. package/components/commerce/mobile-nav-menu-item.tsx +49 -45
  37. package/components/commerce/mobile-nav-menu.tsx +68 -80
  38. package/components/contact-dialog/contact-form.tsx +113 -113
  39. package/components/contact-dialog/disclaimer.tsx +13 -13
  40. package/components/contact-dialog/index.tsx +64 -64
  41. package/components/copyright.tsx +21 -21
  42. package/components/drawer-margin.tsx +25 -25
  43. package/components/footer.tsx +77 -77
  44. package/components/header/desktop.tsx +57 -54
  45. package/components/header/index.tsx +52 -40
  46. package/components/header/mobile.tsx +166 -165
  47. package/components/header/theme-toggle.tsx +26 -26
  48. package/components/icons/avatar.tsx +11 -11
  49. package/components/icons/bag-icon.tsx +10 -10
  50. package/components/icons/github.tsx +14 -14
  51. package/components/icons/index.tsx +43 -43
  52. package/components/icons/left-arrow.tsx +11 -11
  53. package/components/icons/lux-logo.tsx +10 -10
  54. package/components/icons/right-arrow.tsx +10 -10
  55. package/components/icons/search.tsx +12 -12
  56. package/components/icons/secure-delivery.tsx +13 -13
  57. package/components/icons/social-icon.tsx +35 -35
  58. package/components/icons/social-svg.css +3 -3
  59. package/components/icons/warpcast.tsx +58 -0
  60. package/components/icons/youtube-logo.tsx +59 -59
  61. package/components/index.ts +25 -25
  62. package/components/logo.tsx +81 -81
  63. package/components/main.tsx +27 -27
  64. package/components/mini-chart/index.tsx +7 -7
  65. package/components/mini-chart/mini-chart-props.ts +43 -43
  66. package/components/mini-chart/mini-chart.tsx +85 -85
  67. package/components/mini-chart/wrapper.tsx +23 -23
  68. package/components/not-found/index.tsx +28 -28
  69. package/components/not-found/not-found-content.mdx +5 -5
  70. package/components/scripts.tsx +24 -24
  71. package/environment.d.ts +5 -5
  72. package/next/analytics/fpixel.ts +15 -15
  73. package/next/analytics/google-analytics.ts +13 -13
  74. package/next/analytics/index.ts +3 -3
  75. package/next/analytics/pixel-analytics.tsx +54 -54
  76. package/next/font/get-app-router-font-classes.ts +12 -12
  77. package/next/font/load-and-return-lux-next-fonts-on-import.ts +68 -68
  78. package/next/font/next-font-desc.ts +27 -27
  79. package/next/font/pages-router-font-vars.tsx +18 -18
  80. package/next/head-metadata/from-next/metadata-types.ts +158 -158
  81. package/next/head-metadata/from-next/opengraph-types.ts +267 -267
  82. package/next/head-metadata/from-next/twitter-types.ts +92 -92
  83. package/next/head-metadata/index.tsx +208 -208
  84. package/next/middleware/determine-device-mw.ts +16 -16
  85. package/package.json +78 -78
  86. package/root-layout/WHY_THIS_IS_SEPARATE.txt +1 -1
  87. package/root-layout/index.tsx +112 -112
  88. package/server-actions/firebase-app.ts +14 -14
  89. package/server-actions/index.ts +5 -5
  90. package/server-actions/store-contact.ts +51 -51
  91. package/site-def/footer/community.tsx +67 -67
  92. package/site-def/footer/company.ts +37 -37
  93. package/site-def/footer/ecosystem.ts +37 -37
  94. package/site-def/footer/index.tsx +26 -26
  95. package/site-def/footer/legal.ts +28 -28
  96. package/site-def/footer/network.ts +45 -45
  97. package/site-def/footer/svg/warpcast-logo.svg +11 -11
  98. package/site-def/index.ts +2 -2
  99. package/site-def/main-nav.tsx +338 -292
  100. package/style/cart-animation.css +29 -29
  101. package/style/checkout-animation.css +23 -23
  102. package/style/drawer-handle-overrides.css +160 -160
  103. package/style/lux-colors.css +85 -85
  104. package/style/lux-global.css +30 -30
  105. package/tailwind/fontFamily.tailwind.lux.ts +18 -18
  106. package/tailwind/index.ts +2 -2
  107. package/tailwind/lux-tw-fonts.ts +39 -39
  108. package/tailwind/tailwind.config.lux-preset.ts +10 -10
  109. package/tsconfig.json +15 -15
  110. package/types/chatbot-config.ts +6 -6
  111. package/types/chatbot-suggested-question.ts +7 -7
  112. package/types/contact-info.ts +10 -10
  113. package/types/index.ts +4 -4
  114. package/types/site-def.ts +43 -43
@@ -1,78 +1,78 @@
1
- 'use client'
2
- import React, { useState, useEffect } from 'react'
3
- import { useRouter } from 'next/navigation'
4
-
5
- import { X } from 'lucide-react'
6
-
7
- import {
8
- Popover,
9
- PopoverContent,
10
- PopoverTrigger,
11
- PopoverClose,
12
- } from "@hanzo/ui/primitives"
13
-
14
- import { cn } from '@hanzo/ui/util'
15
- import { CartPanel, useCommerce } from '@hanzo/commerce'
16
-
17
- import * as Icons from '../icons'
18
- import sendGAEvent from '../../next/analytics/google-analytics'
19
-
20
- const DesktopBagPopup: React.FC<{
21
- triggerClx?: string
22
- popupClx?: string
23
- trigger: React.ReactNode
24
- }> = ({
25
- triggerClx='',
26
- popupClx='',
27
- trigger
28
- }) => {
29
- const cmmc = useCommerce()
30
-
31
- const [bagOpen, setBagOpen] = useState<boolean>(false)
32
- const router = useRouter()
33
-
34
- useEffect(() => {
35
- if (bagOpen) {
36
- sendGAEvent('view_cart', {
37
- items: cmmc.cartItems.map((item) => ({
38
- item_id: item.sku,
39
- item_name: item.title,
40
- item_category: item.familyId,
41
- price: item.price,
42
- quantity: item.quantity
43
- })),
44
- value: cmmc.cartTotal,
45
- currency: 'USD',
46
- })
47
- }
48
- }, [bagOpen])
49
-
50
- return (
51
- <Popover open={bagOpen} onOpenChange={setBagOpen}>
52
- <PopoverTrigger className={triggerClx}>
53
- {trigger}
54
- </PopoverTrigger>
55
- <PopoverContent sideOffset={28} className={cn('relative flex flex-col p-0 px-4 pb-4 pt-2', popupClx)}>
56
- <PopoverClose className='absolute z-above-content right-2 top-2 self-end hover:bg-level-3 text-muted hover:text-accent p-1 rounded-full'><X className='w-5 h-5'/></PopoverClose>
57
- <CartPanel
58
- handleCheckout={() => {router.push('/checkout')}}
59
- className='mt-4 mb-4 border-none py-0 px-4'
60
- listClx='rounded-sm pr-3'
61
- scrollAfter={5}
62
- scrollHeightClx='h-[70vh]'
63
- itemClx='mt-3'
64
- totalClx='sticky px-1 pr-2 -bottom-[1px] bg-level-1'
65
- buttonClx='max-w-[220px] flex-none'
66
- >
67
- <div className='flex flex-row items-center flex-none justify-center '>
68
- <Icons.bag className='mr-2 relative w-6 h-7 fill-foreground ' />
69
- <p className='font-heading text-foreground text-default'>Your Bag</p>
70
- </div>
71
- <div className='h-[1px] w-pr-80 bg-muted-3 mx-auto mt-1.5 flex-none'/>
72
- </CartPanel>
73
- </PopoverContent>
74
- </Popover>
75
- )
76
- }
77
-
78
- export default DesktopBagPopup
1
+ 'use client'
2
+ import React, { useState, useEffect } from 'react'
3
+ import { useRouter } from 'next/navigation'
4
+
5
+ import { X } from 'lucide-react'
6
+
7
+ import {
8
+ Popover,
9
+ PopoverContent,
10
+ PopoverTrigger,
11
+ PopoverClose,
12
+ } from "@hanzo/ui/primitives"
13
+
14
+ import { cn } from '@hanzo/ui/util'
15
+ import { CartPanel, useCommerce } from '@hanzo/commerce'
16
+
17
+ import * as Icons from '../icons'
18
+ import sendGAEvent from '../../next/analytics/google-analytics'
19
+
20
+ const DesktopBagPopup: React.FC<{
21
+ triggerClx?: string
22
+ popupClx?: string
23
+ trigger: React.ReactNode
24
+ }> = ({
25
+ triggerClx='',
26
+ popupClx='',
27
+ trigger
28
+ }) => {
29
+ const cmmc = useCommerce()
30
+
31
+ const [bagOpen, setBagOpen] = useState<boolean>(false)
32
+ const router = useRouter()
33
+
34
+ useEffect(() => {
35
+ if (bagOpen) {
36
+ sendGAEvent('view_cart', {
37
+ items: cmmc.cartItems.map((item) => ({
38
+ item_id: item.sku,
39
+ item_name: item.title,
40
+ item_category: item.familyId,
41
+ price: item.price,
42
+ quantity: item.quantity
43
+ })),
44
+ value: cmmc.cartTotal,
45
+ currency: 'USD',
46
+ })
47
+ }
48
+ }, [bagOpen])
49
+
50
+ return (
51
+ <Popover open={bagOpen} onOpenChange={setBagOpen}>
52
+ <PopoverTrigger className={triggerClx}>
53
+ {trigger}
54
+ </PopoverTrigger>
55
+ <PopoverContent sideOffset={28} className={cn('relative flex flex-col p-0 px-4 pb-4 pt-2', popupClx)}>
56
+ <PopoverClose className='absolute z-above-content right-2 top-2 self-end hover:bg-level-3 text-muted hover:text-accent p-1 rounded-full'><X className='w-5 h-5'/></PopoverClose>
57
+ <CartPanel
58
+ handleCheckout={() => {router.push('/checkout')}}
59
+ className='mt-4 mb-4 border-none py-0 px-4'
60
+ listClx='rounded-sm pr-3'
61
+ scrollAfter={5}
62
+ scrollHeightClx='h-[70vh]'
63
+ itemClx='mt-3'
64
+ totalClx='sticky px-1 pr-2 -bottom-[1px] bg-level-1'
65
+ buttonClx='max-w-[220px] flex-none'
66
+ >
67
+ <div className='flex flex-row items-center flex-none justify-center '>
68
+ <Icons.bag className='mr-2 relative w-6 h-7 fill-foreground ' />
69
+ <p className='font-heading text-foreground text-default'>Your Bag</p>
70
+ </div>
71
+ <div className='h-[1px] w-pr-80 bg-muted-3 mx-auto mt-1.5 flex-none'/>
72
+ </CartPanel>
73
+ </PopoverContent>
74
+ </Popover>
75
+ )
76
+ }
77
+
78
+ export default DesktopBagPopup
@@ -0,0 +1,235 @@
1
+ "use client"
2
+
3
+ import * as React from "react"
4
+
5
+ import Link from "next/link"
6
+ import { cn } from '@hanzo/ui/util'
7
+ import type { LinkDef } from '@hanzo/ui/types'
8
+ import type { LinkDefExtended } from "../../site-def/main-nav"
9
+ import {
10
+ NavigationMenu,
11
+ NavigationMenuContent,
12
+ NavigationMenuItem,
13
+ NavigationMenuLink,
14
+ NavigationMenuList,
15
+ NavigationMenuTrigger,
16
+ navigationMenuTriggerStyle
17
+ } from '@hanzo/ui/primitives'
18
+ import Warpcast from "../icons/warpcast"
19
+
20
+ // const components: { title: string; href: string; description: string }[] = [
21
+ // {
22
+ // title: "Alert Dialog",
23
+ // href: "/docs/primitives/alert-dialog",
24
+ // description:
25
+ // "A modal dialog that interrupts the user with important content and expects a response.",
26
+ // },
27
+ // {
28
+ // title: "Hover Card",
29
+ // href: "/docs/primitives/hover-card",
30
+ // description:
31
+ // "For sighted users to preview content available behind a link.",
32
+ // },
33
+ // {
34
+ // title: "Progress",
35
+ // href: "/docs/primitives/progress",
36
+ // description:
37
+ // "Displays an indicator showing the completion progress of a task, typically displayed as a progress bar.",
38
+ // },
39
+ // {
40
+ // title: "Scroll-area",
41
+ // href: "/docs/primitives/scroll-area",
42
+ // description: "Visually or semantically separates content.",
43
+ // },
44
+ // {
45
+ // title: "Tabs",
46
+ // href: "/docs/primitives/tabs",
47
+ // description:
48
+ // "A set of layered sections of content—known as tab panels—that are displayed one at a time.",
49
+ // },
50
+ // {
51
+ // title: "Tooltip",
52
+ // href: "/docs/primitives/tooltip",
53
+ // description:
54
+ // "A popup that displays information related to an element when the element receives keyboard focus or the mouse hovers over it.",
55
+ // },
56
+ // ]
57
+
58
+ // export function NavigationMenuDemo() {
59
+ // return (
60
+ // <NavigationMenu>
61
+ // <NavigationMenuList>
62
+ // <NavigationMenuItem>
63
+ // <NavigationMenuTrigger>Getting started</NavigationMenuTrigger>
64
+ // <NavigationMenuContent>
65
+ // <ul className="grid gap-3 p-6 md:w-[400px] lg:w-[500px] lg:grid-cols-[.75fr_1fr]">
66
+ // <li className="row-span-3">
67
+ // <NavigationMenuLink asChild>
68
+ // <a
69
+ // className="flex h-full w-full select-none flex-col justify-end rounded-md bg-gradient-to-b from-muted/50 to-muted p-6 no-underline outline-none focus:shadow-md"
70
+ // href="/"
71
+ // >
72
+ // {/* <Icons.logo className="h-6 w-6" /> */}
73
+ // <div className="mb-2 mt-4 text-lg font-medium">
74
+ // shadcn/ui
75
+ // </div>
76
+ // <p className="text-sm leading-tight text-muted-foreground">
77
+ // Beautifully designed components that you can copy and
78
+ // paste into your apps. Accessible. Customizable. Open
79
+ // Source.
80
+ // </p>
81
+ // </a>
82
+ // </NavigationMenuLink>
83
+ // </li>
84
+ // <ListItem href="/docs" title="Introduction">
85
+ // Re-usable components built using Radix UI and Tailwind CSS.
86
+ // </ListItem>
87
+ // <ListItem href="/docs/installation" title="Installation">
88
+ // How to install dependencies and structure your app.
89
+ // </ListItem>
90
+ // <ListItem href="/docs/primitives/typography" title="Typography">
91
+ // Styles for headings, paragraphs, lists...etc
92
+ // </ListItem>
93
+ // </ul>
94
+ // </NavigationMenuContent>
95
+ // </NavigationMenuItem>
96
+ // <NavigationMenuItem>
97
+ // <NavigationMenuTrigger>Components</NavigationMenuTrigger>
98
+ // <NavigationMenuContent>
99
+ // <ul className="w-[400px] gap-3 p-4 md:w-[500px] md:grid-cols-1 lg:w-[600px] ">
100
+ // {components.map((component) => (
101
+ // <ListItem
102
+ // key={component.title}
103
+ // title={component.title}
104
+ // href={component.href}
105
+ // >
106
+ // {component.description}
107
+ // </ListItem>
108
+ // ))}
109
+ // </ul>
110
+ // </NavigationMenuContent>
111
+ // </NavigationMenuItem>
112
+ // <NavigationMenuItem>
113
+ // <Link href="/docs" legacyBehavior passHref>
114
+ // <NavigationMenuLink className={navigationMenuTriggerStyle()}>
115
+ // Documentation
116
+ // </NavigationMenuLink>
117
+ // </Link>
118
+ // </NavigationMenuItem>
119
+ // </NavigationMenuList>
120
+ // </NavigationMenu>
121
+ // )
122
+ // }
123
+
124
+
125
+ const DesktopNav: React.FC<{
126
+ links: LinkDefExtended[],
127
+ }> = ({
128
+ links
129
+
130
+ }) => (
131
+ links.length > 0 ? (
132
+ <NavigationMenu>
133
+ <NavigationMenuList>
134
+ {links.map((el, index) => {
135
+
136
+ if (el.isAIMenu) {
137
+ return (
138
+ <NavigationMenuItem>
139
+ <Link href={el.href} legacyBehavior passHref>
140
+ <NavigationMenuLink className={navigationMenuTriggerStyle()}>
141
+ {el.title}
142
+ </NavigationMenuLink>
143
+ </Link>
144
+ </NavigationMenuItem>
145
+ )
146
+ } else if (el.title == 'Community') {
147
+ return (
148
+ <NavigationMenuItem>
149
+ <NavigationMenuTrigger>{el.title}</NavigationMenuTrigger>
150
+ <NavigationMenuContent>
151
+ <ul className="grid md:grid-cols-2 gap-3 p-6 md:w-[400px] lg:w-[500px]">
152
+ <li className="row-span-3">
153
+ <NavigationMenuLink asChild>
154
+ <a
155
+ className="flex h-full w-full select-none flex-col justify-end rounded-md bg-gradient-to-b from-muted/50 to-muted p-6 no-underline outline-none focus:shadow-md"
156
+ href={el.href}
157
+ >
158
+ <Warpcast />
159
+ <div className="mb-2 mt-4 text-lg font-medium">
160
+ {el.title}
161
+ </div>
162
+ <p className="text-sm leading-tight text-muted-foreground">
163
+ {el.details}
164
+ </p>
165
+ </a>
166
+ </NavigationMenuLink>
167
+ </li>
168
+ {el.childMenu?.map((component) => (
169
+ <div className="relative flex items-center my-2">
170
+ <div className="mr-2 mt-0">
171
+ {component.icon}
172
+ </div>
173
+ <ListItem href={component.href} title={component.title}>
174
+ {component.contents}
175
+ </ListItem>
176
+ </div>
177
+ ))}
178
+
179
+ </ul>
180
+ </NavigationMenuContent>
181
+ </NavigationMenuItem>
182
+ )
183
+ } else {
184
+ return (
185
+ <NavigationMenuItem>
186
+ <NavigationMenuTrigger>{el.title}</NavigationMenuTrigger>
187
+ <NavigationMenuContent>
188
+ <ul className="grid w-[400px] gap-3 p-4 md:w-[500px] md:grid-cols-2 lg:w-[500px] ">
189
+ {el.childMenu?.map((component) => (
190
+ <ListItem
191
+ key={component.title}
192
+ title={component.title}
193
+ href={component.href}
194
+ >
195
+ {component.contents}
196
+ </ListItem>
197
+ ))}
198
+ </ul>
199
+ </NavigationMenuContent>
200
+ </NavigationMenuItem>
201
+ )
202
+ }
203
+
204
+ })}
205
+ </NavigationMenuList>
206
+ </NavigationMenu>
207
+ ) : null
208
+ )
209
+ export default DesktopNav
210
+
211
+ const ListItem = React.forwardRef<
212
+ React.ElementRef<"a">,
213
+ React.ComponentPropsWithoutRef<"a">
214
+ >(({ className, title, children, ...props }, ref) => {
215
+ return (
216
+ <li>
217
+ <NavigationMenuLink asChild>
218
+ <a
219
+ ref={ref}
220
+ className={cn(
221
+ "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",
222
+ className
223
+ )}
224
+ {...props}
225
+ >
226
+ <div className="text-sm font-medium leading-none">{title}</div>
227
+ <p className="line-clamp-3 text-sm leading-snug text-muted-foreground">
228
+ {children}
229
+ </p>
230
+ </a>
231
+ </NavigationMenuLink>
232
+ </li>
233
+ )
234
+ })
235
+ ListItem.displayName = "ListItem"
@@ -1,116 +1,116 @@
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
- // see handleCloseGesture()
31
- const setOpen = (b: boolean): void => {
32
- if (!b) {
33
- if (!drawer.closedByUser) {
34
- drawer.setClosedByUser(true)
35
- }
36
- }
37
- }
38
-
39
- const handleHandleClicked = (): void => {
40
-
41
- if (drawer.state === 'full') {
42
- buy.hideVariants()
43
- }
44
- else if (drawer.state === 'micro') {
45
- if (drawer.showAdded) {
46
- buy.showVariants(recent.item?.sku ?? '')
47
- }
48
- // checkout only
49
- else {
50
- drawer.setClosedByUser(true)
51
- }
52
- }
53
- }
54
-
55
- const handleItemClicked = () => {
56
- buy.showVariants(recent.item?.sku ?? '')
57
- }
58
-
59
- const handleCloseGesture = (): boolean => {
60
- if (drawer.state === 'full') {
61
- buy.hideVariants()
62
- return true // "handled!"
63
- }
64
- return false
65
- }
66
-
67
-
68
- return (
69
- <CommerceDrawer
70
- open={drawer.open}
71
- setOpen={setOpen}
72
- snapPoints={drawer.points}
73
- modal={drawer.modal}
74
- activeSnapPoint={drawer.activePoint}
75
- setActiveSnapPoint={drawer.onActivePointChanged.bind(drawer)}
76
- handleHandleClicked={handleHandleClicked}
77
- handleCloseGesture={handleCloseGesture}
78
- micro={drawer.state === 'micro'}
79
- mobile={drawer.isMobile}
80
- drawerClx='flex flex-col'
81
- >
82
- {drawer.state === 'full' && (
83
- /* The actual drawer is larger than the visible area (due to awkward
84
- vaul impl. So we have to ask the drawer for its currect snappoint
85
- and constrain layout to that.
86
- */
87
- <div style={{height: drawer.snapPointPx - 24 /* fudge factor for handle area */}}>
88
- <CarouselBuyCard
89
- skuPath={buy.currentSkuPath!}
90
- checkoutButton={
91
- <CheckoutButton
92
- handleCheckout={handleCheckout}
93
- className='w-full min-w-[160px] sm:max-w-[320px]'
94
- />
95
- }
96
- onQuantityChanged={recent.quantityChanged.bind(recent)}
97
- clx='justify-between h-full pb-3 gap-8'
98
- addBtnClx='w-full min-w-[160px] sm:max-w-[320px]'
99
- buttonsAreaClx='grow-0 shrink-0 mt-0'
100
- selectorClx='max-w-[475px] justify-between grow'
101
-
102
- />
103
- </div>
104
- )}
105
- {drawer.state === 'micro' && (
106
- <Micro
107
- handleCheckout={handleCheckout}
108
- handleItemClicked={handleItemClicked}
109
- clx='w-full px-2 sm:w-[460px] sm:mx-auto md:w-[550px]'
110
- />
111
- )}
112
- </CommerceDrawer>
113
- )
114
- })
115
-
116
- 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
+ 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
+ // see handleCloseGesture()
31
+ const setOpen = (b: boolean): void => {
32
+ if (!b) {
33
+ if (!drawer.closedByUser) {
34
+ drawer.setClosedByUser(true)
35
+ }
36
+ }
37
+ }
38
+
39
+ const handleHandleClicked = (): void => {
40
+
41
+ if (drawer.state === 'full') {
42
+ buy.hideVariants()
43
+ }
44
+ else if (drawer.state === 'micro') {
45
+ if (drawer.showAdded) {
46
+ buy.showVariants(recent.item?.sku ?? '')
47
+ }
48
+ // checkout only
49
+ else {
50
+ drawer.setClosedByUser(true)
51
+ }
52
+ }
53
+ }
54
+
55
+ const handleItemClicked = () => {
56
+ buy.showVariants(recent.item?.sku ?? '')
57
+ }
58
+
59
+ const handleCloseGesture = (): boolean => {
60
+ if (drawer.state === 'full') {
61
+ buy.hideVariants()
62
+ return true // "handled!"
63
+ }
64
+ return false
65
+ }
66
+
67
+
68
+ return (
69
+ <CommerceDrawer
70
+ open={drawer.open}
71
+ setOpen={setOpen}
72
+ snapPoints={drawer.points}
73
+ modal={drawer.modal}
74
+ activeSnapPoint={drawer.activePoint}
75
+ setActiveSnapPoint={drawer.onActivePointChanged.bind(drawer)}
76
+ handleHandleClicked={handleHandleClicked}
77
+ handleCloseGesture={handleCloseGesture}
78
+ micro={drawer.state === 'micro'}
79
+ mobile={drawer.isMobile}
80
+ drawerClx='flex flex-col'
81
+ >
82
+ {drawer.state === 'full' && (
83
+ /* The actual drawer is larger than the visible area (due to awkward
84
+ vaul impl. So we have to ask the drawer for its currect snappoint
85
+ and constrain layout to that.
86
+ */
87
+ <div style={{height: drawer.snapPointPx - 24 /* fudge factor for handle area */}}>
88
+ <CarouselBuyCard
89
+ skuPath={buy.currentSkuPath!}
90
+ checkoutButton={
91
+ <CheckoutButton
92
+ handleCheckout={handleCheckout}
93
+ className='w-full min-w-[160px] sm:max-w-[320px]'
94
+ />
95
+ }
96
+ onQuantityChanged={recent.quantityChanged.bind(recent)}
97
+ clx='justify-between h-full pb-3 gap-8'
98
+ addBtnClx='w-full min-w-[160px] sm:max-w-[320px]'
99
+ buttonsAreaClx='grow-0 shrink-0 mt-0'
100
+ selectorClx='max-w-[475px] justify-between grow'
101
+
102
+ />
103
+ </div>
104
+ )}
105
+ {drawer.state === 'micro' && (
106
+ <Micro
107
+ handleCheckout={handleCheckout}
108
+ handleItemClicked={handleItemClicked}
109
+ clx='w-full px-2 sm:w-[460px] sm:mx-auto md:w-[550px]'
110
+ />
111
+ )}
112
+ </CommerceDrawer>
113
+ )
114
+ })
115
+
116
+ export default CommerceUIComponent