└── AddFiles.jsx /AddFiles.jsx: -------------------------------------------------------------------------------- 1 | import { useMemo } from 'react'; 2 | import { getFileTypeLabels, validateFiles } from './AddFiles.service'; 3 | import classes from './AddFiles.module.css'; 4 | import { TooltipBox } from '../TooltipBox/TooltipBox'; 5 | import { TiDeleteOutline } from 'react-icons/ti'; 6 | import { shrinkString } from '../../utils/global.services'; 7 | import { TooltipPlacement } from '../TooltipBox/TooltipBox.service'; 8 | 9 | export const AddFiles = ({ 10 | files, 11 | setAttachments, 12 | setAlert, 13 | loading, 14 | filesLimit = 1, 15 | fileTypes = ['jpg', 'jpeg', 'gif', 'png', 'pdf', 'csv'], 16 | id, 17 | containerClassName = '', 18 | children 19 | }) => { 20 | const acceptedTypes = useMemo(() => `.${fileTypes.join(', .')}`, [fileTypes]); 21 | 22 | const getFile = (e) => { 23 | if (!e.target?.files?.length) return; 24 | 25 | validateFiles({ 26 | addedFiles: e.target.files, 27 | files, 28 | setAlert, 29 | setAttachments, 30 | fileTypes, 31 | filesLimit 32 | }); 33 | e.target.value = ''; 34 | }; 35 | 36 | return ( 37 |
38 | 47 | 57 |
58 | ); 59 | }; 60 | 61 | export const AddFilesList = ({ 62 | files, 63 | setAttachments, 64 | containerClassName = '' 65 | }) => { 66 | const deleteFile = (e) => { 67 | const fileIndex = +e.currentTarget.getAttribute('data-index'); 68 | setAttachments(files.filter((file, i) => i !== fileIndex)); 69 | }; 70 | 71 | return ( 72 |
73 |
74 | {files.map((file, i) => ( 75 |

76 | {file.name.length > 20 ? ( 77 | 78 | {shrinkString(file.name, 16)} 79 | 80 | ) : ( 81 | shrinkString(file.name, 16) 82 | )} 83 | 88 |

89 | ))} 90 |
91 |
92 | ); 93 | }; 94 | --------------------------------------------------------------------------------