celeroncoder / celeroncoder/gdsc-website

React Review Audit

Open
#12 0 comments 0 reactions 0 assignees View on GitHub
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.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.