/* GoToSocial Copyright (C) 2021-2022 GoToSocial Authors admin@gotosocial.org This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ "use strict"; const React = require("react"); const Redux = require("react-redux"); const d = require("dotty"); const prettierBytes = require("prettier-bytes"); function eventListeners(dispatch, setter, obj) { return { onTextChange: function (key) { return function (e) { dispatch(setter([key, e.target.value])); }; }, onCheckChange: function (key) { return function (e) { dispatch(setter([key, e.target.checked])); }; }, onFileChange: function (key, withPreview) { return function (e) { let file = e.target.files[0]; if (withPreview) { let old = d.get(obj, key); if (old != undefined) { URL.revokeObjectURL(old); // no error revoking a non-Object URL as provided by instance } let objectURL = URL.createObjectURL(file); dispatch(setter([key, objectURL])); } dispatch(setter([`${key}File`, file])); }; } }; } function get(state, id, defaultVal) { let value; if (id.includes(".")) { value = d.get(state, id); } else { value = state[id]; } if (value == undefined) { value = defaultVal; } return value; } // function removeFile(name) { // return function(e) { // e.preventDefault(); // dispatch(user.setProfileVal([name, ""])); // dispatch(user.setProfileVal([`${name}File`, ""])); // }; // } module.exports = { formFields: function formFields(setter, selector) { function FormField({ type, id, name, className="", placeHolder="", fileType="", children=null, options=null, inputProps={}, withPreview=true, showSize=false, maxSize=Infinity }) { const dispatch = Redux.useDispatch(); let state = Redux.useSelector(selector); let { onTextChange, onCheckChange, onFileChange } = eventListeners(dispatch, setter, state); let field; let defaultLabel = true; if (type == "text") { field = ; } else if (type == "textarea") { field =