import BaseFoundation, { DefaultAdapter } from "../base/foundation"; import ColorPickerFoundation from "./foundation"; import { HsvaColor } from "./interface"; export interface ColorChooseAreaBaseProps { hsva: HsvaColor; onChange: (newColor: { s: number; v: number }) => void; handleSize: number; width: number; height: number; foundation: ColorPickerFoundation } export interface ColorChooseAreaBaseState { handlePosition: { x: number; y: number }; isHandleGrabbing: boolean } export interface ColorChooseAreaAdapter

, S = Record> extends DefaultAdapter { getColorPickerFoundation: () => ColorPickerFoundation; handleMouseDown: (e: any) => void; handleMouseUp: (e: any) => void; getDOM: () => HTMLDivElement; notifyChange: (newColor: { s: number; v: number }) => void } class ColorChooseAreaFoundation extends BaseFoundation, ColorChooseAreaBaseProps, ColorChooseAreaBaseState> { constructor(adapter: ColorChooseAreaAdapter) { super({ ...adapter }); } getHandlePositionByHSVA = () => { const { hsva, width, height, handleSize } = this.getProps(); return this._adapter.getColorPickerFoundation().getHandlePositionByHSVA(hsva, { width: width, height: height }, handleSize); } handleMouseDown = (e: any) => { this._adapter.handleMouseDown(e); } handleMouseUp = (e: any) => { this._adapter.handleMouseUp(e); } setHandlePositionByMousePosition = (e: globalThis.MouseEvent) => { const rect = this._adapter.getDOM()?.getBoundingClientRect(); if (!rect) { return; } const mousePosition = { x: e.clientX - rect.x, y: e.clientY - rect.y }; const { width, height, handleSize } = this.getProps(); const colorPickerFoundation = this._adapter.getColorPickerFoundation(); const handlePosition = colorPickerFoundation.getHandlePositionByMousePosition(mousePosition, { width, height }, handleSize); if (handlePosition) { this.setState({ handlePosition }); this._adapter.notifyChange({ s: Math.round(mousePosition.x / width * 100), v: Math.round(100 - (Math.min(Math.max(mousePosition.y / height, 0), 1)) * 100), }); } } } export default ColorChooseAreaFoundation;