Merge pull request #279 from JsSucks/dnd-patch
Add dnd in non-channels and fix upload failover
This commit is contained in:
commit
726db7f0c9
|
@ -14,15 +14,17 @@ import { ReactComponents } from './reactcomponents';
|
|||
import Reflection from './reflection';
|
||||
import DiscordApi from './discordapi';
|
||||
import ThemeManager from './thememanager';
|
||||
import { DOM } from 'ui';
|
||||
|
||||
export default class PackageInstaller {
|
||||
|
||||
/**
|
||||
* Handler for drag and drop package install
|
||||
* @param {String} filePath Path to local file
|
||||
* @param {String} channelId Current channel id
|
||||
* @param {Boolean} canUpload If the user can upload files in current window
|
||||
* @returns {Number} returns action code from modal
|
||||
*/
|
||||
static async dragAndDropHandler(filePath, channelId) {
|
||||
static async dragAndDropHandler(filePath, canUpload) {
|
||||
try {
|
||||
const config = JSON.parse(asar.extractFile(filePath, 'config.json').toString());
|
||||
const { info, main } = config;
|
||||
|
@ -36,12 +38,8 @@ export default class PackageInstaller {
|
|||
const isPlugin = info.type && info.type === 'plugin' || main.endsWith('.js');
|
||||
|
||||
// Show install modal
|
||||
const modalResult = await Modals.installModal(isPlugin ? 'plugin' : 'theme', config, filePath, icon).promise;
|
||||
|
||||
if (modalResult === 0) {
|
||||
// Upload it instead
|
||||
}
|
||||
|
||||
const modalResult = await Modals.installModal(isPlugin ? 'plugin' : 'theme', config, filePath, icon, canUpload).promise;
|
||||
return modalResult;
|
||||
} catch (err) {
|
||||
console.log(err);
|
||||
}
|
||||
|
@ -144,16 +142,23 @@ export default class PackageInstaller {
|
|||
|
||||
const reflect = Reflection.DOM(selector);
|
||||
const stateNode = reflect.getComponentStateNode(this.UploadArea);
|
||||
const callback = function (e) {
|
||||
const callback = async function (e) {
|
||||
if (!e.dataTransfer.files.length || !e.dataTransfer.files[0].name.endsWith('.bd')) return;
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
e.stopImmediatePropagation();
|
||||
stateNode.clearDragging();
|
||||
|
||||
PackageInstaller.dragAndDropHandler(e.dataTransfer.files[0].path, DiscordApi.currentChannel.id);
|
||||
const currentChannel = DiscordApi.currentChannel;
|
||||
const canUpload = currentChannel ? currentChannel.checkPermissions(Reflection.modules.DiscordConstants.Permissions.ATTACH_FILES) : false;
|
||||
const files = Array.from(e.dataTransfer.files).slice(0);
|
||||
const actionCode = await PackageInstaller.dragAndDropHandler(e.dataTransfer.files[0].path, canUpload);
|
||||
if (actionCode === 0) stateNode.promptToUpload(files, currentChannel.id, true, !e.shiftKey);
|
||||
};
|
||||
|
||||
// Add a listener to root for when not in a channel
|
||||
const root = DOM.getElement('#app-mount');
|
||||
root.addEventListener('drop', callback);
|
||||
|
||||
// Remove their handler, add ours, then read theirs to give ours priority to stop theirs when we get a .bd file.
|
||||
reflect.element.removeEventListener('drop', stateNode.handleDrop);
|
||||
reflect.element.addEventListener('drop', callback);
|
||||
|
@ -161,6 +166,7 @@ export default class PackageInstaller {
|
|||
|
||||
this.unpatchUploadArea = function () {
|
||||
reflect.element.removeEventListener('drop', callback);
|
||||
root.removeEventListener('drop', callback);
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
@ -33,16 +33,16 @@
|
|||
</div>
|
||||
<div v-else-if="!verified" slot="footer" class="bd-installModalFooter">
|
||||
<span class="bd-installModalStatus bd-err">Not verified!</span>
|
||||
<div class="bd-button bd-installModalUpload" @click="modal.confirm(0); modal.close();">Upload</div>
|
||||
<div class="bd-button bd-installModalUpload" @click="modal.confirm(0); modal.close();" v-if="modal.canUpload">Upload</div>
|
||||
<div class="bd-button bd-err" @click="install" v-if="allowUnsafe">{{ !alreadyInstalled ? 'Install' : 'Update' }}</div>
|
||||
</div>
|
||||
<div v-else-if="alreadyInstalled && upToDate" slot="footer" class="bd-installModalFooter">
|
||||
<span class="bd-installModalStatus">Up to date version already installed!</span>
|
||||
<div class="bd-button bd-installModalUpload" @click="modal.confirm(0); modal.close();">Upload</div>
|
||||
<div class="bd-button bd-installModalUpload" @click="modal.confirm(0); modal.close();" v-if="modal.canUpload">Upload</div>
|
||||
</div>
|
||||
<div v-else slot="footer" class="bd-installModalFooter">
|
||||
<span class="bd-installModalStatus bd-ok">Verified!</span>
|
||||
<div class="bd-button bd-installModalUpload" @click="modal.confirm(0); modal.close();">Upload</div>
|
||||
<div class="bd-button bd-installModalUpload" @click="modal.confirm(0); modal.close();" v-if="modal.canUpload">Upload</div>
|
||||
<div class="bd-button bd-ok" @click="install">{{ !alreadyInstalled ? 'Install' : 'Update' }}</div>
|
||||
</div>
|
||||
</template>
|
||||
|
|
|
@ -191,12 +191,12 @@ export default class Modals {
|
|||
return new Modal(modal, InputModal);
|
||||
}
|
||||
|
||||
static installModal(contentType, config, filePath, icon) {
|
||||
return this.add(this.createInstallModal(contentType, config, filePath, icon));
|
||||
static installModal(contentType, config, filePath, icon, canUpload = false) {
|
||||
return this.add(this.createInstallModal(contentType, config, filePath, icon, canUpload));
|
||||
}
|
||||
|
||||
static createInstallModal(contentType, config, filePath, icon) {
|
||||
const modal = { contentType, config, filePath, icon };
|
||||
static createInstallModal(contentType, config, filePath, icon, canUpload = false) {
|
||||
const modal = { contentType, config, filePath, icon, canUpload };
|
||||
modal.promise = new Promise((resolve, reject) => {
|
||||
modal.confirm = value => resolve(value);
|
||||
modal.beforeClose = () => reject();
|
||||
|
|
Loading…
Reference in New Issue