import { BsmButton } from "renderer/components/shared/bsm-button.component"; import { BsmCheckbox } from "renderer/components/shared/bsm-checkbox.component"; import { Mod } from "shared/models/mods/mod.interface"; import { CSSProperties, MouseEvent, useMemo, useRef } from "react"; import { useThemeColor } from "renderer/hooks/use-theme-color.hook"; import useDoubleClick from "use-double-click"; import { gt } from "semver"; import { useOnUpdate } from "renderer/hooks/use-on-update.hook"; type Props = { className?: string; mod: Mod; installedVersion: string; isDependency?: boolean; isSelected?: boolean; onChange?: (val: boolean) => void; wantInfo?: boolean; onWantInfo?: (mod: Mod) => void; disabled?: boolean; onUninstall?: () => void; }; export function ModItem({ className, mod, installedVersion, isDependency, isSelected, onChange, wantInfo, onWantInfo, disabled, onUninstall }: Props) { const themeColor = useThemeColor("second-color"); const clickRef = useRef(); const isChecked = useMemo(() => isDependency || isSelected || mod.required, [isDependency, isSelected, mod.required]); useDoubleClick({ onSingleClick: e => handleWantInfo(e), onDoubleClick: e => handleOnChange(e), ref: clickRef, latency: 175, }); useOnUpdate(() => { onChange(isChecked); }, [isChecked]); const wantInfoStyle: CSSProperties = wantInfo ? { borderColor: themeColor } : { borderColor: "transparent" }; const isOutDated = installedVersion ? gt(mod.version, installedVersion) : false; const handleWantInfo = (e: MouseEvent) => { e.preventDefault(); onWantInfo(mod); }; const handleOnChange = (e: MouseEvent) => { e.preventDefault(); onChange(!isChecked); }; return (