11import { Button , Card , CardBody , CardProps , Tab , Tabs , Textarea } from "@heroui/react"
2- import React from "react"
2+ import React , { useRef , useState , DragEvent } from "react"
33import { formatSize } from "../utils.js"
4+ import { XIcon } from "../icons.js"
45
56export type EditKind = "edit" | "file"
67
@@ -16,28 +17,40 @@ interface PasteEditorProps extends CardProps {
1617 onStateChange : ( state : PasteEditState ) => void
1718}
1819
19- function displayFileInfo ( file : File | null ) {
20- if ( file === null ) {
21- return null
22- } else {
23- return (
24- < span className = "ml-4" >
25- < code > { file . name } </ code > ({ formatSize ( file . size ) } )
26- </ span >
27- )
20+ export function PasteEditor ( { isPasteLoading, state, onStateChange, ...rest } : PasteEditorProps ) {
21+ const fileInput = useRef < HTMLInputElement > ( null )
22+ const [ isDragged , setDragged ] = useState < boolean > ( false )
23+
24+ function setFile ( file : File | null ) {
25+ onStateChange ( { ...state , editKind : "file" , file } )
26+ }
27+
28+ function onDrop ( e : DragEvent ) {
29+ e . preventDefault ( )
30+ const items = e . dataTransfer ?. items
31+ if ( items ) {
32+ for ( let i = 0 ; i < items . length ; i ++ ) {
33+ if ( items [ i ] . kind === "file" ) {
34+ console . log ( items )
35+ const file = items [ i ] . getAsFile ( ) !
36+ setFile ( file )
37+ break
38+ }
39+ }
40+ }
41+ setDragged ( false )
2842 }
29- }
3043
31- export function PasteEditor ( { isPasteLoading, state, onStateChange, ...rest } : PasteEditorProps ) {
3244 return (
33- < Card { ...rest } >
45+ < Card aria-label = "Pastebin editor panel" { ...rest } >
3446 < CardBody >
3547 < Tabs
3648 variant = "underlined"
3749 classNames = { {
38- tabList : "ml-4 gap-6 w-full p-0 border-divider" ,
39- cursor : "w-full" ,
40- tab : "max-w-fit px-0 h-8" ,
50+ tabList : "gap-2 w-full px-2 py-0 border-divider" ,
51+ cursor : "w-[80%]" ,
52+ tab : "max-w-fit px-2 h-8 px-2" ,
53+ panel : "pb-1" ,
4154 } }
4255 selectedKey = { state . editKind }
4356 onSelectionChange = { ( k ) => {
@@ -54,7 +67,7 @@ export function PasteEditor({ isPasteLoading, state, onStateChange, ...rest }: P
5467 classNames = { {
5568 input : "resize-y min-h-[30em] font-mono" ,
5669 } }
57- name = "c "
70+ aria-label = "paste-edit "
5871 disableAutosize
5972 disableAnimation
6073 value = { state . editContent }
@@ -66,24 +79,47 @@ export function PasteEditor({ isPasteLoading, state, onStateChange, ...rest }: P
6679 > </ Textarea >
6780 </ Tab >
6881 < Tab key = "file" title = "File" >
69- < Button radius = "sm" color = "primary" as = "label" >
82+ < div
83+ className = {
84+ "w-full h-[20rem] rounded-xl flex flex-col items-center justify-center cursor-pointer relative" +
85+ ( isDragged ? " bg-primary-100" : " bg-primary-50" )
86+ }
87+ onDrop = { onDrop }
88+ onDragEnter = { ( ) => setDragged ( true ) }
89+ onDragLeave = { ( ) => setDragged ( false ) }
90+ onDragOver = { ( ) => setDragged ( true ) }
91+ onClick = { ( ) => fileInput . current ?. click ( ) }
92+ >
7093 < input
7194 type = "file"
95+ aria-label = "paste-file"
96+ ref = { fileInput }
7297 className = "w-0 h-0 overflow-hidden absolute inline"
73- onChange = { ( event ) => {
74- const files = event . target . files
98+ onChange = { ( e ) => {
99+ const files = e . target . files
75100 if ( files && files . length ) {
76- onStateChange ( {
77- ...state ,
78- editKind : "file" ,
79- file : files [ 0 ] ,
80- } )
101+ setFile ( files [ 0 ] )
81102 }
82103 } }
83104 />
84- Upload
85- </ Button >
86- { displayFileInfo ( state . file ) }
105+ < div className = "text-2xl my-2 font-bold" > Select File</ div >
106+ < p className = "text-1xl text-foreground-500 relative" >
107+ < span >
108+ { state . file !== null
109+ ? `${ state . file . name } (${ formatSize ( state . file . size ) } )`
110+ : "Click or drag & drop file here" }
111+ </ span >
112+ </ p >
113+ { state . file && (
114+ < XIcon
115+ className = "h-6 inline absolute top-2 right-2 text-red-400"
116+ onClick = { ( e ) => {
117+ e . stopPropagation ( )
118+ setFile ( null )
119+ } }
120+ />
121+ ) }
122+ </ div >
87123 </ Tab >
88124 </ Tabs >
89125 </ CardBody >
0 commit comments