Skip to content

Commit e5cc598

Browse files
authored
Merge pull request #178 from blaybus-hackathon/feat/caregiver-matching
Feat: connect api to care-giver profile update
2 parents 61dd2df + 96af91f commit e5cc598

File tree

13 files changed

+384
-312
lines changed

13 files changed

+384
-312
lines changed

src/pages/helper/Account/Account.jsx

Lines changed: 20 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import useScheduleStore from '@/store/suho/useScheduleStore';
77
import { useHeaderPropsStore } from '@/store/useHeaderPropsStore';
88
import useAuthStore from '@/store/useAuthStore';
99
import useHelperAccountStore from '@/store/helper/useHelperAccoutStore';
10+
import useHelperLocationStore from '@/store/suho/useHelperLocationStore';
1011
// import { useAddressStore } from '@/store/useAddressStore';
1112

1213
// ✅ 3. UI 컴포넌트 (공통 UI → 커스텀 컴포넌트 순)
@@ -20,27 +21,23 @@ import backarrow from '@/assets/images/back-arrow.png';
2021
import homecontrols from '@/assets/images/home-controls.png';
2122
import { DAYS } from '@/constants/days';
2223

23-
//temp
24-
import useProfileStore from '@/store/useProfileStore';
25-
2624
export default function Account() {
27-
const { optimizedSchedule } = useScheduleStore();
25+
const { updateSchedule } = useScheduleStore();
2826
const PAY_TYPES = ['시급', '일급', '주급'];
2927

3028
const { user } = useAuthStore();
31-
const { helper, setHelper } = useHelperAccountStore();
29+
const { helper, setHelper, workTypeNames, setWorkTypeNames } = useHelperAccountStore();
30+
const { addDistrict } = useHelperLocationStore();
3231
// const { getAddressNameById } = useAddressStore();
3332

3433
const navigate = useNavigate();
3534

36-
const { profileEdit } = useProfileStore();
3735
const setHeaderProps = useHeaderPropsStore((state) => state.setHeaderProps);
3836
const clearHeaderProps = useHeaderPropsStore((state) => state.clearHeaderProps);
3937

4038
const [afss, setAfss] = useState([]);
4139
const [asss, setAsss] = useState([]);
4240
const [atss, setAtss] = useState([]);
43-
const [workTypes, setWorkTypes] = useState([]);
4441

4542
useEffect(() => {
4643
setHeaderProps({
@@ -87,12 +84,19 @@ export default function Account() {
8784
const fetchedatss = await request('get', `/third/${location.asSeq}`);
8885
let third = fetchedatss.find((item) => item.id === location.atSeq);
8986
setAtss((prev) => [...prev, third.name]);
87+
88+
addDistrict(first.name, second.name, third.name);
89+
90+
for (let sch of helperInfo.helperWorkTime) {
91+
updateSchedule(DAYS[sch.date - 1][0], 'start', sch.startTime);
92+
updateSchedule(DAYS[sch.date - 1][0], 'end', sch.endTime);
93+
}
9094
}
9195

9296
const wtype = await request('post', '/cmn/part-request-care-list', {
9397
careTopEnumList: ['WORK_TYPE'],
9498
});
95-
setWorkTypes(wtype.workTypeList);
99+
setWorkTypeNames(getWorkType(wtype.workTypeList, helperInfo.workType).split(', '));
96100
} catch (e) {
97101
console.error('나의 정보를 가져오는데 실패했습니다 : ' + e);
98102
}
@@ -126,22 +130,20 @@ export default function Account() {
126130
));
127131
};
128132

129-
const getWorkType = () => {
130-
if (workTypes.length === 0) return;
131-
const workTypeBit = helper.workType;
133+
const getWorkType = (wtps, wtb) => {
134+
if (!wtps) return;
132135
const res = [];
133136

134137
for (let i = 0; i < 7; i++) {
135138
const mask = 1 << i;
136-
if (workTypeBit & mask) {
139+
if (wtb & mask) {
137140
res.push(mask);
138141
}
139142
}
140143

141-
return workTypes
142-
.filter((x) => res.includes(x.careVal))
143-
.map((y) => y.careName)
144-
.join(', ');
144+
const data = wtps.filter((x) => res.includes(x.careVal)).map((y) => y.careName);
145+
146+
return data.join(', ');
145147
};
146148

147149
return (
@@ -181,7 +183,7 @@ export default function Account() {
181183
>
182184
<span
183185
className={`
184-
${profileEdit.introduction ? 'text-[#191919]' : 'text-[#C8C8C8]'}
186+
${helper.introduce ? 'text-[#191919]' : 'text-[#C8C8C8]'}
185187
profile-section__content-text
186188
`}
187189
>
@@ -244,12 +246,7 @@ export default function Account() {
244246

245247
<div className='profile-section__content-box'>
246248
<img className='w-[24px] h-[24px]' src={homecontrols} alt='homeControls_icon' />
247-
<span className='profile-section__content-text'>
248-
{getWorkType()}
249-
{/* {profileEdit.careTypes.workTypes.length > 0
250-
? profileEdit.careTypes.workTypes.map((item) => item.label).join(', ')
251-
: '설정되지 않음'} */}
252-
</span>
249+
<span className='profile-section__content-text'>{workTypeNames.join(', ')}</span>
253250
</div>
254251
</section>
255252

src/pages/helper/AccountEdit/AccountEdit.jsx

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import useHelperLocationStore from '@/store/suho/useHelperLocationStore';
88
import useScheduleStore from '@/store/suho/useScheduleStore';
99
import usePayStore from '@/store/suho/usePayStore';
1010
import { useHeaderPropsStore } from '@/store/useHeaderPropsStore';
11+
import useHelperAccountStore from '@/store/helper/useHelperAccoutStore';
1112

1213
// ✅ 3. UI 컴포넌트 (공통 UI → 커스텀 컴포넌트 순)
1314
import { Button } from '@/components/ui/custom/Button';
@@ -21,6 +22,7 @@ import BaseSection from '@/pages/helper/AccountEdit/BaseSection';
2122
import CertificateSection from '@/pages/helper/AccountEdit/CertificateSection';
2223
import PaySection from '@/pages/helper/AccountEdit/PaySection';
2324
import ScheduleSection from './ScheduleSection';
25+
import { request } from '@/api';
2426

2527
export default function AccountEdit() {
2628
const navigate = useNavigate();
@@ -31,6 +33,7 @@ export default function AccountEdit() {
3133
const { pay } = usePayStore();
3234
const setHeaderProps = useHeaderPropsStore((state) => state.setHeaderProps);
3335
const clearHeaderProps = useHeaderPropsStore((state) => state.clearHeaderProps);
36+
const { helper } = useHelperAccountStore();
3437

3538
useEffect(() => {
3639
setHeaderProps({ type: 'back', title: '나의 계정' });
@@ -57,8 +60,33 @@ export default function AccountEdit() {
5760
// schedules: schedules,
5861
};
5962

60-
// 한 번에 저장
61-
updateProfile(newProfile);
63+
await request('put', '/helper/complete-profile', {
64+
introduce: helper.introduce,
65+
careExperience: helper.careExperience,
66+
certificates: helper.certificates,
67+
wage: helper.wage,
68+
wageState: helper.wageState,
69+
wageNegotiation: helper.wageNegotiation,
70+
addressFirstIds: helper.helperWorkLocation.map((x) => x.afSeq),
71+
addressSecondIds: helper.helperWorkLocation.map((x) => x.asSeq),
72+
addressThirdIds: helper.helperWorkLocation.map((x) => x.atSeq),
73+
workTimes: helper.helperWorkTime.map(({ date, startTime, endTime }) => ({
74+
day: date,
75+
startTime,
76+
endTime,
77+
})),
78+
negotiation: helper.helperWorkTime[0].negotiation,
79+
workTerm: +helper.helperWorkTime[0].workTerm[0],
80+
careLevel: helper.careLevel,
81+
inmateState: helper.inmateState,
82+
workType: helper.workType,
83+
careGender: helper.careGender,
84+
serviceMeal: helper.serviceMeal,
85+
serviceMobility: helper.serviceMobility,
86+
serviceDaily: helper.serviceDaily,
87+
verifyQnet: true,
88+
});
89+
6290
navigate('/helper/account');
6391
} catch (error) {
6492
console.error('프로필 저장 실패:', error);

src/pages/helper/AccountEdit/BaseSection.jsx

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,12 @@
1-
import useProfileStore from '@/store/useProfileStore';
21
import useHelperAccountStore from '@/store/helper/useHelperAccoutStore';
32

43
function BaseSection() {
5-
const { profileEdit, updateProfileField } = useProfileStore();
6-
const { helper } = useHelperAccountStore();
4+
const { helper, setPart } = useHelperAccountStore();
75
return (
86
<section className='flex items-center gap-12 '>
97
<div className='relative w-24 h-24'>
108
<img
11-
src={profileEdit?.profileImage || '/defaultProfile.png'} // Zustand 상태 사용
9+
src={helper?.img || '/defaultProfile.png'} // Zustand 상태 사용
1210
alt='profile_image'
1311
className='w-24 h-24 rounded-full bg-[#DCDCDC]'
1412
/>
@@ -21,7 +19,7 @@ function BaseSection() {
2119
const file = e.target.files?.[0];
2220
if (file) {
2321
const imageUrl = URL.createObjectURL(file);
24-
updateProfileField('profileImage', imageUrl);
22+
setPart({ img: imageUrl });
2523
}
2624
}}
2725
/>
@@ -41,10 +39,10 @@ function BaseSection() {
4139
</div>
4240
<div className='flex flex-col gap-5 items-start'>
4341
<span className='text-[#191919] text-[23px] font-bold leading-none h-auto '>
44-
{helper.name || '홍길동'}
42+
{helper.name}
4543
</span>
4644
<span className='text-[#191919] font-pretendard text-[20px] font-medium leading-none '>
47-
{helper.addressDetail || '서울특별시 광진구'} 거주
45+
{helper.addressDetail} 거주
4846
</span>
4947
</div>
5048
</section>

src/pages/helper/AccountEdit/CareTypeSection .jsx

Lines changed: 14 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,28 @@
1-
import { useNavigate } from "react-router-dom";
2-
import homecontrols from "@/assets/images/home-controls.png";
3-
import useProfileStore from "@/store/useProfileStore";
1+
import { useNavigate } from 'react-router-dom';
2+
import homecontrols from '@/assets/images/home-controls.png';
3+
import useProfileStore from '@/store/useProfileStore';
4+
import useHelperAccountStore from '@/store/helper/useHelperAccoutStore';
45

56
const CareTypeSection = () => {
67
const navigate = useNavigate();
78
const { profileEdit } = useProfileStore(); // Zustand store에서 데이터 가져오기
9+
const { workTypeNames } = useHelperAccountStore();
810
const careTypeData = profileEdit.careTypes;
911

1012
return (
1113
<section
12-
className=" helper-section hover:cursor-pointer"
13-
onClick={() => navigate("/helper/account/care-type")}
14+
className=' helper-section hover:cursor-pointer'
15+
onClick={() => navigate('/helper/account/care-type')}
1416
>
15-
<div className="flex flex-col items-start gap-2.5 self-stretch">
16-
<span className="helper-title">나의 희망 돌봄유형</span>
17-
<span className="helper-subtitle ">
18-
내가 자신있는 돌봄 유형을 설정해 보세요!
19-
</span>
17+
<div className='flex flex-col items-start gap-2.5 self-stretch'>
18+
<span className='helper-title'>나의 희망 돌봄유형</span>
19+
<span className='helper-subtitle '>내가 자신있는 돌봄 유형을 설정해 보세요!</span>
2020
</div>
2121

22-
<div className="profile-section__content-box">
23-
<img
24-
className="w-[24px] h-[24px]"
25-
src={homecontrols}
26-
alt="homeControls_icon"
27-
/>
28-
<span className="profile-section__content-text">
29-
{careTypeData.workTypes.length > 0
30-
? careTypeData.workTypes.map((item) => item.label).join(", ")
31-
: "설정되지 않음"}
22+
<div className='profile-section__content-box'>
23+
<img className='w-[24px] h-[24px]' src={homecontrols} alt='homeControls_icon' />
24+
<span className='profile-section__content-text'>
25+
{workTypeNames.length > 0 ? workTypeNames.join(', ') : '설정되지 않음'}
3226
</span>
3327
</div>
3428
</section>

src/pages/helper/AccountEdit/CareerSection.jsx

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import { Radio, RadioItem } from '@/components/ui/custom/multiRadio';
2-
import useProfileStore from '@/store/useProfileStore';
2+
import useHelperAccountStore from '@/store/helper/useHelperAccoutStore';
33

44
const CareExperienceSelector = () => {
5-
const { profileEdit, updateProfileField } = useProfileStore();
5+
const { helper, setPart } = useHelperAccountStore();
66

77
return (
88
<section className='helper-section'>
@@ -12,15 +12,15 @@ const CareExperienceSelector = () => {
1212
</p>
1313

1414
<Radio
15-
onValueChange={(value) => updateProfileField('careExperience', value)}
15+
onValueChange={(value) => setPart({ careExperience: value })}
1616
cols={2}
1717
className='flex items-center gap-8'
18-
value={profileEdit.careExperience} // Zustand에서 직접 가져옴
18+
value={helper.careExperience} // Zustand에서 직접 가져옴
1919
>
20-
<RadioItem className='hover:cursor-pointer' value='신입'>
20+
<RadioItem className='hover:cursor-pointer' value={false}>
2121
신입
2222
</RadioItem>
23-
<RadioItem className='hover:cursor-pointer' value='경력'>
23+
<RadioItem className='hover:cursor-pointer' value={true}>
2424
경력
2525
</RadioItem>
2626
</Radio>

src/pages/helper/AccountEdit/CertificateSection.jsx

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,20 +5,19 @@ import useHelperAccountStore from '@/store/helper/useHelperAccoutStore';
55

66
const CertificationSection = () => {
77
const { profileEdit, updateProfileField } = useProfileStore();
8-
const { helper } = useHelperAccountStore();
8+
const { helper, addCertificate, deleteCertificate } = useHelperAccountStore();
99
const certificates = ['요양보호사', '간병사', '병원동행매니저', '산후관리사'];
1010

1111
const handleRadioChange = (certificate, isChecked) => {
12-
updateProfileField('selectedOptions', {
13-
...profileEdit.selectedOptions,
14-
[certificate]: isChecked,
15-
});
16-
// 체크가 해제되면 해당 자격증 정보 입력 필드도 초기화 (선택 사항)
17-
if (!isChecked && profileEdit.inputs[certificate]) {
18-
updateProfileField('inputs', {
19-
...profileEdit.inputs,
20-
[certificate]: '',
12+
if (isChecked) {
13+
addCertificate({
14+
certName: certificate,
15+
certNum: '',
16+
certDateIssue: null,
17+
certSerialNum: null,
2118
});
19+
} else {
20+
deleteCertificate(certificate);
2221
}
2322
};
2423

@@ -38,7 +37,15 @@ const CertificationSection = () => {
3837

3938
<Radio cols={1} multiple className='gap-4'>
4039
{certificates.map((certificate) => {
41-
const isChecked = helper.certificates.includes(certificate);
40+
let certNum = '';
41+
const isChecked = helper.certificates.some(
42+
(item) => item.certName.split(' ')[0] === certificate,
43+
);
44+
if (isChecked) {
45+
certNum = helper.certificates.find(
46+
(x) => x.certName.split(' ')[0] === certificate,
47+
).certNum;
48+
}
4249
return (
4350
<div key={certificate} className='flex flex-col gap-2'>
4451
<RadioItem
@@ -52,7 +59,7 @@ const CertificationSection = () => {
5259
<Input
5360
type='text'
5461
name={certificate}
55-
value={profileEdit.inputs[certificate] || ''}
62+
value={certNum}
5663
onChange={handleInputChange} // event 객체 전달
5764
placeholder={`${certificate} 자격증 정보를 입력하세요`}
5865
className=''

src/pages/helper/AccountEdit/IntroSection.jsx

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
import { useRef } from 'react';
2-
import useProfileStore from '@/store/useProfileStore';
2+
import useHelperAccountStore from '@/store/helper/useHelperAccoutStore';
33
const IntroductionInput = () => {
44
const INTRODUCTIONMAX = 75; // 소개 최대 글자 수
5-
const { profileEdit, updateProfileField } = useProfileStore();
5+
const { helper, setPart } = useHelperAccountStore();
66
const textareaRef = useRef(null);
77

88
const handleInput = (e) => {
9-
updateProfileField('introduction', e.target.value);
9+
// updateProfileField('introduction', e.target.value);
10+
setPart({ introduce: e.target.value });
1011

1112
const el = textareaRef.current;
1213
if (el) {
@@ -25,7 +26,7 @@ const IntroductionInput = () => {
2526
</p>
2627
<textarea
2728
ref={textareaRef}
28-
value={profileEdit.introduction}
29+
value={helper.introduce}
2930
onInput={handleInput}
3031
placeholder='예) 한 사람, 한 사람의 필요에 맞춰 따뜻하고 세심한 돌봄을 제공하는 요양사입니다.'
3132
className='

src/pages/helper/AccountEdit/LocationSection.jsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,14 @@ function LocationSection({ selectedDistricts }) {
1717

1818
<div className='profile-section__content-box'>
1919
<img className='w-[24px] h-[24px]' src={location_icon} alt='location_icon' />
20-
<div className='flex items-center gap-1 py-1'>
20+
<div className='flex items-center gap-1 py-1 w-full'>
2121
{Object.entries(selectedDistricts).length > 0 ? (
22-
<span className='flex flex-col gap-3'>
22+
<span className='flex flex-col gap-3 w-full'>
2323
{Object.entries(selectedDistricts).map(([city, districts]) =>
2424
Object.entries(districts).map(([district, subDistricts]) => (
2525
<div
2626
key={`${city}-${district}`}
27-
className='flex gap-1 profile-section__content-text'
27+
className='flex gap-1 profile-section__content-text w-full items-center'
2828
>
2929
<span className='flex-1'>{city.length > 4 ? city.slice(0, 2) : city}</span>
3030
<img

0 commit comments

Comments
 (0)