static getDerivedStateFromProps()

in src/select/select.tsx [418:471]


  static getDerivedStateFromProps<T = unknown>(nextProps: SelectProps<T>, prevState: SelectState<T>) {
    const {multiple, data, type} = nextProps;
    const {prevSelected, prevData, prevMultiple, filterValue} = prevState;
    const nextState: Partial<SelectState<T>> = {
      prevData: data,
      prevSelected: nextProps.selected,
      prevMultiple: multiple,
    };

    if ('data' in nextProps && data !== prevData) {
      const {filteredData, addButton} = getListItems(nextProps, prevState, filterValue, data);
      Object.assign(nextState, {shownData: filteredData, addButton});

      if (prevState.selected) {
        Object.assign(nextState, {
          filterValue: getValueForFilter(prevState.selected, type, filterValue),
        });
      }
    }

    if ('selected' in nextProps && nextProps.selected !== prevSelected) {
      const selected = nextProps.selected || (multiple ? [] : null);

      Object.assign(nextState, {
        selected,
        filterValue: getValueForFilter(selected, type, filterValue),
      });
    }

    if (prevMultiple !== multiple && !dequal(prevMultiple, multiple)) {
      nextState.selected = multiple ? [] : null;
    }

    if (multiple && !nextState.selected) {
      nextState.selected = prevState.selected;
    }

    const {selected} = {...prevState, ...nextState};
    if (selected && Array.isArray(selected)) {
      nextState.multipleMap = buildMultipleMap(selected);
      const {filteredData, addButton} = getListItems(nextProps, nextState, filterValue, data);
      Object.assign(nextState, {shownData: filteredData, addButton});
    }

    const isSelectionEmpty =
      nextProps.selected === null ||
      nextProps.selected === undefined ||
      (Array.isArray(nextProps.selected) && nextProps.selected.length === 0);
    if (isSelectionEmpty) {
      nextState.lastInteractedKey = null;
    }

    return nextState;
  }