stateReducer.js 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
  2. function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
  3. function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
  4. import { getItemsCount, invariant } from '@algolia/autocomplete-shared';
  5. import { getCompletion } from './getCompletion';
  6. import { getNextActiveItemId } from './utils';
  7. export var stateReducer = function stateReducer(state, action) {
  8. switch (action.type) {
  9. case 'setActiveItemId':
  10. {
  11. return _objectSpread(_objectSpread({}, state), {}, {
  12. activeItemId: action.payload
  13. });
  14. }
  15. case 'setQuery':
  16. {
  17. return _objectSpread(_objectSpread({}, state), {}, {
  18. query: action.payload,
  19. completion: null
  20. });
  21. }
  22. case 'setCollections':
  23. {
  24. return _objectSpread(_objectSpread({}, state), {}, {
  25. collections: action.payload
  26. });
  27. }
  28. case 'setIsOpen':
  29. {
  30. return _objectSpread(_objectSpread({}, state), {}, {
  31. isOpen: action.payload
  32. });
  33. }
  34. case 'setStatus':
  35. {
  36. return _objectSpread(_objectSpread({}, state), {}, {
  37. status: action.payload
  38. });
  39. }
  40. case 'setContext':
  41. {
  42. return _objectSpread(_objectSpread({}, state), {}, {
  43. context: _objectSpread(_objectSpread({}, state.context), action.payload)
  44. });
  45. }
  46. case 'ArrowDown':
  47. {
  48. var nextState = _objectSpread(_objectSpread({}, state), {}, {
  49. activeItemId: action.payload.hasOwnProperty('nextActiveItemId') ? action.payload.nextActiveItemId : getNextActiveItemId(1, state.activeItemId, getItemsCount(state), action.props.defaultActiveItemId)
  50. });
  51. return _objectSpread(_objectSpread({}, nextState), {}, {
  52. completion: getCompletion({
  53. state: nextState
  54. })
  55. });
  56. }
  57. case 'ArrowUp':
  58. {
  59. var _nextState = _objectSpread(_objectSpread({}, state), {}, {
  60. activeItemId: getNextActiveItemId(-1, state.activeItemId, getItemsCount(state), action.props.defaultActiveItemId)
  61. });
  62. return _objectSpread(_objectSpread({}, _nextState), {}, {
  63. completion: getCompletion({
  64. state: _nextState
  65. })
  66. });
  67. }
  68. case 'Escape':
  69. {
  70. if (state.isOpen) {
  71. return _objectSpread(_objectSpread({}, state), {}, {
  72. activeItemId: null,
  73. isOpen: false,
  74. completion: null
  75. });
  76. }
  77. return _objectSpread(_objectSpread({}, state), {}, {
  78. activeItemId: null,
  79. query: '',
  80. status: 'idle',
  81. collections: []
  82. });
  83. }
  84. case 'submit':
  85. {
  86. return _objectSpread(_objectSpread({}, state), {}, {
  87. activeItemId: null,
  88. isOpen: false,
  89. status: 'idle'
  90. });
  91. }
  92. case 'reset':
  93. {
  94. return _objectSpread(_objectSpread({}, state), {}, {
  95. activeItemId: // Since we open the panel on reset when openOnFocus=true
  96. // we need to restore the highlighted index to the defaultActiveItemId. (DocSearch use-case)
  97. // Since we close the panel when openOnFocus=false
  98. // we lose track of the highlighted index. (Query-suggestions use-case)
  99. action.props.openOnFocus === true ? action.props.defaultActiveItemId : null,
  100. status: 'idle',
  101. query: ''
  102. });
  103. }
  104. case 'focus':
  105. {
  106. return _objectSpread(_objectSpread({}, state), {}, {
  107. activeItemId: action.props.defaultActiveItemId,
  108. isOpen: (action.props.openOnFocus || Boolean(state.query)) && action.props.shouldPanelOpen({
  109. state: state
  110. })
  111. });
  112. }
  113. case 'blur':
  114. {
  115. if (action.props.debug) {
  116. return state;
  117. }
  118. return _objectSpread(_objectSpread({}, state), {}, {
  119. isOpen: false,
  120. activeItemId: null
  121. });
  122. }
  123. case 'mousemove':
  124. {
  125. return _objectSpread(_objectSpread({}, state), {}, {
  126. activeItemId: action.payload
  127. });
  128. }
  129. case 'mouseleave':
  130. {
  131. return _objectSpread(_objectSpread({}, state), {}, {
  132. activeItemId: action.props.defaultActiveItemId
  133. });
  134. }
  135. default:
  136. invariant(false, "The reducer action ".concat(JSON.stringify(action.type), " is not supported."));
  137. return state;
  138. }
  139. };