Skip to content

Commit

Permalink
Merge pull request #153 from /issues/152
Browse files Browse the repository at this point in the history
member詳細画面 引数対応
  • Loading branch information
nasubi916 authored Sep 6, 2024
2 parents 5e18662 + b187ce1 commit 4b9226b
Show file tree
Hide file tree
Showing 3 changed files with 115 additions and 141 deletions.
20 changes: 15 additions & 5 deletions src/components/member/Info.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,17 @@ const RankingStyle = styled(Flex)`
border-radius: 20px;
`;

export function Info(): ReactElement {
export function Info({
name,
ranking,
point,
rateOfUnlocked,
}: {
name: string;
ranking: number;
point: number;
rateOfUnlocked: number;
}): ReactElement {
return (
<InfoBox direction="column">
<Flex align="center" direction="column">
Expand All @@ -50,7 +60,7 @@ export function Info(): ReactElement {
/>

<Text mt="1rem" size="8" weight="bold">
メンバー
{name}
</Text>
</Flex>

Expand All @@ -59,9 +69,9 @@ export function Info(): ReactElement {
順位
</Text>
<RankingStyle mt="1rem">
<Text>31位</Text>
<Text>{ranking}</Text>
<Text color="gray" ml="1rem" size="6">
100pt
{point}pt
</Text>
</RankingStyle>
</Flex>
Expand All @@ -70,7 +80,7 @@ export function Info(): ReactElement {
<Text ml="20px" weight="bold">
実績解除率
</Text>
<PercentageUnlocked mt="1rem">50%</PercentageUnlocked>
<PercentageUnlocked mt="1rem">{rateOfUnlocked}%</PercentageUnlocked>
</Flex>
</InfoBox>
);
Expand Down
84 changes: 0 additions & 84 deletions src/components/member/UnlockedCard.tsx

This file was deleted.

152 changes: 100 additions & 52 deletions src/pages/members/[id]/index.tsx
Original file line number Diff line number Diff line change
@@ -1,58 +1,106 @@
// import { type ReactElement } from "react";
// import useSWRImmutable from "swr/immutable";
// import { match } from "ts-pattern";
// import { ErrorScreen } from "@/components/ErrorScreen";
// import { useTeam } from "@/hooks/teams";
// import { S } from "@/lib/consts";
// import { handleSWRError } from "@/lib/utils/swr";
// import { useParams } from "@/router";

// export default function Page(): ReactElement {
// const { id } = useParams("/members/:id");
// const { fetchMembers } = useTeam();
// const swrMembers = useSWRImmutable("members", fetchMembers);

// return match(swrMembers)
// .with(S.Loading, () => <p>Loading...</p>)
// .with(S.Success, ({ data }) => (
// <div>
// {data.map((d) => {
// if (d.email === id) {
// return (
// <div key={d.email}>
// <h1>name: {d.name}</h1>
// <p>screen_name: {d.screen_name}</p>
// <p>email: {d.email}</p>
// <p>myself: {d.myself}</p>
// <p>createdAt: {String(d.joined_at)}</p>
// <p>posts_count: {d.posts_count}</p>
// <p>last_accessed_at: {d.last_accessed_at}</p>
// <p>role: {d.role}</p>
// <p>icon: {d.icon}</p>
// </div>
// );
// }
// return null;
// })}
// </div>
// ))
// .otherwise(({ data, error }) => (
// <ErrorScreen error={handleSWRError(data, error)} />
// ));
// }

import { Flex } from "@radix-ui/themes";
import { Box, Flex } from "@radix-ui/themes";
import { type ReactElement } from "react";
import { useParams } from "react-router-dom";
import styled from "styled-components";
import useSWRImmutable from "swr/immutable";
import { match } from "ts-pattern";
import { ErrorScreen } from "@/components/ErrorScreen";
import { AchievementCard } from "@/components/achievements/Card";
import { Info } from "@/components/member/Info";
import { UnlockedCard } from "@/components/member/UnlockedCard";
import { useAchievements } from "@/hooks/db/achievements";
import { useUnlockedAchievements } from "@/hooks/db/unlocked-achievements";
import { useTeam } from "@/hooks/teams";
import { S } from "@/lib/consts";
import {
fetchMembersAndUnlockedAchievementsAndAchievements,
getUnlockedAchievementsFromMember,
} from "@/lib/utils/fetchers";
import { handleSWRError } from "@/lib/utils/swr";

const BoxStyle = styled(Box)`
margin: 0 auto;
height: 80vh;
overflow: scroll;
`;

export default function Page(): ReactElement {
return (
<Flex>
<Info />
<Flex overflow="scroll" width="100%">
<UnlockedCard />
</Flex>
</Flex>
const { id } = useParams();
const { fetchMembers } = useTeam();
const { fetch: fetchAchievements } = useAchievements(useTeam);
const { fetch: fetchUnlockedAchievements } = useUnlockedAchievements(useTeam);
const swrMembersAndUnlockedAchievementsAndAchievements = useSWRImmutable(
"membersAndUnlockedAchievementsAndAchievements",
async () =>
await fetchMembersAndUnlockedAchievementsAndAchievements(
fetchMembers,
fetchAchievements,
fetchUnlockedAchievements,
),
);

return match(swrMembersAndUnlockedAchievementsAndAchievements)
.with(S.Loading, () => <p>Loading...</p>)
.with(
S.Success,
({ data: { members, unlockedAchievements, achievements } }) => (
<div>
{members.map((m) => {
if (m.email === id) {
const point = unlockedAchievements.filter(
(u) => u.memberEmail === m.email,
).length;
const rateOfUnlocked =
Math.round((point / achievements.length) * 10) / 10;

const thisMemberUnlockedAchievements = unlockedAchievements
.filter((u) => u.memberEmail === m.email)
.map((u) => achievements.find((a) => a.id === u.achievementID));

const rankedMembers = members
.map((l) => ({
...l,
point: getUnlockedAchievementsFromMember(
l,
unlockedAchievements,
).length,
}))
.sort((a, b) => b.point - a.point);

const ranking =
rankedMembers.findIndex((member) => member.email === m.email) +
1;

return (
<Flex key={m.email} gap="9">
<Info
name={m.name}
point={point}
ranking={ranking}
rateOfUnlocked={rateOfUnlocked}
/>
<div>
<Box mt="20vh" />
<BoxStyle>
{thisMemberUnlockedAchievements.map((achievement) => {
if (achievement === undefined) return null;
return (
<AchievementCard
key={achievement.id}
achievement={achievement}
/>
);
})}
</BoxStyle>
</div>
</Flex>
);
}
return null;
})}
</div>
),
)
.otherwise(({ data, error }) => (
<ErrorScreen error={handleSWRError(data, error)} />
));
}

0 comments on commit 4b9226b

Please sign in to comment.