= ({
return (
<>
{isUploading ? (
@@ -113,7 +82,7 @@ export const FileUpload: FC = ({
data-testid="file-upload"
ref={inputRef}
css={styles.input}
- accept={extension}
+ accept={extensions?.map((ext) => `.${ext}`).join(",")}
onChange={(event) => {
const file = event.currentTarget.files?.[0];
if (file) {
@@ -125,6 +94,47 @@ export const FileUpload: FC = ({
);
};
+const useFileDrop = (
+ callback: (file: File) => void,
+ extensions?: string[],
+): {
+ onDragOver: (e: DragEvent) => void;
+ onDrop: (e: DragEvent) => void;
+} => {
+ const onDragOver = (e: DragEvent) => {
+ e.preventDefault();
+ };
+
+ const onDrop = (e: DragEvent) => {
+ e.preventDefault();
+ const file = e.dataTransfer.files[0] as File | undefined;
+
+ if (!file) {
+ return;
+ }
+
+ if (!extensions) {
+ callback(file);
+ return;
+ }
+
+ const extension = file.name.split(".").pop();
+
+ if (!extension) {
+ throw new Error(`File has no extension to compare with ${extensions}`);
+ }
+
+ if (extensions.includes(extension)) {
+ callback(file);
+ }
+ };
+
+ return {
+ onDragOver,
+ onDrop,
+ };
+};
+
const styles = {
root: (theme) => css`
display: flex;
@@ -151,12 +161,16 @@ const styles = {
title: {
fontSize: 16,
+ lineHeight: "1",
},
description: (theme) => ({
color: theme.palette.text.secondary,
textAlign: "center",
maxWidth: 400,
+ fontSize: 14,
+ lineHeight: "1.5",
+ marginTop: 4,
}),
input: {
diff --git a/site/src/pages/CreateTemplatePage/TemplateUpload.tsx b/site/src/pages/CreateTemplatePage/TemplateUpload.tsx
index 3b532ed536e67..298f9e50aef9c 100644
--- a/site/src/pages/CreateTemplatePage/TemplateUpload.tsx
+++ b/site/src/pages/CreateTemplatePage/TemplateUpload.tsx
@@ -18,7 +18,7 @@ export const TemplateUpload: FC = ({
}) => {
const description = (
<>
- The template has to be a .tar file. You can also use our{" "}
+ The template has to be a .tar or .zip file. You can also use our{" "}
= ({
removeLabel="Remove file"
title="Upload template"
description={description}
- extension=".tar"
- fileTypeRequired="application/x-tar"
+ extensions={["tar", "zip"]}
/>
);
};