Skip to content

Commit 5cc0ffb

Browse files
committed
feat: internal event support source
1 parent 092d8b2 commit 5cc0ffb

File tree

2 files changed

+29
-11
lines changed

2 files changed

+29
-11
lines changed

src/generate.tsx

Lines changed: 27 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import {
2727
SingleType,
2828
OnClear,
2929
INTERNAL_PROPS_MARK,
30+
SelectSource,
3031
} from './interface/generator';
3132
import { OptionListProps, RefOptionListProps } from './OptionList';
3233
import { toInnerValue, toOuterValues, removeLastEnabledValue, getUUID } from './utils/commonUtil';
@@ -150,8 +151,12 @@ export interface SelectProps<OptionsType extends object[], ValueType> extends Re
150151
onClear?: OnClear;
151152
skipTriggerChange?: boolean;
152153
skipTriggerSelect?: boolean;
153-
onRawSelect?: (value: RawValueType, option: OptionsType[number]) => void;
154-
onRawDeselect?: (value: RawValueType, option: OptionsType[number]) => void;
154+
onRawSelect?: (value: RawValueType, option: OptionsType[number], source: SelectSource) => void;
155+
onRawDeselect?: (
156+
value: RawValueType,
157+
option: OptionsType[number],
158+
source: SelectSource,
159+
) => void;
155160
};
156161
}
157162

@@ -433,7 +438,7 @@ export default function generateSelector<
433438
[baseValue, mergedOptions],
434439
);
435440

436-
const triggerSelect = (newValue: RawValueType, isSelect: boolean) => {
441+
const triggerSelect = (newValue: RawValueType, isSelect: boolean, source: SelectSource) => {
437442
const outOption = findValueOption([newValue], mergedFlattenOptions)[0];
438443

439444
if (!internalProps.skipTriggerSelect) {
@@ -457,9 +462,9 @@ export default function generateSelector<
457462
// Trigger internal event
458463
if (useInternalProps) {
459464
if (isSelect && internalProps.onRawSelect) {
460-
internalProps.onRawSelect(newValue, outOption);
465+
internalProps.onRawSelect(newValue, outOption, source);
461466
} else if (!isSelect && internalProps.onRawDeselect) {
462-
internalProps.onRawDeselect(newValue, outOption);
467+
internalProps.onRawDeselect(newValue, outOption, source);
463468
}
464469
}
465470
};
@@ -488,7 +493,10 @@ export default function generateSelector<
488493
setInnerValue(outValue);
489494
};
490495

491-
const onInternalSelect = (newValue: RawValueType, { selected }: { selected: boolean }) => {
496+
const onInternalSelect = (
497+
newValue: RawValueType,
498+
{ selected, source }: { selected: boolean; source: 'option' | 'selection' },
499+
) => {
492500
if (disabled) {
493501
return;
494502
}
@@ -513,7 +521,7 @@ export default function generateSelector<
513521
}
514522

515523
// Trigger `onSelect`. Single mode always trigger select
516-
triggerSelect(newValue, !isMultiple || selected);
524+
triggerSelect(newValue, !isMultiple || selected, source);
517525

518526
// Clean search value if single or configured
519527
if (mode === 'combobox') {
@@ -525,6 +533,14 @@ export default function generateSelector<
525533
}
526534
};
527535

536+
const onInternalOptionSelect = (newValue: RawValueType, info: { selected: boolean }) => {
537+
onInternalSelect(newValue, { ...info, source: 'option' });
538+
};
539+
540+
const onInternalSelectionSelect = (newValue: RawValueType, info: { selected: boolean }) => {
541+
onInternalSelect(newValue, { ...info, source: 'selection' });
542+
};
543+
528544
// ============================= Input ==============================
529545
// Only works in `combobox`
530546
const customizeInputElement: React.ReactElement =
@@ -585,7 +601,7 @@ export default function generateSelector<
585601
);
586602
triggerChange(newRawValues);
587603
newRawValues.forEach(newRawValue => {
588-
triggerSelect(newRawValue, true);
604+
triggerSelect(newRawValue, true, 'input');
589605
});
590606

591607
// Should close when paste finish
@@ -644,7 +660,7 @@ export default function generateSelector<
644660

645661
if (removeInfo.removedValue !== null) {
646662
triggerChange(removeInfo.values);
647-
triggerSelect(removeInfo.removedValue, false);
663+
triggerSelect(removeInfo.removedValue, false, 'input');
648664
}
649665
}
650666

@@ -773,7 +789,7 @@ export default function generateSelector<
773789
values={rawValues}
774790
height={listHeight}
775791
itemHeight={listItemHeight}
776-
onSelect={onInternalSelect}
792+
onSelect={onInternalOptionSelect}
777793
onToggleOpen={onToggleOpen}
778794
onActiveValue={onActiveValue}
779795
defaultActiveFirstOption={mergedDefaultActiveFirstOption}
@@ -896,7 +912,7 @@ export default function generateSelector<
896912
searchValue={mergedSearchValue}
897913
activeValue={activeValue}
898914
onSearch={triggerSearch}
899-
onSelect={onInternalSelect}
915+
onSelect={onInternalSelectionSelect}
900916
/>
901917
</SelectTrigger>
902918

src/interface/generator.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import { SelectProps, RefSelectProps } from '../generate';
22

3+
export type SelectSource = 'option' | 'selection' | 'input';
4+
35
export const INTERNAL_PROPS_MARK = 'RC_SELECT_INTERNAL_PROPS_MARK';
46

57
// =================================== Shared Type ===================================

0 commit comments

Comments
 (0)