import { FC, useCallback, useEffect, useMemo, useState, useTransition, } from 'react'; import { UtcToLocalDateRender } from '@gitroom/react/helpers/utc.date.render'; import { Button } from '@gitroom/react/form/button'; import dayjs from 'dayjs'; import Link from 'next/link'; import { useRouter, useSearchParams } from 'next/navigation'; import useSWR from 'swr'; import clsx from 'clsx'; import { useFetch } from '@gitroom/helpers/utils/custom.fetch'; import ReactLoading from 'react-loading'; export const UpDown: FC<{ name: string; param: string }> = (props) => { const { name, param } = props; const router = useRouter(); const searchParams = useSearchParams(); const state = useMemo(() => { const newName = searchParams.get('key'); const newState = searchParams.get('state'); if (newName != param) { return 'none'; } return newState as 'asc' | 'desc'; }, [searchParams, name, param]); const changeStateUrl = useCallback( (newState: string) => { const query = newState === 'none' ? `` : `?key=${param}&state=${newState}`; router.replace(`/analytics${query}`); }, [state, param] ); const changeState = useCallback(() => { changeStateUrl( state === 'none' ? 'desc' : state === 'desc' ? 'asc' : 'none' ); }, [state, param]); return (
{name}
{['none', 'asc'].indexOf(state) > -1 && ( )} {['none', 'desc'].indexOf(state) > -1 && ( )}
); }; export const StarsTableComponent = () => { const fetch = useFetch(); const router = useRouter(); const searchParams = useSearchParams(); const page = +(searchParams.get('page') || 1); const key = searchParams.get('key'); const state = searchParams.get('state'); const [loading, setLoading] = useState(false); const [, startTransition] = useTransition(); const starsCallback = useCallback( async (path: string) => { startTransition(() => { setLoading(true); }); const data = await ( await fetch(path, { body: JSON.stringify({ page, ...(key && state ? { key, state } : {}), }), method: 'POST', }) ).json(); startTransition(() => { setLoading(false); }); return data; }, [page, key, state] ); const { isLoading: isLoadingStars, data: stars, mutate, } = useSWR('/analytics/stars', starsCallback, { revalidateOnMount: false, revalidateOnReconnect: false, revalidateOnFocus: false, refreshWhenHidden: false, revalidateIfStale: false, }); useEffect(() => { mutate(); }, [searchParams]); const renderMediaLink = useCallback((date: string) => { const local = dayjs.utc(date).local(); const weekNumber = local.isoWeek(); const year = local.year(); return `/launches?week=${weekNumber}&year=${year}`; }, []); const changePage = useCallback( (type: 'increase' | 'decrease') => () => { const newPage = type === 'increase' ? page + 1 : page - 1; const keyAndState = key && state ? `&key=${key}&state=${state}` : ''; router.replace(`/analytics?page=${newPage}${keyAndState}`, { forceOptimisticNavigation: false, }); }, [page, key, state] ); return (

Stars per day

{loading && ( )}
{stars?.stars?.length ? ( {stars?.stars?.map((p: any) => ( ))}
Media
{p.login} {p.totalStars} {p.stars}
) : (
Load your GitHub repository from settings to see analytics
)}
); };