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

Рефакторинг фильтра. Этап 1 #386

Open
5 tasks done
INextYP opened this issue Aug 18, 2024 · 1 comment · May be fixed by #393
Open
5 tasks done

Рефакторинг фильтра. Этап 1 #386

INextYP opened this issue Aug 18, 2024 · 1 comment · May be fixed by #393
Assignees

Comments

@INextYP
Copy link
Collaborator

INextYP commented Aug 18, 2024

Ветка для работы - refactor/filter
3. Избавиться от div и form. Пока фильтр не открыт - это просто КНОПКА. Не нужно обрабатывать работу с формойImage
2. Работа с формой должна переехать в компонент FilterCover.
3. В идеале - FilterWrapper и FilterCover должны принимать в качестве пропса filterMenu просто объект items. Сделать корректную типизацию:

export interface IFilterValues {
  categories?: string[];
  searchRadius?: string;
  sortBy?: string;
  date?: string;
  time?: string[];
  userCategories?: string[];
}

export interface FilteringProps {
  items: {
    [key in keyof IFilterValues]?: boolean;
  };
  setFilteres?: (date: IFilterValues) => void;
  notFoundFilter?: never;
}

Важно. После правки выше нужно поменять пропсы у filter. Например. Было:

<Filter
              items={{
                sort: true,
                categories: true,
                radius: false,
                date: false,
              }}
              setFilteres={setInfoFilterTasks}
            />

стало:

<Filter
              items={{
                sortBy: true,
                categories: true,
                searchRadius: false,
                date: false,
              }}
              setFilteres={setInfoFilterTasks}
            />
  1. В FilterWrapper из пропсов должен принимать:- filterMenu (взять тип из IFilterValues)
  • setFilteres
  1. В FilterCover пропсов должен принимать:
  • filterMenu (взять тип из FilterProps)
  • setFilteres
  • closeFilterMenu
  • position
  1. Рефакторинг FilterCover.
  • Если пункты выше были корректно выполнены, то в компонент сейчас приходит объект items со следующим типом:
{
  categories: string[];
  searchRadius: string;
  sortBy: string;
  date: string;
  time: string[];
  userCategories: string[];
}

В котором могут быть значения, которые не нужны нам в текущей форме. Как пример, в фильтр мы передаем объект:

{
  searchRadius: string;
  sortBy: string;
  time: string[];
}

Остальные дефолтные значения нам не нужны. Поэтому нужно написать функцию, которая будет принимать объект items и формировать из него корректные дефолтные значения.

  • Выносим все названия компонентов с которыми работает форма в объект-конфиг. В идеале, вынести в defaultValues чтобы получился такой конфиг:
const defaultValues = {
  categories: { value: [], component: CategoriesBlock },
  searchRadius: { value: '', component: RadiusBlock },
  sortBy: { value: '', component: SortByBlock },
  date: { value: '', component: CalenderBlock },
  time: { value: [], component: TimeBlock },
  userCategories: { value: [], component: UserCategoriesBlock },
};

Функция выше в итоге должна вернуть { values, components }, где values - корректные значения, а components - корректные компоненты исходя из filterMenu пропса

  • В FilterCover первым делом вызываем функцию выше и получаем данные для работы компонента. Примерно так:
const { values, components } = getDefaultValues(filterMenu);

// values -  передаём в хук useForm
// components  используем для построения блоков
  • Во всех компонентах, с которыми работает форма должен сложиться единый формат пропсов, т.е. сами компоненты должны получать одинаковые ключи пропсов value и onChange, например:
// Было
interface TimeBlockProps {
  onChange: (value: string[]) => void;  
  filterTime: Array<string>;
}

// Стало
interface TimeBlockProps {
  onChange: (value: string[]) => void;
  value: Array<string>;
}
  • В FilterCover формируем из components элементы формы (вместо { filterMenu }). Тут дам подсказку. Должно получиться примерно так:
{Object.keys(components).map((name, i) => (
            <Controller
              key={i}
              name={name as keyof IFilterValues}
              control={control}
              render={({ field }) => {
                const Component = components[name as keyof IFilterValues];

                return (
                  <Component onChange={field.onChange} value={field.value} />
                );
              }}
            />
          ))}
@ZaytsevAlexanderGit ZaytsevAlexanderGit self-assigned this Aug 19, 2024
@ZaytsevAlexanderGit
Copy link
Contributor

ZaytsevAlexanderGit commented Aug 20, 2024

@INextYP Сначала уточню, если я правильно понимаю, то к пункту 6) входные данные items - аналогичны входным в Filter то есть все возможные категории boolean, а не как написано:

{
  categories: string[];
  searchRadius: string;
  sortBy: string;
  date: string;
  time: string[];
  userCategories: string[];
}

И соответственно далее на этой основе форма и создается?

В пункте снова получается 5)"В FilterWrapper из пропсов должен принимать:- filterMenu (взять тип из IFilterValues)" -
IFiltervalues это как раз уже значение категорий итп, но откуда FilterWrapper их возьмет уже непосредственно значениями, если на этом этапе формы вообще еще нет?
А в следующем пункте 6)В FilterCover пропсов должен принимать: filterMenu (взять тип из FilterProps) -
В FilterProps filterMenu - items объект с категориями и значениями boolean. Причем снова насколько я понимаю, в FilterCover filterMenu приходит из FilterWrapper.

И оба предыдущих пункта немного противоречат пункту 3) где они принимают одинаковые пропсы filterMenu

Далее вопрос который для меня пока не понятен:
Согласно 1 и 2 пунктам мы переносим form в FilterCover.
Значит, насколько я понимаю и useForm мы переносим в FilterCover?
Но тогда получается, что форма при открытии/закрытии создается заново с defaultValues, и не сохраняются заданные?

Возможно подразумевается что FilterWrapper по другому как-то делается, сейчас у меня сделан практически как было, только пропсы входящие поменялись:

return (
    <>
      <FilterButton onClick={toggleFilterMenu} ref={filterButtonRef} />

      {isFilterMenuVisible && (
        <FilterCover
          closeFilterMenu={toggleFilterMenu}
          position={filterPosition}
          filterMenu={filterMenu}
          setFilteres={setFilteres}
        />
      )}
    </>
  );

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 a pull request may close this issue.

2 participants