Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 23 additions & 4 deletions app/achievements/page.tsx
Original file line number Diff line number Diff line change
@@ -1,12 +1,31 @@
import Achievements from "@/components/achievements/Achievements";
import { getAllAchievements } from "@/lib/server/achievements";
import connectDB from "@/lib/db/connection";
import type { Metadata } from "next";

export const metadata = {
title: "Achievements",
description: "Achievements page",
};
const PAGE_URL = "https://www.pointblank.club/achievements";
const PAGE_TITLE = "Achievements | Point Blank";
const PAGE_DESCRIPTION =
"See the milestones and achievements of Point Blank — recognitions, wins, and accomplishments from our community.";

export const metadata: Metadata = {
title: PAGE_TITLE,
description: PAGE_DESCRIPTION,
alternates: {
canonical: PAGE_URL,
},
openGraph: {
title: PAGE_TITLE,
description: PAGE_DESCRIPTION,
url: PAGE_URL,
type: "website",
},
twitter: {
card: "summary_large_image",
title: PAGE_TITLE,
description: PAGE_DESCRIPTION,
},
};
export default async function AchievementsPage() {
await connectDB();
const achievements = await getAllAchievements();
Expand Down
51 changes: 47 additions & 4 deletions app/events/page.tsx
Original file line number Diff line number Diff line change
@@ -1,20 +1,63 @@
import type { Metadata } from "next";
import Events from "@/components/events/Events";
import ReviewMarquee from "@/components/events/ReviewMarquee";
import { getAllEvents } from "@/lib/server/events";
import connectDB from "@/lib/db/connection";
import Events, { type Event } from "@/components/events/Events";

const PAGE_URL = "https://www.pointblank.club/events";
const PAGE_TITLE = "Events | Point Blank";
const PAGE_DESCRIPTION =
"Discover upcoming and past events by Point Blank — workshops, hackathons, talks, and meetups for student developers and tech enthusiasts.";

export const metadata: Metadata = {
title: "Events",
title: PAGE_TITLE,
description: PAGE_DESCRIPTION,
alternates: {
canonical: PAGE_URL,
},
openGraph: {
title: PAGE_TITLE,
description: PAGE_DESCRIPTION,
url: PAGE_URL,
type: "website",
},
twitter: {
card: "summary_large_image",
title: PAGE_TITLE,
description: PAGE_DESCRIPTION,
},
};

export default async function EventsPage() {
await connectDB();
const rawEvents = await getAllEvents();
const events = JSON.parse(JSON.stringify(rawEvents));

const events: Event[] = JSON.parse(JSON.stringify(rawEvents));
return (
<>
<script
type="application/ld+json"
dangerouslySetInnerHTML={{
__html: JSON.stringify({
"@context": "https://schema.org",
"@type": "ItemList",
itemListElement: events.slice(0, 10).map((event, idx) => ({
"@type": "ListItem",
position: idx + 1,
item: {
"@type": "Event",
name: event.eventName,
description: event.description,
startDate: event.eventDate,
organizer: {
"@type": "Organization",
name: "Point Blank",
url: "https://www.pointblank.club",
},
},
})),
}),
}}
/>
<section className="relative overflow-hidden text-white flex items-center justify-center px-4 sm:px-10 lg:px-20">
<div className="relative z-10 flex flex-col items-center justify-center pt-24 max-w-8xl mx-auto w-full">
<h1 className="text-center text-white tracking-tight text-5xl md:text-6xl lg:text-7xl font-normal leading-tight md:leading-snug">
Expand Down
25 changes: 23 additions & 2 deletions app/hustle/page.tsx
Original file line number Diff line number Diff line change
@@ -1,9 +1,30 @@
import Hustle from "@/components/hustle/Hustle";
import { type Latest, type Leaderboard, LatestModel, LeaderboardModel } from "@/lib/db/models/hustle";
import connectDB from "@/lib/db/connection";
import type { Metadata } from "next";

export const metadata = {
title: "PB Hustle",
const PAGE_URL = "https://www.pointblank.club/hustle";
const PAGE_TITLE = "PB Hustle | Point Blank";
const PAGE_DESCRIPTION =
"PB Hustle is Point Blank's weekly coding challenge where student developers compete, sharpen their skills, and track their progress.";

export const metadata: Metadata = {
title: PAGE_TITLE,
description: PAGE_DESCRIPTION,
alternates: {
canonical: PAGE_URL,
},
openGraph: {
title: PAGE_TITLE,
description: PAGE_DESCRIPTION,
url: PAGE_URL,
type: "website",
},
twitter: {
card: "summary_large_image",
title: PAGE_TITLE,
description: PAGE_DESCRIPTION,
},
};

export default async function HustlePage() {
Expand Down
68 changes: 65 additions & 3 deletions app/layout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -19,12 +19,55 @@ const lexand = Lexend({
});

export const metadata: Metadata = {
title: "Point Blank",
metadataBase: new URL("https://www.pointblank.club"),
title: {
default: "Point Blank",
template: "%s | Point Blank",
},
description:
"Point Blank is a student-run tech community. We are a group of tech enthusiasts who love to learn and grow together.",
"Point Blank is a student run tech community. We are a group of tech enthusiasts who love to learn and grow together.",
keywords: ["Point Blank", "student tech community India", "open source community India", "Point Blank coding club", "Point Blank Club", "Point Blank India", "Point Blank tech community", "Point Blank coding club", "Point Blank open source", "student developers India", "developer community India", "college tech community", "student coding community", "open source contributors", "open source development"],
authors:[{name: "Point Blank"}],
icons: {
icon: ico.src,
},
openGraph: {
type: "website",
locale: "en_IN",
url: "https://www.pointblank.club",
title: "Point Blank",
description:
"Point Blank is a student run open source community. We are a group of tech enthusiasts who love to learn and grow together.",
siteName: "Point Blank",
images: [
{
url: "/og-image.png",
width: 1200,
height: 630,
alt: "Point Blank",
},
],
},
twitter: {
card: "summary_large_image",
title: "Point Blank",
description:
"Point Blank is a student run open source community.",
images: ["/og-image.png"],
},
robots: {
index: true,
follow: true,
googleBot: {
index: true,
follow: true,
"max-image-preview": "large",
"max-snippet": -1,
},
},
alternates: {
canonical: "https://www.pointblank.club",
},
};

export default async function RootLayout({
Expand All @@ -37,10 +80,29 @@ export default async function RootLayout({
const user = sessionCookie ? (await verifyAuth(sessionCookie.value)) || null : null;

return (
<html lang="en_IN">
<html lang="en-IN">
{process.env.NEXT_PUBLIC_GTM_ID && (
<GoogleTagManager gtmId={process.env.NEXT_PUBLIC_GTM_ID} />
)}
<head>
<script
type="application/ld+json"
dangerouslySetInnerHTML={{
__html: JSON.stringify({
"@context": "https://schema.org",
"@type": "Organization",
name: "Point Blank",
url: "https://www.pointblank.club",
logo: "https://www.pointblank.club/og-image.png",
sameAs: [
"https://x.com/pointblank_club",
"https://instagram.com/pointblank_club_",
"https://linkedin.com/company/pointblank-club",
],
}),
}}
/>
</head>

<body className={`bg-pbpages ${lexand.className}`}>
<Analytics
Expand Down
25 changes: 23 additions & 2 deletions app/lore/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,30 @@ import Lore from "@/components/lore/Lore";
import LoreType from "@/types/lore/loreType";
import { getAllLores } from "@/lib/server/lore";
import connectDB from "@/lib/db/connection";
import type { Metadata } from "next";

export const metadata = {
title: "Lore",
const PAGE_URL = "https://www.pointblank.club/lore";
const PAGE_TITLE = "Lore | Point Blank";
const PAGE_DESCRIPTION =
"Explore the stories, memories, and moments that shaped Point Blank — our journey as a student-run open source community from India.";

export const metadata: Metadata = {
title: PAGE_TITLE,
description: PAGE_DESCRIPTION,
alternates: {
canonical: PAGE_URL,
},
openGraph: {
title: PAGE_TITLE,
description: PAGE_DESCRIPTION,
url: PAGE_URL,
type: "website",
},
twitter: {
card: "summary_large_image",
title: PAGE_TITLE,
description: PAGE_DESCRIPTION,
},
};

export default async function LorePage() {
Expand Down
26 changes: 24 additions & 2 deletions app/members/page.tsx
Original file line number Diff line number Diff line change
@@ -1,10 +1,32 @@
import Members from "@/components/members/Members";
import { getAllMembers } from "@/lib/server/members";
import connectDB from "@/lib/db/connection";
import type { Metadata } from "next";

export const metadata = {
title: "Members",
const PAGE_URL = "https://www.pointblank.club/members";
const PAGE_TITLE = "Members | Point Blank";
const PAGE_DESCRIPTION =
"Meet the members of Point Blank — the student developers, designers, and tech enthusiasts building our open source community from India.";

export const metadata: Metadata = {
title: PAGE_TITLE,
description: PAGE_DESCRIPTION,
alternates: {
canonical: PAGE_URL,
},
openGraph: {
title: PAGE_TITLE,
description: PAGE_DESCRIPTION,
url: PAGE_URL,
type: "website",
},
twitter: {
card: "summary_large_image",
title: PAGE_TITLE,
description: PAGE_DESCRIPTION,
},
};

export default async function Events() {
await connectDB();
const allMembers = await getAllMembers();
Expand Down
22 changes: 20 additions & 2 deletions app/oss/page.tsx
Original file line number Diff line number Diff line change
@@ -1,9 +1,27 @@
import type { Metadata } from "next";
import OssDashboard from "@/components/oss/OssDashboard";

const PAGE_URL = "https://www.pointblank.club/oss";
const PAGE_TITLE = "OSS | Point Blank";
const PAGE_DESCRIPTION = "Open source contributions and merged pull requests of Point Blank members.";

export const metadata: Metadata = {
title: "OSS",
description: "Point Blank open source contributions and merged pull requests.",
title: PAGE_TITLE,
description: PAGE_DESCRIPTION,
alternates: {
canonical: PAGE_URL,
},
openGraph: {
title: PAGE_TITLE,
description: PAGE_DESCRIPTION,
url: PAGE_URL,
type: "website",
},
twitter: {
card: "summary_large_image",
title: PAGE_TITLE,
description: PAGE_DESCRIPTION,
},
};

export default function OssPage() {
Expand Down
62 changes: 38 additions & 24 deletions app/page.tsx
Original file line number Diff line number Diff line change
@@ -1,31 +1,45 @@
"use client";
import type { Metadata } from "next";
import HomeClient from "@/components/homepage/HomeClient";

import { useEffect } from "react";
import HeroSection from "@/components/homepage/HeroSection";
import MissionVisionSection from "@/components/homepage/MissionVisionSection";
import CardStack from "@/components/homepage/CardStack";
import DomainsSection from "@/components/homepage/DomainsSection";
import ActivitiesSection from "@/components/homepage/ActivitiesSection";
import FoundingMembersSection from "@/components/homepage/FoundingMembersSection";
import StayConnectedSection from "@/components/homepage/StayConnectedSection";
import { useLoadingStore } from "@/lib/store/loading";
const PAGE_TITLE = "Point Blank | Student Run Open Source Community from India";
const PAGE_DESCRIPTION =
"Point Blank is a student run open source community. We are a group of tech enthusiasts who love to learn and grow together.";
const PAGE_URL = "https://www.pointblank.club";

export default function Home() {
const setLoading = useLoadingStore((s) => s.setLoading);

useEffect(() => {
setLoading(false);
}, [setLoading]);
export const metadata: Metadata = {
title: PAGE_TITLE,
description: PAGE_DESCRIPTION,
alternates: {
canonical: PAGE_URL,
},
openGraph: {
title: PAGE_TITLE,
description: PAGE_DESCRIPTION,
url: PAGE_URL,
type: "website",
},
twitter: {
card: "summary_large_image",
title: PAGE_TITLE,
description: PAGE_DESCRIPTION,
},
};

export default function Home() {
return (
<>
<HeroSection />
<MissionVisionSection />
<CardStack />
<DomainsSection />
<ActivitiesSection />
<FoundingMembersSection />
<StayConnectedSection />
<script
type="application/ld+json"
dangerouslySetInnerHTML={{
__html: JSON.stringify({
"@context": "https://schema.org",
"@type": "WebSite",
name: "Point Blank",
url: PAGE_URL,
}),
}}
/>
<HomeClient />
</>
);
}
}
Loading
Loading