From 04e791f14c9dff95d3327a2be6bc34ee26dc384c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E9=A1=BA=E5=BC=BA?= Date: Tue, 16 Jul 2019 10:01:09 +0800 Subject: [PATCH] Improve response catch module (#3848) * add err hanlder for dialog ajax request * add error handler for component ajax request * repair code bug * repair code bug * add handler for page ajax module --- frontend/src/components/common/account.js | 4 + .../dialog/add-related-file-dialog.js | 7 +- .../components/dialog/add-reviewer-dialog.js | 8 + .../dialog/change-repo-password-dialog.js | 11 +- frontend/src/components/dialog/clean-trash.js | 8 +- .../src/components/dialog/commit-details.js | 8 +- .../components/dialog/create-group-dialog.js | 7 +- .../components/dialog/dismiss-group-dialog.js | 7 +- .../components/dialog/edit-filetag-dialog.js | 17 +- .../dialog/edit-repo-commit-labels.js | 8 +- .../components/dialog/generate-share-link.js | 12 +- .../components/dialog/generate-upload-link.js | 6 + .../components/dialog/internal-link-dialog.js | 6 +- .../dialog/label-repo-state-dialog.js | 15 +- .../components/dialog/leave-group-dialog.js | 7 +- .../dialog/lib-history-setting-dialog.js | 11 +- .../dialog/list-related-file-dialog.js | 10 +- .../src/components/dialog/list-tag-dialog.js | 4 + .../dialog/list-taggedfiles-dialog.js | 9 +- .../dialog/manage-members-dialog.js | 11 ++ .../components/dialog/org-add-admin-dialog.js | 11 +- .../dialog/org-add-member-dialog.js | 5 + .../components/dialog/org-add-repo-dialog.js | 3 +- .../dialog/org-delete-member-dialog.js | 4 + .../dialog/org-delete-repo-dialog.js | 4 + .../dialog/org-logs-file-update-detail.js | 7 +- .../dialog/org-set-group-quota-dialog.js | 5 + .../src/components/dialog/readme-dialog.js | 5 + .../components/dialog/rename-group-dialog.js | 5 + .../dialog/save-shared-file-dialog.js | 8 +- .../src/components/dialog/share-dialog.js | 5 + .../src/components/dialog/share-to-group.js | 26 ++++ .../src/components/dialog/share-to-user.js | 17 ++ .../src/components/dialog/transfer-dialog.js | 5 + .../dialog/transfer-group-dialog.js | 8 +- .../components/dialog/update-tag-dialog.js | 8 + .../components/dialog/zip-download-dialog.js | 15 +- .../dir-view-mode/dir-column-file.js | 4 + .../dirent-detail/detail-comments-list.js | 17 ++ .../dirent-detail/dirent-details.js | 21 ++- .../components/dirent-detail/lib-details.js | 6 +- .../dirent-grid-view/dirent-grid-view.js | 9 +- .../dirent-list-view/dirent-list-item.js | 13 ++ .../dirent-list-view/dirent-list-view.js | 10 +- .../components/file-chooser/file-chooser.js | 14 +- .../components/file-chooser/repo-list-item.js | 10 ++ .../components/file-uploader/file-uploader.js | 16 ++ .../src/components/file-view/comment-panel.js | 17 ++ frontend/src/components/main-side-nav.js | 9 +- .../review-list-view/review-comment-dialog.js | 8 + .../review-list-view/review-comments.js | 14 ++ frontend/src/components/search/search.js | 9 +- frontend/src/components/send-link.js | 12 +- .../shared-repo-list-item.js | 7 + .../toolbar/mutilple-dir-operation-toolbar.js | 16 ++ .../components/toolbar/view-file-toolbar.js | 6 +- frontend/src/components/user-select.js | 5 + .../components/user-settings/email-notice.js | 8 +- .../user-settings/user-avatar-form.js | 12 +- .../user-settings/webdav-password.js | 12 +- .../src/components/wiki-markdown-viewer.js | 8 +- frontend/src/draw/draw-viewer.js | 5 + frontend/src/draw/draw.js | 6 +- frontend/src/pages/groups/group-view.js | 32 ++-- frontend/src/pages/groups/groups-view.js | 20 ++- .../lib-content-view/lib-content-view.js | 145 +++++++++++++----- .../pages/linked-devices/linked-devices.js | 10 +- frontend/src/pages/my-libs/my-libs-deleted.js | 14 +- frontend/src/pages/my-libs/my-libs.js | 4 + .../src/pages/my-libs/mylib-repo-list-item.js | 20 ++- .../pages/org-admin/org-department-item.js | 13 ++ frontend/src/pages/org-admin/org-groups.js | 17 +- frontend/src/pages/org-admin/org-libraries.js | 13 +- frontend/src/pages/org-admin/org-links.js | 7 +- .../pages/org-admin/org-logs-file-audit.js | 5 + .../pages/org-admin/org-logs-file-update.js | 7 +- .../pages/org-admin/org-logs-perm-audit.js | 6 +- frontend/src/pages/org-admin/org-user-item.js | 18 ++- frontend/src/pages/org-admin/org-users.js | 33 +++- frontend/src/pages/review/history-list.js | 7 +- frontend/src/pages/share-admin/folders.js | 20 ++- frontend/src/pages/share-admin/libraries.js | 20 ++- frontend/src/pages/share-admin/share-links.js | 20 ++- .../src/pages/share-admin/upload-links.js | 11 +- frontend/src/pages/shared-libs/shared-libs.js | 24 ++- .../shared-with-all/public-shared-view.js | 19 ++- frontend/src/pages/starred/starred.js | 9 +- frontend/src/repo-snapshot.js | 18 +-- frontend/src/settings.js | 20 +-- frontend/src/shared-dir-view.js | 11 +- frontend/src/shared-file-view-markdown.js | 6 +- 91 files changed, 813 insertions(+), 327 deletions(-) diff --git a/frontend/src/components/common/account.js b/frontend/src/components/common/account.js index 3cbb442a53..065bf1ee63 100644 --- a/frontend/src/components/common/account.js +++ b/frontend/src/components/common/account.js @@ -4,6 +4,7 @@ import ReactDOM from 'react-dom'; import { Utils } from '../../utils/utils'; import { seafileAPI } from '../../utils/seafile-api'; import { siteRoot, gettext, appAvatarURL } from '../../utils/constants'; +import toaster from '../toast'; const propTypes = { isAdminPanel: PropTypes.bool, @@ -79,6 +80,9 @@ class Account extends Component { isOrgStaff: resp.data.is_org_staff === 1 ? true : false, showInfo: !this.state.showInfo, }); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); this.isFirstMounted = false; } else { diff --git a/frontend/src/components/dialog/add-related-file-dialog.js b/frontend/src/components/dialog/add-related-file-dialog.js index 08f7551831..55dc31067f 100644 --- a/frontend/src/components/dialog/add-related-file-dialog.js +++ b/frontend/src/components/dialog/add-related-file-dialog.js @@ -49,11 +49,8 @@ class AddRelatedFileDialog extends React.Component { this.props.onRelatedFileChange(); this.toggle(); }).catch((error) => { - if (error.response) { - this.setState({ - errMessage: error.response.data.error_msg - }); - } + let errMessage = Utils.getErrorMsg(error); + this.setState({errMessage: errMessage}); }); } diff --git a/frontend/src/components/dialog/add-reviewer-dialog.js b/frontend/src/components/dialog/add-reviewer-dialog.js index e407c90545..7ae0d16eed 100644 --- a/frontend/src/components/dialog/add-reviewer-dialog.js +++ b/frontend/src/components/dialog/add-reviewer-dialog.js @@ -3,6 +3,8 @@ import PropTypes from 'prop-types'; import { gettext } from '../../utils/constants'; import { Button, Modal, ModalHeader, ModalBody, ModalFooter } from 'reactstrap'; import { seafileAPI } from '../../utils/seafile-api.js'; +import { Utils } from '../../utils/utils'; +import toaster from '../toast'; import UserSelect from '../user-select.js'; import '../../css/add-reviewer-dialog.css'; @@ -63,6 +65,9 @@ class AddReviewerDialog extends React.Component { if (res.data.success.length > 0) { this.listReviewers(); } + }).catch(error => { + let errorMsg = Utils.getErrorMsg(error); + toaster.danger(errorMsg); }); } } @@ -79,6 +84,9 @@ class AddReviewerDialog extends React.Component { } this.setState({ reviewers: newReviewers }); } + }).catch(error => { + let errorMsg = Utils.getErrorMsg(error); + toaster.danger(errorMsg); }); } diff --git a/frontend/src/components/dialog/change-repo-password-dialog.js b/frontend/src/components/dialog/change-repo-password-dialog.js index 4f1b946a29..940b84946e 100644 --- a/frontend/src/components/dialog/change-repo-password-dialog.js +++ b/frontend/src/components/dialog/change-repo-password-dialog.js @@ -83,16 +83,7 @@ class ChangeRepoPasswordDialog extends React.Component { this.props.toggleDialog(); toaster.success(gettext('Successfully changed library password.')); }).catch((error) => { - let errorMsg = ''; - if (error.response) { - if (error.response.data) { - errorMsg = error.response.data.error_msg; - } else { - errorMsg = gettext('Error'); - } - } else { - errorMsg = gettext('Please check the network.'); - } + let errorMsg = Utils.getErrorMsg(error); this.setState({ errorMsg: errorMsg, submitBtnDisabled: false diff --git a/frontend/src/components/dialog/clean-trash.js b/frontend/src/components/dialog/clean-trash.js index 0816b16801..5b871aaf86 100644 --- a/frontend/src/components/dialog/clean-trash.js +++ b/frontend/src/components/dialog/clean-trash.js @@ -4,6 +4,7 @@ import { Modal, ModalHeader, ModalBody, ModalFooter } from 'reactstrap'; import Select from 'react-select/lib/Creatable'; import { gettext } from '../../utils/constants'; import { seafileAPI } from '../../utils/seafile-api'; +import { Utils } from '../../utils/utils'; import toaster from '../toast'; const propTypes = { @@ -46,12 +47,7 @@ class CleanTrash extends React.Component { this.props.refreshTrash(); this.props.toggleDialog(); }).catch((error) => { - let errorMsg = ''; - if (error.response) { - errorMsg = error.response.data.error_msg || gettext('Error'); - } else { - errorMsg = gettext('Please check the network.'); - } + let errorMsg = Utils.getErrorMsg(error); this.setState({ formErrorMsg: errorMsg, submitBtnDisabled: false diff --git a/frontend/src/components/dialog/commit-details.js b/frontend/src/components/dialog/commit-details.js index 7b4838498c..68657d2b91 100644 --- a/frontend/src/components/dialog/commit-details.js +++ b/frontend/src/components/dialog/commit-details.js @@ -4,6 +4,7 @@ import { Modal, ModalHeader, ModalBody } from 'reactstrap'; import moment from 'moment'; import { gettext, fileServerRoot } from '../../utils/constants'; import { seafileAPI } from '../../utils/seafile-api'; +import { Utils } from '../../utils/utils'; import Loading from '../loading'; const propTypes = { @@ -31,12 +32,7 @@ class CommitDetails extends React.Component { commitDetails: res.data }); }).catch((error) => { - let errorMsg = ''; - if (error.response) { - errorMsg = error.response.data.error || gettext('Error'); - } else { - errorMsg = gettext('Please check the network.'); - } + let errorMsg = Utils.getErrorMsg(error); this.setState({ isLoading: false, errorMsg: errorMsg diff --git a/frontend/src/components/dialog/create-group-dialog.js b/frontend/src/components/dialog/create-group-dialog.js index e798892519..3ab71e3ec9 100644 --- a/frontend/src/components/dialog/create-group-dialog.js +++ b/frontend/src/components/dialog/create-group-dialog.js @@ -3,6 +3,7 @@ import PropTypes from 'prop-types'; import { gettext } from '../../utils/constants'; import { seafileAPI } from '../../utils/seafile-api'; import { Modal, ModalHeader, ModalBody, ModalFooter, Input, Button } from 'reactstrap'; +import { Utils } from '../../utils/utils'; class CreateGroupDialog extends React.Component { @@ -46,10 +47,8 @@ class CreateGroupDialog extends React.Component { seafileAPI.createGroup(name).then((res)=> { that.props.onCreateGroup(); }).catch((error) => { - let errorMsg = gettext(error.response.data.error_msg); - this.setState({ - errorMsg: errorMsg - }); + let errorMsg = Utils.getErrorMsg(error); + this.setState({errorMsg: errorMsg}); }); } else { this.setState({ diff --git a/frontend/src/components/dialog/dismiss-group-dialog.js b/frontend/src/components/dialog/dismiss-group-dialog.js index 3dbe1912f4..fa423f6295 100644 --- a/frontend/src/components/dialog/dismiss-group-dialog.js +++ b/frontend/src/components/dialog/dismiss-group-dialog.js @@ -1,8 +1,10 @@ import React from 'react'; import PropTypes from 'prop-types'; +import { Modal, ModalHeader, ModalBody, ModalFooter, Button } from 'reactstrap'; import { gettext } from '../../utils/constants'; import { seafileAPI } from '../../utils/seafile-api'; -import { Modal, ModalHeader, ModalBody, ModalFooter, Button } from 'reactstrap'; +import { Utils } from '../../utils/utils'; +import toaster from '../toast'; class DismissGroupDialog extends React.Component { @@ -14,6 +16,9 @@ class DismissGroupDialog extends React.Component { let that = this; seafileAPI.deleteGroup(this.props.groupID).then((res)=> { that.props.onGroupChanged(); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } diff --git a/frontend/src/components/dialog/edit-filetag-dialog.js b/frontend/src/components/dialog/edit-filetag-dialog.js index d179bd02a7..ddcae799e3 100644 --- a/frontend/src/components/dialog/edit-filetag-dialog.js +++ b/frontend/src/components/dialog/edit-filetag-dialog.js @@ -6,6 +6,7 @@ import { seafileAPI } from '../../utils/seafile-api'; import { Utils } from '../../utils/utils'; import RepoTag from '../../models/repo-tag'; import CreateTagDialog from './create-tag-dialog'; +import toaster from '../toast'; require('../../css/repo-tag.css'); const TagItemPropTypes = { @@ -54,6 +55,9 @@ class TagItem extends React.Component { seafileAPI.addFileTag(repoID, filePath, id).then(() => { repoTagIdList = this.getRepoTagIdList(); this.props.onFileTagChanged(); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } else { let fileTag = null; @@ -67,6 +71,9 @@ class TagItem extends React.Component { seafileAPI.deleteFileTag(repoID, fileTag.id).then(() => { repoTagIdList = this.getRepoTagIdList(); this.props.onFileTagChanged(); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } } @@ -121,9 +128,10 @@ class TagList extends React.Component { let repoTag = new RepoTag(item); repotagList.push(repoTag); }); - this.setState({ - repotagList: repotagList, - }); + this.setState({repotagList: repotagList}); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } @@ -186,6 +194,9 @@ class EditFileTagDialog extends React.Component { let {repoID, filePath} = this.props; seafileAPI.addFileTag(repoID, filePath, repoTagID).then(() => { this.props.onFileTagChanged(); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } diff --git a/frontend/src/components/dialog/edit-repo-commit-labels.js b/frontend/src/components/dialog/edit-repo-commit-labels.js index dba0ba50a7..08fdeea7de 100644 --- a/frontend/src/components/dialog/edit-repo-commit-labels.js +++ b/frontend/src/components/dialog/edit-repo-commit-labels.js @@ -4,6 +4,7 @@ import { Modal, ModalHeader, ModalBody, ModalFooter } from 'reactstrap'; import CreatableSelect from 'react-select/lib/Creatable'; import { gettext } from '../../utils/constants'; import { seafileAPI } from '../../utils/seafile-api'; +import { Utils } from '../../utils/utils'; import toaster from '../toast'; const propTypes = { @@ -45,12 +46,7 @@ class UpdateRepoCommitLabels extends React.Component { this.props.toggleDialog(); toaster.success(gettext('Successfully edited labels.')); }).catch((error) => { - let errorMsg = ''; - if (error.response) { - errorMsg = error.response.data.error_msg || gettext('Error'); - } else { - errorMsg = gettext('Please check the network.'); - } + let errorMsg = Utils.getErrorMsg(error); this.setState({ formErrorMsg: errorMsg, submitBtnDisabled: false diff --git a/frontend/src/components/dialog/generate-share-link.js b/frontend/src/components/dialog/generate-share-link.js index 07bd8a520a..bf62468830 100644 --- a/frontend/src/components/dialog/generate-share-link.js +++ b/frontend/src/components/dialog/generate-share-link.js @@ -59,12 +59,18 @@ class GenerateShareLink extends React.Component { } else { this.setState({isLoading: false}); } + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); if (this.isOfficeFile) { seafileAPI.getFileInfo(repoID, path).then((res) => { if (res.data) { this.setState({fileInfo: res.data}); } + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } } @@ -134,7 +140,8 @@ class GenerateShareLink extends React.Component { let sharedLinkInfo = new SharedLinkInfo(res.data); this.setState({sharedLinkInfo: sharedLinkInfo}); }).catch((error) => { - toaster.danger(error.response.data.error_msg); + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } } @@ -170,6 +177,9 @@ class GenerateShareLink extends React.Component { 'can_edit': false, 'can_download': true }; + }).catch((error) => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } diff --git a/frontend/src/components/dialog/generate-upload-link.js b/frontend/src/components/dialog/generate-upload-link.js index 1983fc2818..9dc019e75e 100644 --- a/frontend/src/components/dialog/generate-upload-link.js +++ b/frontend/src/components/dialog/generate-upload-link.js @@ -100,6 +100,9 @@ class GenerateUploadLink extends React.Component { seafileAPI.createUploadLink(repoID, path, password, expireDays).then((res) => { let sharedUploadInfo = new SharedUploadInfo(res.data); this.setState({sharedUploadInfo: sharedUploadInfo}); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } } @@ -164,6 +167,9 @@ class GenerateUploadLink extends React.Component { passwordnew: '', sharedUploadInfo: null, }); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } diff --git a/frontend/src/components/dialog/internal-link-dialog.js b/frontend/src/components/dialog/internal-link-dialog.js index a72d7d5620..b3e2365392 100644 --- a/frontend/src/components/dialog/internal-link-dialog.js +++ b/frontend/src/components/dialog/internal-link-dialog.js @@ -2,9 +2,10 @@ import React from 'react'; import { Button, Modal, ModalHeader, ModalBody, ModalFooter } from 'reactstrap'; import PropTypes from 'prop-types'; import toaster from '../toast'; -import copy from '@seafile/seafile-editor/dist//utils/copy-to-clipboard'; +import copy from '@seafile/seafile-editor/dist/utils/copy-to-clipboard'; import { gettext } from '../../utils/constants'; import { seafileAPI } from '../../utils/seafile-api'; +import { Utils } from '../../utils/utils'; import '../../css/internal-link.css'; const propTypes = { @@ -38,6 +39,9 @@ class InternalLinkDialog extends React.Component { this.setState({ isOpen: true, smartLink: res.data.smart_link + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); }); } diff --git a/frontend/src/components/dialog/label-repo-state-dialog.js b/frontend/src/components/dialog/label-repo-state-dialog.js index d0d3df153a..746f95b266 100644 --- a/frontend/src/components/dialog/label-repo-state-dialog.js +++ b/frontend/src/components/dialog/label-repo-state-dialog.js @@ -4,6 +4,7 @@ import { Modal, ModalHeader, ModalBody, ModalFooter } from 'reactstrap'; import CreatableSelect from 'react-select/lib/Creatable'; import { gettext } from '../../utils/constants'; import { seafileAPI } from '../../utils/seafile-api'; +import { Utils } from '../../utils/utils'; import Loading from '../loading'; import toaster from '../toast'; @@ -32,12 +33,7 @@ class LabelRepoStateDialog extends React.Component { errorMsg: '' }); }).catch((error) => { - let errorMsg = ''; - if (error.response) { - errorMsg = error.response.data.error_msg || gettext('Error'); - } else { - errorMsg = gettext('Please check the network.'); - } + let errorMsg = Utils.getErrorMsg(error); this.setState({ isLoading: false, errorMsg: errorMsg @@ -72,12 +68,7 @@ class LabelRepoStateDialog extends React.Component { toaster.success(msg); this.props.toggleDialog(); }).catch((error) => { - let errorMsg = ''; - if (error.response) { - errorMsg = error.response.data.error_msg || gettext('Error'); - } else { - errorMsg = gettext('Please check the network.'); - } + let errorMsg = Utils.getErrorMsg(error); this.setState({ formErrorMsg: errorMsg, submitBtnDisabled: false diff --git a/frontend/src/components/dialog/leave-group-dialog.js b/frontend/src/components/dialog/leave-group-dialog.js index c5caf9997f..2da58dc17e 100644 --- a/frontend/src/components/dialog/leave-group-dialog.js +++ b/frontend/src/components/dialog/leave-group-dialog.js @@ -1,8 +1,10 @@ import React from 'react'; import PropTypes from 'prop-types'; +import { Modal, ModalHeader, ModalBody, ModalFooter, Button } from 'reactstrap'; import { gettext, username } from '../../utils/constants'; import { seafileAPI } from '../../utils/seafile-api'; -import { Modal, ModalHeader, ModalBody, ModalFooter, Button } from 'reactstrap'; +import { Utils } from '../../utils/utils'; +import toaster from '../toast'; class LeaveGroupDialog extends React.Component { @@ -13,6 +15,9 @@ class LeaveGroupDialog extends React.Component { leaveGroup = () => { seafileAPI.quitGroup(this.props.groupID, username).then((res)=> { this.props.onGroupChanged(); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } diff --git a/frontend/src/components/dialog/lib-history-setting-dialog.js b/frontend/src/components/dialog/lib-history-setting-dialog.js index 56d516775a..0d86405ca5 100644 --- a/frontend/src/components/dialog/lib-history-setting-dialog.js +++ b/frontend/src/components/dialog/lib-history-setting-dialog.js @@ -1,9 +1,10 @@ import React from 'react'; import PropTypes from 'prop-types'; -import { gettext, enableRepoHistorySetting } from '../../utils/constants'; -import toaster from '../toast'; import { Button, Modal, ModalHeader, ModalBody, ModalFooter, Form, FormGroup, Label, Input, Alert } from 'reactstrap'; +import { gettext, enableRepoHistorySetting } from '../../utils/constants'; import { seafileAPI } from '../../utils/seafile-api.js'; +import { Utils } from '../../utils/utils'; +import toaster from '../toast'; const propTypes = { itemName: PropTypes.string.isRequired, @@ -36,6 +37,9 @@ class LibHistorySetting extends React.Component { disabled: res.data.keep_days > 0 ? false : true, expireDays: res.data.keep_days > 0 ? res.data.keep_days : 30, }); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } @@ -53,6 +57,9 @@ class LibHistorySetting extends React.Component { toaster.success(message); this.setState({keepDays: res.data.keep_days}); this.props.toggleDialog(); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } else { this.setState({ diff --git a/frontend/src/components/dialog/list-related-file-dialog.js b/frontend/src/components/dialog/list-related-file-dialog.js index b20b93d857..179b53ca94 100644 --- a/frontend/src/components/dialog/list-related-file-dialog.js +++ b/frontend/src/components/dialog/list-related-file-dialog.js @@ -3,8 +3,9 @@ import PropTypes from 'prop-types'; import { Button, ModalHeader, ModalBody, ModalFooter, Table } from 'reactstrap'; import Dirent from '../../models/dirent'; import { gettext, siteRoot } from '../../utils/constants'; -import { Utils } from '../../utils/utils'; import { seafileAPI } from '../../utils/seafile-api'; +import { Utils } from '../../utils/utils'; +import toaster from '../toast'; import '../../css/list-related-file-dialog.css'; const propTypes = { @@ -31,6 +32,9 @@ class ListRelatedFileDialog extends React.Component { let relatedID = item.related_id; seafileAPI.deleteRelatedFile(repoID, filePath, relatedID).then((res) => { this.props.onRelatedFileChange(); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } @@ -53,11 +57,9 @@ class ListRelatedFileDialog extends React.Component { dirent['related_id'] = item.related_id; dirent['link'] = siteRoot + 'lib/' + item.repo_id + '/file' + Utils.encodePath(item.path); direntList.push(dirent); - this.setState({ - direntList: direntList - }); }); }); + this.setState({direntList: direntList}); } componentWillMount() { diff --git a/frontend/src/components/dialog/list-tag-dialog.js b/frontend/src/components/dialog/list-tag-dialog.js index 216b64d19e..6ce0a5ae5f 100644 --- a/frontend/src/components/dialog/list-tag-dialog.js +++ b/frontend/src/components/dialog/list-tag-dialog.js @@ -4,6 +4,7 @@ import { Button, ModalHeader, ModalBody, ModalFooter } from 'reactstrap'; import { gettext } from '../../utils/constants'; import { seafileAPI } from '../../utils/seafile-api'; import { Utils } from '../../utils/utils'; +import toaster from '../toast'; import RepoTag from '../../models/repo-tag'; import '../../css/repo-tag.css'; @@ -92,6 +93,9 @@ class ListTagDialog extends React.Component { this.setState({ repotagList: repotagList, }); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } diff --git a/frontend/src/components/dialog/list-taggedfiles-dialog.js b/frontend/src/components/dialog/list-taggedfiles-dialog.js index 4912d800f4..4866900866 100644 --- a/frontend/src/components/dialog/list-taggedfiles-dialog.js +++ b/frontend/src/components/dialog/list-taggedfiles-dialog.js @@ -1,10 +1,11 @@ import React from 'react'; import PropTypes from 'prop-types'; import { Button, Modal, ModalHeader, ModalBody, ModalFooter } from 'reactstrap'; +import moment from 'moment'; import { gettext, siteRoot } from '../../utils/constants'; import { seafileAPI } from '../../utils/seafile-api'; -import moment from 'moment'; import { Utils } from '../../utils/utils'; +import toaster from '../toast'; const propTypes = { repoID: PropTypes.string.isRequired, @@ -38,6 +39,9 @@ class ListTaggedFilesDialog extends React.Component { this.getTaggedFiles(); this.props.updateUsedRepoTags(); if (this.props.onFileTagChanged) this.onFileTagChanged(taggedFile); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } @@ -57,6 +61,9 @@ class ListTaggedFilesDialog extends React.Component { this.setState({ taggedFileList: taggedFileList, }); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } diff --git a/frontend/src/components/dialog/manage-members-dialog.js b/frontend/src/components/dialog/manage-members-dialog.js index 315d225037..5bb0358f92 100644 --- a/frontend/src/components/dialog/manage-members-dialog.js +++ b/frontend/src/components/dialog/manage-members-dialog.js @@ -5,6 +5,8 @@ import { Button, Modal, ModalHeader, ModalBody, ModalFooter, Table } from 'react import { seafileAPI } from '../../utils/seafile-api.js'; import RoleEditor from '../select-editor/role-editor'; import UserSelect from '../user-select.js'; +import { Utils } from '../../utils/utils'; +import toaster from '../toast'; import '../../css/manage-members-dialog.css'; const propTypes = { @@ -49,6 +51,9 @@ class ManageMembersDialog extends React.Component { errMessage: res.data.failed }); } + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } @@ -57,6 +62,9 @@ class ManageMembersDialog extends React.Component { this.setState({ groupMembers: res.data }); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } @@ -177,6 +185,9 @@ class Member extends React.PureComponent { deleteMember = (name) => { seafileAPI.deleteGroupMember(this.props.groupID, name).then((res) => { this.props.onGroupMembersChange(); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } diff --git a/frontend/src/components/dialog/org-add-admin-dialog.js b/frontend/src/components/dialog/org-add-admin-dialog.js index b595cd90cd..f7d4125d94 100644 --- a/frontend/src/components/dialog/org-add-admin-dialog.js +++ b/frontend/src/components/dialog/org-add-admin-dialog.js @@ -2,6 +2,8 @@ import React from 'react'; import PropTypes from 'prop-types'; import { Button, Modal, ModalHeader, ModalBody, ModalFooter, Alert } from 'reactstrap'; import { gettext, orgID } from '../../utils/constants'; +import { Utils } from '../../utils/utils'; +import toaster from '../toast'; import UserSelect from '../user-select'; import { seafileAPI } from '../../utils/seafile-api'; import OrgUserInfo from '../../models/org-user'; @@ -35,12 +37,9 @@ class AddOrgAdminDialog extends React.Component { seafileAPI.setOrgAdmin(orgID, userEmail, true).then(res => { let userInfo = new OrgUserInfo(res.data); this.props.onAddedOrgAdmin(userInfo); - }).catch((error) => { - if (error.response) { - this.setState({ - errMessage: error.response.data.error_msg - }); - } + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } diff --git a/frontend/src/components/dialog/org-add-member-dialog.js b/frontend/src/components/dialog/org-add-member-dialog.js index dd83f9c2a6..4ffcdbc9cc 100644 --- a/frontend/src/components/dialog/org-add-member-dialog.js +++ b/frontend/src/components/dialog/org-add-member-dialog.js @@ -3,6 +3,8 @@ import PropTypes from 'prop-types'; import { Button, Modal, ModalHeader, ModalBody, ModalFooter } from 'reactstrap'; import { gettext, orgID } from '../../utils/constants'; import { seafileAPI } from '../../utils/seafile-api'; +import { Utils } from '../../utils/utils'; +import toaster from '../toast'; import UserSelect from '../user-select.js'; const propTypes = { @@ -41,6 +43,9 @@ class AddMemberDialog extends React.Component { this.props.onMemberChanged(); this.props.toggle(); } + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } diff --git a/frontend/src/components/dialog/org-add-repo-dialog.js b/frontend/src/components/dialog/org-add-repo-dialog.js index 505b1e4ff5..3f393dec01 100644 --- a/frontend/src/components/dialog/org-add-repo-dialog.js +++ b/frontend/src/components/dialog/org-add-repo-dialog.js @@ -3,6 +3,7 @@ import PropTypes from 'prop-types'; import { Button, Modal, ModalHeader, ModalBody, ModalFooter, Input, Form, FormGroup, Label } from 'reactstrap'; import { gettext, orgID } from '../../utils/constants'; import { seafileAPI } from '../../utils/seafile-api'; +import { Utils } from '../../utils/utils'; const propTypes = { toggle: PropTypes.func.isRequired, @@ -33,7 +34,7 @@ class AddRepoDialog extends React.Component { this.props.toggle(); this.props.onRepoChanged(); }).catch(error => { - let errorMsg = gettext(error.response.data.error_msg); + let errorMsg = Utils.getErrorMsg(error); this.setState({ errMessage: errorMsg }); }); } diff --git a/frontend/src/components/dialog/org-delete-member-dialog.js b/frontend/src/components/dialog/org-delete-member-dialog.js index ec9a3cdb80..9e3cabc715 100644 --- a/frontend/src/components/dialog/org-delete-member-dialog.js +++ b/frontend/src/components/dialog/org-delete-member-dialog.js @@ -4,6 +4,7 @@ import { Button, Modal, ModalHeader, ModalBody, ModalFooter } from 'reactstrap'; import { gettext, orgID } from '../../utils/constants'; import { seafileAPI } from '../../utils/seafile-api'; import { Utils } from '../../utils/utils'; +import toaster from '../toast'; const propTypes = { member: PropTypes.object.isRequired, @@ -25,6 +26,9 @@ class DeleteMemberDialog extends React.Component { this.props.onMemberChanged(); this.props.toggle(); } + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } diff --git a/frontend/src/components/dialog/org-delete-repo-dialog.js b/frontend/src/components/dialog/org-delete-repo-dialog.js index 0e792a6724..2d8fd93b78 100644 --- a/frontend/src/components/dialog/org-delete-repo-dialog.js +++ b/frontend/src/components/dialog/org-delete-repo-dialog.js @@ -4,6 +4,7 @@ import { Button, Modal, ModalHeader, ModalBody, ModalFooter } from 'reactstrap'; import { gettext, orgID } from '../../utils/constants'; import { seafileAPI } from '../../utils/seafile-api'; import { Utils } from '../../utils/utils'; +import toaster from '../toast'; class DeleteRepoDialog extends React.Component { @@ -17,6 +18,9 @@ class DeleteRepoDialog extends React.Component { this.props.onRepoChanged(); this.props.toggle(); } + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } diff --git a/frontend/src/components/dialog/org-logs-file-update-detail.js b/frontend/src/components/dialog/org-logs-file-update-detail.js index c7a8b988d0..344e0ee4a2 100644 --- a/frontend/src/components/dialog/org-logs-file-update-detail.js +++ b/frontend/src/components/dialog/org-logs-file-update-detail.js @@ -3,6 +3,8 @@ import PropTypes from 'prop-types'; import { Modal, ModalHeader, ModalBody } from 'reactstrap'; import { seafileAPI } from '../../utils/seafile-api'; import { gettext } from '../../utils/constants'; +import { Utils } from '../../utils/utils'; +import toaster from '../toast'; const propTypes = { repoID: PropTypes.string.isRequired, @@ -36,7 +38,10 @@ class FileUpdateDetailDialog extends React.Component { newfile: this.state.newfile.concat(res.data.new), removed: this.state.removed.concat(res.data.removed), }); - }); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); + }) } renderContentItem = (items) => { diff --git a/frontend/src/components/dialog/org-set-group-quota-dialog.js b/frontend/src/components/dialog/org-set-group-quota-dialog.js index 2056e966da..f7ec5821b4 100644 --- a/frontend/src/components/dialog/org-set-group-quota-dialog.js +++ b/frontend/src/components/dialog/org-set-group-quota-dialog.js @@ -3,6 +3,8 @@ import PropTypes from 'prop-types'; import { Button, Modal, ModalHeader, ModalBody, ModalFooter, Input, InputGroupAddon, InputGroup } from 'reactstrap'; import { gettext, orgID } from '../../utils/constants'; import { seafileAPI } from '../../utils/seafile-api'; +import { Utils } from '../../utils/utils'; +import toaster from '../toast'; const propTypes = { toggle: PropTypes.func.isRequired, @@ -35,6 +37,9 @@ class SetGroupQuotaDialog extends React.Component { seafileAPI.orgAdminSetGroupQuota(orgID, this.props.groupID, newQuota).then((res) => { this.props.toggle(); this.props.onDepartChanged(); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } else { const err = gettext('Quota is invalid.'); diff --git a/frontend/src/components/dialog/readme-dialog.js b/frontend/src/components/dialog/readme-dialog.js index 1721638234..ae953d11fc 100644 --- a/frontend/src/components/dialog/readme-dialog.js +++ b/frontend/src/components/dialog/readme-dialog.js @@ -5,6 +5,8 @@ import MarkdownViewer from '@seafile/seafile-editor/dist/viewer/markdown-viewer' import Loading from '../../components/loading'; import { seafileAPI } from '../../utils/seafile-api'; import { gettext } from '../../utils/constants'; +import { Utils } from '../../utils/utils'; +import toaster from '../toast'; const propTypes = { repoID: PropTypes.string.isRequired, @@ -32,6 +34,9 @@ class ReadmeDialog extends React.Component { isLoading: false, }); }); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } diff --git a/frontend/src/components/dialog/rename-group-dialog.js b/frontend/src/components/dialog/rename-group-dialog.js index bc2cecaf41..3eea20c843 100644 --- a/frontend/src/components/dialog/rename-group-dialog.js +++ b/frontend/src/components/dialog/rename-group-dialog.js @@ -3,6 +3,8 @@ import PropTypes from 'prop-types'; import { gettext } from '../../utils/constants'; import { seafileAPI } from '../../utils/seafile-api'; import { Modal, ModalHeader, ModalBody, ModalFooter, Input, Button } from 'reactstrap'; +import Utils from '../../utils/utils'; +import toaster from '../toast'; class RenameGroupDialog extends React.Component { @@ -34,6 +36,9 @@ class RenameGroupDialog extends React.Component { seafileAPI.renameGroup(this.props.groupID, name).then((res)=> { that.props.loadGroup(this.props.groupID); that.props.onGroupChanged(res.data.id); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } this.setState({ diff --git a/frontend/src/components/dialog/save-shared-file-dialog.js b/frontend/src/components/dialog/save-shared-file-dialog.js index 44cf0fbb49..31b04aa049 100644 --- a/frontend/src/components/dialog/save-shared-file-dialog.js +++ b/frontend/src/components/dialog/save-shared-file-dialog.js @@ -4,6 +4,7 @@ import { Button, Modal, ModalHeader, ModalBody, ModalFooter, Alert } from 'react import { gettext } from '../../utils/constants'; import { seafileAPI } from '../../utils/seafile-api'; import FileChooser from '../file-chooser/file-chooser'; +import { Utils } from '../../utils/utils'; const propTypes = { sharedToken: PropTypes.string.isRequired, @@ -27,11 +28,8 @@ class SaveSharedFileDialog extends React.Component { this.props.toggleCancel(); this.props.handleSaveSharedFile(); }).catch((error) => { - if (error.response) { - this.setState({ - errMessage: error.response.data.error_msg - }); - } + let errMessage = Utils.getErrorMsg(error); + this.setState({errMessage: errMessage}); }); } diff --git a/frontend/src/components/dialog/share-dialog.js b/frontend/src/components/dialog/share-dialog.js index 5936d8986b..737d26159f 100644 --- a/frontend/src/components/dialog/share-dialog.js +++ b/frontend/src/components/dialog/share-dialog.js @@ -8,6 +8,8 @@ import GenerateShareLink from './generate-share-link'; import GenerateUploadLink from './generate-upload-link'; import { seafileAPI } from '../../utils/seafile-api'; import Loading from '../loading'; +import { Utils } from '../../utils/utils'; +import toaster from '../toast'; import '../../css/share-link-dialog.css'; const propTypes = { @@ -40,6 +42,9 @@ class ShareDialog extends React.Component { isRepoJudgemented: true, isRepoOwner: isRepoOwner, }); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } diff --git a/frontend/src/components/dialog/share-to-group.js b/frontend/src/components/dialog/share-to-group.js index 1621d0ac7e..1522694e54 100644 --- a/frontend/src/components/dialog/share-to-group.js +++ b/frontend/src/components/dialog/share-to-group.js @@ -5,6 +5,8 @@ import Select from 'react-select'; import makeAnimated from 'react-select/lib/animated'; import { gettext, isPro } from '../../utils/constants'; import { seafileAPI } from '../../utils/seafile-api.js'; +import { Utils } from '../../utils/utils'; +import toaster from '../toast'; import SharePermissionEditor from '../select-editor/share-permission-editor'; class GroupItem extends React.Component { @@ -140,6 +142,9 @@ class ShareToGroup extends React.Component { obj.label = res.data[i].name; this.options.push(obj); } + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } @@ -152,6 +157,9 @@ class ShareToGroup extends React.Component { sharedItems: res.data }); } + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } @@ -194,6 +202,9 @@ class ShareToGroup extends React.Component { selectedOption: null, permission: 'rw', }); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } else { seafileAPI.shareFolder(repoID, path, 'group', this.state.permission, groups).then(res => { @@ -210,6 +221,9 @@ class ShareToGroup extends React.Component { selectedOption: null, permission: 'rw' }); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } } @@ -222,12 +236,18 @@ class ShareToGroup extends React.Component { this.setState({ sharedItems: this.state.sharedItems.filter(item => { return item.group_info.id !== groupID; }) }); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } else { seafileAPI.deleteShareToGroupItem(repoID, path, 'group', groupID).then(() => { this.setState({ sharedItems: this.state.sharedItems.filter(item => { return item.group_info.id !== groupID; }) }); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } } @@ -239,10 +259,16 @@ class ShareToGroup extends React.Component { if (this.props.isGroupOwnedRepo) { seafileAPI.modifyGroupOwnedRepoGroupSharedPermission(repoID, permission, groupID).then(() => { this.updateSharedItems(item, permission); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } else { seafileAPI.updateShareToGroupItemPermission(repoID, path, 'group', groupID, permission).then(() => { this.updateSharedItems(item, permission); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } } diff --git a/frontend/src/components/dialog/share-to-user.js b/frontend/src/components/dialog/share-to-user.js index 85b600152e..5054848c4c 100644 --- a/frontend/src/components/dialog/share-to-user.js +++ b/frontend/src/components/dialog/share-to-user.js @@ -3,6 +3,8 @@ import PropTypes from 'prop-types'; import {gettext, isPro, canInvitePeople, siteRoot} from '../../utils/constants'; import { Button } from 'reactstrap'; import { seafileAPI } from '../../utils/seafile-api.js'; +import { Utils } from '../../utils/utils'; +import toaster from '../toast'; import UserSelect from '../user-select'; import SharePermissionEditor from '../select-editor/share-permission-editor'; import '../../css/invitations.css'; @@ -127,6 +129,9 @@ class ShareToUser extends React.Component { if(res.data.length !== 0) { this.setState({sharedItems: res.data}); } + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } @@ -215,12 +220,18 @@ class ShareToUser extends React.Component { this.setState({ sharedItems: this.state.sharedItems.filter( item => { return item.user_info.name !== username; }) }); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } else { seafileAPI.deleteShareToUserItem(repoID, path, 'user', username).then(res => { this.setState({ sharedItems: this.state.sharedItems.filter( item => { return item.user_info.name !== username; }) }); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } } @@ -232,10 +243,16 @@ class ShareToUser extends React.Component { if (this.props.isGroupOwnedRepo) { seafileAPI.modifyGroupOwnedRepoUserSharedPermission(repoID, permission, username).then(() => { this.updateSharedItems(item, permission); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } else { seafileAPI.updateShareToUserItemPermission(repoID, path, 'user', username, permission).then(() => { this.updateSharedItems(item, permission); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } } diff --git a/frontend/src/components/dialog/transfer-dialog.js b/frontend/src/components/dialog/transfer-dialog.js index d6f3a74415..a5f4ad9f00 100644 --- a/frontend/src/components/dialog/transfer-dialog.js +++ b/frontend/src/components/dialog/transfer-dialog.js @@ -5,6 +5,8 @@ import Select from 'react-select'; import makeAnimated from 'react-select/lib/animated'; import { seafileAPI } from '../../utils/seafile-api.js'; import { gettext, isPro } from '../../utils/constants'; +import { Utils } from '../../utils/utils'; +import toaster from '../toast'; import UserSelect from '../user-select'; const propTypes = { @@ -42,6 +44,9 @@ class TransferDialog extends React.Component { obj.label = res.data[i].name; this.options.push(obj); } + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } diff --git a/frontend/src/components/dialog/transfer-group-dialog.js b/frontend/src/components/dialog/transfer-group-dialog.js index 0dc9dd9e46..18b561992f 100644 --- a/frontend/src/components/dialog/transfer-group-dialog.js +++ b/frontend/src/components/dialog/transfer-group-dialog.js @@ -4,6 +4,7 @@ import { Button, Modal, ModalHeader, ModalBody, ModalFooter } from 'reactstrap'; import { gettext } from '../../utils/constants'; import { seafileAPI } from '../../utils/seafile-api.js'; import UserSelect from '../user-select'; +import { Utils } from '../../utils/utils'; import '../../css/transfer-group-dialog.css'; @@ -38,11 +39,8 @@ class TransferGroupDialog extends React.Component { seafileAPI.transferGroup(this.props.groupID, email).then((res) => { this.props.toggleTransferGroupDialog(); }).catch((error) => { - if (error.response) { - this.setState({ - errMessage: error.response.data.error_msg - }); - } + let errMessage = Utils.getErrorMsg(error); + this.setState({errMessage: errMessage}); }); } } diff --git a/frontend/src/components/dialog/update-tag-dialog.js b/frontend/src/components/dialog/update-tag-dialog.js index 933f74da3e..b203b52b36 100644 --- a/frontend/src/components/dialog/update-tag-dialog.js +++ b/frontend/src/components/dialog/update-tag-dialog.js @@ -3,6 +3,8 @@ import PropTypes from 'prop-types'; import { Button, ModalHeader, ModalBody, ModalFooter, Input } from 'reactstrap'; import { gettext } from '../../utils/constants'; import { seafileAPI } from '../../utils/seafile-api'; +import { Utils } from '../../utils/utils'; +import toaster from '../toast'; const propTypes = { currentTag: PropTypes.object, @@ -50,6 +52,9 @@ class UpdateTagDialog extends React.Component { seafileAPI.updateRepoTag(repoID, tag_id, name, color).then(() => { this.props.toggleCancel(); this.props.updateUsedRepoTags(); + }).catch((error) => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } @@ -73,6 +78,9 @@ class UpdateTagDialog extends React.Component { if (res.data.success === 'true') { this.props.onDeleteRepoTag(tag.id); } + }).catch((error) => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } diff --git a/frontend/src/components/dialog/zip-download-dialog.js b/frontend/src/components/dialog/zip-download-dialog.js index b1613b37fd..38404f3a6b 100644 --- a/frontend/src/components/dialog/zip-download-dialog.js +++ b/frontend/src/components/dialog/zip-download-dialog.js @@ -3,6 +3,7 @@ import PropTypes from 'prop-types'; import { Modal, ModalHeader, ModalBody } from 'reactstrap'; import { gettext, fileServerRoot } from '../../utils/constants'; import { seafileAPI } from '../../utils/seafile-api'; +import { Utils } from '../../utils/utils'; import Loading from '../loading'; const propTypes = { @@ -43,12 +44,7 @@ class ZipDownloadDialog extends React.Component { this.queryZipProgress(); interval = setInterval(this.queryZipProgress, 1000); }).catch((error) => { - let errorMsg = ''; - if (error.response) { - errorMsg = error.response.data.error_msg || gettext('Error'); - } else { - errorMsg = gettext('Please check the network.'); - } + let errorMsg = Utils.getErrorMsg(error); this.setState({ isLoading: false, errorMsg: errorMsg @@ -70,12 +66,7 @@ class ZipDownloadDialog extends React.Component { } }).catch((error) => { clearInterval(interval); - let errorMsg = ''; - if (error.response) { - errorMsg = gettext('Error'); - } else { - errorMsg = gettext('Please check the network.'); - } + let errorMsg = Utils.getErrorMsg(error); this.setState({ isLoading: false, errorMsg: errorMsg diff --git a/frontend/src/components/dir-view-mode/dir-column-file.js b/frontend/src/components/dir-view-mode/dir-column-file.js index c561c52aaa..a8f2233710 100644 --- a/frontend/src/components/dir-view-mode/dir-column-file.js +++ b/frontend/src/components/dir-view-mode/dir-column-file.js @@ -3,6 +3,7 @@ import PropTypes from 'prop-types'; import { Utils } from '../../utils/utils'; import { gettext, siteRoot } from '../../utils/constants'; import { seafileAPI } from '../../utils/seafile-api'; +import toaster from '../toast'; import WikiMarkdownViewer from '../wiki-markdown-viewer'; const propTypes = { @@ -44,6 +45,9 @@ class DirColumnFile extends React.Component { let { path, repoID } = this.props; seafileAPI.createDraft(repoID, path).then(res => { window.location.href = siteRoot + 'lib/' + res.data.origin_repo_id + '/file' + res.data.draft_file_path + '?mode=edit'; + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } diff --git a/frontend/src/components/dirent-detail/detail-comments-list.js b/frontend/src/components/dirent-detail/detail-comments-list.js index d98d8ad9d1..66f91154b7 100644 --- a/frontend/src/components/dirent-detail/detail-comments-list.js +++ b/frontend/src/components/dirent-detail/detail-comments-list.js @@ -5,6 +5,8 @@ import { processor } from '@seafile/seafile-editor/dist/utils/seafile-markdown2h import { Button, Dropdown, DropdownToggle, DropdownMenu, DropdownItem } from 'reactstrap'; import { gettext } from '../../utils/constants'; import { seafileAPI } from '../../utils/seafile-api'; +import { Utils } from '../../utils/utils'; +import toaster from '../toast'; import '../../css/comments-list.css'; const { username } = window.app.pageOptions; @@ -36,6 +38,9 @@ class DetailCommentList extends React.Component { listComments = (filePath) => { seafileAPI.listComments(this.props.repoID, (filePath || this.props.filePath)).then((res) => { this.setState({ commentsList: res.data.comments }); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } @@ -49,6 +54,9 @@ class DetailCommentList extends React.Component { if (comment.trim()) { seafileAPI.postComment(repoID, filePath, comment.trim()).then(() => { this.listComments(); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } this.refs.commentTextarea.value = ''; @@ -58,6 +66,9 @@ class DetailCommentList extends React.Component { const { repoID } = this.props; seafileAPI.updateComment(repoID, event.target.id, 'true').then(() => { this.listComments(); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } @@ -65,6 +76,9 @@ class DetailCommentList extends React.Component { const { repoID } = this.props; seafileAPI.deleteComment(repoID, event.target.id).then(() => { this.listComments(); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } @@ -72,6 +86,9 @@ class DetailCommentList extends React.Component { const { repoID } = this.props; seafileAPI.updateComment(repoID, commentID, null, null, newComment).then(() => { this.listComments(); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } diff --git a/frontend/src/components/dirent-detail/dirent-details.js b/frontend/src/components/dirent-detail/dirent-details.js index 0eb8b753da..77888ef756 100644 --- a/frontend/src/components/dirent-detail/dirent-details.js +++ b/frontend/src/components/dirent-detail/dirent-details.js @@ -3,13 +3,14 @@ import PropTypes from 'prop-types'; import classnames from 'classnames'; import { Nav, NavItem, NavLink, TabContent, TabPane } from 'reactstrap'; import DetailCommentList from './detail-comments-list'; -import { Utils } from '../../utils/utils'; +import { siteRoot } from '../../utils/constants'; import { seafileAPI } from '../../utils/seafile-api'; +import { Utils } from '../../utils/utils'; +import toaster from '../toast'; import Dirent from '../../models/dirent'; import DetailListView from './detail-list-view'; import FileTag from '../../models/file-tag'; import '../../css/dirent-detail.css'; -import { siteRoot } from '../../utils/constants'; const propTypes = { repoID: PropTypes.string.isRequired, @@ -72,7 +73,10 @@ class DirentDetail extends React.Component { } this.setState({folderDirent: folderDirent}); this.updateDetailView(folderDirent, path); - }); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); + }) } } @@ -85,6 +89,9 @@ class DirentDetail extends React.Component { direntType: 'file', direntDetail: res.data, }); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); seafileAPI.listFileTags(repoID, direntPath).then(res => { let fileTagList = []; @@ -93,6 +100,9 @@ class DirentDetail extends React.Component { fileTagList.push(file_tag); }); this.setState({fileTagList: fileTagList}); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); seafileAPI.listRelatedFiles(repoID, direntPath).then(res => { let relatedFiles = []; @@ -115,7 +125,10 @@ class DirentDetail extends React.Component { direntType: 'dir', direntDetail: res.data }); - }); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); + }) } } diff --git a/frontend/src/components/dirent-detail/lib-details.js b/frontend/src/components/dirent-detail/lib-details.js index f210977a47..ee4ad19738 100644 --- a/frontend/src/components/dirent-detail/lib-details.js +++ b/frontend/src/components/dirent-detail/lib-details.js @@ -3,8 +3,9 @@ import PropTypes from 'prop-types'; import moment from 'moment'; import { Utils } from '../../utils/utils'; import { gettext } from '../../utils/constants'; -import '../../css/dirent-detail.css'; import { seafileAPI } from '../../utils/seafile-api'; +import toaster from '../toast'; +import '../../css/dirent-detail.css'; const propTypes = { currentRepo: PropTypes.object.isRequired, @@ -34,6 +35,9 @@ class LibDetail extends React.Component { getFileCounts = (repo) => { seafileAPI.getRepoInfo(repo.repo_id).then(res => { this.setState({fileCount: res.data.file_count}); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } diff --git a/frontend/src/components/dirent-grid-view/dirent-grid-view.js b/frontend/src/components/dirent-grid-view/dirent-grid-view.js index f9be35fd7c..bc19d3fc93 100644 --- a/frontend/src/components/dirent-grid-view/dirent-grid-view.js +++ b/frontend/src/components/dirent-grid-view/dirent-grid-view.js @@ -20,6 +20,7 @@ import Rename from '../../components/dialog/rename-grid-item-dialog'; import CreateFile from '../dialog/create-file-dialog'; import CreateFolder from '../dialog/create-folder-dialog'; import LibSubFolderPermissionDialog from '../dialog/lib-sub-folder-permission-dialog'; +import toaster from '../toast'; import '../../css/grid-view.css'; @@ -241,7 +242,10 @@ class DirentGridView extends React.Component{ this.props.updateDirent(currentObject, 'locked_by_me', true); let lockName = username.split('@'); this.props.updateDirent(currentObject, 'lock_owner_name', lockName[0]); - }); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); + }) } onUnlockItem = (currentObject) => { @@ -251,6 +255,9 @@ class DirentGridView extends React.Component{ this.props.updateDirent(currentObject, 'is_locked', false); this.props.updateDirent(currentObject, 'locked_by_me', false); this.props.updateDirent(currentObject, 'lock_owner_name', ''); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } diff --git a/frontend/src/components/dirent-list-view/dirent-list-item.js b/frontend/src/components/dirent-list-view/dirent-list-item.js index 82f203e7e6..6882a57744 100644 --- a/frontend/src/components/dirent-list-view/dirent-list-item.js +++ b/frontend/src/components/dirent-list-view/dirent-list-item.js @@ -17,6 +17,7 @@ import EditFileTagDialog from '../dialog/edit-filetag-dialog'; import LibSubFolderPermissionDialog from '../dialog/lib-sub-folder-permission-dialog'; import '../../css/dirent-list-item.css'; +import toaster from '../toast'; const propTypes = { path: PropTypes.string.isRequired, @@ -136,10 +137,16 @@ class DirentListItem extends React.Component { if (dirent.starred) { seafileAPI.unstarItem(repoID, filePath).then(() => { this.props.updateDirent(this.props.dirent, 'starred', false); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } else { seafileAPI.starItem(repoID, filePath).then(() => { this.props.updateDirent(this.props.dirent, 'starred', true); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } } @@ -277,6 +284,9 @@ class DirentListItem extends React.Component { this.props.updateDirent(this.props.dirent, 'locked_by_me', true); let lockName = username.split('@'); this.props.updateDirent(this.props.dirent, 'lock_owner_name', lockName[0]); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } @@ -287,6 +297,9 @@ class DirentListItem extends React.Component { this.props.updateDirent(this.props.dirent, 'is_locked', false); this.props.updateDirent(this.props.dirent, 'locked_by_me', false); this.props.updateDirent(this.props.dirent, 'lock_owner_name', ''); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } diff --git a/frontend/src/components/dirent-list-view/dirent-list-view.js b/frontend/src/components/dirent-list-view/dirent-list-view.js index 317d8f24dc..fc1cb5f2f9 100644 --- a/frontend/src/components/dirent-list-view/dirent-list-view.js +++ b/frontend/src/components/dirent-list-view/dirent-list-view.js @@ -251,6 +251,9 @@ class DirentListView extends React.Component { this.zipToken = res.data['zip_token']; this.addDownloadAnimation(); this.interval = setInterval(this.addDownloadAnimation, 1000); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } } @@ -273,13 +276,18 @@ class DirentListView extends React.Component { _this.setState({isProgressDialogShow: false}); }, 500); } - + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } onCancelDownload = () => { seafileAPI.cancelZipTask(this.zipToken).then(() => { this.setState({isProgressDialogShow: false}); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } diff --git a/frontend/src/components/file-chooser/file-chooser.js b/frontend/src/components/file-chooser/file-chooser.js index 28213524e7..0460ca0fc5 100644 --- a/frontend/src/components/file-chooser/file-chooser.js +++ b/frontend/src/components/file-chooser/file-chooser.js @@ -4,6 +4,7 @@ import { Input } from 'reactstrap'; import { seafileAPI } from '../../utils/seafile-api'; import { gettext, isPro } from '../../utils/constants'; import { Utils } from '../../utils/utils'; +import toaster from '../toast'; import RepoInfo from '../../models/repo-info'; import RepoListView from './repo-list-view'; import Loading from '../loading'; @@ -54,6 +55,9 @@ class FileChooser extends React.Component { selectedRepo: repoInfo }); this.props.onRepoItemClick(repoInfo); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } else { // only_all_repos seafileAPI.listRepos().then(res => { @@ -222,10 +226,9 @@ class FileChooser extends React.Component { isResultGot: true }); this.source = null; - }).catch(res => { - /* eslint-disable */ - console.log(res); - /* eslint-enable */ + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } @@ -321,6 +324,9 @@ class FileChooser extends React.Component { selectedPath: path, isCurrentRepoShow: true, }); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } else { if (!this.state.hasRequest) { diff --git a/frontend/src/components/file-chooser/repo-list-item.js b/frontend/src/components/file-chooser/repo-list-item.js index 8b00924cea..92e12e2b5a 100644 --- a/frontend/src/components/file-chooser/repo-list-item.js +++ b/frontend/src/components/file-chooser/repo-list-item.js @@ -7,6 +7,7 @@ import Dirent from '../../models/dirent'; import { seafileAPI } from '../../utils/seafile-api'; import treeHelper from '../../components/tree-view/tree-helper'; import { Utils } from '../../utils/utils'; +import toaster from '../toast'; const propTypes = { isShowFile: PropTypes.bool, @@ -43,6 +44,9 @@ class RepoListItem extends React.Component { this.addResponseListToNode(direntList, tree.root); this.setState({treeData: tree}); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); if (this.props.selectedItemInfo.repoID === this.props.repo.repo_id) { @@ -79,6 +83,9 @@ class RepoListItem extends React.Component { } this.addResponseListToNode(direntList, node); this.setState({treeData: tree}); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } else { tree.expandNode(node); @@ -117,6 +124,9 @@ class RepoListItem extends React.Component { this.setState({ treeData: tree }); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } diff --git a/frontend/src/components/file-uploader/file-uploader.js b/frontend/src/components/file-uploader/file-uploader.js index ab6b980e47..ff10542969 100644 --- a/frontend/src/components/file-uploader/file-uploader.js +++ b/frontend/src/components/file-uploader/file-uploader.js @@ -8,6 +8,7 @@ import { Utils } from '../../utils/utils'; import { gettext } from '../../utils/constants'; import UploadProgressDialog from './upload-progress-dialog'; import UploadRemindDialog from '../dialog/upload-remind-dialog'; +import toaster from '../toast'; import '../../css/file-uploader.css'; const propTypes = { @@ -188,6 +189,9 @@ class FileUploader extends React.Component { let offset = Math.floor(uploadedBytes / (1024 * 1024)); resumableFile.markChunksCompleted(offset); this.resumable.upload(); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } @@ -422,6 +426,9 @@ class FileUploader extends React.Component { if (Utils.isIEBrower()) { this.uploadInput.current.click(); } + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); if (!Utils.isIEBrower()) { this.uploadInput.current.click(); @@ -436,6 +443,9 @@ class FileUploader extends React.Component { if (Utils.isIEBrower()) { this.uploadInput.current.click(); } + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); if (!Utils.isIEBrower()) { this.uploadInput.current.click(); @@ -447,6 +457,9 @@ class FileUploader extends React.Component { this.uploadInput.current.setAttribute('webkitdirectory', 'webkitdirectory'); seafileAPI.getUploadLink(repoID, this.props.path).then(res => { this.resumable.opts.target = res.data + '?ret-json=1'; + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } @@ -500,6 +513,9 @@ class FileUploader extends React.Component { this.setState({isUploadRemindDialogShow: false}); this.setUploadFileList(this.resumable.files); this.resumable.upload(); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } diff --git a/frontend/src/components/file-view/comment-panel.js b/frontend/src/components/file-view/comment-panel.js index 0cabd5df64..22964fef1f 100644 --- a/frontend/src/components/file-view/comment-panel.js +++ b/frontend/src/components/file-view/comment-panel.js @@ -5,6 +5,8 @@ import { processor } from '@seafile/seafile-editor/dist/utils/seafile-markdown2h import { Button, Dropdown, DropdownToggle, DropdownMenu, DropdownItem } from 'reactstrap'; import { gettext } from '../../utils/constants'; import { seafileAPI } from '../../utils/seafile-api'; +import { Utils } from '../../utils/utils'; +import toaster from '../toast'; import '../../css/comments-list.css'; const { username, repoID, filePath } = window.app.pageOptions; @@ -35,6 +37,9 @@ class CommentPanel extends React.Component { this.setState({ commentsList: res.data.comments }); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } @@ -49,6 +54,9 @@ class CommentPanel extends React.Component { if (comment.trim()) { seafileAPI.postComment(repoID, filePath, comment).then(() => { this.listComments(); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } this.refs.commentTextarea.value = ''; @@ -57,18 +65,27 @@ class CommentPanel extends React.Component { resolveComment = (event) => { seafileAPI.updateComment(repoID, event.target.id, 'true').then(() => { this.listComments(); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } deleteComment = (event) => { seafileAPI.deleteComment(repoID, event.target.id).then(() => { this.listComments(); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } editComment = (commentID, newComment) => { seafileAPI.updateComment(repoID, commentID, null, null, newComment).then((res) => { this.listComments(); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } diff --git a/frontend/src/components/main-side-nav.js b/frontend/src/components/main-side-nav.js index d2843e2ccd..20e3c2547a 100644 --- a/frontend/src/components/main-side-nav.js +++ b/frontend/src/components/main-side-nav.js @@ -1,10 +1,12 @@ import React from 'react'; import PropTypes from 'prop-types'; import { Link } from '@reach/router'; -import Group from '../models/group'; +import { Badge } from 'reactstrap'; import { gettext, siteRoot, enableWiki, canAddRepo, canGenerateShareLink, canGenerateUploadLink, canInvitePeople } from '../utils/constants'; import { seafileAPI } from '../utils/seafile-api'; -import { Badge } from 'reactstrap'; +import { Utils } from '../utils/utils'; +import toaster from './toast'; +import Group from '../models/group'; import { canViewOrg, isDocs, isPro } from '../utils/constants'; @@ -54,6 +56,9 @@ class MainSideNav extends React.Component { _this.setState({ groupItems: groupList }); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } diff --git a/frontend/src/components/review-list-view/review-comment-dialog.js b/frontend/src/components/review-list-view/review-comment-dialog.js index d14eec3702..586fe9b107 100644 --- a/frontend/src/components/review-list-view/review-comment-dialog.js +++ b/frontend/src/components/review-list-view/review-comment-dialog.js @@ -4,6 +4,8 @@ import { Button } from 'reactstrap'; import { seafileAPI } from '../../utils/seafile-api'; import { gettext, name, draftRepoID, draftFilePath } from '../../utils/constants'; import { processor } from '../../utils/seafile-markdown2html'; +import { Utils } from '../../utils/utils'; +import toaster from '../toast'; import '../../css/review-comment-dialog.css'; @@ -42,10 +44,16 @@ class ReviewCommentDialog extends React.Component { }; seafileAPI.postComment(draftRepoID, draftFilePath, comment, JSON.stringify(detail)).then(() => { this.props.onCommentAdded(); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } else { seafileAPI.postComment(draftRepoID, draftFilePath, comment).then(() => { this.props.onCommentAdded(); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } this.setState({ comment: '' }); diff --git a/frontend/src/components/review-list-view/review-comments.js b/frontend/src/components/review-list-view/review-comments.js index 7a2f92a316..bffced6536 100644 --- a/frontend/src/components/review-list-view/review-comments.js +++ b/frontend/src/components/review-list-view/review-comments.js @@ -5,6 +5,8 @@ import { Button, Dropdown, DropdownToggle, DropdownMenu, DropdownItem } from 're import { seafileAPI } from '../../utils/seafile-api'; import { gettext, draftFilePath, draftRepoID } from '../../utils/constants'; import { username } from '../../utils/constants.js'; +import { Utils } from '../../utils/utils'; +import toaster from '../toast'; import '../../css/review-comments.css'; @@ -36,6 +38,9 @@ class ReviewComments extends React.Component { if (comment.length > 0) { seafileAPI.postComment(draftRepoID, draftFilePath, comment).then(() => { this.props.listComments(); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); this.setState({ comment: '' }); } @@ -44,12 +49,18 @@ class ReviewComments extends React.Component { resolveComment = (event) => { seafileAPI.updateComment(draftRepoID, event.target.id, 'true').then((res) => { this.props.listComments(); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } editComment = (commentID, newComment) => { seafileAPI.updateComment(draftRepoID, commentID, null, null, newComment).then((res) => { this.props.listComments(); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } @@ -60,6 +71,9 @@ class ReviewComments extends React.Component { deleteComment = (event) => { seafileAPI.deleteComment(draftRepoID, event.target.id).then((res) => { this.props.listComments(); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } diff --git a/frontend/src/components/search/search.js b/frontend/src/components/search/search.js index a614242ba3..fdaa420c59 100644 --- a/frontend/src/components/search/search.js +++ b/frontend/src/components/search/search.js @@ -6,6 +6,8 @@ import { gettext, siteRoot, username } from '../../utils/constants'; import SearchResultItem from './search-result-item'; import editorUtilities from '../../utils/editor-utilties'; import More from '../more'; +import { Utils } from '../../utils/utils'; +import toaster from '../toast'; const propTypes = { isPublic: PropTypes.bool, @@ -114,10 +116,9 @@ class Search extends Component { isResultGetted: true }); _this.source = null; - }).catch(res => { - /* eslint-disable */ - console.log(res); - /* eslint-enable */ + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } else { editorUtilities.searchFiles(queryData,cancelToken).then(res => { diff --git a/frontend/src/components/send-link.js b/frontend/src/components/send-link.js index 679928222d..4ae938dd90 100644 --- a/frontend/src/components/send-link.js +++ b/frontend/src/components/send-link.js @@ -3,6 +3,7 @@ import PropTypes from 'prop-types'; import { Button, Form, FormGroup, Label } from 'reactstrap'; import { seafileAPI } from '../utils/seafile-api'; import { gettext } from '../utils/constants'; +import { Utils } from '../utils/utils'; import toaster from './toast'; const propTypes = { @@ -72,16 +73,7 @@ class SendLink extends React.Component { }); } }).catch((error) => { - let errorMsg = ''; - if (error.response) { - if (error.response.data && error.response.data['error_msg']) { - errorMsg = error.response.data['error_msg']; - } else { - errorMsg = gettext('Error'); - } - } else { - errorMsg = gettext('Please check the network.'); - } + let errorMsg = Utils.getErrorMsg(error); this.setState({ btnDisabled: false, sending: false, diff --git a/frontend/src/components/shared-repo-list-view/shared-repo-list-item.js b/frontend/src/components/shared-repo-list-view/shared-repo-list-item.js index 17fe62d7ad..ed09527fc2 100644 --- a/frontend/src/components/shared-repo-list-view/shared-repo-list-item.js +++ b/frontend/src/components/shared-repo-list-view/shared-repo-list-item.js @@ -12,6 +12,7 @@ import DeleteRepoDialog from '../../components/dialog/delete-repo-dialog'; import Rename from '../rename'; import { seafileAPI } from '../../utils/seafile-api'; import LibHistorySettingDialog from '../dialog/lib-history-setting-dialog'; +import toaster from '../toast'; const propTypes = { currentGroup: PropTypes.object, @@ -354,10 +355,16 @@ class SharedRepoListItem extends React.Component { if (this.state.isStarred) { seafileAPI.unstarItem(this.props.repo.repo_id, '/').then(() => { this.setState({isStarred: !this.state.isStarred}); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } else { seafileAPI.starItem(this.props.repo.repo_id, '/').then(() => { this.setState({isStarred: !this.state.isStarred}); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } } diff --git a/frontend/src/components/toolbar/mutilple-dir-operation-toolbar.js b/frontend/src/components/toolbar/mutilple-dir-operation-toolbar.js index 7a2f93b442..aef8a6204a 100644 --- a/frontend/src/components/toolbar/mutilple-dir-operation-toolbar.js +++ b/frontend/src/components/toolbar/mutilple-dir-operation-toolbar.js @@ -14,6 +14,7 @@ import EditFileTagDialog from '../dialog/edit-filetag-dialog'; import ZipDownloadDialog from '../dialog/zip-download-dialog'; import ModalPortal from '../modal-portal'; import ItemDropdownMenu from '../dropdown-menu/item-dropdown-menu'; +import toaster from '../toast'; import '../../css/dirents-menu.css'; @@ -171,6 +172,9 @@ class MutipleDirOperationToolbar extends React.Component { this.props.updateDirent(dirent, 'locked_by_me', true); this.props.unSelectDirent(); } + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } @@ -182,6 +186,9 @@ class MutipleDirOperationToolbar extends React.Component { this.props.updateDirent(dirent, 'locked_by_me', false); this.props.unSelectDirent(); } + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } @@ -231,6 +238,9 @@ class MutipleDirOperationToolbar extends React.Component { viewMode: 'add_related_file', }); } + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } @@ -255,6 +265,9 @@ class MutipleDirOperationToolbar extends React.Component { showLibContentViewDialogs: true, showEditFileTagDialog: true, }); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } @@ -274,6 +287,9 @@ class MutipleDirOperationToolbar extends React.Component { this.setState({ relatedFiles: res.data.related_files }); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } diff --git a/frontend/src/components/toolbar/view-file-toolbar.js b/frontend/src/components/toolbar/view-file-toolbar.js index 9c397bfe5e..96cb5bad51 100644 --- a/frontend/src/components/toolbar/view-file-toolbar.js +++ b/frontend/src/components/toolbar/view-file-toolbar.js @@ -1,9 +1,10 @@ import React, { Fragment } from 'react'; import PropTypes from 'prop-types'; import { DropdownToggle, Dropdown, DropdownMenu, DropdownItem, Tooltip} from 'reactstrap'; -import { Utils } from '../../utils/utils'; import { gettext, siteRoot, canGenerateShareLink, isDocs } from '../../utils/constants'; import { seafileAPI } from '../../utils/seafile-api'; +import { Utils } from '../../utils/utils'; +import toaster from '../toast'; import ModalPotal from '../modal-portal'; import ShareDialog from '../dialog/share-dialog'; import EditFileTagDialog from '../dialog/edit-filetag-dialog'; @@ -52,6 +53,9 @@ class ViewFileToolbar extends React.Component { let { path, repoID } = this.props; seafileAPI.createDraft(repoID, path).then(res => { window.location.href = siteRoot + 'lib/' + res.data.origin_repo_id + '/file' + res.data.draft_file_path + '?mode=edit'; + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } diff --git a/frontend/src/components/user-select.js b/frontend/src/components/user-select.js index 9a90628459..f15cd63a43 100644 --- a/frontend/src/components/user-select.js +++ b/frontend/src/components/user-select.js @@ -3,6 +3,8 @@ import PropTypes from 'prop-types'; import AsyncSelect from 'react-select/lib/Async'; import { seafileAPI } from '../utils/seafile-api.js'; import { gettext } from '../utils/constants'; +import { Utils } from '../utils/utils.js'; +import toaster from './toast'; const propTypes = { placeholder: PropTypes.string.isRequired, @@ -47,6 +49,9 @@ class UserSelect extends React.Component { this.options.push(obj); } callback(this.options); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } } diff --git a/frontend/src/components/user-settings/email-notice.js b/frontend/src/components/user-settings/email-notice.js index eb8a55970d..eb5883dac4 100644 --- a/frontend/src/components/user-settings/email-notice.js +++ b/frontend/src/components/user-settings/email-notice.js @@ -1,6 +1,7 @@ import React from 'react'; import { gettext } from '../../utils/constants'; import { seafileAPI } from '../../utils/seafile-api'; +import { Utils } from '../../utils/utils'; import toaster from '../toast'; const { @@ -39,12 +40,7 @@ class EmailNotice extends React.Component { seafileAPI.updateEmailNotificationInterval(this.state.currentInterval).then((res) => { toaster.success(gettext('Success')); }).catch((error) => { - let errorMsg = ''; - if (error.response) { - errorMsg = error.response.data.error_msg || gettext('Error'); - } else { - errorMsg = gettext('Please check the network.'); - } + let errorMsg = Utils.getErrorMsg(error); toaster.danger(errorMsg); }); } diff --git a/frontend/src/components/user-settings/user-avatar-form.js b/frontend/src/components/user-settings/user-avatar-form.js index b3212e1695..5395a4bf18 100644 --- a/frontend/src/components/user-settings/user-avatar-form.js +++ b/frontend/src/components/user-settings/user-avatar-form.js @@ -2,6 +2,7 @@ import React from 'react'; import { gettext, siteRoot } from '../../utils/constants'; import { seafileAPI } from '../../utils/seafile-api'; import toaster from '../toast'; +import { Utils } from '../../utils/utils'; const { avatarURL, csrfToken } = window.app.pageOptions; @@ -58,16 +59,7 @@ class UserAvatarForm extends React.Component { }); toaster.success(gettext('Success')); }).catch((error) => { - let errorMsg = ''; - if (error.response) { - if (error.response.data && error.response.data['error_msg']) { - errorMsg = error.response.data['error_msg']; - } else { - errorMsg = gettext('Error'); - } - } else { - errorMsg = gettext('Please check the network.'); - } + let errorMsg = Utils.getErrorMsg(error); toaster.danger(errorMsg); }); } diff --git a/frontend/src/components/user-settings/webdav-password.js b/frontend/src/components/user-settings/webdav-password.js index 84da84f6f5..ab58856ba7 100644 --- a/frontend/src/components/user-settings/webdav-password.js +++ b/frontend/src/components/user-settings/webdav-password.js @@ -2,6 +2,7 @@ import React from 'react'; import ModalPortal from '../modal-portal'; import { gettext } from '../../utils/constants'; import { seafileAPI } from '../../utils/seafile-api'; +import { Utils } from '../../utils/utils'; import toaster from '../toast'; import UpdateWebdavPassword from '../dialog/update-webdav-password'; @@ -32,16 +33,7 @@ class WebdavPassword extends React.Component { }); toaster.success(gettext('Success')); }).catch((error) => { - let errorMsg = ''; - if (error.response) { - if (error.response.data && error.response.data['error_msg']) { - errorMsg = error.response.data['error_msg']; - } else { - errorMsg = gettext('Error'); - } - } else { - errorMsg = gettext('Please check the network.'); - } + let errorMsg = Utils.getErrorMsg(error); this.toggleDialog(); toaster.danger(errorMsg); }); diff --git a/frontend/src/components/wiki-markdown-viewer.js b/frontend/src/components/wiki-markdown-viewer.js index a6bf1b8948..d854f50d05 100644 --- a/frontend/src/components/wiki-markdown-viewer.js +++ b/frontend/src/components/wiki-markdown-viewer.js @@ -4,8 +4,9 @@ import MarkdownViewer from '@seafile/seafile-editor/dist/viewer/markdown-viewer' import { gettext, repoID, slug, serviceURL, isPublicWiki, siteRoot } from '../utils/constants'; import { Card, CardTitle, CardText } from 'reactstrap'; import Loading from './loading'; -import { Utils } from '../utils/utils'; import { seafileAPI } from '../utils/seafile-api'; +import { Utils } from '../utils/utils'; +import toaster from './toast'; import '../css/related-files-list.css'; const propTypes = { @@ -80,7 +81,10 @@ class WikiMarkdownViewer extends React.Component { this.setState({ relatedFiles: res.data.related_files }); - }); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); + }) } } diff --git a/frontend/src/draw/draw-viewer.js b/frontend/src/draw/draw-viewer.js index d9e8f15acd..6893b03efd 100644 --- a/frontend/src/draw/draw-viewer.js +++ b/frontend/src/draw/draw-viewer.js @@ -1,4 +1,6 @@ import { seafileAPI } from '../utils/seafile-api'; +import { Utils } from '../utils/utils'; +import toaster from '../components/toast'; var mxRectangle = window.mxRectangle; var mxGraph = window.mxGraph; @@ -19,6 +21,9 @@ class DrawViewer { console.log(doc.documentElement); /* eslint-enable */ this.setGraphXml(doc.documentElement); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } diff --git a/frontend/src/draw/draw.js b/frontend/src/draw/draw.js index f5695b6324..454fa2214c 100644 --- a/frontend/src/draw/draw.js +++ b/frontend/src/draw/draw.js @@ -1,6 +1,7 @@ import { seafileAPI } from '../utils/seafile-api'; import DrawViewer from './draw-viewer'; - +import { Utils } from '../utils/utils'; +import toaster from '../components/toast'; function loadFile(editorUi) { return seafileAPI.getFileContent(window.app.config.rawPath).then((res) => { @@ -9,6 +10,9 @@ function loadFile(editorUi) { editorUi.editor.setGraphXml(doc.documentElement); editorUi.editor.setModified(false); editorUi.editor.undoManager.clear(); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } diff --git a/frontend/src/pages/groups/group-view.js b/frontend/src/pages/groups/group-view.js index a72869ab34..25487d2223 100644 --- a/frontend/src/pages/groups/group-view.js +++ b/frontend/src/pages/groups/group-view.js @@ -200,8 +200,9 @@ class GroupView extends React.Component { let repo = new Repo(object); let repoList = this.addRepoItem(repo); this.setState({repoList: repoList}); - }).then(() => { - //todo + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } else { @@ -209,8 +210,9 @@ class GroupView extends React.Component { let repo = new Repo(res.data); let repoList = this.addRepoItem(repo); this.setState({repoList: repoList}); - }).catch(() => { - //todo + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } this.onCreateRepoToggle(); @@ -227,10 +229,13 @@ class GroupView extends React.Component { let name = repo.repo_name; var msg = gettext('Successfully deleted {name}.').replace('{name}', name); toaster.success(msg); - }).catch(() => { - let name = repo.repo_name; - var msg = gettext('Failed to delete {name}.').replace('{name}', name); - toaster.danger(msg); + }).catch((error) => { + let errMessage = Utils.getErrorMsg(error); + if (errMessage === gettext('Error')) { + let name = repo.repo_name; + errMessage = gettext('Failed to delete {name}.').replace('{name}', name); + } + toaster.danger(errMessage); }); } @@ -248,6 +253,9 @@ class GroupView extends React.Component { }); this.setState({repoList: repoList}); this.loadGroup(group.id); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } @@ -260,8 +268,9 @@ class GroupView extends React.Component { return item; }); this.setState({repoList: repoList}); - }).catch(() => { - // todo + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } @@ -321,6 +330,9 @@ class GroupView extends React.Component { this.setState({ groupMembers: res.data }); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } diff --git a/frontend/src/pages/groups/groups-view.js b/frontend/src/pages/groups/groups-view.js index d5204e19f5..c42e369c96 100644 --- a/frontend/src/pages/groups/groups-view.js +++ b/frontend/src/pages/groups/groups-view.js @@ -2,6 +2,7 @@ import React, { Fragment } from 'react'; import PropTypes from 'prop-types'; import { gettext, siteRoot, loginUrl, canAddGroup } from '../../utils/constants'; import { seafileAPI } from '../../utils/seafile-api'; +import { Utils } from '../../utils/utils'; import Loading from '../../components/loading'; import Group from '../../models/group'; import Repo from '../../models/repo'; @@ -45,6 +46,9 @@ class RepoListViewPanel extends React.Component { return item.repo_id !== repo.repo_id; }); this.setState({repoList: repoList}); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } @@ -58,10 +62,13 @@ class RepoListViewPanel extends React.Component { let name = repo.repo_name; var msg = gettext('Successfully deleted {name}.').replace('{name}', name); toaster.success(msg); - }).catch(() => { - let name = repo.repo_name; - var msg = gettext('Failed to delete {name}.').replace('{name}', name); - toaster.danger(msg); + }).catch((error) => { + let errMessage = Utils.getErrorMsg(error); + if (errMessage === gettext('Error')) { + let name = repo.repo_name; + errMessage = gettext('Failed to delete {name}.').replace('{name}', name); + } + toaster.danger(errMessage); }); } @@ -75,8 +82,9 @@ class RepoListViewPanel extends React.Component { return item; }); this.setState({repoList: repoList}); - }).catch(() => { - // todo + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } diff --git a/frontend/src/pages/lib-content-view/lib-content-view.js b/frontend/src/pages/lib-content-view/lib-content-view.js index 14d2cd339e..ee01675b9e 100644 --- a/frontend/src/pages/lib-content-view/lib-content-view.js +++ b/frontend/src/pages/lib-content-view/lib-content-view.js @@ -223,6 +223,9 @@ class LibContentView extends React.Component { if (res.data.id !== dirID) { this.loadDirentList(path); } + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } } else { @@ -230,6 +233,9 @@ class LibContentView extends React.Component { if (res.data.id !== dirID) { this.loadDirentList(path); } + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } } @@ -245,6 +251,9 @@ class LibContentView extends React.Component { } }); this.setState({usedRepoTags: usedRepoTags}); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } @@ -312,6 +321,9 @@ class LibContentView extends React.Component { this.setState({ draftCounts: res.data.draft_counts, }); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } @@ -353,7 +365,6 @@ class LibContentView extends React.Component { }); }).catch(() => { this.setState({isTreeDataLoading: false}); - // todo show error message }); } else { this.loadNodeAndParentsByPath(path); @@ -394,8 +405,10 @@ class LibContentView extends React.Component { let fileTags = res.data.file_tags.map(item => { return new FileTag(item); }); - this.setState({fileTags: fileTags}); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); seafileAPI.listRelatedFiles(repoID, filePath).then(res => { @@ -555,6 +568,9 @@ class LibContentView extends React.Component { newAddedDirents.map(item => { this.addNodeToTree(item.name, path, item.type); }); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } @@ -579,9 +595,12 @@ class LibContentView extends React.Component { } let message = Utils.getMoveSuccessMessage(dirNames); toaster.success(message); - }).catch(() => { - let message = Utils.getMoveFailedMessage(dirNames); - toaster.danger(message); + }).catch((error) => { + let errMessage = Utils.getErrorMsg(error); + if (errMessage === gettext('Error')) { + errMessage = Utils.getMoveFailedMessage(dirNames); + } + toaster.danger(errMessage); }); } @@ -601,9 +620,12 @@ class LibContentView extends React.Component { } let message = Utils.getCopySuccessfulMessage(dirNames); toaster.success(message); - }).catch(() => { - let message = Utils.getCopyFailedMessage(dirNames); - toaster.danger(message); + }).catch((error) => { + let errMessage = Utils.getErrorMsg(error); + if (errMessage === gettext('Error')) { + errMessage = Utils.getCopyFailedMessage(dirNames); + } + toaster.danger(errMessage); }); } @@ -630,11 +652,14 @@ class LibContentView extends React.Component { msg = msg.replace('{name}', dirNames[0]); } toaster.success(msg); - }).catch(() => { - var msg = gettext('Failed to delete {name} and other {n} items.'); - msg = msg.replace('{name}', dirNames[0]); - msg = msg.replace('{n}', dirNames.length - 1); - toaster.danger(msg); + }).catch((error) => { + let errMessage = Utils.getErrorMsg(error); + if (errMessage === gettext('Error')) { + errMessage = gettext('Failed to delete {name} and other {n} items.'); + errMessage = errMessage.replace('{name}', dirNames[0]); + errMessage = errMessage.replace('{n}', dirNames.length - 1); + } + toaster.danger(errMessage); }); } @@ -651,8 +676,9 @@ class LibContentView extends React.Component { if (parentPath === this.state.path && !this.state.isViewFile) { this.addDirent(name, 'dir'); } - }).catch(() => { - // return error message + }).catch((error) => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } @@ -667,8 +693,9 @@ class LibContentView extends React.Component { if (parentPath === this.state.path && !this.state.isViewFile) { this.addDirent(name, 'file', res.data.size); } - }).catch(() => { - // todo + }).catch((error) => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } @@ -799,18 +826,24 @@ class LibContentView extends React.Component { if (isDir) { seafileAPI.renameDir(repoID, path, newName).then(() => { this.renameItemAjaxCallback(path, newName); - }).catch(() => { - let name = Utils.getFileName(path); - var msg = gettext('Renaming {name} failed').replace('{name}', name); - toaster.danger(msg); + }).catch((error) => { + let errMessage = Utils.getErrorMsg(error); + if (errMessage === gettext('Error')) { + let name = Utils.getFileName(path); + errMessage = gettext('Renaming {name} failed').replace('{name}', name); + } + toaster.danger(errMessage); }); } else { seafileAPI.renameFile(repoID, path, newName).then(() => { this.renameItemAjaxCallback(path, newName); - }).catch(() => { - let name = Utils.getFileName(path); - var msg = gettext('Renaming {name} failed').replace('{name}', name); - toaster.danger(msg); + }).catch((error) => { + let errMessage = Utils.getErrorMsg(error); + if (errMessage === gettext('Error')) { + let name = Utils.getFileName(path); + errMessage = gettext('Renaming {name} failed').replace('{name}', name); + } + toaster.danger(errMessage); }); } } @@ -830,10 +863,13 @@ class LibContentView extends React.Component { let name = Utils.getFileName(path); var msg = gettext('Successfully deleted {name}').replace('{name}', name); toaster.success(msg); - }).catch(() => { - let name = Utils.getFileName(path); - var msg = gettext('Failed to delete {name}').replace('{name}', name); - toaster.danger(msg); + }).catch((error) => { + let errMessage = Utils.getErrorMsg(error); + if (errMessage === gettext('Error')) { + let name = Utils.getFileName(path); + errMessage = gettext('Failed to delete {name}').replace('{name}', name); + } + toaster.danger(errMessage); }); } else { seafileAPI.deleteFile(repoID, path).then(() => { @@ -841,10 +877,13 @@ class LibContentView extends React.Component { let name = Utils.getFileName(path); var msg = gettext('Successfully deleted {name}').replace('{name}', name); toaster.success(msg); - }).catch(() => { - let name = Utils.getFileName(path); - var msg = gettext('Failed to delete {name}').replace('{name}', name); - toaster.danger(msg); + }).catch((error) => { + let errMessage = Utils.getErrorMsg(error); + if (errMessage === gettext('Error')) { + let name = Utils.getFileName(path); + errMessage = gettext('Failed to delete {name}').replace('{name}', name); + } + toaster.danger(errMessage); }); } } @@ -877,10 +916,13 @@ class LibContentView extends React.Component { let message = gettext('Successfully moved %(name)s.'); message = message.replace('%(name)s', dirName); toaster.success(message); - }).catch(() => { - let message = gettext('Failed to move %(name)s'); - message = message.replace('%(name)s', dirName); - toaster.danger(message); + }).catch((error) => { + let errMessage = Utils.getErrorMsg(error); + if (errMessage === gettext('Error')) { + errMessage = gettext('Failed to move %(name)s'); + errMessage = errMessage.replace('%(name)s', dirName); + } + toaster.danger(errMessage); }); } @@ -905,10 +947,13 @@ class LibContentView extends React.Component { let message = gettext('Successfully copied %(name)s.'); message = message.replace('%(name)s', dirName); toaster.success(message); - }).catch(() => { - let message = gettext('Failed to copy %(name)s'); - message = message.replace('%(name)s', dirName); - toaster.danger(message); + }).catch((error) => { + let errMessage = Utils.getErrorMsg(error); + if (errMessage === gettext('Error')) { + errMessage = gettext('Failed to copy %(name)s'); + errMessage = errMessage.replace('%(name)s', dirName); + } + toaster.danger(errMessage); }); } @@ -1022,6 +1067,9 @@ class LibContentView extends React.Component { return new FileTag(item); }); this.updateDirent(dirent, 'file_tags', fileTags); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); this.updateUsedRepoTags(); @@ -1176,6 +1224,9 @@ class LibContentView extends React.Component { treeData: tree, currentNode: node }); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } else { let parentNode = tree.getNodeByPath(node.parentNode.path); @@ -1233,6 +1284,9 @@ class LibContentView extends React.Component { this.addResponseListToNode(res.data.dirent_list, node); tree.collapseNode(node); this.setState({treeData: tree}); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } if (isLoaded && node.path === this.state.path) { @@ -1277,6 +1331,9 @@ class LibContentView extends React.Component { } else { this.showFile(filePath); } + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } @@ -1293,6 +1350,9 @@ class LibContentView extends React.Component { seafileAPI.listDir(repoID, node.path).then(res => { this.addResponseListToNode(res.data.dirent_list, node); this.setState({treeData: tree}); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } else { tree.expandNode(node); @@ -1422,6 +1482,9 @@ class LibContentView extends React.Component { }); this.setState({fileTags: fileTags}); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } diff --git a/frontend/src/pages/linked-devices/linked-devices.js b/frontend/src/pages/linked-devices/linked-devices.js index 6e71053ef0..f610ec528d 100644 --- a/frontend/src/pages/linked-devices/linked-devices.js +++ b/frontend/src/pages/linked-devices/linked-devices.js @@ -4,6 +4,7 @@ import { seafileAPI } from '../../utils/seafile-api'; import { gettext, loginUrl } from '../../utils/constants'; import toaster from '../../components/toast'; import EmptyTip from '../../components/empty-tip'; +import { Utils } from '../../utils/utils'; class Content extends Component { @@ -113,9 +114,12 @@ class Item extends Component { msg_s = msg_s.replace('%(name)s', data.device_name); toaster.success(msg_s); }).catch((error) => { - let message = gettext('Failed to unlink %(name)s'); - message = message.replace('%(name)s', data.device_name); - toaster.danger(message); + let errMessage = Utils.getErrorMsg(error); + if (errMessage === gettext('Error')) { + errMessage = gettext('Failed to unlink %(name)s'); + errMessage = errMessage.replace('%(name)s', data.device_name); + } + toaster.danger(errMessage); }); } diff --git a/frontend/src/pages/my-libs/my-libs-deleted.js b/frontend/src/pages/my-libs/my-libs-deleted.js index 9baa5f8a7e..34322d9c0a 100644 --- a/frontend/src/pages/my-libs/my-libs-deleted.js +++ b/frontend/src/pages/my-libs/my-libs-deleted.js @@ -27,7 +27,10 @@ class MyLibsDeleted extends Component { deletedRepoList: res.data, isLoading: false, }); - }); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); + }); } refreshDeletedRepoList = (repoID) => { @@ -140,9 +143,12 @@ class DeletedRepoItem extends Component { let message = gettext('Successfully restored the library.') + ' ' + repoName; toaster.success(message); this.props.refreshDeletedRepoList(repoID); - }).catch(res => { - let message = gettext('Failed. Please check the network.'); - toaster.danger(message); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + if (errMessage === gettext('Error')) { + errMessage = gettext('Failed. Please check the network.'); + } + toaster.danger(errMessage); }); } diff --git a/frontend/src/pages/my-libs/my-libs.js b/frontend/src/pages/my-libs/my-libs.js index 10ee963e5d..d503ebd1f7 100644 --- a/frontend/src/pages/my-libs/my-libs.js +++ b/frontend/src/pages/my-libs/my-libs.js @@ -4,6 +4,7 @@ import cookie from 'react-cookies'; import { seafileAPI } from '../../utils/seafile-api'; import { gettext, loginUrl} from '../../utils/constants'; import { Utils } from '../../utils/utils'; +import toaster from '../../components/toast'; import Repo from '../../models/repo'; import Loading from '../../components/loading'; import EmptyTip from '../../components/empty-tip'; @@ -92,6 +93,9 @@ class MyLibraries extends Component { }; this.state.repoList.unshift(repo); this.setState({repoList: this.state.repoList}); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } diff --git a/frontend/src/pages/my-libs/mylib-repo-list-item.js b/frontend/src/pages/my-libs/mylib-repo-list-item.js index 233e6d4400..b10a005ca9 100644 --- a/frontend/src/pages/my-libs/mylib-repo-list-item.js +++ b/frontend/src/pages/my-libs/mylib-repo-list-item.js @@ -116,6 +116,9 @@ class MylibRepoListItem extends React.Component { if (window.innerWidth < 728) { toaster.success(gettext('Successfully unstarred the library.')); } + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } else { seafileAPI.starItem(this.props.repo.repo_id, '/').then(() => { @@ -123,6 +126,9 @@ class MylibRepoListItem extends React.Component { if (window.innerWidth < 728) { toaster.success(gettext('Successfully starred the library.')); } + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } } @@ -178,6 +184,9 @@ class MylibRepoListItem extends React.Component { seafileAPI.renameRepo(repoID, newName).then(() => { this.props.onRenameRepo(repo, newName); this.onRenameCancel(); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } @@ -208,10 +217,13 @@ class MylibRepoListItem extends React.Component { let name = repo.repo_name; var msg = gettext('Successfully deleted {name}.').replace('{name}', name); toaster.success(msg); - }).catch(() => { - let name = repo.repo_name; - var msg = gettext('Failed to delete {name}.').replace('{name}', name); - toaster.danger(msg); + }).catch((error) => { + let errMessage = Utils.getErrorMsg(error); + if (errMessage === gettext('Error')) { + let name = repo.repo_name; + errMessage = gettext('Failed to delete {name}.').replace('{name}', name); + } + toaster.danger(errMessage); }); } diff --git a/frontend/src/pages/org-admin/org-department-item.js b/frontend/src/pages/org-admin/org-department-item.js index 22d1b20ac4..09766b82b8 100644 --- a/frontend/src/pages/org-admin/org-department-item.js +++ b/frontend/src/pages/org-admin/org-department-item.js @@ -4,6 +4,7 @@ import moment from 'moment'; import { Link } from '@reach/router'; import { seafileAPI } from '../../utils/seafile-api'; import { Utils } from '../../utils/utils.js'; +import toaster from '../../components/toast'; import MainPanelTopbar from './main-panel-topbar'; import ModalPortal from '../../components/modal-portal'; import RoleEditor from '../../components/select-editor/role-editor'; @@ -60,6 +61,9 @@ class OrgDepartmentItem extends React.Component { listOrgGroupRepo = (groupID) => { seafileAPI.orgAdminListDepartGroupRepos(orgID, groupID).then(res => { this.setState({ repos: res.data.libraries }); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } @@ -71,12 +75,18 @@ class OrgDepartmentItem extends React.Component { ancestorGroups: res.data.ancestor_groups, groupName: res.data.name, }); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } listSubDepartGroups = (groupID) => { seafileAPI.orgAdminListGroupInfo(orgID, groupID, true).then(res => { this.setState({ groups: res.data.groups }); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } @@ -384,6 +394,9 @@ class MemberItem extends React.Component { let isAdmin = role === 'Admin' ? true : false; seafileAPI.orgAdminSetDepartGroupUserRole(orgID, this.props.groupID, this.props.member.email, isAdmin).then((res) => { this.props.onMemberChanged(); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); this.setState({ highlight: false, diff --git a/frontend/src/pages/org-admin/org-groups.js b/frontend/src/pages/org-admin/org-groups.js index 6fa15a2499..84c7b4b686 100644 --- a/frontend/src/pages/org-admin/org-groups.js +++ b/frontend/src/pages/org-admin/org-groups.js @@ -1,11 +1,12 @@ import React, { Component, Fragment } from 'react'; import PropTypes from 'prop-types'; import { Dropdown, DropdownToggle, DropdownMenu, DropdownItem } from 'reactstrap'; -import OrgGroupInfo from '../../models/org-group'; -import Toast from '../../components/toast'; -import MainPanelTopbar from './main-panel-topbar'; -import { seafileAPI } from '../../utils/seafile-api'; import { siteRoot, gettext, orgID } from '../../utils/constants'; +import { seafileAPI } from '../../utils/seafile-api'; +import { Utils } from '../../utils/seafile-api'; +import toaster from '../../components/toast'; +import OrgGroupInfo from '../../models/org-group'; +import MainPanelTopbar from './main-panel-topbar'; class OrgGroups extends Component { @@ -35,6 +36,9 @@ class OrgGroups extends Component { pageNext: res.data.page_next, page: res.data.page, }); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } @@ -66,7 +70,10 @@ class OrgGroups extends Component { }); let msg = gettext('Successfully deleted {name}'); msg = msg.replace('{name}', group.groupName); - Toast.success(msg); + toaster.success(msg); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } diff --git a/frontend/src/pages/org-admin/org-libraries.js b/frontend/src/pages/org-admin/org-libraries.js index 4ae18f94eb..08442a552c 100644 --- a/frontend/src/pages/org-admin/org-libraries.js +++ b/frontend/src/pages/org-admin/org-libraries.js @@ -7,6 +7,7 @@ import toaster from '../../components/toast'; import TransferDialog from '../../components/dialog/transfer-dialog'; import ModalPortal from '../../components/modal-portal'; import { seafileAPI } from '../../utils/seafile-api'; +import { Utils } from '../../utils/utils'; import { mediaUrl, siteRoot, gettext, orgID } from '../../utils/constants'; class OrgLibraries extends Component { @@ -37,6 +38,9 @@ class OrgLibraries extends Component { pageNext: res.data.page_next, page: res.data.page, }); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } @@ -69,6 +73,9 @@ class OrgLibraries extends Component { let msg = gettext('Successfully deleted {name}'); msg = msg.replace('{name}', repo.repoName); toaster.success(msg); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } @@ -236,9 +243,9 @@ class RepoItem extends React.Component { this.props.transferRepoItem(repo.repoID, user); let msg = gettext('Successfully transferred the library.'); toaster.success(msg); - }).catch(res => { - let msg = gettext('Failed. Please check the network.'); - toaster.danger(msg); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); this.toggleTransfer(); } diff --git a/frontend/src/pages/org-admin/org-links.js b/frontend/src/pages/org-admin/org-links.js index 9ecd78775b..db11e6aa5b 100644 --- a/frontend/src/pages/org-admin/org-links.js +++ b/frontend/src/pages/org-admin/org-links.js @@ -1,9 +1,11 @@ import React, { Fragment } from 'react'; import PropTypes from 'prop-types'; import moment from 'moment'; +import { Dropdown, DropdownToggle, DropdownMenu, DropdownItem } from 'reactstrap'; import { seafileAPI } from '../../utils/seafile-api'; import { siteRoot, gettext, serviceURL } from '../../utils/constants'; -import { Dropdown, DropdownToggle, DropdownMenu, DropdownItem } from 'reactstrap'; +import { Utils } from '../../utils/utils'; +import toaster from '../../components/toast'; import MainPanelTopbar from './main-panel-topbar'; import ViewLinkDialog from '../../components/dialog/view-link-dialog'; @@ -56,6 +58,9 @@ class OrgLinks extends React.Component { if (res.data.success === true) { this.listOrgLinks(this.state.page); } + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } diff --git a/frontend/src/pages/org-admin/org-logs-file-audit.js b/frontend/src/pages/org-admin/org-logs-file-audit.js index 778697ae91..8103fef214 100644 --- a/frontend/src/pages/org-admin/org-logs-file-audit.js +++ b/frontend/src/pages/org-admin/org-logs-file-audit.js @@ -4,6 +4,8 @@ import moment from 'moment'; import { Dropdown, DropdownToggle, DropdownMenu, DropdownItem } from 'reactstrap'; import { seafileAPI } from '../../utils/seafile-api'; import { siteRoot, gettext, lang } from '../../utils/constants'; +import { Utils } from '../../utils/utils'; +import toaster from '../../components/toast'; import OrgLogsFileAuditEvent from '../../models/org-logs-file-audit'; import '../../css/org-logs.css'; @@ -43,6 +45,9 @@ class OrgLogsFileAudit extends React.Component { userSelected: res.data.user_selected, repoSelected: res.data.repo_selected }); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } diff --git a/frontend/src/pages/org-admin/org-logs-file-update.js b/frontend/src/pages/org-admin/org-logs-file-update.js index 7917daf2f6..7f0a634432 100644 --- a/frontend/src/pages/org-admin/org-logs-file-update.js +++ b/frontend/src/pages/org-admin/org-logs-file-update.js @@ -4,6 +4,8 @@ import moment from 'moment'; import { Dropdown, DropdownToggle, DropdownMenu, DropdownItem } from 'reactstrap'; import { seafileAPI } from '../../utils/seafile-api'; import { siteRoot, gettext, lang } from '../../utils/constants'; +import { Utils } from '../../utils/utils'; +import toaster from '../../components/toast'; import OrgLogsFileUpdateEvent from '../../models/org-logs-file-update'; import ModalPortal from '../../components/modal-portal'; import FileUpdateDetailDialog from '../../components/dialog/org-logs-file-update-detail'; @@ -40,13 +42,14 @@ class OrgLogsFileUpdate extends Component { let eventList = res.data.log_list.map(item => { return new OrgLogsFileUpdateEvent(item); }); - this.setState({ eventList: eventList, pageNext: res.data.page_next, page: res.data.page, }); - + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } diff --git a/frontend/src/pages/org-admin/org-logs-perm-audit.js b/frontend/src/pages/org-admin/org-logs-perm-audit.js index 1f3e571699..735c827d4a 100644 --- a/frontend/src/pages/org-admin/org-logs-perm-audit.js +++ b/frontend/src/pages/org-admin/org-logs-perm-audit.js @@ -2,9 +2,10 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; import moment from 'moment'; import { Dropdown, DropdownToggle, DropdownMenu, DropdownItem } from 'reactstrap'; -import { Utils } from '../../utils/utils'; import { seafileAPI } from '../../utils/seafile-api'; import { siteRoot, gettext, lang } from '../../utils/constants'; +import { Utils } from '../../utils/utils'; +import toaster from '../../components/toast'; import OrgLogsFilePermEvent from '../../models/org-logs-perm-audit'; import '../../css/org-logs.css'; @@ -42,6 +43,9 @@ class OrgLogsFileUpdate extends Component { pageNext: res.data.page_next, page: res.data.page, }); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } diff --git a/frontend/src/pages/org-admin/org-user-item.js b/frontend/src/pages/org-admin/org-user-item.js index 52c5ca54c1..039c3dda56 100644 --- a/frontend/src/pages/org-admin/org-user-item.js +++ b/frontend/src/pages/org-admin/org-user-item.js @@ -3,7 +3,8 @@ import PropTypes from 'prop-types'; import { Dropdown, DropdownToggle, DropdownMenu, DropdownItem } from 'reactstrap'; import { gettext, siteRoot, orgID, username } from '../../utils/constants'; import { seafileAPI } from '../../utils/seafile-api'; -import Toast from '../../components/toast'; +import { Utils } from '../../utils/utils'; +import toaster from '../../components/toast'; import UserStatusEditor from '../../components/select-editor/user-status-editor'; const propTypes = { @@ -60,7 +61,10 @@ class UserItem extends React.Component { msg = gettext('Successfully reset password to %(passwd)s for user %(user)s.'); msg = msg.replace('%(passwd)s', res.data.new_password); msg = msg.replace('%(user)s', email); - Toast.success(msg); + toaster.success(msg); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } @@ -83,9 +87,13 @@ class UserItem extends React.Component { highlight: false, showMenu: false, }); - Toast.success(gettext('Edit succeeded.')); - }).catch(err => { - Toast.danger(gettext('Edit failed.')); + toaster.success(gettext('Edit succeeded.')); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + if (errMessage === gettext('Error')) { + errMessage = gettext('Edit failed.'); + } + toaster.danger(errMessage); }); } diff --git a/frontend/src/pages/org-admin/org-users.js b/frontend/src/pages/org-admin/org-users.js index 1d54a838d9..4b5d71773d 100644 --- a/frontend/src/pages/org-admin/org-users.js +++ b/frontend/src/pages/org-admin/org-users.js @@ -7,10 +7,11 @@ import AddOrgAdminDialog from '../../components/dialog/org-add-admin-dialog'; import ModalPortal from '../../components/modal-portal'; import AddOrgUserDialog from '../../components/dialog/org-add-user-dialog'; import InviteUserDialog from '../../components/dialog/org-admin-invite-user-dialog'; -import Toast from '../../components/toast'; +import toaster from '../../components/toast'; import { seafileAPI } from '../../utils/seafile-api'; import OrgUserInfo from '../../models/org-user'; import { gettext, invitationLink, orgID } from '../../utils/constants'; +import { Utils } from '../../utils/utils'; class OrgUsers extends Component { @@ -53,6 +54,9 @@ class OrgUsers extends Component { pageNext: res.data.page_next, page: res.data.page, }); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } @@ -66,9 +70,10 @@ class OrgUsers extends Component { this.toggleAddOrgUser(); let msg = gettext('successfully added user %s.'); msg = msg.replace('%s', email); - Toast.success(msg); - }).catch(err => { - Toast.danger(err.response.data.error_msg); + toaster.success(msg); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); this.toggleAddOrgUser(); }); } @@ -79,7 +84,10 @@ class OrgUsers extends Component { this.setState({orgUsers: users}); let msg = gettext('Successfully deleted %s'); msg = msg.replace('%s', email); - Toast.success(msg); + toaster.success(msg); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } @@ -89,6 +97,9 @@ class OrgUsers extends Component { return new OrgUserInfo(item); }); this.setState({orgAdminUsers: userList}); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } @@ -99,7 +110,10 @@ class OrgUsers extends Component { }); let msg = gettext('Successfully deleted %s'); msg = msg.replace('%s', email); - Toast.success(msg); + toaster.success(msg); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } @@ -110,7 +124,10 @@ class OrgUsers extends Component { }); let msg = gettext('Successfully revoke the admin permission of %s'); msg = msg.replace('%s', res.data.name); - Toast.success(msg); + toaster.success(msg); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } @@ -121,7 +138,7 @@ class OrgUsers extends Component { }); let msg = gettext('Successfully set %s as admin.'); msg = msg.replace('%s', userInfo.email); - Toast.success(msg); + toaster.success(msg); this.toggleAddOrgAdmin(); } diff --git a/frontend/src/pages/review/history-list.js b/frontend/src/pages/review/history-list.js index b2f4daf8c1..acd83070b8 100644 --- a/frontend/src/pages/review/history-list.js +++ b/frontend/src/pages/review/history-list.js @@ -5,6 +5,8 @@ import Loading from '../../components/loading'; import moment from 'moment'; import { seafileAPI } from '../../utils/seafile-api'; import { draftRepoID, draftFilePath, draftOriginFilePath } from '../../utils/constants'; +import { Utils } from '../../utils/utils'; +import toaster from '../../components/toast'; import '../../css/file-history.css'; @@ -44,7 +46,10 @@ class HistoryList extends React.Component { this.setState({ loading : false }); - }); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); + }) } } } diff --git a/frontend/src/pages/share-admin/folders.js b/frontend/src/pages/share-admin/folders.js index 3ee74fad72..b610057768 100644 --- a/frontend/src/pages/share-admin/folders.js +++ b/frontend/src/pages/share-admin/folders.js @@ -6,6 +6,7 @@ import { gettext, siteRoot, loginUrl, isPro } from '../../utils/constants'; import EmptyTip from '../../components/empty-tip'; import SharePermissionEditor from '../../components/select-editor/share-permission-editor'; import SharedFolderInfo from '../../models/shared-folder-info'; +import toaster from '../../components/toast'; class Content extends Component { @@ -107,10 +108,9 @@ class Item extends Component { seafileAPI.updateFolderSharePerm(item.repo_id, postData, options).then((res) => { this.setState({share_permission: perm}); - // TODO: show feedback msg - // gettext("Successfully modified permission") }).catch((error) => { - // TODO: show feedback msg + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } @@ -260,11 +260,15 @@ class ShareAdminFolders extends Component { return folderItem.group_id !== item.group_id; } }); - this.setState({items: items}); - // TODO: show feedback msg - // gettext("Successfully deleted 1 item") - }).catch((error) => { - // TODO: show feedback msg + this.setState({items: items}); + let message = gettext('Successfully unshared {name}').replace('{name}', item.folder_name); + toaster.success(message); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + if (errMessage === gettext('Error')) { + errMessage = gettext('Failed unshared {name}').replace('{name}', item.folder_name); + } + toaster(errMessage); }); } diff --git a/frontend/src/pages/share-admin/libraries.js b/frontend/src/pages/share-admin/libraries.js index 63ca340e7f..41f327cb33 100644 --- a/frontend/src/pages/share-admin/libraries.js +++ b/frontend/src/pages/share-admin/libraries.js @@ -1,8 +1,9 @@ import React, { Component } from 'react'; import { Link } from '@reach/router'; import { seafileAPI } from '../../utils/seafile-api'; -import { Utils } from '../../utils/utils'; import { gettext, siteRoot, loginUrl, isPro } from '../../utils/constants'; +import { Utils } from '../../utils/utils'; +import toaster from '../../components/toast'; import EmptyTip from '../../components/empty-tip'; import SharePermissionEditor from '../../components/select-editor/share-permission-editor'; import SharedRepoInfo from '../../models/shared-repo-info'; @@ -105,10 +106,9 @@ class Item extends Component { share_permission: permission == 'admin' ? 'rw' : permission, is_admin: permission == 'admin', }); - // TODO: show feedback msg - // gettext("Successfully modified permission") }).catch((error) => { - // TODO: show feedback msg + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } @@ -248,10 +248,14 @@ class ShareAdminLibraries extends Component { }); } this.setState({items: items}); - // TODO: show feedback msg - // gettext("Successfully deleted 1 item") - }).catch((error) => { - // TODO: show feedback msg + let message = gettext('Successfully unshared {name}').replace('{name}', item.repo_name); + toaster.success(message); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + if (errMessage === gettext('Error')) { + errMessage = gettext('Failed unshared {name}').replace('{name}', item.repo_name); + } + toaster(errMessage); }); } diff --git a/frontend/src/pages/share-admin/share-links.js b/frontend/src/pages/share-admin/share-links.js index c8c0e1a49e..58a0928fb2 100644 --- a/frontend/src/pages/share-admin/share-links.js +++ b/frontend/src/pages/share-admin/share-links.js @@ -194,10 +194,14 @@ class Item extends Component { this.setState({ currentPermission: changed_to_permissions, }); - // TODO: show feedback msg - // gettext("Successfully modified permission") + let message = gettext("Successfully modified permission."); + toaster.success(message); }).catch((error) => { - // TODO: show feedback msg + let errMessage = Utils.getErrorMsg(error); + if (errMessage === gettext('Error')) { + errMessage = gettext("Failed modified permission."); + } + toaster.danger(errMessage); }); } @@ -339,10 +343,14 @@ class ShareAdminShareLinks extends Component { return uploadItem.token !== item.token; }); this.setState({items: items}); - // TODO: show feedback msg - // gettext("Successfully deleted 1 item") + let message = gettext("Successfully deleted share link."); + toaster.success(message); }).catch((error) => { - // TODO: show feedback msg + let errMessage = Utils.getErrorMsg(error); + if (errMessage === gettext('Error')) { + errMessage = gettext("Failed deleted share link."); + } + toaster.danger(errMessage); }); } diff --git a/frontend/src/pages/share-admin/upload-links.js b/frontend/src/pages/share-admin/upload-links.js index 130d26b7e3..40430f79bd 100644 --- a/frontend/src/pages/share-admin/upload-links.js +++ b/frontend/src/pages/share-admin/upload-links.js @@ -5,6 +5,7 @@ import { Modal, ModalHeader, ModalBody } from 'reactstrap'; import { gettext, siteRoot, loginUrl, canGenerateShareLink } from '../../utils/constants'; import { seafileAPI } from '../../utils/seafile-api'; import { Utils } from '../../utils/utils'; +import toaster from '../../components/toast'; import SharedUploadInfo from '../../models/shared-upload-info'; import EmptyTip from '../../components/empty-tip'; @@ -208,10 +209,14 @@ class ShareAdminUploadLinks extends Component { return uploadItem.token !== item.token; }); this.setState({items: items}); - // TODO: show feedback msg - // gettext("Successfully deleted 1 item") + let message = gettext("Successfully deleted upload link."); + toaster.success(message); }).catch((error) => { - // TODO: show feedback msg + let errMessage = Utils.getErrorMsg(error); + if (errMessage === gettext('Error')) { + errMessage = gettext("Failed deleted upload link."); + } + toaster.danger(errMessage); }); } diff --git a/frontend/src/pages/shared-libs/shared-libs.js b/frontend/src/pages/shared-libs/shared-libs.js index 43faadba6e..ad96806266 100644 --- a/frontend/src/pages/shared-libs/shared-libs.js +++ b/frontend/src/pages/shared-libs/shared-libs.js @@ -3,10 +3,11 @@ import PropTypes from 'prop-types'; import moment from 'moment'; import cookie from 'react-cookies'; import { Link } from '@reach/router'; +import { gettext, siteRoot, loginUrl, isPro } from '../../utils/constants'; import { seafileAPI } from '../../utils/seafile-api'; import { Utils } from '../../utils/utils'; +import toaster from '../../components/toast'; import Repo from '../../models/repo'; -import { gettext, siteRoot, loginUrl, isPro } from '../../utils/constants'; import Loading from '../../components/loading'; import EmptyTip from '../../components/empty-tip'; import ModalPotal from '../../components/modal-portal'; @@ -175,12 +176,15 @@ class Item extends Component { } request.then((res) => { - this.setState({ - unshared: true - }); - // TODO: show feedback msg - }).catch((error) => { - // TODO: show feedback msg + this.setState({unshared: true}); + let message = gettext('Successfully unshared {name}').replace('{name}', data.repo_name); + toaster.success(message); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + if (errMessage === gettext('Error')) { + errMessage = gettext('Failed unshared {name}').replace('{name}', data.repo_name); + } + toaster(errMessage); }); } @@ -192,10 +196,16 @@ class Item extends Component { if (this.state.isStarred) { seafileAPI.unstarItem(this.props.data.repo_id, '/').then(() => { this.setState({isStarred: !this.state.isStarred}); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } else { seafileAPI.starItem(this.props.data.repo_id, '/').then(() => { this.setState({isStarred: !this.state.isStarred}); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } } diff --git a/frontend/src/pages/shared-with-all/public-shared-view.js b/frontend/src/pages/shared-with-all/public-shared-view.js index 4af8343a40..e37713bb03 100644 --- a/frontend/src/pages/shared-with-all/public-shared-view.js +++ b/frontend/src/pages/shared-with-all/public-shared-view.js @@ -88,8 +88,9 @@ class PublicSharedView extends React.Component { let repoList = this.addRepoItem(repo); this.setState({repoList: repoList}); this.onCreateRepoToggle(); - }).catch(() => { - // todo + }).catch((error) => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } @@ -98,8 +99,9 @@ class PublicSharedView extends React.Component { seafileAPI.selectOwnedRepoToPublic(repo.repo_id, {share_type: 'public', permission: repo.sharePermission}).then(() => { let repoList = this.addRepoItem(repo); this.setState({repoList: repoList}); - }).catch(() => { - // todo + }).catch((error) => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); }); } @@ -110,7 +112,14 @@ class PublicSharedView extends React.Component { return item.repo_id !== repo.repo_id; }); this.setState({repoList: repoList}); - toaster.success('Successfully unshared 1 item.'); + let message = gettext('Successfully unshared {name}').replace('{name}', repo.repo_name); + toaster.success(message); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + if (errMessage === gettext('Error')) { + errMessage = gettext('Failed unshared {name}').replace('{name}', repo.repo_name); + } + toaster(errMessage); }); } diff --git a/frontend/src/pages/starred/starred.js b/frontend/src/pages/starred/starred.js index 11d04ed838..35fd1f25d6 100644 --- a/frontend/src/pages/starred/starred.js +++ b/frontend/src/pages/starred/starred.js @@ -5,6 +5,7 @@ import { seafileAPI } from '../../utils/seafile-api'; import { Utils } from '../../utils/utils'; import { gettext, siteRoot, loginUrl } from '../../utils/constants'; import EmptyTip from '../../components/empty-tip'; +import toaster from '../../components/toast'; class Content extends Component { @@ -151,12 +152,10 @@ class Item extends Component { const data = this.props.data; seafileAPI.unstarItem(data.repo_id, data.path).then((res) => { - this.setState({ - unstarred: true - }); - // TODO: show feedback msg + this.setState({unstarred: true}); }).catch((error) => { - // TODO: show feedback msg + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } diff --git a/frontend/src/repo-snapshot.js b/frontend/src/repo-snapshot.js index 39ad180dc6..8d42921225 100644 --- a/frontend/src/repo-snapshot.js +++ b/frontend/src/repo-snapshot.js @@ -133,16 +133,7 @@ class RepoSnapshot extends React.Component { this.toggleDialog(); toaster.success(gettext('Successfully restored the library.')); }).catch((error) => { - let errorMsg = ''; - if (error.response) { - if (error.response.data && error.response.data['error_msg']) { - errorMsg = error.response.data['error_msg']; - } else { - errorMsg = gettext('Error'); - } - } else { - errorMsg = gettext('Please check the network.'); - } + let errorMsg = Utils.getErrorMsg(error); this.toggleDialog(); toaster.danger(errorMsg); }); @@ -284,12 +275,7 @@ class FolderItem extends React.Component { request.then((res) => { toaster.success(gettext('Successfully restored 1 item.')); }).catch((error) => { - let errorMsg = ''; - if (error.response) { - errorMsg = error.response.data.error_msg || gettext('Error'); - } else { - errorMsg = gettext('Please check the network.'); - } + let errorMsg = Utils.getErrorMsg(error); toaster.danger(errorMsg); }); } diff --git a/frontend/src/settings.js b/frontend/src/settings.js index 3d58039034..d22ab337a3 100644 --- a/frontend/src/settings.js +++ b/frontend/src/settings.js @@ -57,11 +57,12 @@ class Settings extends React.Component { this.setState({ userInfo: res.data }); - }).catch((error) => { - // do nothing + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } - + updateUserInfo = (data) => { seafileAPI.updateUserInfo(data).then((res) => { this.setState({ @@ -69,17 +70,8 @@ class Settings extends React.Component { }); toaster.success(gettext('Success')); }).catch((error) => { - let errorMsg = ''; - if (error.response) { - if (error.response.data && error.response.data['error_msg']) { - errorMsg = error.response.data['error_msg']; - } else { - errorMsg = gettext('Error'); - } - } else { - errorMsg = gettext('Please check the network.'); - } - toaster.danger(errorMsg); + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); } diff --git a/frontend/src/shared-dir-view.js b/frontend/src/shared-dir-view.js index a56d57a950..22045a4d42 100644 --- a/frontend/src/shared-dir-view.js +++ b/frontend/src/shared-dir-view.js @@ -54,16 +54,7 @@ class SharedDirView extends React.Component { }); this.getThumbnails(); }).catch((error) => { - let errorMsg = ''; - if (error.response) { - if (error.response.data && error.response.data['error_msg']) { - errorMsg = error.response.data['error_msg']; - } else { - errorMsg = gettext('Error'); - } - } else { - errorMsg = gettext('Please check the network.'); - } + let errorMsg = Utils.getErrorMsg(error); this.setState({ isLoading: false, errorMsg: errorMsg diff --git a/frontend/src/shared-file-view-markdown.js b/frontend/src/shared-file-view-markdown.js index 3e0542f4c4..c8f395660b 100644 --- a/frontend/src/shared-file-view-markdown.js +++ b/frontend/src/shared-file-view-markdown.js @@ -7,6 +7,7 @@ import SharedFileView from './components/shared-file-view/shared-file-view'; import SharedFileViewTip from './components/shared-file-view/shared-file-view-tip'; import Loading from './components/loading'; import MarkdownViewer from '@seafile/seafile-editor/dist/viewer/markdown-viewer'; +import toaster from './components/toast'; const { repoID, sharedToken, rawPath, err } = window.shared.pageOptions; @@ -32,7 +33,10 @@ class FileContent extends React.Component { markdownContent: res.data, loading: false }); - }); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); + }) } changeImageURL = (innerNode) => {