Skip to content

Commit ecc0388

Browse files
authored
Fix Webhook Form not rendering persisted HTTP Headers upon refresh (supabase#37600)
* resolve useEffect race condition * force state re-initialization using `key` prop
1 parent dfe26d8 commit ecc0388

File tree

2 files changed

+41
-44
lines changed

2 files changed

+41
-44
lines changed

apps/studio/components/interfaces/Database/Hooks/EditHookPanel.tsx

Lines changed: 40 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -42,12 +42,48 @@ export const EditHookPanel = ({ visible, selectedHook, onClose }: EditHookPanelP
4242

4343
// [Joshen] There seems to be some bug between Checkbox.Group within the Form component
4444
// hence why this external state as a temporary workaround
45-
const [events, setEvents] = useState<string[]>([])
45+
const [events, setEvents] = useState<string[]>(selectedHook?.events ?? [])
4646
const [eventsError, setEventsError] = useState<string>()
4747

4848
// For HTTP request
49-
const [httpHeaders, setHttpHeaders] = useState<HTTPArgument[]>([])
50-
const [httpParameters, setHttpParameters] = useState<HTTPArgument[]>([])
49+
const [httpHeaders, setHttpHeaders] = useState<HTTPArgument[]>(() => {
50+
if (typeof selectedHook === `undefined`) {
51+
return [{ id: uuidv4(), name: 'Content-type', value: 'application/json' }]
52+
}
53+
const [_, __, headers] = selectedHook.function_args
54+
let parsedHeaders: Record<string, string> = {}
55+
56+
try {
57+
parsedHeaders = JSON.parse(headers.replace(/\\"/g, '"'))
58+
} catch (e) {
59+
parsedHeaders = {}
60+
}
61+
62+
return Object.entries(parsedHeaders).map(([name, value]) => ({
63+
id: uuidv4(),
64+
name,
65+
value,
66+
}))
67+
})
68+
const [httpParameters, setHttpParameters] = useState<HTTPArgument[]>(() => {
69+
if (typeof selectedHook === `undefined`) {
70+
return [{ id: uuidv4(), name: '', value: '' }]
71+
}
72+
const [_, __, ___, parameters] = selectedHook.function_args
73+
let parsedParameters: Record<string, string> = {}
74+
75+
try {
76+
parsedParameters = JSON.parse(parameters.replace(/\\"/g, '"'))
77+
} catch (e) {
78+
parsedParameters = {}
79+
}
80+
81+
return Object.entries(parsedParameters).map(([name, value]) => ({
82+
id: uuidv4(),
83+
name,
84+
value,
85+
}))
86+
})
5187

5288
const { project } = useProjectContext()
5389
const { data } = useTablesQuery({
@@ -100,48 +136,8 @@ export const EditHookPanel = ({ visible, selectedHook, onClose }: EditHookPanelP
100136
if (visible) {
101137
setIsEdited(false)
102138
setIsClosingPanel(false)
103-
104-
if (selectedHook !== undefined) {
105-
setEvents(selectedHook.events)
106-
107-
const [_, __, headers, parameters] = selectedHook.function_args
108-
109-
let parsedParameters: Record<string, string> = {}
110-
111-
// Try to parse the parameters with escaped quotes
112-
try {
113-
parsedParameters = JSON.parse(parameters.replace(/\\"/g, '"'))
114-
} catch (e) {
115-
// If parsing still fails, fallback to an empty object
116-
parsedParameters = {}
117-
}
118-
119-
let parsedHeaders: Record<string, string> = {}
120-
try {
121-
parsedHeaders = JSON.parse(headers.replace(/\\"/g, '"'))
122-
} catch (e) {
123-
// If parsing still fails, fallback to an empty object
124-
parsedHeaders = {}
125-
}
126-
127-
setHttpHeaders(
128-
Object.keys(parsedHeaders).map((key) => {
129-
return { id: uuidv4(), name: key, value: parsedHeaders[key] }
130-
})
131-
)
132-
133-
setHttpParameters(
134-
Object.keys(parsedParameters).map((key) => {
135-
return { id: uuidv4(), name: key, value: parsedParameters[key] }
136-
})
137-
)
138-
} else {
139-
setEvents([])
140-
setHttpHeaders([{ id: uuidv4(), name: 'Content-type', value: 'application/json' }])
141-
setHttpParameters([{ id: uuidv4(), name: '', value: '' }])
142-
}
143139
}
144-
}, [visible, selectedHook])
140+
}, [visible])
145141

146142
const onClosePanel = () => {
147143
if (isEdited) setIsClosingPanel(true)

apps/studio/components/interfaces/Integrations/Webhooks/ListTab.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ export const WebhooksListTab = () => {
3838
<div className="p-10">
3939
<HooksList createHook={createHook} editHook={editHook} deleteHook={deleteHook} />
4040
<EditHookPanel
41+
key={selectedHook?.id}
4142
visible={showCreateHookForm}
4243
selectedHook={selectedHook}
4344
onClose={() => setShowCreateHookForm(false)}

0 commit comments

Comments
 (0)