From da6657b2a0e2779d3134da59ae5b6ad41f05a961 Mon Sep 17 00:00:00 2001 From: sualko Date: Thu, 22 Oct 2020 11:00:15 +0200 Subject: [PATCH] fix: wait for file action api and remove jQuery from filelist script fix #92 --- ts/Common/Api.ts | 6 +-- ts/filelist.ts | 118 +++++++++++++++++++++++------------------------ 2 files changed, 61 insertions(+), 63 deletions(-) diff --git a/ts/Common/Api.ts b/ts/Common/Api.ts index 4f02914..3c4e9db 100644 --- a/ts/Common/Api.ts +++ b/ts/Common/Api.ts @@ -1,9 +1,9 @@ import axios from '@nextcloud/axios'; export enum ShareType { - User = OC.Share.SHARE_TYPE_USER, - Group = OC.Share.SHARE_TYPE_GROUP, - Circle = OC.Share.SHARE_TYPE_CIRCLE + User = 0, // OC.Share.SHARE_TYPE_USER + Group = 1, // OC.Share.SHARE_TYPE_GROUP + Circle = 7, // OC.Share.SHARE_TYPE_CIRCLE } export enum Permission { Admin, Moderator, User } diff --git a/ts/filelist.ts b/ts/filelist.ts index 706ec40..07a4752 100644 --- a/ts/filelist.ts +++ b/ts/filelist.ts @@ -1,78 +1,76 @@ import axios from '@nextcloud/axios'; import { generateOcsUrl, generateUrl } from '@nextcloud/router'; -import { Room } from './Common/Api'; +import { api } from './Common/Api'; declare const OCA: any; -class BigBlueButton { - public async getRooms(): Promise { - const response = await axios.get(OC.generateUrl('/apps/bbb/rooms')); +const mimeTypes = [ + 'application/pdf', + 'application/vnd.oasis.opendocument.presentation', + 'application/vnd.oasis.opendocument.text', + 'application/vnd.oasis.opendocument.spreadsheet', + 'application/vnd.oasis.opendocument.graphics', + 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', + 'application/vnd.openxmlformats-officedocument.presentationml.presentation', + 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', + 'application/msword', + 'application/vnd.ms-powerpoint', + 'application/vnd.ms-excel', + 'image/jpeg', + 'image/png', + 'text/plain', + 'text/rtf', +]; - return response.data; - } +async function createDirectShare(fileId: number): Promise { + const url = generateOcsUrl('apps/dav/api/v1', 1) + 'direct'; + const createResponse = await axios.post(url, { + fileId, + }); + + return createResponse.data?.ocs?.data?.url; } -$(() => { +async function share(fileId: number, filename: string, roomUid) { + const shareUrl = await createDirectShare(fileId); + const joinUrl = generateUrl('/apps/bbb/b/{uid}?u={url}&filename={filename}', { + uid: roomUid, + url: shareUrl, + filename, + }); + window.open(joinUrl, '_blank', 'noopener,noreferrer'); +} + +function registerFileAction(mime, id, uid, name) { + OCA.Files.fileActions.registerAction({ + name: 'bbb-' + id, + displayName: name, + mime, + permissions: OC.PERMISSION_SHARE, + icon: OC.imagePath('bbb', 'app-dark.svg'), + actionHandler: (fileName, context) => { + share(context.fileInfoModel.id, fileName, uid); + }, + }); +} + +function addRoomsAsFileAction() { if (!OCA?.Files?.fileActions) { + console.warn('[BBB] "OCA.Files.fileActions" not available'); + return; } - const mimeTypes = [ - 'application/pdf', - 'application/vnd.oasis.opendocument.presentation', - 'application/vnd.oasis.opendocument.text', - 'application/vnd.oasis.opendocument.spreadsheet', - 'application/vnd.oasis.opendocument.graphics', - 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', - 'application/vnd.openxmlformats-officedocument.presentationml.presentation', - 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', - 'application/msword', - 'application/vnd.ms-powerpoint', - 'application/vnd.ms-excel', - 'image/jpeg', - 'image/png', - 'text/plain', - 'text/rtf', - ]; - const bbb = new BigBlueButton(); - - bbb.getRooms().then(rooms => { + api.getRooms().then(rooms => { rooms.forEach(room => { mimeTypes.forEach(mime => registerFileAction(mime, room.id, room.uid, room.name)); }); }); +} - function registerFileAction(mime, id, uid, name) { - OCA.Files.fileActions.registerAction({ - name: 'bbb-' + id, - displayName: name, - mime, - permissions: OC.PERMISSION_SHARE, - icon: OC.imagePath('bbb', 'app-dark.svg'), - actionHandler: (fileName, context) => { - share(context.fileInfoModel.id, fileName, uid); - }, - }); - } - - async function share(fileId: number, filename: string, roomUid) { - const shareUrl = await createDirectShare(fileId); - const joinUrl = generateUrl('/apps/bbb/b/{uid}?u={url}&filename={filename}', { - uid: roomUid, - url: shareUrl, - filename, - }); - - window.open(joinUrl, '_blank', 'noopener,noreferrer'); - } - - async function createDirectShare(fileId: number): Promise { - const url = generateOcsUrl('apps/dav/api/v1', 1) + 'direct'; - const createResponse = await axios.post(url, { - fileId, - }); - - return createResponse.data?.ocs?.data?.url; - } -}); +if (document.readyState === 'complete') { + addRoomsAsFileAction(); +} else { + document.addEventListener('DOMContentLoaded', addRoomsAsFileAction); +} \ No newline at end of file