Files
zeekay da79f9e711 feat: rename @blockscout to @luxfi, monochrome theme, horizontal blocks
- Rename all @blockscout/* npm packages to @luxfi/* aliases (150+ files)
- Override blue accent colors to gray for monochrome theme
- Fix dropdown/menu/popover fonts to use Geist Sans
- Change Latest Blocks to horizontal scrolling layout
- Show dashes instead of zeros for validator stats on error
- Fix GHA deploy step to use correct deployment name
2026-03-02 12:28:15 -08:00

56 lines
1.7 KiB
TypeScript

import { useMemo } from 'react';
import type { GetAvailableBadgesResponse } from '@luxfi/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,
};
}