celeroncoder / celeroncoder/gdsc-website
React Review Audit
- Dominant language
- TypeScript
- Stars
- 0
- Forks
- 0
- PR merge metrics
- No merged PRs in 30d
Description
**Score: 87/100** · 8 errors · 80 warnings
Copy as prompt
```text
Fix the following React Review diagnostics in my codebase.
## Errors (8)
1. [error] alt-text — src/components/Navbar.tsx:70
Missing `alt` attribute.
2. [error] alt-text — src/components/Navbar.tsx:74
Missing `alt` attribute.
3. [error] alt-text — src/components/Event-Card.tsx:13
Missing `alt` attribute.
4. [error] alt-text — src/components/Event-Card.tsx:16
Missing `alt` attribute.
5. [error] alt-text — src/pages/admin/events/index.tsx:35
Missing `alt` attribute.
6. [error] alt-text — src/pages/admin/events/create/index.tsx:186
Missing `alt` attribute.
7. [error] alt-text — src/pages/admin/events/update/[id].tsx:201
Missing `alt` attribute.
8. [error] alt-text — src/pages/admin/events/[id].tsx:35
Missing `alt` attribute.
## Warnings (80)
9. [warning] iframe-has-title — src/components/Team.tsx:15
Missing `title` attribute for the `iframe` element.
10. [warning] iframe-has-title — src/components/Team.tsx:19
Missing `title` attribute for the `iframe` element.
11. [warning] iframe-has-title — src/components/Team.tsx:23
Missing `title` attribute for the `iframe` element.
12. [warning] react-compiler-destructure-method — src/components/Team.tsx:13
Destructure for clarity: `const { push } = useRouter()` then call `push(...)` directly — easier for React Compiler to memoize and clearer about which methods this component depends on
13. [warning] click-events-have-key-events — src/components/Menu.tsx:7
Enforce a clickable non-interactive element has at least one keyboard event listener.
14. [warning] click-events-have-key-events — src/components/Menu.tsx:8
Enforce a clickable non-interactive element has at least one keyboard event listener.
15. [warning] nextjs-no-img-element — src/components/Menu.tsx:7
Use next/image instead of — provides automatic optimization, lazy loading, and responsive srcset
16. [warning] nextjs-no-img-element — src/components/Menu.tsx:8
Use next/image instead of — provides automatic optimization, lazy loading, and responsive srcset
17. [warning] click-events-have-key-events — src/components/Member-Card.tsx:10
Enforce a clickable non-interactive element has at least one keyboard event listener.
18. [warning] no-static-element-interactions — src/components/Member-Card.tsx:10
Static HTML elements with event handlers require a role.
19. [warning] nextjs-no-img-element — src/components/Recent-Events.tsx:12
Use next/image instead of — provides automatic optimization, lazy loading, and responsive srcset
20. [warning] nextjs-no-img-element — src/components/Recent-Events.tsx:23
Use next/image instead of — provides automatic optimization, lazy loading, and responsive srcset
21. [warning] nextjs-no-img-element — src/components/Recent-Events.tsx:34
Use next/image instead of — provides automatic optimization, lazy loading, and responsive srcset
22. [warning] react-compiler-destructure-method — src/components/Recent-Events.tsx:42
Destructure for clarity: `const { push } = useRouter()` then call `push(...)` directly — easier for React Compiler to memoize and clearer about which methods this component depends on
23. [warning] iframe-has-title — src/components/Join-Community.tsx:8
Missing `title` attribute for the `iframe` element.
24. [warning] iframe-has-title — src/components/Home.tsx:8
Missing `title` attribute for the `iframe` element.
25. [warning] click-events-have-key-events — src/components/Profile-Card.tsx:5
Enforce a clickable non-interactive element has at least one keyboard event listener.
26. [warning] no-static-element-interactions — src/components/Profile-Card.tsx:5
Static HTML elements with event handlers require a role.
27. [warning] nextjs-no-img-element — src/components/Profile-Card.tsx:9
Use next/image instead of — provides automatic optimization, lazy loading, and responsive srcset
28. [warning] nextjs-no-img-element — src/components/Profile-Card.tsx:10
Use next/image instead of — provides automatic optimization, lazy loading, and responsive srcset
29. [warning] nextjs-no-img-element — src/components/Profile-Card.tsx:11
Use next/image instead of — provides automatic optimization, lazy loading, and responsive srcset
30. [warning] nextjs-no-img-element — src/components/Profile-Card.tsx:19
Use next/image instead of — provides automatic optimization, lazy loading, and responsive srcset
31. [warning] nextjs-no-img-element — src/components/Profile-Card.tsx:20
Use next/image instead of — provides automatic optimization, lazy loading, and responsive srcset
32. [warning] nextjs-no-img-element — src/components/Profile-Card.tsx:23
Use next/image instead of — provides automatic optimization, lazy loading, and responsive srcset
33. [warning] nextjs-no-img-element — src/components/Profile-Card.tsx:24
Use next/image instead of — provides automatic optimization, lazy loading, and responsive srcset
34. [warning] nextjs-no-img-element — src/components/Profile-Card.tsx:27
Use next/image instead of — provides automatic optimization, lazy loading, and responsive srcset
35. [warning] nextjs-no-img-element — src/components/Profile-Card.tsx:28
Use next/image instead of — provides automatic optimization, lazy loading, and responsive srcset
36. [warning] label-has-associated-control — src/components/Navbar.tsx:68
A form label must have accessible text.
37. [warning] react-compiler-destructure-method — src/components/Navbar.tsx:29
Destructure for clarity: `const { push } = useRouter()` then call `push(...)` directly — easier for React Compiler to memoize and clearer about which methods this component depends on
38. [warning] nextjs-no-img-element — src/components/Navbar.tsx:32
Use next/image instead of — provides automatic optimization, lazy loading, and responsive srcset
39. [warning] nextjs-no-img-element — src/components/Navbar.tsx:37
Use next/image instead of — provides automatic optimization, lazy loading, and responsive srcset
40. [warning] nextjs-no-img-element — src/components/Navbar.tsx:70
Use next/image instead of — provides automatic optimization, lazy loading, and responsive srcset
41. [warning] nextjs-no-img-element — src/components/Navbar.tsx:74
Use next/image instead of — provides automatic optimization, lazy loading, and responsive srcset
42. [warning] nextjs-no-img-element — src/components/Navbar.tsx:86
Use next/image instead of — provides automatic optimization, lazy loading, and responsive srcset
43. [warning] nextjs-no-img-element — src/components/Navbar.tsx:91
Use next/image instead of — provides automatic optimization, lazy loading, and responsive srcset
44. [warning] no-effect-chain — src/components/FilterBox.tsx:22
useEffect reacts to "selectedTag" which is set by another useEffect — chains of effects add an extra render per link and become rigid as code evolves. Compute what you can during render and write all related state inside the event handler that originally fires the chain
45. [warning] no-cascading-set-state — src/components/FilterBox.tsx:11
3 setState calls in a single useEffect — consider using useReducer or deriving state
46. [warning] no-prop-callback-in-effect — src/components/FilterBox.tsx:14
useEffect calls prop callback "setEvents" with local state in deps — this is the "lift state via callback" anti-pattern; lift state into a shared Provider so both sides read the same source
47. [warning] no-prop-callback-in-effect — src/components/FilterBox.tsx:19
useEffect calls prop callback "setEvents" with local state in deps — this is the "lift state via callback" anti-pattern; lift state into a shared Provider so both sides read the same source
48. [warning] no-prop-callback-in-effect — src/components/FilterBox.tsx:23
useEffect calls prop callback "setEvents" with local state in deps — this is the "lift state via callback" anti-pattern; lift state into a shared Provider so both sides read the same source
49. [warning] no-prop-callback-in-effect — src/components/FilterBox.tsx:24
useEffect calls prop callback "setEvents" with local state in deps — this is the "lift state via callback" anti-pattern; lift state into a shared Provider so both sides read the same source
50. [warning] click-events-have-key-events — src/components/Event-Card.tsx:8
Enforce a clickable non-interactive element has at least one keyboard event listener.
51. [warning] no-static-element-interactions — src/components/Event-Card.tsx:8
Static HTML elements with event handlers require a role.
52. [warning] nextjs-no-img-element — src/components/Event-Card.tsx:13
Use next/image instead of — provides automatic optimization, lazy loading, and responsive srcset
53. [warning] nextjs-no-img-element — src/components/Event-Card.tsx:16
Use next/image instead of — provides automatic optimization, lazy loading, and responsive srcset
54. [warning] nextjs-no-img-element — src/components/Event-Card.tsx:22
Use next/image instead of — provides automatic optimization, lazy loading, and responsive srcset
55. [warning] react-compiler-destructure-method — src/pages/contact-us.tsx:39
Destructure for clarity: `const { push } = useRouter()` then call `push(...)` directly — easier for React Compiler to memoize and clearer about which methods this component depends on
56. [warning] react-compiler-destructure-method — src/pages/contact-us.tsx:45
Destructure for clarity: `const { push } = useRouter()` then call `push(...)` directly — easier for React Compiler to memoize and clearer about which methods this component depends on
57. [warning] react-compiler-destructure-method — src/pages/contact-us.tsx:51
Destructure for clarity: `const { push } = useRouter()` then call `push(...)` directly — easier for React Compiler to memoize and clearer about which methods this component depends on
58. [warning] iframe-has-title — src/components/About.tsx:11
Missing `title` attribute for the `iframe` element.
59. [warning] react-compiler-destructure-method — src/components/About.tsx:16
Destructure for clarity: `const { push } = useRouter()` then call `push(...)` directly — easier for React Compiler to memoize and clearer about which methods this component depends on
60. [warning] click-events-have-key-events — src/components/Event-Box.tsx:10
Enforce a clickable non-interactive element has at least one keyboard event listener.
61. [warning] no-static-element-interactions — src/components/Event-Box.tsx:10
Static HTML elements with event handlers require a role.
62. [warning] click-events-have-key-events — src/pages/admin/events/index.tsx:30
Enforce a clickable non-interactive element has at least one keyboard event listener.
63. [warning] no-static-element-interactions — src/pages/admin/events/index.tsx:30
Static HTML elements with event handlers require a role.
64. [warning] react-compiler-destructure-method — src/pages/admin/events/index.tsx:16
Destructure for clarity: `const { push } = useRouter()` then call `push(...)` directly — easier for React Compiler to memoize and clearer about which methods this component depends on
65. [warning] design-no-three-period-ellipsis — src/pages/admin/events/index.tsx:23
Three-period ellipsis ("...") in JSX text — use the actual ellipsis character "…" (or `…`)
66. [warning] react-compiler-destructure-method — src/pages/admin/events/index.tsx:31
Destructure for clarity: `const { push } = useRouter()` then call `push(...)` directly — easier for React Compiler to memoize and clearer about which methods this component depends on
67. [warning] nextjs-no-img-element — src/pages/admin/events/index.tsx:35
Use next/image instead of — provides automatic optimization, lazy loading, and responsive srcset
68. [warning] no-effect-event-handler — src/pages/events.tsx:15
useEffect simulating an event handler — move logic to an actual event handler instead
69. [warning] prefer-useReducer — src/pages/admin/events/create/index.tsx:10
Component "EventCreatePage" has 9 useState calls — consider useReducer for related state
70. [warning] no-uncontrolled-input — src/pages/admin/events/create/index.tsx:151
— "venue" is initialized as undefined (uncontrolled), then becomes controlled on first set; React warns about this flip. Initialize useState with an explicit value (e.g. `useState("")`)
71. [warning] no-uncontrolled-input — src/pages/admin/events/create/index.tsx:163
— "tagLine" is initialized as undefined (uncontrolled), then becomes controlled on first set; React warns about this flip. Initialize useState with an explicit value (e.g. `useState("")`)
72. [warning] no-uncontrolled-input — src/pages/admin/events/create/index.tsx:175
— "description" is initialized as undefined (uncontrolled), then becomes controlled on first set; React warns about this flip. Initialize useState with an explicit value (e.g. `useState("")`)
73. [warning] react-compiler-destructure-method — src/pages/admin/events/create/index.tsx:40
Destructure for clarity: `const { push } = useRouter()` then call `push(...)` directly — easier for React Compiler to memoize and clearer about which methods this component depends on
74. [warning] no-effect-event-handler — src/pages/admin/events/create/index.tsx:43
useEffect simulating an event handler — move logic to an actual event handler instead
75. [warning] rendering-hydration-mismatch-time — src/pages/admin/events/create/index.tsx:87
new Date() reachable from JSX renders differently on server vs client — wrap in useEffect+useState (client-only) or add suppressHydrationWarning to the parent if intentional
76. [warning] nextjs-no-img-element — src/pages/admin/events/create/index.tsx:186
Use next/image instead of <img> — provides automatic optimization, lazy loading, and responsive srcset
77. [warning] design-no-em-dash-in-jsx-text — src/pages/about.tsx:40
Em dash (—) in JSX text reads as model output — replace with comma, colon, semicolon, or parentheses
78. [warning] react-compiler-destructure-method — src/pages/about.tsx:49
Destructure for clarity: `const { push } = useRouter()` then call `push(...)` directly — easier for React Compiler to memoize and clearer about which methods this component depends on
79. [warning] prefer-useReducer — src/pages/admin/events/update/[id].tsx:10
Component "EventCreatePage" has 9 useState calls — consider useReducer for related state
80. [warning] react-compiler-destructure-method — src/pages/admin/events/update/[id].tsx:57
Destructure for clarity: `const { push } = useRouter()` then call `push(...)` directly — easier for React Compiler to memoize and clearer about which methods this component depends on
81. [warning] no-effect-event-handler — src/pages/admin/events/update/[id].tsx:60
useEffect simulating an event handler — move logic to an actual event handler instead
82. [warning] design-no-three-period-ellipsis — src/pages/admin/events/update/[id].tsx:70
Three-period ellipsis ("...") in JSX text — use the actual ellipsis character "…" (or `…`)
83. [warning] rendering-hydration-mismatch-time — src/pages/admin/events/update/[id].tsx:102
new Date() reachable from JSX renders differently on server vs client — wrap in useEffect+useState (client-only) or add suppressHydrationWarning to the parent if intentional
84. [warning] nextjs-no-img-element — src/pages/admin/events/update/[id].tsx:201
Use next/image instead of <img> — provides automatic optimization, lazy loading, and responsive srcset
85. [warning] design-no-three-period-ellipsis — src/pages/admin/events/[id].tsx:17
Three-period ellipsis ("...") in JSX text — use the actual ellipsis character "…" (or `…`)
86. [warning] react-compiler-destructure-method — src/pages/admin/events/[id].tsx:23
Destructure for clarity: `const { back } = useRouter()` then call `back(...)` directly — easier for React Compiler to memoize and clearer about which methods this component depends on
87. [warning] react-compiler-destructure-method — src/pages/admin/events/[id].tsx:29
Destructure for clarity: `const { push } = useRouter()` then call `push(...)` directly — easier for React Compiler to memoize and clearer about which methods this component depends on
88. [warning] nextjs-no-img-element — src/pages/admin/events/[id].tsx:35
Use next/image instead of <img> — provides automatic optimization, lazy loading, and responsive srcset
```
</details>
---
### ❌ Errors (8)
**`alt-text`**
Missing `alt` attribute.
> Must have `alt` prop, either with meaningful text, or an empty string for decorative images.
[`src/components/Navbar.tsx:70`](https://github.com/celeroncoder/gdsc-website/blob/648fd3b7551c76541ffee8f602ce1e3dd362813d/src/components/Navbar.tsx#L70)
[`src/components/Navbar.tsx:74`](https://github.com/celeroncoder/gdsc-website/blob/648fd3b7551c76541ffee8f602ce1e3dd362813d/src/components/Navbar.tsx#L74)
[`src/components/Event-Card.tsx:13`](https://github.com/celeroncoder/gdsc-website/blob/648fd3b7551c76541ffee8f602ce1e3dd362813d/src/components/Event-Card.tsx#L13)
[`src/components/Event-Card.tsx:16`](https://github.com/celeroncoder/gdsc-website/blob/648fd3b7551c76541ffee8f602ce1e3dd362813d/src/components/Event-Card.tsx#L16)
[`src/pages/admin/events/index.tsx:35`](https://github.com/celeroncoder/gdsc-website/blob/648fd3b7551c76541ffee8f602ce1e3dd362813d/src/pages/admin/events/index.tsx#L35)
[`src/pages/admin/events/create/index.tsx:186`](https://github.com/celeroncoder/gdsc-website/blob/648fd3b7551c76541ffee8f602ce1e3dd362813d/src/pages/admin/events/create/index.tsx#L186)
[`src/pages/admin/events/update/[id].tsx:201`](https://github.com/celeroncoder/gdsc-website/blob/648fd3b7551c76541ffee8f602ce1e3dd362813d/src/pages/admin/events/update/[id].tsx#L201)
[`src/pages/admin/events/[id].tsx:35`](https://github.com/celeroncoder/gdsc-website/blob/648fd3b7551c76541ffee8f602ce1e3dd362813d/src/pages/admin/events/[id].tsx#L35)
---
### ⚠️ Warnings (80)
**`nextjs-no-img-element`**
Use next/image instead of <img> — provides automatic optimization, lazy loading, and responsive srcset
> `import Image from 'next/image'` — provides automatic WebP/AVIF, lazy loading, and responsive srcset
[`src/components/Menu.tsx:7`](https://github.com/celeroncoder/gdsc-website/blob/648fd3b7551c76541ffee8f602ce1e3dd362813d/src/components/Menu.tsx#L7)
[`src/components/Menu.tsx:8`](https://github.com/celeroncoder/gdsc-website/blob/648fd3b7551c76541ffee8f602ce1e3dd362813d/src/components/Menu.tsx#L8)
[`src/components/Recent-Events.tsx:12`](https://github.com/celeroncoder/gdsc-website/blob/648fd3b7551c76541ffee8f602ce1e3dd362813d/src/components/Recent-Events.tsx#L12)
[`src/components/Recent-Events.tsx:23`](https://github.com/celeroncoder/gdsc-website/blob/648fd3b7551c76541ffee8f602ce1e3dd362813d/src/components/Recent-Events.tsx#L23)
[`src/components/Recent-Events.tsx:34`](https://github.com/celeroncoder/gdsc-website/blob/648fd3b7551c76541ffee8f602ce1e3dd362813d/src/components/Recent-Events.tsx#L34)
[`src/components/Profile-Card.tsx:9`](https://github.com/celeroncoder/gdsc-website/blob/648fd3b7551c76541ffee8f602ce1e3dd362813d/src/components/Profile-Card.tsx#L9)
[`src/components/Profile-Card.tsx:10`](https://github.com/celeroncoder/gdsc-website/blob/648fd3b7551c76541ffee8f602ce1e3dd362813d/src/components/Profile-Card.tsx#L10)
[`src/components/Profile-Card.tsx:11`](https://github.com/celeroncoder/gdsc-website/blob/648fd3b7551c76541ffee8f602ce1e3dd362813d/src/components/Profile-Card.tsx#L11)
[`src/components/Profile-Card.tsx:19`](https://github.com/celeroncoder/gdsc-website/blob/648fd3b7551c76541ffee8f602ce1e3dd362813d/src/components/Profile-Card.tsx#L19)
[`src/components/Profile-Card.tsx:20`](https://github.com/celeroncoder/gdsc-website/blob/648fd3b7551c76541ffee8f602ce1e3dd362813d/src/components/Profile-Card.tsx#L20)
[`src/components/Profile-Card.tsx:23`](https://github.com/celeroncoder/gdsc-website/blob/648fd3b7551c76541ffee8f602ce1e3dd362813d/src/components/Profile-Card.tsx#L23)
[`src/components/Profile-Card.tsx:24`](https://github.com/celeroncoder/gdsc-website/blob/648fd3b7551c76541ffee8f602ce1e3dd362813d/src/components/Profile-Card.tsx#L24)
[`src/components/Profile-Card.tsx:27`](https://github.com/celeroncoder/gdsc-website/blob/648fd3b7551c76541ffee8f602ce1e3dd362813d/src/components/Profile-Card.tsx#L27)
[`src/components/Profile-Card.tsx:28`](https://github.com/celeroncoder/gdsc-website/blob/648fd3b7551c76541ffee8f602ce1e3dd362813d/src/components/Profile-Card.tsx#L28)
[`src/components/Navbar.tsx:32`](https://github.com/celeroncoder/gdsc-website/blob/648fd3b7551c76541ffee8f602ce1e3dd362813d/src/components/Navbar.tsx#L32)
[`src/components/Navbar.tsx:37`](https://github.com/celeroncoder/gdsc-website/blob/648fd3b7551c76541ffee8f602ce1e3dd362813d/src/components/Navbar.tsx#L37)
[`src/components/Navbar.tsx:70`](https://github.com/celeroncoder/gdsc-website/blob/648fd3b7551c76541ffee8f602ce1e3dd362813d/src/components/Navbar.tsx#L70)
[`src/components/Navbar.tsx:74`](https://github.com/celeroncoder/gdsc-website/blob/648fd3b7551c76541ffee8f602ce1e3dd362813d/src/components/Navbar.tsx#L74)
[`src/components/Navbar.tsx:86`](https://github.com/celeroncoder/gdsc-website/blob/648fd3b7551c76541ffee8f602ce1e3dd362813d/src/components/Navbar.tsx#L86)
[`src/components/Navbar.tsx:91`](https://github.com/celeroncoder/gdsc-website/blob/648fd3b7551c76541ffee8f602ce1e3dd362813d/src/components/Navbar.tsx#L91)
[`src/components/Event-Card.tsx:13`](https://github.com/celeroncoder/gdsc-website/blob/648fd3b7551c76541ffee8f602ce1e3dd362813d/src/components/Event-Card.tsx#L13)
[`src/components/Event-Card.tsx:16`](https://github.com/celeroncoder/gdsc-website/blob/648fd3b7551c76541ffee8f602ce1e3dd362813d/src/components/Event-Card.tsx#L16)
[`src/components/Event-Card.tsx:22`](https://github.com/celeroncoder/gdsc-website/blob/648fd3b7551c76541ffee8f602ce1e3dd362813d/src/components/Event-Card.tsx#L22)
[`src/pages/admin/events/index.tsx:35`](https://github.com/celeroncoder/gdsc-website/blob/648fd3b7551c76541ffee8f602ce1e3dd362813d/src/pages/admin/events/index.tsx#L35)
[`src/pages/admin/events/create/index.tsx:186`](https://github.com/celeroncoder/gdsc-website/blob/648fd3b7551c76541ffee8f602ce1e3dd362813d/src/pages/admin/events/create/index.tsx#L186)
[`src/pages/admin/events/update/[id].tsx:201`](https://github.com/celeroncoder/gdsc-website/blob/648fd3b7551c76541ffee8f602ce1e3dd362813d/src/pages/admin/events/update/[id].tsx#L201)
[`src/pages/admin/events/[id].tsx:35`](https://github.com/celeroncoder/gdsc-website/blob/648fd3b7551c76541ffee8f602ce1e3dd362813d/src/pages/admin/events/[id].tsx#L35)
**`react-compiler-destructure-method`**
Destructure for clarity: `const { push } = useRouter()` then call `push(...)` directly — easier for React Compiler to memoize and clearer about which methods this component depends on
> Destructure the method up front: `const { push } = useRouter()` then call `push(...)` directly — clearer dependency graph and easier for React Compiler to memoize
[`src/components/Team.tsx:13`](https://github.com/celeroncoder/gdsc-website/blob/648fd3b7551c76541ffee8f602ce1e3dd362813d/src/components/Team.tsx#L13)
[`src/components/Recent-Events.tsx:42`](https://github.com/celeroncoder/gdsc-website/blob/648fd3b7551c76541ffee8f602ce1e3dd362813d/src/components/Recent-Events.tsx#L42)
[`src/components/Navbar.tsx:29`](https://github.com/celeroncoder/gdsc-website/blob/648fd3b7551c76541ffee8f602ce1e3dd362813d/src/components/Navbar.tsx#L29)
[`src/pages/contact-us.tsx:39`](https://github.com/celeroncoder/gdsc-website/blob/648fd3b7551c76541ffee8f602ce1e3dd362813d/src/pages/contact-us.tsx#L39)
[`src/pages/contact-us.tsx:45`](https://github.com/celeroncoder/gdsc-website/blob/648fd3b7551c76541ffee8f602ce1e3dd362813d/src/pages/contact-us.tsx#L45)
[`src/pages/contact-us.tsx:51`](https://github.com/celeroncoder/gdsc-website/blob/648fd3b7551c76541ffee8f602ce1e3dd362813d/src/pages/contact-us.tsx#L51)
[`src/components/About.tsx:16`](https://github.com/celeroncoder/gdsc-website/blob/648fd3b7551c76541ffee8f602ce1e3dd362813d/src/components/About.tsx#L16)
[`src/pages/admin/events/index.tsx:16`](https://github.com/celeroncoder/gdsc-website/blob/648fd3b7551c76541ffee8f602ce1e3dd362813d/src/pages/admin/events/index.tsx#L16)
[`src/pages/admin/events/index.tsx:31`](https://github.com/celeroncoder/gdsc-website/blob/648fd3b7551c76541ffee8f602ce1e3dd362813d/src/pages/admin/events/index.tsx#L31)
[`src/pages/admin/events/create/index.tsx:40`](https://github.com/celeroncoder/gdsc-website/blob/648fd3b7551c76541ffee8f602ce1e3dd362813d/src/pages/admin/events/create/index.tsx#L40)
[`src/pages/about.tsx:49`](https://github.com/celeroncoder/gdsc-website/blob/648fd3b7551c76541ffee8f602ce1e3dd362813d/src/pages/about.tsx#L49)
[`src/pages/admin/events/update/[id].tsx:57`](https://github.com/celeroncoder/gdsc-website/blob/648fd3b7551c76541ffee8f602ce1e3dd362813d/src/pages/admin/events/update/[id].tsx#L57)
[`src/pages/admin/events/[id].tsx:23`](https://github.com/celeroncoder/gdsc-website/blob/648fd3b7551c76541ffee8f602ce1e3dd362813d/src/pages/admin/events/[id].tsx#L23)
[`src/pages/admin/events/[id].tsx:29`](https://github.com/celeroncoder/gdsc-website/blob/648fd3b7551c76541ffee8f602ce1e3dd362813d/src/pages/admin/events/[id].tsx#L29)
**`click-events-have-key-events`**
Enforce a clickable non-interactive element has at least one keyboard event listener.
> Visible, non-interactive elements with click handlers must have one of `keyup`, `keydown`, or `keypress` listener.
[`src/components/Menu.tsx:7`](https://github.com/celeroncoder/gdsc-website/blob/648fd3b7551c76541ffee8f602ce1e3dd362813d/src/components/Menu.tsx#L7)
[`src/components/Menu.tsx:8`](https://github.com/celeroncoder/gdsc-website/blob/648fd3b7551c76541ffee8f602ce1e3dd362813d/src/components/Menu.tsx#L8)
[`src/components/Member-Card.tsx:10`](https://github.com/celeroncoder/gdsc-website/blob/648fd3b7551c76541ffee8f602ce1e3dd362813d/src/components/Member-Card.tsx#L10)
[`src/components/Profile-Card.tsx:5`](https://github.com/celeroncoder/gdsc-website/blob/648fd3b7551c76541ffee8f602ce1e3dd362813d/src/components/Profile-Card.tsx#L5)
[`src/components/Event-Card.tsx:8`](https://github.com/celeroncoder/gdsc-website/blob/648fd3b7551c76541ffee8f602ce1e3dd362813d/src/components/Event-Card.tsx#L8)
[`src/components/Event-Box.tsx:10`](https://github.com/celeroncoder/gdsc-website/blob/648fd3b7551c76541ffee8f602ce1e3dd362813d/src/components/Event-Box.tsx#L10)
[`src/pages/admin/events/index.tsx:30`](https://github.com/celeroncoder/gdsc-website/blob/648fd3b7551c76541ffee8f602ce1e3dd362813d/src/pages/admin/events/index.tsx#L30)
**`iframe-has-title`**
Missing `title` attribute for the `iframe` element.
> Provide `title` property for `iframe` element.
[`src/components/Team.tsx:15`](https://github.com/celeroncoder/gdsc-website/blob/648fd3b7551c76541ffee8f602ce1e3dd362813d/src/components/Team.tsx#L15)
[`src/components/Team.tsx:19`](https://github.com/celeroncoder/gdsc-website/blob/648fd3b7551c76541ffee8f602ce1e3dd362813d/src/components/Team.tsx#L19)
[`src/components/Team.tsx:23`](https://github.com/celeroncoder/gdsc-website/blob/648fd3b7551c76541ffee8f602ce1e3dd362813d/src/components/Team.tsx#L23)
[`src/components/Join-Community.tsx:8`](https://github.com/celeroncoder/gdsc-website/blob/648fd3b7551c76541ffee8f602ce1e3dd362813d/src/components/Join-Community.tsx#L8)
[`src/components/Home.tsx:8`](https://github.com/celeroncoder/gdsc-website/blob/648fd3b7551c76541ffee8f602ce1e3dd362813d/src/components/Home.tsx#L8)
[`src/components/About.tsx:11`](https://github.com/celeroncoder/gdsc-website/blob/648fd3b7551c76541ffee8f602ce1e3dd362813d/src/components/About.tsx#L11)
**`no-static-element-interactions`**
Static HTML elements with event handlers require a role.
> Add a role attribute to this element, or use a semantic HTML element instead.
[`src/components/Member-Card.tsx:10`](https://github.com/celeroncoder/gdsc-website/blob/648fd3b7551c76541ffee8f602ce1e3dd362813d/src/components/Member-Card.tsx#L10)
[`src/components/Profile-Card.tsx:5`](https://github.com/celeroncoder/gdsc-website/blob/648fd3b7551c76541ffee8f602ce1e3dd362813d/src/components/Profile-Card.tsx#L5)
[`src/components/Event-Card.tsx:8`](https://github.com/celeroncoder/gdsc-website/blob/648fd3b7551c76541ffee8f602ce1e3dd362813d/src/components/Event-Card.tsx#L8)
[`src/components/Event-Box.tsx:10`](https://github.com/celeroncoder/gdsc-website/blob/648fd3b7551c76541ffee8f602ce1e3dd362813d/src/components/Event-Box.tsx#L10)
[`src/pages/admin/events/index.tsx:30`](https://github.com/celeroncoder/gdsc-website/blob/648fd3b7551c76541ffee8f602ce1e3dd362813d/src/pages/admin/events/index.tsx#L30)
**`no-prop-callback-in-effect`**
useEffect calls prop callback "setEvents" with local state in deps — this is the "lift state via callback" anti-pattern; lift state into a shared Provider so both sides read the same source
> Lift the shared state into a Provider so both sides read the same source — no useEffect-driven sync needed
[`src/components/FilterBox.tsx:14`](https://github.com/celeroncoder/gdsc-website/blob/648fd3b7551c76541ffee8f602ce1e3dd362813d/src/components/FilterBox.tsx#L14)
[`src/components/FilterBox.tsx:19`](https://github.com/celeroncoder/gdsc-website/blob/648fd3b7551c76541ffee8f602ce1e3dd362813d/src/components/FilterBox.tsx#L19)
[`src/components/FilterBox.tsx:23`](https://github.com/celeroncoder/gdsc-website/blob/648fd3b7551c76541ffee8f602ce1e3dd362813d/src/components/FilterBox.tsx#L23)
[`src/components/FilterBox.tsx:24`](https://github.com/celeroncoder/gdsc-website/blob/648fd3b7551c76541ffee8f602ce1e3dd362813d/src/components/FilterBox.tsx#L24)
**`design-no-three-period-ellipsis`**
Three-period ellipsis ("...") in JSX text — use the actual ellipsis character "…" (or `…`)
> Use the typographic ellipsis "…" (or `…`) instead of three periods — pairs with action-with-followup labels ("Rename…", "Loading…")
[`src/pages/admin/events/index.tsx:23`](https://github.com/celeroncoder/gdsc-website/blob/648fd3b7551c76541ffee8f602ce1e3dd362813d/src/pages/admin/events/index.tsx#L23)
[`src/pages/admin/events/update/[id].tsx:70`](https://github.com/celeroncoder/gdsc-website/blob/648fd3b7551c76541ffee8f602ce1e3dd362813d/src/pages/admin/events/update/[id].tsx#L70)
[`src/pages/admin/events/[id].tsx:17`](https://github.com/celeroncoder/gdsc-website/blob/648fd3b7551c76541ffee8f602ce1e3dd362813d/src/pages/admin/events/[id].tsx#L17)
**`no-effect-event-handler`**
useEffect simulating an event handler — move logic to an actual event handler instead
> Move the conditional logic into onClick, onChange, or onSubmit handlers directly
[`src/pages/events.tsx:15`](https://github.com/celeroncoder/gdsc-website/blob/648fd3b7551c76541ffee8f602ce1e3dd362813d/src/pages/events.tsx#L15)
[`src/pages/admin/events/create/index.tsx:43`](https://github.com/celeroncoder/gdsc-website/blob/648fd3b7551c76541ffee8f602ce1e3dd362813d/src/pages/admin/events/create/index.tsx#L43)
[`src/pages/admin/events/update/[id].tsx:60`](https://github.com/celeroncoder/gdsc-website/blob/648fd3b7551c76541ffee8f602ce1e3dd362813d/src/pages/admin/events/update/[id].tsx#L60)
**`no-uncontrolled-input`**
<input value={venue}> — "venue" is initialized as undefined (uncontrolled), then becomes controlled on first set; React warns about this flip. Initialize useState with an explicit value (e.g. `useState("")`)
> Pass an explicit initial value to `useState` (e.g. `useState("")` instead of `useState()`), add `onChange` (or `readOnly` to opt out) when you supply `value`, and drop `defaultValue` on controlled inputs — React ignores it
[`src/pages/admin/events/create/index.tsx:151`](https://github.com/celeroncoder/gdsc-website/blob/648fd3b7551c76541ffee8f602ce1e3dd362813d/src/pages/admin/events/create/index.tsx#L151)
[`src/pages/admin/events/create/index.tsx:163`](https://github.com/celeroncoder/gdsc-website/blob/648fd3b7551c76541ffee8f602ce1e3dd362813d/src/pages/admin/events/create/index.tsx#L163)
[`src/pages/admin/events/create/index.tsx:175`](https://github.com/celeroncoder/gdsc-website/blob/648fd3b7551c76541ffee8f602ce1e3dd362813d/src/pages/admin/events/create/index.tsx#L175)
**`prefer-useReducer`**
Component "EventCreatePage" has 9 useState calls — consider useReducer for related state
> Group related state: `const [state, dispatch] = useReducer(reducer, { field1, field2, ... })`
[`src/pages/admin/events/create/index.tsx:10`](https://github.com/celeroncoder/gdsc-website/blob/648fd3b7551c76541ffee8f602ce1e3dd362813d/src/pages/admin/events/create/index.tsx#L10)
[`src/pages/admin/events/update/[id].tsx:10`](https://github.com/celeroncoder/gdsc-website/blob/648fd3b7551c76541ffee8f602ce1e3dd362813d/src/pages/admin/events/update/[id].tsx#L10)
**`rendering-hydration-mismatch-time`**
new Date() reachable from JSX renders differently on server vs client — wrap in useEffect+useState (client-only) or add suppressHydrationWarning to the parent if intentional
> Wrap dynamic time/random values in useEffect+useState (client-only) or add suppressHydrationWarning to the parent if intentional
[`src/pages/admin/events/create/index.tsx:87`](https://github.com/celeroncoder/gdsc-website/blob/648fd3b7551c76541ffee8f602ce1e3dd362813d/src/pages/admin/events/create/index.tsx#L87)
[`src/pages/admin/events/update/[id].tsx:102`](https://github.com/celeroncoder/gdsc-website/blob/648fd3b7551c76541ffee8f602ce1e3dd362813d/src/pages/admin/events/update/[id].tsx#L102)
**`label-has-associated-control`**
A form label must have accessible text.
> Ensure the label either has text inside it or is accessibly labelled using an attribute such as `aria-label`, or `aria-labelledby`. You can mark more attributes as accessible labels by configuring the `labelAttributes` option.
[`src/components/Navbar.tsx:68`](https://github.com/celeroncoder/gdsc-website/blob/648fd3b7551c76541ffee8f602ce1e3dd362813d/src/components/Navbar.tsx#L68)
**`no-effect-chain`**
useEffect reacts to "selectedTag" which is set by another useEffect — chains of effects add an extra render per link and become rigid as code evolves. Compute what you can during render and write all related state inside the event handler that originally fires the chain
> Compute as much as possible during render (e.g. `const isGameOver = round > 5`) and write all related state inside the event handler that originally fires the chain. Each effect link adds an extra render and makes the code rigid as requirements evolve
[`src/components/FilterBox.tsx:22`](https://github.com/celeroncoder/gdsc-website/blob/648fd3b7551c76541ffee8f602ce1e3dd362813d/src/components/FilterBox.tsx#L22)
**`no-cascading-set-state`**
3 setState calls in a single useEffect — consider using useReducer or deriving state
> Combine into useReducer: `const [state, dispatch] = useReducer(reducer, initialState)`
[`src/components/FilterBox.tsx:11`](https://github.com/celeroncoder/gdsc-website/blob/648fd3b7551c76541ffee8f602ce1e3dd362813d/src/components/FilterBox.tsx#L11)
**`design-no-em-dash-in-jsx-text`**
Em dash (—) in JSX text reads as model output — replace with comma, colon, semicolon, or parentheses
> Replace em dashes in JSX text with commas, colons, semicolons, periods, or parentheses — em dashes read as model-output filler
[`src/pages/about.tsx:40`](https://github.com/celeroncoder/gdsc-website/blob/648fd3b7551c76541ffee8f602ce1e3dd362813d/src/pages/about.tsx#L40)
---
<sub>Last scored May 14, 2026 at 9:39 AM UTC. Maintained by [React Review](https://github.com/millionco/react-review).</sub>
Contributor guide
No contributing guide indexed for this repository
Assessment
This issue has not been assessed yet.