| 
									
										
										
										
											2023-02-03 12:07:40 +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-02-03 12:07:40 +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/>.
 | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-04-09 14:14:20 +02:00
										 |  |  | import React, { useRef } from "react"; | 
					
						
							| 
									
										
										
										
											2023-02-03 12:07:40 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-10-17 12:46:06 +02:00
										 |  |  | import { useEffect } from "react"; | 
					
						
							| 
									
										
										
										
											2024-04-24 12:12:47 +02:00
										 |  |  | import { useExportDomainListMutation } from "../../../lib/query/admin/domain-permissions/export"; | 
					
						
							|  |  |  | import useFormSubmit from "../../../lib/form/submit"; | 
					
						
							| 
									
										
										
										
											2023-10-17 12:46:06 +02:00
										 |  |  | import { | 
					
						
							|  |  |  | 	RadioGroup, | 
					
						
							| 
									
										
										
										
											2023-02-03 12:07:40 +01:00
										 |  |  | 	TextArea, | 
					
						
							|  |  |  | 	Select, | 
					
						
							| 
									
										
										
										
											2024-04-24 12:12:47 +02:00
										 |  |  | } from "../../../components/form/inputs"; | 
					
						
							|  |  |  | import MutationButton from "../../../components/form/mutation-button"; | 
					
						
							|  |  |  | import { Error } from "../../../components/error"; | 
					
						
							| 
									
										
										
										
											2023-10-17 12:46:06 +02:00
										 |  |  | import ExportFormatTable from "./export-format-table"; | 
					
						
							| 
									
										
										
										
											2023-02-03 12:07:40 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-10-17 12:46:06 +02:00
										 |  |  | import type { | 
					
						
							|  |  |  | 	FormSubmitFunction, | 
					
						
							|  |  |  | 	FormSubmitResult, | 
					
						
							|  |  |  | 	RadioFormInputHook, | 
					
						
							|  |  |  | 	TextFormInputHook, | 
					
						
							| 
									
										
										
										
											2024-04-24 12:12:47 +02:00
										 |  |  | } from "../../../lib/form/types"; | 
					
						
							| 
									
										
										
										
											2023-02-03 12:07:40 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-10-17 12:46:06 +02:00
										 |  |  | export interface ImportExportFormProps { | 
					
						
							|  |  |  | 	form: { | 
					
						
							|  |  |  | 		domains: TextFormInputHook; | 
					
						
							|  |  |  | 		exportType: TextFormInputHook; | 
					
						
							|  |  |  | 		permType: RadioFormInputHook; | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 	submitParse: FormSubmitFunction; | 
					
						
							|  |  |  | 	parseResult: FormSubmitResult; | 
					
						
							|  |  |  | }  | 
					
						
							| 
									
										
										
										
											2023-02-03 12:07:40 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-10-17 12:46:06 +02:00
										 |  |  | export default function ImportExportForm({ form, submitParse, parseResult }: ImportExportFormProps) { | 
					
						
							|  |  |  | 	const [submitExport, exportResult] = useFormSubmit(form, useExportDomainListMutation()); | 
					
						
							| 
									
										
										
										
											2023-02-03 12:07:40 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	function fileChanged(e) { | 
					
						
							|  |  |  | 		const reader = new FileReader(); | 
					
						
							|  |  |  | 		reader.onload = function (read) { | 
					
						
							| 
									
										
										
										
											2023-10-17 12:46:06 +02:00
										 |  |  | 			const res = read.target?.result; | 
					
						
							|  |  |  | 			if (typeof res === "string") { | 
					
						
							|  |  |  | 				form.domains.value = res; | 
					
						
							|  |  |  | 				submitParse(); | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2023-02-03 12:07:40 +01:00
										 |  |  | 		}; | 
					
						
							|  |  |  | 		reader.readAsText(e.target.files[0]); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-10-17 12:46:06 +02:00
										 |  |  | 	useEffect(() => { | 
					
						
							| 
									
										
										
										
											2023-02-03 12:07:40 +01:00
										 |  |  | 		if (exportResult.isSuccess) { | 
					
						
							|  |  |  | 			form.domains.setter(exportResult.data); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		/* eslint-disable-next-line react-hooks/exhaustive-deps */ | 
					
						
							|  |  |  | 	}, [exportResult]); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-04-09 14:14:20 +02:00
										 |  |  | 	const importFileRef = useRef<HTMLInputElement>(null); | 
					
						
							|  |  |  | 	const importFileOnClick = () => { | 
					
						
							|  |  |  | 		importFileRef.current?.click(); | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-02-03 12:07:40 +01:00
										 |  |  | 	return ( | 
					
						
							|  |  |  | 		<> | 
					
						
							| 
									
										
										
										
											2023-10-17 12:46:06 +02:00
										 |  |  | 			<h1>Import / Export domain permissions</h1> | 
					
						
							|  |  |  | 			<p>This page can be used to import and export lists of domain permissions.</p> | 
					
						
							|  |  |  | 			<p>Exports can be done in various formats, with varying functionality and support in other software.</p> | 
					
						
							|  |  |  | 			<p>Imports will automatically detect what format is being processed.</p> | 
					
						
							| 
									
										
										
										
											2023-02-03 12:07:40 +01:00
										 |  |  | 			<ExportFormatTable /> | 
					
						
							|  |  |  | 			<div className="import-export"> | 
					
						
							|  |  |  | 				<TextArea | 
					
						
							|  |  |  | 					field={form.domains} | 
					
						
							| 
									
										
										
										
											2024-07-08 09:38:27 +02:00
										 |  |  | 					label="Domains (newline-separated)" | 
					
						
							| 
									
										
										
										
											2023-02-03 12:07:40 +01:00
										 |  |  | 					placeholder={`google.com\nfacebook.com`} | 
					
						
							|  |  |  | 					rows={8} | 
					
						
							| 
									
										
										
										
											2024-07-08 09:38:27 +02:00
										 |  |  | 					autoCapitalize="none" | 
					
						
							|  |  |  | 					spellCheck="false" | 
					
						
							|  |  |  | 					className={"monospace"} | 
					
						
							| 
									
										
										
										
											2023-02-03 12:07:40 +01:00
										 |  |  | 				/> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-10-17 12:46:06 +02:00
										 |  |  | 				<RadioGroup | 
					
						
							|  |  |  | 					field={form.permType} | 
					
						
							|  |  |  | 				/> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-02-03 12:07:40 +01:00
										 |  |  | 				<div className="button-grid"> | 
					
						
							|  |  |  | 					<MutationButton | 
					
						
							|  |  |  | 						label="Import" | 
					
						
							|  |  |  | 						type="button" | 
					
						
							|  |  |  | 						onClick={() => submitParse()} | 
					
						
							|  |  |  | 						result={parseResult} | 
					
						
							|  |  |  | 						showError={false} | 
					
						
							| 
									
										
										
										
											2024-04-13 13:25:10 +02:00
										 |  |  | 						disabled={form.permType.value === undefined || form.permType.value.length === 0} | 
					
						
							| 
									
										
										
										
											2023-02-03 12:07:40 +01:00
										 |  |  | 					/> | 
					
						
							| 
									
										
										
										
											2025-04-09 14:14:20 +02:00
										 |  |  | 					<label | 
					
						
							|  |  |  | 						className={`button with-icon${form.permType.value === undefined || form.permType.value.length === 0 ? " disabled" : ""}`} | 
					
						
							|  |  |  | 						tabIndex={0} | 
					
						
							|  |  |  | 						onClick={importFileOnClick} | 
					
						
							|  |  |  | 						onKeyDown={e => e.key === "Enter" && importFileOnClick()} | 
					
						
							|  |  |  | 						role="button" | 
					
						
							|  |  |  | 					> | 
					
						
							| 
									
										
										
										
											2023-03-29 12:18:45 +02:00
										 |  |  | 						<i className="fa fa-fw " aria-hidden="true" /> | 
					
						
							| 
									
										
										
										
											2023-02-03 12:07:40 +01:00
										 |  |  | 						Import file | 
					
						
							|  |  |  | 						<input | 
					
						
							|  |  |  | 							type="file" | 
					
						
							|  |  |  | 							className="hidden" | 
					
						
							|  |  |  | 							onChange={fileChanged} | 
					
						
							|  |  |  | 							accept="application/json,text/plain,text/csv" | 
					
						
							| 
									
										
										
										
											2024-04-13 13:25:10 +02:00
										 |  |  | 							disabled={form.permType.value === undefined || form.permType.value.length === 0} | 
					
						
							| 
									
										
										
										
											2025-04-09 14:14:20 +02:00
										 |  |  | 							ref={importFileRef} | 
					
						
							| 
									
										
										
										
											2023-02-03 12:07:40 +01:00
										 |  |  | 						/> | 
					
						
							|  |  |  | 					</label> | 
					
						
							|  |  |  | 					<b /> {/* grid filler */} | 
					
						
							|  |  |  | 					<MutationButton | 
					
						
							|  |  |  | 						label="Export" | 
					
						
							|  |  |  | 						type="button" | 
					
						
							|  |  |  | 						onClick={() => submitExport("export")} | 
					
						
							|  |  |  | 						result={exportResult} showError={false} | 
					
						
							| 
									
										
										
										
											2024-04-13 13:25:10 +02:00
										 |  |  | 						disabled={form.permType.value === undefined || form.permType.value.length === 0} | 
					
						
							| 
									
										
										
										
											2023-02-03 12:07:40 +01:00
										 |  |  | 					/> | 
					
						
							| 
									
										
										
										
											2023-03-11 10:49:44 +01:00
										 |  |  | 					<MutationButton | 
					
						
							|  |  |  | 						label="Export to file" | 
					
						
							|  |  |  | 						wrapperClassName="export-file-button" | 
					
						
							|  |  |  | 						type="button" | 
					
						
							|  |  |  | 						onClick={() => submitExport("export-file")} | 
					
						
							|  |  |  | 						result={exportResult} | 
					
						
							|  |  |  | 						showError={false} | 
					
						
							| 
									
										
										
										
											2024-04-13 13:25:10 +02:00
										 |  |  | 						disabled={form.permType.value === undefined || form.permType.value.length === 0} | 
					
						
							| 
									
										
										
										
											2023-03-11 10:49:44 +01:00
										 |  |  | 					/> | 
					
						
							| 
									
										
										
										
											2023-02-03 12:07:40 +01:00
										 |  |  | 					<div className="export-file"> | 
					
						
							|  |  |  | 						<span> | 
					
						
							|  |  |  | 							as | 
					
						
							|  |  |  | 						</span> | 
					
						
							|  |  |  | 						<Select | 
					
						
							|  |  |  | 							field={form.exportType} | 
					
						
							|  |  |  | 							options={<> | 
					
						
							|  |  |  | 								<option value="plain">Text</option> | 
					
						
							|  |  |  | 								<option value="json">JSON</option> | 
					
						
							|  |  |  | 								<option value="csv">CSV</option> | 
					
						
							|  |  |  | 							</>} | 
					
						
							|  |  |  | 						/> | 
					
						
							|  |  |  | 					</div> | 
					
						
							|  |  |  | 				</div> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				{parseResult.error && <Error error={parseResult.error} />} | 
					
						
							|  |  |  | 				{exportResult.error && <Error error={exportResult.error} />} | 
					
						
							|  |  |  | 			</div> | 
					
						
							|  |  |  | 		</> | 
					
						
							|  |  |  | 	); | 
					
						
							| 
									
										
										
										
											2023-10-17 12:46:06 +02:00
										 |  |  | } |