Giter Site home page Giter Site logo

wavyfrontend's Introduction





Wavy - Client

인공지능 기반의 맞춤형 K-POP 댄스 학습 서비스






Introduction

Npm React Router Figma Prettier VSCode ESLint

Wavy의 Client는 위 개발 스택을 사용하여 개발되었습니다.

Getting Started

Wavy는 현재 위 URL에서 서비스되고 있습니다.

Features

Main - Video card
main-video-card
Main - Tag
main-tag
Main - Tag scroll
main-tag-scroll
Practice
practice
Challenge - start
challenge-start
Challenge - end
challenge-end
Analysis
analysis
Player - Marker and Loop
player-marker-and-loop
Review - Statistics
review-statistics
Reviw - Search
review-search
Search
search
Sign in
sign-in
Storage - Empty
storage-empty
Store
store

Directory Structure

src
├── assets
│   └── images
│   └── videos
├── components
│   └── App.tsx
│   └── Common
│   └── [PageName]
├── constants
├── hooks
│   └── api
│   └── Common
│   └── [PageName]
├── pages
│   └── [PageName]
├── router
├── store
│   └── Common
│   └── [PageName]
├── styles
│   └── global
│   └── theme
├── types
├── utils
└── index.tsx

기본적으로 파일 유형 이후 라우트에 의한 분리를 적용하였습니다.

Data Structure

상태 관리 라이브러리는 Recoil을 사용하였습니다.

store

// ConcreteDecorator
import { atom } from "recoil";

export const isPlayingState = atom<boolean>({
    key: "isPlayingState",
    default: false,
});

hook

// Decorator
import { useRecoilState } from "recoil";
import { isPlayingState } from "store";

const useControllerPlaying = () => {
    const [isPlaying, setIsPlaying] = useRecoilState(isPlayingState);
    const toggleIsPlaying = () => setIsPlaying((prev) => !prev);

    return { isPlaying, setIsPlaying, toggleIsPlaying };
};

export default useControllerPlaying;

component

// Component
import useControllerPlaying from "hooks/useControllerPlaying";

const someComponent = () => {
    const { isPlaying, toggleIsPlaying } = useControllerPlaying();

    return (
        <button onClick={toggleIsPlaying}>{isPlaying ? "중지" : "재생"}</button>
    );
};

전역 상태의 경우 store의 atom을 ConcreteDecorator 로써, hook을 Decorator 로써, Component를 Component 역할로써 Decorator 패턴을 각색하여 개발 및 사용하였습니다.

Developer

해당 프로젝트는 소프트웨어 마에스트로 사업의 지원을 받아 개발되었습니다.

FE: hyesungoh AI: haeseoklee BE: Yeonwu

License

WavyMIT License를 적용하고 있습니다.

wavyfrontend's People

Contributors

hyesungoh avatar

Stargazers

Hyobum Lee avatar

Watchers

Haeseok Lee avatar  avatar O-ye avatar

Forkers

hyesungoh

wavyfrontend's Issues

feat: Directory Structure 생성

src
├── components
│   └── App.tsx
├── hooks
├── index.tsx
├── pages
├── router
├── store
├── styles
├── types
└── utils
index.tsx

feat: useCapture custom hook 개발

웹캠 녹화를 선언적으로 관리하기 위해 useCapture custom hook 개발


  • 녹화 시작 개발
  • 녹화 종료 개발
  • 녹화 영상 다운로드 개발
  • 녹화 영상 request 개발 (S3에 직접 올리도록)

feat: 새로고침 시 로그인 상태 유지

useCheckCurrentMember를 Root component, App에서 호출하여

App이 렌더링될 시 (새로고침 될 시), localStorage에 저장된 token 값을 이용하여 API /members/me를 호출합니다.

그 후 반환값에 따라

  • localStorage와 Recoil state인 currentUserState를 초기화
  • currentUserState 최신화

위 동작을 나눠 수행합니다.

feat: controller - marker 개발

  • 마커 생성
  • 마커 이동
  • 마커 클릭 시 시점 이동
  • 마커 삭제
  • Loop를 위한 시작, 끝 마커 설정
  • Loop 기능 개발 및 적용
  • Loop 기능 처음 사용할 시 Notification
  • 분석 페이지 틀린 부분에 마커 생성

feat: Main page - MyTag section 개발

  • 마크업 개발
  • 디자인 적용
  • 분석한 영상 hook 개발
  • 분석한 영상 렌더링
  • 분석한 영상 infinite scroll (carouse) 적용
  • 삭제 기능
  • 공유 기능

feat: Practice page - controller 개발

  • 마크업 개발
  • 디자인 적용
  • 재생, 중지 적용
  • 프로그레스바 적용
  • 프로그레스바 눌렀을 시 시점이동
  • 재생속도 조절
  • 재생 시간 적용 (formatting)
  • 컨트롤러 레이아웃 버튼 적용
  • 방향키, 스페이스바 입력 시 플레이어 조절 및 이펙트 재생
  • 드래그하여 시점 이동
  • 반전 UI 적용

feat: 비동기 처리 환경 개발

  • axios instance 및 활용 get, post, put, delete 메소드 생성
  • fetcher 생성
  • axios interceptor 활용 request, response 전처리
  • Suspense, ErrorBoundary 활용 비동기 Wrapper 개발

refactor: common component move to router

기존 route 마다 nav, footer의 상태가 달라 route 마다 Nav, Footer 컴포넌트를 사용했으나
가독성과 확장성을 이유로 Router에 포함 후, 각 컴포넌트에서 상태관리하는 방향으로 리팩토링

feat: Step component 개발

단계에 맞는 컴포넌트를 렌더하는 Step component 개발


  • Children props 인덱스에 맞게 렌더링
  • Children Component에 setNextStep 전달
  • Children Component에 setPrevStep 전달

feat: Auth 페이지 개발

  • 마크업 개발
  • 디자인 적용
  • Kakao Login url api 적용
  • 회원정보 없을 시 /signup/term 라우팅
  • 회원정보 있을 시 root url 라우팅

refactor: image 핸들링

현재 public 폴더에 images/[PageName]/foo.svg 형태로 이미지 관리 중

public 폴더에서 관리되는 이미지들은 후처리(webpack 적용)가 되지 않아 변경이 불가피하여

src 폴더에 위치 후 재사용성을 고려한 Icon 컴포넌트 개발을 통해 리팩토링


  • declare를 위해 index.d.ts 개발
  • src/assets에 image, video 위치
  • Icon 컴포넌트 개발 및 적용

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.