@luxfi/core 5.2.7 → 5.2.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (116) hide show
  1. package/commerce/ui/conf.ts +13 -13
  2. package/commerce/ui/context.tsx +126 -102
  3. package/commerce/ui/store.ts +304 -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/back-button.tsx +42 -0
  11. package/components/chat-widget.tsx +85 -85
  12. package/components/commerce/add-widget.tsx +20 -20
  13. package/components/commerce/bag-button.tsx +98 -98
  14. package/components/commerce/buy-button.tsx +34 -34
  15. package/components/commerce/checkout-button.tsx +129 -129
  16. package/components/commerce/checkout-panel/dt-bag-carousel.tsx +36 -36
  17. package/components/commerce/checkout-panel/dt-checkout-panel.tsx +84 -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 +130 -130
  29. package/components/commerce/drawer/index.tsx +99 -116
  30. package/components/commerce/drawer/micro.tsx +144 -144
  31. package/components/commerce/drawer/shell.tsx +85 -83
  32. package/components/commerce/mobile-bag-drawer.tsx +51 -51
  33. package/components/commerce/mobile-login-button.tsx +101 -101
  34. package/components/commerce/mobile-menu-toggle-button.tsx +35 -35
  35. package/components/commerce/mobile-nav-menu-ai.tsx +42 -44
  36. package/components/commerce/mobile-nav-menu-item.tsx +49 -49
  37. package/components/commerce/mobile-nav-menu.tsx +68 -68
  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 +49 -49
  45. package/components/header/index.tsx +52 -52
  46. package/components/header/mobile.tsx +163 -166
  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 -58
  60. package/components/icons/youtube-logo.tsx +59 -59
  61. package/components/index.ts +27 -25
  62. package/components/logo.tsx +89 -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/components/tooltip.tsx +31 -0
  72. package/environment.d.ts +5 -5
  73. package/next/analytics/fpixel.ts +15 -15
  74. package/next/analytics/google-analytics.ts +13 -13
  75. package/next/analytics/index.ts +3 -3
  76. package/next/analytics/pixel-analytics.tsx +54 -54
  77. package/next/font/get-app-router-font-classes.ts +12 -12
  78. package/next/font/load-and-return-lux-next-fonts-on-import.ts +68 -68
  79. package/next/font/next-font-desc.ts +27 -27
  80. package/next/font/pages-router-font-vars.tsx +18 -18
  81. package/next/head-metadata/from-next/metadata-types.ts +158 -158
  82. package/next/head-metadata/from-next/opengraph-types.ts +267 -267
  83. package/next/head-metadata/from-next/twitter-types.ts +92 -92
  84. package/next/head-metadata/index.tsx +208 -208
  85. package/next/middleware/determine-device-mw.ts +16 -16
  86. package/package.json +79 -78
  87. package/root-layout/WHY_THIS_IS_SEPARATE.txt +1 -1
  88. package/root-layout/index.tsx +112 -112
  89. package/server-actions/firebase-app.ts +14 -14
  90. package/server-actions/index.ts +5 -5
  91. package/server-actions/store-contact.ts +51 -51
  92. package/site-def/footer/community.tsx +67 -67
  93. package/site-def/footer/company.ts +37 -37
  94. package/site-def/footer/ecosystem.ts +37 -37
  95. package/site-def/footer/index.tsx +26 -26
  96. package/site-def/footer/legal.ts +28 -28
  97. package/site-def/footer/network.ts +45 -45
  98. package/site-def/footer/svg/warpcast-logo.svg +11 -11
  99. package/site-def/index.ts +2 -2
  100. package/site-def/main-nav.tsx +338 -338
  101. package/style/cart-animation.css +29 -29
  102. package/style/checkout-animation.css +23 -23
  103. package/style/drawer-handle-overrides.css +160 -160
  104. package/style/lux-colors.css +85 -85
  105. package/style/lux-global.css +30 -30
  106. package/tailwind/fontFamily.tailwind.lux.ts +18 -18
  107. package/tailwind/index.ts +2 -2
  108. package/tailwind/lux-tw-fonts.ts +39 -39
  109. package/tailwind/tailwind.config.lux-preset.ts +10 -10
  110. package/tsconfig.json +15 -15
  111. package/types/chatbot-config.ts +6 -6
  112. package/types/chatbot-suggested-question.ts +7 -7
  113. package/types/contact-info.ts +10 -10
  114. package/types/index.ts +4 -4
  115. package/types/site-def.ts +43 -43
  116. package/components/commerce/checkout-panel/close-button.tsx +0 -26
@@ -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
@@ -1,130 +1,130 @@
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 DesktopNav: React.FC<{
21
- links: LinkDefExtended[],
22
- }> = ({
23
- links
24
-
25
- }) => (
26
- links.length > 0 ? (
27
- <NavigationMenu>
28
- <NavigationMenuList>
29
- {links.map((el, index) => {
30
-
31
- if (el.isAIMenu) {
32
- return (
33
- <NavigationMenuItem key={index}>
34
- <Link href={el.href} legacyBehavior passHref>
35
- <NavigationMenuLink className={navigationMenuTriggerStyle()}>
36
- {el.title}
37
- </NavigationMenuLink>
38
- </Link>
39
- </NavigationMenuItem>
40
- )
41
- } else if (el.title == 'Community') {
42
- return (
43
- <NavigationMenuItem key={index}>
44
- <NavigationMenuTrigger>{el.title}</NavigationMenuTrigger>
45
- <NavigationMenuContent>
46
- <ul className="grid md:grid-cols-2 gap-3 p-6 md:w-[400px] lg:w-[500px]" key={index}>
47
- <li className="row-span-3" key='0'>
48
- <NavigationMenuLink asChild>
49
- <a
50
- 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"
51
- href={el.href}
52
- >
53
- <Warpcast />
54
- <div className="mb-2 mt-4 text-lg font-medium">
55
- {el.title}
56
- </div>
57
- <p className="text-sm leading-tight text-muted-foreground">
58
- {el.details}
59
- </p>
60
- </a>
61
- </NavigationMenuLink>
62
- </li>
63
- {el.childMenu?.map((component, index) => (
64
- <div className="relative flex items-center my-2" key={index}>
65
- <div className="mr-2 mt-0">
66
- {component.icon}
67
- </div>
68
- <ListItem href={component.href} title={component.title} key={index}>
69
- {component.contents}
70
- </ListItem>
71
- </div>
72
- ))}
73
-
74
- </ul>
75
- </NavigationMenuContent>
76
- </NavigationMenuItem>
77
- )
78
- } else {
79
- return (
80
- <NavigationMenuItem key={index}>
81
- <NavigationMenuTrigger>{el.title}</NavigationMenuTrigger>
82
- <NavigationMenuContent>
83
- <ul className="grid w-[400px] gap-3 p-4 md:w-[500px] md:grid-cols-2 lg:w-[500px] " key={index}>
84
- {el.childMenu?.map((component, index) => (
85
- <ListItem
86
- key={index}
87
- title={component.title}
88
- href={component.href}
89
- >
90
- {component.contents}
91
- </ListItem>
92
- ))}
93
- </ul>
94
- </NavigationMenuContent>
95
- </NavigationMenuItem>
96
- )
97
- }
98
-
99
- })}
100
- </NavigationMenuList>
101
- </NavigationMenu>
102
- ) : null
103
- )
104
- export default DesktopNav
105
-
106
- const ListItem = React.forwardRef<
107
- React.ElementRef<"a">,
108
- React.ComponentPropsWithoutRef<"a">
109
- >(({ className, title, children, key, ...props }, ref) => {
110
- return (
111
- <li key={key}>
112
- <NavigationMenuLink asChild>
113
- <a
114
- ref={ref}
115
- className={cn(
116
- "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",
117
- className
118
- )}
119
- {...props}
120
- >
121
- <div className="text-sm font-medium leading-none">{title}</div>
122
- <p className="line-clamp-3 text-sm leading-snug text-muted-foreground">
123
- {children}
124
- </p>
125
- </a>
126
- </NavigationMenuLink>
127
- </li>
128
- )
129
- })
130
- ListItem.displayName = "ListItem"
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 DesktopNav: React.FC<{
21
+ links: LinkDefExtended[],
22
+ }> = ({
23
+ links
24
+
25
+ }) => (
26
+ links.length > 0 ? (
27
+ <NavigationMenu>
28
+ <NavigationMenuList>
29
+ {links.map((el, index) => {
30
+
31
+ if (el.isAIMenu) {
32
+ return (
33
+ <NavigationMenuItem key={index}>
34
+ <Link href={el.href} legacyBehavior passHref>
35
+ <NavigationMenuLink className={navigationMenuTriggerStyle()}>
36
+ {el.title}
37
+ </NavigationMenuLink>
38
+ </Link>
39
+ </NavigationMenuItem>
40
+ )
41
+ } else if (el.title == 'Community') {
42
+ return (
43
+ <NavigationMenuItem key={index}>
44
+ <NavigationMenuTrigger>{el.title}</NavigationMenuTrigger>
45
+ <NavigationMenuContent>
46
+ <ul className="grid md:grid-cols-2 gap-3 p-6 md:w-[400px] lg:w-[500px]" key={index}>
47
+ <li className="row-span-3" key='0'>
48
+ <NavigationMenuLink asChild>
49
+ <a
50
+ 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"
51
+ href={el.href}
52
+ >
53
+ <Warpcast />
54
+ <div className="mb-2 mt-4 text-lg font-medium">
55
+ {el.title}
56
+ </div>
57
+ <p className="text-sm leading-tight text-muted-foreground">
58
+ {el.details}
59
+ </p>
60
+ </a>
61
+ </NavigationMenuLink>
62
+ </li>
63
+ {el.childMenu?.map((component, index) => (
64
+ <div className="relative flex items-center my-2" key={index}>
65
+ <div className="mr-2 mt-0">
66
+ {component.icon}
67
+ </div>
68
+ <ListItem href={component.href} title={component.title} key={index}>
69
+ {component.contents}
70
+ </ListItem>
71
+ </div>
72
+ ))}
73
+
74
+ </ul>
75
+ </NavigationMenuContent>
76
+ </NavigationMenuItem>
77
+ )
78
+ } else {
79
+ return (
80
+ <NavigationMenuItem key={index}>
81
+ <NavigationMenuTrigger>{el.title}</NavigationMenuTrigger>
82
+ <NavigationMenuContent>
83
+ <ul className="grid w-[400px] gap-3 p-4 md:w-[500px] md:grid-cols-2 lg:w-[500px] " key={index}>
84
+ {el.childMenu?.map((component, index) => (
85
+ <ListItem
86
+ key={index}
87
+ title={component.title}
88
+ href={component.href}
89
+ >
90
+ {component.contents}
91
+ </ListItem>
92
+ ))}
93
+ </ul>
94
+ </NavigationMenuContent>
95
+ </NavigationMenuItem>
96
+ )
97
+ }
98
+
99
+ })}
100
+ </NavigationMenuList>
101
+ </NavigationMenu>
102
+ ) : null
103
+ )
104
+ export default DesktopNav
105
+
106
+ const ListItem = React.forwardRef<
107
+ React.ElementRef<"a">,
108
+ React.ComponentPropsWithoutRef<"a">
109
+ >(({ className, title, children, key, ...props }, ref) => {
110
+ return (
111
+ <li key={key}>
112
+ <NavigationMenuLink asChild>
113
+ <a
114
+ ref={ref}
115
+ className={cn(
116
+ "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",
117
+ className
118
+ )}
119
+ {...props}
120
+ >
121
+ <div className="text-sm font-medium leading-none">{title}</div>
122
+ <p className="line-clamp-3 text-sm leading-snug text-muted-foreground">
123
+ {children}
124
+ </p>
125
+ </a>
126
+ </NavigationMenuLink>
127
+ </li>
128
+ )
129
+ })
130
+ ListItem.displayName = "ListItem"
@@ -1,116 +1,99 @@
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
+
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