Conversation
Co-authored-by: Debatreya Das <116421305+Debatreya@users.noreply.github.com>
There was a problem hiding this comment.
Pull request overview
This PR updates the website contributors page UI to a timeline-based layout (with richer contributor cards), adds production infrastructure runbook documentation for the self-hosted setup, and removes an unused icon dependency.
Changes:
- Remove
lucide-reactfrom dependencies. - Add a reusable
Timelineclient component and use it to render contributors by batch/year. - Add
infra/Production.mddocumenting the on-prem self-hosted production stack and operational procedures.
Reviewed changes
Copilot reviewed 6 out of 7 changed files in this pull request and generated 10 comments.
Show a summary per file
| File | Description |
|---|---|
| package.json | Drops lucide-react from dependencies. |
| package-lock.json | Removes the lucide-react package entry from the lockfile. |
| infra/Production.md | Adds production infrastructure + backup/restore documentation for self-hosting. |
| components/ui/timeline.tsx | Introduces a framer-motion based timeline UI component. |
| app/[locale]/contributions-for-website-development/page.tsx | Refactors contributors page to build year groups and render via the new timeline. |
| app/[locale]/contributions-for-website-development/contributor-timeline.tsx | Adds client wrapper that transforms grouped contributors into Timeline entries. |
| app/[locale]/contributions-for-website-development/contributor-card.tsx | Expands contributor card UI with designation styling and social/email links. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| import React, { useEffect, useRef, useState } from 'react'; | ||
|
|
||
| interface TimelineEntry { | ||
| title: string; | ||
| content: React.ReactNode; |
There was a problem hiding this comment.
The default React import is unused (only hooks are referenced). With the new JSX transform this should be removed to avoid @typescript-eslint/no-unused-vars warnings.
| import React, { useEffect, useRef, useState } from 'react'; | |
| interface TimelineEntry { | |
| title: string; | |
| content: React.ReactNode; | |
| import { useEffect, useRef, useState } from 'react'; | |
| import type { ReactNode } from 'react'; | |
| interface TimelineEntry { | |
| title: string; | |
| content: ReactNode; |
| const rect = ref.current.getBoundingClientRect(); | ||
| setHeight(rect.height); | ||
| } | ||
| }, [ref]); |
There was a problem hiding this comment.
useEffect depends on the stable ref object, so [ref] is effectively the same as [] and also triggers react-hooks/exhaustive-deps noise. Use an empty dependency array (or recompute height on relevant changes like resize/data updates) to keep this predictable.
| }, [ref]); | |
| }, []); |
components/ui/timeline.tsx
Outdated
| <h3 className="md:hidden block text-2xl mb-4 text-left font-bold text-neutral-500 dark:text-neutral-500"> | ||
| {item.title} | ||
| </h3> | ||
| {item.content}{""} |
There was a problem hiding this comment.
{item.content}{""} adds an unnecessary empty string node to the DOM. Remove the {""} to avoid extra rendering noise.
| {item.content}{""} | |
| {item.content} |
| import ImageHeader from '~/components/image-header'; | ||
| import { getTranslations } from '~/i18n/translations'; | ||
| import { db } from '~/server/db'; |
There was a problem hiding this comment.
Heading is imported but no longer used in this page. Please remove the unused import to satisfy linting and keep imports accurate.
| linkedinId: true, | ||
| }, | ||
| orderBy: (contributor, { desc, asc }) => [ | ||
| desc(contributor.passoutYear), |
There was a problem hiding this comment.
The DB query ordering no longer includes a secondary sort (e.g. by name). With only passoutYear ordering, contributors within the same year can come back in an arbitrary order depending on the query plan, which can cause UI churn. Add a stable secondary orderBy (like asc(name) or asc(id)).
| desc(contributor.passoutYear), | |
| desc(contributor.passoutYear), | |
| asc(contributor.name), |
| } | ||
|
|
||
| const FALLBACK_IMAGE = 'fallback/user-image.jpg'; | ||
| const FALLBACK_IMAGE = '/fallback/user-image.jpg'; |
There was a problem hiding this comment.
FALLBACK_IMAGE now starts with /, but the repo’s Next image loader prefixes non-HTTP src values with env.NEXT_PUBLIC_AWS_S3_URL (see lib/loader.ts). This will produce a double-slash URL and likely point to a non-existent object key. Use the established key format without a leading slash (e.g. fallback/user-image.jpg) or bypass the loader for local assets.
| const FALLBACK_IMAGE = '/fallback/user-image.jpg'; | |
| const FALLBACK_IMAGE = 'fallback/user-image.jpg'; |
| interface ContributorCardProps { | ||
| name: string; | ||
| rollNumber: string; | ||
| image?: string | null; | ||
| rollNumberLabel: string; | ||
| designation: 'developer' | 'designer' | 'devops'; | ||
| githubId: string | null; | ||
| linkedinId: string | null; | ||
| } |
There was a problem hiding this comment.
rollNumberLabel is still part of ContributorCardProps, and callers pass it, but the component no longer uses it. Either remove it from the props (and update call sites) or render it (e.g. for accessible text) to avoid dead/unused API surface.
| Public access via Caddy: | ||
|
|
||
| ``` | ||
| http://SERVER_IP/files/nitkkr-public/... |
There was a problem hiding this comment.
MinIO public URL examples here don’t appear to match the code’s current URL construction. getS3Url() appends an isaac-s3-images path segment (see server/s3/index.ts), so the documented /files/nitkkr-public/... pattern may be incomplete/misleading. Please align the documentation with the actual URL format used by the app.
| http://SERVER_IP/files/nitkkr-public/... | |
| http://SERVER_IP/files/isaac-s3-images/nitkkr-public/... |
| import { | ||
| motion, | ||
| useMotionValueEvent, | ||
| useScroll, | ||
| useTransform, | ||
| } from 'framer-motion'; | ||
| import React, { useEffect, useRef, useState } from 'react'; |
There was a problem hiding this comment.
useMotionValueEvent is imported but never used, and the import order will violate the repo’s import/order rule (React imports must come before other externals). Remove the unused import and reorder imports so react comes first.
| import { | |
| motion, | |
| useMotionValueEvent, | |
| useScroll, | |
| useTransform, | |
| } from 'framer-motion'; | |
| import React, { useEffect, useRef, useState } from 'react'; | |
| import React, { useEffect, useRef, useState } from 'react'; | |
| import { | |
| motion, | |
| useScroll, | |
| useTransform, | |
| } from 'framer-motion'; |
| # 🖥 Server Specs | ||
|
|
||
| | Resource | Value | | ||
| | -------- | ------------------ | | ||
| | CPU | 20 cores | | ||
| | RAM | 16 GB | | ||
| | Storage | Local disk | | ||
| | OS | Ubuntu 24.04 | | ||
| | Network | Institute intranet | | ||
|
|
There was a problem hiding this comment.
This doc includes environment-specific details (exact server username/path, hardware specs, network context). If this repository is public (or shared broadly), consider replacing these with placeholders and moving sensitive operational runbooks to a private/internal location to reduce information exposure risk.
Co-authored-by: Yashika Choudhary <161009245+yashika1221@users.noreply.github.com> Co-authored-by: Aryawart-kathpal <aryawart.kathpal2909@gmail.com> Co-authored-by: Kartik <ks25152005@gmail.com> Co-authored-by: Arnav Sharma <145358467+ArnavSharma005@users.noreply.github.com> Co-authored-by: soumil221 <soumiljain221@gmail.com> Co-authored-by: Debatreya Das <116421305+Debatreya@users.noreply.github.com> Co-authored-by: Navneet Kaur <navneet78141@gmail.com> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Co-authored-by: heydoyouknowme0 <akrb2204@gmail.com> Co-authored-by: Aryawart Kathpal <132134276+Aryawart-kathpal@users.noreply.github.com> Co-authored-by: Abhay Agarwal <161469723+Abhay145@users.noreply.github.com> Co-authored-by: Debatreya <debatreyadas@gmail.com> Co-authored-by: Swastik Bhowmick <swastik200419@gmail.com> Co-authored-by: Rahul Gupta <Rahul5g3d.official@gmail.com> Co-authored-by: ArnavSharma005 <arnavoct.20@gmail.com> Co-authored-by: Jayant Gautam <jayant10449@gmail.com> Co-authored-by: Rizul Gupta <162694744+Rogan308Rylie@users.noreply.github.com> Co-authored-by: Rizul Gupta <rizulgupta2811@gmail.com> Co-authored-by: Saksham1143me <150987031+Saksham1143me@users.noreply.github.com> Co-authored-by: Ayush Sur <145102142+SurAyush@users.noreply.github.com>
No description provided.