forked from phcode-dev/staging.phcode.dev
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathserverSync.js
More file actions
1 lines (1 loc) · 5.49 KB
/
Copy pathserverSync.js
File metadata and controls
1 lines (1 loc) · 5.49 KB
1
define(function(require,exports,module){const ProjectManager=require("project/ProjectManager"),DocumentManager=require("document/DocumentManager"),Dialogs=require("widgets/Dialogs"),Strings=require("strings"),StringUtils=require("utils/StringUtils"),DefaultDialogs=require("widgets/DefaultDialogs"),Metrics=require("utils/Metrics");let syncRoot="",$icon,userContext="",publishURL="https://phcode.site";const USER_CONTEXT="publish.userContext";let ongoingSyncCount=0,syncEnabled=!1,projectSyncStarted=!1,projectSyncCompleted=!1,previewURL;function _fixLegacyUserContext(){!PhStore.getItem(USER_CONTEXT)&&localStorage.getItem(USER_CONTEXT)&&PhStore.setItem(USER_CONTEXT,localStorage.getItem(USER_CONTEXT))}function _setupUserContext(){_fixLegacyUserContext(),(userContext=PhStore.getItem(USER_CONTEXT))||(userContext="p-"+Math.round(1e13*Math.random()).toString(16),PhStore.setItem(USER_CONTEXT,userContext))}function _getProjectPreviewURL(){let projectName=ProjectManager.getProjectRoot().name;return`${publishURL}/p/${userContext}/${projectName}`}function _uploadFile(filePath,blob,resolve,reject){console.log("Uploading file for preview: ",filePath);let uploadFormData=new FormData,projectRoot=path.dirname(syncRoot),relativePath=path.relative(projectRoot,filePath),fileName=path.basename(filePath);uploadFormData.append("path",`${userContext}/${path.dirname(relativePath)}`),uploadFormData.append("files",blob,fileName),$.ajax({url:publishURL+"/upload",type:"POST",data:uploadFormData,cache:!1,contentType:!1,processData:!1,success:function(r){resolve()},error:function(r){reject()}})}function _readAndUploadFile(file){return new Promise((resolve,reject)=>{"/fs/app/state.json"!==file.fullPath?file.read({encoding:window.fs.BYTE_ARRAY_ENCODING,doNotCache:!0},function(err,content,encoding,stat){if(err)return void reject(err);let blob=new Blob([content],{type:"application/octet-stream"});_uploadFile(file.fullPath,blob,resolve,reject)}):resolve()})}function _uploadFiles(fileList,doneCB){let allPromises=[];for(let file of fileList)allPromises.push(_readAndUploadFile(file));Promise.all(allPromises).then(()=>{doneCB()})}function _startSync(doneCb){if(!syncEnabled)return;projectSyncStarted=!0,projectSyncCompleted=!1,_setSyncInProgress();let newSyncRoot,newSyncPath=ProjectManager.getProjectRoot().fullPath;newSyncPath!==syncRoot&&(syncRoot=newSyncPath,ProjectManager.getAllFiles().then(files=>{if(files.length>500)return Dialogs.showModalDialog(DefaultDialogs.DIALOG_ID_ERROR,Strings.CANNOT_PUBLISH_LARGE_PROJECT,Strings.CANNOT_PUBLISH_LARGE_PROJECT_MESSAGE),_setSyncComplete(),void(doneCb&&doneCb());_uploadFiles(files,()=>{projectSyncCompleted=!0,doneCb&&doneCb(),_setSyncComplete()})}))}function _projectOpened(){syncEnabled=!1,projectSyncStarted=!1,projectSyncCompleted=!1,previewURL=null}let allChangedFiles=[];async function _collectFiles(dirEntry){return new Promise((resolve,reject)=>{dirEntry.getContents(async(err,fsEntries)=>{err&&reject(err);for(let fsEntry of fsEntries)if(fsEntry.isDirectory){let contentFiles=await _collectFiles(fsEntry);allChangedFiles.push(...contentFiles)}else allChangedFiles.push(fsEntry)}),resolve(allChangedFiles)})}async function _projectFileChanged(target,entry,added,removed){syncEnabled&&entry&&(entry.isDirectory?await _collectFiles(entry):allChangedFiles.push(entry))}function _setSyncInProgress(){ongoingSyncCount+=1,$icon.attr({class:"syncing",title:Strings.PUBLISH_SYNC_IN_PROGRESS})}function _setSyncComplete(){0===(ongoingSyncCount-=1)&&$icon.attr({class:"preview",title:Strings.PUBLISH_VIEW_PAGE})}function _showPublishConsentDialogue(){if(projectSyncStarted)return;let publishMessage=StringUtils.format(Strings.PUBLISH_CONSENT_MESSAGE,`<a href="${_getProjectPreviewURL()}">${_getProjectPreviewURL()}</a>`);Dialogs.showModalDialog(DefaultDialogs.DIALOG_ID_INFO,Strings.SHARE_WEBSITE,publishMessage,[{className:Dialogs.DIALOG_BTN_CLASS_NORMAL,id:Dialogs.DIALOG_BTN_CANCEL,text:Strings.CANCEL},{className:Dialogs.DIALOG_BTN_CLASS_PRIMARY,id:Dialogs.DIALOG_BTN_OK,text:Strings.PUBLISH}]).done(function(id){id===Dialogs.DIALOG_BTN_OK&&(syncEnabled=!0,_startSync(()=>{_loadPreview()}))})}function _isPreviewableFile(filePath){let pathSplit=filePath.split("."),extension=pathSplit&&pathSplit.length>1?pathSplit[pathSplit.length-1]:null;return!!["html","htm","jpg","jpeg","png","svg","pdf","xml"].includes(extension.toLowerCase())}async function _loadPreview(){let projectRootUrl=_getProjectPreviewURL(),currentDocument=DocumentManager.getCurrentDocument(),currentFile=currentDocument?currentDocument.file:ProjectManager.getSelectedItem();if(currentFile){let fullPath=currentFile.fullPath,projectRoot=ProjectManager.getProjectRoot().fullPath,relativePath=path.relative(projectRoot,fullPath);_isPreviewableFile(relativePath)&&(previewURL=`${projectRootUrl}/${relativePath}`)}previewURL||(previewURL=projectRootUrl),Phoenix.app.openURLInDefaultBrowser(previewURL)}function _addToolbarIcon(){const syncButtonID="sync-button";($icon=$("<a>").attr({id:syncButtonID,href:"#",class:"preview",title:Strings.PUBLISH_PAGE}).appendTo($("#main-toolbar .buttons"))).on("click",()=>{if(Metrics.countEvent(Metrics.EVENT_TYPE.SHARING,"shareIcon","clicked"),projectSyncCompleted){_setSyncInProgress();let uniqueFilesToUpload=[...new Set(allChangedFiles)];allChangedFiles=[],_uploadFiles(uniqueFilesToUpload,()=>{_setSyncComplete(),_loadPreview()})}_showPublishConsentDialogue()})}exports.init=function(){_addToolbarIcon(),_setupUserContext(),ProjectManager.on(ProjectManager.EVENT_PROJECT_OPEN,_projectOpened),ProjectManager.on(ProjectManager.EVENT_PROJECT_FILE_CHANGED,_projectFileChanged)}});