All files / client app.tsx

0% Statements 0/55
0% Branches 0/29
0% Functions 0/5
0% Lines 0/54

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138                                                                                                                                                                                                                                                                                   
import React from 'react'
import ReactDOM from 'react-dom'
 
import i18n from './i18n'
import moment from 'moment'
 
import Crowi from './util/Crowi'
import CrowiRenderer from './util/CrowiRenderer'
import CrowiAuth from './util/CrowiAuth'
import Emitter from './emitter'
 
import SideMenuTrigger from 'components/SideMenuTrigger'
import HeaderSearchBox from 'components/HeaderSearchBox'
import SearchPage from 'components/SearchPage'
import PageListSearch from 'components/PageListSearch'
import PageHistory from 'components/PageHistory'
import PageAttachment from 'components/PageAttachment'
import PageAlerts from 'components/PageAlerts'
import SeenUserList from 'components/SeenUserList'
import BookmarkButton from 'components/BookmarkButton'
import ShareBox from 'components/ExternalShare/ShareBox'
import SecretKeywordFormContainer from 'components/ExternalShare/SecretKeywordForm/SecretKeywordFormContainer'
import RenameTree from 'components/RenameTree/RenameTree'
import Backlink from './components/Backlink'
import NotificationPage from 'components/NotificationPage'
import HeaderNotification from 'components/HeaderNotification'
import WatchButton from 'components/Notification/WatchButton'
import AdminShare from 'components/Admin/Share/AdminShare'
import Comment from 'components/Comment/Comment'
import AdminPage from 'components/Admin/AdminPage'
 
import hydrateComponents from './hydrateComponents'
 
i18n()
 
moment.locale(navigator.userLanguage || navigator.language)
 
const mainContent = document.querySelector('#content-main')
let pageId: string | null = null
let revisionId: string | null = null
let revisionCreatedAt: string | null = null
let pageContent: string | null = null
if (mainContent !== null) {
  pageId = mainContent.getAttribute('data-page-id')
  revisionId = mainContent.getAttribute('data-page-revision-id')
  revisionCreatedAt = mainContent.getAttribute('data-page-revision-created')
  const rawText = document.getElementById('raw-text-original')
  if (rawText) {
    pageContent = rawText.innerHTML
  }
}
 
const getTextContent = (element: HTMLElement | null) => (element ? element.textContent : null)
 
const { user = {} } = JSON.parse(getTextContent(document.getElementById('user-context-hydrate')) || '{}')
const csrfToken = $('#content-main').data('csrftoken') || $('#admin-page').data('csrftoken')
// FIXME
const crowi = new Crowi({ user, csrfToken }, window)
window.crowi = crowi
crowi.setConfig(JSON.parse(getTextContent(document.getElementById('crowi-context-hydrate')) || '{}'))
const isSharePage = !!$('#content-main').data('is-share-page') || !!$('#secret-keyword-form-container').data('share-id')
if (!isSharePage) {
  crowi.fetchUsers()
}
 
const crowiRenderer = new CrowiRenderer(crowi)
window.crowiRenderer = crowiRenderer
 
const crowiAuth = new CrowiAuth(crowi)
window.crowiAuth = crowiAuth
 
const me = $('body').data('me')
const componentMappings = {
  'side-menu-trigger': <SideMenuTrigger crowi={crowi} />,
  'search-top': <HeaderSearchBox crowi={crowi} />,
  'search-page': <SearchPage crowi={crowi} />,
  'page-list-search': <PageListSearch crowi={crowi} />,
  'page-attachment': <PageAttachment pageId={pageId} pageContent={pageContent} crowi={crowi} />,
  'page-alerts': <PageAlerts pageId={pageId} crowi={crowi} />,
  'rename-tree': <RenameTree crowi={crowi} />,
  'header-notification': <HeaderNotification me={me} crowi={crowi} />,
  'notification-page': <NotificationPage crowi={crowi} />,
 
  // 'revision-history': <PageHistory pageId={pageId} />,
  'backlink-list': <Backlink pageId={pageId} crowi={crowi} />,
  'seen-user-list': <SeenUserList crowi={crowi} />,
  'bookmark-button': <BookmarkButton pageId={pageId} crowi={crowi} />,
  'share-box': <ShareBox pageId={pageId} crowi={crowi} />,
  'secret-keyword-form-container': <SecretKeywordFormContainer crowi={crowi} />,
  'watch-button': <WatchButton pageId={pageId} crowi={crowi} />,
  'admin-share': <AdminShare crowi={crowi} />,
  'page-comments': <Comment crowi={crowi} pageId={pageId} revisionId={revisionId} revisionCreatedAt={revisionCreatedAt} isSharePage={isSharePage} />,
  'admin-page': <AdminPage crowi={crowi} />,
}
 
Object.entries(componentMappings).forEach(([key, component]) => {
  const elem = document.getElementById(key)
  if (elem) {
    ReactDOM.render(component, elem)
  }
})
 
// TODO: remove this logic after migrate to React
const closeSideMenuHandler = e => {
  Emitter.emit('closeSideMenu')
}
Emitter.on('sideMenuHandle', isOpen => {
  const closeTriggerElements = ['crowi-global-menu', 'v2-container-backdrop']
  const containerElement = document.getElementById('crowi-main-container')
  const menuClassName = ' side-menu-open'
  if (containerElement) {
    if (isOpen) {
      containerElement.className += menuClassName
      for (const elemName of closeTriggerElements) {
        const e = document.getElementById(elemName)
        if (e) {
          e.addEventListener('click', closeSideMenuHandler)
        }
      }
    } else {
      containerElement.className = containerElement.className.replace(menuClassName, '')
      for (const elemName of closeTriggerElements) {
        const e = document.getElementById(elemName)
        if (e) {
          e.removeEventListener('click', closeSideMenuHandler)
        }
      }
    }
  }
})
 
hydrateComponents()
 
// うわーもうー
$('a[data-toggle="tab"][href="#revision-history"]').on('show.bs.tab', function() {
  ReactDOM.render(<PageHistory pageId={pageId} crowi={crowi} />, document.getElementById('revision-history'))
})