// @flow import * as React from 'react'; import classNames from 'classnames'; import { injectIntl, FormattedMessage } from 'react-intl'; import { RecordOf } from 'immutable'; import type { ItemType } from '../../common/types/core'; import { convertToMs, isToday, isYesterday } from '../../utils/datetime'; import DatalistItem from '../../components/datalist-item'; import Folder16 from '../../icon/fill/Folder16'; import ItemIcon from '../../icons/item-icon'; import { Link } from '../../components/link'; import { TYPE_FILE, TYPE_FOLDER, TYPE_WEBLINK } from '../../constants'; import messages from './messages'; import './QuickSearchItem.scss'; const QUERY_SEPARATOR = ''; type QuickSearchItemData = { extension?: string, iconType: string, id: string, name: string, nameWithMarkedQuery: string, parentName?: string, sharedLink?: string, type: ItemType, updatedBy: string, updatedDate: number, }; type Props = { className?: string, closeDropdown?: Function, intl: any, itemData: QuickSearchItemData | RecordOf, parentFolderRenderer?: Function, shouldNavigateOnItemClick?: boolean, }; const QuickSearchItem = ({ className, closeDropdown, intl, itemData, parentFolderRenderer, shouldNavigateOnItemClick, ...rest }: Props) => { const { formatMessage } = intl; const { extension, iconType, id, name, nameWithMarkedQuery, parentName, sharedLink, type, updatedBy, updatedDate, } = itemData; const updatedDateInMs = convertToMs(updatedDate); const markedQueryMatches = []; nameWithMarkedQuery.split(QUERY_SEPARATOR).forEach((element, index) => index % 2 === 0 ? markedQueryMatches.push(element) : markedQueryMatches.push( {element} , ), ); let itemIconTitle; switch (type) { case TYPE_WEBLINK: itemIconTitle = ; break; case TYPE_FILE: itemIconTitle = ; break; case TYPE_FOLDER: if (iconType === 'folder-collab') { itemIconTitle = ; } else if (iconType === 'folder-external') { itemIconTitle = ; } else { itemIconTitle = ; } break; default: } let updatedText; if (isToday(updatedDateInMs)) { updatedText = formatMessage(messages.updatedTextToday, { user: updatedBy, }); } else if (isYesterday(updatedDateInMs)) { updatedText = formatMessage(messages.updatedTextYesterday, { user: updatedBy, }); } else { updatedText = formatMessage(messages.updatedText, { date: updatedDateInMs, user: updatedBy, }); } let href; let targetProps = {}; const isBoxNote = extension === 'boxnote'; switch (type) { case 'folder': href = `/folder/${id}`; break; case 'web_link': href = `/web_link/${id}`; targetProps = { target: '_blank' }; break; case 'file': // shared link should take precedence over other link types if (sharedLink) { href = sharedLink; } else if (isBoxNote) { href = `/notes/${id}`; } else { href = `/file/${id}`; } if (isBoxNote) targetProps = { target: '_blank' }; break; default: } const itemName = href && shouldNavigateOnItemClick ? ( e.stopPropagation()} className="item-name" href={href} title={name} {...targetProps}> {markedQueryMatches} ) : ( {markedQueryMatches} ); return ( {itemName} {(parentName || parentFolderRenderer) && ( <> } height={12} width={12} /> {parentFolderRenderer ? ( parentFolderRenderer(itemData, closeDropdown) ) : ( {parentName} )} )} {updatedText} ); }; export default injectIntl(QuickSearchItem);