-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.tsx
109 lines (100 loc) · 2.62 KB
/
index.tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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
import { useEffect, useMemo, useState } from "react"
import getComponent from "~getComponent/index"
import type { ComponentConfig, MutationProps } from "~getComponent/types"
import { subscribe, subscribeToAllTopics, unsubscribe } from "~services/pubsub"
import type { PubSubEvent } from "~services/pubsub/types"
import useGraphQL from "~services/useGraphQL"
import type { Variables } from "~services/useGraphQL"
import useMachines from "~services/useMachines"
import type { FormMachineContext } from "~services/useMachines/types"
import type { CreateMachineParamsConfig, Fields } from "~services/useMachines/types"
import Action from "../Action"
import makeMutationConfiguration from "../state/makeMutationConfiguration"
import css from "./index.module.css"
export default function Mutation(props: MutationProps): JSX.Element | null {
const {
args,
buttonText = "Update",
elements,
enabledEvents,
id,
isReadOnly,
label,
machineConfig,
mutableVariableNames = [],
mutation,
name,
url = "http://example.com/",
} = props
const { mutate } = useGraphQL(url)
const [subscribed, setSubscribed] = useState(false)
const config: CreateMachineParamsConfig = useMemo(
() => (machineConfig as CreateMachineParamsConfig ?? makeMutationConfiguration({
enabledEvents,
isReadOnly,
label,
mutationId: props.id,
name,
})),
[],
)
const { actions, context, status } = useMachines(config)
useEffect(() => {
subscribe(id, (event: PubSubEvent) => {
if (["INPUT_INITIALIZE", "INPUT_UPDATE"].includes(event.eventName) && event.data?.name) {
actions?.formUpdate?.({
[event.data.name as string]: event.data as Fields,
})
}
if (event.eventName === "SUBMIT_ACTION") {
const variables = mutableVariableNames.reduce((out, name) => {
return {
...out,
[name]: ((context as FormMachineContext).fields?.[name].value as string),
} as Variables
}, args)
mutate(name, mutation as string, variables)
actions.formSubmit?.()
}
}, {
topic: id,
})
setSubscribed(true)
return () => {
unsubscribe(id)
}
}, [
args,
context,
setSubscribed,
subscribe,
unsubscribe,
])
const form = (
<>
<form id={id}></form>
{elements?.map((component: ComponentConfig) => getComponent(component))}
{isReadOnly ? null : (
<Action
actionType="SUBMIT_ACTION"
id={`${id}-submit-button`}
mutationId={id}
label={buttonText}
/>
)}
</>
)
const output = label
? (
<section className={css.mutation}>
<h3>{label}</h3>
{form}
</section>
)
: (
<div className={css.mutation}>
{form}
</div>
)
return subscribed ? output : null
}