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 ? (
|
|
|
|
|
Media |
{stars?.stars?.map((p: any) => (
| {p.login} |
|
{p.totalStars} |
{p.stars} |
|
))}
) : (
Load your GitHub repository from settings to see analytics
)}
);
};