Skip to content

Commit

Permalink
✨ バッチですべてのメンバーを取得する機能
Browse files Browse the repository at this point in the history
  • Loading branch information
wappon28dev committed Sep 11, 2024
1 parent 4dea72f commit 1a06219
Show file tree
Hide file tree
Showing 6 changed files with 57 additions and 14 deletions.
51 changes: 45 additions & 6 deletions src/hooks/teams.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
/* eslint-disable no-console */

import { useStore } from "@nanostores/react";
import { match } from "ts-pattern";
import { A } from "@/lib/consts";
import { A, range } from "@/lib/consts";
import { getEsaClient } from "@/lib/services/esa";
import { $selectedTeamName } from "@/lib/stores/teams";
import {
Expand Down Expand Up @@ -50,18 +52,54 @@ export function useTeam() {
.with(A.Success, ({ data }) => data)
.otherwise(handleError);

const fetchMembers = async (): Promise<
const fetchMembers = async (
/**
* 1 度に取得するメンバー数
*/
prePage?: number,
/**
* ページ番号
*/
page: number = 1,
): Promise<
InferResponseType<"/teams/{team_name}/members", "get">["members"]
> =>
await match(
await getEsaClient().GET(
"/teams/{team_name}/members",
paramsWithTeamName,
),
await getEsaClient().GET("/teams/{team_name}/members", {
...paramsWithTeamName,
params: {
...paramsWithTeamName.params,
query: { page, per_page: prePage },
},
}),
)
.with(A.Success, ({ data }) => data.members)
.otherwise(handleError);

const fetchMembersAll = async (): Promise<
InferResponseType<"/teams/{team_name}/members", "get">["members"]
> => {
const PER_PAGE_MAX = 100;

const stats = await fetchStats();
console.log(`[fetchMembersAll] Num of members: ${stats.members}`);

const pageCount = Math.ceil(stats.members / 100);
const membersPromises = range(pageCount, 1).map(
// eslint-disable-next-line @typescript-eslint/promise-function-async
(pageAt, _) => {
const start = PER_PAGE_MAX * (pageAt - 1);
const end = Math.min(PER_PAGE_MAX * pageAt, stats.members);
console.log(
`[fetchMembersAll] Fetching members as a batch... ${pageAt}/${pageCount}: ${start}..${end}`,
);
return fetchMembers(PER_PAGE_MAX, pageAt);
},
);

return (await Promise.all(membersPromises)).flat();
};

const createNewPost = async (
postBody: InferRequestBodyType<"/teams/{team_name}/posts", "post">["post"],
): Promise<InferResponseType<"/teams/{team_name}/posts", "post", 201>> =>
Expand Down Expand Up @@ -162,6 +200,7 @@ export function useTeam() {
fetchStats,
fetchAbout,
fetchMembers,
fetchMembersAll,
fetchPostByPostId,
fetchPostsByCategory,
fetchEmojis,
Expand Down
4 changes: 4 additions & 0 deletions src/lib/consts.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,3 +35,7 @@ export function getLocalStorageKey(key: string, trailingColon = false): string {
}

export const DB_VERSION = "2";

export function range(size: number, startAt: number = 0): readonly number[] {
return [...Array(size).keys()].map((i) => i + startAt);
}
4 changes: 2 additions & 2 deletions src/pages/achievements/[id]/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,12 @@ const BoxStyle = styled(Box)`

export default function Page(): ReactElement {
const { id } = useParams();
const { fetchMembers } = useTeam();
const { fetchMembersAll } = useTeam();
const { fetch: fetchAchievements } = useAchievements(useTeam);
const { fetch: fetchUnlockedAchievements } = useUnlockedAchievements(useTeam);
const swrAMU = useSWRImmutable("amu", async () => ({
achievements: await fetchAchievements(),
members: await fetchMembers(),
members: await fetchMembersAll(),
unlockedAchievements: await fetchUnlockedAchievements(),
}));

Expand Down
4 changes: 2 additions & 2 deletions src/pages/members/[id]/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -22,12 +22,12 @@ const BoxStyle = styled(Box)`

export default function Page(): ReactElement {
const { id } = useParams();
const { fetchMembers } = useTeam();
const { fetchMembersAll } = useTeam();
const { fetch: fetchAchievements } = useAchievements(useTeam);
const { fetch: fetchUnlockedAchievements } = useUnlockedAchievements(useTeam);
const swrAMU = useSWRImmutable("amu", async () => ({
achievements: await fetchAchievements(),
members: await fetchMembers(),
members: await fetchMembersAll(),
unlockedAchievements: await fetchUnlockedAchievements(),
}));

Expand Down
4 changes: 2 additions & 2 deletions src/pages/members/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,10 @@ const BoxStyle = styled(Box)`
`;

export default function Page(): ReactElement {
const { fetchMembers } = useTeam();
const { fetchMembersAll } = useTeam();
const { fetch: fetchUnlockedAchievements } = useUnlockedAchievements(useTeam);
const swrMU = useSWRImmutable("mu", async () => ({
members: await fetchMembers(),
members: await fetchMembersAll(),
unlockedAchievements: await fetchUnlockedAchievements(),
}));

Expand Down
4 changes: 2 additions & 2 deletions src/pages/ranking/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -48,12 +48,12 @@ const LogRecentUnlockedStyle = styled.div`
`;

export default function Page(): ReactElement {
const { fetchMembers } = useTeam();
const { fetchMembersAll } = useTeam();
const { fetch: fetchAchievements } = useAchievements(useTeam);
const { fetch: fetchUnlockedAchievements } = useUnlockedAchievements(useTeam);
const swrAMU = useSWRImmutable("amu", async () => ({
achievements: await fetchAchievements(),
members: await fetchMembers(),
members: await fetchMembersAll(),
unlockedAchievements: await fetchUnlockedAchievements(),
}));

Expand Down

0 comments on commit 1a06219

Please sign in to comment.