@luxfi/core 5.2.10 → 5.2.11

Sign up to get free protection for your applications and to get access to all the features.
Files changed (155) hide show
  1. package/commerce/ui/conf.ts +13 -13
  2. package/commerce/ui/context.tsx +126 -126
  3. package/commerce/ui/store.ts +306 -304
  4. package/components/access-code-input.tsx +71 -71
  5. package/components/auth/auth-listener.tsx +29 -29
  6. package/components/auth/auth-token/clear-auth-token.tsx +12 -12
  7. package/components/auth/auth-token/set-auth-token.tsx +16 -16
  8. package/components/auth/common-auth-domains.ts +16 -16
  9. package/components/auth/login-panel.tsx +107 -107
  10. package/components/back-button.tsx +49 -42
  11. package/components/chat-widget.tsx +85 -85
  12. package/components/commerce/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/cart-accordian.tsx +66 -0
  17. package/components/commerce/checkout-panel/checkout-panel-props.ts +10 -0
  18. package/components/commerce/checkout-panel/{dt-bag-carousel.tsx → desktop-bag-carousel.tsx} +36 -36
  19. package/components/commerce/checkout-panel/desktop-cp.tsx +83 -0
  20. package/components/commerce/checkout-panel/index.tsx +126 -129
  21. package/components/commerce/checkout-panel/mobile-cp.tsx +67 -0
  22. package/components/commerce/checkout-panel/policy-links.tsx +29 -0
  23. package/components/commerce/checkout-panel/steps-indicator.tsx +39 -39
  24. package/components/commerce/checkout-panel/thank-you.tsx +18 -18
  25. package/components/commerce/checkout-widget/const.ts +13 -13
  26. package/components/commerce/checkout-widget/index.tsx +192 -192
  27. package/components/commerce/checkout-widget/obs-string-set.ts +48 -48
  28. package/components/commerce/checkout-widget/use-anim-clx-set.ts +58 -58
  29. package/components/commerce/desktop-bag-popup.tsx +78 -78
  30. package/components/commerce/desktop-nav-menu.tsx +130 -130
  31. package/components/commerce/drawer/index.tsx +99 -99
  32. package/components/commerce/drawer/micro.tsx +144 -144
  33. package/components/commerce/drawer/shell.tsx +85 -85
  34. package/components/commerce/mobile-bag-drawer.tsx +51 -51
  35. package/components/commerce/mobile-login-button.tsx +101 -101
  36. package/components/commerce/mobile-menu-toggle-button.tsx +35 -35
  37. package/components/commerce/mobile-nav-menu-ai.tsx +47 -48
  38. package/components/commerce/mobile-nav-menu-item.tsx +49 -49
  39. package/components/commerce/mobile-nav-menu.tsx +101 -101
  40. package/components/contact-dialog/contact-form.tsx +113 -113
  41. package/components/contact-dialog/disclaimer.tsx +13 -13
  42. package/components/contact-dialog/index.tsx +64 -64
  43. package/components/copyright.tsx +21 -21
  44. package/components/drawer-margin.tsx +25 -25
  45. package/components/footer.tsx +77 -77
  46. package/components/header/desktop.tsx +50 -50
  47. package/components/header/index.tsx +52 -52
  48. package/components/header/mobile.tsx +163 -163
  49. package/components/header/theme-toggle.tsx +26 -26
  50. package/components/icons/24k-gold-card.tsx +43 -43
  51. package/components/icons/ai-chat.tsx +29 -29
  52. package/components/icons/anodized-titanium.tsx +45 -45
  53. package/components/icons/avatar.tsx +11 -11
  54. package/components/icons/bag-icon.tsx +10 -10
  55. package/components/icons/blog.tsx +20 -20
  56. package/components/icons/bridge.tsx +68 -68
  57. package/components/icons/changelog.tsx +21 -21
  58. package/components/icons/chrome.tsx +45 -45
  59. package/components/icons/coins.tsx +20 -20
  60. package/components/icons/compare-cards.tsx +21 -21
  61. package/components/icons/credit.tsx +20 -20
  62. package/components/icons/customer-support.tsx +21 -21
  63. package/components/icons/customers.tsx +33 -33
  64. package/components/icons/developer-docs.tsx +20 -20
  65. package/components/icons/exchange.tsx +21 -21
  66. package/components/icons/explorer.tsx +22 -22
  67. package/components/icons/faqs.tsx +21 -21
  68. package/components/icons/github.tsx +14 -14
  69. package/components/icons/guides.tsx +21 -21
  70. package/components/icons/gun-metal.tsx +44 -44
  71. package/components/icons/index.tsx +43 -43
  72. package/components/icons/integrations.tsx +25 -25
  73. package/components/icons/irradescent.tsx +41 -41
  74. package/components/icons/launch-subnet.tsx +21 -21
  75. package/components/icons/left-arrow.tsx +11 -11
  76. package/components/icons/lux-finance.tsx +23 -23
  77. package/components/icons/lux-logo.tsx +10 -10
  78. package/components/icons/lux-pass.tsx +25 -25
  79. package/components/icons/lux-quests.tsx +21 -21
  80. package/components/icons/market.tsx +24 -24
  81. package/components/icons/mirrored-titanium.tsx +46 -46
  82. package/components/icons/more-benefits.tsx +21 -21
  83. package/components/icons/open-source.tsx +26 -26
  84. package/components/icons/right-arrow.tsx +10 -10
  85. package/components/icons/safe.tsx +37 -37
  86. package/components/icons/search.tsx +12 -12
  87. package/components/icons/secure-delivery.tsx +13 -13
  88. package/components/icons/shop.tsx +20 -20
  89. package/components/icons/social-icon.tsx +35 -35
  90. package/components/icons/social-svg.css +3 -3
  91. package/components/icons/sterling-silver-card.tsx +44 -44
  92. package/components/icons/templates.tsx +21 -21
  93. package/components/icons/validators.tsx +41 -41
  94. package/components/icons/view-all-card.tsx +20 -20
  95. package/components/icons/wallet.tsx +20 -20
  96. package/components/icons/warpcast.tsx +58 -58
  97. package/components/icons/youtube-logo.tsx +59 -59
  98. package/components/index.ts +27 -27
  99. package/components/logo.tsx +89 -89
  100. package/components/main.tsx +27 -27
  101. package/components/mini-chart/index.tsx +7 -7
  102. package/components/mini-chart/mini-chart-props.ts +43 -43
  103. package/components/mini-chart/mini-chart.tsx +85 -85
  104. package/components/mini-chart/wrapper.tsx +23 -23
  105. package/components/not-found/index.tsx +28 -28
  106. package/components/not-found/not-found-content.mdx +5 -5
  107. package/components/scripts.tsx +24 -24
  108. package/components/tooltip.tsx +31 -31
  109. package/environment.d.ts +5 -5
  110. package/next/analytics/fpixel.ts +15 -15
  111. package/next/analytics/google-analytics.ts +13 -13
  112. package/next/analytics/index.ts +3 -3
  113. package/next/analytics/pixel-analytics.tsx +54 -54
  114. package/next/font/get-app-router-font-classes.ts +12 -12
  115. package/next/font/load-and-return-lux-next-fonts-on-import.ts +68 -68
  116. package/next/font/next-font-desc.ts +27 -27
  117. package/next/font/pages-router-font-vars.tsx +18 -18
  118. package/next/head-metadata/from-next/metadata-types.ts +158 -158
  119. package/next/head-metadata/from-next/opengraph-types.ts +267 -267
  120. package/next/head-metadata/from-next/twitter-types.ts +92 -92
  121. package/next/head-metadata/index.tsx +208 -208
  122. package/next/middleware/determine-device-mw.ts +16 -16
  123. package/package.json +79 -79
  124. package/root-layout/WHY_THIS_IS_SEPARATE.txt +1 -1
  125. package/root-layout/index.tsx +112 -112
  126. package/server-actions/firebase-app.ts +14 -14
  127. package/server-actions/index.ts +5 -5
  128. package/server-actions/store-contact.ts +51 -51
  129. package/site-def/footer/community.tsx +67 -67
  130. package/site-def/footer/company.ts +37 -37
  131. package/site-def/footer/ecosystem.ts +37 -37
  132. package/site-def/footer/index.tsx +26 -26
  133. package/site-def/footer/legal.ts +28 -28
  134. package/site-def/footer/network.ts +45 -45
  135. package/site-def/footer/svg/warpcast-logo.svg +11 -11
  136. package/site-def/index.ts +2 -2
  137. package/site-def/main-nav.tsx +392 -392
  138. package/style/cart-animation.css +29 -29
  139. package/style/checkout-animation.css +23 -23
  140. package/style/drawer-handle-overrides.css +160 -160
  141. package/style/lux-colors.css +85 -85
  142. package/style/lux-global.css +30 -30
  143. package/tailwind/fontFamily.tailwind.lux.ts +18 -18
  144. package/tailwind/index.ts +2 -2
  145. package/tailwind/lux-tw-fonts.ts +39 -39
  146. package/tailwind/tailwind.config.lux-preset.ts +10 -10
  147. package/tsconfig.json +15 -15
  148. package/types/chatbot-config.ts +6 -6
  149. package/types/chatbot-suggested-question.ts +7 -7
  150. package/types/contact-info.ts +10 -10
  151. package/types/index.ts +4 -4
  152. package/types/site-def.ts +43 -43
  153. package/components/commerce/checkout-panel/dt-checkout-panel.tsx +0 -85
  154. package/components/commerce/checkout-panel/links-row.tsx +0 -21
  155. package/components/commerce/checkout-panel/mb-checkout-panel.tsx +0 -55
package/package.json CHANGED
@@ -1,79 +1,79 @@
1
- {
2
- "name": "@luxfi/core",
3
- "version": "5.2.10",
4
- "description": "Library that contains shared UI primitives, support for a common design system, and other boilerplate support.",
5
- "publishConfig": {
6
- "registry": "https://registry.npmjs.org/",
7
- "access": "public",
8
- "scope": "@luxfi"
9
- },
10
- "repository": {
11
- "type": "git",
12
- "url": "git+https://github.com/luxfi/web.git",
13
- "directory": "packages/core"
14
- },
15
- "keywords": [
16
- "components",
17
- "radix-ui",
18
- "hanzo",
19
- "luxdefi"
20
- ],
21
- "scripts": {
22
- "lat": "npm show @luxfi/core version",
23
- "pub": "npm publish",
24
- "build": "tsc",
25
- "tc": "tsc",
26
- "clean": "rm -rf node_modules"
27
- },
28
- "exports": {
29
- ".": "./components/index.ts",
30
- "./commerce": "./commerce/ui/context.tsx",
31
- "./root-layout": "./root-layout/index.tsx",
32
- "./server-actions": "./server-actions/index.ts",
33
- "./next": "./next/index.ts",
34
- "./style/": "./style/",
35
- "./site-def": "./site-def/index.ts",
36
- "./tailwind": "./tailwind/index.ts"
37
- },
38
- "dependencies": {
39
- "@next/third-parties": "^14.1.0",
40
- "@types/node": "^20.12.12",
41
- "cookies-next": "^4.1.1",
42
- "date-fns": "^3.6.0",
43
- "embla-carousel-autoplay": "^8.1.1",
44
- "firebase": "10.12.0",
45
- "react-device-detect": "^2.2.3",
46
- "react-social-icons": "^6.4.0",
47
- "react-tooltip": "^5.26.4",
48
- "request": "^2.88.2",
49
- "usehooks-ts": "^3.1.0"
50
- },
51
- "peerDependencies": {
52
- "@hanzo/auth": "*",
53
- "@hanzo/commerce": "*",
54
- "@hanzo/ui": "*",
55
- "@hookform/resolvers": "^3.3.2",
56
- "lucide-react": "^0.344.0",
57
- "mobx": "^6.12.3",
58
- "mobx-react-lite": "^4.0.7",
59
- "next": "14.2.3",
60
- "next-themes": "^0.2.1",
61
- "react": "*",
62
- "react-dom": "*",
63
- "react-hook-form": "^7.51.4",
64
- "validator": "^13.11.0",
65
- "zod": "3.23.8"
66
- },
67
- "devDependencies": {
68
- "@mdx-js/loader": "^3.0.0",
69
- "@mdx-js/react": "^3.0.0",
70
- "@types/facebook-pixel": "^0.0.30",
71
- "@types/gtag.js": "^0.0.19",
72
- "@types/mdx": "^2.0.9",
73
- "@types/node": "^20.11.24",
74
- "@types/react": "*",
75
- "@types/react-dom": "*",
76
- "tailwindcss": "^3.4.3",
77
- "typescript": "5.4.5"
78
- }
79
- }
1
+ {
2
+ "name": "@luxfi/core",
3
+ "version": "5.2.11",
4
+ "description": "Library that contains shared UI primitives, support for a common design system, and other boilerplate support.",
5
+ "publishConfig": {
6
+ "registry": "https://registry.npmjs.org/",
7
+ "access": "public",
8
+ "scope": "@luxfi"
9
+ },
10
+ "repository": {
11
+ "type": "git",
12
+ "url": "git+https://github.com/luxfi/web.git",
13
+ "directory": "packages/core"
14
+ },
15
+ "keywords": [
16
+ "components",
17
+ "radix-ui",
18
+ "hanzo",
19
+ "luxdefi"
20
+ ],
21
+ "scripts": {
22
+ "lat": "npm show @luxfi/core version",
23
+ "pub": "npm publish",
24
+ "build": "tsc",
25
+ "tc": "tsc",
26
+ "clean": "rm -rf node_modules"
27
+ },
28
+ "exports": {
29
+ ".": "./components/index.ts",
30
+ "./commerce": "./commerce/ui/context.tsx",
31
+ "./root-layout": "./root-layout/index.tsx",
32
+ "./server-actions": "./server-actions/index.ts",
33
+ "./next": "./next/index.ts",
34
+ "./style/": "./style/",
35
+ "./site-def": "./site-def/index.ts",
36
+ "./tailwind": "./tailwind/index.ts"
37
+ },
38
+ "dependencies": {
39
+ "@next/third-parties": "^14.1.0",
40
+ "@types/node": "^20.12.12",
41
+ "cookies-next": "^4.1.1",
42
+ "date-fns": "^3.6.0",
43
+ "embla-carousel-autoplay": "^8.1.1",
44
+ "firebase": "10.12.0",
45
+ "react-device-detect": "^2.2.3",
46
+ "react-social-icons": "^6.4.0",
47
+ "react-tooltip": "^5.26.4",
48
+ "request": "^2.88.2",
49
+ "usehooks-ts": "^3.1.0"
50
+ },
51
+ "peerDependencies": {
52
+ "@hanzo/auth": "*",
53
+ "@hanzo/commerce": "*",
54
+ "@hanzo/ui": "*",
55
+ "@hookform/resolvers": "^3.3.2",
56
+ "lucide-react": "^0.344.0",
57
+ "mobx": "^6.12.3",
58
+ "mobx-react-lite": "^4.0.7",
59
+ "next": "14.2.3",
60
+ "next-themes": "^0.2.1",
61
+ "react": "*",
62
+ "react-dom": "*",
63
+ "react-hook-form": "^7.51.4",
64
+ "validator": "^13.11.0",
65
+ "zod": "3.23.8"
66
+ },
67
+ "devDependencies": {
68
+ "@mdx-js/loader": "^3.0.0",
69
+ "@mdx-js/react": "^3.0.0",
70
+ "@types/facebook-pixel": "^0.0.30",
71
+ "@types/gtag.js": "^0.0.19",
72
+ "@types/mdx": "^2.0.9",
73
+ "@types/node": "^20.11.24",
74
+ "@types/react": "*",
75
+ "@types/react-dom": "*",
76
+ "tailwindcss": "^3.4.3",
77
+ "typescript": "5.4.5"
78
+ }
79
+ }
@@ -1,2 +1,2 @@
1
- Unwise to have this in a barrel / index file that is mostly imported by a Client Component.
1
+ Unwise to have this in a barrel / index file that is mostly imported by a Client Component.
2
2
  Creates Next / SSR issues
@@ -1,112 +1,112 @@
1
- import React, { type PropsWithChildren } from 'react'
2
- import type { Viewport } from 'next'
3
-
4
- import { Toaster } from '@hanzo/ui/primitives'
5
- import { AuthServiceProvider } from '@hanzo/auth/service'
6
- import { getUserServerSide } from '@hanzo/auth/server'
7
- import type { AuthServiceConf } from '@hanzo/auth/types'
8
- import { CommerceProvider } from '@hanzo/commerce'
9
-
10
- import getAppRouterBodyFontClasses from '../next/font/get-app-router-font-classes'
11
- import { FacebookPixelHead } from '../next/analytics/pixel-analytics'
12
-
13
- import { CommerceUIProvider } from '../commerce/ui/context'
14
- import { AuthListener, ChatWidget, Header, Scripts } from '../components'
15
-
16
- import CommerceDrawer from '../components/commerce/drawer'
17
-
18
- import type SiteDef from '../types/site-def'
19
-
20
- import '../style/lux-global.css'
21
- import '../style/cart-animation.css'
22
- import '../style/checkout-animation.css'
23
-
24
-
25
- // Next 14: https://nextjs.org/docs/app/building-your-application/upgrading/codemods#use-viewport-export
26
- const viewport = {
27
- themeColor: [
28
- { media: '(prefers-color-scheme: light)', color: 'white' },
29
- { media: '(prefers-color-scheme: dark)', color: 'black' },
30
- ],
31
- } satisfies Viewport
32
-
33
- /*
34
- These '.variable' fields are actually autogenerate css classnames that *define* the actual
35
- css variables ('--<ugly-name>') that one asks for in the tailwind classes.
36
- They are what make them available in the global scope. So this MUST
37
- be done like this for the tailwind font classes to work.
38
-
39
- (...not to be confused with the css var itself. This field should be named something else!)
40
- */
41
-
42
- /*
43
- re body: overflow-y-hidden overflow-x-hidden, h-full
44
- We cannot have these on body tag for scroll-snap to work on iOS!
45
- */
46
- const bodyClasses =
47
- 'bg-background text-foreground flex flex-col min-h-full overflow-x-hidden ' +
48
- getAppRouterBodyFontClasses()
49
-
50
- async function RootLayout({
51
- showHeader = false,
52
- chatbot = false,
53
- siteDef,
54
- children,
55
- } : {
56
- siteDef: SiteDef
57
- showHeader?: boolean
58
- chatbot?: boolean
59
- } & PropsWithChildren) {
60
-
61
- const currentUser = await getUserServerSide()
62
-
63
- const Guts: React.FC = () => (<>
64
- {showHeader && <Header siteDef={siteDef}/>}
65
- {children}
66
- {chatbot && (<ChatWidget
67
- title='LUX'
68
- subtitle='AI'
69
- chatbotUrl='https://lux.chat/?isIframe=true'
70
- suggestedQuestions={siteDef.chatbot?.suggestedQuestions ?? []}
71
- buttonClx='hidden md:block'
72
- />)}
73
- </>)
74
-
75
- return (
76
- <html lang='en' suppressHydrationWarning className='hanzo-ui-dark-theme' style={{backgroundColor: '#000'}}>
77
- <head >
78
- {/* https://stackoverflow.com/a/75716588/11645689 */ }
79
- <base target='_blank' />
80
- <FacebookPixelHead/>
81
- </head>
82
-
83
- <body className={bodyClasses} style={{
84
-
85
- // As also noted above, 'overflow: hidden' on the <body> tag breaks scroll snap!
86
- display: 'none', // see scripts.tsx // :aa concerned about this.
87
-
88
- }}>
89
- <Scripts/>
90
- <AuthServiceProvider user={currentUser} conf={{} as AuthServiceConf}>
91
- {siteDef?.commerce ? (
92
- <CommerceProvider config={siteDef.commerce!} >
93
- <CommerceUIProvider >
94
- <Guts />
95
- <CommerceDrawer />
96
- </CommerceUIProvider>
97
- </CommerceProvider>
98
- ) : (
99
- <Guts />
100
- )}
101
- <AuthListener/>
102
- </AuthServiceProvider>
103
- <Toaster position='top-center' duration={3000}/>
104
- </body>
105
- </html>
106
- )
107
- }
108
-
109
- export {
110
- RootLayout,
111
- viewport
112
- }
1
+ import React, { type PropsWithChildren } from 'react'
2
+ import type { Viewport } from 'next'
3
+
4
+ import { Toaster } from '@hanzo/ui/primitives'
5
+ import { AuthServiceProvider } from '@hanzo/auth/service'
6
+ import { getUserServerSide } from '@hanzo/auth/server'
7
+ import type { AuthServiceConf } from '@hanzo/auth/types'
8
+ import { CommerceProvider } from '@hanzo/commerce'
9
+
10
+ import getAppRouterBodyFontClasses from '../next/font/get-app-router-font-classes'
11
+ import { FacebookPixelHead } from '../next/analytics/pixel-analytics'
12
+
13
+ import { CommerceUIProvider } from '../commerce/ui/context'
14
+ import { AuthListener, ChatWidget, Header, Scripts } from '../components'
15
+
16
+ import CommerceDrawer from '../components/commerce/drawer'
17
+
18
+ import type SiteDef from '../types/site-def'
19
+
20
+ import '../style/lux-global.css'
21
+ import '../style/cart-animation.css'
22
+ import '../style/checkout-animation.css'
23
+
24
+
25
+ // Next 14: https://nextjs.org/docs/app/building-your-application/upgrading/codemods#use-viewport-export
26
+ const viewport = {
27
+ themeColor: [
28
+ { media: '(prefers-color-scheme: light)', color: 'white' },
29
+ { media: '(prefers-color-scheme: dark)', color: 'black' },
30
+ ],
31
+ } satisfies Viewport
32
+
33
+ /*
34
+ These '.variable' fields are actually autogenerate css classnames that *define* the actual
35
+ css variables ('--<ugly-name>') that one asks for in the tailwind classes.
36
+ They are what make them available in the global scope. So this MUST
37
+ be done like this for the tailwind font classes to work.
38
+
39
+ (...not to be confused with the css var itself. This field should be named something else!)
40
+ */
41
+
42
+ /*
43
+ re body: overflow-y-hidden overflow-x-hidden, h-full
44
+ We cannot have these on body tag for scroll-snap to work on iOS!
45
+ */
46
+ const bodyClasses =
47
+ 'bg-background text-foreground flex flex-col min-h-full overflow-x-hidden ' +
48
+ getAppRouterBodyFontClasses()
49
+
50
+ async function RootLayout({
51
+ showHeader = false,
52
+ chatbot = false,
53
+ siteDef,
54
+ children,
55
+ } : {
56
+ siteDef: SiteDef
57
+ showHeader?: boolean
58
+ chatbot?: boolean
59
+ } & PropsWithChildren) {
60
+
61
+ const currentUser = await getUserServerSide()
62
+
63
+ const Guts: React.FC = () => (<>
64
+ {showHeader && <Header siteDef={siteDef}/>}
65
+ {children}
66
+ {chatbot && (<ChatWidget
67
+ title='LUX'
68
+ subtitle='AI'
69
+ chatbotUrl='https://lux.chat/?isIframe=true'
70
+ suggestedQuestions={siteDef.chatbot?.suggestedQuestions ?? []}
71
+ buttonClx='hidden md:block'
72
+ />)}
73
+ </>)
74
+
75
+ return (
76
+ <html lang='en' suppressHydrationWarning className='hanzo-ui-dark-theme' style={{backgroundColor: '#000'}}>
77
+ <head >
78
+ {/* https://stackoverflow.com/a/75716588/11645689 */ }
79
+ <base target='_blank' />
80
+ <FacebookPixelHead/>
81
+ </head>
82
+
83
+ <body className={bodyClasses} style={{
84
+
85
+ // As also noted above, 'overflow: hidden' on the <body> tag breaks scroll snap!
86
+ display: 'none', // see scripts.tsx // :aa concerned about this.
87
+
88
+ }}>
89
+ <Scripts/>
90
+ <AuthServiceProvider user={currentUser} conf={{} as AuthServiceConf}>
91
+ {siteDef?.commerce ? (
92
+ <CommerceProvider config={siteDef.commerce!} >
93
+ <CommerceUIProvider >
94
+ <Guts />
95
+ <CommerceDrawer />
96
+ </CommerceUIProvider>
97
+ </CommerceProvider>
98
+ ) : (
99
+ <Guts />
100
+ )}
101
+ <AuthListener/>
102
+ </AuthServiceProvider>
103
+ <Toaster position='top-center' duration={3000}/>
104
+ </body>
105
+ </html>
106
+ )
107
+ }
108
+
109
+ export {
110
+ RootLayout,
111
+ viewport
112
+ }
@@ -1,14 +1,14 @@
1
- import { initializeApp, getApps } from 'firebase/app'
2
-
3
- const firebaseConfig = {
4
- apiKey: process.env.NEXT_PUBLIC_FIREBASE_API_KEY,
5
- authDomain: process.env.NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN,
6
- projectId: process.env.NEXT_PUBLIC_FIREBASE_PROJECT_ID,
7
- storageBucket: process.env.NEXT_PUBLIC_FIREBASE_STORAGE_BUCKET,
8
- messagingSenderId: process.env.NEXT_PUBLIC_FIREBASE_MESSAGING_SENDER_ID,
9
- appId: process.env.NEXT_PUBLIC_FIREBASE_APP_ID,
10
- measurementId: process.env.NEXT_PUBLIC_FIREBASE_MEASUREMENT_ID,
11
- }
12
-
13
- // Initialize Firebase instance if there isn't one already
14
- export default getApps().length === 0 ? initializeApp(firebaseConfig) : getApps()[0]
1
+ import { initializeApp, getApps } from 'firebase/app'
2
+
3
+ const firebaseConfig = {
4
+ apiKey: process.env.NEXT_PUBLIC_FIREBASE_API_KEY,
5
+ authDomain: process.env.NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN,
6
+ projectId: process.env.NEXT_PUBLIC_FIREBASE_PROJECT_ID,
7
+ storageBucket: process.env.NEXT_PUBLIC_FIREBASE_STORAGE_BUCKET,
8
+ messagingSenderId: process.env.NEXT_PUBLIC_FIREBASE_MESSAGING_SENDER_ID,
9
+ appId: process.env.NEXT_PUBLIC_FIREBASE_APP_ID,
10
+ measurementId: process.env.NEXT_PUBLIC_FIREBASE_MEASUREMENT_ID,
11
+ }
12
+
13
+ // Initialize Firebase instance if there isn't one already
14
+ export default getApps().length === 0 ? initializeApp(firebaseConfig) : getApps()[0]
@@ -1,5 +1,5 @@
1
- import storeContact from './store-contact'
2
-
3
- export {
4
- storeContact as default
5
- }
1
+ import storeContact from './store-contact'
2
+
3
+ export {
4
+ storeContact as default
5
+ }
@@ -1,51 +1,51 @@
1
- 'use server'
2
-
3
- import {
4
- getFirestore,
5
- collection,
6
- setDoc,
7
- doc,
8
- serverTimestamp,
9
- type Firestore,
10
- } from 'firebase/firestore'
11
-
12
- import firebaseApp from './firebase-app'
13
- import type { ContactInfo } from '../types'
14
-
15
- let dbInstance: Firestore | undefined = undefined
16
-
17
- const getDBInstance = (name: string): Firestore => {
18
- if (!dbInstance) {
19
- dbInstance = getFirestore(firebaseApp, name)
20
- }
21
- return dbInstance
22
- }
23
-
24
- const storeContact = async ( formData: ContactInfo, enclosure: any ) => {
25
- const email = formData.email
26
- const phone = formData.phone
27
- const dbName = enclosure?.dbId
28
- const tableName = enclosure?.listId
29
-
30
- let error: any | null = null
31
- const tableRef = collection(getDBInstance(dbName), tableName)
32
-
33
- try {
34
- await setDoc(doc(tableRef, email), {
35
- email,
36
- phone,
37
- timestamp: serverTimestamp(),
38
- })
39
- return { success: !error, error, id: email }
40
- }
41
- catch (e) {
42
- console.error('Error writing contact info to database: ', e)
43
- error = e
44
- }
45
-
46
- return { success: !error, error }
47
- }
48
-
49
- export {
50
- storeContact as default
51
- }
1
+ 'use server'
2
+
3
+ import {
4
+ getFirestore,
5
+ collection,
6
+ setDoc,
7
+ doc,
8
+ serverTimestamp,
9
+ type Firestore,
10
+ } from 'firebase/firestore'
11
+
12
+ import firebaseApp from './firebase-app'
13
+ import type { ContactInfo } from '../types'
14
+
15
+ let dbInstance: Firestore | undefined = undefined
16
+
17
+ const getDBInstance = (name: string): Firestore => {
18
+ if (!dbInstance) {
19
+ dbInstance = getFirestore(firebaseApp, name)
20
+ }
21
+ return dbInstance
22
+ }
23
+
24
+ const storeContact = async ( formData: ContactInfo, enclosure: any ) => {
25
+ const email = formData.email
26
+ const phone = formData.phone
27
+ const dbName = enclosure?.dbId
28
+ const tableName = enclosure?.listId
29
+
30
+ let error: any | null = null
31
+ const tableRef = collection(getDBInstance(dbName), tableName)
32
+
33
+ try {
34
+ await setDoc(doc(tableRef, email), {
35
+ email,
36
+ phone,
37
+ timestamp: serverTimestamp(),
38
+ })
39
+ return { success: !error, error, id: email }
40
+ }
41
+ catch (e) {
42
+ console.error('Error writing contact info to database: ', e)
43
+ error = e
44
+ }
45
+
46
+ return { success: !error, error }
47
+ }
48
+
49
+ export {
50
+ storeContact as default
51
+ }