Integration with Talk. You can save a message as a note to remind yourself.

This commit is contained in:
Matias De lellis
2022-05-26 11:24:34 -03:00
parent b6db15d8d2
commit 251e943e46
7 changed files with 97 additions and 5 deletions

1
.gitignore vendored
View File

@@ -1,6 +1,7 @@
build build
js/templates.js js/templates.js
js/quicknotes-dashboard.js* js/quicknotes-dashboard.js*
js/quicknotes-talk.js*
node_modules node_modules
vendor vendor
translationfiles/ translationfiles/

View File

@@ -121,6 +121,7 @@ appstore: distclean build
--exclude=templates/fake.php \ --exclude=templates/fake.php \
--exclude=translation* \ --exclude=translation* \
--exclude=webpack*.js \ --exclude=webpack*.js \
--exclude=*.js.map \
--exclude=psalm.xml \ --exclude=psalm.xml \
$(project_dir) $(sign_dir) $(project_dir) $(sign_dir)
@echo "Signing…" @echo "Signing…"

View File

@@ -34,6 +34,7 @@ use OCP\IURLGenerator;
use OCP\IServerContainer; use OCP\IServerContainer;
use OCA\QuickNotes\Search\NoteSearchProvider; use OCA\QuickNotes\Search\NoteSearchProvider;
use OCA\QuickNotes\Listeners\BeforeTemplateRenderedListener;
class Application extends App implements IBootstrap { class Application extends App implements IBootstrap {

View File

@@ -2,16 +2,23 @@
declare(strict_types=1); declare(strict_types=1);
namespace OCA\QuickNotes\AppInfo; namespace OCA\QuickNotes\Listeners;
use OCP\AppFramework\Http\Events\BeforeTemplateRenderedEvent; use OCP\AppFramework\Http\Events\BeforeTemplateRenderedEvent;
use OCP\EventDispatcher\Event; use OCP\EventDispatcher\Event;
use OCP\EventDispatcher\IEventListener; use OCP\EventDispatcher\IEventListener;
use OCP\IRequest;
use OCP\Util;
class BeforeTemplateRenderedListener implements IEventListener { class BeforeTemplateRenderedListener implements IEventListener {
public function handle(Event $event): void { private $request;
public function __construct(IRequest $request) {
$this->request = $request;
}
public function handle(Event $event): void {
if (!($event instanceof BeforeTemplateRenderedEvent)) { if (!($event instanceof BeforeTemplateRenderedEvent)) {
return; return;
} }
@@ -20,7 +27,12 @@ class BeforeTemplateRenderedListener implements IEventListener {
return; return;
} }
\OCP\Util::addStyle('quicknotes', 'global'); Util::addStyle('quicknotes', 'global');
$pathInfo = $this->request->getPathInfo();
if (strpos($pathInfo, '/call/') === 0 || strpos($pathInfo, '/apps/spreed') === 0) {
Util::addScript('quicknotes', 'quicknotes-talk');
}
} }
} }

View File

@@ -15,7 +15,23 @@ export const getDashboardData = () => {
}) })
.catch(err => { .catch(err => {
console.error(err) console.error(err)
showError(t('notes', 'Fetching notes for dashboard has failed.')) showError(t('quicknotes', 'There was an error fetching your notes for the dashboard'))
throw err
})
}
export const postNewNote = (title, content) => {
return axios
.post(url('/notes'), {
title: title,
content: content,
})
.then(response => {
return response.data
})
.catch(err => {
console.error(err)
showError(t('quicknotes', 'There was an error saving the note'))
throw err throw err
}) })
} }

60
src/talk.js Normal file
View File

@@ -0,0 +1,60 @@
import Vue from 'vue'
import axios from '@nextcloud/axios'
import { generateUrl } from '@nextcloud/router'
import { showError, showSuccess } from '@nextcloud/dialogs'
import { postNewNote } from './NotesService.js'
Vue.prototype.t = t
Vue.prototype.n = n
Vue.prototype.OC = OC
window.addEventListener('DOMContentLoaded', () => {
if (!window.OCA?.Talk?.registerMessageAction) {
return
}
window.OCA.Talk.registerMessageAction({
label: t('quicknotes', 'Save as a note'),
icon: 'icon-quicknotes',
async callback({message: { message, id: messageId, messageParameters, actorDisplayName }, metadata: { name: conversationName, token: conversationToken }}) {
const parsedMessage = message.replace(/{[a-z0-9-_]+}/gi, function(parameter) {
const parameterName = parameter.substr(1, parameter.length - 2)
if (messageParameters[parameterName]) {
if (messageParameters[parameterName].type === 'file' && messageParameters[parameterName].path) {
return messageParameters[parameterName].path
}
if (messageParameters[parameterName].type === 'user' || messageParameters[parameterName].type === 'call') {
return '@' + messageParameters[parameterName].name
}
if (messageParameters[parameterName].name) {
return messageParameters[parameterName].name
}
}
// Do not replace so insert with curly braces again
return parameter
})
const title = t('quicknotes', 'Message from {author} in the call {conversationName}', {
author: actorDisplayName,
conversationName,
})
const callLink = window.location.origin + generateUrl('/call/{conversationToken}#message_{messageId}', { conversationToken, messageId })
let content = '<p>' + parsedMessage + '</p>'
content += '<p><br></p>'
content += '<p><a href="' + callLink + '" rel="noopener noreferrer" target="_blank">' + callLink + '</a></p>'
postNewNote(title, content).then(data => {
const noteUrl = generateUrl('apps/quicknotes/?n={noteId}', {noteId: data.id})
showSuccess(t('quicknotes', 'Message saved as a new note. <a target="_blank" rel="noreferrer noopener" href="{link}" >See that. ↗</a>', {
link: noteUrl,
}), {
isHTML: true,
})
})
},
})
})

View File

@@ -2,7 +2,8 @@ const path = require('path')
const webpackConfig = require('@nextcloud/webpack-vue-config') const webpackConfig = require('@nextcloud/webpack-vue-config')
webpackConfig.entry = { webpackConfig.entry = {
dashboard: { import: path.join(__dirname, 'src', 'dashboard.js') } dashboard: { import: path.join(__dirname, 'src', 'dashboard.js') },
talk: { import: path.join(__dirname, 'src', 'talk.js') }
} }
module.exports = webpackConfig module.exports = webpackConfig