diff options
Diffstat (limited to 'apps/web')
| -rw-r--r-- | apps/web/src/components/header.tsx | 14 | ||||
| -rw-r--r-- | apps/web/src/components/landing/hero.tsx | 4 | ||||
| -rw-r--r-- | apps/web/src/lib/fetchGhStars.ts | 20 |
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; +} |
