Skip to content

Commit 72a167e

Browse files
authored
fix: correctly process custom theme as either object or JSON.stringify(theme) (#82)
1 parent b10c822 commit 72a167e

File tree

3 files changed

+510
-40
lines changed

3 files changed

+510
-40
lines changed

Hcaptcha.js

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,15 @@ const Hcaptcha = ({
9292
const [isLoading, setIsLoading] = useState(true);
9393

9494
if (theme && typeof theme === 'string') {
95-
theme = `"${theme}"`;
95+
try {
96+
JSON.parse(theme);
97+
} catch (_) {
98+
theme = `"${theme}"`;
99+
}
100+
}
101+
102+
if (theme && typeof theme === 'object') {
103+
theme = `${JSON.stringify(theme)}`;
96104
}
97105

98106
if (rqdata && typeof rqdata === 'string') {

__tests__/Hcaptcha.test.js

Lines changed: 117 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -45,49 +45,127 @@ describe('Hcaptcha snapshot tests', () => {
4545
expect(component).toMatchSnapshot();
4646
});
4747

48-
[
49-
{
50-
data: 'open',
51-
expectedSuccess: true,
52-
},
53-
{
54-
data: '10000000-aaaa-bbbb-cccc-000000000001',
55-
expectedSuccess: true,
56-
},
57-
{
58-
data: 'webview-error',
59-
expectedSuccess: false,
60-
},
61-
].forEach(({ data, expectedSuccess }) => {
62-
it(`test ${data} forwarding`, async () => {
63-
jest.useFakeTimers();
64-
let setTimeoutSpy = jest.spyOn(global, 'setTimeout');
65-
setWebViewMessageData(data);
66-
const onMessageMock = jest.fn();
48+
describe('onMessage', () => {
49+
[
50+
{
51+
data: 'open',
52+
expectedSuccess: true,
53+
},
54+
{
55+
data: '10000000-aaaa-bbbb-cccc-000000000001',
56+
expectedSuccess: true,
57+
},
58+
{
59+
data: 'webview-error',
60+
expectedSuccess: false,
61+
},
62+
].forEach(({ data, expectedSuccess }) => {
63+
it(`test ${data} forwarding`, async () => {
64+
jest.useFakeTimers();
65+
let setTimeoutSpy = jest.spyOn(global, 'setTimeout');
66+
setWebViewMessageData(data);
67+
const onMessageMock = jest.fn();
6768

68-
render(
69-
<Hcaptcha
70-
siteKey="00000000-0000-0000-0000-000000000000"
71-
url="https://hcaptcha.com"
72-
languageCode="en"
73-
onMessage={onMessageMock}
74-
/>
75-
);
76-
77-
await waitFor(() => {
78-
expect(onMessageMock).toHaveBeenCalledTimes(1);
79-
expect(onMessageMock).toHaveBeenCalledWith(
80-
expect.objectContaining({
81-
success: expectedSuccess,
82-
nativeEvent: expect.objectContaining({ data }),
83-
})
69+
render(
70+
<Hcaptcha
71+
siteKey="00000000-0000-0000-0000-000000000000"
72+
url="https://hcaptcha.com"
73+
languageCode="en"
74+
onMessage={onMessageMock}
75+
/>
8476
);
8577

86-
if (data === 'token') {
87-
expect(setTimeoutSpy).toHaveBeenCalledTimes(1);
88-
}
78+
await waitFor(() => {
79+
expect(onMessageMock).toHaveBeenCalledTimes(1);
80+
expect(onMessageMock).toHaveBeenCalledWith(
81+
expect.objectContaining({
82+
success: expectedSuccess,
83+
nativeEvent: expect.objectContaining({ data }),
84+
})
85+
);
86+
87+
if (data === 'token') {
88+
expect(setTimeoutSpy).toHaveBeenCalledTimes(1);
89+
}
90+
});
8991
});
9092
});
9193
});
92-
});
9394

95+
describe('Theme', () => {
96+
const theme = {
97+
"palette": {
98+
"mode": "dark",
99+
"primary": {
100+
"main": "#26C6DA"
101+
},
102+
"warn": {
103+
"main": "#FF8A80"
104+
},
105+
"text": {
106+
"heading": "#FAFAFA",
107+
"body": "#E0E0E0"
108+
}
109+
},
110+
"component": {
111+
"checkbox": {
112+
"main": {
113+
"fill": "#333333",
114+
"border": "#F5F5F5"
115+
},
116+
"hover": {
117+
"fill": "#222222"
118+
}
119+
},
120+
"modal": {
121+
"main": {
122+
"fill": "#222222"
123+
},
124+
"hover": {
125+
"fill": "#333333"
126+
},
127+
"focus": {
128+
"outline": "#80DEEA"
129+
}
130+
},
131+
"textarea": {
132+
"main": {
133+
"fill": "#4F4F4F",
134+
"border": "#828282"
135+
},
136+
"focus": {
137+
"fill": "#4F4F4F",
138+
"outline": "#80DEEA"
139+
},
140+
"disabled": {
141+
"fill": "#828282"
142+
}
143+
}
144+
}
145+
};
146+
147+
[
148+
{
149+
data: theme,
150+
},
151+
{
152+
data: JSON.stringify(theme),
153+
},
154+
{
155+
data: undefined,
156+
},
157+
].forEach(({ data }) => {
158+
it(`test ${typeof data}`, async () => {
159+
const component = render(
160+
<Hcaptcha
161+
siteKey="00000000-0000-0000-0000-000000000000"
162+
url="https://hcaptcha.com"
163+
languageCode="en"
164+
theme={data}
165+
/>
166+
);
167+
expect(component).toMatchSnapshot();
168+
});
169+
});
170+
});
171+
});

0 commit comments

Comments
 (0)