Skip to content

Commit 1b7e1f2

Browse files
committed
Export modal drop area
1 parent 7d8dcb4 commit 1b7e1f2

File tree

8 files changed

+182
-119
lines changed

8 files changed

+182
-119
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "jderobot-ide-interface",
3-
"version": "0.1.44",
3+
"version": "0.1.45",
44
"main": "dist/main.js",
55
"typings": "dist/index.d.ts",
66
"files": [

src/components/Modals/Modal.styles.ts

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -369,3 +369,83 @@ export const StyledModalEditableList = styled.ul<StyledModalEditableListProps>`
369369
border-bottom-left-radius: 5px;
370370
}
371371
`;
372+
373+
interface StyledModelDropAreaProps {
374+
text?: string;
375+
bgColor?: string;
376+
hoverColor?: string;
377+
buttonColor?: string;
378+
borderColor?: string;
379+
hoverBorderColor?: string;
380+
roundness?: number;
381+
active?: boolean;
382+
}
383+
384+
const handleActive = (p: StyledModelDropAreaProps) => {
385+
if (p.active) {
386+
return `
387+
background-color: ${p.borderColor ?? primaryColor} !important;
388+
border-color: ${p.hoverBorderColor ?? primaryColor} !important;
389+
`;
390+
}
391+
};
392+
393+
export const StyledModalDropArea = styled.label<StyledModelDropAreaProps>`
394+
position: relative;
395+
display: flex;
396+
gap: 10px;
397+
flex-direction: column;
398+
justify-content: center;
399+
align-items: center;
400+
height: 200px;
401+
padding: 20px;
402+
border-radius: ${(p) => p.roundness ?? 1}px;
403+
margin-bottom: 10px;
404+
border: 2px dashed ${(p) => p.borderColor ?? primaryColor};
405+
color: ${(p) => p.text ?? primaryColor};
406+
cursor: pointer;
407+
transition:
408+
background 0.2s ease-in-out,
409+
border 0.2s ease-in-out;
410+
&:hover {
411+
background: ${(p) => p.borderColor ?? primaryColor};
412+
border-color: ${(p) => p.hoverBorderColor ?? primaryColor};
413+
}
414+
415+
& span {
416+
color: ${(p) => p.text ?? primaryColor};
417+
font-size: 20px;
418+
font-weight: bold;
419+
text-align: center;
420+
transition: color 0.2s ease-in-out;
421+
}
422+
423+
& input {
424+
width: 350px;
425+
border: 2px solid ${(p) => p.borderColor ?? primaryColor};
426+
color: ${(p) => p.text ?? primaryColor};
427+
font-size: medium;
428+
background-color: ${(p) => p.bgColor ?? primaryColor};
429+
border-radius: ${(p) => p.roundness ?? 1}px;
430+
padding: 5px;
431+
font-size: medium;
432+
outline: none;
433+
434+
&::file-selector-button {
435+
margin-right: 20px;
436+
border: none;
437+
background: ${(p) => p.buttonColor ?? primaryColor};
438+
padding: 10px 20px;
439+
border-radius: ${(p) => p.roundness ?? 1}px;
440+
color: ${(p) => p.text ?? primaryColor};
441+
cursor: pointer;
442+
transition: background 0.2s ease-in-out;
443+
}
444+
445+
&::file-selector-button:hover {
446+
background: ${(p) => p.hoverColor ?? primaryColor};
447+
}
448+
}
449+
450+
${handleActive}
451+
`;

src/components/Modals/Modal.tsx

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import {
55
StyledModalButtonRow,
66
StyledModalCloseButton,
77
StyledModalContent,
8+
StyledModalDropArea,
89
StyledModalEditableList,
910
StyledModalInput,
1011
StyledModalInputRowContainer,
@@ -328,3 +329,58 @@ export const ModalInputDropdown = ({
328329
</StyledModalInput>
329330
);
330331
};
332+
333+
interface ModalInputDropAreaProps
334+
extends React.InputHTMLAttributes<HTMLInputElement> {
335+
areaRef: React.RefObject<HTMLLabelElement>;
336+
inputRef: React.RefObject<HTMLInputElement>;
337+
id: string;
338+
dropTitle: string;
339+
onChange: (event: any) => void;
340+
onDrop: (event: any) => void;
341+
}
342+
343+
export const ModalInputDropArea = ({
344+
areaRef,
345+
inputRef,
346+
id,
347+
dropTitle,
348+
onChange,
349+
onDrop,
350+
...props
351+
}: ModalInputDropAreaProps) => {
352+
const theme = useTheme();
353+
const [dropActive, setDropActive] = useState<boolean>(false);
354+
355+
return (
356+
<StyledModalDropArea
357+
ref={areaRef}
358+
htmlFor={id}
359+
onDragOver={(e) => {
360+
e.preventDefault();
361+
}}
362+
onDragEnter={() => setDropActive(true)}
363+
onDragLeave={() => setDropActive(false)}
364+
onDrop={(e) => onDrop(e)}
365+
text={theme.palette.text}
366+
bgColor={theme.palette.background}
367+
buttonColor={theme.palette.primary}
368+
hoverColor={theme.palette.secondary}
369+
borderColor={theme.palette.primary}
370+
hoverBorderColor={theme.palette.background}
371+
roundness={theme.roundness}
372+
active={dropActive}
373+
>
374+
<span className="bt-modal-drop-title">{dropTitle}</span>
375+
or
376+
<input
377+
ref={inputRef}
378+
id={id}
379+
name={id}
380+
title={dropTitle}
381+
onChange={onChange}
382+
{...props}
383+
/>
384+
</StyledModalDropArea>
385+
);
386+
};
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import type { Meta, StoryObj } from "@storybook/react";
2+
import UploadModal from "./UploadModal";
3+
4+
type Story = StoryObj<typeof UploadModal>;
5+
6+
const meta: Meta<typeof UploadModal> = {
7+
component: UploadModal,
8+
};
9+
10+
export default meta;
11+
12+
export const Main: Story = {
13+
render: (args) => (
14+
<div
15+
style={{
16+
width: "100vw",
17+
height: "100vh",
18+
}}
19+
>
20+
<UploadModal
21+
onSubmit={() => {}}
22+
isOpen
23+
onClose={() => {}}
24+
upload={() => {}}
25+
currentProject=""
26+
location={""}
27+
/>
28+
</div>
29+
),
30+
};

src/components/Modals/UploadModal.styles.ts

Lines changed: 0 additions & 83 deletions
This file was deleted.

src/components/Modals/UploadModal.tsx

Lines changed: 13 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
import { useState, useEffect, useRef } from "react";
22

3-
import Modal, { ModalRow, ModalTitlebar } from "./Modal";
3+
import Modal, { ModalInputDropArea, ModalRow, ModalTitlebar } from "./Modal";
44
import { ProgressBar } from "Components";
5-
import { useError, useTheme } from "Utils";
6-
import { StyledModalDrop } from "./UploadModal.styles";
5+
import { useError } from "Utils";
76

87
const UploadModal = ({
98
onSubmit,
@@ -20,12 +19,10 @@ const UploadModal = ({
2019
location: string;
2120
currentProject: string;
2221
}) => {
23-
const theme = useTheme();
2422
const { error } = useError();
2523

2624
const [uploadStatus, setUploadStatus] = useState("");
2725
const [uploadPercentage, setUploadPercentage] = useState(0);
28-
const [dropActive, setDropActive] = useState<boolean>(false);
2926

3027
const uploadInputRef = useRef<any>(null);
3128
const uploadAreaRef = useRef<any>(null);
@@ -120,36 +117,17 @@ const UploadModal = ({
120117
}}
121118
/>
122119
<ModalRow>
123-
<StyledModalDrop
124-
ref={uploadAreaRef}
125-
htmlFor="uploadDropInput"
126-
onDragOver={(e) => {
127-
e.preventDefault();
128-
}}
129-
onDragEnter={() => setDropActive(true)}
130-
onDragLeave={() => setDropActive(false)}
131-
onDrop={(e) => handleDrop(e)}
132-
text={theme.palette.text}
133-
bgColor={theme.palette.background}
134-
buttonColor={theme.palette.primary}
135-
hoverColor={theme.palette.secondary}
136-
borderColor={theme.palette.primary}
137-
hoverBorderColor={theme.palette.background}
138-
roundness={theme.roundness}
139-
active={dropActive}
140-
>
141-
<span>Drop files here</span>
142-
or
143-
<input
144-
ref={uploadInputRef}
145-
id="uploadDropInput"
146-
onChange={(e) => handleAcceptedFiles(e.target.files)}
147-
type="file"
148-
title="Upload folder contents"
149-
multiple
150-
required
151-
/>
152-
</StyledModalDrop>
120+
<ModalInputDropArea
121+
areaRef={uploadAreaRef}
122+
inputRef={uploadInputRef}
123+
id="uploadDropInput"
124+
dropTitle="Drop files here"
125+
onChange={(e) => handleAcceptedFiles(e.target.files)}
126+
onDrop={handleDrop}
127+
type="file"
128+
multiple
129+
required
130+
/>
153131
</ModalRow>
154132
{uploadStatus !== "" && <ProgressBar completed={uploadPercentage} />}
155133
</Modal>

src/components/Modals/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ export {
55
ModalRow,
66
ModalInputDropdown,
77
ModalEditableList,
8+
ModalInputDropArea,
89
} from "./Modal";
910
export { default as DeleteModal } from "./DeleteModal";
1011
export { default as NewFileModal } from "./NewFileModal";

src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ export {
1717
ModalInputBox,
1818
ModalInputDropdown,
1919
ModalEditableList,
20+
ModalInputDropArea,
2021
} from "./components";
2122
export {
2223
ThemeProvider,

0 commit comments

Comments
 (0)