diff --git a/src/renderer/components/modal/modal-types/models/download-models-modal.component.tsx b/src/renderer/components/modal/modal-types/models/download-models-modal.component.tsx index 8cb29b815..ccdc91f8d 100644 --- a/src/renderer/components/modal/modal-types/models/download-models-modal.component.tsx +++ b/src/renderer/components/modal/modal-types/models/download-models-modal.component.tsx @@ -182,6 +182,7 @@ export const DownloadModelsModal: ModalComponent ))} diff --git a/src/renderer/components/models-management/model-item.component.tsx b/src/renderer/components/models-management/model-item.component.tsx index f5a32ab2a..7737983b6 100644 --- a/src/renderer/components/models-management/model-item.component.tsx +++ b/src/renderer/components/models-management/model-item.component.tsx @@ -1,5 +1,5 @@ import equal from "fast-deep-equal"; -import { memo, useState } from "react"; +import { memo, useRef, useState } from "react"; import { MSModel, MSModelType } from "shared/models/models/model-saber.model"; import { BsmImage } from "../shared/bsm-image.component"; import { motion } from "framer-motion"; @@ -16,6 +16,7 @@ import { BsmButton } from "../shared/bsm-button.component"; import { BsmBasicSpinner } from "../shared/bsm-basic-spinner/bsm-basic-spinner.component"; import { isValidUrl } from "shared/helpers/url.helpers"; import { useTranslation } from "renderer/hooks/use-translation.hook"; +import useDoubleClick from "use-double-click"; type Props = { selected?: boolean, @@ -26,7 +27,8 @@ type Props = { onDelete?: (value: T) => void, onDownload?: (value: T) => void, onCancelDownload?: (value: T) => void -} & Partial & Partial & Omit, "id"> + onDoubleClick?: (value: T) => void +} & Partial & Partial & Omit, "id" | "onDoubleClick"> function modelItem(props: Props) { @@ -34,6 +36,14 @@ function modelItem(props: Props) { const color = useThemeColor("first-color"); const [hovered, setHovered] = useState(false); const [idContentCopied, setIdContentCopied] = useState(null); + const ref = useRef(); + + useDoubleClick({ + ref, + latency: props.onDoubleClick ? 200 : 0, + onSingleClick: (e) => props?.onClick?.(e as unknown as React.MouseEvent), + onDoubleClick: () => props?.onDoubleClick?.(props.callbackValue) + }); const modelPageUrl = (() => { if(!props.id){ return null; } @@ -88,18 +98,20 @@ function modelItem(props: Props) { } return ( - setHovered(() => true)} onHoverEnd={() => setHovered(() => false)} onClick={props.onClick}> + setHovered(() => true)} onHoverEnd={() => setHovered(() => false)}>
- -
- {!props.isDownloading ? ( - actionButtons().map((button, index) => ( - {e.stopPropagation(); e.preventDefault(); button.action();}} withBar={false}/> - )) - ): ( - - )} +
+ +
+ {!props.isDownloading ? ( + actionButtons().map((button, index) => ( + {e.stopPropagation(); e.preventDefault(); button.action();}} withBar={false}/> + )) + ): ( + + )} +
{e.stopPropagation(); e.preventDefault()}}>
diff --git a/src/renderer/services/models-management/models-downloader.service.ts b/src/renderer/services/models-management/models-downloader.service.ts index d5740b732..2ba7db2c1 100644 --- a/src/renderer/services/models-management/models-downloader.service.ts +++ b/src/renderer/services/models-management/models-downloader.service.ts @@ -8,6 +8,7 @@ import { DownloadModelsModal } from "renderer/components/modal/modal-types/model import { ProgressBarService } from "../progress-bar.service"; import { Progression } from "main/helpers/fs.helpers"; import { ProgressionInterface } from "shared/models/progress-bar"; +import equal from "fast-deep-equal"; export class ModelsDownloaderService { @@ -59,11 +60,11 @@ export class ModelsDownloaderService { } - public addModelToDownload(model: ModelDownload): ModelDownload{ + public addModelToDownload(model: ModelDownload): void{ + if(this.queue$.value.some(m => equal(m, model))){ return null; } const queue = this.queue$.value; queue.push(model); this.queue$.next([...queue]); - return model; } public removeFromDownloadQueue(download: ModelDownload){