Skip to content

Commit f0f8a18

Browse files
authored
update:一旦 (#45)
* update:一旦 * style:lint
1 parent e6e4bfa commit f0f8a18

File tree

4 files changed

+108
-9
lines changed

4 files changed

+108
-9
lines changed

Diff for: app/pages/MemberPage/index.tsx

+34-3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,38 @@
1-
export default function MemberPage() {
1+
import type { LoaderData } from '@/routes/_main.member.($uuid)';
2+
3+
interface Props {
4+
member: LoaderData;
5+
}
6+
export default function MemberPage({ member }: Props) {
27
return (
3-
<div>
4-
<h1>メンバー画面</h1>
8+
<div className="mx-auto my-10 grid max-w-[600px] grid-cols-1 place-items-center gap-20 p-4 text-left sm:grid-cols-2">
9+
<h2 className="text-lg font-bold">ユーザーID</h2>
10+
<p>{member.member.id}</p>
11+
12+
<h2 className="text-lg font-bold">アイコン</h2>
13+
<img alt="Image" height={100} src={member.base.iconUrl} width={200} />
14+
15+
<h2 className="text-lg font-bold">名前</h2>
16+
<p>{member.base.lastName + member.base.firstName}</p>
17+
18+
<h2 className="text-lg font-bold">フリガナ</h2>
19+
<p>{member.base.lastNameKana + member.base.firstNameKana}</p>
20+
21+
{member.type === 'ACTIVE' && (
22+
<>
23+
<h2 className="text-lg font-bold">学年</h2>
24+
<p>{member.detail.grade}</p>
25+
</>
26+
)}
27+
{member.type === 'ALUMNI' && (
28+
<>
29+
<h2 className="text-lg font-bold">卒業年度</h2>
30+
31+
<div>
32+
{member.detail.graduatedYear}
33+
</div>
34+
</>
35+
)}
536
</div>
637
);
738
}

Diff for: app/routes/_main.member.($uuid).tsx

+72-5
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,83 @@
1+
import type { $Member } from '@/models/member';
2+
import type { $MemberActive } from '@/models/member/active';
3+
import type { $MemberAlumni } from '@/models/member/alumni';
4+
import type { $MemberBase } from '@/models/member/base';
5+
import type { ModelSchemaOf } from '@/types/model';
6+
import type { LoaderFunctionArgs } from '@remix-run/cloudflare';
7+
import { MemberId } from '@/models/member';
18
import ErrorBoundaryPage from '@/pages/ErrorBoundaryPage';
29
import MemberPage from '@/pages/MemberPage';
10+
import { Database } from '@/services/database.server';
311
import { useRouteError } from '@remix-run/react';
12+
import { typedjson, useTypedLoaderData } from 'remix-typedjson';
413

5-
interface LoaderData {}
14+
export type LoaderData = {
15+
member: ModelSchemaOf<$Member>;
16+
base: ModelSchemaOf<$MemberBase>;
17+
} & ({
18+
type: 'ACTIVE';
19+
detail: ModelSchemaOf<$MemberActive>;
20+
} | {
21+
type: 'ALUMNI';
22+
detail: ModelSchemaOf<$MemberAlumni>;
23+
});
624

7-
export function loader(): LoaderData {
8-
return {};
25+
export async function loader({ params, context }: LoaderFunctionArgs) {
26+
const { Member } = context.db.models;
27+
28+
if (params.uuid === undefined) {
29+
throw new Response('uuid が見つかりません', { status: 404 });
30+
}
31+
32+
const memberId = MemberId
33+
.from(params.uuid)
34+
.match(
35+
(id) => id,
36+
() => {
37+
throw new Response('不正な部員 ID です', { status: 400 });
38+
},
39+
);
40+
41+
const member = await Member
42+
.fromWithResolved(memberId)
43+
.andThen((m) => m.buildBySelf())
44+
.match(
45+
(m) => m,
46+
Database.unwrapToResponse,
47+
);
48+
const memberBase = member.dataResolved.member.Base().match(
49+
(m) => m,
50+
Database.unwrapToResponse,
51+
);
52+
53+
if (member.dataResolved.member.detail.type === 'ACTIVE') {
54+
const memberDetail = member.dataResolved.member.detail.Data().match(
55+
(m) => m,
56+
Database.unwrapToResponse,
57+
);
58+
return typedjson({
59+
member: member.data,
60+
base: memberBase.data,
61+
type: 'ACTIVE',
62+
detail: memberDetail.data,
63+
});
64+
}
65+
const memberDetail = member.dataResolved.member.detail.Data().match(
66+
(m) => m,
67+
Database.unwrapToResponse,
68+
);
69+
return typedjson({
70+
member: member.data,
71+
base: memberBase.data,
72+
type: 'ALUMNI',
73+
detail: memberDetail.data,
74+
});
975
}
1076

1177
export default function Index() {
12-
// const {} = useLoaderData<typeof loader>();
13-
return <MemberPage />;
78+
const member = useTypedLoaderData<LoaderData>();
79+
80+
return <MemberPage member={member} />;
1481
}
1582

1683
export function ErrorBoundary() {

Diff for: app/services/session.server.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ export function getSessionStorage(sessionSecret: string) {
1717
path: '/',
1818
sameSite: 'lax',
1919
secrets: [sessionSecret],
20-
secure: process.env['NODE_ENV'] === 'production',
20+
secure: process.env.NODE_ENV === 'production',
2121
},
2222
});
2323

Diff for: tsconfig.json

+1
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
"allowJs": true,
3131
"skipLibCheck": true,
3232
"forceConsistentCasingInFileNames": true,
33+
"noPropertyAccessFromIndexSignature": false,
3334
"noUnusedLocals": false,
3435
"noUnusedParameters": false,
3536
"baseUrl": ".",

0 commit comments

Comments
 (0)