Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
219 commits
Select commit Hold shift + click to select a range
7d8e295
Merge branch 'develop' into release
TedxTed Mar 12, 2024
f87da1c
Merge branch 'develop' into release
TedxTed Mar 14, 2024
43cfc3f
Merge branch 'develop' into release
TedxTed Mar 14, 2024
195fbcb
Merge branch 'develop' into release
TedxTed Mar 14, 2024
8b2f039
Merge branch 'develop' into release
TedxTed Mar 14, 2024
7b98907
Merge branch 'develop' into release
TedxTed Mar 14, 2024
c9236d9
Merge branch 'develop' into release
TedxTed Mar 15, 2024
6c15e70
Merge branch 'develop' into release
TedxTed Mar 15, 2024
49de78b
Merge branch 'develop' into release
TedxTed Mar 15, 2024
b0fa8ce
Merge branch 'develop' into release
TedxTed Mar 15, 2024
a92b6dd
Merge branch 'develop' into release
Ponchimeow Mar 15, 2024
61dbcce
Merge branch 'develop' into release
TedxTed Mar 15, 2024
635b10f
Merge branch 'develop' into release
Ponchimeow Mar 15, 2024
92fc724
Merge branch 'develop' into release
TedxTed Mar 18, 2024
b3172f0
Merge branch 'develop' into release
TedxTed Mar 18, 2024
6ae7cdc
Merge branch 'develop' into release
TedxTed Mar 19, 2024
a72728e
Merge branch 'develop' into release
TedxTed Mar 21, 2024
1711ce8
Merge branch 'develop' into release
TedxTed Mar 21, 2024
7056e9f
Merge branch 'develop' into release
clothe09986 Mar 27, 2024
ac5d0a7
Merge branch 'develop' into release
ShenDing1125 Mar 28, 2024
943b72a
Merge branch 'develop' into release
TedxTed Mar 28, 2024
6d44480
Merge branch 'develop' into release
TedxTed Mar 29, 2024
d0aad55
Merge branch 'develop' into release
TedxTed Mar 29, 2024
00bd108
Merge branch 'develop' into release
clothe09986 Apr 1, 2024
ba84a50
Merge branch 'develop' into release
clothe09986 Apr 1, 2024
5f933ef
Merge branch 'develop' into release
TedxTed Apr 8, 2024
07e9b05
Merge branch 'develop' into release
TedxTed Apr 10, 2024
1341f6d
Merge branch 'develop' into release
clothe09986 Apr 12, 2024
0498805
Merge branch 'develop' into release
TedxTed Apr 12, 2024
db55adf
Merge branch 'develop' into release
TedxTed Apr 15, 2024
6906edf
Merge branch 'develop' into release
TedxTed Apr 16, 2024
2871d4e
Merge branch 'develop' into release
Ponchimeow Apr 24, 2024
269c4b2
Merge branch 'develop' into release
clothe09986 Apr 25, 2024
ee84ebd
Merge branch 'develop' into release
clothe09986 Apr 25, 2024
247ef86
Merge branch 'develop' into release
TedxTed Apr 29, 2024
6213964
Merge branch 'develop' into release
TedxTed Apr 29, 2024
6abfb0b
Merge branch 'develop' into release
TedxTed Apr 30, 2024
fbcdbd5
Merge branch 'develop' into release
Ponchimeow Apr 30, 2024
efbe037
Merge branch 'develop' into release
TedxTed May 2, 2024
0e34954
Merge branch 'develop' into release
Ponchimeow May 2, 2024
3a3e88f
Merge branch 'develop' into release
TedxTed May 3, 2024
b918231
Merge branch 'develop' into release
Ponchimeow May 3, 2024
a2e0ade
Merge branch 'develop' into release
Ponchimeow May 13, 2024
ab80010
Merge branch 'develop' into release
TedxTed May 13, 2024
133ce49
Merge branch 'develop' into release
TedxTed May 14, 2024
b95de71
Merge branch 'develop' into release
TedxTed May 15, 2024
c9411a1
Merge branch 'develop' into release
TedxTed May 17, 2024
e21d803
Merge branch 'develop' into release
TedxTed May 20, 2024
da64db4
Merge branch 'develop' into release
Ponchimeow May 21, 2024
ce71fe8
Merge branch 'develop' into release
Ponchimeow May 21, 2024
739cc65
Merge branch 'develop' into release
Ponchimeow May 24, 2024
a3ce519
Merge branch 'develop' into release
Ponchimeow May 24, 2024
9cee517
Merge branch 'develop' into release
Ponchimeow May 31, 2024
7924d46
Merge branch 'develop' into release
TedxTed Jun 4, 2024
219b840
Merge branch 'develop' into release
Ponchimeow Jun 5, 2024
b00d45f
Merge branch 'develop' into release
ShenDing1125 Jun 6, 2024
10d440e
Merge branch 'develop' into release
ShenDing1125 Jun 6, 2024
adaacba
Merge branch 'develop' into release
ShenDing1125 Jun 6, 2024
98d84a0
Merge branch 'develop' into release
clothe09986 Jun 7, 2024
9223634
Merge branch 'develop' into release
clothe09986 Jun 12, 2024
9060577
Merge branch 'develop' into release
Ponchimeow Jun 13, 2024
3f8e534
Merge branch 'develop' into release
LoisChen68 Jun 13, 2024
48c59c1
Merge branch 'develop' into release
ShenDing1125 Jun 17, 2024
ae543b9
Merge branch 'develop' into release
ShenDing1125 Jun 17, 2024
e04d048
Merge branch 'develop' into release
ShenDing1125 Jun 19, 2024
3976d55
Merge branch 'develop' into release
LoisChen68 Jun 20, 2024
0b00d59
Merge remote-tracking branch 'origin/develop' into release
ShenDing1125 Jun 21, 2024
a281b46
erge branch 'develop' into release
LoisChen68 Jun 27, 2024
cd7fc5c
Merge branch 'develop' into release
LoisChen68 Jul 2, 2024
75c4026
Merge branch 'develop' into release
clothe09986 Jul 4, 2024
e409d48
Merge branch 'develop' into release
clothe09986 Jul 4, 2024
535b2be
Merge branch 'develop' into release
Ponchimeow Jul 5, 2024
05295ea
Merge branch 'develop' into release
Ponchimeow Jul 5, 2024
d67590e
Merge branch 'develop' into release
TedxTed Jul 5, 2024
4f6b8c5
Merge branch 'develop' into release
Ponchimeow Jul 8, 2024
dc31dd3
Merge branch 'develop' into release
clothe09986 Jul 11, 2024
b85011d
Merge branch 'develop' into release
clothe09986 Jul 14, 2024
3671ed6
Merge branch 'develop' into release
clothe09986 Jul 15, 2024
927c13b
Merge branch 'develop' into release
clothe09986 Jul 16, 2024
d3925af
Merge remote-tracking branch 'origin/develop' into release
clothe09986 Jul 16, 2024
d2a94c6
fix: loading status of addToCart button
Ponchimeow Jul 19, 2024
7406f06
Merge branch 'develop' into release
Ponchimeow Jul 23, 2024
607d98c
Merge branch 'develop' into release
Ponchimeow Jul 23, 2024
bf0683d
Merge branch 'develop' into release
LoisChen68 Jul 24, 2024
b6f3ad1
Merge branch 'develop' into release
Ponchimeow Jul 26, 2024
97de039
Merge branch 'develop' into release
clothe09986 Jul 26, 2024
d6de2c9
Merge branch 'develop' into release
clothe09986 Jul 26, 2024
82d475d
Merge branch 'develop' into release
clothe09986 Jul 26, 2024
16c9502
Merge branch 'develop' into release
LoisChen68 Jul 30, 2024
01e7ff2
Merge branch 'develop' into release
LoisChen68 Jul 31, 2024
c39fdd7
Merge branch 'develop' into release
LoisChen68 Jul 31, 2024
00b6bf7
Merge branch 'develop' into release
TedxTed Aug 1, 2024
6532fb2
Merge branch 'develop' into release
clothe09986 Aug 7, 2024
d0dbd17
Merge branch 'develop' into release
Ponchimeow Aug 14, 2024
cba3784
Merge branch 'develop' into release
Ponchimeow Aug 16, 2024
9e52ee0
Merge branch 'develop' into release
Ponchimeow Aug 16, 2024
931aa10
Merge branch 'develop' into release
Ponchimeow Aug 16, 2024
d9838fe
Merge branch 'develop' into release
clothe09986 Aug 18, 2024
628e5da
Merge branch 'develop' into release
clothe09986 Aug 18, 2024
de206bd
Merge branch 'develop' into release
clothe09986 Aug 20, 2024
74ecaa1
Merge branch 'develop' into release
clothe09986 Aug 20, 2024
f4053b1
Merge branch 'develop' into release
TedxTed Aug 22, 2024
c09371d
Merge branch 'develop' into release
clothe09986 Aug 26, 2024
0495368
Merge branch 'develop' into release
clothe09986 Aug 29, 2024
192fe5d
Merge branch 'develop' into release
clothe09986 Aug 31, 2024
fa37e65
Merge branch 'develop' into release
clothe09986 Aug 31, 2024
59f912b
Merge branch 'develop' into release
clothe09986 Aug 31, 2024
0e60790
Merge branch 'develop' into release
clothe09986 Aug 31, 2024
0aded1d
Merge branch 'develop' into release
clothe09986 Sep 2, 2024
b3dbbc7
Merge branch 'develop' into release
Ponchimeow Sep 2, 2024
ed8a529
Merge branch 'develop' into release
clothe09986 Sep 3, 2024
ced8684
Merge branch 'develop' into release
clothe09986 Sep 3, 2024
b0050ae
Merge branch 'develop' into release
clothe09986 Sep 3, 2024
61efe0b
Merge branch 'develop' into release
clothe09986 Sep 3, 2024
61c7ae9
Merge branch 'develop' into release
clothe09986 Sep 3, 2024
6a69371
Merge branch 'develop' into release
Ponchimeow Sep 3, 2024
93dca07
Merge branch 'develop' into release
clothe09986 Sep 3, 2024
865d62e
Merge branch 'develop' into release
clothe09986 Sep 4, 2024
bab07c8
Merge branch 'develop' into release
clothe09986 Sep 4, 2024
20f0fcd
Merge branch 'develop' into release
clothe09986 Sep 5, 2024
e4b7e5e
Merge branch 'develop' into release
Ponchimeow Sep 5, 2024
4f372f3
Merge branch 'develop' into release
clothe09986 Sep 5, 2024
11260ff
Merge branch 'develop' into release
clothe09986 Sep 5, 2024
788db6c
Merge branch 'develop' into release
clothe09986 Sep 5, 2024
ca8f3ba
Merge branch 'develop' into release
Ponchimeow Sep 9, 2024
ff23513
Merge branch 'develop' into release
Ponchimeow Sep 9, 2024
c001651
Merge branch 'develop' into release
TedxTed Sep 11, 2024
430a147
update: element
TedxTed Sep 11, 2024
f85fcce
Merge branch 'develop' into release
clothe09986 Sep 11, 2024
6c0c006
Merge branch 'develop' into release
clothe09986 Sep 11, 2024
75499dd
Merge branch 'develop' into release
LoisChen68 Sep 12, 2024
4858d08
feat: update lock
LoisChen68 Sep 12, 2024
3c52528
Merge branch 'develop' into release
clothe09986 Sep 15, 2024
cb32a62
Merge branch 'develop' into release
clothe09986 Sep 16, 2024
2b2a5b8
Merge branch 'develop' into release
Ponchimeow Sep 18, 2024
6b6dbbc
Merge branch 'develop' into release
clothe09986 Sep 18, 2024
0bf3855
Merge branch 'develop' into release
clothe09986 Sep 26, 2024
4db7491
Merge branch 'develop' into release
clothe09986 Sep 26, 2024
37db01f
Merge branch 'develop' into release
Ponchimeow Sep 30, 2024
bbbddb7
Merge branch 'develop' into release
clothe09986 Sep 30, 2024
923bc07
Merge branch 'develop' into release
Ponchimeow Oct 2, 2024
e564ecb
Merge branch 'develop' into release
clothe09986 Oct 2, 2024
eb77fe6
Merge branch 'develop' into release
TedxTed Oct 3, 2024
697f7ba
Merge branch 'develop' into release
clothe09986 Oct 3, 2024
6e112eb
Merge branch 'develop' into release
Logos50607 Oct 3, 2024
c4b850c
Merge branch 'develop' into release
Logos50607 Oct 4, 2024
bee5857
Merge branch 'develop' into release
Ponchimeow Oct 7, 2024
5cbb7ec
Merge branch 'develop' into release
TedxTed Oct 8, 2024
9250896
Merge commit 'a58b39d15849bc1af55e800639c38a75930bf863' into release
Logos50607 Oct 8, 2024
b03ba39
Merge remote-tracking branch 'origin/develop' into release
clothe09986 Oct 8, 2024
6c4a441
Merge branch 'develop' into release
Ponchimeow Oct 8, 2024
d89f5d1
Merge branch 'develop' into release
clothe09986 Oct 9, 2024
333f0b9
Merge branch 'develop' into release
Ponchimeow Oct 11, 2024
aa38c54
Merge branch 'develop' into release
TedxTed Oct 11, 2024
c7fbca9
Merge branch 'develop' into release
Ponchimeow Oct 14, 2024
6d36bfe
Merge branch 'develop' into release
Ponchimeow Oct 14, 2024
312f88f
Merge branch 'develop' into release
Ponchimeow Oct 14, 2024
d339f93
Merge branch 'develop' into release
Ponchimeow Oct 16, 2024
875d068
Merge branch 'develop' into release
Ponchimeow Oct 16, 2024
eacac28
Merge branch 'develop' into release
Logos50607 Oct 16, 2024
1dfc86e
Merge branch 'develop' into release
TedxTed Oct 17, 2024
94b7e85
Merge branch 'develop' into release
Logos50607 Oct 18, 2024
5899643
Merge branch 'develop' into release
TedxTed Oct 25, 2024
18fe0fe
feat: optimize discounts with membership cards
Logos50607 Oct 27, 2024
e9c6768
feat: url query, select plan
Ponchimeow Oct 25, 2024
b2b9e8b
fix: delete useEffect
Ponchimeow Oct 25, 2024
810438a
Merge branch 'develop' into release
Ponchimeow Oct 28, 2024
d80a3fe
update: yarn
Ponchimeow Oct 28, 2024
54c3c5a
Merge branch 'develop' into release
Ponchimeow Oct 28, 2024
f777baf
feat: checkout page display checkout amount error
TedxTed Oct 25, 2024
283515b
fix: typo
Ponchimeow Oct 28, 2024
e12f9b1
feat: url query, select plan
Ponchimeow Oct 25, 2024
aa1cfc2
fix: stripe the loggers out
Logos50607 Oct 28, 2024
8aa270b
fix: ramda in yarn.lock
Logos50607 Oct 28, 2024
cead165
fix: update merged yarn.lock
Logos50607 Oct 28, 2024
7813caf
Merge branch 'develop' into release
TedxTed Oct 28, 2024
c2bc064
feat: update yarn lock
TedxTed Oct 28, 2024
b034639
fix: set optimizer name
Logos50607 Oct 28, 2024
e2abd3a
refactor: logger for debug
Logos50607 Oct 28, 2024
d87003d
refactor: logger for debug
Logos50607 Oct 28, 2024
81e84ab
feat: optimize discounts with membership cards
Logos50607 Oct 27, 2024
c6ed397
feat: url query, select plan
Ponchimeow Oct 25, 2024
5ba3853
fix: delete useEffect
Ponchimeow Oct 25, 2024
c4a5562
fix: delete function selector
Logos50607 Oct 28, 2024
f5c8c9a
Merge branch 'develop' into release
TedxTed Oct 29, 2024
5a8bc22
Merge branch 'develop' into release
TedxTed Oct 29, 2024
b5073de
Merge branch 'develop' into release
LoisChen68 Oct 29, 2024
5ee3115
Merge branch 'develop' into release
TedxTed Oct 29, 2024
3c97828
feat: multi period checkout modal for consuming coins
Logos50607 Oct 29, 2024
c408449
fix: multi period checkout crashes when checking out twice because of…
Logos50607 Oct 30, 2024
4fdb3c6
feat: multi period checkout optimizer block styling and remove unrela…
Logos50607 Oct 30, 2024
ba0f3e4
Merge branch 'develop' into release
TedxTed Nov 22, 2024
f24c048
Merge branch 'develop' into release
Ponchimeow Nov 22, 2024
701ab3b
Merge branch 'develop' into release
LoisChen68 Nov 25, 2024
093d953
Merge branch 'develop' into release
TedxTed Nov 26, 2024
41d1137
Merge branch 'develop' into release
LoisChen68 Nov 28, 2024
8448af3
Merge branch 'develop' into release
LoisChen68 Nov 28, 2024
abed7a2
Merge branch 'develop' into release
Ponchimeow Dec 3, 2024
381418c
Merge branch 'develop' into release
TedxTed Dec 4, 2024
7f00527
fix: allow member to see her own review even when review items are no…
Logos50607 Dec 4, 2024
a931179
feat: update element
Logos50607 Dec 4, 2024
6277140
Merge branch 'develop' into release
Logos50607 Dec 4, 2024
669d6e1
fix: allow member to see her own review even when review items are no…
Logos50607 Dec 4, 2024
b56b4c6
Merge branch 'develop' into release
TedxTed Dec 5, 2024
1fcdd1b
Merge branch 'develop' into release
TedxTed Dec 5, 2024
9643888
Merge branch 'develop' into release
LoisChen68 Dec 6, 2024
ae540cf
Merge branch 'develop' into release
Ponchimeow Dec 9, 2024
f0eeb05
Merge branch 'develop' into release
Ponchimeow Dec 11, 2024
699c80b
Merge branch 'develop' into release
TedxTed Dec 16, 2024
98e8fdb
Merge branch 'develop' into release
TedxTed Dec 17, 2024
dc00838
Merge branch 'develop' into release
TedxTed Dec 18, 2024
f05be16
Merge branch 'develop' into release
TedxTed Dec 18, 2024
7a43eea
Merge branch 'develop' into release
Ponchimeow Dec 18, 2024
21774b4
Merge branch 'develop' into release
TedxTed Dec 23, 2024
d87fa9c
Merge branch 'develop' into release
TedxTed Dec 23, 2024
e0583c8
Merge branch 'develop' into release
TedxTed Dec 24, 2024
ac44606
Merge branch 'develop' into release
Ponchimeow Dec 25, 2024
77e5a71
Merge branch 'develop' into release
Ponchimeow Dec 26, 2024
e2c0f2b
feat: introduce MeetingPage_v2 for dynamic form rendering, validation…
Logos50607 Jan 29, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
313 changes: 313 additions & 0 deletions src/pages/MeetingPage/MeetingPage_v2.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,313 @@
import { useQuery } from '@apollo/client'
import {
Badge,
Button,
Checkbox,
CheckboxGroup,
FormControl,
FormLabel,
Heading,
Input,
Stack,
useToast,
} from '@chakra-ui/react'
import axios from 'axios'
import gql from 'graphql-tag'
import Cookies from 'js-cookie'
import { useApp } from 'lodestar-app-element/src/contexts/AppContext'
import { identity, ifElse, map, pipe, reduce } from 'ramda'
import React, { useMemo, useState } from 'react'
import { useIntl } from 'react-intl'
import { useHistory, useParams } from 'react-router-dom'
import { BooleanParam } from 'serialize-query-params'
import styled from 'styled-components'
import { useQueryParams } from 'use-query-params'
import DefaultLayout from '../../components/layout/DefaultLayout'
import hasura from '../../hasura'
import LoadingPage from '../LoadingPage'
import NotFoundPage from '../NotFoundPage'
import MeetingPageMessages from './translation'

// --- Types ---
type FieldType = 'text' | 'email' | 'tel' | 'single' | 'multiple' | 'hidden' | string

interface FieldConfig {
id: string
type: FieldType
path?: string[]
title?: string
placeholder?: string
required?: boolean
options?: { id: number; label: string; description?: string; value: string }[]
generateValue?: string
payloadValue?: string
validate?: string
pattern?: string
}

const StyledForm = styled.form`
padding: 48px 24px;
`

const GetMemberByUsername = gql`
query GetMemberByUsername($appId: String!, $username: String!) {
member_public(where: { app_id: { _eq: $appId }, username: { _eq: $username } }) {
id
}
}
`

// --- Helpers ---

// 遞歸路徑定位引擎
const setDeep = (obj: any, path: string[], value: any) => {
let current = obj
path.forEach((key, idx) => {
const isLast = idx === path.length - 1
if (isLast) {
current[key] = value
} else {
if (!current[key]) {
current[key] = /^\d+$/.test(path[idx + 1]) ? [] : {}
}
current = current[key]
}
})
return obj
}

const calculateFinalValue = (field: FieldConfig, context: any) => {
if (field.generateValue) {
try {
const generator = new Function('context', `return (${field.generateValue})(context)`)
return generator(context)
} catch (err) {
return undefined
}
}
return context.form[field.id]
}

const validateRequired = (field: FieldConfig, value: any, isPhoneRequired: boolean) => {
const isRequired = field.type === 'tel' ? isPhoneRequired : field.required
if (isRequired && (!value || (Array.isArray(value) && value.length === 0))) {
return `請填寫 ${field.title || field.id}`
}
return null
}

const validateFieldCustom = (field: FieldConfig, context: any) => {
if (field.validate) {
try {
const validator = new Function('context', `return (${field.validate})(context)`)
return validator(context)
} catch (e) {
console.error(`Validation error in field ${field.id}:`, e)
}
}
return null
}

const processPayload = (payload: any) => {
if (Array.isArray(payload.properties)) {
payload.properties = payload.properties.filter((p: any) => p !== null && p !== undefined)
}
return payload
}

const generatePayloadValue = (field: FieldConfig, value: any, context: any) => {
if (!field.payloadValue) return value
try {
const generator = new Function('context', `return (${field.payloadValue})(context)`)
return generator({ ...context, value })
} catch (error) {
console.error(`Payload generation error in field ${field.id}:`, error)
return undefined
}
}

// --- Components ---

const FieldRenderer: React.FC<{ field: FieldConfig; isPhoneRequired: boolean }> = ({ field, isPhoneRequired }) => {
const isRequired = field.type === 'tel' ? isPhoneRequired : field.required
if (field.type === 'hidden') return null

return (
<FormControl mb={6} isRequired={isRequired}>
<FormLabel fontWeight="bold">{field.title || field.id}</FormLabel>
{(() => {
switch (field.type) {
case 'multiple':
return (
<CheckboxGroup colorScheme="primary">
<Stack spacing={2}>
{field.options?.map(opt => (
<Checkbox key={opt.id} name={field.id} value={opt.value}>
<Badge me={1} variant="outline" colorScheme="primary">
{opt.label}
</Badge>
{opt.description && <span>{opt.description}</span>}
</Checkbox>
))}
</Stack>
</CheckboxGroup>
)
case 'single':
return (
<Stack spacing={2}>
{field.options?.map(opt => {
const uniqueId = `radio-${field.id}-${opt.id}`
return (
<label
key={opt.id}
htmlFor={uniqueId}
style={{ display: 'flex', alignItems: 'center', cursor: 'pointer' }}
>
<input
type="radio"
id={uniqueId}
className="chakra-radio__input"
name={field.id}
value={opt.value}
required={isRequired}
/>
<div className="chakra-radio__label" style={{ marginLeft: '0.5rem' }}>
<Badge me={1} variant="outline" colorScheme="primary">
{opt.label}
</Badge>
<span style={{ fontWeight: 'normal' }}>{opt.description}</span>
</div>
</label>
)
})}
</Stack>
)
default:
return (
<Input
name={field.id}
type={field.type}
placeholder={field.placeholder || field.title}
pattern={field.pattern}
/>
)
}
})()}
</FormControl>
)
}

const MeetingPage = () => {
const { formatMessage } = useIntl()
const { id: appId, settings, loading: loadingAppData } = useApp()
const history = useHistory()
const toast = useToast()
const { username: managerUsername } = useParams<{ username: string }>()
const [{ noHeader, noFooter }] = useQueryParams({ noHeader: BooleanParam, noFooter: BooleanParam })
const [isSubmitting, setIsSubmitting] = useState(false)

const isPhoneRequired = settings['member_profile_phone.check.ignore.enable'] !== '1'

const config = useMemo(() => {
try {
const raw = JSON.parse(settings['custom.meeting_page'] || '{}')
return { fields: (raw.fields || []) as FieldConfig[] }
} catch (e) {
return { fields: [] }
}
}, [settings])

const { data: memberData, loading: loadingMember } = useQuery<
hasura.GetMemberByUsername,
hasura.GetMemberByUsernameVariables
>(GetMemberByUsername, { skip: !managerUsername, variables: { appId, username: managerUsername } })

if (loadingAppData || loadingMember) return <LoadingPage />
if (settings['custom.permission_group.salesLead'] !== '1' || (managerUsername && !memberData?.member_public?.[0]))
return <NotFoundPage />

const handleSubmit: React.FormEventHandler<HTMLFormElement> = async e => {
e.preventDefault()
setIsSubmitting(true)
const formData = new FormData(e.currentTarget)

const resolveContext: any = {
utm: JSON.parse(Cookies.get('utm') || '{}'),
cookie: { landing: Cookies.get('landing') || '' },
form: {},
formatMessage,
MeetingPageMessages,
}

const populateForm = (field: FieldConfig) => {
if (field.type !== 'hidden') {
const val = field.type === 'multiple' ? formData.getAll(field.id) : formData.get(field.id)
resolveContext.form[field.id] = val || (field.type === 'multiple' ? [] : '')
}
return field
}

try {
const processFields = pipe(
// A. 預掃描資料
map(populateForm),
// B. 計算與驗證
map((field: FieldConfig) => {
const value = calculateFinalValue(field, resolveContext)
const error = validateRequired(field, value, isPhoneRequired) || validateFieldCustom(field, resolveContext)
if (error) throw new Error(error)
return { field, value }
}),
// C. 建立 Payload
reduce(
ifElse(
(_: any, { field }: { field: FieldConfig; value: any }) => !field.path,
identity,
(acc, { field, value }) => setDeep(acc, field.path!, generatePayloadValue(field, value, resolveContext)),
),
{ managerUsername },
),
// D. 處理 Payload (Cleanup)
processPayload,
)

const payload = processFields(config.fields)

const { data } = await axios.post(`${process.env.REACT_APP_API_BASE_ROOT}/sys/create-lead`, payload, {
withCredentials: true,
})
if (data.code === 'SUCCESS') {
Cookies.remove('utm')
Cookies.remove('landing')
history.push('/meets/us/completed')
} else {
throw new Error(data.message)
}
} catch (error: any) {
if (error instanceof Error) {
toast({ title: error.message, status: 'warning', position: 'top' })
} else {
console.error(error)
}
setIsSubmitting(false)
}
}

return (
<DefaultLayout centeredBox noFooter={noFooter} noHeader={noHeader}>
<StyledForm onSubmit={handleSubmit}>
<Heading as="h3" size="lg" mb={8} textAlign="center">
{formatMessage(MeetingPageMessages.MeetingPage.bookingLink, { managerUsername })}
</Heading>
{config.fields.map(field => (
<FieldRenderer key={field.id} field={field} isPhoneRequired={isPhoneRequired} />
))}
<Button width="100%" colorScheme="primary" type="submit" isLoading={isSubmitting} mt={6} size="lg">
{formatMessage(MeetingPageMessages.MeetingPage.submit)}
</Button>
</StyledForm>
</DefaultLayout>
)
}

export default MeetingPage
4 changes: 2 additions & 2 deletions src/pages/MeetingPage/index.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
import MeetingPage from './MeetingPage'
import MeetingPage_v2 from './MeetingPage_v2'

export default MeetingPage
export default MeetingPage_v2