| 
									
										
										
										
											2022-11-08 17:51:44 +01:00
										 |  |  | /* | 
					
						
							|  |  |  | 	GoToSocial | 
					
						
							| 
									
										
										
										
											2023-01-05 12:43:00 +01:00
										 |  |  | 	Copyright (C) 2021-2023 GoToSocial Authors admin@gotosocial.org | 
					
						
							| 
									
										
										
										
											2022-11-08 17:51:44 +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/>.
 | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | "use strict"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const React = require("react"); | 
					
						
							|  |  |  | const { useRoute, Link, Redirect } = require("wouter"); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-01-18 14:45:14 +01:00
										 |  |  | const query = require("../../../lib/query"); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const { useComboBoxInput, useFileInput, useValue } = require("../../../lib/form"); | 
					
						
							| 
									
										
										
										
											2022-12-11 16:00:23 +01:00
										 |  |  | const { CategorySelect } = require("../category-select"); | 
					
						
							| 
									
										
										
										
											2022-11-08 17:51:44 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-01-18 14:45:14 +01:00
										 |  |  | const useFormSubmit = require("../../../lib/form/submit"); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-12-11 16:00:23 +01:00
										 |  |  | const FakeToot = require("../../../components/fake-toot"); | 
					
						
							| 
									
										
										
										
											2023-01-18 14:45:14 +01:00
										 |  |  | const FormWithData = require("../../../lib/form/form-with-data"); | 
					
						
							| 
									
										
										
										
											2022-12-11 16:00:23 +01:00
										 |  |  | const Loading = require("../../../components/loading"); | 
					
						
							| 
									
										
										
										
											2023-01-18 14:45:14 +01:00
										 |  |  | const { FileInput } = require("../../../components/form/inputs"); | 
					
						
							|  |  |  | const MutationButton = require("../../../components/form/mutation-button"); | 
					
						
							|  |  |  | const { Error } = require("../../../components/error"); | 
					
						
							| 
									
										
										
										
											2022-11-08 17:51:44 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-12-11 16:00:23 +01:00
										 |  |  | const base = "/settings/custom-emoji/local"; | 
					
						
							| 
									
										
										
										
											2022-11-08 17:51:44 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-25 15:49:48 +01:00
										 |  |  | module.exports = function EmojiDetailRoute() { | 
					
						
							|  |  |  | 	let [_match, params] = useRoute(`${base}/:emojiId`); | 
					
						
							|  |  |  | 	if (params?.emojiId == undefined) { | 
					
						
							| 
									
										
										
										
											2023-01-18 14:45:14 +01:00
										 |  |  | 		return <Redirect to={base} />; | 
					
						
							| 
									
										
										
										
											2022-11-25 15:49:48 +01:00
										 |  |  | 	} else { | 
					
						
							|  |  |  | 		return ( | 
					
						
							|  |  |  | 			<div className="emoji-detail"> | 
					
						
							|  |  |  | 				<Link to={base}><a>< go back</a></Link> | 
					
						
							| 
									
										
										
										
											2023-01-18 14:45:14 +01:00
										 |  |  | 				<FormWithData dataQuery={query.useGetEmojiQuery} queryArg={params.emojiId} DataForm={EmojiDetailForm} /> | 
					
						
							| 
									
										
										
										
											2022-11-25 15:49:48 +01:00
										 |  |  | 			</div> | 
					
						
							|  |  |  | 		); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-01-18 14:45:14 +01:00
										 |  |  | function EmojiDetailForm({ data: emoji }) { | 
					
						
							|  |  |  | 	const form = { | 
					
						
							|  |  |  | 		id: useValue("id", emoji.id), | 
					
						
							| 
									
										
										
										
											2023-02-06 09:19:56 +01:00
										 |  |  | 		category: useComboBoxInput("category", { source: emoji }), | 
					
						
							| 
									
										
										
										
											2023-01-18 14:45:14 +01:00
										 |  |  | 		image: useFileInput("image", { | 
					
						
							|  |  |  | 			withPreview: true, | 
					
						
							|  |  |  | 			maxSize: 50 * 1024 // TODO: get from instance api
 | 
					
						
							|  |  |  | 		}) | 
					
						
							|  |  |  | 	}; | 
					
						
							| 
									
										
										
										
											2022-11-25 15:49:48 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-01-18 14:45:14 +01:00
										 |  |  | 	const [modifyEmoji, result] = useFormSubmit(form, query.useEditEmojiMutation()); | 
					
						
							| 
									
										
										
										
											2022-11-25 15:49:48 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-01-18 14:45:14 +01:00
										 |  |  | 	// Automatic submitting of category change
 | 
					
						
							|  |  |  | 	React.useEffect(() => { | 
					
						
							|  |  |  | 		if ( | 
					
						
							|  |  |  | 			form.category.hasChanged() && | 
					
						
							|  |  |  | 			!form.category.state.open && | 
					
						
							|  |  |  | 			!form.category.isNew) { | 
					
						
							|  |  |  | 			modifyEmoji(); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		/* eslint-disable-next-line react-hooks/exhaustive-deps */ | 
					
						
							|  |  |  | 	}, [form.category.hasChanged(), form.category.isNew, form.category.state.open]); | 
					
						
							| 
									
										
										
										
											2022-11-25 15:49:48 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-01-18 14:45:14 +01:00
										 |  |  | 	const [deleteEmoji, deleteResult] = query.useDeleteEmojiMutation(); | 
					
						
							| 
									
										
										
										
											2022-11-08 17:51:44 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-01-18 14:45:14 +01:00
										 |  |  | 	if (deleteResult.isSuccess) { | 
					
						
							|  |  |  | 		return <Redirect to={base} />; | 
					
						
							| 
									
										
										
										
											2022-11-25 15:49:48 +01:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-08 17:51:44 +01:00
										 |  |  | 	return ( | 
					
						
							| 
									
										
										
										
											2022-11-25 15:49:48 +01:00
										 |  |  | 		<> | 
					
						
							|  |  |  | 			<div className="emoji-header"> | 
					
						
							| 
									
										
										
										
											2023-01-18 14:45:14 +01:00
										 |  |  | 				<img src={emoji.url} alt={emoji.shortcode} title={emoji.shortcode} /> | 
					
						
							| 
									
										
										
										
											2022-11-25 15:49:48 +01:00
										 |  |  | 				<div> | 
					
						
							|  |  |  | 					<h2>{emoji.shortcode}</h2> | 
					
						
							| 
									
										
										
										
											2023-01-18 14:45:14 +01:00
										 |  |  | 					<MutationButton | 
					
						
							|  |  |  | 						label="Delete" | 
					
						
							|  |  |  | 						type="button" | 
					
						
							|  |  |  | 						onClick={() => deleteEmoji(emoji.id)} | 
					
						
							|  |  |  | 						className="danger" | 
					
						
							|  |  |  | 						showError={false} | 
					
						
							|  |  |  | 						result={deleteResult} | 
					
						
							|  |  |  | 					/> | 
					
						
							| 
									
										
										
										
											2022-11-25 15:49:48 +01:00
										 |  |  | 				</div> | 
					
						
							|  |  |  | 			</div> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-01-18 14:45:14 +01:00
										 |  |  | 			<form onSubmit={modifyEmoji} className="left-border"> | 
					
						
							|  |  |  | 				<h2>Modify this emoji {result.isLoading && <Loading />}</h2> | 
					
						
							| 
									
										
										
										
											2022-11-25 15:49:48 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 				<div className="update-category"> | 
					
						
							|  |  |  | 					<CategorySelect | 
					
						
							| 
									
										
										
										
											2023-01-18 14:45:14 +01:00
										 |  |  | 						field={form.category} | 
					
						
							| 
									
										
										
										
											2022-11-25 15:49:48 +01:00
										 |  |  | 					> | 
					
						
							| 
									
										
										
										
											2023-01-18 14:45:14 +01:00
										 |  |  | 						<MutationButton | 
					
						
							|  |  |  | 							name="create-category" | 
					
						
							|  |  |  | 							label="Create" | 
					
						
							|  |  |  | 							result={result} | 
					
						
							|  |  |  | 							showError={false} | 
					
						
							|  |  |  | 							style={{ visibility: (form.category.isNew ? "initial" : "hidden") }} | 
					
						
							|  |  |  | 						/> | 
					
						
							| 
									
										
										
										
											2022-11-25 15:49:48 +01:00
										 |  |  | 					</CategorySelect> | 
					
						
							|  |  |  | 				</div> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				<div className="update-image"> | 
					
						
							| 
									
										
										
										
											2023-01-18 14:45:14 +01:00
										 |  |  | 					<FileInput | 
					
						
							|  |  |  | 						field={form.image} | 
					
						
							|  |  |  | 						label="Image" | 
					
						
							|  |  |  | 						accept="image/png,image/gif" | 
					
						
							|  |  |  | 					/> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 					<MutationButton | 
					
						
							|  |  |  | 						name="image" | 
					
						
							|  |  |  | 						label="Replace image" | 
					
						
							|  |  |  | 						showError={false} | 
					
						
							|  |  |  | 						result={result} | 
					
						
							|  |  |  | 					/> | 
					
						
							| 
									
										
										
										
											2022-11-25 15:49:48 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 					<FakeToot> | 
					
						
							|  |  |  | 						Look at this new custom emoji <img | 
					
						
							|  |  |  | 							className="emoji" | 
					
						
							| 
									
										
										
										
											2023-01-18 14:45:14 +01:00
										 |  |  | 							src={form.image.previewURL ?? emoji.url} | 
					
						
							| 
									
										
										
										
											2022-11-25 15:49:48 +01:00
										 |  |  | 							title={`:${emoji.shortcode}:`} | 
					
						
							|  |  |  | 							alt={emoji.shortcode} | 
					
						
							|  |  |  | 						/> isn't it cool? | 
					
						
							|  |  |  | 					</FakeToot> | 
					
						
							| 
									
										
										
										
											2023-01-18 14:45:14 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 					{result.error && <Error error={result.error} />} | 
					
						
							|  |  |  | 					{deleteResult.error && <Error error={deleteResult.error} />} | 
					
						
							| 
									
										
										
										
											2022-11-25 15:49:48 +01:00
										 |  |  | 				</div> | 
					
						
							| 
									
										
										
										
											2023-01-18 14:45:14 +01:00
										 |  |  | 			</form> | 
					
						
							| 
									
										
										
										
											2022-11-25 15:49:48 +01:00
										 |  |  | 		</> | 
					
						
							| 
									
										
										
										
											2022-11-08 17:51:44 +01:00
										 |  |  | 	); | 
					
						
							|  |  |  | } |