mirror of
https://github.com/luxfi/explore.git
synced 2026-09-24 00:28:18 +00:00
* Set the auth header for the merits API inside `useApiFetch` Resolves #2978 * fixes * [skip ci] fix comment position
56 lines
1.8 KiB
TypeScript
56 lines
1.8 KiB
TypeScript
import { useMemo } from 'react';
|
|
|
|
import type { GetAvailableBadgesResponse } from '@blockscout/points-types';
|
|
|
|
import config from 'configs/app';
|
|
import useApiQuery from 'lib/api/useApiQuery';
|
|
import { useRewardsContext } from 'lib/contexts/rewards';
|
|
|
|
const feature = config.features.rewards;
|
|
|
|
export default function useStreakBadges() {
|
|
const { isAuth, dailyRewardQuery } = useRewardsContext();
|
|
|
|
const badgesQuery = useApiQuery<'rewards:user_badges', unknown, GetAvailableBadgesResponse>('rewards:user_badges', {
|
|
queryOptions: {
|
|
enabled: feature.isEnabled && isAuth,
|
|
select: (data) => ({
|
|
...data,
|
|
items: data.items
|
|
.sort((a, b) => Number(a.requirements?.streak || 0) - Number(b.requirements?.streak || 0))
|
|
.slice(0, 3), // UI limit
|
|
}),
|
|
},
|
|
});
|
|
|
|
const nextAchievementText = useMemo(() => {
|
|
try {
|
|
if (badgesQuery.isPending || dailyRewardQuery.isPending) {
|
|
return 'Next achievement in N/A day'; // for skeleton
|
|
}
|
|
if (!badgesQuery.data?.items || !dailyRewardQuery.data?.streak) {
|
|
return undefined;
|
|
}
|
|
const currentStreak = Number(dailyRewardQuery.data.streak);
|
|
const next = badgesQuery.data.items.find((b) =>
|
|
!(b.is_qualified || b.is_whitelisted || b.is_minted) &&
|
|
Number(b.requirements?.streak) > currentStreak,
|
|
);
|
|
if (!next) {
|
|
return 'All achievements are earned';
|
|
}
|
|
const target = Number(next.requirements?.streak || 0);
|
|
const diff = target - currentStreak;
|
|
return `Next achievement in ${ diff } day${ diff === 1 ? '' : 's' }`;
|
|
} catch {
|
|
return undefined;
|
|
}
|
|
}, [ badgesQuery, dailyRewardQuery ]);
|
|
|
|
return {
|
|
badgesQuery,
|
|
nextAchievementText,
|
|
isLoading: badgesQuery.isPending,
|
|
};
|
|
}
|