From 6de1c6f6b7f4b0fc136da914b0c25dcbcab61216 Mon Sep 17 00:00:00 2001 From: adibarra <93070681+adibarra@users.noreply.github.com> Date: Thu, 19 Mar 2026 22:59:43 -0500 Subject: [PATCH 1/3] re-add GitHub star modal on first load --- .../app/src/components/github-star-modal.tsx | 111 ++++++++++++++++++ packages/app/src/components/page-content.tsx | 2 + 2 files changed, 113 insertions(+) create mode 100644 packages/app/src/components/github-star-modal.tsx diff --git a/packages/app/src/components/github-star-modal.tsx b/packages/app/src/components/github-star-modal.tsx new file mode 100644 index 0000000..730ac17 --- /dev/null +++ b/packages/app/src/components/github-star-modal.tsx @@ -0,0 +1,111 @@ +'use client'; + +import { track } from '@/lib/analytics'; +import { Star } from 'lucide-react'; +import { useCallback, useEffect, useState } from 'react'; + +import { GITHUB_OWNER, GITHUB_REPO } from '@semianalysisai/inferencex-constants'; +import { Button } from '@/components/ui/button'; +import { + Dialog, + DialogContent, + DialogDescription, + DialogFooter, + DialogHeader, + DialogTitle, +} from '@/components/ui/dialog'; + +const GITHUB_REPO_URL = `https://github.com/${GITHUB_OWNER}/${GITHUB_REPO}`; +export const STORAGE_KEY = 'inferencex-star-modal-dismissed'; +export const DISMISS_DURATION_MS = 7 * 24 * 60 * 60 * 1000; // 1 week + +export function shouldShowModal(): boolean { + try { + const value = localStorage.getItem(STORAGE_KEY); + if (!value) return true; + const dismissedAt = Number(value); + if (Number.isNaN(dismissedAt)) return true; + return Date.now() - dismissedAt >= DISMISS_DURATION_MS; + } catch { + return false; + } +} + +export function saveDismissTimestamp(): void { + try { + localStorage.setItem(STORAGE_KEY, String(Date.now())); + } catch { + // localStorage unavailable + } +} + +export function GitHubStarModal() { + const [open, setOpen] = useState(false); + const [ready, setReady] = useState(false); + + useEffect(() => { + if (shouldShowModal()) { + setOpen(true); + track('github_star_modal_shown'); + } + setReady(true); + }, []); + + const handleDismiss = useCallback(() => { + setOpen(false); + saveDismissTimestamp(); + track('github_star_modal_dismissed'); + }, []); + + const handleStar = useCallback(() => { + window.open(GITHUB_REPO_URL, '_blank', 'noopener,noreferrer'); + setOpen(false); + saveDismissTimestamp(); + track('github_star_modal_starred'); + }, []); + + return ( + <> + {ready &&