UNPKG

box-ui-elements-mlh

Version:
211 lines (202 loc) 6 kB
// @flow import * as React from 'react'; import IconFileAudio from '../../icon/content/FileAudio32'; import IconFileBoxNote from '../../icon/content/FileBoxNote32'; import IconFileCode from '../../icon/content/FileCode32'; import IconFileDefault from '../../icon/content/FileDefault32'; import IconFileDwg from '../../icon/content/FileDwg32'; import IconFileExcelSpreadsheet from '../../icon/content/FileExcel32'; import IconFileGoogleDocs from '../../icon/content/FileDocs32'; import IconFileGoogleSheets from '../../icon/content/FileSheets32'; import IconFileGoogleSlides from '../../icon/content/FileSlides32'; import IconFileIllustrator from '../../icon/content/FileIllustrator32'; import IconFileImage from '../../icon/content/FileImage32'; import IconFileIndesign from '../../icon/content/FileIndesign32'; import IconFileKeynote from '../../icon/content/FileKeynote32'; import IconFileNumbers from '../../icon/content/FileNumbers32'; import IconFilePages from '../../icon/content/FilePages32'; import IconFilePDF from '../../icon/content/FilePdf32'; import IconFilePhotoshop from '../../icon/content/FilePhotoshop32'; import IconFilePowerpointPresentation from '../../icon/content/FilePowerpoint32'; import IconFilePresentation from '../../icon/content/FilePresentation32'; import IconFileSpreadsheet from '../../icon/content/FileSpreadsheet32'; import IconFileText from '../../icon/content/FileText32'; import IconFileThreeD from '../../icon/content/FileThreeD32'; import IconFileVector from '../../icon/content/FileVector32'; import IconFileVideo from '../../icon/content/FileVideo32'; import IconFileWordDocument from '../../icon/content/FileWord32'; import IconFileZip from '../../icon/content/FileZip32'; const Components = { IconFileAudio, IconFileBoxNote, IconFileCode, IconFileDefault, IconFileDocument: IconFileText, IconFileDwg, IconFileExcelSpreadsheet, IconFileGoogleDocs, IconFileGoogleSheets, IconFileGoogleSlides, IconFileIllustrator, IconFileImage, IconFileIndesign, IconFileKeynote, IconFileNumbers, IconFilePages, IconFilePDF, IconFilePhotoshop, IconFilePowerpointPresentation, IconFilePresentation, IconFileSpreadsheet, IconFileText, IconFileThreeD, IconFileVector, IconFileVideo, IconFileWordDocument, IconFileZip, }; const mirror = values => values.reduce((prev, cur) => { prev[cur] = cur; return prev; }, {}); const EXTENSIONS = { IconFileAudio: mirror([ 'aac', 'aif', 'aifc', 'aiff', 'amr', 'au', 'flac', 'm3u', 'm4a', 'mid', 'mp3', 'ra', 'wav', 'wma', 'wpl', ]), IconFileBoxNote: mirror(['boxnote']), IconFileCode: mirror([ 'as', 'as3', 'asm', 'aspx', 'c', 'cpp', 'bat', 'c', 'cc', 'cmake', 'cs', 'css', 'cxx', 'db', 'diff', 'erb', 'groovy', 'h', 'haml', 'hh', 'htm', 'html', 'java', 'js', 'less', 'm', 'make', 'md', 'ml', 'mm', 'php', 'pl', 'plist', 'properties', 'py', 'rb', 'sass', 'scala', 'script', 'scm', 'sml', 'sql', 'sh', 'wabba', 'yaml', ]), IconFileDocument: mirror(['csv', 'dot', 'dotx', 'msg', 'odt', 'rtf', 'tsv', 'wpd', 'xhtml', 'xml', 'xsd', 'xsl']), IconFileDwg: mirror(['dwg', 'dwgzip']), IconFileExcelSpreadsheet: mirror(['xls', 'xlsx', 'xlsm', 'xlsb']), IconFileGoogleDocs: mirror(['gdoc']), IconFileGoogleSheets: mirror(['gsheet']), IconFileGoogleSlides: mirror(['gslide', 'gslides']), IconFileVector: mirror(['eps']), IconFileIllustrator: mirror(['ai']), IconFileIndesign: mirror(['indd']), IconFileKeynote: mirror(['key']), IconFileNumbers: mirror(['numbers']), IconFilePages: mirror(['pages']), IconFileImage: mirror([ 'bmp', 'gif', 'gdraw', 'jpeg', 'jpg', 'png', 'ps', 'svs', 'svg', 'tif', 'tiff', 'heic', 'heif', ]), IconFilePDF: mirror(['pdf']), IconFilePresentation: mirror(['odp', 'otp', 'pot', 'potx']), IconFilePowerpointPresentation: mirror(['ppt', 'pptx', 'pptm']), IconFilePhotoshop: mirror(['psd']), IconFileSpreadsheet: mirror(['ods', 'xlt', 'xltx']), IconFileText: mirror(['txt', 'vi', 'vim', 'webdoc']), IconFileThreeD: mirror(['3ds', 'dae', 'fbx', 'obj', 'ply', 'stl']), IconFileVideo: mirror([ '3g2', '3gp', 'avi', 'flv', 'm2v', 'm2ts', 'm4v', 'mkv', 'mov', 'mp4', 'mpeg', 'mpg', 'ogg', 'mts', 'qt', 'wmv', ]), IconFileWordDocument: mirror(['docx', 'doc', 'docm']), IconFileZip: mirror(['rar', 'tgz', 'zip']), }; const getFileIconComponent = (extension = '') => { const extensionComponentName = Object.keys(EXTENSIONS).filter( extensionComponent => !!EXTENSIONS[extensionComponent][extension.toLowerCase()], )[0]; return extensionComponentName || 'IconFileDefault'; }; type Props = { /** Dimension of the icon. */ dimension?: number, /** Extension of file to display icon for. Defaults to generic icon */ extension?: string, /** A text-only string describing the icon if it's not purely decorative for accessibility */ title?: string | React.Element<any>, }; const FileIcon = ({ dimension = 32, extension = '', title }: Props) => { const IconComponent = Components[getFileIconComponent(extension)]; return <IconComponent height={dimension} title={title} width={dimension} />; }; export default FileIcon;