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] 공홈 어드민 QA용 매직버튼 만들었어요 #197

Merged
merged 2 commits into from
Jan 27, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
11 changes: 11 additions & 0 deletions src/components/attendanceAdmin/session/SessionList/style.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,17 @@ import styled from '@emotion/styled';
import { colors } from '@sopt-makers/colors';
import { fontsObject } from '@sopt-makers/fonts';

export const StDevHStack = styled.div`
display: flex;
align-items: center;
width: 100%;
gap: 10px;
margin-bottom: 15px;
& > p {
${fontsObject.TITLE_7_14_SB}
color: ${colors.gray10};
}
`;
export const StListHeader = styled.header`
h1 {
${fontsObject.TITLE_1_32_SB}
Expand Down
50 changes: 28 additions & 22 deletions src/components/org/OrgAdmin/hooks.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,27 +28,27 @@ interface UseMutateSendDataProps {
recruitHeaderImageFile: File;
}

const useMutateSendData = ({
headerImageFile,
coreValueImageFile1,
coreValueImageFile2,
coreValueImageFile3,
memberImageFile1,
memberImageFile2,
memberImageFile3,
memberImageFile4,
memberImageFile5,
memberImageFile6,
memberImageFile7,
memberImageFile8,
memberImageFile9,
memberImageFile10,
memberImageFile11,
memberImageFile12,
recruitHeaderImageFile,
}: UseMutateSendDataProps) => {
const useMutateSendData = (fileProps: UseMutateSendDataProps) => {
const {
headerImageFile,
coreValueImageFile1,
coreValueImageFile2,
coreValueImageFile3,
memberImageFile1,
memberImageFile2,
memberImageFile3,
memberImageFile4,
memberImageFile5,
memberImageFile6,
memberImageFile7,
memberImageFile8,
memberImageFile9,
memberImageFile10,
memberImageFile11,
memberImageFile12,
recruitHeaderImageFile,
} = fileProps;
const { open } = useToast();

const { mutate: sendMutate, isLoading: sendIsLoading } = useMutation({
mutationFn: (
data: AddAdminRequestDto,
Expand All @@ -68,10 +68,16 @@ const useMutateSendData = ({
!headerImageURL ||
!members ||
!recruitHeaderImageURL
)
) {
throw new Error('presigned url put 준비 과정에 에러가 발생함.');

}
try {
if (Object.values(fileProps).some((file) => !(file instanceof File))) {
alert(
'이미지가 정상적으로 올라가지 않았어요.\n이미지를 다시 첨부하고 재배포해주세요.',
);
return;
}
await Promise.all([
sendPresignedURL(headerImageURL, headerImageFile).catch((err) => {
console.error('소개 헤더 이미지 업로드 실패: ', err);
Expand Down
77 changes: 74 additions & 3 deletions src/components/org/OrgAdmin/index.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { useToast } from '@sopt-makers/ui';
import { Button, useToast } from '@sopt-makers/ui';
import { useState } from 'react';
import {
type FieldValues,
Expand All @@ -8,7 +8,10 @@ import {
} from 'react-hook-form';

import { AddAdminRequestDto } from '@/__generated__/org-types/data-contracts';
import { StListHeader } from '@/components/attendanceAdmin/session/SessionList/style';
import {
StDevHStack,
StListHeader,
} from '@/components/attendanceAdmin/session/SessionList/style';
import FilterButton from '@/components/common/FilterButton';
import {
type EXEC_TYPE,
Expand Down Expand Up @@ -49,7 +52,7 @@ function OrgAdmin() {
const [introPart, setIntroPart] = useState<PART_KO>('기획');

const methods = useForm({ mode: 'onBlur' });
const { handleSubmit, getValues, setError } = methods;
const { handleSubmit, getValues, setError, reset, setValue } = methods;

const { open } = useToast();

Expand Down Expand Up @@ -272,11 +275,79 @@ function OrgAdmin() {
],
})),
};

sendMutate(requestBody);
};

const handleClickMagicButton = (type: 'SET' | 'GET' | 'IMAGE' | 'RESET') => {
if (type === 'SET') {
localStorage.setItem('org-admin', JSON.stringify(getValues()));
alert('데이터 임시저장 성공!');
return;
}
if (type === 'GET') {
const data = localStorage.getItem('org-admin');
if (!data) {
alert('저장된 데이터가 없음ㅠ');
} else {
reset(JSON.parse(data));
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

오홍 대박이네여

alert(
'데이터 불러오기 성공! \n소개탭 헤더를 반드시 다시 첨부해주세요!',
);
}
return;
}

if (type === 'IMAGE') {
const headerImage = getValues('headerImageFileName');
if (!(headerImage?.file instanceof File)) {
alert('소개탭 헤더 넣어주세용');
return;
}
setValue('coreValue1.imageFileName', headerImage);
setValue('coreValue2.imageFileName', headerImage);
setValue('coreValue3.imageFileName', headerImage);
setValue('member.회장.profileImageFileName', headerImage);
setValue('member.부회장.profileImageFileName', headerImage);
setValue('member.총무.profileImageFileName', headerImage);
setValue('member.운영 팀장.profileImageFileName', headerImage);
setValue('member.미디어 팀장.profileImageFileName', headerImage);
setValue('member.메이커스 팀장.profileImageFileName', headerImage);
setValue('member.기획.profileImageFileName', headerImage);
setValue('member.디자인.profileImageFileName', headerImage);
setValue('member.안드로이드.profileImageFileName', headerImage);
setValue('member.iOS.profileImageFileName', headerImage);
setValue('member.웹.profileImageFileName', headerImage);
setValue('member.서버.profileImageFileName', headerImage);
setValue('recruitHeaderImage', headerImage);

alert('소개탭 헤더로 이미지 밀기 성공!');
return;
}
localStorage.removeItem('org-admin');

alert('데이터 초기화 성공! 새로고침하세용');
};
return (
<>
{process.env.NODE_ENV === 'development' && (
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

너무 괜찮은데용? 실제에 반영해도 좋을 거 같긴 합니다~
(물론 QA 더 해야겠지만,,)

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

인정합니당,, 일단 이정이 한번 경험시켜보고(?) 얘기해보도록 해여

<StDevHStack>
<p>매직버튼</p>
<Button size="sm" onClick={() => handleClickMagicButton('SET')}>
임시저장
</Button>
<Button size="sm" onClick={() => handleClickMagicButton('GET')}>
불러오기
</Button>
<Button size="sm" onClick={() => handleClickMagicButton('IMAGE')}>
이미지 채우기
</Button>
<Button size="sm" onClick={() => handleClickMagicButton('RESET')}>
데이터삭제
</Button>
</StDevHStack>
)}

<StListHeader>
<h1>공홈 관리</h1>
<FilterButton
Expand Down