| 
									
										
										
										
											2023-06-13 12:21:26 +02:00
										 |  |  | /* | 
					
						
							|  |  |  | 	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/>.
 | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-10-17 12:46:06 +02:00
										 |  |  | import { useRef, useMemo } from "react"; | 
					
						
							| 
									
										
										
										
											2023-06-13 12:21:26 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-10-17 12:46:06 +02:00
										 |  |  | import getFormMutations from "./get-form-mutations"; | 
					
						
							| 
									
										
										
										
											2023-06-13 12:21:26 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-10-17 12:46:06 +02:00
										 |  |  | import type { | 
					
						
							|  |  |  | 	CreateHookNames, | 
					
						
							|  |  |  | 	HookOpts, | 
					
						
							|  |  |  | 	FieldArrayInputHook, | 
					
						
							|  |  |  | 	HookedForm, | 
					
						
							|  |  |  | } from "./types"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function parseFields(entries: HookedForm[], length: number): HookedForm[] { | 
					
						
							|  |  |  | 	const fields: HookedForm[] = []; | 
					
						
							| 
									
										
										
										
											2023-06-13 12:21:26 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	for (let i = 0; i < length; i++) { | 
					
						
							|  |  |  | 		if (entries[i] != undefined) { | 
					
						
							|  |  |  | 			fields[i] = Object.assign({}, entries[i]); | 
					
						
							|  |  |  | 		} else { | 
					
						
							|  |  |  | 			fields[i] = {}; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return fields; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-16 18:28:56 +01:00
										 |  |  | export default function useFieldArrayInput( | 
					
						
							| 
									
										
										
										
											2023-10-17 12:46:06 +02:00
										 |  |  | 	{ name }: CreateHookNames, | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		initialValue, | 
					
						
							|  |  |  | 		length = 0, | 
					
						
							|  |  |  | 	}: HookOpts, | 
					
						
							|  |  |  | ): FieldArrayInputHook { | 
					
						
							|  |  |  | 	const _default: HookedForm[] = Array(length); | 
					
						
							|  |  |  | 	const fields = useRef<HookedForm[]>(_default); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	const value = useMemo( | 
					
						
							|  |  |  | 		() => parseFields(initialValue, length), | 
					
						
							|  |  |  | 		[initialValue, length], | 
					
						
							|  |  |  | 	); | 
					
						
							| 
									
										
										
										
											2023-06-13 12:21:26 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-10-17 12:46:06 +02:00
										 |  |  | 	function hasUpdate() {		 | 
					
						
							|  |  |  | 		return Object.values(fields.current).some((fieldSet) => { | 
					
						
							|  |  |  | 			const { updatedFields } = getFormMutations(fieldSet, { changedOnly: true }); | 
					
						
							|  |  |  | 			return updatedFields.length > 0; | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2023-06-13 12:21:26 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	return { | 
					
						
							| 
									
										
										
										
											2023-10-17 12:46:06 +02:00
										 |  |  | 		_default, | 
					
						
							| 
									
										
										
										
											2023-06-13 12:21:26 +02:00
										 |  |  | 		name, | 
					
						
							| 
									
										
										
										
											2023-10-17 12:46:06 +02:00
										 |  |  | 		Name: "", | 
					
						
							| 
									
										
										
										
											2023-06-13 12:21:26 +02:00
										 |  |  | 		value, | 
					
						
							|  |  |  | 		ctx: fields.current, | 
					
						
							|  |  |  | 		maxLength: length, | 
					
						
							| 
									
										
										
										
											2023-10-17 12:46:06 +02:00
										 |  |  | 		hasChanged: hasUpdate, | 
					
						
							| 
									
										
										
										
											2023-06-13 12:21:26 +02:00
										 |  |  | 		selectedValues() { | 
					
						
							| 
									
										
										
										
											2023-10-17 12:46:06 +02:00
										 |  |  | 			if (hasUpdate()) { | 
					
						
							| 
									
										
										
										
											2023-06-13 12:21:26 +02:00
										 |  |  | 				return Object.values(fields.current).map((fieldSet) => { | 
					
						
							|  |  |  | 					return getFormMutations(fieldSet, { changedOnly: false }).mutationData; | 
					
						
							|  |  |  | 				}); | 
					
						
							|  |  |  | 			} else { | 
					
						
							|  |  |  | 				return []; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	}; | 
					
						
							| 
									
										
										
										
											2023-10-17 12:46:06 +02:00
										 |  |  | } |