Skip to content

Commit 4dadbe0

Browse files
feat: add spinner when its loading
1 parent 53e45bf commit 4dadbe0

File tree

6 files changed

+33
-18
lines changed

6 files changed

+33
-18
lines changed

src/components/badges/RewardBadge.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ interface RewardBadgeProps {
3636
export default function RewardBadge({ reward = {}, type = "transparent", displayAmount = true }: RewardBadgeProps): ReactElement {
3737
const { token, amount } = reward;
3838

39-
const badgeClassnames = classNames("font-semibold leading-none text-center inline-flex items-center justify-between rounded-full text-xs p-0.5 h-5 space-x-2", {
39+
const badgeClassnames = classNames("font-semibold leading-none text-center inline-flex items-center justify-between rounded-full text-xs p-0.5 h-5 space-x-2-", {
4040
"bg-white bg-opacity-25 text-white": type === "transparent",
4141
"bg-gray-200 text-gray-500": type === "gray",
4242
"bg-gray-100 text-gray-500": type === "light-gray",

src/components/cards/profile/Referral.tsx

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
import { ReactElement, useMemo } from "react";
22
import Avatar from "@/components/ui/Avatar";
3-
import RewardBadge from "@/components/badges/RewardBadge";
43
import DateManager from "@/utilities/DateManager";
54
import { useTranslation } from "next-i18next";
65
import { useRouter } from "next/router";
76
import { Referral as ReferralType } from "@/types/community";
87
import Link from "next/link";
98
import TimeIcon from "@/icons/time.svg";
9+
import RewardBadge from "@/components/badges/RewardBadge";
10+
import { Evaluation } from "@/types/bounty";
1011

1112
interface ReferralProps {
1213
referral: ReferralType;
@@ -29,13 +30,13 @@ export default function Referral({ referral }: ReferralProps): ReactElement {
2930
const joinedAt = useMemo(() => DateManager.fromNow(referral.created_at, locale), [locale, referral.created_at]);
3031
const rewardAt = useMemo(() => (referral.rewarded ? DateManager.fromNow(referral.updated_at, locale) : null), [locale, referral.rewarded, referral.updated_at]);
3132

32-
const status = (evaluation: any) => {
33+
const status = (evaluation: Evaluation) => {
3334
if (!evaluation) return t("referrals.challenge.evaluation.status.pending")
3435
return t(evaluation?.reward ? "referrals.challenge.evaluation.status.passed" : "referrals.challenge.evaluation.status.failed")
3536
}
3637

37-
const formatDate = (date: any) => {
38-
return date ? DateManager.fromNow(date, 'en') : null
38+
const formatDate = (date: Date) => {
39+
return date ? DateManager.fromNow(date, locale) : null
3940
}
4041
return (
4142
<div className="text-sm text-gray-700 bg-gray-50 md:mb-0 p-7">
@@ -64,15 +65,15 @@ export default function Referral({ referral }: ReferralProps): ReactElement {
6465
) : <></>}
6566

6667
{referral?.rewarded && referral.metadata && referral.metadata.reward && (
67-
<li className="pt-4 grid gap-2 md:flex md: justify-between">
68-
<span className="grid gap-2 md:flex items-center">
68+
<li className="pt-4 grid gap-2 md:gap-0 md:flex md:justify-between">
69+
<span className="grid gap-2 md:flex">
6970
<span>{t("referrals.reward.text")}</span>
70-
<span className="font-bold flex">
71+
<span className="font-bold flex justify-start">
7172
<RewardBadge type="gray" reward={referral.metadata.reward} />
7273
</span>
7374
</span>
7475

75-
<span className="hidden md:inline-block text-gray-500">{rewardAt}</span>
76+
<span className="text-gray-500">{rewardAt}</span>
7677
</li>
7778
)}
7879
</ul>

src/components/ui/SideNavigation/index.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ export default function SideNavigation({ items, colors, children }: { items: Ite
1616
const { t } = useTranslation();
1717
return (
1818
<ThemeWrapper colors={colors}>
19-
<ul className="relative bg-red-400">
19+
<ul className="relative">
2020
{items.length ? (
2121
items.map((menu, index) => {
2222
return (

src/pages/profile/referrals.tsx

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ import { IRootState } from "@/store";
1616
import Loader from "@/components/ui/button/Loader";
1717
import ProfileOverviewSection from "@/components/sections/profile/overview/Section";
1818
import ReferralsList from "@/components/list/ReferralsList";
19+
import Spinner from "@/components/ui/Loader";
20+
1921

2022
/**
2123
* interface for UserReferrals multiSelector
@@ -28,6 +30,7 @@ interface UserReferralsMultiSelector {
2830
user: User | null;
2931
referrals: ReferralType[];
3032
hasMore: boolean;
33+
loading: boolean
3134
}
3235

3336
/**
@@ -39,11 +42,12 @@ interface UserReferralsMultiSelector {
3942
export default function UserReferrals(): ReactElement {
4043
const { t } = useTranslation();
4144
const [page, setPage] = useState(0);
42-
const [loading, setLoading] = useState(false);
43-
const { user, referrals, hasMore } = useMultiSelector<unknown, UserReferralsMultiSelector>({
45+
const [isLoadingMore, setIsLoadingMore] = useState(false);
46+
const { user, referrals, hasMore, loading } = useMultiSelector<unknown, UserReferralsMultiSelector>({
4447
user: (state: IRootState) => state.user.data,
4548
referrals: (state: IRootState) => state.userReferrals.userReferralList,
4649
hasMore: (state: IRootState) => state.userReferrals.hasMore,
50+
loading: (state: IRootState) => state.userReferrals.loading
4751
});
4852
const dispatch = useDispatch();
4953
const showLoadMore = useMemo(() => hasMore && referrals?.length >= 10, [referrals?.length, hasMore]);
@@ -55,13 +59,14 @@ export default function UserReferrals(): ReactElement {
5559
}, [dispatch, user?.referrals]);
5660

5761
const nextPage = async () => {
58-
if (loading || !hasMore) return;
59-
setLoading(true);
62+
if (isLoadingMore || !hasMore) return;
63+
setIsLoadingMore(true);
6064
const referralId = referrals[referrals.length - 1]?.id || null;
6165
await dispatch(userFetchReferrals({ startAfter: referralId || null }));
6266
setPage(page + 1);
63-
setLoading(false);
67+
setIsLoadingMore(false);
6468
};
69+
if (loading && !referrals.length) return <Spinner className="py-32" />;
6570

6671
return (
6772
<div className="grid gap-7.5">
@@ -82,7 +87,7 @@ export default function UserReferrals(): ReactElement {
8287
<Referral key={`user-referral-${i}`} referral={referral} />
8388
))}
8489
</InfiniteScroll>
85-
{loading && <Loader loading={loading} className="absolute left-6 -bottom-7.5" onClick={() => nextPage()} />}
90+
{isLoadingMore && <Loader loading={isLoadingMore} className="absolute left-6 -bottom-7.5" onClick={() => nextPage()} />}
8691
</div>
8792
) : (
8893
<div className="w-full border bg-gray-50 border-gray-200 border-solid rounded-3xl text-gray-500 p-6.5 font-semibold">{t('referrals.empty-state.subtitle')}</div>

src/store/feature/user/referrals.slice.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,15 @@ interface UserReferralsState {
1010
current: Referral | null;
1111
hasMore: boolean;
1212
count: number;
13+
loading: boolean;
1314
}
1415

1516
const initialState: UserReferralsState = {
1617
userReferralList: [],
1718
current: null,
1819
hasMore: true,
1920
count: 0,
21+
loading: false,
2022
};
2123

2224
/**
@@ -40,12 +42,16 @@ const userReferralsSlice = createSlice({
4042
setHasMoreReferrals: (state, action) => {
4143
state.hasMore = action.payload;
4244
},
45+
4346
setCount: (state, action) => {
4447
state.count = action.payload;
4548
},
49+
setLoading: (state, action) => {
50+
state.loading = action.payload;
51+
},
4652
},
4753
});
4854

49-
export const { setCurrent, clear, setUserReferralsList, setHasMoreReferrals, setCount } = userReferralsSlice.actions;
55+
export const { setCurrent, clear, setUserReferralsList, setHasMoreReferrals, setCount, setLoading } = userReferralsSlice.actions;
5056

5157
export default userReferralsSlice;

src/store/services/referrals.service.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import baseQuery from "@/config/baseQuery";
22
import { createApi } from "@reduxjs/toolkit/dist/query";
33
import { setReferralsList } from "../feature/referrals.slice";
4-
import { clear, setUserReferralsList, setHasMoreReferrals, setCount } from "../feature/user/referrals.slice";
4+
import { clear, setUserReferralsList, setHasMoreReferrals, setCount, setLoading } from "../feature/user/referrals.slice";
55
import { Referral } from "@/types/community";
66

77
/**
@@ -35,6 +35,7 @@ const referralsService = createApi({
3535
onQueryStarted: async ({ startAfter }, { dispatch, queryFulfilled, getState }) => {
3636
const state = getState() as any;
3737
try {
38+
dispatch(setLoading(true))
3839
const { data } = await queryFulfilled;
3940
const list: Referral[] = [];
4041
if (startAfter) {
@@ -47,6 +48,8 @@ const referralsService = createApi({
4748
dispatch(setUserReferralsList(list));
4849
dispatch(setCount(data?.count));
4950
dispatch(setHasMoreReferrals(data?.list?.length > 0 ? true : false));
51+
dispatch(setLoading(false))
52+
5053
} catch (error) {
5154
console.log("error in fetching the userFetchReferrals ", error);
5255
}

0 commit comments

Comments
 (0)