| 
									
										
										
										
											2022-09-29 12:02:41 +02: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 | 
					
						
							| 
									
										
										
										
											2022-09-29 12:02:41 +02: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/>.
 | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-16 18:28:56 +01:00
										 |  |  | import React from "react"; | 
					
						
							| 
									
										
										
										
											2022-09-29 12:02:41 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-16 18:28:56 +01:00
										 |  |  | import query from "../lib/query"; | 
					
						
							| 
									
										
										
										
											2022-09-29 12:02:41 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-16 18:28:56 +01:00
										 |  |  | import { useTextInput, useBoolInput } from "../lib/form"; | 
					
						
							| 
									
										
										
										
											2023-01-18 14:45:14 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-16 18:28:56 +01:00
										 |  |  | import useFormSubmit from "../lib/form/submit"; | 
					
						
							| 
									
										
										
										
											2022-09-29 12:02:41 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-16 18:28:56 +01:00
										 |  |  | import { Select, TextInput, Checkbox } from "../components/form/inputs"; | 
					
						
							| 
									
										
										
										
											2023-01-18 14:45:14 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-16 18:28:56 +01:00
										 |  |  | import FormWithData from "../lib/form/form-with-data"; | 
					
						
							|  |  |  | import Languages from "../components/languages"; | 
					
						
							|  |  |  | import MutationButton from "../components/form/mutation-button"; | 
					
						
							| 
									
										
										
										
											2022-09-29 12:02:41 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-16 18:28:56 +01:00
										 |  |  | export default function UserSettings() { | 
					
						
							| 
									
										
										
										
											2023-01-18 14:45:14 +01:00
										 |  |  | 	return ( | 
					
						
							|  |  |  | 		<FormWithData | 
					
						
							|  |  |  | 			dataQuery={query.useVerifyCredentialsQuery} | 
					
						
							|  |  |  | 			DataForm={UserSettingsForm} | 
					
						
							|  |  |  | 		/> | 
					
						
							|  |  |  | 	); | 
					
						
							| 
									
										
										
										
											2024-01-16 18:28:56 +01:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2022-09-29 12:02:41 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-01-18 14:45:14 +01:00
										 |  |  | function UserSettingsForm({ data }) { | 
					
						
							|  |  |  | 	/* form keys | 
					
						
							|  |  |  | 		- string source[privacy] | 
					
						
							|  |  |  | 		- bool source[sensitive] | 
					
						
							|  |  |  | 		- string source[language] | 
					
						
							| 
									
										
										
										
											2023-03-02 03:06:40 -08:00
										 |  |  | 		- string source[status_content_type] | 
					
						
							| 
									
										
										
										
											2023-01-18 14:45:14 +01:00
										 |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2022-09-29 12:02:41 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-01-18 14:45:14 +01:00
										 |  |  | 	const form = { | 
					
						
							| 
									
										
										
										
											2023-02-06 09:19:56 +01:00
										 |  |  | 		defaultPrivacy: useTextInput("source[privacy]", { source: data, defaultValue: "unlisted" }), | 
					
						
							|  |  |  | 		isSensitive: useBoolInput("source[sensitive]", { source: data }), | 
					
						
							|  |  |  | 		language: useTextInput("source[language]", { source: data, valueSelector: (s) => s.source.language?.toUpperCase() ?? "EN" }), | 
					
						
							| 
									
										
										
										
											2023-03-02 03:06:40 -08:00
										 |  |  | 		statusContentType: useTextInput("source[status_content_type]", { source: data, defaultValue: "text/plain" }), | 
					
						
							| 
									
										
										
										
											2023-01-18 14:45:14 +01:00
										 |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	const [submitForm, result] = useFormSubmit(form, query.useUpdateCredentialsMutation()); | 
					
						
							| 
									
										
										
										
											2022-09-29 12:02:41 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	return ( | 
					
						
							|  |  |  | 		<> | 
					
						
							| 
									
										
										
										
											2023-01-18 14:45:14 +01:00
										 |  |  | 			<form className="user-settings" onSubmit={submitForm}> | 
					
						
							| 
									
										
										
										
											2022-09-29 12:02:41 +02:00
										 |  |  | 				<h1>Post settings</h1> | 
					
						
							| 
									
										
										
										
											2023-01-18 14:45:14 +01:00
										 |  |  | 				<Select field={form.language} label="Default post language" options={ | 
					
						
							|  |  |  | 					<Languages /> | 
					
						
							| 
									
										
										
										
											2022-09-29 12:02:41 +02:00
										 |  |  | 				}> | 
					
						
							|  |  |  | 				</Select> | 
					
						
							| 
									
										
										
										
											2023-01-18 14:45:14 +01:00
										 |  |  | 				<Select field={form.defaultPrivacy} label="Default post privacy" options={ | 
					
						
							| 
									
										
										
										
											2022-09-29 12:02:41 +02:00
										 |  |  | 					<> | 
					
						
							|  |  |  | 						<option value="private">Private / followers-only</option> | 
					
						
							|  |  |  | 						<option value="unlisted">Unlisted</option> | 
					
						
							|  |  |  | 						<option value="public">Public</option> | 
					
						
							|  |  |  | 					</> | 
					
						
							|  |  |  | 				}> | 
					
						
							| 
									
										
										
										
											2023-09-29 13:01:36 +02:00
										 |  |  | 					<a href="https://docs.gotosocial.org/en/latest/user_guide/posts/#privacy-settings" target="_blank" className="docslink" rel="noreferrer">Learn more about post privacy settings (opens in a new tab)</a> | 
					
						
							| 
									
										
										
										
											2022-09-29 12:02:41 +02:00
										 |  |  | 				</Select> | 
					
						
							| 
									
										
										
										
											2023-03-02 03:06:40 -08:00
										 |  |  | 				<Select field={form.statusContentType} label="Default post (and bio) format" options={ | 
					
						
							| 
									
										
										
										
											2022-09-29 12:02:41 +02:00
										 |  |  | 					<> | 
					
						
							| 
									
										
										
										
											2023-03-02 03:06:40 -08:00
										 |  |  | 						<option value="text/plain">Plain (default)</option> | 
					
						
							|  |  |  | 						<option value="text/markdown">Markdown</option> | 
					
						
							| 
									
										
										
										
											2022-09-29 12:02:41 +02:00
										 |  |  | 					</> | 
					
						
							|  |  |  | 				}> | 
					
						
							| 
									
										
										
										
											2023-09-29 13:01:36 +02:00
										 |  |  | 					<a href="https://docs.gotosocial.org/en/latest/user_guide/posts/#input-types" target="_blank" className="docslink" rel="noreferrer">Learn more about post format settings (opens in a new tab)</a> | 
					
						
							| 
									
										
										
										
											2022-09-29 12:02:41 +02:00
										 |  |  | 				</Select> | 
					
						
							|  |  |  | 				<Checkbox | 
					
						
							| 
									
										
										
										
											2023-01-18 14:45:14 +01:00
										 |  |  | 					field={form.isSensitive} | 
					
						
							|  |  |  | 					label="Mark my posts as sensitive by default" | 
					
						
							| 
									
										
										
										
											2022-09-29 12:02:41 +02:00
										 |  |  | 				/> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-16 18:28:56 +01:00
										 |  |  | 				<MutationButton | 
					
						
							|  |  |  | 					disabled={false} | 
					
						
							|  |  |  | 					label="Save settings" | 
					
						
							|  |  |  | 					result={result} | 
					
						
							|  |  |  | 				/> | 
					
						
							| 
									
										
										
										
											2023-01-18 14:45:14 +01:00
										 |  |  | 			</form> | 
					
						
							| 
									
										
										
										
											2024-01-16 18:28:56 +01:00
										 |  |  | 			<PasswordChange /> | 
					
						
							| 
									
										
										
										
											2022-09-29 12:02:41 +02:00
										 |  |  | 		</> | 
					
						
							|  |  |  | 	); | 
					
						
							| 
									
										
										
										
											2023-01-18 14:45:14 +01:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2022-09-29 12:02:41 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | function PasswordChange() { | 
					
						
							| 
									
										
										
										
											2023-01-18 14:45:14 +01:00
										 |  |  | 	const form = { | 
					
						
							|  |  |  | 		oldPassword: useTextInput("old_password"), | 
					
						
							| 
									
										
										
										
											2023-02-04 12:40:35 +01:00
										 |  |  | 		newPassword: useTextInput("new_password", { | 
					
						
							| 
									
										
										
										
											2023-01-18 14:45:14 +01:00
										 |  |  | 			validator(val) { | 
					
						
							|  |  |  | 				if (val != "" && val == form.oldPassword.value) { | 
					
						
							|  |  |  | 					return "New password same as old password"; | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 				return ""; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		}) | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	const verifyNewPassword = useTextInput("verifyNewPassword", { | 
					
						
							|  |  |  | 		validator(val) { | 
					
						
							|  |  |  | 			if (val != "" && val != form.newPassword.value) { | 
					
						
							|  |  |  | 				return "Passwords do not match"; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			return ""; | 
					
						
							| 
									
										
										
										
											2022-09-29 12:02:41 +02:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2023-01-18 14:45:14 +01:00
										 |  |  | 	}); | 
					
						
							| 
									
										
										
										
											2022-11-19 04:07:51 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-01-18 14:45:14 +01:00
										 |  |  | 	const [submitForm, result] = useFormSubmit(form, query.usePasswordChangeMutation()); | 
					
						
							| 
									
										
										
										
											2022-09-29 12:02:41 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	return ( | 
					
						
							| 
									
										
										
										
											2023-01-18 14:45:14 +01:00
										 |  |  | 		<form className="change-password" onSubmit={submitForm}> | 
					
						
							| 
									
										
										
										
											2022-09-29 12:02:41 +02:00
										 |  |  | 			<h1>Change password</h1> | 
					
						
							| 
									
										
										
										
											2023-02-06 09:19:56 +01:00
										 |  |  | 			<TextInput | 
					
						
							|  |  |  | 				type="password" | 
					
						
							|  |  |  | 				name="password" | 
					
						
							|  |  |  | 				field={form.oldPassword} | 
					
						
							|  |  |  | 				label="Current password" | 
					
						
							|  |  |  | 			/> | 
					
						
							|  |  |  | 			<TextInput | 
					
						
							|  |  |  | 				type="password" | 
					
						
							|  |  |  | 				name="newPassword" | 
					
						
							|  |  |  | 				field={form.newPassword} | 
					
						
							|  |  |  | 				label="New password" | 
					
						
							|  |  |  | 			/> | 
					
						
							|  |  |  | 			<TextInput | 
					
						
							|  |  |  | 				type="password" | 
					
						
							|  |  |  | 				name="confirmNewPassword" | 
					
						
							|  |  |  | 				field={verifyNewPassword} | 
					
						
							|  |  |  | 				label="Confirm new password" | 
					
						
							|  |  |  | 			/> | 
					
						
							| 
									
										
										
										
											2024-01-16 18:28:56 +01:00
										 |  |  | 			<MutationButton | 
					
						
							|  |  |  | 				disabled={false} | 
					
						
							|  |  |  | 				label="Change password" | 
					
						
							|  |  |  | 				result={result} | 
					
						
							|  |  |  | 			/> | 
					
						
							| 
									
										
										
										
											2023-01-18 14:45:14 +01:00
										 |  |  | 		</form> | 
					
						
							| 
									
										
										
										
											2022-09-29 12:02:41 +02:00
										 |  |  | 	); | 
					
						
							|  |  |  | } |