- + + {eventDay} {`${duringTime}`} diff --git a/src/components/mypage/MyPageMain/MyPageMain.css.ts b/src/components/mypage/MyPageMain/MyPageMain.css.ts index 3fb7dff5..ec81daac 100644 --- a/src/components/mypage/MyPageMain/MyPageMain.css.ts +++ b/src/components/mypage/MyPageMain/MyPageMain.css.ts @@ -68,7 +68,7 @@ export const noti = style({ }); export const divider = style({ width: `calc(100% - 2 * ${GLOBAL_PADDING_X}px)`, - marginLeft: GLOBAL_PADDING_X, + transform: `translateX(${GLOBAL_PADDING_X}px)`, backgroundColor: palette.gray200, height: '1px', margin: '8 0' diff --git a/src/components/mypage/MyPageMain/MyPageMain.tsx b/src/components/mypage/MyPageMain/MyPageMain.tsx index df055749..dee4f8ae 100644 --- a/src/components/mypage/MyPageMain/MyPageMain.tsx +++ b/src/components/mypage/MyPageMain/MyPageMain.tsx @@ -8,6 +8,7 @@ import { MypageTerms } from '@/asset/icons'; import { Body1, ButtonText2 } from '@/components/common/Typography'; +import { URL_ONETOONE, URL_TERMS_OF_USE } from '@/constants/landingURL'; import useDialog from '@/hooks/useDialog'; import useHeader from '@/hooks/useHeader'; import Link from 'next/link'; @@ -63,8 +64,16 @@ export default function MyPageMain({ link: pathname + '/volunteer/bookmark', Svg: MypageStar }, - { label: '문의하기', link: '', Svg: MypageChat }, - { label: '이용약관', link: '', Svg: MypageTerms } + { + label: '문의하기', + link: URL_ONETOONE, + Svg: MypageChat + }, + { + label: '이용약관', + link: URL_TERMS_OF_USE, + Svg: MypageTerms + } ]; return ( @@ -73,19 +82,32 @@ export default function MyPageMain({ {settings.map(({ link, label, Svg }, index) => { if (index === 0 && isShelterRole) return null; - return ( - - - - - {label} + if (index === 0) { + return ( + + + + + {label} + + - - - - {index === 2 ? : null} - - ); + + ); + } else { + return ( + + + + + {label} + + + + {index === 2 && } + + ); + } })} diff --git a/src/components/mypage/MyPageMain/ToggleSection.tsx b/src/components/mypage/MyPageMain/ToggleSection.tsx index 217439d7..d4fa43dc 100644 --- a/src/components/mypage/MyPageMain/ToggleSection.tsx +++ b/src/components/mypage/MyPageMain/ToggleSection.tsx @@ -37,6 +37,12 @@ export default function ToggleSection({ const { mutateAsync: shelterAlarm } = useUpdateShelterAlarm(); const toastOn = useToast(); + const handleToastMsg = useCallback((isCheck: boolean) => { + let msg = isCheck + ? '알림 수신이 OFF 되었습니다.' + : '알림 수신이 ON 되었습니다.'; + return msg; + }, []); const handleToggleChange = useCallback( (e: React.ChangeEvent) => { @@ -50,7 +56,7 @@ export default function ToggleSection({ }; volunteerAlarm(payload).then(res => { - toastOn('카카오톡 알림 설정이 업로드 되었습니다.'); + toastOn(handleToastMsg(e.target.checked)); }); } else { payload = { @@ -58,11 +64,11 @@ export default function ToggleSection({ }; shelterAlarm(payload).then(res => { - toastOn('카카오톡 알림 설정이 업로드 되었습니다.'); + toastOn(handleToastMsg(e.target.checked)); }); } }, - [volunteerAlarm, shelterAlarm, toastOn, info] + [volunteerAlarm, shelterAlarm, toastOn, info, handleToastMsg] ); return ( diff --git a/src/components/shelter-edit/AnimalCard/AnimalCard.tsx b/src/components/shelter-edit/AnimalCard/AnimalCard.tsx index e18c40b6..2981d889 100644 --- a/src/components/shelter-edit/AnimalCard/AnimalCard.tsx +++ b/src/components/shelter-edit/AnimalCard/AnimalCard.tsx @@ -5,6 +5,7 @@ import Button from '@/components/common/Button/Button'; import Image from 'next/image'; import { ANIMAL_GENDER_DICT } from '@/constants/animal'; import { ObservationAnimal } from '@/types/shelter'; +import breakLine from '@/utils/breakLine'; interface AnimalCardProps { data: ObservationAnimal; @@ -44,11 +45,11 @@ export default function AnimalCard({ {mode === 'edit' && onClickEdit && onClickDelete ? ( - {specialNote} + {breakLine(specialNote)} ) : ( - {specialNote} + {breakLine(specialNote)} )} diff --git a/src/components/shelter-edit/AnimalFormDialog/AnimalFormDialog.tsx b/src/components/shelter-edit/AnimalFormDialog/AnimalFormDialog.tsx index af66601c..ece2a34a 100644 --- a/src/components/shelter-edit/AnimalFormDialog/AnimalFormDialog.tsx +++ b/src/components/shelter-edit/AnimalFormDialog/AnimalFormDialog.tsx @@ -18,6 +18,7 @@ import yup from '@/utils/yup'; import * as styles from './AnimalFormDialog.css'; import { ObservationAnimal } from '@/types/shelter'; import useBooleanState from '@/hooks/useBooleanState'; +import useDialog from '@/hooks/useDialog'; interface AnimalFormDialogProps extends Pick { initialData?: ObservationAnimal; data?: ObservationAnimal; @@ -78,6 +79,7 @@ export const AnimalForm: React.FC = ({ const { onChangeImage, isUploading, + uploadError, src: profileImageUrl, setSrc: setProfileImageUrl } = useImageUploader(); @@ -161,6 +163,8 @@ export const AnimalForm: React.FC = ({ shape="square" defaultImage="puppy" size="80" + loading={isUploading} + error={uploadError} onChangeCallback={onChangeImage} /> @@ -228,8 +232,23 @@ const AnimalFormDialog: React.FC = ({ onClose, initialData }) => { + const { dialogOn, dialogOff } = useDialog(); + const handleClose = useCallback(() => { + dialogOn({ + message: '앗! 이대로 나가면 입력하신 정보가 모두 사라져요!', + confirm: { + text: '나가기', + variant: 'filled', + onClick: () => { + onClose(); + dialogOff(); + } + }, + close: {} + }); + }, [dialogOff, dialogOn, onClose]); return ( - + ); diff --git a/src/components/shelter-event/ShelterEvent/ShelterEvent.tsx b/src/components/shelter-event/ShelterEvent/ShelterEvent.tsx index b2238c31..2e568f4f 100644 --- a/src/components/shelter-event/ShelterEvent/ShelterEvent.tsx +++ b/src/components/shelter-event/ShelterEvent/ShelterEvent.tsx @@ -32,9 +32,8 @@ import { VolunteerEvent } from '@/api/shelter/event/volunteer-event'; import Avartar from '@/components/common/Avartar/Avartar'; import ConfirmContent from '../ConfirmContent/ConfirmContent'; import * as styles from './ShelterEvent.css'; +import { URL_FAQ, URL_ONETOONE } from '@/constants/landingURL'; -const QNA = - 'https://www.notion.so/yapp-workspace/FAQ-f492ba54a5d647129ca9697fbd307b20?pvs=4'; const NOTICE = '*세부 주소는 봉사 참가자에게 별도로 안내드립니다.'; const DangleMap = dynamic(() => import('@/components/common/Map/DangleMap'), { loading: () => @@ -300,9 +299,15 @@ export default function ShelterEvent({ /> - 자주 묻고 답하는 질문 + + 자주 묻고 답하는 질문 + + + + + 1:1 문의하기 + - 1:1 문의하기
+ {eventDay} {`${duringTime}`} diff --git a/src/components/mypage/MyPageMain/MyPageMain.css.ts b/src/components/mypage/MyPageMain/MyPageMain.css.ts index 3fb7dff5..ec81daac 100644 --- a/src/components/mypage/MyPageMain/MyPageMain.css.ts +++ b/src/components/mypage/MyPageMain/MyPageMain.css.ts @@ -68,7 +68,7 @@ export const noti = style({ }); export const divider = style({ width: `calc(100% - 2 * ${GLOBAL_PADDING_X}px)`, - marginLeft: GLOBAL_PADDING_X, + transform: `translateX(${GLOBAL_PADDING_X}px)`, backgroundColor: palette.gray200, height: '1px', margin: '8 0' diff --git a/src/components/mypage/MyPageMain/MyPageMain.tsx b/src/components/mypage/MyPageMain/MyPageMain.tsx index df055749..dee4f8ae 100644 --- a/src/components/mypage/MyPageMain/MyPageMain.tsx +++ b/src/components/mypage/MyPageMain/MyPageMain.tsx @@ -8,6 +8,7 @@ import { MypageTerms } from '@/asset/icons'; import { Body1, ButtonText2 } from '@/components/common/Typography'; +import { URL_ONETOONE, URL_TERMS_OF_USE } from '@/constants/landingURL'; import useDialog from '@/hooks/useDialog'; import useHeader from '@/hooks/useHeader'; import Link from 'next/link'; @@ -63,8 +64,16 @@ export default function MyPageMain({ link: pathname + '/volunteer/bookmark', Svg: MypageStar }, - { label: '문의하기', link: '', Svg: MypageChat }, - { label: '이용약관', link: '', Svg: MypageTerms } + { + label: '문의하기', + link: URL_ONETOONE, + Svg: MypageChat + }, + { + label: '이용약관', + link: URL_TERMS_OF_USE, + Svg: MypageTerms + } ]; return ( @@ -73,19 +82,32 @@ export default function MyPageMain({ {settings.map(({ link, label, Svg }, index) => { if (index === 0 && isShelterRole) return null; - return ( - - - - - {label} + if (index === 0) { + return ( + + + + + {label} + + - - - - {index === 2 ? : null} - - ); + + ); + } else { + return ( + + + + + {label} + + + + {index === 2 && } + + ); + } })} diff --git a/src/components/mypage/MyPageMain/ToggleSection.tsx b/src/components/mypage/MyPageMain/ToggleSection.tsx index 217439d7..d4fa43dc 100644 --- a/src/components/mypage/MyPageMain/ToggleSection.tsx +++ b/src/components/mypage/MyPageMain/ToggleSection.tsx @@ -37,6 +37,12 @@ export default function ToggleSection({ const { mutateAsync: shelterAlarm } = useUpdateShelterAlarm(); const toastOn = useToast(); + const handleToastMsg = useCallback((isCheck: boolean) => { + let msg = isCheck + ? '알림 수신이 OFF 되었습니다.' + : '알림 수신이 ON 되었습니다.'; + return msg; + }, []); const handleToggleChange = useCallback( (e: React.ChangeEvent) => { @@ -50,7 +56,7 @@ export default function ToggleSection({ }; volunteerAlarm(payload).then(res => { - toastOn('카카오톡 알림 설정이 업로드 되었습니다.'); + toastOn(handleToastMsg(e.target.checked)); }); } else { payload = { @@ -58,11 +64,11 @@ export default function ToggleSection({ }; shelterAlarm(payload).then(res => { - toastOn('카카오톡 알림 설정이 업로드 되었습니다.'); + toastOn(handleToastMsg(e.target.checked)); }); } }, - [volunteerAlarm, shelterAlarm, toastOn, info] + [volunteerAlarm, shelterAlarm, toastOn, info, handleToastMsg] ); return ( diff --git a/src/components/shelter-edit/AnimalCard/AnimalCard.tsx b/src/components/shelter-edit/AnimalCard/AnimalCard.tsx index e18c40b6..2981d889 100644 --- a/src/components/shelter-edit/AnimalCard/AnimalCard.tsx +++ b/src/components/shelter-edit/AnimalCard/AnimalCard.tsx @@ -5,6 +5,7 @@ import Button from '@/components/common/Button/Button'; import Image from 'next/image'; import { ANIMAL_GENDER_DICT } from '@/constants/animal'; import { ObservationAnimal } from '@/types/shelter'; +import breakLine from '@/utils/breakLine'; interface AnimalCardProps { data: ObservationAnimal; @@ -44,11 +45,11 @@ export default function AnimalCard({ {mode === 'edit' && onClickEdit && onClickDelete ? ( - {specialNote} + {breakLine(specialNote)} ) : ( - {specialNote} + {breakLine(specialNote)} )} diff --git a/src/components/shelter-edit/AnimalFormDialog/AnimalFormDialog.tsx b/src/components/shelter-edit/AnimalFormDialog/AnimalFormDialog.tsx index af66601c..ece2a34a 100644 --- a/src/components/shelter-edit/AnimalFormDialog/AnimalFormDialog.tsx +++ b/src/components/shelter-edit/AnimalFormDialog/AnimalFormDialog.tsx @@ -18,6 +18,7 @@ import yup from '@/utils/yup'; import * as styles from './AnimalFormDialog.css'; import { ObservationAnimal } from '@/types/shelter'; import useBooleanState from '@/hooks/useBooleanState'; +import useDialog from '@/hooks/useDialog'; interface AnimalFormDialogProps extends Pick { initialData?: ObservationAnimal; data?: ObservationAnimal; @@ -78,6 +79,7 @@ export const AnimalForm: React.FC = ({ const { onChangeImage, isUploading, + uploadError, src: profileImageUrl, setSrc: setProfileImageUrl } = useImageUploader(); @@ -161,6 +163,8 @@ export const AnimalForm: React.FC = ({ shape="square" defaultImage="puppy" size="80" + loading={isUploading} + error={uploadError} onChangeCallback={onChangeImage} /> @@ -228,8 +232,23 @@ const AnimalFormDialog: React.FC = ({ onClose, initialData }) => { + const { dialogOn, dialogOff } = useDialog(); + const handleClose = useCallback(() => { + dialogOn({ + message: '앗! 이대로 나가면 입력하신 정보가 모두 사라져요!', + confirm: { + text: '나가기', + variant: 'filled', + onClick: () => { + onClose(); + dialogOff(); + } + }, + close: {} + }); + }, [dialogOff, dialogOn, onClose]); return ( - + ); diff --git a/src/components/shelter-event/ShelterEvent/ShelterEvent.tsx b/src/components/shelter-event/ShelterEvent/ShelterEvent.tsx index b2238c31..2e568f4f 100644 --- a/src/components/shelter-event/ShelterEvent/ShelterEvent.tsx +++ b/src/components/shelter-event/ShelterEvent/ShelterEvent.tsx @@ -32,9 +32,8 @@ import { VolunteerEvent } from '@/api/shelter/event/volunteer-event'; import Avartar from '@/components/common/Avartar/Avartar'; import ConfirmContent from '../ConfirmContent/ConfirmContent'; import * as styles from './ShelterEvent.css'; +import { URL_FAQ, URL_ONETOONE } from '@/constants/landingURL'; -const QNA = - 'https://www.notion.so/yapp-workspace/FAQ-f492ba54a5d647129ca9697fbd307b20?pvs=4'; const NOTICE = '*세부 주소는 봉사 참가자에게 별도로 안내드립니다.'; const DangleMap = dynamic(() => import('@/components/common/Map/DangleMap'), { loading: () => @@ -300,9 +299,15 @@ export default function ShelterEvent({ /> - 자주 묻고 답하는 질문 + + 자주 묻고 답하는 질문 + + + + + 1:1 문의하기 + - 1:1 문의하기