import clsx from "clsx";
import { FC, HTMLAttributes, useEffect, useState } from "react";
import { useDispatch, useSelector } from "react-redux";
import { Button } from "~/components/Button";
import { useCharacterEngine } from "~/hooks/useCharacterEngine";
import { useUnpropagatedClick } from "~/hooks/useUnpropagatedClick";
import { appEnvSelectors } from "~/tools/js/Shared/selectors";
import { HP_DAMAGE_TAKEN_VALUE } from "../../../constants";
import styles from "./styles.module.css";
interface Props extends HTMLAttributes {}
export const HitPointsQuickAdjust: FC = ({ className, ...props }) => {
const dispatch = useDispatch();
const { hpInfo, characterActions, characterUtils, helperUtils } =
useCharacterEngine();
const isReadonly = useSelector(appEnvSelectors.getIsReadonly);
const [adjustmentValue, setAdjustmentValue] = useState(null);
const [isFocused, setIsFocused] = useState(false);
const [isHovered, setIsHovered] = useState(false);
const adjustHitPoints = (adjustmentSign: number): void => {
const difference = adjustmentSign * (adjustmentValue ?? 0);
const { newTemp, newRemovedHp } = characterUtils.calculateHitPoints(
hpInfo,
difference
);
dispatch(characterActions.hitPointsSet(newRemovedHp, newTemp));
setAdjustmentValue(null);
setIsHovered(false);
};
const onHealClick = useUnpropagatedClick(() => {
adjustHitPoints(1);
});
const onDamageClick = useUnpropagatedClick(() => {
adjustHitPoints(-1);
});
const onFocus = (): void => {
setIsFocused(true);
};
const onMouseEnter = (): void => {
setIsHovered(true);
};
const onMouseLeave = (): void => {
setIsHovered(false);
};
const onBlur = (evt: React.FocusEvent): void => {
setAdjustmentValue(helperUtils.parseInputInt(evt.target.value));
setIsFocused(false);
};
const onChange = (evt: React.ChangeEvent): void => {
setAdjustmentValue(helperUtils.parseInputInt(evt.target.value));
};
const onWheel = (evt: WheelEvent): void => {
if (isHovered || isFocused) {
evt.preventDefault();
let direction = evt.deltaY < 0 ? 1 : -1;
if (!isReadonly) {
let newValue = (adjustmentValue ?? 0) + direction;
newValue = helperUtils.clampInt(newValue ?? 0, 0, hpInfo.totalHp * 2);
setAdjustmentValue(newValue);
}
}
};
const onScroll = (evt: Event): void => {
if (isHovered || isFocused) {
evt.preventDefault();
}
};
useEffect(() => {
window.addEventListener("wheel", onWheel, { passive: false });
window.addEventListener("scroll", onScroll);
return () => {
window.removeEventListener("wheel", onWheel);
window.removeEventListener("scroll", onScroll);
};
});
return (
);
};