Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion nextcloud/locales/de.json
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,11 @@
"setting.uploadFolder.help": "Ordner in Ihrer Nextcloud für Dateien, die aus dem Webmail hochgeladen werden. Wird bei Bedarf angelegt.",
"setting.folderLayout": "Ordnerstruktur",
"setting.folderLayout.help": "Wie hochgeladene Dateien im Upload-Ordner abgelegt werden.",
"setting.enableTalkMeetingsButton": "Aktiviere Talk Button",
"setting.enableTalkMeetingsButtonHelp": "Aktiviere Button zum hinzufügen eines Nextcloud Talk Meeting Raums in Kalendereinträgen",
"talkMeeting.add": "Talk Meeting hinzufügen",
"talkMeeting.added": "Talk Meeting hinzugefügt",
"talkMeeting.error": "Kann Talk Meeting nicht erstellen: {message}",
"date": "Ein Ordner pro Tag",
"flat": "Alles direkt im Upload-Ordner"
}
}
7 changes: 6 additions & 1 deletion nextcloud/locales/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,11 @@
"setting.uploadFolder.help": "Folder in your Nextcloud for files uploaded from the webmail. Created when needed.",
"setting.folderLayout": "Folder layout",
"setting.folderLayout.help": "How uploads are sorted in the upload folder.",
"setting.enableTalkMeetingsButton": "Aktivate Talk button",
"setting.enableTalkMeetingsButtonHelp": "Aktivate button to add Nextcloud Talk meeting room in calendard entries",
"talkMeeting.add": "Add Talk meeting",
"talkMeeting.added": "Talk meeting added",
"talkMeeting.error": "Could not create Talk meeting: {message}",
"date": "One folder per day",
"flat": "All in the upload folder"
}
}
21 changes: 20 additions & 1 deletion nextcloud/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,10 @@
"ui:toolbar",
"ui:app-page",
"compose:open",
"ui:download-file"
"ui:download-file",
"calendar:read",
"calendar:write",
"ui:calendar-action"
],
"entrypoint": "index.js",
"minAppVersion": "1.15.0",
Expand Down Expand Up @@ -84,6 +87,12 @@
"date",
"flat"
]
},
"enableTalkMeetingsButton": {
"type": "boolean",
"label": "setting.enableTalkMeetingsButton",
"description": "setting.enableTalkMeetingsButtonHelp",
"default": false
}
},
"locales": {
Expand Down Expand Up @@ -784,6 +793,11 @@
"setting.uploadFolder.help": "Ordner in Ihrer Nextcloud für Dateien, die aus dem Webmail hochgeladen werden. Wird bei Bedarf angelegt.",
"setting.folderLayout": "Ordnerstruktur",
"setting.folderLayout.help": "Wie hochgeladene Dateien im Upload-Ordner abgelegt werden.",
"setting.enableTalkMeetingsButton": "Aktiviere Talk Button",
"setting.enableTalkMeetingsButtonHelp": "Aktiviere Button zum hinzufügen eines Nextcloud Talk Meeting Raums in Kalendereinträgen",
"talkMeeting.add": "Talk Meeting hinzufügen",
"talkMeeting.added": "Talk Meeting hinzugefügt",
"talkMeeting.error": "Kann Talk Meeting nicht erstellen: {message}",
"date": "Ein Ordner pro Tag",
"flat": "Alles direkt im Upload-Ordner"
},
Expand Down Expand Up @@ -924,6 +938,11 @@
"setting.uploadFolder.help": "Folder in your Nextcloud for files uploaded from the webmail. Created when needed.",
"setting.folderLayout": "Folder layout",
"setting.folderLayout.help": "How uploads are sorted in the upload folder.",
"setting.enableTalkMeetingsButton": "Activate Talk button",
"setting.enableTalkMeetingsButtonHelp": "Activate button to add Nextcloud Talk meeting room in calendar entries",
"talkMeeting.add": "Add Talk meeting",
"talkMeeting.added": "Talk meeting added",
"talkMeeting.error": "Could not create Talk meeting: {message}",
"date": "One folder per day",
"flat": "All in the upload folder"
},
Expand Down
6 changes: 4 additions & 2 deletions nextcloud/src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import { applyPickerResult } from './lib/picker-result.js';
import { SettingsSection } from './ui/settings-section.js';
import { PluginDialog } from './ui/dialog.js';
import { FilesPage } from './ui/files-page.js';
import { AddTalkMeetingButton } from './ui/talkmeeting-button.js';

const FIRST_RUN_KEY = 'firstRunOffered';

Expand Down Expand Up @@ -44,8 +45,8 @@ export async function activate(api) {
bg = api;
setApi(api);
await registerActions(api).catch((err) => api.log.warn('setActions failed', err));
api.i18n.onLocaleChange(() => { void registerActions(api).catch(() => {}); });
await offerFirstRun(api).catch(() => {});
api.i18n.onLocaleChange(() => { void registerActions(api).catch(() => { }); });
await offerFirstRun(api).catch(() => { });
}

/**
Expand Down Expand Up @@ -130,4 +131,5 @@ export const slots = {
'settings-section': { component: SettingsSection },
'plugin-dialog': { component: PluginDialog },
'app-page': { component: FilesPage },
'calendar-event-actions': { component: AddTalkMeetingButton },
};
27 changes: 26 additions & 1 deletion nextcloud/src/lib/client.js
Original file line number Diff line number Diff line change
Expand Up @@ -129,7 +129,7 @@ export function createClient(api, conn) {
const parts = [];
let loaded = 0;
try {
for (;;) {
for (; ;) {
const { done, value } = await reader.read();
if (done) break;
parts.push(value);
Expand Down Expand Up @@ -190,6 +190,31 @@ export function createClient(api, conn) {
return localPassword();
},

async createTalkRoom(eventTitle, eventDescription) {
const data = await ocs(
api,
origin,
'/ocs/v2.php/apps/spreed/api/v4/room',
{
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(
{
roomName: eventTitle,
description: eventDescription,
roomType: 3,
}),
},
{ kind: 'room' }
);

const token = data?.token;
if (!token) throw new Error("No token in response");

const url = `${origin}/call/${token}`;

return url;
},

/** Where to open a file in the Nextcloud web interface. */
webUrl(entry) {
if (entry.fileId) return `${origin}/f/${encodeURIComponent(entry.fileId)}`;
Expand Down
50 changes: 50 additions & 0 deletions nextcloud/src/ui/talkmeeting-button.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
import { createElement as h, useState } from 'react';
import { Button } from '@plugin-host/ui';
import { createClient } from '../lib/client';
import { getConnection } from '../lib/connection';
import { getApi } from '../lib/host';

export function AddTalkMeetingButton(props) {
// props contains eventData object {start, end, title, description, isAllDay, location, virtualLocation}
const [busy, setBusy] = useState(false);
const eventTitle = props?.eventData?.title || 'meeting';
const eventDescription = props?.eventData?.description || '';
const setVirtualLocation = props?.setVirtualLocation;
const api = getApi()
const t = api.i18n.t;
const enabled = api.plugin.settings.enableTalkMeetingsButton

if (!enabled) {
return null
}

let client
getConnection(api).then(connection => {
client = createClient(api, connection)
})

const virtualLocationSet = props.virtualLocation != null && props.virtualLocation != ""

async function handleClick() {
if (busy) return;
setBusy(true);
try {
const roomUrl = await client.createTalkRoom(eventTitle, eventDescription)

if (typeof setVirtualLocation === 'function') {
await setVirtualLocation(roomUrl);
api.toast.success(t('talkMeeting.added'));
} else {
await api.ui.alert({ title: t('talkMeeting.added'), message: url });
}
} catch (err) {
console.error("Error creating talk meeting", err)
const message = err && err.message ? err.message : String(err);
api.toast.error(t('talkMeeting.error', { message }));
} finally {
setBusy(false);
}
}

return h(Button, { variant: 'secondary', size: 'sm', icon: 'video', busy, onClick: handleClick, disabled: virtualLocationSet }, t('talkMeeting.add'));
}