Showing
3 changed files
with
79 additions
and
20 deletions
| 1 | -import React, { useState, useEffect } from "react"; | 1 | +import React, { useState, useEffect, useRef } from "react"; |
| 2 | import { RouteComponentProps } from 'react-router-dom'; | 2 | import { RouteComponentProps } from 'react-router-dom'; |
| 3 | 3 | ||
| 4 | import { useRecoilValue, useRecoilState } from "recoil"; | 4 | import { useRecoilValue, useRecoilState } from "recoil"; |
| ... | @@ -26,7 +26,6 @@ const RegisterContainer = (props : RegisterProps) => { | ... | @@ -26,7 +26,6 @@ const RegisterContainer = (props : RegisterProps) => { |
| 26 | password : '', | 26 | password : '', |
| 27 | passwordCheck : '', | 27 | passwordCheck : '', |
| 28 | info : { | 28 | info : { |
| 29 | - doctorLicense : File, | ||
| 30 | hospitalNm : '', | 29 | hospitalNm : '', |
| 31 | hospitalAddr : '', | 30 | hospitalAddr : '', |
| 32 | contact : '', | 31 | contact : '', |
| ... | @@ -34,6 +33,8 @@ const RegisterContainer = (props : RegisterProps) => { | ... | @@ -34,6 +33,8 @@ const RegisterContainer = (props : RegisterProps) => { |
| 34 | doctorNm : '', | 33 | doctorNm : '', |
| 35 | }, | 34 | }, |
| 36 | }); | 35 | }); |
| 36 | + const [doctorInfoFile, setDoctorInfoFile] = useState<FileList | null>(null); | ||
| 37 | + const doctorInfoFile_Select = useRef(null); | ||
| 37 | 38 | ||
| 38 | const [page, setPage] = useState<number>(1); | 39 | const [page, setPage] = useState<number>(1); |
| 39 | const [error, setError] = useState<string | null>(null); | 40 | const [error, setError] = useState<string | null>(null); |
| ... | @@ -79,9 +80,8 @@ const RegisterContainer = (props : RegisterProps) => { | ... | @@ -79,9 +80,8 @@ const RegisterContainer = (props : RegisterProps) => { |
| 79 | setError('비밀번호가 일치하지 않습니다.') | 80 | setError('비밀번호가 일치하지 않습니다.') |
| 80 | } else setError(null); | 81 | } else setError(null); |
| 81 | } else if(page === 2) { | 82 | } else if(page === 2) { |
| 82 | - if(!registerForm.info.doctorLicense.length && | 83 | + if(!doctorInfoFile) { |
| 83 | - !validator.isAlphanumeric(registerForm.info.doctorLicense)) { | 84 | + setError('의사 자격 인증 파일을 첨부해야 합니다.'); |
| 84 | - setError('의사 자격 번호를 입력해야 합니다.'); | ||
| 85 | } else if(registerForm.info.doctorNm.length < 2) { | 85 | } else if(registerForm.info.doctorNm.length < 2) { |
| 86 | setError('의사 이름을 올바르게 입력해야 합니다.'); | 86 | setError('의사 이름을 올바르게 입력해야 합니다.'); |
| 87 | } else if(!registerForm.info.contact) { | 87 | } else if(!registerForm.info.contact) { |
| ... | @@ -121,13 +121,7 @@ const RegisterContainer = (props : RegisterProps) => { | ... | @@ -121,13 +121,7 @@ const RegisterContainer = (props : RegisterProps) => { |
| 121 | }; | 121 | }; |
| 122 | 122 | ||
| 123 | const onSetDoctorLicense = (e : React.ChangeEvent<HTMLInputElement>) => { | 123 | const onSetDoctorLicense = (e : React.ChangeEvent<HTMLInputElement>) => { |
| 124 | - setRegisterForm({ | 124 | + setDoctorInfoFile(e.target.files); |
| 125 | - ...registerForm, | ||
| 126 | - info : { | ||
| 127 | - ...registerForm.info, | ||
| 128 | - doctorLicense : e.target.value, | ||
| 129 | - }, | ||
| 130 | - }); | ||
| 131 | }; | 125 | }; |
| 132 | 126 | ||
| 133 | const onSetHospitalNm = (e : React.ChangeEvent<HTMLInputElement>) => { | 127 | const onSetHospitalNm = (e : React.ChangeEvent<HTMLInputElement>) => { |
| ... | @@ -237,16 +231,21 @@ const RegisterContainer = (props : RegisterProps) => { | ... | @@ -237,16 +231,21 @@ const RegisterContainer = (props : RegisterProps) => { |
| 237 | Data.append('doctorNm', registerForm.info.doctorNm); | 231 | Data.append('doctorNm', registerForm.info.doctorNm); |
| 238 | Data.append('doctorType', registerForm.info.doctorType); | 232 | Data.append('doctorType', registerForm.info.doctorType); |
| 239 | 233 | ||
| 240 | - Data.append('doctorInfoFile', registerForm.info.doctorLicense[0]); | 234 | + Data.append('doctorInfoFile', doctorInfoFile ? doctorInfoFile[0] : ''); |
| 241 | 235 | ||
| 242 | 236 | ||
| 243 | const onRegisterDoctor = async () => { | 237 | const onRegisterDoctor = async () => { |
| 238 | + //로딩 진행 | ||
| 239 | + setLoading(true); | ||
| 240 | + | ||
| 244 | try { | 241 | try { |
| 245 | const result = await authApi.registerDoctor(Data); | 242 | const result = await authApi.registerDoctor(Data); |
| 246 | if(result.data === 'Created') { | 243 | if(result.data === 'Created') { |
| 244 | + setLoading(false); | ||
| 247 | Alert.onSuccess('회원가입 성공, 관리자의 승인을 대기하세요.', () => props.history.push('/login')); | 245 | Alert.onSuccess('회원가입 성공, 관리자의 승인을 대기하세요.', () => props.history.push('/login')); |
| 248 | } | 246 | } |
| 249 | } catch(e : any) { | 247 | } catch(e : any) { |
| 248 | + setLoading(false); | ||
| 250 | Alert.onError(e.response.data.error, () => null); | 249 | Alert.onError(e.response.data.error, () => null); |
| 251 | } | 250 | } |
| 252 | }; | 251 | }; |
| ... | @@ -265,7 +264,7 @@ const RegisterContainer = (props : RegisterProps) => { | ... | @@ -265,7 +264,7 @@ const RegisterContainer = (props : RegisterProps) => { |
| 265 | 264 | ||
| 266 | useEffect(() => { | 265 | useEffect(() => { |
| 267 | validateRegisterForm(); | 266 | validateRegisterForm(); |
| 268 | - }, [registerForm, page]); | 267 | + }, [registerForm, doctorInfoFile, page]); |
| 269 | 268 | ||
| 270 | useEffect(() => { | 269 | useEffect(() => { |
| 271 | if(selectHospital) { | 270 | if(selectHospital) { |
| ... | @@ -306,6 +305,8 @@ const RegisterContainer = (props : RegisterProps) => { | ... | @@ -306,6 +305,8 @@ const RegisterContainer = (props : RegisterProps) => { |
| 306 | <Header {...props}/> | 305 | <Header {...props}/> |
| 307 | <RegisterPresenter | 306 | <RegisterPresenter |
| 308 | registerForm = {registerForm} | 307 | registerForm = {registerForm} |
| 308 | + doctorInfoFile = {doctorInfoFile} | ||
| 309 | + doctorInfoFile_Select = {doctorInfoFile_Select} | ||
| 309 | page = {page} | 310 | page = {page} |
| 310 | error = {error} | 311 | error = {error} |
| 311 | 312 | ... | ... |
| ... | @@ -10,13 +10,13 @@ const uncheck = '/static/img/uncheck.png' | ... | @@ -10,13 +10,13 @@ const uncheck = '/static/img/uncheck.png' |
| 10 | const next = '/static/img/next.png'; | 10 | const next = '/static/img/next.png'; |
| 11 | const prev = '/static/img/prev.png'; | 11 | const prev = '/static/img/prev.png'; |
| 12 | 12 | ||
| 13 | + | ||
| 13 | interface RegisterProps { | 14 | interface RegisterProps { |
| 14 | registerForm : { | 15 | registerForm : { |
| 15 | userId : string; | 16 | userId : string; |
| 16 | password : string; | 17 | password : string; |
| 17 | passwordCheck : string; | 18 | passwordCheck : string; |
| 18 | info : { | 19 | info : { |
| 19 | - doctorLicense : string; | ||
| 20 | hospitalNm : string; | 20 | hospitalNm : string; |
| 21 | hospitalAddr : string; | 21 | hospitalAddr : string; |
| 22 | contact : string; | 22 | contact : string; |
| ... | @@ -24,6 +24,8 @@ interface RegisterProps { | ... | @@ -24,6 +24,8 @@ interface RegisterProps { |
| 24 | doctorNm : string; | 24 | doctorNm : string; |
| 25 | }, | 25 | }, |
| 26 | }; | 26 | }; |
| 27 | + doctorInfoFile : FileList | null; | ||
| 28 | + doctorInfoFile_Select : any; | ||
| 27 | page : number; | 29 | page : number; |
| 28 | error : string | null; | 30 | error : string | null; |
| 29 | 31 | ||
| ... | @@ -148,8 +150,7 @@ const RegisterPresenter = (props : RegisterProps) => { | ... | @@ -148,8 +150,7 @@ const RegisterPresenter = (props : RegisterProps) => { |
| 148 | </styled.ModalButton> | 150 | </styled.ModalButton> |
| 149 | </styled.ModalButtonWrapper> | 151 | </styled.ModalButtonWrapper> |
| 150 | </> | 152 | </> |
| 151 | - </Modal> | 153 | + </Modal> : null |
| 152 | - :null | ||
| 153 | } | 154 | } |
| 154 | <styled.RegisterWrapper> | 155 | <styled.RegisterWrapper> |
| 155 | <styled.RegisterBackButtonWrapper> | 156 | <styled.RegisterBackButtonWrapper> |
| ... | @@ -204,11 +205,19 @@ const RegisterPresenter = (props : RegisterProps) => { | ... | @@ -204,11 +205,19 @@ const RegisterPresenter = (props : RegisterProps) => { |
| 204 | <> | 205 | <> |
| 205 | <styled.RegisterInputWrapper> | 206 | <styled.RegisterInputWrapper> |
| 206 | <styled.RegisterInputText>의사 자격증 번호</styled.RegisterInputText> | 207 | <styled.RegisterInputText>의사 자격증 번호</styled.RegisterInputText> |
| 207 | - <styled.RegisterInput | 208 | + <input type = 'file' |
| 208 | - placeholder = "Doctor's License" | 209 | + style = {{ display : 'none' }} |
| 209 | - value = {props.registerForm.info.doctorLicense} | ||
| 210 | onChange = {props.onSetDoctorLicense} | 210 | onChange = {props.onSetDoctorLicense} |
| 211 | + ref = {props.doctorInfoFile_Select} | ||
| 211 | /> | 212 | /> |
| 213 | + <styled.RegisterFileUploadWrapper> | ||
| 214 | + <styled.RegisterFileUploadButton onClick = {() => props.doctorInfoFile_Select.current.click()}> | ||
| 215 | + 파일 첨부 | ||
| 216 | + </styled.RegisterFileUploadButton> | ||
| 217 | + <styled.RegisterFileUploadInfoText> | ||
| 218 | + {props.doctorInfoFile ? props.doctorInfoFile[0].name : ''} | ||
| 219 | + </styled.RegisterFileUploadInfoText> | ||
| 220 | + </styled.RegisterFileUploadWrapper> | ||
| 212 | </styled.RegisterInputWrapper> | 221 | </styled.RegisterInputWrapper> |
| 213 | <styled.RegisterInputWrapper> | 222 | <styled.RegisterInputWrapper> |
| 214 | <styled.RegisterInputText>이름</styled.RegisterInputText> | 223 | <styled.RegisterInputText>이름</styled.RegisterInputText> | ... | ... |
| ... | @@ -314,6 +314,55 @@ export const RegisterInput = styled.input ` | ... | @@ -314,6 +314,55 @@ export const RegisterInput = styled.input ` |
| 314 | } | 314 | } |
| 315 | `; | 315 | `; |
| 316 | 316 | ||
| 317 | +export const RegisterFileUploadWrapper = styled.div ` | ||
| 318 | + width : 80%; | ||
| 319 | + display : flex; | ||
| 320 | + flex-direction : row; | ||
| 321 | + | ||
| 322 | + justify-content : flex-start; | ||
| 323 | + align-items : center; | ||
| 324 | + | ||
| 325 | + border : none; | ||
| 326 | + background-color : transparent; | ||
| 327 | +`; | ||
| 328 | + | ||
| 329 | +export const RegisterFileUploadButton = styled.button ` | ||
| 330 | + display : flex; | ||
| 331 | + flex-direction : row; | ||
| 332 | + | ||
| 333 | + justify-content : center; | ||
| 334 | + align-items : center; | ||
| 335 | + | ||
| 336 | + border-radius : 3px; | ||
| 337 | + border : 1px solid #343434; | ||
| 338 | + background-color : transparent; | ||
| 339 | + color : #343434; | ||
| 340 | + | ||
| 341 | + padding : 3px 4px; | ||
| 342 | + | ||
| 343 | + font-size : 12px; | ||
| 344 | + font-weight : 600; | ||
| 345 | + | ||
| 346 | + cursor : pointer; | ||
| 347 | + transition : .25s all; | ||
| 348 | + | ||
| 349 | + &:hover { | ||
| 350 | + border : 1px solid #337DFF; | ||
| 351 | + color : #fff; | ||
| 352 | + background-color : #337DFF; | ||
| 353 | + } | ||
| 354 | + | ||
| 355 | + margin : 0 5% 0 0; | ||
| 356 | + | ||
| 357 | +`; | ||
| 358 | + | ||
| 359 | +export const RegisterFileUploadInfoText = styled.div ` | ||
| 360 | + font-size : 12px; | ||
| 361 | + font-weight : 600; | ||
| 362 | + | ||
| 363 | + color : #337DFF; | ||
| 364 | +`; | ||
| 365 | + | ||
| 317 | export const RegisterInputSearchButton = styled.button ` | 366 | export const RegisterInputSearchButton = styled.button ` |
| 318 | position : absolute; | 367 | position : absolute; |
| 319 | 368 | ... | ... |
-
Please register or login to post a comment