summaryrefslogtreecommitdiff
path: root/apps/web/src
diff options
context:
space:
mode:
authorDipanshu Rawat <144578298+Jaydeeprawat17@users.noreply.github.com>2025-06-24 01:40:46 +0530
committerDipanshu Rawat <144578298+Jaydeeprawat17@users.noreply.github.com>2025-06-24 01:40:46 +0530
commitfb9c560c5beed89660ad36c2e2249e12e8b7f78f (patch)
tree99f1a01e321e76127129ac123a6601fab984f665 /apps/web/src
parenta6a520db70ef639e066d1012fa2ecf7e26c53049 (diff)
downloadopencut-fb9c560c5beed89660ad36c2e2249e12e8b7f78f.tar.gz
add: github stars count by API
Diffstat (limited to 'apps/web/src')
-rw-r--r--apps/web/src/components/header.tsx14
-rw-r--r--apps/web/src/components/landing/hero.tsx4
-rw-r--r--apps/web/src/lib/fetchGhStars.ts20
3 files changed, 35 insertions, 3 deletions
diff --git a/apps/web/src/components/header.tsx b/apps/web/src/components/header.tsx
index 109d022e..cada527f 100644
--- a/apps/web/src/components/header.tsx
+++ b/apps/web/src/components/header.tsx
@@ -6,8 +6,11 @@ import { Button } from "./ui/button";
import { ArrowRight } from "lucide-react";
import { HeaderBase } from "./header-base";
import { useSession } from "@/lib/auth-client";
+import { ghStars } from "@/lib/fetchGhStars";
+import { Star } from "lucide-react";
export function Header() {
+ const stars = ghStars();
const { data: session } = useSession();
const leftContent = (
<Link href="/" className="flex items-center gap-3">
@@ -19,8 +22,15 @@ export function Header() {
const rightContent = (
<nav className="flex items-center">
<Link href="https://github.com/OpenCut-app/OpenCut" target="_blank">
- <Button variant="ghost" className="text-sm">
- GitHub
+ <Button
+ variant="ghost"
+ className="flex items-center text-sm text-muted-foreground hover:text-foreground"
+ >
+ <span className="hidden sm:inline">GitHub</span>
+ <span className="text-foreground flex items-center">
+ {stars}+
+ <Star className="w-4 h-4 ml-1" />
+ </span>
</Button>
</Link>
<Link href={session ? "/editor" : "/auth/login"}>
diff --git a/apps/web/src/components/landing/hero.tsx b/apps/web/src/components/landing/hero.tsx
index f2c70f5d..b2320030 100644
--- a/apps/web/src/components/landing/hero.tsx
+++ b/apps/web/src/components/landing/hero.tsx
@@ -7,6 +7,7 @@ import { ArrowRight } from "lucide-react";
import Link from "next/link";
import { useState } from "react";
import { useToast } from "@/hooks/use-toast";
+import { ghStars } from "@/lib/fetchGhStars";
interface HeroProps {
signupCount: number;
@@ -16,6 +17,7 @@ export function Hero({ signupCount }: HeroProps) {
const [email, setEmail] = useState("");
const [isSubmitting, setIsSubmitting] = useState(false);
const { toast } = useToast();
+ const stars = ghStars();
const handleSubmit = async (e: React.FormEvent) => {
e.preventDefault();
@@ -152,7 +154,7 @@ export function Hero({ signupCount }: HeroProps) {
href="https://github.com/OpenCut-app/OpenCut"
className="text-foreground underline"
>
- GitHub
+ GitHub {stars}+
</Link>
</motion.div>
</div>
diff --git a/apps/web/src/lib/fetchGhStars.ts b/apps/web/src/lib/fetchGhStars.ts
new file mode 100644
index 00000000..de3e2e80
--- /dev/null
+++ b/apps/web/src/lib/fetchGhStars.ts
@@ -0,0 +1,20 @@
+async function getStars(): Promise<string> {
+ const res = await fetch("https://api.github.com/repos/OpenCut-app/OpenCut", {
+ // Cache for 1 hour (3600 seconds)
+ next: { revalidate: 3600 },
+ });
+
+ const data = await res.json();
+ const count = data.stargazers_count;
+
+ if (count >= 1_000_000)
+ return (count / 1_000_000).toFixed(1).replace(/\.0$/, "") + "M";
+ if (count >= 1_000)
+ return (count / 1_000).toFixed(1).replace(/\.0$/, "") + "k";
+ return count.toString();
+}
+
+export async function ghStars() {
+ const stars = await getStars();
+ return stars;
+}