Lists and Leaderboards
π¦src
β£ πcomponents
β β πfilters
β β πTimeFilter
// Set up Time Filter components /src/components/TimeFilter
function TimeFilter() {
const [timeframe, setTimeframe] = useQueryParam<string>("t", withDefault(StringParam, "1w"));
const onTimeframeChange = (newValue: string) => {
setTimeframe(newValue, "replaceIn");
return (
<Flex>
<ToggleButtonGroup value={timeframe} defaultValue={timeframe} onChange={onTimeframeChange} name="timeframe" isAttached variant="outline" aria-label="Change timeframe">
<ToggleButton value="24h" aria-label="24 hours" children="24h" />
<ToggleButton value="1w" aria-label="1 week" children="1w" />
<ToggleButton value="1m" aria-label="1 month" children="1m" />
<ToggleButton value="1y" aria-label="1 year" children="1y" />
<ToggleButton value="all" aria-label="all time" children="all" />
</ToggleButtonGroup>
</Flex>
);
};
π¦src
β£ πapi
β β πhooks
β β πuseNfts.ts
// Use Time Filter /src/api/hooks/useNfts.ts
const fetchNfts = async (timeframe: string = "1w") => {
try {
let nsfwList: any[] = [];
/* Get nsfw list */
await fetchNsfwList()
.then(res => {
nsfwList = res?.data?.NSFWList || [];
})
.catch(() => {}); // We don't want to catch anything.
/* Get nfts based on the timeframe */
const { data } = await axios.get(`/attention/nft-summaries?period=${timeframe}`);
const dataWithNsfwTag = data?.map((nft: any) => ({ ...nft, isNsfw: [...nsfwList].includes(nft?.id) }));
return dataWithNsfwTag;
} catch (error) {
return undefined;
}
};
export function useNfts({ timeframe = "1w" }: Props) {
const [isNsfw] = useQueryParam("nsfw");
return useQuery(`nfts-${timeframe}`, () => fetchNfts(timeframe), {
staleTime: 60 * 1000 * 5, // 5min cache
refetchOnWindowFocus: undefined,
select: data => {
return isNsfw ? data : [...data].filter((nft: any) => !nft.isNsfw);
}
});
}
Last updated
