gtsocial-umbx

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

use-shortcode.js (1718B)


      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 React = require("react");
     23 
     24 const query = require("../../../lib/query");
     25 const { useTextInput } = require("../../../lib/form");
     26 
     27 const shortcodeRegex = /^\w{2,30}$/;
     28 
     29 module.exports = function useShortcode() {
     30 	const {
     31 		data: emoji = []
     32 	} = query.useListEmojiQuery({ filter: "domain:local" });
     33 
     34 	const emojiCodes = React.useMemo(() => {
     35 		return new Set(emoji.map((e) => e.shortcode));
     36 	}, [emoji]);
     37 
     38 	return useTextInput("shortcode", {
     39 		validator: function validateShortcode(code) {
     40 			// technically invalid, but hacky fix to prevent validation error on page load
     41 			if (code == "") { return ""; }
     42 
     43 			if (emojiCodes.has(code)) {
     44 				return "Shortcode already in use";
     45 			}
     46 
     47 			if (code.length < 2 || code.length > 30) {
     48 				return "Shortcode must be between 2 and 30 characters";
     49 			}
     50 
     51 			if (!shortcodeRegex.test(code)) {
     52 				return "Shortcode must only contain letters, numbers, and underscores";
     53 			}
     54 
     55 			return "";
     56 		}
     57 	});
     58 };