{"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            &times;\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":""}