Skip to content

Commit 73a20a6

Browse files
authored
Merge pull request #192 from TaskFlow-CLAP/CLAP-427
CLAP-427 QA 사항 반영 Chloe
2 parents 3f60b18 + 77e7887 commit 73a20a6

File tree

7 files changed

+77
-72
lines changed

7 files changed

+77
-72
lines changed

src/api/auth.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,12 @@ import Cookies from 'js-cookie'
33

44
import { useMemberStore } from '@/stores/member'
55

6-
export const postPasswordEmailSend = async (name: string, email: string) => {
6+
export const postPasswordEmailSend = async (name: string, email: string, id: string) => {
77
const request = {
88
name: name,
99
email: email
1010
}
11-
const response = await axiosInstance.post('/api/new-password', request)
11+
const response = await axiosInstance.post(`/api/new-password?nickname=${id}`, request)
1212
return response.data
1313
}
1414

src/components/common/EditInformation.vue

Lines changed: 35 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
<template>
22
<div class="flex flex-col gap-y-6">
33
<ModalView
4-
:isOpen="isModalVisible"
4+
:isOpen="isSuccessModalVisible"
55
:type="'successType'"
6-
@close="isModalVisible = !isModalVisible">
6+
@close="isSuccessModalVisible = !isSuccessModalVisible">
77
<template #header>정보가 수정되었습니다</template>
88
</ModalView>
99

@@ -17,12 +17,12 @@
1717
</ModalView>
1818

1919
<ModalView
20-
:isOpen="isFailModalVisible"
21-
:type="'failType'"
22-
@click="failModalToggle"
23-
@close="failModalToggle">
24-
<template #header>{{ failHeader }}</template>
25-
<template #body>{{ failBody }}</template>
20+
:isOpen="isModalVisible"
21+
:type="modalType"
22+
@click="modalToggle"
23+
@close="modalToggle">
24+
<template #header>{{ modalHeader }}</template>
25+
<template #body>{{ modalBody }}</template>
2626
</ModalView>
2727

2828
<div class="profile">
@@ -154,12 +154,14 @@ const isInvalid = ref(false)
154154
const isFull = ref(false)
155155
const nameInput = ref<HTMLInputElement | null>(null)
156156
157-
const isModalVisible = ref(false)
157+
const isSuccessModalVisible = ref(false)
158158
const isWarnningModalVisible = ref(false)
159-
const isFailModalVisible = ref(false)
159+
const isModalVisible = ref(false)
160+
161+
const modalType = ref('')
160162
161-
const failHeader = ref('')
162-
const failBody = ref('')
163+
const modalHeader = ref('')
164+
const modalBody = ref('')
163165
164166
const nameError = ref('')
165167
@@ -215,8 +217,8 @@ const warningModalToggle = () => {
215217
isWarnningModalVisible.value = !isWarnningModalVisible.value
216218
}
217219
218-
const failModalToggle = () => {
219-
isFailModalVisible.value = !isFailModalVisible.value
220+
const modalToggle = () => {
221+
isModalVisible.value = !isModalVisible.value
220222
}
221223
222224
const handleFileUpload = (event: Event) => {
@@ -228,23 +230,26 @@ const handleFileUpload = (event: Event) => {
228230
const fileExtension = fileName.split('.').pop()
229231
230232
if (!fileExtension || !ALLOWED_FILE_EXTENSIONS.includes(fileExtension)) {
231-
failHeader.value = '지원하지 않는 파일입니다'
232-
failBody.value = 'jpg, jpeg, png, gif, bmp 파일만 업로드 가능합니다'
233-
failModalToggle()
233+
modalHeader.value = '지원하지 않는 파일입니다'
234+
modalBody.value = 'jpg, jpeg, png, gif, bmp 파일만 업로드 가능합니다'
235+
modalType.value = 'failType'
236+
modalToggle()
234237
return
235238
}
236239
if (!ALLOWED_FILE_EXTENSIONS_IMAGE.includes(file.type)) {
237-
failHeader.value = '파일 타입을 확인해주세요'
238-
failBody.value = '파일 타입과 확장자명이 일치해야합니다'
239-
failModalToggle()
240+
modalHeader.value = '파일 타입을 확인해주세요'
241+
modalBody.value = '파일 타입과 확장자명이 일치해야합니다'
242+
modalType.value = 'failType'
243+
modalToggle()
240244
return
241245
}
242246
243247
const newFiles = Array.from(target.files).filter(file => file.size <= 5 * 1024 * 1024)
244248
if (newFiles.length !== target.files.length) {
245-
failHeader.value = '이미지 용량을 확인해주세요'
246-
failBody.value = '이미지 용량은 5mb까지 가능합니다'
247-
failModalToggle()
249+
modalHeader.value = '이미지 용량을 확인해주세요'
250+
modalBody.value = '이미지 용량은 5mb까지 가능합니다'
251+
modalType.value = 'failType'
252+
modalToggle()
248253
return
249254
}
250255
@@ -261,6 +266,11 @@ const handleFileDelete = () => {
261266
}
262267
263268
const handleSubmit = async () => {
269+
modalHeader.value = '정보 수정 중 입니다...'
270+
modalBody.value = '잠시만 기다려주세요'
271+
modalType.value = 'loadingType'
272+
isModalVisible.value = true
273+
264274
if (isInvalid.value == false && isFull.value == false) {
265275
const formData = new FormData()
266276
const memberInfo = {
@@ -281,7 +291,8 @@ const handleSubmit = async () => {
281291
}
282292
283293
await patchEditInfo(formData)
284-
isModalVisible.value = true
294+
isModalVisible.value = false
295+
isSuccessModalVisible.value = true
285296
await memberStore.updateMemberInfoWithToken()
286297
}
287298
}

src/components/task-detail/TaskStatusList.vue

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ const isModalVisible = ref({
5555
fail: false,
5656
success: false
5757
})
58+
const backModal = ref(false)
5859
5960
const emit = defineEmits(['update:status'])
6061
const queryClient = useQueryClient()
@@ -74,7 +75,7 @@ const toggleModal = (key: keyof typeof isModalVisible.value) => {
7475
7576
const closeModal = () => {
7677
const prevSuccess = isModalVisible.value.success
77-
isModalVisible.value = { reject: false, fail: false, success: false }
78+
isModalVisible.value = { reject: backModal.value ? true : false, fail: false, success: false }
7879
if (prevSuccess) queryClient.invalidateQueries({ queryKey: ['requested'] })
7980
}
8081
@@ -92,8 +93,11 @@ const rejectRequest = async () => {
9293
if (rejectReason.value.length === 0) {
9394
toggleModal('fail')
9495
modalError.value = '종료 사유를 입력해주세요'
96+
backModal.value = true
9597
return
9698
}
99+
100+
backModal.value = false
97101
await axiosInstance.patch(`/api/tasks/${taskId}/terminate`, { reason: rejectReason.value })
98102
toggleModal('success')
99103
emit('update:status', 'TERMINATED')

src/utils/axios.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,9 +49,16 @@ const setInterceptors = (instance: AxiosInstance) => {
4949
} else if (error.response) {
5050
switch (error.response.status) {
5151
case 401:
52-
if (error.response.data === 'AUTH_003') {
52+
if (error.response.data === 'AUTH_016') {
53+
setError('일치하는 정보가 없습니다', '아이디와 비밀번호를 다시 확인해주세요')
54+
} else if (error.response.data === 'AUTH_003') {
5355
Cookies.remove('refreshToken')
5456
setError('유효하지 않은 토큰입니다', '다시 로그인 해주세요', redirectToLogin)
57+
} else if (error.response.data === 'AUTH_015') {
58+
setError(
59+
'정지된 계정입니다',
60+
'로그인 시도 5회 초과로 계정이 정지되었습니다\n30분 후 다시 시도해주세요'
61+
)
5562
}
5663
break
5764
case 403: {

src/views/LoginView.vue

Lines changed: 18 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -77,49 +77,25 @@ const closeModal = () => {
7777
}
7878
7979
const handleLogin = async () => {
80-
try {
81-
const name = id.value.toString()
82-
const res = await postLogin(name, password.value)
83-
const role = await memberStore.updateMemberInfoWithToken()
80+
const name = id.value.toString()
81+
const res = await postLogin(name, password.value)
82+
const role = await memberStore.updateMemberInfoWithToken()
8483
85-
if (!Cookies.get('refreshToken')) {
86-
router.push('/pw-change')
87-
} else if (res) {
88-
switch (role) {
89-
case 'ROLE_ADMIN':
90-
router.push('/member-management')
91-
break
92-
case 'ROLE_MANAGER':
93-
router.push('my-task')
94-
break
95-
case 'ROLE_USER':
96-
router.push('/my-request')
97-
break
98-
default:
99-
router.push('/')
100-
}
101-
}
102-
} catch (error) {
103-
if (axios.isAxiosError(error)) {
104-
switch (error.response?.status) {
105-
case 401:
106-
if (error.response?.data == 'AUTH_015') {
107-
messageHeader.value = '정지된 계정입니다'
108-
messageBody.value =
109-
'로그인 시도 5회 초과로 계정이 정지되었습니다\n30분 후 다시 시도해주세요'
110-
} else {
111-
messageHeader.value = '일치하는 정보가 없습니다'
112-
messageBody.value = '아이디와 비밀번호를 다시 확인해주세요'
113-
}
114-
isModalVisible.value = !isModalVisible.value
115-
break
116-
117-
case 404:
118-
isModalVisible.value = !isModalVisible.value
119-
messageHeader.value = '활성화 되어있지 않은 계정입니다'
120-
messageBody.value = '접근 상태를 다시 확인하여주세요'
121-
break
122-
}
84+
if (!Cookies.get('refreshToken')) {
85+
router.push('/pw-change')
86+
} else if (res) {
87+
switch (role) {
88+
case 'ROLE_ADMIN':
89+
router.push('/member-management')
90+
break
91+
case 'ROLE_MANAGER':
92+
router.push('my-task')
93+
break
94+
case 'ROLE_USER':
95+
router.push('/my-request')
96+
break
97+
default:
98+
router.push('/')
12399
}
124100
}
125101
}

src/views/PwChangeEmail.vue

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,8 @@ const closeFailModal = () => {
8585
}
8686
8787
const handleCheck = async () => {
88-
await postPasswordEmailSend(name.value, email.value)
88+
const id = email.value.split('@')[0]
89+
await postPasswordEmailSend(name.value, email.value, id)
8990
isModalVisible.value = !isModalVisible.value
9091
}
9192
</script>

src/views/PwChangeView.vue

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,11 @@
2121
<TitleContainer
2222
v-else
2323
:title="'비밀번호\n재설정'"
24-
content="새로운 비밀번호를 입력해주세요" />
24+
:content="
25+
!firstVisit
26+
? '새로운 비밀번호를 입력해주세요\n보안을 위해 링크는 5분 후 만료됩니다'
27+
: '새로운 비밀번호를 입력해주세요'
28+
" />
2529
</div>
2630
<form
2731
v-if="!isConfirmed"
@@ -124,6 +128,8 @@ const messageBody = ref('')
124128
const pw = ref('')
125129
const isConfirmed = ref(false)
126130
131+
const firstVisit = ref(Cookies.get('accessToken') ? true : false)
132+
127133
const handleCheck = async () => {
128134
await postPasswordCheck(pw.value)
129135
isConfirmed.value = true

0 commit comments

Comments
 (0)