From e9bb7ddd3aa11da5c48a75c4a600f8fe5cc1c990 Mon Sep 17 00:00:00 2001
From: tobi <31960611+tsmethurst@users.noreply.github.com>
Date: Sun, 5 Jan 2025 13:20:33 +0100
Subject: [feature] Create/update/remove domain permission subscriptions
 (#3623)

* [feature] Create/update/remove domain permission subscriptions

* lint

* envparsing

* remove errant fmt.Println

* create drafts, subs, exclude, from snapshot models

* name etag column correctly

* remove count column

* lint
---
 web/source/settings/lib/form/number.tsx | 104 ++++++++++++++++++++++++++++++++
 1 file changed, 104 insertions(+)
 create mode 100644 web/source/settings/lib/form/number.tsx

(limited to 'web/source/settings/lib/form/number.tsx')

diff --git a/web/source/settings/lib/form/number.tsx b/web/source/settings/lib/form/number.tsx
new file mode 100644
index 000000000..15acf162a
--- /dev/null
+++ b/web/source/settings/lib/form/number.tsx
@@ -0,0 +1,104 @@
+/*
+	GoToSocial
+	Copyright (C) GoToSocial Authors admin@gotosocial.org
+	SPDX-License-Identifier: AGPL-3.0-or-later
+
+	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 <http://www.gnu.org/licenses/>.
+*/
+
+import React, {
+	useState,
+	useRef,
+	useTransition,
+	useEffect,
+} from "react";
+
+import type {
+	CreateHookNames,
+	HookOpts,
+	NumberFormInputHook,
+} from "./types";
+
+const _default = 0;
+
+export default function useNumberInput(
+	{ name, Name }: CreateHookNames,
+	{
+		initialValue = _default,
+		dontReset = false,
+		validator,
+		showValidation = true,
+		initValidation,
+		nosubmit = false,
+	}: HookOpts<number>
+): NumberFormInputHook {
+	const [number, setNumber] = useState(initialValue);
+	const numberRef = useRef<HTMLInputElement>(null);
+
+	const [validation, setValidation] = useState(initValidation ?? "");
+	const [_isValidating, startValidation] = useTransition();
+	const valid = validation == "";
+
+	function onChange(e: React.ChangeEvent<HTMLInputElement>) {
+		const input = e.target.valueAsNumber;
+		setNumber(input);
+
+		if (validator) {
+			startValidation(() => {
+				setValidation(validator(input));
+			});
+		}
+	}
+
+	function reset() {
+		if (!dontReset) {
+			setNumber(initialValue);
+		}
+	}
+
+	useEffect(() => {
+		if (validator && numberRef.current) {
+			if (showValidation) {
+				numberRef.current.setCustomValidity(validation);
+			} else {
+				numberRef.current.setCustomValidity("");
+			}
+		}
+	}, [validation, validator, showValidation]);
+
+	// Array / Object hybrid, for easier access in different contexts
+	return Object.assign([
+		onChange,
+		reset,
+		{
+			[name]: number,
+			[`${name}Ref`]: numberRef,
+			[`set${Name}`]: setNumber,
+			[`${name}Valid`]: valid,
+		}
+	], {
+		onChange,
+		reset,
+		name,
+		Name: "", // Will be set by inputHook function.
+		nosubmit,
+		value: number,
+		ref: numberRef,
+		setter: setNumber,
+		valid,
+		validate: () => setValidation(validator ? validator(number): ""),
+		hasChanged: () => number != initialValue,
+		_default
+	});
+}
-- 
cgit v1.2.3

