summaryrefslogtreecommitdiff
path: root/apps/web/src/hooks/use-file-upload.ts
diff options
context:
space:
mode:
authorMaze Winther <mazewinther@gmail.com>2026-04-20 11:31:17 +0200
committerMaze Winther <mazewinther@gmail.com>2026-04-20 11:31:17 +0200
commit3e89d2998588f8e35c524e523ba2ee853f0f6475 (patch)
tree57221f96c1259b3b07e3ddf8c1adefc502b9d8eb /apps/web/src/hooks/use-file-upload.ts
parent729d10592f4e802f91c555c309ff3ba4b119f843 (diff)
downloadopencut-3e89d2998588f8e35c524e523ba2ee853f0f6475.tar.gz
refactor: restructure files to their domains, new preview overlay system, and dep graph
Diffstat (limited to 'apps/web/src/hooks/use-file-upload.ts')
-rw-r--r--apps/web/src/hooks/use-file-upload.ts101
1 files changed, 0 insertions, 101 deletions
diff --git a/apps/web/src/hooks/use-file-upload.ts b/apps/web/src/hooks/use-file-upload.ts
deleted file mode 100644
index d174e002..00000000
--- a/apps/web/src/hooks/use-file-upload.ts
+++ /dev/null
@@ -1,101 +0,0 @@
-import { useState, useRef } from "react";
-import { hasDragData } from "@/lib/drag-data";
-
-interface UseFileUploadOptions {
- accept?: string;
- multiple?: boolean;
- onFilesSelected?: (files: File[]) => void;
-}
-
-function containsFiles(dataTransfer: DataTransfer): boolean {
- return !hasDragData({ dataTransfer }) && dataTransfer.types.includes("Files");
-}
-
-export function useFileUpload({
- accept,
- multiple,
- onFilesSelected,
-}: UseFileUploadOptions = {}) {
- const [isDragOver, setIsDragOver] = useState(false);
- const dragCounterRef = useRef(0);
- const inputRef = useRef<HTMLInputElement>(null);
-
- function openFilePicker() {
- if (!inputRef.current) return;
-
- inputRef.current.accept = accept || "*";
- inputRef.current.multiple = multiple || false;
- inputRef.current.click();
- }
-
- function handleFileChange(event: React.ChangeEvent<HTMLInputElement>) {
- const files = Array.from(event.target.files ?? []);
- if (files.length > 0 && onFilesSelected) {
- onFilesSelected(files);
- }
-
- if (event.target) {
- event.target.value = "";
- }
- }
-
- function handleDragEnter(e: React.DragEvent) {
- e.preventDefault();
-
- if (!containsFiles(e.dataTransfer)) return;
-
- dragCounterRef.current += 1;
- setIsDragOver(true);
- }
-
- function handleDragOver(e: React.DragEvent) {
- e.preventDefault();
-
- if (!containsFiles(e.dataTransfer)) return;
- }
-
- function handleDragLeave(e: React.DragEvent) {
- e.preventDefault();
-
- if (!containsFiles(e.dataTransfer)) return;
-
- dragCounterRef.current -= 1;
- if (dragCounterRef.current === 0) {
- setIsDragOver(false);
- }
- }
-
- function handleDrop(e: React.DragEvent) {
- e.preventDefault();
- setIsDragOver(false);
- dragCounterRef.current = 0;
-
- if (onFilesSelected && containsFiles(e.dataTransfer)) {
- const files = Array.from(e.dataTransfer.files);
- const shouldUseMultiple = multiple ?? false;
-
- if (shouldUseMultiple) {
- onFilesSelected(files);
- } else if (files.length > 0) {
- onFilesSelected([files[0]]);
- }
- }
- }
-
- return {
- isDragOver,
- openFilePicker,
- fileInputProps: {
- ref: inputRef,
- type: "file",
- style: { display: "none" },
- onChange: handleFileChange,
- },
- dragProps: {
- onDragEnter: handleDragEnter,
- onDragOver: handleDragOver,
- onDragLeave: handleDragLeave,
- onDrop: handleDrop,
- },
- };
-}