Skip to content

Commit f8063c2

Browse files
Merge pull request #162 from Nekoya3/feature/150-login-classLogin-Flow
Loginから、クラス登録、クラス選択、editまで作成
2 parents 5d63b45 + 4c708b7 commit f8063c2

File tree

10 files changed

+401
-168
lines changed

10 files changed

+401
-168
lines changed

nuxt.config.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ export default {
4848
/*
4949
** Customize the progress-bar color
5050
*/
51-
loading: { color: '#fff' },
51+
loading: { color: '#000000' },
5252
/*
5353
** Global CSS
5454
*/

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@
4545
"date-fns": "^2.14.0",
4646
"dayjs": "^1.8.26",
4747
"express": "^4.17.1",
48-
"firebase": "7.14.6",
48+
"firebase": "7.15.1",
4949
"firebase-admin": "^8.12.0",
5050
"js-cookie": "^2.2.1",
5151
"jwt-decode": "^2.2.0",

src/layouts/protected.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ type LocalData = {
104104
}
105105
106106
export default Vue.extend({
107-
// middleware: 'authenticated',
107+
middleware: ['authenticated', 'checkClassData'],
108108
components: {
109109
CalendarBar,
110110
BaseDialog,

src/pages/account/login.vue

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,8 +92,9 @@ export default Vue.extend({
9292
.auth()
9393
.signInWithEmailAndPassword(this.email, this.password)
9494
.then(() => {
95-
vxm.user.login()
96-
this.$router.push('/edit')
95+
vxm.user.login().then(() => {
96+
this.$router.push('/user/classlist')
97+
})
9798
})
9899
.catch(() => {
99100
this.loading = false

src/pages/user/classlist.vue

Lines changed: 34 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,21 @@
11
<template>
22
<bottom-sheet-layer title="クラス一覧" title-en="CLASS LIST" fullscreen>
33
<template v-slot:LayerContents>
4-
<v-list>
5-
<v-radio-group v-model="selectedItem">
4+
<h1 v-if="!items || items.length < 1">
5+
編集可能なクラスがありません。クラスの登録を行ってください
6+
</h1>
7+
<v-list v-else>
8+
<v-radio-group v-model="selectedClassId">
69
<v-list-item
710
v-for="(item, index) in items"
811
:key="index"
912
class="ClassList-Item"
1013
>
11-
<v-radio :value="item.num">
14+
<v-radio :value="item.classId">
1215
<template v-slot:label>
13-
<span class="ClassList-Label">{{ item.name }}</span>
16+
<span class="ClassList-Label">
17+
{{ item.schoolName }} {{ item.className }}
18+
</span>
1419
</template>
1520
</v-radio>
1621
</v-list-item>
@@ -22,8 +27,14 @@
2227
theme="primary"
2328
text="選択クラスでログインする"
2429
class="ClassList-Button"
30+
:is-loading="loading"
31+
@click="doSelectClassLogin"
32+
/>
33+
<action-button
34+
text="クラスを登録する"
35+
theme="secondary"
36+
@click="$router.push('/user/registerClass')"
2537
/>
26-
<action-button theme="secondary" text="クラスを登録する" />
2738
</template>
2839
</bottom-sheet-layer>
2940
</template>
@@ -32,29 +43,34 @@
3243
import Vue from 'vue'
3344
import BottomSheetLayer from '@/components/BottomSheetLayer.vue'
3445
import ActionButton from '@/components/ActionButton.vue'
46+
import { vxm } from '@/store'
3547
3648
type DataType = {
3749
items: Object[]
38-
selectedItem: number
50+
selectedClassId: string
51+
loading: boolean
3952
}
4053
4154
export default Vue.extend({
4255
components: { BottomSheetLayer, ActionButton },
4356
layout: 'background',
57+
middleware: 'authenticated',
4458
data(): DataType {
4559
return {
46-
items: [
47-
{ name: 'ほげほげ学校1年2組', num: 1 },
48-
{ name: 'ほげほげ学校1年2組', num: 2 },
49-
{ name: 'ほげほげ学校1年2組', num: 3 },
50-
{ name: 'ほげほげ学校1年2組', num: 4 },
51-
{ name: 'ほげほげ学校1年2組', num: 5 },
52-
{ name: 'ほげほげ学校1年2組', num: 6 },
53-
{ name: 'ほげほげ学校1年2組', num: 7 },
54-
{ name: 'ほげほげ学校1年2組', num: 8 },
55-
{ name: 'ほげほげ学校1年2組', num: 9 }
56-
],
57-
selectedItem: 1
60+
items: vxm.user.allowAccess,
61+
selectedClassId: '',
62+
loading: false
63+
}
64+
},
65+
methods: {
66+
async doSelectClassLogin() {
67+
this.loading = true
68+
try {
69+
await vxm.classData.loadClassData(this.selectedClassId)
70+
await this.$router.push('/edit')
71+
} catch {
72+
this.loading = false
73+
}
5874
}
5975
}
6076
})

src/pages/user/registerClass.vue

Lines changed: 75 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,89 @@
11
<template>
2-
<bottom-sheet-layer title="クラス登録" title-en="STEP 2">
3-
<template v-slot:LayerContents>
4-
<dl class="RegisterClass-List">
5-
<dt class="RegisterClass-ItemTitle">学校名</dt>
6-
<dd>
7-
<input-field label="school" placeholder="おひさま小学校" require />
8-
</dd>
9-
<dt class="RegisterClass-ItemTitle">クラス名</dt>
10-
<dd>
11-
<input-field label="class" placeholder="2年B組" require />
12-
<span class="RegisterClass-ItemNote">
13-
クラス名は表示されますのでご注意ください
14-
</span>
15-
</dd>
16-
</dl>
17-
</template>
18-
<template v-slot:LayerFooter>
19-
<action-button theme="primary" text="登録を完了する" />
20-
</template>
21-
</bottom-sheet-layer>
2+
<div>
3+
<bottom-sheet-layer title="クラス登録" title-en="STEP 2">
4+
<template v-slot:LayerContents>
5+
<dl class="RegisterClass-List">
6+
<dt class="RegisterClass-ItemTitle">学校名</dt>
7+
<dd>
8+
<input-field
9+
v-model="schoolName"
10+
label="school"
11+
placeholder="おひさま小学校"
12+
require
13+
/>
14+
</dd>
15+
<dt class="RegisterClass-ItemTitle">クラス名</dt>
16+
<dd>
17+
<input-field
18+
v-model="className"
19+
label="class"
20+
placeholder="2年B組"
21+
require
22+
/>
23+
<span class="RegisterClass-ItemNote">
24+
クラス名は表示されますのでご注意ください
25+
</span>
26+
</dd>
27+
</dl>
28+
</template>
29+
<template v-slot:LayerFooter>
30+
<action-button
31+
:is-disabled="disableButton"
32+
:is-loading="loading"
33+
text="登録を完了する"
34+
theme="primary"
35+
@click="doRegister"
36+
/>
37+
</template>
38+
</bottom-sheet-layer>
39+
<v-snackbar v-model="error" :timeout="5000" absolute color="#C01B61" top>
40+
クラスの追加に失敗しました。再度登録をお願いします。
41+
</v-snackbar>
42+
</div>
2243
</template>
2344

2445
<script lang="ts">
2546
import Vue from 'vue'
2647
import BottomSheetLayer from '@/components/BottomSheetLayer.vue'
2748
import ActionButton from '@/components/ActionButton.vue'
2849
import InputField from '@/components/InputField.vue'
50+
import { vxm } from '@/store'
2951
3052
export default Vue.extend({
3153
components: { BottomSheetLayer, ActionButton, InputField },
32-
layout: 'background'
54+
layout: 'background',
55+
middleware: 'authenticated',
56+
data() {
57+
return {
58+
schoolName: '',
59+
className: '',
60+
loading: false,
61+
error: false
62+
}
63+
},
64+
computed: {
65+
disableButton(): boolean {
66+
return !(this.schoolName && this.className)
67+
}
68+
},
69+
methods: {
70+
doRegister() {
71+
this.loading = true
72+
vxm.classData
73+
.registerClass({
74+
schoolName: this.schoolName,
75+
className: this.className
76+
})
77+
.then(() => {
78+
this.loading = false
79+
this.$router.push('/user/registered')
80+
})
81+
.catch(() => {
82+
this.error = true
83+
this.loading = false
84+
})
85+
}
86+
}
3387
})
3488
</script>
3589

src/pages/user/registered.vue

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,17 @@
66
mdi-clipboard-account
77
</v-icon>
88
<p class="Registered-Text">あなたのクラスIDです</p>
9-
<div class="Registered-Id">ほげほげほげ</div>
9+
<div class="Registered-Id">{{ classId }}</div>
1010
</div>
1111
</template>
1212
<template v-slot:LayerFooter>
1313
<action-button
1414
theme="primary"
1515
text="授業を追加・編集する"
1616
class="Registered-Button"
17+
@click="$router.push('/edit')"
1718
/>
18-
<action-button theme="secondary" text="クラスIDを共有する" />
19+
<!-- <action-button theme="secondary" text="クラスIDを共有する" /> -->
1920
</template>
2021
</bottom-sheet-layer>
2122
</template>
@@ -24,10 +25,17 @@
2425
import Vue from 'vue'
2526
import BottomSheetLayer from '@/components/BottomSheetLayer.vue'
2627
import ActionButton from '@/components/ActionButton.vue'
28+
import { vxm } from '@/store'
2729
2830
export default Vue.extend({
2931
components: { BottomSheetLayer, ActionButton },
30-
layout: 'background'
32+
layout: 'background',
33+
middleware: 'authenticated',
34+
data() {
35+
return {
36+
classId: vxm.classData.classId
37+
}
38+
}
3139
})
3240
</script>
3341

0 commit comments

Comments
 (0)