submit.js (1970B)
1 /* 2 GoToSocial 3 Copyright (C) GoToSocial Authors admin@gotosocial.org 4 SPDX-License-Identifier: AGPL-3.0-or-later 5 6 This program is free software: you can redistribute it and/or modify 7 it under the terms of the GNU Affero General Public License as published by 8 the Free Software Foundation, either version 3 of the License, or 9 (at your option) any later version. 10 11 This program is distributed in the hope that it will be useful, 12 but WITHOUT ANY WARRANTY; without even the implied warranty of 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 GNU Affero General Public License for more details. 15 16 You should have received a copy of the GNU Affero General Public License 17 along with this program. If not, see <http://www.gnu.org/licenses/>. 18 */ 19 20 "use strict"; 21 22 const Promise = require("bluebird"); 23 const React = require("react"); 24 const getFormMutations = require("./get-form-mutations"); 25 26 module.exports = function useFormSubmit(form, mutationQuery, { changedOnly = true, onFinish } = {}) { 27 if (!Array.isArray(mutationQuery)) { 28 throw new ("useFormSubmit: mutationQuery was not an Array. Is a valid useMutation RTK Query provided?"); 29 } 30 const [runMutation, result] = mutationQuery; 31 const usedAction = React.useRef(null); 32 return [ 33 function submitForm(e) { 34 let action; 35 if (e?.preventDefault) { 36 e.preventDefault(); 37 action = e.nativeEvent.submitter.name; 38 } else { 39 action = e; 40 } 41 42 if (action == "") { 43 action = undefined; 44 } 45 usedAction.current = action; 46 // transform the field definitions into an object with just their values 47 48 const { mutationData, updatedFields } = getFormMutations(form, { changedOnly }); 49 50 if (updatedFields.length == 0) { 51 return; 52 } 53 54 mutationData.action = action; 55 56 return Promise.try(() => { 57 return runMutation(mutationData); 58 }).then((res) => { 59 if (onFinish) { 60 return onFinish(res); 61 } 62 }); 63 }, 64 { 65 ...result, 66 action: usedAction.current 67 } 68 ]; 69 };