Skip to content

Commit 01feaff

Browse files
committed
feat: /membership にユーザーの状態選択およびログイン・メールアドレス認証のプロトタイプを実装
1 parent a3c69f5 commit 01feaff

10 files changed

+130
-21
lines changed

src/composable/parseRouteQuery.ts

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import type { LocationQueryValue } from 'vue-router'
2+
3+
export const parseRouteQuery = (query: LocationQueryValue | LocationQueryValue[]) => {
4+
if (Array.isArray(query)) {
5+
return query.filter((v): v is string => typeof v === 'string')
6+
} else {
7+
return typeof query === 'string' ? [query] : ['']
8+
}
9+
}

src/pages/login/LoginPage.vue

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<script setup lang="ts">
2+
import { parseRouteQuery } from '@/composable/parseRouteQuery'
3+
import { useRoute } from 'vue-router'
4+
5+
const route = useRoute()
6+
const redirectParams = parseRouteQuery(route.query.redirect)
7+
</script>
8+
9+
<template>
10+
<RouterLink :to="redirectParams[0]"> ログインする </RouterLink>
11+
</template>

src/pages/membership/MemberShipPageUserTypeSelect.vue

-18
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<script setup lang="ts">
2+
import MemberShipPageUserTypeSelectorButton from './MemberShipPageUserTypeSelectorButton.vue'
3+
</script>
4+
5+
<template>
6+
<div class="flex gap-2">
7+
<MemberShipPageUserTypeSelectorButton userType="new">
8+
新規入部
9+
</MemberShipPageUserTypeSelectorButton>
10+
<MemberShipPageUserTypeSelectorButton userType="rejoin">
11+
再入部
12+
</MemberShipPageUserTypeSelectorButton>
13+
<MemberShipPageUserTypeSelectorButton userType="active">
14+
継続所属
15+
</MemberShipPageUserTypeSelectorButton>
16+
</div>
17+
</template>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<script setup lang="ts">
2+
import { useRoute, useRouter } from 'vue-router'
3+
import type { UserType } from './types/userType'
4+
5+
const { userType } = defineProps<{ userType: UserType }>()
6+
7+
const route = useRoute()
8+
const router = useRouter()
9+
const replaceUserTypeQuery = (userType: UserType) => {
10+
const newQuery = { ...route.query, user_type: userType }
11+
router.replace({ query: newQuery })
12+
}
13+
</script>
14+
15+
<template>
16+
<button @click="replaceUserTypeQuery(userType)">
17+
<slot></slot>
18+
</button>
19+
</template>
+27-3
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,38 @@
11
<script setup lang="ts">
2+
import { computed, ref } from 'vue'
23
import { useRoute } from 'vue-router'
34
4-
import MemberShipPageUserTypeSelect from './MemberShipPageUserTypeSelect.vue'
5+
import MemberShipPageVerifyEmailLink from '@/pages/membership/MembershipPageVerifyEmailLink.vue'
6+
import MemberShipPageUserTypeSelector from './MemberShipPageUserTypeSelector.vue'
7+
import MembershipPageLoginLink from './MembershipPageLoginLink.vue'
58
69
const route = useRoute()
10+
11+
const isLoggedIn = ref(false)
12+
const hasIsctAddress = ref(false)
13+
const hasCustomerObjectOnTraqId = ref(false)
14+
const isUserTypeActive = computed(() => route.query.user_type === 'active')
715
</script>
816

917
<template>
1018
<div class="flex flex-col gap-2">
11-
<MemberShipPageUserTypeSelect />
12-
<div>route.query.user_type: {{ route.query.user_type }}</div>
19+
<div v-if="isLoggedIn">
20+
<div v-if="!hasCustomerObjectOnTraqId && !hasIsctAddress">
21+
isct アドレスの認証が必要です
22+
<MemberShipPageVerifyEmailLink />
23+
</div>
24+
<div v-else>請求書情報入力へ</div>
25+
</div>
26+
<div v-else>
27+
<MemberShipPageUserTypeSelector />
28+
<div v-if="isUserTypeActive">
29+
ログインが必要です
30+
<MembershipPageLoginLink />
31+
</div>
32+
<div v-else-if="!hasIsctAddress">
33+
isct アドレスの認証が必要です <MemberShipPageVerifyEmailLink />
34+
</div>
35+
<div v-else>請求書情報入力へ</div>
36+
</div>
1337
</div>
1438
</template>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<script setup lang="ts">
2+
import { useRoute } from 'vue-router'
3+
4+
const route = useRoute()
5+
const getLoginPageURL = {
6+
path: '/login',
7+
query: { redirect: route.fullPath },
8+
}
9+
</script>
10+
11+
<template>
12+
<RouterLink :to="getLoginPageURL">ログインへ</RouterLink>
13+
</template>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<script setup lang="ts">
2+
import { useRoute } from 'vue-router'
3+
4+
const route = useRoute()
5+
const getVerifyEmailPageURL = {
6+
path: '/verify-email',
7+
query: { redirect: route.fullPath },
8+
}
9+
</script>
10+
11+
<template>
12+
<RouterLink :to="getVerifyEmailPageURL">isct アドレスの認証へ</RouterLink>
13+
</template>
+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<script setup lang="ts">
2+
import { parseRouteQuery } from '@/composable/parseRouteQuery'
3+
import { useRoute } from 'vue-router'
4+
5+
const route = useRoute()
6+
const redirectParams = parseRouteQuery(route.query.redirect)
7+
</script>
8+
9+
<template>
10+
<RouterLink :to="redirectParams[0]"> isct アドレスを認証する </RouterLink>
11+
</template>

src/router/index.ts

+10
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,16 @@ const router = createRouter({
1717
// which is lazy-loaded when the route is visited.
1818
component: () => import('@/pages/membership/MembershipPage.vue'),
1919
},
20+
{
21+
path: '/verify-email',
22+
name: 'verify-email',
23+
component: () => import('@/pages/verify-email/VerifyEmailPage.vue'),
24+
},
25+
{
26+
path: '/login',
27+
name: 'login',
28+
component: () => import('@/pages/login/LoginPage.vue'),
29+
},
2030
],
2131
})
2232

0 commit comments

Comments
 (0)