From d96811cf995096c10e0abc558d9ad072ab2961d6 Mon Sep 17 00:00:00 2001 From: amhsirak Date: Mon, 19 Jan 2026 14:32:31 +0530 Subject: [PATCH] feat: github star counter --- src/components/dashboard/MainMenu.tsx | 116 ++++++++++++++++++++++++-- 1 file changed, 110 insertions(+), 6 deletions(-) diff --git a/src/components/dashboard/MainMenu.tsx b/src/components/dashboard/MainMenu.tsx index 16b24e67..39561939 100644 --- a/src/components/dashboard/MainMenu.tsx +++ b/src/components/dashboard/MainMenu.tsx @@ -1,10 +1,10 @@ -import React, { useState } from 'react'; +import React, { useState, useEffect } from 'react'; // Added useEffect import Tabs from '@mui/material/Tabs'; import Tab from '@mui/material/Tab'; import Box from '@mui/material/Box'; import { useNavigate, useLocation } from 'react-router-dom'; import { Paper, Button, useTheme, Modal, Typography, Stack, Divider } from "@mui/material"; -import { AutoAwesome, VpnKey, Usb, CloudQueue, Description, Favorite, SlowMotionVideo, PlayArrow, ArrowForwardIos } from "@mui/icons-material"; +import { AutoAwesome, VpnKey, Usb, CloudQueue, Description, Favorite, SlowMotionVideo, PlayArrow, ArrowForwardIos, Star } from "@mui/icons-material"; import { useTranslation } from 'react-i18next'; import { useGlobalInfoStore } from "../../context/globalInfo"; @@ -22,9 +22,42 @@ export const MainMenu = ({ value = 'robots', handleChangeContent }: MainMenuProp const [sponsorModalOpen, setSponsorModalOpen] = useState(false); const [docModalOpen, setDocModalOpen] = useState(false); + const [starCount, setStarCount] = useState(null); + const [isLoading, setIsLoading] = useState(false); const ossDiscountCode = "MAXUNOSS8"; + useEffect(() => { + const fetchStarCount = async () => { + setIsLoading(true); + try { + const response = await fetch('https://api.github.com/repos/getmaxun/maxun', { + headers: { + 'Accept': 'application/vnd.github.v3+json' + } + }); + + if (response.ok) { + const data = await response.json(); + setStarCount(data.stargazers_count); + } else { + console.error('Failed to fetch GitHub star count'); + } + } catch (error) { + console.error('Error fetching GitHub star count:', error); + } finally { + setIsLoading(false); + } + }; + + fetchStarCount(); + + // Optional: Refresh star count every 5 minutes + const intervalId = setInterval(fetchStarCount, 5 * 60 * 1000); + + return () => clearInterval(intervalId); + }, []); + const handleChange = (event: React.SyntheticEvent, newValue: string) => { navigate(`/${newValue}`); handleChangeContent(newValue); @@ -66,6 +99,23 @@ export const MainMenu = ({ value = 'robots', handleChangeContent }: MainMenuProp }, }; + const starButtonStyles = { + justifyContent: 'flex-start', + textAlign: 'left', + fontSize: '15px', + padding: '12px 20px 12px 22px', + minHeight: '48px', + minWidth: '100%', + display: 'flex', + alignItems: 'center', + textTransform: 'none', + color: theme.palette.mode === 'light' ? '#6C6C6C' : 'inherit', + backgroundColor: theme.palette.mode === 'light' ? '#fafafa' : 'rgba(255, 255, 255, 0.04)', + '&:hover': { + color: theme.palette.mode === 'light' ? '#6C6C6C' : 'inherit', + backgroundColor: theme.palette.mode === 'light' ? '#f0f0f0' : 'rgba(255, 255, 255, 0.08)', + }, + }; return ( <> @@ -74,20 +124,30 @@ export const MainMenu = ({ value = 'robots', handleChangeContent }: MainMenuProp height: '100%', width: '230px', backgroundColor: theme.palette.background.paper, - paddingTop: '0.5rem', color: defaultcolor, + display: 'flex', + flexDirection: 'column', }} variant="outlined" square > - + + + + setSponsorModalOpen(false)}> @@ -190,4 +294,4 @@ export const MainMenu = ({ value = 'robots', handleChangeContent }: MainMenuProp ); -}; +}; \ No newline at end of file