{"version":3,"file":"js/2346-dee5a2ed3100986ada4a.chunk.js","mappings":"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","sources":["webpack://Maxwell/./app/assets/javascripts/v2/components/Global/UploadMessage/index.js","webpack://Maxwell/./app/assets/javascripts/v2/components/Global/Communication/ListItem/index.js","webpack://Maxwell/./app/assets/javascripts/v2/components/Global/Communication/Attachment/index.js","webpack://Maxwell/./app/assets/javascripts/v2/components/Global/Communication/List/index.js","webpack://Maxwell/./app/assets/javascripts/v2/containers/CommunicationContainer.js","webpack://Maxwell/./app/assets/javascripts/v2/containers/DocumentPreviewLink.js"],"sourcesContent":["import React, { Fragment } from 'react'\n\nconst UploadMessage = () => (\n <Fragment>\n <div className=\"text-center visible-xs\">\n <i className=\"fa fa-camera fa-2x\" aria-hidden=\"true\" />\n </div>\n <h5 className=\"dropzone-alert\">\n <span className=\"hidden-xs\">Click here to choose files to upload from your computer.</span>\n <span className=\"visible-xs\">Tap here to take a picture or upload a file from your device</span>\n </h5>\n <p className=\"text-center hidden-xs\">\n You can select more than one file at a time. You can also drag and drop files here to start uploading.\n </p>\n </Fragment>\n)\n\nexport default UploadMessage\n","import React from 'react'\nimport DocumentPreviewLink from 'v2/containers/DocumentPreviewLink'\nimport { format } from 'date-fns-tz'\n\nexport default class ListItem extends React.Component {\n _renderAttachments = () => {\n const {\n communication,\n userInfo: { type },\n } = this.props\n const { attachments } = communication\n const scope = type === 'user' ? 'borrowers' : 'lenders'\n\n if (!attachments.length) return <span />\n // Render each attachment\n // TODO : Add Document preview modal for attachment.\n return attachments.map((attachment) => {\n return (\n <div key={attachment.id}>\n <span className=\"glyphicon glyphicon-file text-muted\" />\n <DocumentPreviewLink\n className=\"communication--document\"\n documents={attachments}\n document={attachment}\n scope={scope}\n routerLink={scope !== 'borrowers'}\n />\n </div>\n )\n })\n }\n\n render() {\n const { communication } = this.props\n\n const {\n createdAt,\n dateDivider,\n } = communication\n\n let formattedTimestamp = null\n\n if (communication.nonFormattedCreatedAt) {\n const dateTime = new Date(communication.nonFormattedCreatedAt)\n const localTimezone = Intl.DateTimeFormat(dateTime).resolvedOptions().timeZone\n formattedTimestamp = format(dateTime, 'h:mm aaa zzz', { timeZone: localTimezone })\n }\n\n if (!communication || !communication.communication) return <span />\n\n return (\n <div className=\"communication\">\n {\n dateDivider ? (\n <div className=\"date-divider\">\n <span>{createdAt}</span>\n </div>\n ) : ('')\n }\n <div className=\"media\">\n <div className=\"media-left\">\n <a\n href=\"#no-where\"\n onClick={e => e.preventDefault()}\n >\n <img\n src={communication.communication.sender.profileImageSrc}\n alt={`profile for ${communication.communication.sender.displayName}`}\n className=\"img-circle\"\n height=\"34\"\n width=\"34\"\n />\n </a>\n </div>\n <div className=\"media-body\">\n <h5 className=\"media-heading\">\n {communication.communication.sender.displayFirstName}\n <div className=\"divider\">|</div>\n <span className=\"role\">{communication.communication.role}</span>\n <span className=\"timestamp\">{formattedTimestamp}</span>\n </h5>\n <p>{communication.communication.content}</p>\n {this._renderAttachments()}\n </div>\n </div>\n </div>\n )\n }\n}\n","// File Upload Component for messenger attachments\nimport React from 'react'\nimport BootstrapModal from 'components/utils/bootstrap_modal'\nimport Spinner from 'components/utils/spinner'\nimport { PrimaryFont } from 'components/utils/Fonts'\n\nimport Dropzone from 'react-dropzone'\nimport classNames from 'classnames'\nimport toastr from 'utils/toastr'\nimport UploadMessage from 'v2/components/Global/UploadMessage'\n\nexport default class Attachment extends React.Component {\n state = {\n saving: false,\n message: '',\n attachments: [],\n }\n\n _onCancelClick = (e) => {\n e.preventDefault()\n\n const { toggleAttachmentModal } = this.props\n\n toggleAttachmentModal(false)\n }\n\n _onUploadClick = async (e) => {\n const { handleMessageWithAttachments } = this.props\n const { message: { value } } = this\n const { attachments } = this.state\n\n this.setState({ saving: true })\n // Create attachments\n await handleMessageWithAttachments(value, attachments)\n\n // Reset message contents\n this.setState({ saving: false, message: '', attachments: [] })\n\n toastr.success('Successfully uploaded and saved')\n // Close attachment modal\n this._onCancelClick(e)\n }\n\n _onDrop = (files) => {\n this.setState(prevState => {\n return {\n ...prevState,\n attachments: [...prevState.attachments, ...files],\n }\n })\n }\n\n _onRemoveClick = (e, boxFile, removedPosition) => {\n e.preventDefault()\n const { attachments } = this.state\n const updatedAttachments = attachments.filter((_, index) => index !== removedPosition)\n this.setState({ attachments: updatedAttachments })\n }\n\n _renderFiles = () => {\n const { attachments } = this.state\n\n const files = attachments\n\n if (!files.length) return <span />\n\n return files.map((file, index) => {\n return (\n <div\n key={`file-${index}`}\n className=\"multifile-selector-dropzone-file\">\n <span\n className=\"glyphicon glyphicon-file\"\n aria-hidden=\"true\"\n />\n {file.name}\n <span\n className=\"multifile-selector-dropzone-close\"\n onClick={e => this._onRemoveClick(e, file, index)}\n >\n ×\n </span>\n </div>\n )\n })\n }\n\n _renderSpinner = () => {\n const { loading } = this.props\n\n if (loading) return <Spinner isLoading size />\n\n return ''\n }\n\n _disableSubmit() {\n const { saving, attachments = [] } = this.state\n return saving || !attachments?.length\n }\n\n render() {\n const {\n attachmentModal,\n toggleAttachmentModal,\n } = this.props\n const { saving, message, attachments } = this.state\n const dropzoneClass = classNames('multifile-selector-dropzone', { 'with-files': attachments.length })\n\n return (\n <BootstrapModal\n handleHideModal={() => toggleAttachmentModal(false)}\n show={attachmentModal}>\n <BootstrapModal.Header>\n <PrimaryFont larger>Create message with attachments</PrimaryFont>\n </BootstrapModal.Header>\n <BootstrapModal.Body>\n <div className=\"row\">\n <div className=\"col-md-12\">\n <Dropzone\n className={dropzoneClass}\n onDrop={this._onDrop}\n >\n <UploadMessage />\n </Dropzone>\n {this._renderSpinner()}\n {this._renderFiles()}\n </div>\n </div>\n\n <div className=\"row\">\n <div className=\"col-md-12\">\n <div className=\"form-group\">\n <label\n htmlFor=\"message\"\n className=\"control-label\">\n Message\n </label>\n <textarea\n name=\"message\"\n id=\"message\"\n className=\"form-control\"\n placeholder=\"Enter a message (optional)\"\n onChange={e => this.setState({ message: e.target.value })}\n value={message}\n ref={(e) => { this.message = e }} />\n </div>\n </div>\n </div>\n <div className=\"modal-footer\">\n <div className=\"pull-left\">\n <button\n type=\"button\"\n className=\"btn btn-default\"\n onClick={e => this._onCancelClick(e)}>\n Cancel\n </button>\n </div>\n <div>\n <button\n type=\"button\"\n className=\"submit-btn btn btn-primary\"\n disabled={this._disableSubmit()}\n onClick={e => this._onUploadClick(e)}>\n {saving\n ? <><Spinner isLoading /> uploading</>\n : 'Attach'}\n </button>\n </div>\n </div>\n </BootstrapModal.Body>\n </BootstrapModal>\n )\n }\n}\n","import React from 'react'\nimport Spinner from 'components/utils/spinner'\nimport { isEmpty } from 'lodash'\nimport { trim } from 'underscore.string'\nimport { If } from 'components/If'\n\nimport ListItem from '../ListItem'\nimport Attachment from '../Attachment'\n\nconst Loading = () => {\n const key = Math.random() * 100\n return (\n <div key={key} className=\"col-sm-12\">\n <div className=\"tasks-spinner\">\n <Spinner isLoading size />\n <h5 className=\"loading-message\">Loading messages...</h5>\n </div>\n </div>\n )\n}\n\nconst NoMessages = () => {\n const key = Math.random() * 100\n return (\n <div key={key} className=\"col-sm-12\">\n <div className=\"tasks-spinner\">\n <span className=\"glyphicon glyphicon-exclamation-sign\" />\n <h5>You have no messages</h5>\n </div>\n </div>\n )\n}\n\nconst SendButton = (props) => {\n const { onClick } = props\n\n return (\n <a\n onClick={e => onClick(e)}\n href=\"#send-message\">\n <span\n className=\"glyphicon glyphicon-send\"\n data-toggle=\"tooltip\"\n data-placement=\"left\"\n title=\"Send Message\"\n />\n </a>\n )\n}\n\nconst AttachmentButton = (props) => {\n const { onClick } = props\n\n return (\n <a\n onClick={e => onClick(e)}\n href=\"#attach-file\">\n <span\n className=\"glyphicon glyphicon-paperclip\"\n data-toggle=\"tooltip\"\n data-placement=\"right\"\n title=\"Attach a File\"\n />\n </a>\n )\n}\n\nexport default class List extends React.Component {\n displayName = 'CommunicationList'\n\n constructor(props) {\n super(props)\n this.newMessageRef = React.createRef()\n }\n\n state = {\n message: '',\n poolType: 'borrower',\n }\n\n componentWillMount() {\n const {\n loanFileId,\n fetchCommunications,\n } = this.props\n\n fetchCommunications(loanFileId)\n }\n\n componentDidMount() {\n this.newMessageRef?.current?.scrollIntoView()\n }\n\n renderCommunications = () => {\n const { communications, userInfo } = this.props\n const {\n uiFlags,\n records,\n mockCommunication,\n } = communications\n\n if (uiFlags.loading) return <Loading />\n if (!records.length) return <NoMessages />\n\n return records.map((communication, index) => {\n const lastRecord = records.length === (index + 1)\n\n return (\n <ListItem\n lastRecord={lastRecord}\n mockCommunication={mockCommunication}\n key={`communication-${communication.id}`}\n communication={communication}\n userInfo={userInfo}\n {...this.props} />\n )\n })\n }\n\n triggerAttachmentModal = (e) => {\n e.preventDefault()\n\n const { toggleAttachmentModal } = this.props\n\n toggleAttachmentModal(true)\n }\n\n trimMessage = (message) => {\n return trim(message)\n }\n\n sendCommunication = (e) => {\n e.preventDefault()\n\n const { createCommunication, loanFileId } = this.props\n const { poolType, message } = this.state\n const trimmedMessage = this.trimMessage(message)\n\n if (!isEmpty(trimmedMessage)) {\n this.setState({ message: '' },\n () => createCommunication(loanFileId, message, poolType))\n }\n }\n\n handleOnChange = (e) => {\n const { target: { value: message } } = e\n this.setState({ message })\n }\n\n render() {\n const { message, poolType } = this.state\n\n return (\n <div>\n <Attachment {...this.props} />\n <div className=\"chat-container\" id=\"chat-container\">\n <div className=\"container-fluid\">\n <div className=\"row\">\n <div className=\"col-sm-12\">\n {this.renderCommunications()}\n </div>\n </div>\n </div>\n\n <div ref={this.newMessageRef} className=\"new-message\">\n <form className=\"form-group\" onSubmit={this.sendCommunication}>\n <If condition={poolType === 'borrower'}>\n <AttachmentButton\n onClick={this.triggerAttachmentModal} />\n </If>\n <input\n className=\"form-control\"\n onChange={this.handleOnChange}\n onKeyDown={this.handleMessageKeyDown}\n value={message}\n type=\"text\" />\n <SendButton\n onClick={this.sendCommunication} />\n </form>\n </div>\n </div>\n </div>\n )\n }\n}\n","import { connect } from 'react-redux'\n\nimport List from '../components/Global/Communication/List'\n\nimport {\n fetchCommunications,\n createCommunication,\n toggleAttachmentModal,\n setFileSelectorActiveTask,\n fetchDownloads,\n uploadFiles,\n handleMessageWithAttachments,\n setSelectedAttachment,\n toggleAttachmentPreviewModal,\n onYesClick,\n onNoClick,\n} from '../actions'\n\nconst mapStateToProps = (state) => {\n const { v2, v2FileSelector, pageInfo: { userInfo }, v2LoanFiles: { loanFile: { sharedFinances } } } = state\n const {\n attachments,\n communications,\n } = v2\n\n // TODO : attachmentModal can probably move from here...\n // We don't need to manage the state in v2FileSelector\n const {\n attachmentModal,\n loading,\n } = v2FileSelector\n\n return {\n attachmentModal,\n attachments,\n communications,\n loading,\n userInfo,\n sharedFinances,\n }\n}\n\nconst mapDispatchToProps = {\n fetchCommunications,\n createCommunication,\n toggleAttachmentModal,\n setFileSelectorActiveTask,\n fetchDownloads,\n uploadFiles,\n handleMessageWithAttachments,\n setSelectedAttachment,\n toggleAttachmentPreviewModal,\n onYesClick,\n onNoClick,\n}\n\nconst CommunicationContainer = connect(\n mapStateToProps,\n mapDispatchToProps,\n)(List)\n\nCommunicationContainer.displayName = 'CommunicationContainer'\n\nexport default CommunicationContainer\n","import React from 'react'\nimport { connect } from 'react-redux'\nimport Route from 'Services/Route'\nimport { isUndefined } from 'underscore'\nimport { isLender } from 'utils/user_type_utils'\nimport { withRouter } from 'react-router-dom'\nimport URLSearchParams from '@ungap/url-search-params'\n\nconst CARRYOVER_PARAMS = ['pricing', 'vault', 'tasks', 'desktop_underwriter', 'info', 'team', 'summary']\n\nconst getURLSearchParams = () => {\n const searchParams = new URLSearchParams(window.location.search)\n const urlOptions = {}\n searchParams.forEach((value, key) => {\n if (CARRYOVER_PARAMS.includes(key)) {\n urlOptions[key] = value\n }\n })\n return urlOptions\n}\n\nconst DocumentPreviewLink = ({\n children,\n className,\n document,\n documents,\n history = {},\n match = {},\n routerLink = false,\n scope,\n sortOptions: { sortKey, reverse } = {},\n vault,\n forceReloadPage,\n newWindow,\n userId,\n hideForeignLink,\n sharedFinances,\n userType,\n}) => {\n\n const { borrowerId, file, document_key: documentKey, fileName } = document\n const isOwner = borrowerId === userId\n const nonUser = !borrowerId\n\n if (!sharedFinances && hideForeignLink && !isOwner) return null\n const content = typeof children !== 'undefined' ? children : file || documentKey || fileName\n\n const onClick = () => {\n documents = documents || []\n\n const {\n slug,\n loanFileId,\n verificationId,\n id,\n maxwellDocumentLink,\n } = document\n\n const { params: { lenderId } = {} } = match\n\n const urlData = {\n slug: lenderId || slug,\n borrowerId,\n verificationId,\n loanFileId,\n }\n\n const urlOpts = vault ? { vault } : getURLSearchParams()\n\n if (!isUndefined(sortKey)) {\n urlOpts.sortKey = sortKey\n }\n if (!isUndefined(reverse)) {\n urlOpts.reverse = reverse\n }\n\n urlData.attachmentId = id\n\n let url = ''\n\n if (maxwellDocumentLink) {\n url = maxwellDocumentLink\n } else {\n url = Route[scope].loanFile.attachments.show(urlData, urlOpts)\n }\n\n if (routerLink && !forceReloadPage) {\n history.push(url)\n return\n }\n\n if (newWindow) {\n const nextWindow = window.open()\n nextWindow.location.href = url\n } else {\n window.location.href = url\n }\n }\n\n const onKeyDown = (e) => {\n if (e.keyCode === 13) {\n onClick(e)\n }\n }\n\n if (!sharedFinances && !isOwner && !nonUser && !isLender(userType)) {\n return (\n <span className=\"task-period payment-security--text\">{ content }</span>\n )\n }\n\n return (\n <span role=\"button\" tabIndex=\"0\" className={`${className} btn btn-link`} onClick={onClick} onKeyDown={onKeyDown}>\n { content }\n </span>\n )\n}\n\nconst mapStateToProps = (state) => {\n const {\n pageInfo: { pdftronInfo, userInfo: { id: userId, type: userType } },\n v2LoanFiles: { loanFile: { sharedFinances } },\n } = state\n const forceReloadPage = !pdftronInfo\n return { forceReloadPage, userId, sharedFinances, userType }\n}\n\nexport default connect(\n mapStateToProps\n)((props) => {\n const Component = props.routerLink ? withRouter(DocumentPreviewLink) : DocumentPreviewLink\n return <Component {...props} />\n})\n"],"names":["Fragment","className","ListItem","_renderAttachments","props","communication","type","userInfo","attachments","scope","length","map","attachment","key","id","DocumentPreviewLink","documents","document","routerLink","this","createdAt","dateDivider","formattedTimestamp","nonFormattedCreatedAt","dateTime","Date","localTimezone","Intl","DateTimeFormat","resolvedOptions","timeZone","format","href","onClick","e","preventDefault","src","sender","profileImageSrc","alt","displayName","height","width","displayFirstName","role","content","React","i","Attachment","state","saving","message","_onCancelClick","toggleAttachmentModal","_onUploadClick","handleMessageWithAttachments","value","setState","toastr","_onDrop","files","prevState","_onRemoveClick","boxFile","removedPosition","updatedAttachments","filter","_","index","_renderFiles","file","name","_renderSpinner","loading","isLoading","size","attachmentModal","dropzoneClass","classNames","handleHideModal","show","larger","onDrop","UploadMessage","htmlFor","placeholder","onChange","target","ref","disabled","_disableSubmit","Loading","Math","random","NoMessages","SendButton","title","AttachmentButton","List","poolType","renderCommunications","communications","uiFlags","records","mockCommunication","lastRecord","triggerAttachmentModal","trimMessage","trim","sendCommunication","createCommunication","loanFileId","trimmedMessage","isEmpty","handleOnChange","newMessageRef","fetchCommunications","current","scrollIntoView","onSubmit","If","condition","onKeyDown","handleMessageKeyDown","mapDispatchToProps","setFileSelectorActiveTask","fetchDownloads","uploadFiles","setSelectedAttachment","toggleAttachmentPreviewModal","onYesClick","onNoClick","CommunicationContainer","connect","v2","v2FileSelector","pageInfo","sharedFinances","v2LoanFiles","loanFile","CARRYOVER_PARAMS","children","history","match","sortOptions","sortKey","reverse","vault","forceReloadPage","newWindow","userId","hideForeignLink","userType","borrowerId","documentKey","document_key","fileName","isOwner","searchParams","urlOptions","slug","verificationId","maxwellDocumentLink","params","urlData","lenderId","urlOpts","URLSearchParams","window","location","search","forEach","includes","isUndefined","attachmentId","url","Route","open","push","isLender","tabIndex","keyCode","pdftronInfo","Component","withRouter"],"sourceRoot":""}