import { Box } from './Box'; import { DropzoneOptions, useDropzone } from 'react-dropzone'; import { GeneratedPropTypes } from '../types'; import { PulseIcon } from './PulseIcon'; import { Text } from './Typography'; import { colors } from '../theme/colors'; import { generateProps } from 'styled-gen'; import { inputWrapperStyle } from '../theme/fx'; import { mq } from 'styled-gen'; import { TextLink } from '../components/TextLink'; import React, { useState } from 'react'; import styled, { css } from 'styled-components'; export type EnhancedInputUploadProps = { cancelUploadText: string; children?: any; disabled?: boolean; handleFiles: Function; hint?: string; name?: string; removeFiles: Function; uploadedAction: Function; uploadedText?: string; uploadingText?: string; uploadText?: string; withError?: boolean; wrapperProps?: GeneratedPropTypes; } & DropzoneOptions; const InputBoxWrapper = styled.a` align-items: start; cursor: ${({ disabled }) => (disabled ? 'not-allowed' : 'pointer')} !important; display: flex; flex-direction: column; flex-wrap: nowrap; visibility: hidden; .default { background: linear-gradient(to left, ${colors.n01} 50%, ${colors.p25} 50%) right; background-size: 200% 100%; border-radius: 12px; border: 1px solid ${colors.g200}; position: absolute; transition: background-position 0.5s ease-in-out; } .show { position: relative; visibility: visible; } .uploaded { background-position: left; } ${inputWrapperStyle}; padding: 0rem; ${generateProps} `; const InputElement = styled.input``; const Icon = styled(PulseIcon)` box-shadow: none; `; const Divider = styled.span` margin: 0 0.5rem; `; const ClickableElement = styled(Box)<{ disabled?: boolean }>` cursor: ${({ disabled }) => (disabled ? 'not-allowed' : 'pointer')} !important; `; const ActionsWrapper = styled(Box)` align-items: center; display: flex; `; const LoadedText = styled(Text)` ${mq.phone(css` display: none; `)}; `; const Loader = styled(Box)` animation: rotateAnimation 4s linear infinite; @keyframes rotateAnimation { from { transform: rotate(0deg); } to { transform: rotate(360deg); } } `; export const EnhancedInputUpload: React.FC = props => { const { children, cancelUploadText, disabled, handleFiles, removeFiles, hint, name, uploadText, uploadedAction, uploadedText, uploadingText, withError, wrapperProps, ...dropzoneOptions } = props; const [isUploading, setIsUploading] = useState(false); const { getRootProps, getInputProps, open } = useDropzone({ disabled, accept: ['image/jpeg', 'image/png'], maxFiles: 1, maxSize: 10485760, noKeyboard: true, ...dropzoneOptions, onDrop: async file => { setIsUploading(true); await handleFiles(file); setIsUploading(false); } }); return ( <> { {!!children && {children}} {!!children && ( uploadedAction(e)} medium p500> {uploadedText} {!disabled && ( removeFiles(e)}> )} )} {isUploading && ( {uploadingText} )} } {!children && ( open()}> {uploadText} ยท {!!hint && ( {hint} )} )} {!!children && !disabled && ( removeFiles(e)}> {cancelUploadText} )} ); }; EnhancedInputUpload.displayName = 'EnhancedInputUpload';