radioInnerFoundation.ts 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. import BaseFoundation, { DefaultAdapter } from '../base/foundation';
  2. export interface RadioChangeEvent {
  3. target: {
  4. [x: string]: any;
  5. checked: boolean;
  6. value: any;
  7. };
  8. stopPropagation: () => void;
  9. preventDefault: () => void;
  10. }
  11. export interface RadioInnerAdapter extends DefaultAdapter {
  12. notifyChange?: (e: RadioChangeEvent) => void;
  13. setNativeControlChecked?: (checked: boolean) => void;
  14. }
  15. export default class RadioInnerFoundation extends BaseFoundation<RadioInnerAdapter> {
  16. constructor(adapter: RadioInnerAdapter) {
  17. super({ ...adapter });
  18. }
  19. init() {
  20. const checked = this._adapter.getProp('checked');
  21. const defaultChecked = this._adapter.getProp('defaultChecked');
  22. this.setChecked(checked || defaultChecked);
  23. }
  24. setChecked(checked: boolean) {
  25. this._adapter.setNativeControlChecked(checked);
  26. }
  27. getChecked() {
  28. return this._adapter.getProp('checked');
  29. }
  30. handleChange(e: any) {
  31. const isControlledMode = 'checked' in this.getProps();
  32. const { checked } = e.target;
  33. const stopPropagation = () => {
  34. e.stopPropagation();
  35. };
  36. const preventDefault = () => {
  37. e.preventDefault();
  38. };
  39. const cbValue = {
  40. target: {
  41. ...this.getProps(),
  42. checked,
  43. },
  44. stopPropagation,
  45. preventDefault
  46. };
  47. if (isControlledMode) {
  48. this._adapter.notifyChange(cbValue);
  49. } else {
  50. this.setChecked(checked);
  51. this._adapter.notifyChange(cbValue);
  52. }
  53. }
  54. // eslint-disable-next-line @typescript-eslint/no-empty-function
  55. destroy() {}
  56. }