Plugin system (#6479)

* wip

* wip

* wip

* wip

* Update store.ts
This commit is contained in:
syuilo
2020-07-12 00:38:55 +09:00
committed by GitHub
parent debc0086fa
commit 9b73e897df
13 changed files with 293 additions and 17 deletions

View File

@@ -3,6 +3,7 @@ import createPersistedState from 'vuex-persistedstate';
import * as nestedProperty from 'nested-property';
import { faTerminal, faHashtag, faBroadcastTower, faFireAlt, faSearch, faStar, faAt, faListUl, faUserClock, faUsers, faCloud, faGamepad, faFileAlt, faSatellite, faDoorClosed, faColumns } from '@fortawesome/free-solid-svg-icons';
import { faBell, faEnvelope, faComments } from '@fortawesome/free-regular-svg-icons';
import { AiScript, utils, values } from '@syuilo/aiscript';
import { apiUrl, deckmode } from './config';
import { erase } from '../prelude/array';
@@ -43,6 +44,7 @@ export const defaultDeviceUserSettings = {
columns: [],
layout: [],
},
plugins: [],
};
export const defaultDeviceSettings = {
@@ -93,7 +95,13 @@ export default () => new Vuex.Store({
state: {
i: null,
pendingApiRequestsCount: 0,
spinner: null
spinner: null,
// Plugin
pluginContexts: new Map<string, AiScript>(),
postFormActions: [],
userActions: [],
noteActions: [],
},
getters: {
@@ -224,8 +232,38 @@ export default () => new Vuex.Store({
state.i = x;
},
updateIKeyValue(state, x) {
state.i[x.key] = x.value;
updateIKeyValue(state, { key, value }) {
state.i[key] = value;
},
initPlugin(state, { plugin, aiscript }) {
state.pluginContexts.set(plugin.id, aiscript);
},
registerPostFormAction(state, { pluginId, title, handler }) {
state.postFormActions.push({
title, handler: (form, update) => {
state.pluginContexts.get(pluginId).execFn(handler, [utils.jsToVal(form), values.FN_NATIVE(([key, value]) => {
update(key.value, value.value);
})]);
}
});
},
registerUserAction(state, { pluginId, title, handler }) {
state.userActions.push({
title, handler: (user) => {
state.pluginContexts.get(pluginId).execFn(handler, [utils.jsToVal(user)]);
}
});
},
registerNoteAction(state, { pluginId, title, handler }) {
state.noteActions.push({
title, handler: (note) => {
state.pluginContexts.get(pluginId).execFn(handler, [utils.jsToVal(note)]);
}
});
},
},
@@ -546,6 +584,21 @@ export default () => new Vuex.Store({
column = x;
},
//#endregion
installPlugin(state, { meta, ast }) {
state.plugins.push({
id: meta.id,
name: meta.name,
version: meta.version,
author: meta.author,
description: meta.description,
ast: ast
});
},
uninstallPlugin(state, id) {
state.plugins = state.plugins.filter(x => x.id != id);
},
}
},