Skip to content

Commit c8e0275

Browse files
author
Matthew Valancy
committed
fix: resolve React hooks and error handling bugs in OAuth config UI
Critical fixes: - Fix infinite loop in useEffect by removing stale closure on providers state - Create fresh defaultProviders object instead of spreading existing state - Add error state management with user-visible error messages - Improve error handling with typed catch blocks - Display errors in UI with auto-dismiss after 5 seconds - Add XCircle icon for error display These bugs would have caused: 1. Infinite re-renders when loading OAuth configs 2. Silent failures with no user feedback on errors 3. React warnings about missing dependencies
1 parent adee529 commit c8e0275

1 file changed

Lines changed: 40 additions & 7 deletions

File tree

packages/web/src/pages/Admin.tsx

Lines changed: 40 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -300,6 +300,7 @@ function OAuthProviderManagement() {
300300
});
301301

302302
const [saved, setSaved] = useState(false);
303+
const [error, setError] = useState<string | null>(null);
303304

304305
const { data, loading: queryLoading, refetch } = useQuery(GET_OAUTH_PROVIDER_CONFIGS);
305306
const [updateOAuthConfig, { loading: mutationLoading }] = useMutation(UPDATE_OAUTH_PROVIDER_CONFIG);
@@ -308,10 +309,33 @@ function OAuthProviderManagement() {
308309

309310
useEffect(() => {
310311
if (data?.oauthProviderConfigs) {
311-
const loadedProviders = { ...providers };
312+
const defaultProviders = {
313+
google: {
314+
enabled: false,
315+
clientId: '',
316+
clientSecret: '',
317+
callbackUrl: 'https://localhost:4128/auth/google/callback',
318+
configured: false,
319+
},
320+
linkedin: {
321+
enabled: false,
322+
clientId: '',
323+
clientSecret: '',
324+
callbackUrl: 'https://localhost:4128/auth/linkedin/callback',
325+
configured: false,
326+
},
327+
github: {
328+
enabled: false,
329+
clientId: '',
330+
clientSecret: '',
331+
callbackUrl: 'https://localhost:4128/auth/github/callback',
332+
configured: false,
333+
},
334+
};
335+
312336
data.oauthProviderConfigs.forEach((config: any) => {
313-
if (loadedProviders[config.provider as keyof typeof loadedProviders]) {
314-
loadedProviders[config.provider as keyof typeof loadedProviders] = {
337+
if (defaultProviders[config.provider as keyof typeof defaultProviders]) {
338+
defaultProviders[config.provider as keyof typeof defaultProviders] = {
315339
enabled: config.enabled,
316340
clientId: config.clientId || '',
317341
clientSecret: config.clientSecret || '',
@@ -320,11 +344,12 @@ function OAuthProviderManagement() {
320344
};
321345
}
322346
});
323-
setProviders(loadedProviders);
347+
setProviders(defaultProviders);
324348
}
325349
}, [data]);
326350

327351
const handleSave = async () => {
352+
setError(null);
328353
try {
329354
for (const [providerKey, config] of Object.entries(providers)) {
330355
await updateOAuthConfig({
@@ -343,8 +368,10 @@ function OAuthProviderManagement() {
343368
await refetch();
344369
setSaved(true);
345370
setTimeout(() => setSaved(false), 3000);
346-
} catch (error) {
347-
console.error('Failed to save OAuth configuration:', error);
371+
} catch (err: any) {
372+
console.error('Failed to save OAuth configuration:', err);
373+
setError(err.message || 'Failed to save OAuth configuration');
374+
setTimeout(() => setError(null), 5000);
348375
}
349376
};
350377

@@ -483,13 +510,19 @@ function OAuthProviderManagement() {
483510
</div>
484511

485512
<div className="mt-8 flex items-center justify-between p-4 bg-gray-800/50 border border-gray-700 rounded-lg">
486-
<div className="text-sm text-gray-400">
513+
<div className="text-sm">
487514
{saved && (
488515
<span className="flex items-center text-green-400">
489516
<CheckCircle className="h-4 w-4 mr-2" />
490517
OAuth configuration saved successfully
491518
</span>
492519
)}
520+
{error && (
521+
<span className="flex items-center text-red-400">
522+
<XCircle className="h-4 w-4 mr-2" />
523+
{error}
524+
</span>
525+
)}
493526
</div>
494527
<div className="flex space-x-3">
495528
<button

0 commit comments

Comments
 (0)