import axios from '@nextcloud/axios'; import { generateOcsUrl, generateUrl } from '@nextcloud/router'; import { Room } from './Manager/Api'; declare const OCA: any; class BigBlueButton { public async getRooms(): Promise { const response = await axios.get(OC.generateUrl('/apps/bbb/rooms')); return response.data; } } $(() => { if (!OCA?.Files?.fileActions) { 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 => { 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.getFullPath(), fileName, uid); }, }); } async function share(path: string, filename: string, roomUid) { const id = await createShare(path); const shareUrl = await configureShare(id); const joinUrl = generateUrl('/apps/bbb/b/{uid}?u={url}&filename={filename}', { uid: roomUid, url: shareUrl + '/download', filename, }); window.open(joinUrl, '_blank', 'noopener,noreferrer'); } async function createShare(path: string): Promise { const url = generateOcsUrl('apps/files_sharing/api/v1', 2) + 'shares'; const createResponse = await axios.post(url, { path, shareType: OC.Share.SHARE_TYPE_LINK, note: 'foobar foobar foobar', expireDate: '2020-07-01', }); const { meta, data } = createResponse.data.ocs; if (meta.statuscode !== 200) { throw new Error('Failed to create share'); } return data.id; } async function configureShare(id: number): Promise { const url = generateOcsUrl('apps/files_sharing/api/v1', 2) + 'shares/' + id; const tomorrow = new Date(); tomorrow.setDate(new Date().getDate() + 1); const updateResponse = await axios.put(url, { expireDate: tomorrow.toISOString().split('T')[0], note: 'BigBlueButton', }); const { meta, data } = updateResponse.data.ocs; if (meta.statuscode !== 200) { throw new Error('Failed to configure share'); } return data.url; } });