foundation.ts 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. import BaseFoundation, { DefaultAdapter } from '../base/foundation';
  2. import warning from '../utils/warning';
  3. export interface SwitchAdapter<P = Record<string, any>, S = Record<string, any>> extends DefaultAdapter<P, S> {
  4. setNativeControlChecked: (nativeControlChecked: boolean | undefined) => void;
  5. setNativeControlDisabled: (nativeControlDisabled: boolean | undefined) => void;
  6. setFocusVisible: (focusVisible: boolean) => void;
  7. notifyChange: (checked: boolean, e: any) => void
  8. }
  9. export default class SwitchFoundation<P = Record<string, any>, S = Record<string, any>> extends BaseFoundation<SwitchAdapter<P, S>, P, S> {
  10. constructor(adapter: SwitchAdapter<P, S>) {
  11. super({ ...adapter });
  12. }
  13. init(): void {
  14. const { disabled } = this.getProps();
  15. this.setDisabled(disabled);
  16. }
  17. setChecked(checked: boolean | undefined): void {
  18. this._adapter.setNativeControlChecked(checked);
  19. }
  20. setDisabled(disabled: boolean | undefined): void {
  21. this._adapter.setNativeControlDisabled(disabled);
  22. }
  23. handleChange(checked: boolean, e: any): void {
  24. const propChecked = this.getProps().checked;
  25. const isControlledComponent = typeof propChecked !== 'undefined';
  26. if (isControlledComponent) {
  27. this._adapter.notifyChange(checked, e);
  28. } else {
  29. this._adapter.setNativeControlChecked(checked);
  30. this._adapter.notifyChange(checked, e);
  31. }
  32. }
  33. handleFocusVisible = (event: any) => {
  34. const { target } = event;
  35. try {
  36. if (target.matches(':focus-visible')) {
  37. this._adapter.setFocusVisible(true);
  38. }
  39. } catch (error) {
  40. warning(true, 'Warning: [Semi Switch] The current browser does not support the focus-visible');
  41. }
  42. }
  43. handleBlur = () => {
  44. this._adapter.setFocusVisible(false);
  45. }
  46. // eslint-disable-next-line @typescript-eslint/no-empty-function
  47. destroy(): void {}
  48. }