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

[FEATURE] 공홈 어드민 지원하기 페이지 퍼블리싱 #130

Merged
merged 14 commits into from
Nov 11, 2024

Conversation

eonseok-jeon
Copy link
Member

✨ 구현 기능 명세

  • 지원하기 페이지 퍼블리싱
  • react-dropzone을 통해 img 드롭다운 구현
  • react-hook-form 연결
스크린샷 2024-10-28 오후 2 24 59 스크린샷 2024-10-28 오후 2 25 27

✅ PR Point

😈 dropzone 구현

img 넣을 때 편하게 드롭다운으로 넣으라고 react-dropzone 이용해서 구현해줬어요
공통으로 빼놔서 나중에 다른 곳에서도 이용해도 좋을 거 같아요

코드보기
import { type MouseEvent, useCallback, useState } from 'react';
import { useDropzone } from 'react-dropzone';
import type { UseFormReturn } from 'react-hook-form';

import { VALIDATION_CHECK } from '@/utils/org';

import { StErrorMessage } from '../style';
import {
  StImgButton,
  StImgButtonWrapper,
  StImgIcon,
  StImgPreview,
} from './style';

interface MyDropzoneProps {
  method: UseFormReturn;
  label: string;
}

const MyDropzone = ({ method, label }: MyDropzoneProps) => {
  const [previewUrl, setPreviewUrl] = useState<string | null>(null);
  const {
    register,
    setValue,
    formState: { errors },
  } = method;

  const onDrop = useCallback(
    (acceptedFiles: File[]) => {
      const file = acceptedFiles[0];
      if (file) {
        const reader = new FileReader();
        reader.onloadend = () => {
          setPreviewUrl(reader.result as string);
          setValue(label, reader.result, { shouldValidate: true });
        };
        reader.readAsDataURL(file);
      }
    },
    [label, setValue],
  );

  const handleClick = (e: MouseEvent<HTMLInputElement>) => {
    e.preventDefault();
  };

  const { getRootProps, getInputProps, isDragActive } = useDropzone({
    onDrop,
    accept: {
      'image/jpeg': [],
      'image/jpg': [],
      'image/png': [],
    },
  });

  return (
    <StImgButtonWrapper>
      <StImgButton
        {...getRootProps({
          onClick: handleClick, // input의 클릭 이벤트 핸들링
        })}
        isError={errors[label]?.message != undefined}>
        <input
          {...getInputProps({})}
          {...register(label, {
            required: true && VALIDATION_CHECK.required.errorText,
          })}
          {...getInputProps()}
        />
        {previewUrl ? (
          <StImgPreview src={previewUrl} alt="공홈 지원하기 탭 헤더 이미지" />
        ) : isDragActive ? (
          <p>이미지를 드래그 해주세요...</p>
        ) : (
          <StImgIcon />
        )}
      </StImgButton>
      {errors[label] && (
        <StErrorMessage>
          <>{errors[label].message}</>
        </StErrorMessage>
      )}
    </StImgButtonWrapper>
  );
};

export default MyDropzone;

😈 파트 카테고리 공통 분리

파트 카테고리도 다른 곳에서 많이 사용되는 거 같아서 공통으로 분리했어요
스크린샷 2024-10-28 오후 2 28 35

코드보기
import { Chip } from '@sopt-makers/ui';


import { PART_LIST } from '@/utils/org';


import { StPartCategoryWrapper } from './style';


const PartCategory = () => {
  return (
    <StPartCategoryWrapper>
      {PART_LIST.map((part) => (
        <Chip key={`${part}-${part}`}>{part}</Chip>
      ))}
    </StPartCategoryWrapper>
  );
};


export default PartCategory;

Copy link
Member

@lydiacho lydiacho left a comment

Choose a reason for hiding this comment

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

예쁘네용 고생하셨습니다!!

스타일 등 몇가지 공통으로 빼면 좋을 것 같은 친구들이 보이는데 분리해주거나 아니면 그냥 나중에 차차 리팩해도 괜찮을것같아유 리소스에 맞게 편하게 해주세요 ~~

그리고 주용오빠 코드리뷰할때 주용오빠가 만들어둔 이미지 file input과 react-dropzone으로 언석오빠가 만든 input 컴포넌트 어떻게 통합하면 좋을지 생각해보면 좋을것같아여 그거 절충하면 그 친구로 제 소개탭에서도 쓸 수 있게 확장하는 작업 마저 할게요 !

src/components/org/OrgAdmin/MyDropzone/style.ts Outdated Show resolved Hide resolved
Comment on lines +46 to +49
placeholder={`파트별 인재상을 작성해주세요.
ex.
- 어려움과 고민을 편하게 나누고 공감할 수 있는 유대감과 열린 마음을 가진 분
- 타 파트와 협업하며 존중과 신뢰를 바탕으로 원활한 팀워크를 만들어갈 수 있는 분`}
Copy link
Member

Choose a reason for hiding this comment

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

여기 플레이스홀더가 이렇게 짤리는데...
image

이게 mds padding이랑 저희 padding이랑 살짝 달라서 생기는 문제인 것 같아요
저희는 왼쪽 여백 16px, 오른쪽 여백 14px인데
mds는 보니까 padding이 왼쪽 16, 오른쪽 8 + 오른쪽margin 8 이렇게 들어가있더라고요?
그래서 StTextArea 스타일에 margin 6px 로 오버라이딩 시켜주면 될 것 같아요
그리구 그 친구가 다른 곳에서도 쓰여야하니까 공통 스타일로 빼주면 좋을 것 같아요 !

Copy link
Member Author

Choose a reason for hiding this comment

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

Copy link
Member

Choose a reason for hiding this comment

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

이거

저희는 왼쪽 여백 16px, 오른쪽 여백 14px인데

이 맞는 스펙이네요 수정 해 두겠습니다.

src/components/org/OrgAdmin/MyDropzone/index.tsx Outdated Show resolved Hide resolved
Copy link
Member

@wuzoo wuzoo left a comment

Choose a reason for hiding this comment

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

승희가 말한 GUI 부분 정도만 수정해주시면 될 것 같네용 !! 고생하셨습니다 ~ 🚀

Copy link

cloudflare-workers-and-pages bot commented Nov 6, 2024

Deploying sopt-admin with  Cloudflare Pages  Cloudflare Pages

Latest commit: 84f916c
Status: ✅  Deploy successful!
Preview URL: https://ad1cff01.sopt-admin.pages.dev
Branch Preview URL: https://feature-org-admin-apply.sopt-admin.pages.dev

View logs

@eonseok-jeon eonseok-jeon changed the base branch from feature-org-admin-common-3 to dev November 11, 2024 05:27
@eonseok-jeon eonseok-jeon merged commit 8f56502 into dev Nov 11, 2024
1 check passed
@eonseok-jeon eonseok-jeon linked an issue Nov 17, 2024 that may be closed by this pull request
@eonseok-jeon eonseok-jeon deleted the feature-org-admin-apply branch November 17, 2024 01:25
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging this pull request may close these issues.

[FEATURE] 공홈 어드민 지원하기 페이지 퍼블리싱
4 participants