Repository: SkidGod4444/indexflow
Pull request #6: Add UsersPage component with user filtering and search functionality
Author: login: rxhul18
Created: 2025-03-11T10:08:59Z | Merged: 2025-03-11T10:11:08Z

![image](https://github.com/user-attachments/assets/be718dc2-5eff-4635-ba0e-ab2320b795dd)

This pull request introduces a new user management page in the web application. The changes include the addition of a user filtering and display system, along with a set of dummy user data for testing purposes. Here are the key changes:

### User Management Page Implementation:

* [`apps/web/app/(routes)/users/page.tsx`](diffhunk://#diff-718c00be3283a96c81a989a832ea1a6f1dc9027bf301707f87275fefa84ab3baR1-R76): Added a new `UsersPage` component that includes a search input and tabs for filtering users by type (all, active, new, anonymous). The component uses `useState` and `useMemo` hooks to manage and filter the user data.

### User Card Component:

* [`apps/web/app/(routes)/users/usercard.tsx`](diffhunk://#diff-a7c8672807a1b65bbc3dd645ee69c3b6e98fed03ae1f88c4e36357e5da634dd4R1-R118): Added a `UserGrid` component that displays user information in a card format. The component includes user details such as name, location, reputation, tags, and last active status.

### Dummy User Data:

* [`apps/web/json/dummy.ts`](diffhunk://#diff-3bdd733cf8a3bd7d9b10b40a352020c84d4a8d4c74e6acf81c455677bf474ac4R324-R500): Added a list of dummy users to the `users` array for testing the user management page and user card component.

<!-- This is an auto-generated comment: release notes by coderabbit.ai -->

## Summary by CodeRabbit

- **New Features**
	- Introduced a dedicated users directory page featuring a dynamic search input and tab filters to refine results.
	- Added a responsive user card grid displaying profiles with avatars, reputation, location, and tags, along with clear activity indicators.
	- Expanded the user data set to support richer, more detailed user profiles within the application.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->


Diff:
diff --git a/apps/web/app/(routes)/users/page.tsx b/apps/web/app/(routes)/users/page.tsx
new file mode 100644
index 0000000..a475652
--- /dev/null
+++ b/apps/web/app/(routes)/users/page.tsx
@@ -0,0 +1,76 @@
+"use client"
+
+import { Input } from "@/components/ui/input"
+import { Tabs, TabsList, TabsTrigger } from "@/components/ui/tabs"
+import { Search } from "lucide-react"
+import { useState, useMemo } from "react"
+import { subDays, parseISO } from "date-fns"
+import { users } from "@/json/dummy"
+import UserGrid from "./usercard"
+
+
+export default function UsersPage() {
+  const [searchQuery, setSearchQuery] = useState("")
+  const [userTypeFilter, setUserTypeFilter] = useState("all")
+
+  const filteredUsers = useMemo(() => {
+    const now = new Date()
+    const sevenDaysAgo = subDays(now, 7).getTime()
+    const thirtyDaysAgo = subDays(now, 30).getTime()
+
+    return users.filter((user) => {
+      if (
+        searchQuery &&
+        !user.name.toLowerCase().includes(searchQuery.toLowerCase()) &&
+        !user.location.toLowerCase().includes(searchQuery.toLowerCase()) &&
+        !user.tags.some((tag) => tag.toLowerCase().includes(searchQuery.toLowerCase()))
+      ) {
+        return false
+      }
+
+      if (userTypeFilter === "active" && user.lastActive) {
+        return parseISO(user.lastActive).getTime() >= sevenDaysAgo
+      }
+
+      if (userTypeFilter === "new" && user.createdAt) {
+        return parseISO(user.createdAt).getTime() >= thirtyDaysAgo
+      }
+
+      if (userTypeFilter === "anonymous") {
+        return !user.location
+      }
+
+      return userTypeFilter === "all"
+    })
+  }, [searchQuery, userTypeFilter])
+
+  return (
+    <div className="flex w-full justify-center h-[calc(100vh-120px)] overflow-hidden py-5">
+      <div className="flex flex-col gap-4 max-w-[1400px] w-full px-4">
+        <div className="flex flex-col sm:flex-row justify-between items-start sm:items-center mb-6 gap-4">
+          <h1 className="text-3xl font-bold">Users</h1>
+          <div className="relative w-full sm:w-96 flex-1">
+            <Search className="absolute left-3 top-1/2 -translate-y-1/2 text-muted-foreground h-4 w-4" />
+            <Input
+              placeholder="Filter by user..."
+              className="pl-10 border-muted"
+              value={searchQuery}
+              onChange={(e) => setSearchQuery(e.target.value)}
+            />
+          </div>
+          <Tabs value={userTypeFilter} onValueChange={setUserTypeFilter} className="w-full sm:w-auto">
+            <TabsList className="gap-1 p-1 bg-muted/30 border rounded-md">
+              <TabsTrigger value="all">All users</TabsTrigger>
+              <TabsTrigger value="active">Active</TabsTrigger>
+              <TabsTrigger value="new">New users</TabsTrigger>
+              <TabsTrigger value="anonymous">Anonymous</TabsTrigger>
+            </TabsList>
+          </Tabs>
+        </div>
+        <div className="overflow-y-auto h-full overflow-x-hidden [&::-webkit-scrollbar]:hidden [-ms-overflow-style:'none'] [scrollbar-width:'none']">
+          <UserGrid filteredUsers={filteredUsers} />
+        </div>
+      </div>
+    </div>
+  )
+}
\ No newline at end of file
diff --git a/apps/web/app/(routes)/users/usercard.tsx b/apps/web/app/(routes)/users/usercard.tsx
new file mode 100644
index 0000000..44284d2
--- /dev/null
+++ b/apps/web/app/(routes)/users/usercard.tsx
@@ -0,0 +1,118 @@
+"use client"
+
+import Image from "next/image"
+import Link from "next/link"
+import { Badge } from "@/components/ui/badge"
+import { Card, CardContent } from "@/components/ui/card"
+import { MapPin, Star } from "lucide-react"
+import { JSX } from "react"
+
+// Define the User type
+type User = {
+    id: number
+    name: string
+    location: string
+    reputation: string
+    tags: string[]
+    avatar?: string
+    avatarBg: string
+    avatarContent?: JSX.Element
+    lastActive?: string
+    createdAt?: string
+}
+
+export default function UserGrid({ filteredUsers }:{
+    filteredUsers: User[]
+}) {
+    return (
+        <div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4">
+            {filteredUsers.length > 0 ? (
+                filteredUsers.map((user) => (
+                    <Card key={user.id} className="overflow-hidden transition-all duration-200 hover:shadow-md group py-3">
+                        <CardContent className="p-4">
+                            <div className="flex items-start gap-3">
+                                <div className="relative flex-shrink-0">
+                                    <div
+                                        className={`w-14 h-14 flex items-center justify-center rounded-full ${user.avatarBg} border overflow-hidden`}
+                                    >
+                                        {user.avatar ? (
+                                            <Image
+                                                src={user.avatar || "/placeholder.svg"}
+                                                alt={user.name}
+                                                width={56}
+                                                height={56}
+                                                className="object-cover w-full h-full rounded-full transition-transform group-hover:scale-105"
+                                            />
+                                        ) : user.avatarContent ? (
+                                            <div className="flex items-center justify-center w-full h-full">{user.avatarContent}</div>
+                                        ) : (
+                                            <div className="flex items-center justify-center w-full h-full text-lg font-semibold">
+                                                {user.name.charAt(0)}
+                                            </div>
+                                        )}
+                                    </div>
+
+                                    {user.lastActive && new Date(user.lastActive) >= new Date(Date.now() - 7 * 24 * 60 * 60 * 1000) && (
+                                        <span className="absolute bottom-0 right-0 w-3.5 h-3.5 bg-green-500 border-2 border-white rounded-full" />
+                                    )}
+                                </div>
+
+                                {/* User info */}
+                                <div className="flex flex-col min-w-0 flex-1">
+                                    <div className="flex items-center justify-between">
+                                        <Link href="#" className="font-medium text-primary hover:underline truncate text-base">
+                                            {user.name}
+                                        </Link>
+
+                                        {/* Reputation */}
+                                        <div className="flex items-center text-amber-500 gap-0.5 ml-1">
+                                            <Star className="h-3.5 w-3.5 fill-current" />
+                                            <span className="text-xs font-medium">{user.reputation}</span>
+                                        </div>
+                                    </div>
+
+                                    {/* Location */}
+                                    {user.location && (
+                                        <div className="flex items-center text-muted-foreground text-xs mt-1 gap-1">
+                                            <MapPin className="h-3 w-3" />
+                                            <span className="truncate">{user.location}</span>
+                                        </div>
+                                    )}
+
+                                    {/* Tags */}
+                                    <div className="flex flex-wrap gap-1.5 mt-2">
+                                        {user.tags.map((tag, index) => (
+                                            <Badge
+                                                key={index}
+                                                variant="secondary"
+                                                className="px-1.5 py-0 text-xs font-normal hover:bg-secondary/80 transition-colors"
+                                            >
+                                                <Link href="#" className="hover:underline">
+                                                    {tag}
+                                                </Link>
+                                            </Badge>
+                                        ))}
+                                    </div>
+
+                                    {/* Last active - optional */}
+                                    {user.lastActive && (
+                                        <div className="text-xs text-muted-foreground/70 mt-2">
+                                            Active: {new Date(user.lastActive).toLocaleDateString()}
+                                        </div>
+                                    )}
+                                </div>
+                            </div>
+                        </CardContent>
+                    </Card>
+                ))
+            ) : (
+                <div className="col-span-full flex flex-col items-center justify-center py-12 text-center">
+                    <div className="text-4xl mb-3">🔍</div>
+                    <h3 className="text-lg font-medium mb-1">No users found</h3>
+                    <p className="text-muted-foreground text-sm">Try adjusting your search or filter criteria</p>
+                </div>
+            )}
+        </div>
+    )
+}
+
diff --git a/apps/web/json/dummy.ts b/apps/web/json/dummy.ts
index 7ed4b03..34fa46b 100644
--- a/apps/web/json/dummy.ts
+++ b/apps/web/json/dummy.ts
@@ -321,3 +321,180 @@ export const communities = [
     img: "https://avatar.vercel.sh/jill",
   },
 ];
+
+export const users = [
+  {
+    id: 17,
+    name: "Cloud Coder",
+    location: "Australia",
+    reputation: "110",
+    tags: ["aws", "devops", "kubernetes"],
+    avatarBg: "bg-green-200",
+    lastActive: "2025-03-06T16:00:00Z", // Within last 7 days
+    createdAt: "2025-03-01T12:30:00Z", // Within last 7 days
+  },
+  {
+    id: 1,
+    name: "VonC",
+    location: "France",
+    reputation: "320",
+    tags: ["git", "github", "docker"],
+    avatar: "/placeholder.svg?height=48&width=48",
+    avatarBg: "bg-blue-100",
+    lastActive: "2024-03-09T12:15:00Z", // Within last 7 days
+    createdAt: "2023-07-10T09:00:00Z",
+  },
+  {
+    id: 11,
+    name: "rozsazoltan",
+    location: "Hungary",
+    reputation: "140",
+    tags: ["tailwind-css", "javascript", "css"],
+    avatar: "/placeholder.svg?height=48&width=48",
+    avatarBg: "bg-gray-100",
+    lastActive: "2024-03-03T07:15:00Z",
+    createdAt: "2023-12-15T09:30:00Z",
+  },
+  {
+    id: 2,
+    name: "Halo",
+    location: "USA",
+    reputation: "280",
+    tags: ["three.js", "javascript", "css"],
+    avatarBg: "bg-purple-100",
+    lastActive: "2024-03-07T18:45:00Z", // Within last 7 days
+    createdAt: "2024-03-06T14:30:00Z", // Within last 7 days
+  },
+  {
+    id: 3,
+    name: "Sweeper",
+    location: "UK",
+    reputation: "246",
+    tags: ["swift", "java", "c#"],
+    avatarBg: "bg-gray-100",
+    lastActive: "2024-01-10T16:10:00Z",
+    createdAt: "2023-11-15T08:00:00Z",
+  },
+  {
+    id: 4,
+    name: "Jon Skeet",
+    location: "Reading, United Kingdom",
+    reputation: "230",
+    tags: ["c#", "java", ".net"],
+    avatar: "/placeholder.svg?height=48&width=48",
+    avatarBg: "bg-gray-100",
+    lastActive: "2024-03-05T10:20:00Z",
+    createdAt: "2023-06-30T07:45:00Z",
+  },
+  {
+    id: 5,
+    name: "Yus",
+    location: "",
+    reputation: "200",
+    tags: ["html", "css", "python-3.x"],
+    avatarBg: "bg-pink-100",
+    lastActive: "2024-03-08T22:30:00Z", // Within last 7 days
+    createdAt: "2024-03-04T11:50:00Z", // Within last 7 days
+  },
+  {
+    id: 15,
+    name: "AI Whisperer",
+    location: "Canada",
+    reputation: "118",
+    tags: ["machine-learning", "python", "tensorflow"],
+    avatarBg: "bg-indigo-100",
+    lastActive: "2025-03-10T08:45:00Z", // Within last 7 days
+    createdAt: "2025-03-05T14:00:00Z", // Within last 7 days
+  },
+  {
+    id: 6,
+    name: "BmyGuest",
+    location: "",
+    reputation: "160",
+    tags: ["dm-script", "c++", "mfc"],
+    avatarBg: "bg-gray-100",
+    lastActive: "2024-02-15T14:00:00Z",
+    createdAt: "2023-07-20T13:15:00Z",
+  },
+  {
+    id: 7,
+    name: "Ahmed AEK",
+    location: "",
+    reputation: "159",
+    tags: ["python", "c++", "multithreading"],
+    avatarBg: "bg-green-100",
+    lastActive: "2024-03-09T09:40:00Z", // Within last 7 days
+    createdAt: "2023-09-10T17:25:00Z",
+  },
+  {
+    id: 8,
+    name: "Naren Murali",
+    location: "Chennai, Tamil Nadu, India",
+    reputation: "158",
+    tags: ["angular", "javascript", "typescript"],
+    avatarBg: "bg-pink-100",
+    lastActive: "2024-03-08T21:15:00Z", // Within last 7 days
+    createdAt: "2023-12-01T10:10:00Z",
+  },
+  {
+    id: 9,
+    name: "AmerlicA",
+    location: "Shāhi, Māzandarān Province, Iran",
+    reputation: "145",
+    tags: ["javascript", "reactjs", "react-native"],
+    avatar: "/placeholder.svg?height=48&width=48",
+    avatarBg: "bg-gray-100",
+    lastActive: "2024-02-22T13:30:00Z",
+    createdAt: "2023-09-15T12:00:00Z",
+  },
+  {
+    id: 10,
+    name: "dbush",
+    location: "New Jersey",
+    reputation: "143",
+    tags: ["c", "pointers", "c++"],
+    avatarBg: "bg-yellow-100",
+    lastActive: "2024-01-28T16:50:00Z",
+    createdAt: "2023-10-10T08:40:00Z",
+  },
+  {
+    id: 12,
+    name: "Sebastian Redl",
+    location: "",
+    reputation: "135",
+    tags: ["c++", "c++11", "rust"],
+    avatarBg: "bg-teal-100",
+    lastActive: "2024-01-15T14:20:00Z",
+    createdAt: "2023-12-05T11:55:00Z",
+  },
+  {
+    id: 13,
+    name: "Lara Dev",
+    location: "Germany",
+    reputation: "125",
+    tags: ["laravel", "php", "mysql"],
+    avatarBg: "bg-orange-100",
+    lastActive: "2025-03-09T14:10:00Z", // Within last 7 days
+    createdAt: "2025-03-04T09:30:00Z", // Within last 7 days
+  },
+  {
+    id: 14,
+    name: "Xavier Code",
+    location: "Spain",
+    reputation: "122",
+    tags: ["vue.js", "nuxt", "javascript"],
+    avatarBg: "bg-red-100",
+    lastActive: "2025-03-08T17:20:00Z", // Within last 7 days
+    createdAt: "2024-03-03T07:15:00Z", 
+  },
+  {
+    id: 16,
+    name: "React Wizard",
+    location: "India",
+    reputation: "115",
+    tags: ["react", "next.js", "redux"],
+    avatarBg: "bg-blue-200",
+    lastActive: "2025-03-07T20:30:00Z", // Within last 7 days
+    createdAt: "2024-03-03T07:15:00Z", 
+  }
+]
\ No newline at end of file


Reviews:
user: login: coderabbitai[bot]
body: **Actionable comments posted: 2**

<details>
<summary>🧹 Nitpick comments (6)</summary><blockquote>

<details>
<summary>apps/web/app/(routes)/users/page.tsx (2)</summary><blockquote>

`16-45`: **Improve date handling in filtering logic**

The current date handling in the `filteredUsers` useMemo could be more efficient and less error-prone by using date-fns more consistently.


Consider refactoring to use date-fns comparison functions instead of manually comparing timestamps:

```diff
const filteredUsers = useMemo(() => {
  const now = new Date()
-  const sevenDaysAgo = subDays(now, 7).getTime()
-  const thirtyDaysAgo = subDays(now, 30).getTime()
+  const sevenDaysAgo = subDays(now, 7)
+  const thirtyDaysAgo = subDays(now, 30)

  return users.filter((user) => {
    // Search query filtering remains the same...

    if (userTypeFilter === "active" && user.lastActive) {
-      return parseISO(user.lastActive).getTime() >= sevenDaysAgo
+      return isAfter(parseISO(user.lastActive), sevenDaysAgo)
    }

    if (userTypeFilter === "new" && user.createdAt) {
-      return parseISO(user.createdAt).getTime() >= thirtyDaysAgo
+      return isAfter(parseISO(user.createdAt), thirtyDaysAgo)
    }

    // Anonymous and "all" filtering remains the same...
  })
}, [searchQuery, userTypeFilter])
```

Don't forget to import the `isAfter` function from date-fns at the top of the file.

---

`70-70`: **Consider adding accessibility for scrollbar hiding**

The scrollbar hiding CSS might affect keyboard navigation accessibility.


When hiding scrollbars visually, ensure that the content remains scrollable for keyboard navigation:

```diff
-<div className="overflow-y-auto h-full overflow-x-hidden [&::-webkit-scrollbar]:hidden [-ms-overflow-style:'none'] [scrollbar-width:'none']">
+<div className="overflow-y-auto h-full overflow-x-hidden [&::-webkit-scrollbar]:hidden [-ms-overflow-style:'none'] [scrollbar-width:'none'] tabindex="0">
```

This adds tabindex="0" to ensure the div remains focusable and scrollable with keyboard.

</blockquote></details>
<details>
<summary>apps/web/json/dummy.ts (1)</summary><blockquote>

`327-334`: **Consider using string IDs consistently**

User IDs are defined as numbers, while other entities in this file (questions, communities) use string IDs.


For consistency across your data models, consider using string IDs for all entities:

```diff
{
-  id: 17,
+  id: "17",
  name: "Cloud Coder",
  // rest of properties remain the same
}
```

This makes your data models more consistent and avoids potential type issues when comparing IDs.

</blockquote></details>
<details>
<summary>apps/web/app/(routes)/users/usercard.tsx (3)</summary><blockquote>

`55-57`: **Extract date logic to a utility function**

The date comparison logic is duplicated between this component and the UsersPage component.


Create a utility function to handle the active status check:

```diff
// Create a new file: apps/web/utils/dates.ts
+ import { subDays } from 'date-fns';
+ 
+ export function isActiveWithinDays(dateString: string | undefined, days: number = 7): boolean {
+   if (!dateString) return false;
+   const date = new Date(dateString);
+   const threshold = subDays(new Date(), days);
+   return date >= threshold;
+ }

// In usercard.tsx:
+ import { isActiveWithinDays } from '@/utils/dates';

// Replace the inline logic:
- {user.lastActive && new Date(user.lastActive) >= new Date(Date.now() - 7 * 24 * 60 * 60 * 1000) && (
+ {isActiveWithinDays(user.lastActive) && (
```

This makes the code more maintainable and avoids inconsistencies between different parts of the application.

---

`84-94`: **Use a more stable key for tag mapping**

The current implementation uses array index as the key for mapped tags, which can cause issues with React's reconciliation if tags are reordered.


Since tags themselves might be unique enough, use the tag string as the key:

```diff
{user.tags.map((tag, index) => (
  <Badge
-   key={index}
+   key={tag}
    variant="secondary"
    className="px-1.5 py-0 text-xs font-normal hover:bg-secondary/80 transition-colors"
  >
    <Link href="#" className="hover:underline">
      {tag}
    </Link>
  </Badge>
))}
```

If tags might not be unique within a user's tag list, consider using a composite key with both tag and index.

---

`98-102`: **Format last active date more readably**

The current date display format (using `toLocaleDateString()`) lacks context and might not be consistently formatted across browsers.


Use date-fns to format the date in a more human-readable way:

```diff
+ import { formatDistance } from 'date-fns';

// Then in the component:
{user.lastActive && (
  <div className="text-xs text-muted-foreground/70 mt-2">
-   Active: {new Date(user.lastActive).toLocaleDateString()}
+   Active: {formatDistance(new Date(user.lastActive), new Date(), { addSuffix: true })}
  </div>
)}
```

This will display dates like "2 days ago" or "3 months ago", which is more intuitive for users.

</blockquote></details>

</blockquote></details>

<details>
<summary>📜 Review details</summary>

**Configuration used: CodeRabbit UI**
**Review profile: CHILL**
**Plan: Pro**

<details>
<summary>📥 Commits</summary>

Reviewing files that changed from the base of the PR and between 7d784efa432782744310ac5a9502ed7b7136162e and c22db04343c98881aca565b6ae1936b3c8abdfda.

</details>

<details>
<summary>📒 Files selected for processing (3)</summary>

* `apps/web/app/(routes)/users/page.tsx` (1 hunks)
* `apps/web/app/(routes)/users/usercard.tsx` (1 hunks)
* `apps/web/json/dummy.ts` (1 hunks)

</details>

<details>
<summary>🔇 Additional comments (1)</summary><blockquote>

<details>
<summary>apps/web/app/(routes)/users/usercard.tsx (1)</summary>

`90-92`: **Implement proper tag navigation**

The tag links currently don't navigate anywhere (`href="#"`), which might confuse users who expect them to filter by tag.


Consider implementing proper navigation for tags or at least disabling the clickable behavior if the feature isn't ready:

```diff
- <Link href="#" className="hover:underline">
+ <Link href={`/questions/tagged/${encodeURIComponent(tag)}`} className="hover:underline">
  {tag}
</Link>
```

Or if tag navigation isn't implemented yet:

```diff
- <Link href="#" className="hover:underline">
-   {tag}
- </Link>
+ <span>{tag}</span>
```

Is tag navigation a feature you plan to implement? If so, ensuring these links work correctly will improve user experience.

</details>

</blockquote></details>

</details>

<!-- This is an auto-generated comment by CodeRabbit for review status -->
state: COMMENTED
author_association: NONE
submitted_at: 2025-03-11T10:12:26Z

Review comments:
diff_hunk: @@ -321,3 +321,180 @@ export const communities = [
     img: "https://avatar.vercel.sh/jill",
   },
 ];
+
+export const users = [
+  {
+    id: 17,
+    name: "Cloud Coder",
+    location: "Australia",
+    reputation: "110",
+    tags: ["aws", "devops", "kubernetes"],
+    avatarBg: "bg-green-200",
+    lastActive: "2025-03-06T16:00:00Z", // Within last 7 days
+    createdAt: "2025-03-01T12:30:00Z", // Within last 7 days
+  },
+  {
+    id: 1,
+    name: "VonC",
+    location: "France",
+    reputation: "320",
+    tags: ["git", "github", "docker"],
+    avatar: "/placeholder.svg?height=48&width=48",
+    avatarBg: "bg-blue-100",
+    lastActive: "2024-03-09T12:15:00Z", // Within last 7 days
+    createdAt: "2023-07-10T09:00:00Z",
+  },
+  {
+    id: 11,
+    name: "rozsazoltan",
+    location: "Hungary",
+    reputation: "140",
+    tags: ["tailwind-css", "javascript", "css"],
+    avatar: "/placeholder.svg?height=48&width=48",
+    avatarBg: "bg-gray-100",
+    lastActive: "2024-03-03T07:15:00Z",
+    createdAt: "2023-12-15T09:30:00Z",
+  },
+  {
+    id: 2,
+    name: "Halo",
+    location: "USA",
+    reputation: "280",
+    tags: ["three.js", "javascript", "css"],
+    avatarBg: "bg-purple-100",
+    lastActive: "2024-03-07T18:45:00Z", // Within last 7 days
+    createdAt: "2024-03-06T14:30:00Z", // Within last 7 days
+  },
+  {
+    id: 3,
+    name: "Sweeper",
+    location: "UK",
+    reputation: "246",
+    tags: ["swift", "java", "c#"],
+    avatarBg: "bg-gray-100",
+    lastActive: "2024-01-10T16:10:00Z",
+    createdAt: "2023-11-15T08:00:00Z",
+  },
+  {
+    id: 4,
+    name: "Jon Skeet",
+    location: "Reading, United Kingdom",
+    reputation: "230",
+    tags: ["c#", "java", ".net"],
+    avatar: "/placeholder.svg?height=48&width=48",
+    avatarBg: "bg-gray-100",
+    lastActive: "2024-03-05T10:20:00Z",
+    createdAt: "2023-06-30T07:45:00Z",
+  },
+  {
+    id: 5,
+    name: "Yus",
+    location: "",
+    reputation: "200",
+    tags: ["html", "css", "python-3.x"],
+    avatarBg: "bg-pink-100",
+    lastActive: "2024-03-08T22:30:00Z", // Within last 7 days
+    createdAt: "2024-03-04T11:50:00Z", // Within last 7 days
+  },
+  {
+    id: 15,
+    name: "AI Whisperer",
+    location: "Canada",
+    reputation: "118",
+    tags: ["machine-learning", "python", "tensorflow"],
+    avatarBg: "bg-indigo-100",
+    lastActive: "2025-03-10T08:45:00Z", // Within last 7 days
+    createdAt: "2025-03-05T14:00:00Z", // Within last 7 days
+  },
+  {
+    id: 6,
+    name: "BmyGuest",
+    location: "",
+    reputation: "160",
+    tags: ["dm-script", "c++", "mfc"],
+    avatarBg: "bg-gray-100",
+    lastActive: "2024-02-15T14:00:00Z",
+    createdAt: "2023-07-20T13:15:00Z",
+  },
+  {
+    id: 7,
+    name: "Ahmed AEK",
+    location: "",
+    reputation: "159",
+    tags: ["python", "c++", "multithreading"],
+    avatarBg: "bg-green-100",
+    lastActive: "2024-03-09T09:40:00Z", // Within last 7 days
+    createdAt: "2023-09-10T17:25:00Z",
+  },
+  {
+    id: 8,
+    name: "Naren Murali",
+    location: "Chennai, Tamil Nadu, India",
+    reputation: "158",
+    tags: ["angular", "javascript", "typescript"],
+    avatarBg: "bg-pink-100",
+    lastActive: "2024-03-08T21:15:00Z", // Within last 7 days
+    createdAt: "2023-12-01T10:10:00Z",
+  },
+  {
+    id: 9,
+    name: "AmerlicA",
+    location: "Shāhi, Māzandarān Province, Iran",
+    reputation: "145",
+    tags: ["javascript", "reactjs", "react-native"],
+    avatar: "/placeholder.svg?height=48&width=48",
+    avatarBg: "bg-gray-100",
+    lastActive: "2024-02-22T13:30:00Z",
+    createdAt: "2023-09-15T12:00:00Z",
+  },
+  {
+    id: 10,
+    name: "dbush",
+    location: "New Jersey",
+    reputation: "143",
+    tags: ["c", "pointers", "c++"],
+    avatarBg: "bg-yellow-100",
+    lastActive: "2024-01-28T16:50:00Z",
+    createdAt: "2023-10-10T08:40:00Z",
+  },
+  {
+    id: 12,
+    name: "Sebastian Redl",
+    location: "",
+    reputation: "135",
+    tags: ["c++", "c++11", "rust"],
+    avatarBg: "bg-teal-100",
+    lastActive: "2024-01-15T14:20:00Z",
+    createdAt: "2023-12-05T11:55:00Z",
+  },
+  {
+    id: 13,
+    name: "Lara Dev",
+    location: "Germany",
+    reputation: "125",
+    tags: ["laravel", "php", "mysql"],
+    avatarBg: "bg-orange-100",
+    lastActive: "2025-03-09T14:10:00Z", // Within last 7 days
+    createdAt: "2025-03-04T09:30:00Z", // Within last 7 days
+  },
+  {
+    id: 14,
+    name: "Xavier Code",
+    location: "Spain",
+    reputation: "122",
+    tags: ["vue.js", "nuxt", "javascript"],
+    avatarBg: "bg-red-100",
+    lastActive: "2025-03-08T17:20:00Z", // Within last 7 days
+    createdAt: "2024-03-03T07:15:00Z", 
+  },
+  {
+    id: 16,
+    name: "React Wizard",
+    location: "India",
+    reputation: "115",
+    tags: ["react", "next.js", "redux"],
+    avatarBg: "bg-blue-200",
+    lastActive: "2025-03-07T20:30:00Z", // Within last 7 days
+    createdAt: "2024-03-03T07:15:00Z", 
+  }
+]
path: apps/web/json/dummy.ts
user: login: coderabbitai[bot]
body: _⚠️ Potential issue_

**Fix future dates in user data**

Several user entries contain dates from 2025, which is in the future relative to the current date (March 2025).


Update these dates to use past or present dates to ensure proper functionality of date-based filtering features. For example:

```diff
{
  id: 17,
  name: "Cloud Coder",
  location: "Australia",
  reputation: "110",
  tags: ["aws", "devops", "kubernetes"],
  avatarBg: "bg-green-200",
-  lastActive: "2025-03-06T16:00:00Z", // Within last 7 days
-  createdAt: "2025-03-01T12:30:00Z", // Within last 7 days
+  lastActive: "2024-03-06T16:00:00Z", // Within last 7 days
+  createdAt: "2024-03-01T12:30:00Z", // Within last 7 days
},
```

Make similar changes to other user entries with 2025 dates (IDs: 15, 13, 14, 16).


<!-- suggestion_start -->

<details>
<summary>📝 Committable suggestion</summary>

> ‼️ **IMPORTANT**
> Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

`````suggestion
export const users = [
  {
    id: 17,
    name: "Cloud Coder",
    location: "Australia",
    reputation: "110",
    tags: ["aws", "devops", "kubernetes"],
    avatarBg: "bg-green-200",
-   lastActive: "2025-03-06T16:00:00Z", // Within last 7 days
-   createdAt: "2025-03-01T12:30:00Z", // Within last 7 days
+   lastActive: "2024-03-06T16:00:00Z", // Within last 7 days
+   createdAt: "2024-03-01T12:30:00Z", // Within last 7 days
  },
  {
    id: 1,
    name: "VonC",
    location: "France",
    reputation: "320",
    tags: ["git", "github", "docker"],
    avatar: "/placeholder.svg?height=48&width=48",
    avatarBg: "bg-blue-100",
    lastActive: "2024-03-09T12:15:00Z", // Within last 7 days
    createdAt: "2023-07-10T09:00:00Z",
  },
  {
    id: 11,
    name: "rozsazoltan",
    location: "Hungary",
    reputation: "140",
    tags: ["tailwind-css", "javascript", "css"],
    avatar: "/placeholder.svg?height=48&width=48",
    avatarBg: "bg-gray-100",
    lastActive: "2024-03-03T07:15:00Z",
    createdAt: "2023-12-15T09:30:00Z",
  },
  {
    id: 2,
    name: "Halo",
    location: "USA",
    reputation: "280",
    tags: ["three.js", "javascript", "css"],
    avatarBg: "bg-purple-100",
    lastActive: "2024-03-07T18:45:00Z", // Within last 7 days
    createdAt: "2024-03-06T14:30:00Z", // Within last 7 days
  },
  {
    id: 3,
    name: "Sweeper",
    location: "UK",
    reputation: "246",
    tags: ["swift", "java", "c#"],
    avatarBg: "bg-gray-100",
    lastActive: "2024-01-10T16:10:00Z",
    createdAt: "2023-11-15T08:00:00Z",
  },
  {
    id: 4,
    name: "Jon Skeet",
    location: "Reading, United Kingdom",
    reputation: "230",
    tags: ["c#", "java", ".net"],
    avatar: "/placeholder.svg?height=48&width=48",
    avatarBg: "bg-gray-100",
    lastActive: "2024-03-05T10:20:00Z",
    createdAt: "2023-06-30T07:45:00Z",
  },
  {
    id: 5,
    name: "Yus",
    location: "",
    reputation: "200",
    tags: ["html", "css", "python-3.x"],
    avatarBg: "bg-pink-100",
    lastActive: "2024-03-08T22:30:00Z", // Within last 7 days
    createdAt: "2024-03-04T11:50:00Z", // Within last 7 days
  },
  {
    id: 15,
    name: "AI Whisperer",
    location: "Canada",
    reputation: "118",
    tags: ["machine-learning", "python", "tensorflow"],
    avatarBg: "bg-indigo-100",
-   lastActive: "2025-03-10T08:45:00Z", // Within last 7 days
-   createdAt: "2025-03-05T14:00:00Z", // Within last 7 days
+   lastActive: "2024-03-10T08:45:00Z", // Within last 7 days
+   createdAt: "2024-03-05T14:00:00Z", // Within last 7 days
  },
  {
    id: 6,
    name: "BmyGuest",
    location: "",
    reputation: "160",
    tags: ["dm-script", "c++", "mfc"],
    avatarBg: "bg-gray-100",
    lastActive: "2024-02-15T14:00:00Z",
    createdAt: "2023-07-20T13:15:00Z",
  },
  {
    id: 7,
    name: "Ahmed AEK",
    location: "",
    reputation: "159",
    tags: ["python", "c++", "multithreading"],
    avatarBg: "bg-green-100",
    lastActive: "2024-03-09T09:40:00Z", // Within last 7 days
    createdAt: "2023-09-10T17:25:00Z",
  },
  {
    id: 8,
    name: "Naren Murali",
    location: "Chennai, Tamil Nadu, India",
    reputation: "158",
    tags: ["angular", "javascript", "typescript"],
    avatarBg: "bg-pink-100",
    lastActive: "2024-03-08T21:15:00Z", // Within last 7 days
    createdAt: "2023-12-01T10:10:00Z",
  },
  {
    id: 9,
    name: "AmerlicA",
    location: "Shāhi, Māzandarān Province, Iran",
    reputation: "145",
    tags: ["javascript", "reactjs", "react-native"],
    avatar: "/placeholder.svg?height=48&width=48",
    avatarBg: "bg-gray-100",
    lastActive: "2024-02-22T13:30:00Z",
    createdAt: "2023-09-15T12:00:00Z",
  },
  {
    id: 10,
    name: "dbush",
    location: "New Jersey",
    reputation: "143",
    tags: ["c", "pointers", "c++"],
    avatarBg: "bg-yellow-100",
    lastActive: "2024-01-28T16:50:00Z",
    createdAt: "2023-10-10T08:40:00Z",
  },
  {
    id: 12,
    name: "Sebastian Redl",
    location: "",
    reputation: "135",
    tags: ["c++", "c++11", "rust"],
    avatarBg: "bg-teal-100",
    lastActive: "2024-01-15T14:20:00Z",
    createdAt: "2023-12-05T11:55:00Z",
  },
  {
    id: 13,
    name: "Lara Dev",
    location: "Germany",
    reputation: "125",
    tags: ["laravel", "php", "mysql"],
    avatarBg: "bg-orange-100",
-   lastActive: "2025-03-09T14:10:00Z", // Within last 7 days
-   createdAt: "2025-03-04T09:30:00Z", // Within last 7 days
+   lastActive: "2024-03-09T14:10:00Z", // Within last 7 days
+   createdAt: "2024-03-04T09:30:00Z", // Within last 7 days
  },
  {
    id: 14,
    name: "Xavier Code",
    location: "Spain",
    reputation: "122",
    tags: ["vue.js", "nuxt", "javascript"],
    avatarBg: "bg-red-100",
-   lastActive: "2025-03-08T17:20:00Z", // Within last 7 days
+   lastActive: "2024-03-08T17:20:00Z", // Within last 7 days
    createdAt: "2024-03-03T07:15:00Z", 
  },
  {
    id: 16,
    name: "React Wizard",
    location: "India",
    reputation: "115",
    tags: ["react", "next.js", "redux"],
    avatarBg: "bg-blue-200",
-   lastActive: "2025-03-07T20:30:00Z", // Within last 7 days
+   lastActive: "2024-03-07T20:30:00Z", // Within last 7 days
    createdAt: "2024-03-03T07:15:00Z", 
  }
]
`````

</details>

<!-- suggestion_end -->

<!-- This is an auto-generated comment by CodeRabbit -->
created_at: 2025-03-11T10:12:24Z
author_association: NONE
diff_hunk: @@ -0,0 +1,118 @@
+"use client"
+
+import Image from "next/image"
+import Link from "next/link"
+import { Badge } from "@/components/ui/badge"
+import { Card, CardContent } from "@/components/ui/card"
+import { MapPin, Star } from "lucide-react"
+import { JSX } from "react"
+
+// Define the User type
+type User = {
+    id: number
+    name: string
+    location: string
+    reputation: string
+    tags: string[]
+    avatar?: string
+    avatarBg: string
+    avatarContent?: JSX.Element
+    lastActive?: string
+    createdAt?: string
+}
path: apps/web/app/(routes)/users/usercard.tsx
user: login: coderabbitai[bot]
body: _🛠️ Refactor suggestion_

**Consider moving User type to a shared types file**

The User type definition is defined locally in this component file, but it's also used by the UsersPage component.


For better code organization and to avoid potential discrepancies, move the User type to a shared types file:

1. Create a new file at `apps/web/types/index.ts`
2. Move the User type definition there
3. Import the type in both components

This improves maintainability and ensures consistent typing across components.

<!-- This is an auto-generated comment by CodeRabbit -->
created_at: 2025-03-11T10:12:25Z
author_association: NONE

PR comments:
user: login: vercel[bot]
created_at: 2025-03-11T10:09:05Z
body: [vc]: #S+m3ZdQwUDm4g2gXhpUntZY8MjeE3Sb3iQxxN+H7g9w=:eyJpc01vbm9yZXBvIjp0cnVlLCJ0eXBlIjoiZ2l0aHViIiwicHJvamVjdHMiOlt7Im5hbWUiOiJpbmRleGZsb3ctd2ViIiwicm9vdERpcmVjdG9yeSI6ImFwcHMvd2ViIiwiaW5zcGVjdG9yVXJsIjoiaHR0cHM6Ly92ZXJjZWwuY29tL2JsdWVmaW56L2luZGV4Zmxvdy13ZWIvMlN6bmRYUG1icDR2UnYzem1CZDlCZEhpMjZOZCIsInByZXZpZXdVcmwiOiJpbmRleGZsb3ctd2ViLWdpdC1mb3JrLXJ4aHVsMTgtZmVhdC11c2VyLXBhZ2UtYmx1ZWZpbnoudmVyY2VsLmFwcCIsIm5leHRDb21taXRTdGF0dXMiOiJERVBMT1lFRCIsImxpdmVGZWVkYmFjayI6eyJyZXNvbHZlZCI6MCwidW5yZXNvbHZlZCI6MCwidG90YWwiOjAsImxpbmsiOiJpbmRleGZsb3ctd2ViLWdpdC1mb3JrLXJ4aHVsMTgtZmVhdC11c2VyLXBhZ2UtYmx1ZWZpbnoudmVyY2VsLmFwcCJ9fV19
**The latest updates on your projects**. Learn more about [Vercel for Git ↗︎](https://vercel.link/github-learn-more)

| Name | Status | Preview | Comments | Updated (UTC) |
| :--- | :----- | :------ | :------- | :------ |
| **indexflow-web** | ✅ Ready ([Inspect](https://vercel.com/bluefinz/indexflow-web/2SzndXPmbp4vRv3zmBd9BdHi26Nd)) | [Visit Preview](https://indexflow-web-git-fork-rxhul18-feat-user-page-bluefinz.vercel.app) | 💬 [**Add feedback**](https://vercel.live/open-feedback/indexflow-web-git-fork-rxhul18-feat-user-page-bluefinz.vercel.app?via=pr-comment-feedback-link) | Mar 11, 2025 10:10am |


author_association: NONE
user: login: vercel[bot]
created_at: 2025-03-11T10:09:06Z
body: @rxhul18 is attempting to deploy a commit to the **BlueFinZ** Team on [Vercel](https://vercel.com).

A member of the Team first needs to [authorize it](https://vercel.com/git/authorize?team=BlueFinZ&type=github&job=%7B%22headInfo%22%3A%7B%22sha%22%3A%22c22db04343c98881aca565b6ae1936b3c8abdfda%22%7D%2C%22id%22%3A%22QmZmYeuGjeASKih9HGJwx6WdV9jBd24zHKmk6vQRSSvwDx%22%2C%22org%22%3A%22SkidGod4444%22%2C%22prId%22%3A6%2C%22repo%22%3A%22indexflow%22%7D).


author_association: NONE
user: login: coderabbitai[bot]
created_at: 2025-03-11T10:09:10Z
body: <!-- This is an auto-generated comment: summarize by coderabbit.ai -->
<!-- walkthrough_start -->

## Walkthrough

This pull request introduces two new React components to enhance user interaction. The `UsersPage` component manages state and filtering based on a search query and user type, while the `UserGrid` component displays a collection of user cards with conditional rendering. A new `User` type is defined, and a dummy data array containing detailed user profiles is added, providing sample information for testing and UI presentation.

## Changes

| File(s)                                                                                  | Change Summary                                                                                                                                                                                                                                                       |
|------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `apps/web/app/(routes)/users/page.tsx`<br>`apps/web/app/(routes)/users/usercard.tsx`       | Added two new React components: `UsersPage` for managing search queries and filtering, and `UserGrid` for rendering user cards. Also defined a new `User` type with properties like id, name, location, reputation, tags, avatar, and activity timestamps. |
| `apps/web/json/dummy.ts`                                                                 | Added an exported constant `users`, an array of dummy user objects providing test data with attributes such as id, name, location, reputation, tags, avatar details, and ISO 8601 formatted timestamps.                                                         |

## Sequence Diagram(s)

```mermaid
sequenceDiagram
    participant U as User
    participant UP as UsersPage
    participant UG as UserGrid
    participant D as DummyData

    U->>UP: Input search query/select filter
    UP->>D: Retrieve user data
    UP->>UP: Filter users using useMemo
    UP->>UG: Pass filteredUsers
    UG->>U: Render user cards
```

## Possibly related PRs

- **SkidGod4444/indexflow#4**: Involves similar user data handling and filtering logic using the `UserGrid` component, making it closely aligned with the changes in this PR.

## Poem

> I’m a rabbit in the code field, so spry,  
> Hopping through components as time flies by.  
> UsersPage and UserGrid now lead the way,  
> With filtering magic that saves the day.  
> Carrots and code—hoppy changes on display!

<!-- walkthrough_end -->
<!-- internal state start -->


<!-- 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 -->

<!-- internal state end -->
<!-- finishing_touch_checkbox_start -->

<details>
<summary>✨ Finishing Touches</summary>

- [ ] <!-- {"checkboxId": "7962f53c-55bc-4827-bfbf-6a18da830691"} --> 📝 Generate Docstrings

</details>

<!-- finishing_touch_checkbox_end -->
<!-- tips_start -->

---

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

<details>
<summary>❤️ Share</summary>

- [X](https://twitter.com/intent/tweet?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A&url=https%3A//coderabbit.ai)
- [Mastodon](https://mastodon.social/share?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A%20https%3A%2F%2Fcoderabbit.ai)
- [Reddit](https://www.reddit.com/submit?title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&text=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code.%20Check%20it%20out%3A%20https%3A//coderabbit.ai)
- [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fcoderabbit.ai&mini=true&title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&summary=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code)

</details>

<details>
<summary>🪧 Tips</summary>

### Chat

There are 3 ways to chat with [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=SkidGod4444/indexflow&utm_content=6):

- Review comments: Directly reply to a review comment made by CodeRabbit. Example:
  - `I pushed a fix in commit <commit_id>, please review it.`
  - `Generate unit testing code for this file.`
  - `Open a follow-up GitHub issue for this discussion.`
- Files and specific lines of code (under the "Files changed" tab): Tag `@coderabbitai` in a new review comment at the desired location with your query. Examples:
  - `@coderabbitai generate unit testing code for this file.`
  -	`@coderabbitai modularize this function.`
- PR comments: Tag `@coderabbitai` in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
  - `@coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.`
  - `@coderabbitai read src/utils.ts and generate unit testing code.`
  - `@coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.`
  - `@coderabbitai help me debug CodeRabbit configuration file.`

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

### CodeRabbit Commands (Invoked using PR comments)

- `@coderabbitai pause` to pause the reviews on a PR.
- `@coderabbitai resume` to resume the paused reviews.
- `@coderabbitai review` to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
- `@coderabbitai full review` to do a full review from scratch and review all the files again.
- `@coderabbitai summary` to regenerate the summary of the PR.
- `@coderabbitai generate docstrings` to [generate docstrings](https://docs.coderabbit.ai/finishing-touches/docstrings) for this PR.
- `@coderabbitai resolve` resolve all the CodeRabbit review comments.
- `@coderabbitai configuration` to show the current CodeRabbit configuration for the repository.
- `@coderabbitai help` to get help.

### Other keywords and placeholders

- Add `@coderabbitai ignore` anywhere in the PR description to prevent this PR from being reviewed.
- Add `@coderabbitai summary` to generate the high-level summary at a specific location in the PR description.
- Add `@coderabbitai` anywhere in the PR title to generate the title automatically.

### CodeRabbit Configuration File (`.coderabbit.yaml`)

- You can programmatically configure CodeRabbit by adding a `.coderabbit.yaml` file to the root of your repository.
- Please see the [configuration documentation](https://docs.coderabbit.ai/guides/configure-coderabbit) for more information.
- If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: `# yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json`

### Documentation and Community

- Visit our [Documentation](https://docs.coderabbit.ai) for detailed information on how to use CodeRabbit.
- Join our [Discord Community](http://discord.gg/coderabbit) to get help, request features, and share feedback.
- Follow us on [X/Twitter](https://twitter.com/coderabbitai) for updates and announcements.

</details>

<!-- tips_end -->
author_association: NONE