index.js 3.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. import { useEvent, useRef, useState, useEffect, useMemo, } from 'functional-mini/component';
  2. import '../_util/assert-component2';
  3. import { mountComponent } from '../_util/component';
  4. import { useComponentEvent } from '../_util/hooks/useComponentEvent';
  5. import { useMixState } from '../_util/hooks/useMixState';
  6. import { PickerFunctionalProps } from './props';
  7. import { getMatchedItemByIndex, getMatchedItemByValue, getterColumns, getterFormatText, getterSelectedIndex, } from './utils';
  8. var Picker = function (props) {
  9. var _a;
  10. var _b = useMixState((_a = props.defaultValue) !== null && _a !== void 0 ? _a : [], {
  11. value: props.value,
  12. }), value = _b[0], _c = _b[1], isValueControlled = _c.isControlled, updateValue = _c.update;
  13. var _d = useComponentEvent(props), triggerEvent = _d.triggerEvent, triggerEventOnly = _d.triggerEventOnly, triggerEventValues = _d.triggerEventValues;
  14. var _e = useMixState(props.defaultVisible, {
  15. value: props.visible,
  16. }), visible = _e[0], updateVisible = _e[1].update;
  17. var singleRef = useRef(false);
  18. var selectIndexRef = useRef(null);
  19. function triggerPicker(newVisibleValue) {
  20. updateVisible(newVisibleValue);
  21. triggerEvent('visibleChange', newVisibleValue);
  22. }
  23. var _f = useState([]), selectedIndex = _f[0], setSelectedIndex = _f[1];
  24. var columns = useMemo(function () {
  25. return getterColumns(props.options, singleRef);
  26. }, [props.options]);
  27. useEffect(function () {
  28. selectIndexRef.current = null;
  29. setSelectedIndex(getterSelectedIndex(columns, value, singleRef));
  30. }, [columns, value]);
  31. var formatValue = useMemo(function () {
  32. if (typeof props.formattedValueText === 'string') {
  33. return props.formattedValueText;
  34. }
  35. var formatValue = getterFormatText(columns, value, props.onFormat, singleRef);
  36. return formatValue;
  37. }, [props.formattedValueText, visible, columns, value, props.onFormat]);
  38. useEvent('onOpen', function () {
  39. if (props.disabled) {
  40. return;
  41. }
  42. selectIndexRef.current = null;
  43. var selectedIndex = getterSelectedIndex(columns, value, singleRef);
  44. setSelectedIndex(selectedIndex);
  45. triggerPicker(true);
  46. });
  47. useEvent('onCancel', function () {
  48. triggerPicker(false);
  49. triggerEventOnly('cancel', { detail: { type: 'cancel' } });
  50. });
  51. useEvent('onMaskDismiss', function () {
  52. if (!props.maskClosable) {
  53. return;
  54. }
  55. triggerPicker(false);
  56. triggerEventOnly('cancel', { detail: { type: 'mask' } });
  57. });
  58. useEvent('onChange', function (e) {
  59. var selectedIndex = e.detail.value;
  60. var _a = getMatchedItemByIndex(columns, selectedIndex, singleRef), matchedColumn = _a.matchedColumn, matchedValues = _a.matchedValues;
  61. selectIndexRef.current = selectedIndex;
  62. setSelectedIndex(selectedIndex);
  63. triggerEventValues('change', [matchedValues, matchedColumn], e);
  64. });
  65. useEvent('onOk', function () {
  66. var result;
  67. if (selectIndexRef.current) {
  68. result = getMatchedItemByIndex(columns, selectIndexRef.current, singleRef);
  69. }
  70. else {
  71. result = getMatchedItemByValue(columns, value, singleRef);
  72. }
  73. var matchedColumn = result.matchedColumn, matchedValues = result.matchedValues;
  74. triggerPicker(false);
  75. if (!isValueControlled) {
  76. updateValue(matchedValues);
  77. }
  78. triggerEventValues('ok', [matchedValues, matchedColumn]);
  79. });
  80. return {
  81. formatValue: formatValue,
  82. selectedIndex: selectedIndex,
  83. columns: columns,
  84. state: {
  85. visible: visible,
  86. },
  87. mixin: {
  88. value: value,
  89. },
  90. };
  91. };
  92. mountComponent(Picker, PickerFunctionalProps);