@luxfi/core 5.1.3 → 5.1.4
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.
- package/commerce/AUTO-GEN-bullion-by-family.json +33 -33
- package/commerce/EDIT-ME-bullion-market-prices.ts +11 -11
- package/commerce/assign-prices.ts +49 -49
- package/commerce/assign-videos-by-family-group.ts +14 -14
- package/commerce/bullion-price-1oz.ts +5 -5
- package/commerce/index.ts +18 -18
- package/commerce/lux-service-options.ts +6 -6
- package/components/access-code-input.tsx +71 -71
- package/components/auth/auth-listener.tsx +29 -29
- package/components/auth/auth-token/clear-auth-token.tsx +12 -12
- package/components/auth/auth-token/set-auth-token.tsx +16 -16
- package/components/auth/common-auth-domains.ts +16 -16
- package/components/auth/login-panel.tsx +104 -104
- package/components/chat-widget.tsx +80 -80
- package/components/commerce/bag-button.tsx +98 -98
- package/components/commerce/buy-drawer/drawer.tsx +44 -44
- package/components/commerce/buy-drawer/index.tsx +46 -46
- package/components/commerce/checkout-button.tsx +116 -116
- package/components/commerce/checkout-panel/close-button.tsx +26 -26
- package/components/commerce/checkout-panel/dt-bag-carousel.tsx +36 -36
- package/components/commerce/checkout-panel/dt-checkout-panel.tsx +66 -66
- package/components/commerce/checkout-panel/index.tsx +123 -123
- package/components/commerce/checkout-panel/links-row.tsx +21 -21
- package/components/commerce/checkout-panel/mb-checkout-panel.tsx +54 -54
- package/components/commerce/checkout-panel/steps-indicator.tsx +39 -39
- package/components/commerce/checkout-panel/thank-you.tsx +18 -18
- package/components/commerce/checkout-widget/const.ts +13 -13
- package/components/commerce/checkout-widget/index.tsx +86 -86
- package/components/commerce/checkout-widget/obs-string-set.ts +48 -48
- package/components/commerce/checkout-widget/use-anim-clx-set.ts +56 -56
- package/components/commerce/checkout-widget/use-lagging-item-ref.ts +29 -29
- package/components/commerce/desktop-bag-popup.tsx +78 -78
- package/components/commerce/mobile-bag-drawer.tsx +51 -51
- package/components/commerce/mobile-login-button.tsx +101 -0
- package/components/commerce/mobile-menu-toggle-button.tsx +35 -35
- package/components/commerce/mobile-nav-menu-ai.tsx +98 -0
- package/components/commerce/mobile-nav-menu-item.tsx +46 -0
- package/components/commerce/mobile-nav-menu.tsx +79 -64
- package/components/contact-dialog/contact-form.tsx +112 -112
- package/components/contact-dialog/disclaimer.tsx +13 -13
- package/components/contact-dialog/index.tsx +64 -64
- package/components/copyright.tsx +21 -21
- package/components/footer.tsx +77 -77
- package/components/header/desktop.tsx +54 -54
- package/components/header/guts.tsx +27 -0
- package/components/header/index.tsx +47 -26
- package/components/header/mobile.tsx +165 -161
- package/components/header/theme-toggle.tsx +26 -26
- package/components/icons/avatar.tsx +11 -0
- package/components/icons/bag-icon.tsx +10 -10
- package/components/icons/github.tsx +14 -14
- package/components/icons/index.tsx +43 -35
- package/components/icons/left-arrow.tsx +11 -0
- package/components/icons/lux-logo.tsx +10 -10
- package/components/icons/right-arrow.tsx +10 -0
- package/components/icons/search.tsx +12 -0
- package/components/icons/secure-delivery.tsx +13 -13
- package/components/icons/social-icon.tsx +35 -35
- package/components/icons/social-svg.css +3 -3
- package/components/icons/youtube-logo.tsx +59 -59
- package/components/index.ts +27 -27
- package/components/logo.tsx +81 -81
- package/components/mini-chart/index.tsx +7 -7
- package/components/mini-chart/mini-chart-props.ts +43 -43
- package/components/mini-chart/mini-chart.tsx +85 -85
- package/components/mini-chart/wrapper.tsx +23 -23
- package/components/not-found/index.tsx +27 -27
- package/components/not-found/not-found-content.mdx +5 -5
- package/components/scripts.tsx +24 -24
- package/conf/index.ts +50 -50
- package/environment.d.ts +5 -5
- package/next/analytics/fpixel.ts +15 -15
- package/next/analytics/google-analytics.ts +13 -13
- package/next/analytics/index.ts +3 -3
- package/next/analytics/pixel-analytics.tsx +54 -54
- package/next/font/get-app-router-font-classes.ts +12 -12
- package/next/font/load-and-return-lux-next-fonts-on-import.ts +68 -68
- package/next/font/next-font-desc.ts +27 -27
- package/next/font/pages-router-font-vars.tsx +18 -18
- package/next/head-metadata/from-next/metadata-types.ts +158 -158
- package/next/head-metadata/from-next/opengraph-types.ts +267 -267
- package/next/head-metadata/from-next/twitter-types.ts +92 -92
- package/next/head-metadata/index.tsx +208 -208
- package/next/middleware/determine-device-mw.ts +16 -16
- package/package.json +73 -72
- package/root-layout/WHY_THIS_IS_SEPARATE.txt +1 -1
- package/root-layout/index.tsx +121 -120
- package/server-actions/firebase-app.ts +14 -14
- package/server-actions/index.ts +5 -5
- package/server-actions/store-contact.ts +51 -51
- package/site-def/footer/community.tsx +67 -67
- package/site-def/footer/company.ts +37 -37
- package/site-def/footer/ecosystem.ts +37 -37
- package/site-def/footer/index.tsx +26 -26
- package/site-def/footer/legal.ts +28 -28
- package/site-def/footer/network.ts +45 -45
- package/site-def/footer/svg/warpcast-logo.svg +11 -11
- package/site-def/index.ts +2 -2
- package/site-def/main-nav.tsx +292 -0
- package/style/cart-animation.css +29 -29
- package/style/checkout-animation.css +23 -23
- package/style/lux-colors.css +85 -85
- package/style/lux-global.css +30 -30
- package/tailwind/fontFamily.tailwind.lux.ts +18 -18
- package/tailwind/index.ts +2 -2
- package/tailwind/lux-tw-fonts.ts +39 -39
- package/tailwind/tailwind.config.lux-preset.ts +10 -10
- package/tsconfig.json +10 -28
- package/types/chatbot-config.ts +6 -6
- package/types/chatbot-suggested-question.ts +7 -7
- package/types/commerce-config.ts +10 -10
- package/types/contact-info.ts +10 -10
- package/types/index.ts +5 -5
- package/types/site-def.ts +45 -45
- package/site-def/main-nav.ts +0 -35
package/package.json
CHANGED
|
@@ -1,72 +1,73 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@luxfi/core",
|
|
3
|
-
"version": "5.1.
|
|
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/index.ts",
|
|
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
|
-
"./conf": "./conf/index.ts"
|
|
38
|
-
},
|
|
39
|
-
"dependencies": {
|
|
40
|
-
"@hanzo/auth": "2.4.6",
|
|
41
|
-
"@hanzo/commerce": "7.0.2",
|
|
42
|
-
"@hanzo/ui": "3.7.0",
|
|
43
|
-
"@next/third-parties": "^14.1.0",
|
|
44
|
-
"@types/node": "^20.12.12",
|
|
45
|
-
"cookies-next": "^4.1.1",
|
|
46
|
-
"date-fns": "^3.6.0",
|
|
47
|
-
"
|
|
48
|
-
"react-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
"
|
|
53
|
-
"
|
|
54
|
-
"next
|
|
55
|
-
"
|
|
56
|
-
"react
|
|
57
|
-
"react-
|
|
58
|
-
"
|
|
59
|
-
"
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
"@mdx-js/
|
|
64
|
-
"@
|
|
65
|
-
"@types/
|
|
66
|
-
"@types/
|
|
67
|
-
"@types/
|
|
68
|
-
"@types/react
|
|
69
|
-
"
|
|
70
|
-
"
|
|
71
|
-
|
|
72
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "@luxfi/core",
|
|
3
|
+
"version": "5.1.4",
|
|
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/index.ts",
|
|
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
|
+
"./conf": "./conf/index.ts"
|
|
38
|
+
},
|
|
39
|
+
"dependencies": {
|
|
40
|
+
"@hanzo/auth": "2.4.6",
|
|
41
|
+
"@hanzo/commerce": "7.0.2",
|
|
42
|
+
"@hanzo/ui": "3.7.0",
|
|
43
|
+
"@next/third-parties": "^14.1.0",
|
|
44
|
+
"@types/node": "^20.12.12",
|
|
45
|
+
"cookies-next": "^4.1.1",
|
|
46
|
+
"date-fns": "^3.6.0",
|
|
47
|
+
"embla-carousel-autoplay": "^8.0.1",
|
|
48
|
+
"react-device-detect": "^2.2.3",
|
|
49
|
+
"react-social-icons": "^6.4.0"
|
|
50
|
+
},
|
|
51
|
+
"peerDependencies": {
|
|
52
|
+
"@hookform/resolvers": "^3.3.2",
|
|
53
|
+
"lucide-react": "^0.344.0",
|
|
54
|
+
"next": "14.1.3",
|
|
55
|
+
"next-themes": "^0.2.1",
|
|
56
|
+
"react": "^18.2.0",
|
|
57
|
+
"react-dom": "^18.2.0",
|
|
58
|
+
"react-hook-form": "^7.44.2",
|
|
59
|
+
"validator": "^13.11.0",
|
|
60
|
+
"zod": "3.21.4"
|
|
61
|
+
},
|
|
62
|
+
"devDependencies": {
|
|
63
|
+
"@mdx-js/loader": "^3.0.0",
|
|
64
|
+
"@mdx-js/react": "^3.0.0",
|
|
65
|
+
"@types/facebook-pixel": "^0.0.30",
|
|
66
|
+
"@types/gtag.js": "^0.0.19",
|
|
67
|
+
"@types/mdx": "^2.0.9",
|
|
68
|
+
"@types/react": "^18.2.64",
|
|
69
|
+
"@types/react-dom": "^18.2.18",
|
|
70
|
+
"tailwindcss": "^3.4.2",
|
|
71
|
+
"typescript": "5.3.3"
|
|
72
|
+
}
|
|
73
|
+
}
|
|
@@ -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
|
package/root-layout/index.tsx
CHANGED
|
@@ -1,120 +1,121 @@
|
|
|
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 { AuthListener, ChatWidget, Header, Scripts } from '../components'
|
|
14
|
-
import
|
|
15
|
-
import
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
import
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
import '../style/
|
|
22
|
-
import '../style/
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
{ media: '(prefers-color-scheme:
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
{
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
<
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
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 { AuthListener, ChatWidget, Header, Scripts } from '../components'
|
|
14
|
+
import Guts from '../components/header/guts'
|
|
15
|
+
import BuyDrawer from '../components/commerce/buy-drawer'
|
|
16
|
+
import CheckoutWidget from '../components/commerce/checkout-widget'
|
|
17
|
+
|
|
18
|
+
import { selectionUISpecifiers } from '../conf'
|
|
19
|
+
import type SiteDef from '../types/site-def'
|
|
20
|
+
|
|
21
|
+
import '../style/lux-global.css'
|
|
22
|
+
import '../style/cart-animation.css'
|
|
23
|
+
import '../style/checkout-animation.css'
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
// Next 14: https://nextjs.org/docs/app/building-your-application/upgrading/codemods#use-viewport-export
|
|
27
|
+
const viewport = {
|
|
28
|
+
themeColor: [
|
|
29
|
+
{ media: '(prefers-color-scheme: light)', color: 'white' },
|
|
30
|
+
{ media: '(prefers-color-scheme: dark)', color: 'black' },
|
|
31
|
+
],
|
|
32
|
+
} satisfies Viewport
|
|
33
|
+
|
|
34
|
+
/*
|
|
35
|
+
These '.variable' fields are actually autogenerate css classnames that *define* the actual
|
|
36
|
+
css variables ('--<ugly-name>') that one asks for in the tailwind classes.
|
|
37
|
+
They are what make them available in the global scope. So this MUST
|
|
38
|
+
be done like this for the tailwind font classes to work.
|
|
39
|
+
|
|
40
|
+
(...not to be confused with the css var itself. This field should be named something else!)
|
|
41
|
+
*/
|
|
42
|
+
|
|
43
|
+
/*
|
|
44
|
+
re body: overflow-y-hidden overflow-x-hidden, h-full
|
|
45
|
+
We cannot have these on body tag for scroll-snap to work on iOS!
|
|
46
|
+
*/
|
|
47
|
+
const bodyClasses =
|
|
48
|
+
'bg-background text-foreground flex flex-col min-h-full' +
|
|
49
|
+
getAppRouterBodyFontClasses()
|
|
50
|
+
|
|
51
|
+
const RootLayout: React.FC<PropsWithChildren & {
|
|
52
|
+
siteDef: SiteDef
|
|
53
|
+
showHeader?: boolean
|
|
54
|
+
chatbot?: boolean
|
|
55
|
+
}> = async ({
|
|
56
|
+
showHeader = false,
|
|
57
|
+
chatbot = false,
|
|
58
|
+
siteDef,
|
|
59
|
+
children,
|
|
60
|
+
}) => {
|
|
61
|
+
|
|
62
|
+
const currentUser = await getUserServerSide()
|
|
63
|
+
|
|
64
|
+
return (
|
|
65
|
+
<html lang='en' suppressHydrationWarning className='hanzo-ui-dark-theme' style={{backgroundColor: '#000'}}>
|
|
66
|
+
<head >
|
|
67
|
+
{/* https://stackoverflow.com/a/75716588/11645689 */ }
|
|
68
|
+
<base target='_blank' />
|
|
69
|
+
<FacebookPixelHead/>
|
|
70
|
+
</head>
|
|
71
|
+
|
|
72
|
+
<body className={bodyClasses} style={{
|
|
73
|
+
// Not sure why these got added (by my commit)
|
|
74
|
+
|
|
75
|
+
// As also noted above, 'overflow: hidden' on the <body> tag breaks scroll snap!
|
|
76
|
+
//paddingRight: '0 !important',
|
|
77
|
+
//maxWidth: '100vw',
|
|
78
|
+
display: 'none', // see scripts.tsx
|
|
79
|
+
|
|
80
|
+
}}>
|
|
81
|
+
<Scripts/>
|
|
82
|
+
<AuthServiceProvider user={currentUser} conf={{} as AuthServiceConf}>
|
|
83
|
+
{siteDef?.commerce ? (
|
|
84
|
+
<CommerceProvider
|
|
85
|
+
rootNode={siteDef.commerce!.rootNode}
|
|
86
|
+
families={siteDef.commerce!.families}
|
|
87
|
+
options={siteDef.commerce!.options}
|
|
88
|
+
uiSpecs={selectionUISpecifiers}
|
|
89
|
+
>
|
|
90
|
+
<Guts
|
|
91
|
+
siteDef={siteDef}
|
|
92
|
+
showHeader={showHeader}
|
|
93
|
+
chatbot={chatbot}
|
|
94
|
+
>
|
|
95
|
+
{children}
|
|
96
|
+
</Guts>
|
|
97
|
+
<BuyDrawer />
|
|
98
|
+
<CheckoutWidget />
|
|
99
|
+
</CommerceProvider>
|
|
100
|
+
) : (
|
|
101
|
+
<Guts
|
|
102
|
+
siteDef={siteDef}
|
|
103
|
+
showHeader={showHeader}
|
|
104
|
+
chatbot={chatbot}
|
|
105
|
+
>
|
|
106
|
+
{children}
|
|
107
|
+
</Guts>
|
|
108
|
+
|
|
109
|
+
)}
|
|
110
|
+
<AuthListener/>
|
|
111
|
+
</AuthServiceProvider>
|
|
112
|
+
<Toaster position='top-center' duration={3000}/>
|
|
113
|
+
</body>
|
|
114
|
+
</html>
|
|
115
|
+
)
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
export {
|
|
119
|
+
RootLayout,
|
|
120
|
+
viewport
|
|
121
|
+
}
|
|
@@ -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]
|
package/server-actions/index.ts
CHANGED
|
@@ -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
|
+
}
|