Github client

Деплой

О процессе разработки

Использованные технологи:

1. React, Mobx, Axios

2. Typescript ❤️, SCSS, Webpack, Storybook...

Реализованные фичи

1. Поиск репозиториев

2. Получение данных по выбранному репо

3. Использование квери параметров

4. Пагинация и сортировки

5. Добавлена темная тема и переключение

6. Очередь сообщений

7. Кеширование запросов API

Сложности на пути

1. Ограничения по запросам от API 😑

2. Добавление пагинации

3. Двойной рендеринг от React.StrictMode 🤔

4. Axios + Cache Interceptor + Abort = 🙀

5. Внедрение тем с помощью SCSS

6. Поддержка Jest и Storybook при миграции с CRA

Ограничения по запросам от API 😑

60 в час на 1 IP адрес 😿

 

Решение:

1. добавление кеширования (Etag, If-modified)

2. 5000 в час на один аккаунт с токеном

 

Добавление пагинации

/orgs/{orgName}/repos

 

Решение:

/search/repositories?q=org:{orgName}

export const useLocalStore = <T extends ILocalStore>(
  create: () => T
): T => {
  const ref = React.useRef<null | T>(null);
  
  ref.current ??= create();

  React.useEffect(() => {
    store.init();
    
    return () => {
      store.destroy();
    };
  }, []);

  return ref.current;
};
# PRESENTING CODE

Двойной рендеринг от React.StrictMode 🤔

export const useLocalStore = <T extends ILocalStore>(
  create: () => T
): T => {
  const ref = React.useRef<null | T>(null);
  
  ref.current ??= create();

  React.useEffect(() => {
    ref.current ??= create();
    ref.current.init();

    return () => {
      ref.current?.destroy();
      ref.current = null;
    };
  }, [create]);

  return ref.current;
};
# PRESENTING CODE

Двойной рендеринг от React.StrictMode 🙂

Axios + Cache Interceptor + Abort = 🙀

Проблема в зависании axios

Решение:

1. дебаг - источник проблемы не найден 🙈

2. добавлю ка в запрос задержку 🤔

3. ментора не проведешь 😹

4. еще дебаг - такс  проблема в интерцепторе

5. stackoverflow + github issues

6. workaround - заработало 😌

Внедрение тем с помощью SCSS

$themes: (
  light: (
    text: #000,
    background: #fff,
  ),
  dark: (
    text: #ccc,
    background: #222,
  ),
);

@mixin themify($arg: theme) {
  @each $theme, $map in $themes {
    :global(.theme-#{$theme}) & {
      $theme-map: () !global;

      @each $key, $submap in $map {
        $value: map-get(map-get($themes, $theme), '#{$key}');
        $theme-map: map-merge(
          $theme-map,
          (
            $key: $value,
          )
        ) !global;
      }
      @content;
      $theme-map: null !global;
    }
  }
}

@function getValue($key) {
  @return map-get($theme-map, $key);
}
# PRESENTING CODE

Впечатления от курса

  • Понравились ревью от ментора 🔥
  • Работа с Typescript ❤️‍
  • Познакомился со Storybook
  • Хорошая подача практик и паттернов работы с React и Mobx 👾
  • Хотелось бы заменить значительную часть миксинов SCSS на работу с CSS переменными (R.I.P. 🪦 IE11)

Github Client

By qpundb