overleaf/services/web/frontend/js/ide/editor/controllers/SavingNotificationController.js
Hugh O'Brien 7a315bfa4d Merge pull request #2759 from overleaf/hb-read-only-on-connection-lost
Read only mode on lost connection and local file contents on Out of Sync error

GitOrigin-RevId: e31a259be122ad162e98746cd06a7794a95e78fa
2020-05-02 03:19:31 +00:00

102 lines
3.3 KiB
JavaScript

/* eslint-disable
camelcase,
max-len,
no-return-assign,
no-undef,
*/
// TODO: This file was created by bulk-decaffeinate.
// Fix any style issues and re-enable lint.
/*
* decaffeinate suggestions:
* DS102: Remove unnecessary code created because of implicit returns
* DS207: Consider shorter variations of null checks
* Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
*/
define(['../../../base', '../Document'], (App, Document) =>
App.controller('SavingNotificationController', function(
$scope,
$interval,
ide
) {
let warnAboutUnsavedChanges
setInterval(() => pollSavedStatus(), 1000)
$(window).bind('beforeunload', () => {
return warnAboutUnsavedChanges()
})
let lockEditorModal = null // modal showing "connection lost"
let originalPermissionsLevel
const MAX_UNSAVED_SECONDS = 15 // lock the editor after this time if unsaved
$scope.docSavingStatus = {}
var pollSavedStatus = function() {
let t
const oldStatus = $scope.docSavingStatus
const oldUnsavedCount = $scope.docSavingStatusCount
const newStatus = {}
let newUnsavedCount = 0
let maxUnsavedSeconds = 0
for (let doc_id in Document.openDocs) {
const doc = Document.openDocs[doc_id]
const saving = doc.pollSavedStatus()
if (!saving) {
newUnsavedCount++
if (oldStatus[doc_id] != null) {
newStatus[doc_id] = oldStatus[doc_id]
t = newStatus[doc_id].unsavedSeconds += 1
if (t > maxUnsavedSeconds) {
maxUnsavedSeconds = t
}
} else {
newStatus[doc_id] = {
unsavedSeconds: 0,
doc: ide.fileTreeManager.findEntityById(doc_id)
}
}
}
}
if (newUnsavedCount > 0 && t > MAX_UNSAVED_SECONDS && !lockEditorModal) {
lockEditorModal = ide.showLockEditorMessageModal(
'Connection lost',
'Sorry, the connection to the server is down.'
)
// put editor in readOnly mode
originalPermissionsLevel = ide.$scope.permissionsLevel
ide.$scope.permissionsLevel = 'readOnly'
lockEditorModal.result.finally(() => {
lockEditorModal = null // unset the modal if connection comes back
// restore original permissions
ide.$scope.permissionsLevel = originalPermissionsLevel
})
}
if (lockEditorModal && newUnsavedCount === 0) {
lockEditorModal.dismiss('connection back up')
// restore original permissions if they were changed
if (originalPermissionsLevel) {
ide.$scope.permissionsLevel = originalPermissionsLevel
}
}
// for performance, only update the display if the old or new
// counts of unsaved files are nonzeror. If both old and new
// unsaved counts are zero then we know we are in a good state
// and don't need to do anything to the UI.
if (newUnsavedCount || oldUnsavedCount) {
$scope.docSavingStatus = newStatus
$scope.docSavingStatusCount = newUnsavedCount
return $scope.$apply()
}
}
return (warnAboutUnsavedChanges = function() {
if (Document.hasUnsavedChanges()) {
return 'You have unsaved changes. If you leave now they will not be saved.'
}
})
}))