Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: 계정정보수정 (봉사자, 보호소) msw 연결 #167

Merged
merged 19 commits into from
Nov 27, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
50d7322
feat(shelter): 계정정보수정 msw mock 데이터
Eosdia Nov 21, 2023
9242ebc
fix(shelter): 보호소 정보 msw handler shelterImageUrl 수정
Eosdia Nov 22, 2023
1fe3233
feat(shelter): shelterInfo 수정 타입 추가
Eosdia Nov 22, 2023
9f74fb2
fix(shelter): 계정정보수정API request 타입 수정
Eosdia Nov 22, 2023
d0f63eb
feat(shelter): 보호소계정정보 useQuery 추가
Eosdia Nov 22, 2023
14518e2
feat(shelter): 보호소 계정정보 조회 msw 연결
Eosdia Nov 22, 2023
b256eaf
feat(shelter): 계정정보 수정 mutation 추가
Eosdia Nov 22, 2023
e0cb4db
fix(shelter): msw 계정정보수정 handler HttpResponse 수정
Eosdia Nov 22, 2023
7904e0f
design(shelter): button 의 hover, active background 수정
Eosdia Nov 22, 2023
9e18f5b
fix(volunteer): api MyInfoResponse, UpdateUserInfoParams 타입 수정
Eosdia Nov 22, 2023
fcaeb02
feat(volunteer): 봉사자계정정보 fetch hook 추가
Eosdia Nov 22, 2023
f5f20a7
feat(volunteer): get 봉사자정보 msw handler 추가
Eosdia Nov 22, 2023
f83b09a
feat(volunteer): 봉사자 계정정보 조회 msw 연결
Eosdia Nov 22, 2023
d282092
design(volunteer): button 태그 hover, active 일때 background 제거
Eosdia Nov 22, 2023
904bcfc
fix(volunteer): volunteergender 타입 수정
Eosdia Nov 22, 2023
75fce57
feat(volunteer): 계정정보수정 useMutation 추가
Eosdia Nov 22, 2023
220e98f
feat(volunteer): 계정정보수정 patch msw 추가
Eosdia Nov 22, 2023
5171d4b
fix(volunteer): 계정정보조회 useQuery 의 select 메소드 타입 지정
Eosdia Nov 22, 2023
129c913
Merge branch 'develop' into feat/132
Eosdia Nov 27, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions apps/shelter/src/apis/shelter.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import axiosInstance from 'shared/apis/axiosInstance';

import { ShelterInfo } from '@/types/apis/shetler';
import { ShelterInfo, UpdateShelterInfo } from '@/types/apis/shetler';

type PasswordUpdateParams = {
newPassword: string;
Expand All @@ -15,8 +15,8 @@ type PageParams = {
export const getShelterInfoAPI = () =>
axiosInstance.get<ShelterInfo>('/shelters/me');

export const updateShelterInfo = (shelterInfo: ShelterInfo) =>
axiosInstance.patch<unknown, ShelterInfo>('/shelters/me', shelterInfo);
export const updateShelterInfo = (shelterInfo: UpdateShelterInfo) =>
axiosInstance.patch<unknown, UpdateShelterInfo>('/shelters/me', shelterInfo);

export const updatePassword = (passwordUpdateParams: PasswordUpdateParams) =>
axiosInstance.patch<unknown, PasswordUpdateParams>(
Expand Down
6 changes: 5 additions & 1 deletion apps/shelter/src/mocks/handlers/shelter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ export const handlers = [
shelterId: 1,
shelterEmail: '[email protected]',
shelterName: '양천구 보호소',
imageUrl: null,
shelterImageUrl: 'https://source.unsplash.com/random/?animal',
shelterAddress: '서울특별시 양천구',
shelterAddressDetail: '서울특별시 양천구 신월동 동자빌딩',
shelterPhoneNumber: '010-1234-5678',
Expand All @@ -49,4 +49,8 @@ export const handlers = [
{ status: 200 },
);
}),
http.patch('/shelters/me', async () => {
await delay(200);
return new HttpResponse(null, { status: 204 });
}),
];
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
import { useQuery } from '@tanstack/react-query';

import { getShelterInfoAPI } from '@/apis/shelter';

const useFethShelterAccount = () => {
return useQuery({
queryKey: ['shelter', 'account'],
queryFn: async () => (await getShelterInfoAPI()).data,
select: (data) => {
return {
imageUrl: data.shelterImageUrl,
email: data.shelterEmail,
name: data.shelterName,
address: data.shelterAddress,
addressDetail: data.shelterAddressDetail,
phoneNumber: data.shelterPhoneNumber,
sparePhoneNumber: data.shelterSparePhoneNumber,
isOpenedAddress: data.shelterIsOpenedAddress,
};
},
initialData: {
shelterId: 1,
shelterImageUrl: '',
shelterEmail: '',
shelterName: '',
shelterAddress: '',
shelterAddressDetail: '',
shelterPhoneNumber: '',
shelterSparePhoneNumber: '',
shelterIsOpenedAddress: false,
},
});
};

export default useFethShelterAccount;
71 changes: 62 additions & 9 deletions apps/shelter/src/pages/settings/account/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,43 @@ import {
HStack,
Input,
Switch,
useToast,
} from '@chakra-ui/react';
import { useState } from 'react';
import { useMutation } from '@tanstack/react-query';
import { useEffect, useState } from 'react';
import { useForm } from 'react-hook-form';

import { updateShelterInfo } from '@/apis/shelter';
import { UpdateShelterInfo } from '@/types/apis/shetler';

import useFetchShelterAccount from './_hooks/useFetchShelterAccount';

export default function SettingsAccountPage() {
const toast = useToast();
const [imgFile, setImgFile] = useState<string>('');
const { data } = useFetchShelterAccount();
const { mutate: updateShelter } = useMutation({
mutationFn: (data: UpdateShelterInfo) => updateShelterInfo(data),
onSuccess: () => {
toast({
position: 'top',
description: '계정 정보가 수정되었습니다.',
status: 'success',
duration: 1500,
});
},
});

const { register, handleSubmit, reset, watch } = useForm<UpdateShelterInfo>();

useEffect(() => {
reset(data);
setImgFile(data.imageUrl);
}, [data]);

const onSubmit = handleSubmit((newData) => {
updateShelter(newData);
});

const uploadImgFile = (e: React.ChangeEvent<HTMLInputElement>) => {
const file = e.target.files?.[0];
Expand All @@ -24,7 +56,7 @@ export default function SettingsAccountPage() {

return (
<Box px={4} pb={193}>
<form>
<form onSubmit={onSubmit}>
<Center py={30}>
<FormLabel htmlFor="fileInput" cursor="pointer" fontWeight={400} />
<Avatar
Expand All @@ -39,7 +71,7 @@ export default function SettingsAccountPage() {
type="file"
accept="image/*"
display="none"
onChange={uploadImgFile}
{...register('imageUrl', { onChange: uploadImgFile })}
/>
</Center>

Expand All @@ -50,17 +82,21 @@ export default function SettingsAccountPage() {
bgColor="gray.100"
color="gray.500"
_hover={{ border: 'none' }}
value={data.email}
/>
</FormControl>

<FormControl mb={5} isRequired>
<FormLabel fontWeight={400}>보호소 이름</FormLabel>
<Input placeholder="이름을 입력하세요" />
<Input placeholder="이름을 입력하세요" {...register('name')} />
</FormControl>

<FormControl mb={5} isRequired>
<FormLabel fontWeight={400}>보호소 주소</FormLabel>
<Input placeholder="보호소 주소를 입력해주세요" />
<Input
placeholder="보호소 주소를 입력해주세요"
{...register('address')}
/>
</FormControl>

<FormControl mb={5} isRequired>
Expand All @@ -78,20 +114,35 @@ export default function SettingsAccountPage() {
>
상세주소 공개
</FormLabel>
<Switch colorScheme="orange" />
<Switch
colorScheme="orange"
isChecked={watch('isOpenedAddress')}
{...register('isOpenedAddress')}
/>
</FormControl>
</HStack>
<Input placeholder="보호소 상세 주소를 입력해주세요" />
<Input
placeholder="보호소 상세 주소를 입력해주세요"
{...register('addressDetail')}
/>
</FormControl>

<FormControl mb={5} isRequired>
<FormLabel fontWeight={400}>보호소 전화번호</FormLabel>
<Input type="tel" placeholder="전화번호를 입력하세요" />
<Input
type="tel"
placeholder="전화번호를 입력하세요"
{...register('phoneNumber')}
/>
</FormControl>

<FormControl mb={5} isRequired>
<FormLabel fontWeight={400}>보호소 임시 전화번호</FormLabel>
<Input type="tel" placeholder="전화번호를 입력하세요" />
<Input
type="tel"
placeholder="전화번호를 입력하세요"
{...register('sparePhoneNumber')}
/>
</FormControl>
<Center>
<Button
Expand All @@ -102,6 +153,8 @@ export default function SettingsAccountPage() {
bottom={21}
bgColor="orange.400"
color="white"
_active={{ bg: undefined }}
_hover={{ bg: undefined }}
>
수정완료
</Button>
Expand Down
10 changes: 10 additions & 0 deletions apps/shelter/src/types/apis/shetler.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,13 @@ export type ShelterInfo = {
shelterSparePhoneNumber: string;
shelterIsOpenedAddress: boolean;
};

export type UpdateShelterInfo = {
imageUrl?: string;
name: string;
address: string;
addressDetail: string;
phoneNumber: string;
sparePhoneNumber: string;
isOpenedAddress: boolean;
};
12 changes: 6 additions & 6 deletions apps/volunteer/src/apis/volunteer.ts
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
import axiosInstance from 'shared/apis/axiosInstance';

type MyInfoResponse = {
volunteerId: string;
export type MyInfoResponse = {
volunteerId: number;
volunteerEmail: string;
volunteerName: string;
volunteerBirthDate: string;
volunteerPhoneNumber: string;
volunteerTemperture: number;
volunteerCount: number;
volunteerImageUrl: string;
volunteerGender: 'FEMAIL' | 'MALE';
volunteerGender: 'FEMALE' | 'MALE';
};

export const getMyVolunteerInfo = () =>
Expand All @@ -29,10 +29,10 @@ export const updateVolunteerPassword = (
);
};

type UpdateUserInfoParams = {
export type UpdateUserInfoParams = {
name: string;
gender: string;
birthData: string;
gender: 'FEMALE' | 'MALE';
birthDate: string;
phoneNumber: string;
imageUrl: string;
};
Expand Down
3 changes: 2 additions & 1 deletion apps/volunteer/src/mocks/browser.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,6 @@ import { setupWorker } from 'msw/browser';

import { handlers as authHandlers } from './handlers/auth';
import { handlers as recruitmentHandler } from './handlers/recruitment';
import { handlers as volunteerHandlers } from './handlers/volunteer';

export const worker = setupWorker(...authHandlers, ...recruitmentHandler);
export const worker = setupWorker(...authHandlers, ...recruitmentHandler, ...volunteerHandlers );
23 changes: 23 additions & 0 deletions apps/volunteer/src/mocks/handlers/volunteer.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import { delay, http, HttpResponse } from 'msw';

export const handlers = [
http.get('/volunteers/me', async () => {
await delay(200);
return HttpResponse.json({
volunteerId: 1,
volunteerEmail: '[email protected]',
volunteerName: '김프롱',
volunteerBirthDate: '2023-03-16',
volunteerPhoneNumber: '010-1234-5678',
volunteerTemperature: 32,
completedVolunteerCount: 3,
volunteerImageUrl: 'https://source.unsplash.com/random',
volunteerGender: 'FEMALE',
});
}),
http.patch('/volunteers/me', async ({ request }) => {
const updateVolunteer = await request.json();
console.log(updateVolunteer);
return new HttpResponse(null, { status: 204 });
}),
];
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
import { useQuery } from '@tanstack/react-query';

import { getMyVolunteerInfo, MyInfoResponse } from '@/apis/volunteer';

const useFetchAccount = () =>
useQuery({
queryKey: ['volunteer', 'account'],
queryFn: async () => (await getMyVolunteerInfo()).data,
select: (data: MyInfoResponse) => {
return {
imageUrl: data.volunteerImageUrl,
email: data.volunteerEmail,
name: data.volunteerName,
birthDate: data.volunteerBirthDate,
phoneNumber: data.volunteerPhoneNumber,
gender: data.volunteerGender,
};
},
initialData: {
volunteerId: 1,
volunteerEmail: '',
volunteerName: '',
volunteerBirthDate: '',
volunteerPhoneNumber: '',
volunteerTemperture: 36,
volunteerCount: 0,
volunteerImageUrl: '',
volunteerGender: 'MALE',
},
});

export default useFetchAccount;
Loading