| 
									
										
										
										
											2023-01-18 14:45:14 +01:00
										 |  |  | /* | 
					
						
							|  |  |  | 	GoToSocial | 
					
						
							| 
									
										
										
										
											2023-03-12 18:49:06 +01:00
										 |  |  | 	Copyright (C) GoToSocial Authors admin@gotosocial.org | 
					
						
							|  |  |  | 	SPDX-License-Identifier: AGPL-3.0-or-later | 
					
						
							| 
									
										
										
										
											2023-01-18 14:45:14 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	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/>.
 | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-10-17 12:46:06 +02:00
										 |  |  | import React from "react"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import type { | 
					
						
							|  |  |  | 	ReactNode, | 
					
						
							|  |  |  | 	RefObject, | 
					
						
							|  |  |  | } from "react"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import type { | 
					
						
							|  |  |  | 	FileFormInputHook, | 
					
						
							|  |  |  | 	RadioFormInputHook, | 
					
						
							|  |  |  | 	TextFormInputHook, | 
					
						
							|  |  |  | } from "../../lib/form/types"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | export interface TextInputProps extends React.DetailedHTMLProps< | 
					
						
							|  |  |  | 	React.InputHTMLAttributes<HTMLInputElement>, | 
					
						
							|  |  |  | 	HTMLInputElement | 
					
						
							|  |  |  | > { | 
					
						
							|  |  |  | 	label?: string; | 
					
						
							|  |  |  | 	field: TextFormInputHook; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2023-01-18 14:45:14 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-10-17 12:46:06 +02:00
										 |  |  | export function TextInput({label, field, ...props}: TextInputProps) { | 
					
						
							| 
									
										
										
										
											2023-01-18 14:45:14 +01:00
										 |  |  | 	const { onChange, value, ref } = field; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return ( | 
					
						
							| 
									
										
										
										
											2023-02-03 12:07:40 +01:00
										 |  |  | 		<div className={`form-field text${field.valid ? "" : " invalid"}`}> | 
					
						
							| 
									
										
										
										
											2023-01-18 14:45:14 +01:00
										 |  |  | 			<label> | 
					
						
							|  |  |  | 				{label} | 
					
						
							|  |  |  | 				<input | 
					
						
							| 
									
										
										
										
											2023-10-17 12:46:06 +02:00
										 |  |  | 					onChange={onChange} | 
					
						
							|  |  |  | 					value={value} | 
					
						
							|  |  |  | 					ref={ref as RefObject<HTMLInputElement>} | 
					
						
							|  |  |  | 					{...props} | 
					
						
							| 
									
										
										
										
											2023-01-18 14:45:14 +01:00
										 |  |  | 				/> | 
					
						
							|  |  |  | 			</label> | 
					
						
							|  |  |  | 		</div> | 
					
						
							|  |  |  | 	); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-10-17 12:46:06 +02:00
										 |  |  | export interface TextAreaProps extends React.DetailedHTMLProps< | 
					
						
							|  |  |  | 	React.TextareaHTMLAttributes<HTMLTextAreaElement>, | 
					
						
							|  |  |  | 	HTMLTextAreaElement | 
					
						
							|  |  |  | > { | 
					
						
							|  |  |  | 	label?: string; | 
					
						
							|  |  |  | 	field: TextFormInputHook; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | export function TextArea({label, field, ...props}: TextAreaProps) { | 
					
						
							| 
									
										
										
										
											2023-01-18 14:45:14 +01:00
										 |  |  | 	const { onChange, value, ref } = field; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return ( | 
					
						
							|  |  |  | 		<div className="form-field textarea"> | 
					
						
							|  |  |  | 			<label> | 
					
						
							|  |  |  | 				{label} | 
					
						
							|  |  |  | 				<textarea | 
					
						
							| 
									
										
										
										
											2023-10-17 12:46:06 +02:00
										 |  |  | 					onChange={onChange} | 
					
						
							|  |  |  | 					value={value} | 
					
						
							|  |  |  | 					ref={ref as RefObject<HTMLTextAreaElement>} | 
					
						
							|  |  |  | 					{...props} | 
					
						
							| 
									
										
										
										
											2023-01-18 14:45:14 +01:00
										 |  |  | 				/> | 
					
						
							|  |  |  | 			</label> | 
					
						
							|  |  |  | 		</div> | 
					
						
							|  |  |  | 	); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-10-17 12:46:06 +02:00
										 |  |  | export interface FileInputProps extends React.DetailedHTMLProps< | 
					
						
							|  |  |  | 	React.InputHTMLAttributes<HTMLInputElement>, | 
					
						
							|  |  |  | 	HTMLInputElement | 
					
						
							|  |  |  | > { | 
					
						
							|  |  |  | 	label?: string; | 
					
						
							|  |  |  | 	field: FileFormInputHook; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | export function FileInput({ label, field, ...props }: FileInputProps) { | 
					
						
							| 
									
										
										
										
											2023-01-18 14:45:14 +01:00
										 |  |  | 	const { onChange, ref, infoComponent } = field; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return ( | 
					
						
							|  |  |  | 		<div className="form-field file"> | 
					
						
							|  |  |  | 			<label> | 
					
						
							|  |  |  | 				<div className="label">{label}</div> | 
					
						
							|  |  |  | 				<div className="file-input button">Browse</div> | 
					
						
							|  |  |  | 				{infoComponent} | 
					
						
							|  |  |  | 				{/* <a onClick={removeFile("header")}>remove</a> */} | 
					
						
							|  |  |  | 				<input | 
					
						
							|  |  |  | 					type="file" | 
					
						
							|  |  |  | 					className="hidden" | 
					
						
							| 
									
										
										
										
											2023-10-17 12:46:06 +02:00
										 |  |  | 					onChange={onChange} | 
					
						
							|  |  |  | 					ref={ref ? ref as RefObject<HTMLInputElement> : undefined} | 
					
						
							|  |  |  | 					{...props} | 
					
						
							| 
									
										
										
										
											2023-01-18 14:45:14 +01:00
										 |  |  | 				/> | 
					
						
							|  |  |  | 			</label> | 
					
						
							|  |  |  | 		</div> | 
					
						
							|  |  |  | 	); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-10-17 12:46:06 +02:00
										 |  |  | export function Checkbox({ label, field, ...inputProps }) { | 
					
						
							| 
									
										
										
										
											2023-01-18 14:45:14 +01:00
										 |  |  | 	const { onChange, value } = field; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return ( | 
					
						
							|  |  |  | 		<div className="form-field checkbox"> | 
					
						
							|  |  |  | 			<label> | 
					
						
							|  |  |  | 				<input | 
					
						
							|  |  |  | 					type="checkbox" | 
					
						
							|  |  |  | 					checked={value} | 
					
						
							|  |  |  | 					onChange={onChange} | 
					
						
							|  |  |  | 					{...inputProps} | 
					
						
							|  |  |  | 				/> {label} | 
					
						
							|  |  |  | 			</label> | 
					
						
							|  |  |  | 		</div> | 
					
						
							|  |  |  | 	); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-10-17 12:46:06 +02:00
										 |  |  | export interface SelectProps extends React.DetailedHTMLProps< | 
					
						
							|  |  |  | 	React.SelectHTMLAttributes<HTMLSelectElement>, | 
					
						
							|  |  |  | 	HTMLSelectElement | 
					
						
							|  |  |  | > { | 
					
						
							|  |  |  | 	label?: string; | 
					
						
							|  |  |  | 	field: TextFormInputHook; | 
					
						
							|  |  |  | 	children?: ReactNode; | 
					
						
							|  |  |  | 	options: React.JSX.Element; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | export function Select({ label, field, children, options, ...props }: SelectProps) { | 
					
						
							| 
									
										
										
										
											2023-01-18 14:45:14 +01:00
										 |  |  | 	const { onChange, value, ref } = field; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return ( | 
					
						
							|  |  |  | 		<div className="form-field select"> | 
					
						
							|  |  |  | 			<label> | 
					
						
							| 
									
										
										
										
											2023-10-17 12:46:06 +02:00
										 |  |  | 				{label} | 
					
						
							|  |  |  | 				{children} | 
					
						
							| 
									
										
										
										
											2023-01-18 14:45:14 +01:00
										 |  |  | 				<select | 
					
						
							| 
									
										
										
										
											2023-10-17 12:46:06 +02:00
										 |  |  | 					onChange={onChange} | 
					
						
							|  |  |  | 					value={value} | 
					
						
							|  |  |  | 					ref={ref as RefObject<HTMLSelectElement>} | 
					
						
							|  |  |  | 					{...props} | 
					
						
							| 
									
										
										
										
											2023-01-18 14:45:14 +01:00
										 |  |  | 				> | 
					
						
							|  |  |  | 					{options} | 
					
						
							|  |  |  | 				</select> | 
					
						
							|  |  |  | 			</label> | 
					
						
							|  |  |  | 		</div> | 
					
						
							|  |  |  | 	); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-10-17 12:46:06 +02:00
										 |  |  | export interface RadioGroupProps extends React.DetailedHTMLProps< | 
					
						
							|  |  |  | 	React.InputHTMLAttributes<HTMLInputElement>, | 
					
						
							|  |  |  | 	HTMLInputElement | 
					
						
							|  |  |  | > { | 
					
						
							|  |  |  | 	label?: string; | 
					
						
							|  |  |  | 	field: RadioFormInputHook; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | export function RadioGroup({ label, field, ...props }: RadioGroupProps) { | 
					
						
							| 
									
										
										
										
											2023-01-18 14:45:14 +01:00
										 |  |  | 	return ( | 
					
						
							|  |  |  | 		<div className="form-field radio"> | 
					
						
							|  |  |  | 			{Object.entries(field.options).map(([value, radioLabel]) => ( | 
					
						
							|  |  |  | 				<label key={value}> | 
					
						
							|  |  |  | 					<input | 
					
						
							|  |  |  | 						type="radio" | 
					
						
							|  |  |  | 						name={field.name} | 
					
						
							|  |  |  | 						value={value} | 
					
						
							|  |  |  | 						checked={field.value == value} | 
					
						
							|  |  |  | 						onChange={field.onChange} | 
					
						
							| 
									
										
										
										
											2023-10-17 12:46:06 +02:00
										 |  |  | 						{...props} | 
					
						
							| 
									
										
										
										
											2023-01-18 14:45:14 +01:00
										 |  |  | 					/> | 
					
						
							|  |  |  | 					{radioLabel} | 
					
						
							|  |  |  | 				</label> | 
					
						
							|  |  |  | 			))} | 
					
						
							|  |  |  | 			{label} | 
					
						
							|  |  |  | 		</div> | 
					
						
							|  |  |  | 	); | 
					
						
							|  |  |  | } |