Skip to content

Commit

Permalink
Merge branch 'delegation-3945' of https://github.com/opensquare-netwo…
Browse files Browse the repository at this point in the history
…rk/subsquare into delegation-3945
  • Loading branch information
hyifeng committed Mar 19, 2024
2 parents d6067a1 + 25d4e1e commit ec84f66
Show file tree
Hide file tree
Showing 6 changed files with 134 additions and 23 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
import { noop } from "lodash-es";
import Select from "next-common/components/select";

export default function DelegationSortSelect({ sort = "", setSort = noop }) {
return (
<div className="flex items-center gap-x-2 text12Medium text-textSecondary">
Sort by
<Select
className="w-40 text12Medium"
value={sort}
onChange={(item) => {
setSort(item.value);
}}
options={[
{
label: <Label>Delegated Votes</Label>,
value: "votes",
},
{
label: <Label>Delegators</Label>,
value: "",
},
{
label: <Label>Participation</Label>,
value: "participation",
},
]}
small
/>
</div>
);
}

function Label({ children }) {
return <span className="text12Medium">{children}</span>;
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,29 +5,57 @@ import {
democracyDelegatesTriggerUpdateSelector,
} from "next-common/store/reducers/democracy/delegates";
import usePaginationComponent from "next-common/components/pagination/usePaginationComponent";
import { useEffect } from "react";
import { useEffect, useState } from "react";
import DelegatesLoadable from "next-common/components/delegation/delegate/common/loadable";
import DelegateEmpty from "next-common/components/delegation/delegate/common/empty";
import Delegates from "./members";
import { TitleContainer } from "next-common/components/styled/containers/titleContainer";
import DelegationSortSelect from "../common/sortSelect";
import { useRouter } from "next/router";
import { omit } from "lodash-es";

export default function DemocracyDelegates() {
const dispatch = useDispatch();
const router = useRouter();

const democracyDelegatesPageData = useSelector(democracyDelegatesSelector);
const {
items: delegates = [],
pageSize = 18,
total = 0,
} = democracyDelegatesPageData || {};
const { page, component: pageComponent } = usePaginationComponent(
total,
pageSize,
);
const {
page,
setPage,
component: pageComponent,
} = usePaginationComponent(total, pageSize);
const triggerUpdate = useSelector(democracyDelegatesTriggerUpdateSelector);
const [sort, setSort] = useState(router.query.sort || "");

useEffect(() => {
dispatch(fetchDemocracyDelegates(page, pageSize));
}, [page, pageSize, triggerUpdate]);
const q = router.query;
dispatch(fetchDemocracyDelegates(q.sort || "", q.page || 1, pageSize));
}, [router.asPath, triggerUpdate]);

useEffect(() => {
setSort(router.query.sort || "");
}, [router.query.sort]);

useEffect(() => {
setPage(1);
}, [sort]);

useEffect(() => {
const q = omit(router.query, ["sort", "page"]);
if (page > 1) {
q.page = page;
}
if (sort) {
q.sort = sort;
}

router.push({ query: q }, null, { shallow: true });
}, [sort, page, pageSize]);

return (
<>
Expand All @@ -38,6 +66,8 @@ export default function DemocracyDelegates() {
<span className="text-textTertiary text14Medium ml-1">{total}</span>
)}
</span>

<DelegationSortSelect sort={sort} setSort={setSort} />
</TitleContainer>

<DelegatesLoadable delegates={democracyDelegatesPageData}>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,29 +5,57 @@ import {
referendaDelegatesTriggerUpdateSelector,
} from "next-common/store/reducers/referenda/delegates";
import usePaginationComponent from "next-common/components/pagination/usePaginationComponent";
import { useEffect } from "react";
import { useEffect, useState } from "react";
import DelegatesLoadable from "next-common/components/delegation/delegate/common/loadable";
import DelegateEmpty from "next-common/components/delegation/delegate/common/empty";
import Delegates from "next-common/components/delegation/delegate/referenda/members";
import { TitleContainer } from "next-common/components/styled/containers/titleContainer";
import DelegationSortSelect from "../common/sortSelect";
import { useRouter } from "next/router";
import { omit } from "lodash-es";

export default function ReferendaDelegates() {
const dispatch = useDispatch();
const router = useRouter();

const referendaDelegatesPageData = useSelector(referendaDelegatesSelector);
const {
items: delegates = [],
pageSize = 18,
total = 0,
} = referendaDelegatesPageData || {};
const { page, component: pageComponent } = usePaginationComponent(
total,
pageSize,
);
const {
page,
setPage,
component: pageComponent,
} = usePaginationComponent(total, pageSize);
const triggerUpdate = useSelector(referendaDelegatesTriggerUpdateSelector);
const [sort, setSort] = useState(router.query.sort || "");

useEffect(() => {
dispatch(fetchReferendaDelegates(page, pageSize));
}, [page, pageSize, triggerUpdate]);
const q = router.query;
dispatch(fetchReferendaDelegates(q.sort || "", q.page || 1, pageSize));
}, [router.asPath, triggerUpdate]);

useEffect(() => {
setSort(router.query.sort || "");
}, [router.query.sort]);

useEffect(() => {
setPage(1);
}, [sort]);

useEffect(() => {
const q = omit(router.query, ["sort", "page"]);
if (page > 1) {
q.page = page;
}
if (sort) {
q.sort = sort;
}

router.push({ query: q }, null, { shallow: true });
}, [sort, page, pageSize]);

return (
<>
Expand All @@ -38,6 +66,8 @@ export default function ReferendaDelegates() {
<span className="text-textTertiary text14Medium ml-1">{total}</span>
)}
</span>

<DelegationSortSelect sort={sort} setSort={setSort} />
</TitleContainer>

<DelegatesLoadable delegates={referendaDelegatesPageData}>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,13 @@
import { useCallback, useState } from "react";
import { useCallback, useEffect, useState } from "react";
import Pagination from "next-common/components/pagination/index";
import { useRouter } from "next/router";

export default function usePaginationComponent(total, pageSize = 10) {
const [page, setPage] = useState(1);
const router = useRouter();
const [page, setPage] = useState(parseInt(router.query.page || 1));
useEffect(() => {
setPage(parseInt(router.query.page || 1));
}, [router.query.page]);

const onPageChange = useCallback((e, page) => {
e.preventDefault();
Expand All @@ -19,5 +24,5 @@ export default function usePaginationComponent(total, pageSize = 10) {
/>
);

return { page, component };
return { page, setPage, component };
}
11 changes: 8 additions & 3 deletions packages/next-common/store/reducers/democracy/delegates.js
Original file line number Diff line number Diff line change
Expand Up @@ -29,12 +29,16 @@ export const {
triggerUpdate: setDemocracyDelegatesTriggerUpdate,
} = democracyDelegatesSlice.actions;

export const fetchDemocracyDelegates =
(page = 1, pageSize = 18) =>
async (dispatch) => {
export const fetchDemocracyDelegates = (sort, page = 1, pageSize = 18) => {
if (sort === "participation") {
sort = "participation_rate";
}

return async (dispatch) => {
try {
dispatch(setDemocracyDelegatesLoading(true));
const { result } = await nextApi.fetch("delegation/democracy/delegates", {
sort,
page,
pageSize,
});
Expand All @@ -43,6 +47,7 @@ export const fetchDemocracyDelegates =
dispatch(setDemocracyDelegatesLoading(false));
}
};
};

export const democracyDelegatesSelector = (state) => state[name].delegates;
export const democracyDelegatesTriggerUpdateSelector = (state) =>
Expand Down
11 changes: 8 additions & 3 deletions packages/next-common/store/reducers/referenda/delegates.js
Original file line number Diff line number Diff line change
Expand Up @@ -29,12 +29,16 @@ export const {
setTriggerUpdate: setReferendaDelegatesTriggerUpdate,
} = referendaDelegatesSlice.actions;

export const fetchReferendaDelegates =
(page = 1, pageSize = 18) =>
async (dispatch) => {
export const fetchReferendaDelegates = (sort, page = 1, pageSize = 18) => {
if (sort === "participation") {
sort = "participation_rate";
}

return async (dispatch) => {
try {
dispatch(setReferendaDelegatesLoading(true));
const { result } = await nextApi.fetch("delegation/referenda/delegates", {
sort,
page,
pageSize,
});
Expand All @@ -43,6 +47,7 @@ export const fetchReferendaDelegates =
dispatch(setReferendaDelegatesLoading(false));
}
};
};

export const referendaDelegatesSelector = (state) => state[name].delegates;
export const referendaDelegatesTriggerUpdateSelector = (state) =>
Expand Down

0 comments on commit ec84f66

Please sign in to comment.