diff --git a/src/components/PluginSettings/PluginModal.tsx b/src/components/PluginSettings/PluginModal.tsx index 908876f89..970eb5251 100644 --- a/src/components/PluginSettings/PluginModal.tsx +++ b/src/components/PluginSettings/PluginModal.tsx @@ -67,6 +67,7 @@ export default function PluginModal({ plugin, onRestartNeeded, onClose, transiti const [tempSettings, setTempSettings] = React.useState>({}); const [errors, setErrors] = React.useState>({}); + const [saveError, setSaveError] = React.useState(null); const canSubmit = () => Object.values(errors).every(e => !e); @@ -79,11 +80,20 @@ export default function PluginModal({ plugin, onRestartNeeded, onClose, transiti })(); }, []); - function saveAndClose() { + async function saveAndClose() { if (!plugin.options) { onClose(); return; } + + if (plugin.beforeSave) { + const result = await Promise.resolve(plugin.beforeSave(tempSettings)); + if (result !== true) { + setSaveError(result); + return; + } + } + let restartNeeded = false; for (const [key, value] of Object.entries(tempSettings)) { const option = plugin.options[key]; @@ -195,28 +205,31 @@ export default function PluginModal({ plugin, onRestartNeeded, onClose, transiti - - - - {({ onMouseEnter, onMouseLeave }) => ( - - )} - + + + + + {({ onMouseEnter, onMouseLeave }) => ( + + )} + + + {saveError && Error while saving: {saveError}} diff --git a/src/utils/types.ts b/src/utils/types.ts index 1916f9be3..41dd0c1cd 100644 --- a/src/utils/types.ts +++ b/src/utils/types.ts @@ -16,6 +16,8 @@ * along with this program. If not, see . */ +import { Promisable } from "type-fest"; + import { Command } from "../api/Commands"; // exists to export default definePlugin({...}) @@ -75,6 +77,11 @@ interface PluginDef { * Optionally provide settings that the user can configure in the Plugins tab of settings. */ options?: Record; + /** + * Check that this returns true before allowing a save to complete. + * If a string is returned, show the error to the user. + */ + beforeSave?(options: Record): Promisable; /** * Allows you to specify a custom Component that will be rendered in your * plugin's settings page