import { css } from '@emotion/css';
import React, { useState } from 'react';
import SVG from 'react-inlinesvg';
import { GrafanaTheme2 } from '@grafana/data';
import { Alert, Button, ButtonGroup, Checkbox, Field, FileDropzone, useStyles2 } from '@grafana/ui';
import { filenameAlreadyExists, getGrafanaStorage } from './helper';
import { UploadReponse } from './types';
interface Props {
folder: string;
onUpload: (rsp: UploadReponse) => void;
fileNames: string[];
}
interface ErrorResponse {
message: string;
}
const FileDropzoneCustomChildren = ({ secondaryText = 'Drag and drop here or browse' }) => {
const styles = useStyles2(getStyles);
return (
{secondaryText}
);
};
export const UploadView = ({ folder, onUpload, fileNames }: Props) => {
const [file, setFile] = useState(undefined);
const styles = useStyles2(getStyles);
const [error, setError] = useState({ message: '' });
const [overwriteExistingFile, setOverwriteExistingFile] = useState(false);
const Preview = () => {
if (!file) {
return <>>;
}
const isImage = file.type?.startsWith('image/');
const isSvg = file.name?.endsWith('.svg');
const src = URL.createObjectURL(file);
return (
{isSvg &&
}
{isImage && !isSvg &&
![]({src})
}
);
};
const doUpload = async () => {
if (!file) {
setError({ message: 'please select a file' });
return;
}
const rsp = await getGrafanaStorage().upload(folder, file, overwriteExistingFile);
if (rsp.status !== 200) {
setError(rsp);
} else {
onUpload(rsp);
}
};
const filenameExists = file ? filenameAlreadyExists(file.name, fileNames) : false;
const isUploadDisabled = !file || (filenameExists && !overwriteExistingFile);
return (
{
setFile(undefined);
}}
options={{
accept: { 'image/*': ['.jpg', '.jpeg', '.png', '.gif', '.webp'] },
multiple: false,
onDrop: (acceptedFiles: File[]) => {
setFile(acceptedFiles[0]);
},
}}
>
{error.message !== '' ? {error.message}
: Boolean(file) ? : }
{file && filenameExists && (
setOverwriteExistingFile(!overwriteExistingFile)}
label="Overwrite existing file"
/>
)}
);
};
const getStyles = (theme: GrafanaTheme2) => ({
resourcePickerPopover: css`
border-radius: ${theme.shape.borderRadius()};
box-shadow: ${theme.shadows.z3};
background: ${theme.colors.background.primary};
border: 1px solid ${theme.colors.border.medium};
`,
resourcePickerPopoverContent: css`
width: 315px;
font-size: ${theme.typography.bodySmall.fontSize};
min-height: 184px;
padding: ${theme.spacing(1)};
display: flex;
flex-direction: column;
`,
button: css`
margin: 12px 20px 5px;
`,
iconPreview: css`
width: 238px;
height: 198px;
border: 1px solid ${theme.colors.border.medium};
display: flex;
align-items: center;
justify-content: center;
`,
img: css`
width: 147px;
height: 147px;
fill: ${theme.colors.text.primary};
`,
iconWrapper: css`
display: flex;
flex-direction: column;
align-items: center;
`,
small: css`
color: ${theme.colors.text.secondary};
margin-bottom: ${theme.spacing(2)};
`,
alert: css`
padding-top: 10px;
`,
});