Skip to content

5주차과제 - 전역 상태 공유 및 리팩토링#12

Open
nunoria wants to merge 18 commits intomainfrom
kibeom/5week
Open

5주차과제 - 전역 상태 공유 및 리팩토링#12
nunoria wants to merge 18 commits intomainfrom
kibeom/5week

Conversation

@nunoria
Copy link
Collaborator

@nunoria nunoria commented Jun 12, 2025

5주차-상태 공유 및 리팩토링

개요

  • createContext, useContext 사용한 전역상태관리
  • 커스텀 훅 구현
  • 컴포넌트 분리등 리펙토링

구현 내용

1. 기본과제

[전역상태 관리]

  • SesseionProvider를 구현하여 로그인 및 관련 메서드를 전역으로 사용

    • session : 로그인 상태 정보
    • isAdmin : 관리자 여부
    • login(), logout(), getSession(), setAdmin(): 상태 변경 함수
    /* hooks/Session.jsx */
    const SessionContext = createContext();
    export function SessionProvider({ children, expireTime = 3600 }) {
    // ... 기능 구현
    
      return (
          <SessionContext.Provider value={{ session, getSession, login, logout, isAdmin, setIsAdmin }}>
              {children}
          </SessionContext.Provider>
      );
    }
    
    /* App.jsx */
    function App() {
    //... 기능 구현
      return (
        <BrowserRouter>
          <SessionProvider expireTime={600}>
            <Toaster position="bottom-center" reverseOrder={false} />
            <Routes>
              <Route path="/" element={<Layout />}>
                <Route index element={<Dashboard />} />
                <Route path="LeaveRequest" element={<LeaveRequest />} />
                <Route path="Members" element={<Members />} />
                <Route path="Attendance" element={<Attendance />} />
              </Route>
            </Routes>
          </SessionProvider>
        </BrowserRouter>
      );
    }

2. 선택과제

[커스텀 훅]

  • useSession 구현 및 사용

    /* hooks/Session.jsx */
    export function useSession() {
        const context = useContext(SessionContext);
        if (!context) {
            throw new Error("useSession must be used within a SessionProvider");
        }
        return context;
    }
    
    /* pages/LeaveRequest.jsx */
    export default function LeaveRequest() {
    // ...기타 기능 구현
        useEffect(() => {
    
            if (!session) {
                setUser(null);
                setUserLeaveList([]);
                return;
            }
    
            // 세션 정보가 있는 경우 user 정보 가져오기
            const foundMember = getMember({
                memberId: session.id
            })
            if (foundMember) {
                const userLeaveList = getLeaveList({
                    memberId: foundMember.id
                })
    
                setUser(foundMember);
                setUserLeaveList(userLeaveList);
            } else {
                console.error("로그인된 유저가 없습니다.");
            }
    
        }, [session]);

[mock API ]

  1. mock data를 json 파일로 저장

    1. attendance.json
    2. leave.json
    3. member.json
  2. App 마운트시 각 json 파일을 localStorage 에 저장

    /* App.jsx */
      // json 파일을 storage에 저장
      setAttendanceList(attandanceList);
      setLeaveList(leaveList);
      setMemberList(memberList);
  3. lib/storage 에 localStorage 에 대한 data 처리(get, update) 함수 구현

    /* lib/storage.js */
    
    export function getAttendanceList({ memberId })
    export function updateAttendanceList(record)
    export function getLeaveList({ memberId })
    export function updateLeaveList(record)
    export function getMemberList()
    export function getMember({ memberId } = {})

3. 기타 구현

  • 로그인 구현
    • 로그인 페이지 구현
      • 이기범,김도완, 조범구,류제원 이름으로 로그인
    • 기존 구현 내용을 로그인 유저 상황에 맞게 리팩토링
  • 관리자 모드 구현
    • “직원 현황” 메뉴는 관리자 모드에서만 접근 가능
    • “근태 현황” 페이지에서 직원 검색 기능은 관리자 모드에서만 가능
  • 스위치 컴포넌트 구현

추가 Library

주요 학습내용

UI/UX 특징

RoyKimDeveloper and others added 18 commits April 5, 2025 22:08
- CSS reset
- tailwind spacing에 "pxr" suffix 추가
- screen 사이즈 조정

Signed-off-by: kibum.lee <kissyou7@gmail.com>
- TeamMemberCard 컴포넌트 구현
- lucide-react 라이브러리 설치

Signed-off-by: kibum.lee <kissyou7@gmail.com>
- Modal 컴포넌트 구현
- TeamMemberCard 컴포넌트에 Modal 컴포넌트 적용

Signed-off-by: kibum.lee <kissyou7@gmail.com>
- 조건부 tailwind uc 처리
- 중복 tailwind uc 제거

Signed-off-by: kibum.lee <kissyou7@gmail.com>
Signed-off-by: kibum.lee <kissyou7@gmail.com>
- onOpenChange, open prop을 사용하여 외부에서 상태 관리 가능하도록함
- ModalClose 추가 하여, Close 커스텀 가능하도록함
- aria 속성 추가

Signed-off-by: kibum.lee <kissyou7@gmail.com>
- Card 컴포넌트는 공통 적용부분만 분리
- TeamMemberCard의 모달 state 직접관리
- 기타 코드 정리

Signed-off-by: kibum.lee <kissyou7@gmail.com>
- mount, visible 상태 추가

Signed-off-by: kibum.lee(t14) <kissyou7@gmail.com>
- mount 상태에 따른 content 렌더링 버그 수정
- ModalTrigger 버그수정

Signed-off-by: kibum.lee <kissyou7@gmail.com>
- ModalClose 존재하지 않는경우 Default 스타일로 ModalClose 스타일 적용

Signed-off-by: kibum.lee <kissyou7@gmail.com>
- react-router-dom 을 이용하여 페이지 분리
- 네비게이션 컴포넌트 추가 및 레이아웃 구성

Signed-off-by: kibum.lee <kissyou7@gmail.com>
- dayjs 라이브러리 설치
- member 리스트를 json 파일로 분리
- AttendanceRecord 클래스 구현
- 출퇴근 기록을 localStorage에 저장하는 기능 구현

Signed-off-by: kibum.lee <kissyou7@gmail.com>
- 배지 컴포넌트 분리
- 카드 컴포넌트에 배지로 오늘의 근태현황을 보여줌

Signed-off-by: kibum.lee <kissyou7@gmail.com>
- Select컴포넌트 구현
- Weather Card 컴포넌트 구현

Signed-off-by: kibum.lee <kissyou7@gmail.com>
Signed-off-by: kibum.lee <kissyou7@gmail.com>
Signed-off-by: kibum.lee <kissyou7@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants