@luxfi/core 5.1.5 → 5.1.6

Sign up to get free protection for your applications and to get access to all the features.
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