@luxfi/core 5.1.4 → 5.1.6

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.
Files changed (125) hide show
  1. package/commerce/{AUTO-GEN-bullion-by-family.json → data/AUTO-GEN-bullion-by-family.json} +33 -33
  2. package/commerce/{EDIT-ME-bullion-market-prices.ts → data/EDIT-ME-bullion-market-prices.ts} +11 -11
  3. package/commerce/{assign-prices.ts → data/assign-prices.ts} +49 -49
  4. package/commerce/{assign-videos-by-family-group.ts → data/assign-videos-by-family-group.ts} +14 -14
  5. package/commerce/{bullion-price-1oz.ts → data/bullion-price-1oz.ts} +5 -5
  6. package/commerce/{index.ts → data/index.ts} +18 -18
  7. package/commerce/ui/conf.ts +13 -0
  8. package/commerce/ui/context.tsx +102 -0
  9. package/commerce/ui/store.ts +277 -0
  10. package/components/access-code-input.tsx +71 -71
  11. package/components/auth/auth-listener.tsx +29 -29
  12. package/components/auth/auth-token/clear-auth-token.tsx +12 -12
  13. package/components/auth/auth-token/set-auth-token.tsx +16 -16
  14. package/components/auth/common-auth-domains.ts +16 -16
  15. package/components/auth/login-panel.tsx +107 -104
  16. package/components/chat-widget.tsx +85 -80
  17. package/components/commerce/add-widget.tsx +20 -0
  18. package/components/commerce/bag-button.tsx +98 -98
  19. package/components/commerce/buy-button.tsx +34 -0
  20. package/components/commerce/checkout-button.tsx +129 -116
  21. package/components/commerce/checkout-panel/close-button.tsx +26 -26
  22. package/components/commerce/checkout-panel/dt-bag-carousel.tsx +36 -36
  23. package/components/commerce/checkout-panel/dt-checkout-panel.tsx +66 -66
  24. package/components/commerce/checkout-panel/index.tsx +129 -124
  25. package/components/commerce/checkout-panel/links-row.tsx +21 -21
  26. package/components/commerce/checkout-panel/mb-checkout-panel.tsx +54 -54
  27. package/components/commerce/checkout-panel/steps-indicator.tsx +39 -39
  28. package/components/commerce/checkout-panel/thank-you.tsx +18 -18
  29. package/components/commerce/checkout-widget/const.ts +13 -13
  30. package/components/commerce/checkout-widget/index.tsx +192 -86
  31. package/components/commerce/checkout-widget/obs-string-set.ts +48 -48
  32. package/components/commerce/checkout-widget/use-anim-clx-set.ts +58 -56
  33. package/components/commerce/desktop-bag-popup.tsx +78 -78
  34. package/components/commerce/drawer/index.tsx +117 -0
  35. package/components/commerce/drawer/micro.tsx +136 -0
  36. package/components/commerce/drawer/shell.tsx +79 -0
  37. package/components/commerce/mobile-bag-drawer.tsx +51 -51
  38. package/components/commerce/mobile-login-button.tsx +100 -100
  39. package/components/commerce/mobile-menu-toggle-button.tsx +35 -35
  40. package/components/commerce/mobile-nav-menu-ai.tsx +97 -97
  41. package/components/commerce/mobile-nav-menu-item.tsx +45 -45
  42. package/components/commerce/mobile-nav-menu.tsx +80 -79
  43. package/components/contact-dialog/contact-form.tsx +113 -112
  44. package/components/contact-dialog/disclaimer.tsx +13 -13
  45. package/components/contact-dialog/index.tsx +64 -64
  46. package/components/copyright.tsx +21 -21
  47. package/components/drawer-margin.tsx +25 -0
  48. package/components/footer.tsx +77 -77
  49. package/components/header/desktop.tsx +54 -54
  50. package/components/header/index.tsx +40 -47
  51. package/components/header/mobile.tsx +165 -165
  52. package/components/header/theme-toggle.tsx +26 -26
  53. package/components/icons/avatar.tsx +11 -11
  54. package/components/icons/bag-icon.tsx +10 -10
  55. package/components/icons/github.tsx +14 -14
  56. package/components/icons/index.tsx +43 -43
  57. package/components/icons/left-arrow.tsx +11 -11
  58. package/components/icons/lux-logo.tsx +10 -10
  59. package/components/icons/right-arrow.tsx +10 -10
  60. package/components/icons/search.tsx +12 -12
  61. package/components/icons/secure-delivery.tsx +13 -13
  62. package/components/icons/social-icon.tsx +35 -35
  63. package/components/icons/social-svg.css +3 -3
  64. package/components/icons/youtube-logo.tsx +59 -59
  65. package/components/index.ts +25 -27
  66. package/components/logo.tsx +81 -81
  67. package/components/main.tsx +27 -0
  68. package/components/mini-chart/index.tsx +7 -7
  69. package/components/mini-chart/mini-chart-props.ts +43 -43
  70. package/components/mini-chart/mini-chart.tsx +85 -85
  71. package/components/mini-chart/wrapper.tsx +23 -23
  72. package/components/not-found/index.tsx +28 -27
  73. package/components/not-found/not-found-content.mdx +5 -5
  74. package/components/scripts.tsx +24 -24
  75. package/conf/index.ts +52 -50
  76. package/{commerce/lux-service-options.ts → conf/lux-commerce-options.ts} +6 -6
  77. package/environment.d.ts +5 -5
  78. package/next/analytics/fpixel.ts +15 -15
  79. package/next/analytics/google-analytics.ts +13 -13
  80. package/next/analytics/index.ts +3 -3
  81. package/next/analytics/pixel-analytics.tsx +54 -54
  82. package/next/font/get-app-router-font-classes.ts +12 -12
  83. package/next/font/load-and-return-lux-next-fonts-on-import.ts +68 -68
  84. package/next/font/next-font-desc.ts +27 -27
  85. package/next/font/pages-router-font-vars.tsx +18 -18
  86. package/next/head-metadata/from-next/metadata-types.ts +158 -158
  87. package/next/head-metadata/from-next/opengraph-types.ts +267 -267
  88. package/next/head-metadata/from-next/twitter-types.ts +92 -92
  89. package/next/head-metadata/index.tsx +208 -208
  90. package/next/middleware/determine-device-mw.ts +16 -16
  91. package/package.json +80 -73
  92. package/root-layout/WHY_THIS_IS_SEPARATE.txt +1 -1
  93. package/root-layout/index.tsx +118 -121
  94. package/server-actions/firebase-app.ts +14 -14
  95. package/server-actions/index.ts +5 -5
  96. package/server-actions/store-contact.ts +51 -51
  97. package/site-def/footer/community.tsx +67 -67
  98. package/site-def/footer/company.ts +37 -37
  99. package/site-def/footer/ecosystem.ts +37 -37
  100. package/site-def/footer/index.tsx +26 -26
  101. package/site-def/footer/legal.ts +28 -28
  102. package/site-def/footer/network.ts +45 -45
  103. package/site-def/footer/svg/warpcast-logo.svg +11 -11
  104. package/site-def/index.ts +2 -2
  105. package/site-def/main-nav.tsx +292 -292
  106. package/style/cart-animation.css +29 -29
  107. package/style/checkout-animation.css +23 -23
  108. package/style/drawer-handle-overrides.css +160 -0
  109. package/style/lux-colors.css +85 -85
  110. package/style/lux-global.css +30 -30
  111. package/tailwind/fontFamily.tailwind.lux.ts +18 -18
  112. package/tailwind/index.ts +2 -2
  113. package/tailwind/lux-tw-fonts.ts +39 -39
  114. package/tailwind/tailwind.config.lux-preset.ts +10 -10
  115. package/tsconfig.json +15 -10
  116. package/types/chatbot-config.ts +6 -6
  117. package/types/chatbot-suggested-question.ts +7 -7
  118. package/types/commerce-config.ts +10 -10
  119. package/types/contact-info.ts +10 -10
  120. package/types/index.ts +5 -5
  121. package/types/site-def.ts +45 -45
  122. package/components/commerce/buy-drawer/drawer.tsx +0 -44
  123. package/components/commerce/buy-drawer/index.tsx +0 -46
  124. package/components/commerce/checkout-widget/use-lagging-item-ref.ts +0 -30
  125. package/components/header/guts.tsx +0 -27
@@ -0,0 +1,117 @@
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
+ console.log("ON CLOSE")
34
+ if (!drawer.closedByUser) {
35
+ console.log("syncing closed state to UI gesture")
36
+ drawer.setClosedByUser(true)
37
+ }
38
+ }
39
+ }
40
+
41
+ const handleHandleClicked = (): void => {
42
+
43
+ if (drawer.state === 'full') {
44
+ buy.hideVariants()
45
+ }
46
+ else if (drawer.state === 'micro') {
47
+ if (drawer.showAdded) {
48
+ buy.showVariants(recent.item?.sku ?? '')
49
+ }
50
+ // checkout only
51
+ else {
52
+ drawer.setClosedByUser(true)
53
+ }
54
+ }
55
+ }
56
+
57
+ const handleItemClicked = () => {
58
+ buy.showVariants(recent.item?.sku ?? '')
59
+ }
60
+
61
+ const handleCloseGesture = (): boolean => {
62
+ if (drawer.state === 'full') {
63
+ buy.hideVariants()
64
+ return true // "handled!"
65
+ }
66
+ return false
67
+ }
68
+
69
+
70
+ return (
71
+ <CommerceDrawer
72
+ open={drawer.open}
73
+ setOpen={setOpen}
74
+ snapPoints={drawer.points}
75
+ modal={drawer.modal}
76
+ activeSnapPoint={drawer.activePoint}
77
+ setActiveSnapPoint={drawer.onActivePointChanged.bind(drawer)}
78
+ handleHandleClicked={handleHandleClicked}
79
+ handleCloseGesture={handleCloseGesture}
80
+ micro={drawer.state === 'micro'}
81
+ mobile={drawer.isMobile}
82
+ drawerClx='flex flex-col'
83
+ >
84
+ {drawer.state === 'full' && (
85
+ /* The actual drawer is larger than the visible area (due to awkward
86
+ vaul impl. So we have to ask the drawer for its currect snappoint
87
+ and constrain layout to that.
88
+ */
89
+ <div style={{height: drawer.snapPointPx - 24 /* fudge factor for handle area */}}>
90
+ <CarouselBuyCard
91
+ skuPath={buy.currentSkuPath!}
92
+ checkoutButton={
93
+ <CheckoutButton
94
+ handleCheckout={handleCheckout}
95
+ className='w-full min-w-[160px] sm:max-w-[320px]'
96
+ />
97
+ }
98
+ onQuantityChanged={recent.quantityChanged.bind(recent)}
99
+ clx='justify-between h-full pb-3'
100
+ addBtnClx='w-full min-w-[160px] sm:max-w-[320px]'
101
+ selectorClx='max-w-[475px]'
102
+
103
+ />
104
+ </div>
105
+ )}
106
+ {drawer.state === 'micro' && (
107
+ <Micro
108
+ handleCheckout={handleCheckout}
109
+ handleItemClicked={handleItemClicked}
110
+ clx='w-full sm:w-[460px] sm:mx-auto md:w-[550px]'
111
+ />
112
+ )}
113
+ </CommerceDrawer>
114
+ )
115
+ })
116
+
117
+ export default CommerceUIComponent
@@ -0,0 +1,136 @@
1
+ 'use client'
2
+ import React from 'react'
3
+ import { observer } from 'mobx-react-lite'
4
+
5
+ import { Button, Image } from '@hanzo/ui/primitives'
6
+ import { cn, } from '@hanzo/ui/util'
7
+ import type { LineItem } from '@hanzo/commerce/types'
8
+ import { useCommerce, formatCurrencyValue } from '@hanzo/commerce'
9
+
10
+ import CheckoutButton from '../checkout-button'
11
+ import { useCommerceDrawer, useRecentActivity } from '../../../commerce/ui/context'
12
+
13
+ const CN = {
14
+ // h: mind padding!
15
+ mobile: { w: 36, h: 36 },
16
+ sm: { w: 60, h: 36 },
17
+ desktop: { w: 60, h: 36 },
18
+ }
19
+
20
+ const renderTitle = (item: LineItem): React.ReactNode => {
21
+ const toks = item.title.split(', ')
22
+ if (toks.length === 2) {
23
+ return <><p>{toks[0]},</p><p className=''>{toks[1]}</p></>
24
+ }
25
+ return <p>{item.title}</p>
26
+ }
27
+
28
+ const Info: React.FC<{
29
+ item: LineItem
30
+ clx?: string
31
+ }> = ({
32
+ item,
33
+ clx=''
34
+ }) => {
35
+
36
+ const cmmc = useCommerce()
37
+ const family = cmmc.getFamilyById(item.familyId)
38
+
39
+ let topLine = family!.title
40
+ if (item.sku.startsWith('LXM-AG') || item.sku.startsWith('LXM-AU')) {
41
+ topLine = family!.parentTitle + ', ' + family!.title
42
+ }
43
+
44
+ const optionLabel = item.optionLabelShort ?? item.optionLabel
45
+ const priceStr = formatCurrencyValue(item.price)
46
+
47
+ return (<>
48
+ <div className={cn('sm:hidden flex flex-col !text-muted items-stretch whitespace-nowrap text-ellipsis ', clx)}>
49
+ <p className='text-left text-xs'>{topLine}</p>
50
+ <div className='flex justify-between text-xxs'>
51
+ <div>{optionLabel}</div>
52
+ <div className='pl-2.5'>{priceStr}</div>
53
+ </div>
54
+ </div>
55
+ <div className={cn('hidden sm:flex !text-muted flex-col items-stretch whitespace-nowrap text-ellipsis text-xs', clx)}>
56
+ <p className='text-left'>{topLine}</p>
57
+ <div className='flex justify-between'>
58
+ <div>{optionLabel}</div>
59
+ <div className='pl-2.5'>{priceStr}</div>
60
+ </div>
61
+ </div>
62
+ </>)
63
+ }
64
+
65
+
66
+ const Micro: React.FC<{
67
+ clx?: string
68
+ handleCheckout: () => void
69
+ handleItemClicked: () => void
70
+ }> = observer(({
71
+ clx='',
72
+ handleCheckout,
73
+ handleItemClicked
74
+ }) => {
75
+
76
+ const drawer = useCommerceDrawer()
77
+ const recent = useRecentActivity()
78
+
79
+ return (
80
+ <div className={cn(
81
+ 'px-2 sm:px-3 sm:px-0',
82
+ (drawer.showAdded ? 'grid grid-cols-2 ' : 'flex justify-center items-center '),
83
+ 'gap-2 md:gap-3 relative',
84
+ clx
85
+ )}>
86
+ {drawer.showAdded && (
87
+ <div className='pb-3 flex flex-col items-stretch'>
88
+ <p className='text-muted text-xxs md:text-xs leading-none pl-1'>recent item:</p>
89
+ <Button
90
+ variant='ghost'
91
+ rounded='sm'
92
+ onClick={handleItemClicked}
93
+ className={cn(
94
+ 'flex flex-row justify-between items-center gap-1',
95
+ '-ml-1.5',
96
+ 'overflow-hidden ',
97
+ 'px-1 py-1 md:px-2 md:py-2',
98
+ )}
99
+ >
100
+ {recent.item?.img && (<>
101
+ <Image def={recent.item.img} constrainTo={CN.mobile} preload className='sm:hidden grow-0 shrink-0'/>
102
+ <Image def={recent.item.img} constrainTo={CN.sm} preload className='hidden sm:flex md:hidden grow-0 shrink-0'/>
103
+ <Image def={recent.item.img} constrainTo={CN.desktop} preload className='hidden md:flex grow-0 shrink-0'/>
104
+ </>)}
105
+ {recent.item && (
106
+ <div className='grow w-full'>
107
+ <Info item={recent.item} clx='w-full'/>
108
+ </div>
109
+ )}
110
+ </Button>
111
+ </div>
112
+ )}
113
+ {drawer.showCheckout && (
114
+ <div className={cn(
115
+ 'flex flex-col justify-center w-full',
116
+ (drawer.showAdded ? 'items-stretch' : 'items-center pt-3' )
117
+ )}>
118
+ <CheckoutButton
119
+ handleCheckout={handleCheckout}
120
+ variant='primary'
121
+ size={drawer.isMobile ? 'default' : 'lg'}
122
+ rounded={drawer.isMobile ? 'md' : 'lg'}
123
+ centerText={drawer.isMobile ? !drawer.showAdded : true}
124
+ className={cn(drawer.isMobile ?
125
+ (drawer.showAdded ? 'pl-3.5 pr-2.5' : 'min-w-[320px]')
126
+ :
127
+ (drawer.showAdded ? '' : 'w-[320px]')
128
+ )}
129
+ />
130
+ </div>
131
+ )}
132
+ </div>
133
+ )
134
+ })
135
+
136
+ export default Micro
@@ -0,0 +1,79 @@
1
+ 'use client'
2
+ import React, {type PropsWithChildren } from 'react'
3
+
4
+ import { X as LucideX} from 'lucide-react'
5
+
6
+ import {
7
+ Button,
8
+ Drawer,
9
+ DrawerContent,
10
+ DrawerHandle,
11
+ type DrawerProps,
12
+ } from '@hanzo/ui/primitives'
13
+ import { cn } from '@hanzo/ui/util'
14
+
15
+ import '../../../style/drawer-handle-overrides.css'
16
+
17
+ const CommerceDrawer: React.FC<PropsWithChildren &
18
+ Omit<DrawerProps, 'onOpenChange'> &
19
+ {
20
+ setOpen: (b: boolean) => void
21
+ handleHandleClicked: () => void
22
+ drawerClx?: string
23
+ mobile?: boolean
24
+ micro?: boolean
25
+ }
26
+ > = ({
27
+ children,
28
+ open,
29
+ setOpen,
30
+ modal,
31
+ snapPoints,
32
+ setActiveSnapPoint,
33
+ activeSnapPoint,
34
+ handleHandleClicked,
35
+ drawerClx='',
36
+ mobile=false,
37
+ micro=false,
38
+ ...rest
39
+ }) => (
40
+ // @ts-ignore
41
+ <Drawer
42
+ open={open}
43
+ onOpenChange={setOpen}
44
+ modal={modal}
45
+ snapPoints={snapPoints}
46
+ setActiveSnapPoint={setActiveSnapPoint}
47
+ activeSnapPoint={activeSnapPoint}
48
+ fastDragSkipsToEnd={false}
49
+ dragHandleOnly={true}
50
+ handleHandleClicked={handleHandleClicked}
51
+ // debugOutput
52
+ {...rest}
53
+ >
54
+ <DrawerContent
55
+ defaultHandle={false}
56
+ className={cn(
57
+ (modal ? 'rounded-t-xl border-muted-2' : 'rounded-t-md border-muted-4' ),
58
+ (micro ? (mobile ? 'mt-4 pt-1.5' : 'mt-5 pt-4') : 'mt-5 pt-5'),
59
+ 'w-full h-full'
60
+ )}
61
+ // https://github.com/radix-ui/primitives/discussions/935
62
+ onOpenAutoFocus={(e) => {e.preventDefault()}}
63
+ >
64
+ <DrawerHandle
65
+ className={cn(
66
+ 'absolute left-0 right-0 mx-auto z-10',
67
+ 'bg-level-3 hover:bg-level-2',
68
+ !mobile ? 'cursor-grab active:cursor-grabbing' : 'touch-pan-y',
69
+ (micro ? (mobile ? 'top-1 w-[85px] h-2 rounded-[2px]' : 'top-2 w-[85px] h-3 rounded-[2px]') : 'top-2 w-[100px] h-3 rounded-full'),
70
+ '[&>[vaul-handle-hitarea]]:hidden',
71
+ //(!micro ? 'bg-level-3 hover:bg-level-2 ' : 'bg-level-1 hover:bg-level-2 ')
72
+ )}
73
+ />
74
+ {children}
75
+ </DrawerContent>
76
+ </Drawer>
77
+ )
78
+
79
+ export default CommerceDrawer
@@ -1,51 +1,51 @@
1
- 'use client'
2
- import React from 'react'
3
-
4
- import { Drawer, DrawerContent} from '@hanzo/ui/primitives'
5
- import { cn } from '@hanzo/ui/util'
6
- import { CartPanel } from '@hanzo/commerce'
7
-
8
- import BagButton from './bag-button'
9
-
10
- const MobileBagDrawer: React.FC<{
11
- open: boolean,
12
- setOpen: (b: boolean) => void
13
- handleCheckout: () => void
14
- className?: string
15
- }> = ({
16
- open,
17
- setOpen,
18
- handleCheckout,
19
- className='',
20
- }) => {
21
-
22
- return (
23
- <Drawer open={open} onOpenChange={setOpen}>
24
- <DrawerContent className={cn('rounded-t-xl mt-6 pb-12 h-auto', className)} >
25
- <CartPanel
26
- handleCheckout={handleCheckout}
27
- className='mt-4 mb-4 border-none py-0 px-4 w-full '
28
- listClx='rounded-sm pr-3'
29
- scrollAfter={5}
30
- itemClx='mt-2'
31
- totalClx='sticky px-1 pr-2 border rounded-sm -bottom-[1px] bg-background'
32
- buttonClx='max-w-[220px] flex-none'
33
- >
34
- <div className='flex flex-row items-center flex-none justify-center '>
35
- <BagButton
36
- animateOnHover={false}
37
- showIfEmpty
38
- className=
39
- 'mr-2 relative w-6 h-7'
40
- iconClx='fill-foreground '
41
- />
42
- <p className='font-heading text-foreground text-default'>Your Bag</p>
43
- </div>
44
- <div className='h-[1px] w-pr-80 bg-muted-3 mx-auto mt-1.5 flex-none'/>
45
- </CartPanel>
46
- </DrawerContent>
47
- </Drawer>
48
- )
49
- }
50
-
51
- export default MobileBagDrawer
1
+ 'use client'
2
+ import React from 'react'
3
+
4
+ import { Drawer, DrawerContent} from '@hanzo/ui/primitives'
5
+ import { cn } from '@hanzo/ui/util'
6
+ import { CartPanel } from '@hanzo/commerce'
7
+
8
+ import BagButton from './bag-button'
9
+
10
+ const MobileBagDrawer: React.FC<{
11
+ open: boolean,
12
+ setOpen: (b: boolean) => void
13
+ handleCheckout: () => void
14
+ className?: string
15
+ }> = ({
16
+ open,
17
+ setOpen,
18
+ handleCheckout,
19
+ className='',
20
+ }) => {
21
+
22
+ return (
23
+ <Drawer open={open} onOpenChange={setOpen}>
24
+ <DrawerContent className={cn('rounded-t-xl mt-6 pb-12 h-auto', className)} >
25
+ <CartPanel
26
+ handleCheckout={handleCheckout}
27
+ className='mt-4 mb-4 border-none py-0 px-4 w-full '
28
+ listClx='rounded-sm pr-3'
29
+ scrollAfter={5}
30
+ itemClx='mt-2'
31
+ totalClx='sticky px-1 pr-2 border rounded-sm -bottom-[1px] bg-background'
32
+ buttonClx='max-w-[220px] flex-none'
33
+ >
34
+ <div className='flex flex-row items-center flex-none justify-center '>
35
+ <BagButton
36
+ animateOnHover={false}
37
+ showIfEmpty
38
+ className=
39
+ 'mr-2 relative w-6 h-7'
40
+ iconClx='fill-foreground '
41
+ />
42
+ <p className='font-heading text-foreground text-default'>Your Bag</p>
43
+ </div>
44
+ <div className='h-[1px] w-pr-80 bg-muted-3 mx-auto mt-1.5 flex-none'/>
45
+ </CartPanel>
46
+ </DrawerContent>
47
+ </Drawer>
48
+ )
49
+ }
50
+
51
+ export default MobileBagDrawer
@@ -1,101 +1,101 @@
1
- 'use client'
2
- import React from "react"
3
- import { observer } from "mobx-react-lite"
4
-
5
- import {
6
- Button,
7
- LinkElement,
8
- Popover,
9
- PopoverContent,
10
- PopoverTrigger,
11
- Separator
12
- } from '@hanzo/ui/primitives'
13
-
14
- import type { LinkDef } from '@hanzo/ui/types'
15
- import { cn } from '@hanzo/ui/util'
16
-
17
- import { useAuth } from "@hanzo/auth/service"
18
-
19
- import { Avatar } from "../icons"
20
- import { Ethereum } from "@hanzo/auth/icons"
21
- import { Icons } from ".."
22
-
23
- const MobileAuthWidget: React.FC<{
24
- noLogin?: boolean
25
- className?: string
26
- handleLogin?: () => void
27
- }> = observer(({
28
- noLogin = false,
29
- handleLogin,
30
- className
31
- }) => {
32
- const auth = useAuth()
33
-
34
- if (!auth) {
35
- return null
36
- }
37
- if (!auth.loggedIn && typeof window !== 'undefined') {
38
- return (noLogin ? null : (
39
- (handleLogin) ? (
40
- <div className="flex items-center py-3 px-5 gap-4">
41
- <Icons.Avatar className='self-center w-6 h-6' />
42
- <Button
43
- variant='link'
44
- className='text-2xl !min-w-0 self-center'
45
- onClick={handleLogin}
46
- >
47
- Log In / Sign Up
48
- </Button>
49
- </div>
50
- ) : (
51
- <LinkElement
52
- def={{
53
- href: `${process.env.NEXT_PUBLIC_LOGIN_SITE_URL}?redirectUrl=${window.location.href}`,
54
- title: 'Login',
55
- variant: 'primary',
56
- newTab: false
57
- } satisfies LinkDef}
58
- className='h-8 w-fit !min-w-0'
59
- />
60
- )
61
- ))
62
- }
63
-
64
- return (
65
- <Popover>
66
- <PopoverTrigger asChild>
67
- <Button
68
- variant="outline"
69
- size='icon'
70
- className={cn('rounded-full text-muted border-2 border-muted bg-level-1 hover:bg-level-2 hover:border-foreground hover:text-foreground uppercase w-8 h-8', className)}
71
- >{auth.user?.email[0]}</Button>
72
- </PopoverTrigger>
73
- <PopoverContent className='bg-level-0'>
74
- <div className="grid gap-4">
75
- <div className="space-y-2 truncate">
76
- {auth.user?.displayName ? (
77
- <>
78
- <h4 className="font-medium leading-none truncate">{auth.user.displayName}</h4>
79
- <p className="text-sm opacity-50 truncate">{auth.user.email}</p>
80
- </>
81
- ) : (
82
- <h4 className="font-medium leading-none truncate">{auth.user?.email}</h4>
83
- )}
84
- {auth.user?.walletAddress ? (
85
- <p className="text-sm opacity-50 truncate">{auth.user.walletAddress}</p>
86
- ) : (
87
- <Button variant="outline" className='w-full flex items-center gap-2' onClick={auth.associateWallet.bind(auth)}>
88
- <Ethereum height={20} />Connect your wallet
89
- </Button>
90
- )}
91
- </div>
92
- <Separator />
93
- <Button variant="outline" onClick={auth.logout.bind(auth)}>Logout</Button>
94
- </div>
95
- </PopoverContent>
96
- </Popover>
97
- )
98
-
99
- })
100
-
1
+ 'use client'
2
+ import React from "react"
3
+ import { observer } from "mobx-react-lite"
4
+
5
+ import {
6
+ Button,
7
+ LinkElement,
8
+ Popover,
9
+ PopoverContent,
10
+ PopoverTrigger,
11
+ Separator
12
+ } from '@hanzo/ui/primitives'
13
+
14
+ import type { LinkDef } from '@hanzo/ui/types'
15
+ import { cn } from '@hanzo/ui/util'
16
+
17
+ import { useAuth } from "@hanzo/auth/service"
18
+
19
+ import { Avatar } from "../icons"
20
+ import { Ethereum } from "@hanzo/auth/icons"
21
+ import { Icons } from ".."
22
+
23
+ const MobileAuthWidget: React.FC<{
24
+ noLogin?: boolean
25
+ className?: string
26
+ handleLogin?: () => void
27
+ }> = observer(({
28
+ noLogin = false,
29
+ handleLogin,
30
+ className
31
+ }) => {
32
+ const auth = useAuth()
33
+
34
+ if (!auth) {
35
+ return null
36
+ }
37
+ if (!auth.loggedIn && typeof window !== 'undefined') {
38
+ return (noLogin ? null : (
39
+ (handleLogin) ? (
40
+ <div className="flex items-center py-3 px-5 gap-4">
41
+ <Icons.Avatar className='self-center w-6 h-6' />
42
+ <Button
43
+ variant='link'
44
+ className='text-2xl !min-w-0 self-center'
45
+ onClick={handleLogin}
46
+ >
47
+ Log In / Sign Up
48
+ </Button>
49
+ </div>
50
+ ) : (
51
+ <LinkElement
52
+ def={{
53
+ href: `${process.env.NEXT_PUBLIC_LOGIN_SITE_URL}?redirectUrl=${window.location.href}`,
54
+ title: 'Login',
55
+ variant: 'primary',
56
+ newTab: false
57
+ } satisfies LinkDef}
58
+ className='h-8 w-fit !min-w-0'
59
+ />
60
+ )
61
+ ))
62
+ }
63
+
64
+ return (
65
+ <Popover>
66
+ <PopoverTrigger asChild>
67
+ <Button
68
+ variant="outline"
69
+ size='icon'
70
+ className={cn('rounded-full text-muted border-2 border-muted bg-level-1 hover:bg-level-2 hover:border-foreground hover:text-foreground uppercase w-8 h-8', className)}
71
+ >{auth.user?.email[0]}</Button>
72
+ </PopoverTrigger>
73
+ <PopoverContent className='bg-level-0'>
74
+ <div className="grid gap-4">
75
+ <div className="space-y-2 truncate">
76
+ {auth.user?.displayName ? (
77
+ <>
78
+ <h4 className="font-medium leading-none truncate">{auth.user.displayName}</h4>
79
+ <p className="text-sm opacity-50 truncate">{auth.user.email}</p>
80
+ </>
81
+ ) : (
82
+ <h4 className="font-medium leading-none truncate">{auth.user?.email}</h4>
83
+ )}
84
+ {auth.user?.walletAddress ? (
85
+ <p className="text-sm opacity-50 truncate">{auth.user.walletAddress}</p>
86
+ ) : (
87
+ <Button variant="outline" className='w-full flex items-center gap-2' onClick={auth.associateWallet.bind(auth)}>
88
+ <Ethereum height={20} />Connect your wallet
89
+ </Button>
90
+ )}
91
+ </div>
92
+ <Separator />
93
+ <Button variant="outline" onClick={auth.logout.bind(auth)}>Logout</Button>
94
+ </div>
95
+ </PopoverContent>
96
+ </Popover>
97
+ )
98
+
99
+ })
100
+
101
101
  export default MobileAuthWidget