import React from 'react'; import ReactDOM from 'react-dom'; import Account from './components/common/account'; import { serviceURL, gettext, siteRoot, mediaUrl, logoPath, logoWidth, logoHeight, siteTitle } from './utils/constants'; import { Button } from 'reactstrap'; import { seafileAPI } from './utils/seafile-api'; import { Utils } from './utils/utils'; import Loading from './components/loading'; import SaveSharedFileDialog from './components/dialog/save-shared-file-dialog'; import toaster from './components/toast'; import watermark from 'watermark-dom'; import MarkdownViewer from '@seafile/seafile-editor/dist/viewer/markdown-viewer'; import './css/shared-file-view.css'; import './assets/css/fa-solid.css'; import './assets/css/fa-regular.css'; import './assets/css/fontawesome.css'; let loginUser = window.app.pageOptions.name; const { repoID, sharedToken, trafficOverLimit, fileName, fileSize, rawPath, sharedBy, siteName, enableWatermark, download } = window.shared.pageOptions; class SharedFileViewMarkdown extends React.Component { constructor(props) { super(props); this.state = { markdownContent: '', loading: true, showSaveSharedFileDialog: false, }; } handleSaveSharedFileDialog = () => { this.setState({ showSaveSharedFileDialog: true }); } toggleCancel = () => { this.setState({ showSaveSharedFileDialog: false }); } handleSaveSharedFile = () => { toaster.success(gettext('Successfully saved'), { duration: 3 }); } componentDidMount() { seafileAPI.getFileContent(rawPath).then((res) => { this.setState({ markdownContent: res.data, loading: false }); }); if (trafficOverLimit == 'True') { toaster.danger(gettext('File download is disabled: the share link traffic of owner is used up.'), { duration: 3 }); } } changeImageURL = (innerNode) => { if (innerNode.type == 'image') { let imageUrl = innerNode.data.src; const re = new RegExp(serviceURL + '/lib/' + repoID +'/file.*raw=1'); // different repo if (!re.test(imageUrl)) { return; } // get image path let index = imageUrl.indexOf('/file'); let index2 = imageUrl.indexOf('?'); const imagePath = imageUrl.substring(index + 5, index2); // change image url innerNode.data.src = serviceURL + '/view-image-via-share-link/?token=' + sharedToken + '&path=' + imagePath; } return innerNode; } modifyValueBeforeRender = (value) => { let nodes = value.document.nodes; let newNodes = Utils.changeMarkdownNodes(nodes, this.changeImageURL); value.document.nodes = newNodes; return value; } render() { if (this.state.loading) { return ; } return (
logo { loginUser && }

{fileName}

{gettext('Shared by:')}{' '}{sharedBy}

{download &&
{(loginUser && loginUser !== sharedBy) && }{' '} {(trafficOverLimit === 'False') && }
}
{this.state.showSaveSharedFileDialog && }
); } } if (enableWatermark) { let watermark_txt; if (loginUser) { watermark_txt = siteName + ' ' + loginUser; } else { watermark_txt = gettext('Anonymous User'); } watermark.init({ watermark_txt: watermark_txt, watermark_alpha: 0.075 }); } ReactDOM.render ( , document.getElementById('wrapper') );