radioGroupFoundation.ts 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. import BaseFoundation, { DefaultAdapter } from '../base/foundation';
  2. import { RadioChangeEvent } from './radioInnerFoundation';
  3. export interface RadioGroupAdapter extends DefaultAdapter {
  4. isInProps?: (name: string) => boolean;
  5. notifyChange?: (e: RadioChangeEvent) => void;
  6. setValue?: (value: any) => void
  7. }
  8. export default class RadioGroupFoundation extends BaseFoundation<RadioGroupAdapter> {
  9. constructor(adapter: RadioGroupAdapter) {
  10. super({ ...adapter });
  11. }
  12. init() {
  13. const displayValue = this._getDisplayValue();
  14. this._setValue(displayValue);
  15. }
  16. _getDisplayValue() {
  17. const { value, defaultValue } = this.getProps();
  18. let displayValue;
  19. if ('value' in this.getProps()) {
  20. displayValue = value;
  21. } else if ('defaultValue' in this.getProps()) {
  22. displayValue = defaultValue;
  23. }
  24. return displayValue;
  25. }
  26. handleChange(evt: any) {
  27. const mode = this.getProp('mode');
  28. const lastValue = this.getState('value');
  29. const { checked, value } = evt.target;
  30. const isControlledComponent = this._adapter.isInProps('value');
  31. const cbValue = {
  32. ...evt,
  33. target: {
  34. ...evt.target,
  35. value,
  36. }
  37. };
  38. if (mode === 'advanced' && !checked) {
  39. cbValue.target.value = undefined;
  40. }
  41. if (!isControlledComponent) {
  42. if (mode === 'advanced' && !checked) {
  43. this._setValue(undefined);
  44. } else {
  45. this._setValue(value);
  46. }
  47. }
  48. if (mode === 'advanced' || lastValue !== value) {
  49. this._adapter.notifyChange(cbValue);
  50. }
  51. }
  52. // call when prop.value change
  53. handlePropValueChange(propValue: any) {
  54. this._setValue(propValue);
  55. }
  56. _setValue(value: any) {
  57. this._adapter.setValue(value);
  58. }
  59. // eslint-disable-next-line @typescript-eslint/no-empty-function
  60. destroy() {}
  61. }