Git Product home page Git Product logo

dev-stats's Introduction

devstats

Provides a dashboard-like visualization of your GitHub activity.

Getting Started

run dev server

yarn install
yarn dev

.env

GITHUB_ACCESS_TOKEN=
OPENAI_API_KEY=

dev-stats's People

Contributors

sossost avatar f-lab-bot avatar

Forkers

sossost

dev-stats's Issues

코드 리뷰 2

  1. 현재 깃헙 API는 클라이언트 단에서 호출되고 있고, 그렇게 하기 위해서 깃헙 액세스 토큰을 public 환경 변수로 사용하고 있습니다(NEXT_PUBLIC_GITHUB_ACCESS_TOKEN). 그런데 이렇게 하면 이 토큰 값이 외부에 노출이 됩니다. 아래 스크린샷을 참조해주세요.
    스크린샷 2024-06-26 오전 11 21 46
    그래서 보통 이런 경우 윤수 님이 별도의 서버를 두어서 클라이언트에서는 이 서버로 요청을 보내고, 이 서버에서 깃헙 서버로 요청을 보내는 방식으로 처리합니다. Vercel에 Serverless function이 있고 이 기능을 이용하시면 편리합니다.

  2. formatCount 유틸 함수에서 count가 정확히 1000일 때는 1k로 표시돼야 하는데, 1000으로 표시될 것 같습니다. 그래서 이런 코드들은 직접 짜는 것보다 라이브러리를 이용하는 편이 낫습니다.

  3. UserList.tsx 59번째 라인에 오타가 있습니다. 그리고 여기서는 cvacn 같은 유틸 함수를 쓸 필요 없이 그냥 "sm:text-[15px] lg:text-[16px]"라고 적어주시면 됩니다.

코드 리뷰

  1. hook 리팩토링
  • useSearchUser는 우선 훅 이름과 그 훅이 하는 일이 잘 매치되지 않습니다. 훅 이름만 보면 username을 넘겨 받으면, 그 username으로 user를 검색하는 훅처럼 보이는데, 실제로는 아무 파라미터도 넘겨 받지 않습니다. 이 부분은 어제 말씀드린대로 훅을 없애고 이 훅을 사용하던 해당 컴포넌트에서 직접 처리해주세요.
  • useSearchUserQuery도 어제 말씀드린 대로 리팩토링 해주시는데 한 가지 덧붙일 것은, debounceuseSearchUserQuery에서 호출할 것이 아니라 호출하는 쪽에서 처리하는게 맞습니다. 왜냐하면 debounce가 useSearchUserQuery의 본질적인 내용이 아니기 때문입니다. useSearchUserQuery는 유저를 검색하는 것이 그 함수의 본질적인 역할이고 그 함수의 호출 빈도를 조절하는 것은 유저 검색과는 별도의 동작이기 때문에 useSearchUserQuery 안에서 debounce를 호출하는 것은 맞지 않습니다.
  • 그래서 제 생각에는 debounce 기능을 MainPageClient.tsx에서 처리하시는게 좋을 것 같아요. 여기서 showSearchPanel이라는 상태값을 하나 두시고 이 값이 true일 때만 SearchPanel을 렌더링 하시는 겁니다. SearchPanel 안에서는 별도의 debounce 기능 없이 바로 네트워크 요청을 보내고요. 그리고 SearchBaronChange을 이용해서 마지막으로 onChange가 호출되고 300ms 이상 지나면 showSearchPaneltrue로 설정하시면 될 것 같습니다.
  1. Fallback.tsx에서는 타이핑을 아래와 같이 변경하는게 좋겠습니다.
type FallbackType = Exclude<AsyncState, "SUCCESS">;

type FallbackProps = {
  aysncState: FallbackType;
};

export const Fallback = ({ aysncState }: FallbackProps) => {
  const FALLBACK: {
    [key in FallbackType]: JSX.Element | string;
  } = {
    LOADING: <LoadingSpinner />,
    NO_RESULT: <p>No results found</p>,
    ERROR: <p>An error occurred</p>,
  };

  return ...
};

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.