{
	"issue": {
		"url": "https://api.github.com/repos/laurent22/joplin/issues/11069",
		"repository_url": "https://api.github.com/repos/laurent22/joplin",
		"labels_url": "https://api.github.com/repos/laurent22/joplin/issues/11069/labels{/name}",
		"comments_url": "https://api.github.com/repos/laurent22/joplin/issues/11069/comments",
		"events_url": "https://api.github.com/repos/laurent22/joplin/issues/11069/events",
		"html_url": "https://github.com/laurent22/joplin/pull/11069",
		"id": 2529697822,
		"node_id": "PR_kwDOBLftOs57r7Z7",
		"number": 11069,
		"title": "Mobile: Resolves #10883: Remove slider component module and replace integer settings with validated text inputs and ensure all validation error flows work correctly",
		"user": {
			"login": "mrjo118",
			"id": 6963004,
			"node_id": "MDQ6VXNlcjY5NjMwMDQ=",
			"avatar_url": "https://avatars.githubusercontent.com/u/6963004?v=4",
			"gravatar_id": "",
			"url": "https://api.github.com/users/mrjo118",
			"html_url": "https://github.com/mrjo118",
			"followers_url": "https://api.github.com/users/mrjo118/followers",
			"following_url": "https://api.github.com/users/mrjo118/following{/other_user}",
			"gists_url": "https://api.github.com/users/mrjo118/gists{/gist_id}",
			"starred_url": "https://api.github.com/users/mrjo118/starred{/owner}{/repo}",
			"subscriptions_url": "https://api.github.com/users/mrjo118/subscriptions",
			"organizations_url": "https://api.github.com/users/mrjo118/orgs",
			"repos_url": "https://api.github.com/users/mrjo118/repos",
			"events_url": "https://api.github.com/users/mrjo118/events{/privacy}",
			"received_events_url": "https://api.github.com/users/mrjo118/received_events",
			"type": "User",
			"user_view_type": "public",
			"site_admin": false
		},
		"labels": [],
		"state": "closed",
		"locked": false,
		"assignee": null,
		"assignees": [],
		"milestone": null,
		"comments": 21,
		"created_at": "2024-09-17T00:01:27Z",
		"updated_at": "2025-02-11T00:32:36Z",
		"closed_at": "2025-02-11T00:32:21Z",
		"author_association": "CONTRIBUTOR",
		"sub_issues_summary": {
			"total": 0,
			"completed": 0,
			"percent_completed": 0
		},
		"active_lock_reason": null,
		"draft": false,
		"pull_request": {
			"url": "https://api.github.com/repos/laurent22/joplin/pulls/11069",
			"html_url": "https://github.com/laurent22/joplin/pull/11069",
			"diff_url": "https://github.com/laurent22/joplin/pull/11069.diff",
			"patch_url": "https://github.com/laurent22/joplin/pull/11069.patch",
			"merged_at": null
		},
		"body": "On mobile, a react native slider component is used where integer values are entered as a configuration setting. This is not user friendly where the value is a large number. The desktop app instead uses a text input with the number type, which disallows restricted characters to be entered and also has increment and decrement buttons which appear when hovering over (which are capped at the min and max values for the setting). In order to improve usability and have consistency between mobile and desktop, I have removed the react-native-community/slider component entirely from the project, and used TextInput components to replace them.\r\n\r\nAs a integer type settings need to prevent invalid values from being entered, I have implemented validation of save. Additionally, where unitLabel is specified for a configuration setting, on desktop the default value plus the unit value is appended to the field label in brackets. I have mimicked this behaviour on mobile as well\r\n\r\nIn addition to validating that invalid values cannot be entered, where min / max values are specified for a setting, those limits will be enforced by the validation. The validation has been added on save for all integer type setting inputs, which is triggered either manually by pressing the button, exiting a screen and being prompted, or changing an auto save value. In all of these cases, an error message in the format \"%s must be a valid whole number\" / \"%s cannot be less than %s\" / \"%s cannot be greater than %s\", will be displayed for the first invalid value which was changed by the user, which indicates the name of the field, the min or max value. This adds the benefit of providing an indication to the user of the valid value range, where it is not made apparent to the user. This builds upon the existing validation mechanism which was implemented for changing the sync target. However, the existing implementation did not correctly handle the flows for preventing exit of the relevant screen if the user confirmed on a save prompt that they wanted to save pending changes, but that save failed. In order to facilitate the settings exit flows correctly handling error scenarios, a number of additional changes were required for both mobile and desktop, including using shim to create an alert instead of a standard javascript alert where the code is shared between mobile and desktop, to avoid this issue https://github.com/electron/electron/issues/31917\r\n\r\nNote that on the desktop app, number range validations are poorly handled currently, as they would allow saving a value outside of the min / max values if the value is entered as free text. In such cases, when you reload the settings config, the values are capped at the min / max value despite the user not receiving a warning that it was the case. The desktop flow has now been improved, to also show a validation error when the value is outside of the min / max range. Additionally on desktop, when the user removes the existing value of a number input using backspace, the value automatically changes to the value 0, which is misleading to the user. This has been changed to now allow a blank value to be displayed in the input when it is cleared out, which will throw a validation error if attempting to save with a blank value. The mobile app has been aligned to have this behaviour as well. On desktop, when entering the value as free text there is no limit to the number of characters you can enter. This turned out to be difficult to fix, due to limitations of the React number type text inputs, so I have not attempted to change this behaviour. However on mobile, I have set number inputs to have a hard limit of 15 characters, to avoid the integer limit being exceeded, which causes a change to the input value in real time.\r\n\r\nAdditionally, the fix in PR https://github.com/laurent22/joplin/pull/11821 has been applied to the new logic for integer configuration settings, as the usage of the defaultValue property instead of the value property fixes an annoying issue with React Native TextInput components\r\n\r\n### Testing\r\n\r\nThese are scenarios which I have covered with manual testing on mobile and desktop:\r\n\r\n-For Settings > Appearance > Editor font size, ensure the label without any unit or brackets are set as the label\r\n-For Settings > Note History > Keep note history for, ensure the label plus a space followed by the unit in brackets is set as the label\r\n-The user should be able to clear out a number setting input using backspace, without the value being replaced with 0 when doing so on mobile and desktop. On desktop, any characters which cannot be used as part of a number of prevented from being entered, while on mobile, a number type on screen keyboard will pop up, but any character can be entered into the input, which will be validated on save\r\n-Verify after changing a value of number setting, that the value can be used correctly by the code the uses it. An easy example to test is that changing editor font size is reflected when opening a note in edit mode\r\n-Verify after changing a value of a non number setting, such as a checkbox and dropdown, it saves without issues in combination with changing the value of a number setting\r\n-On mobile, the user should not be able to enter more than 15 characters in a number setting input\r\n-When saving configuration settings, where any number setting has the value set to blank, or a non parsable integer value (eg. '5-5' or '5-' or 'aaa' or any decimal value outside of all trailing zeros eg. '5.0') set as it's value, the save should be prevented with an error alert \"%s must be a valid whole number\". Where any non parsable integer value is entered by the user, if they navigate to a different screen and then return to the same on, the value will be cleared to prevent a NaN string literal being shown in the inputs, and will instead be a blank value which will continue to fail validation\r\n-When saving configuration settings, where any number setting has the value lower than the minimum value where the setting has one, the save should be prevented with an error alert \"%s cannot be less than %s\"\r\n-When saving configuration settings, where any number setting has the value higher than the maximum value where the setting has one, the save should be prevented with an error alert \"%s cannot be greater than %s\"\r\n-In a number setting input, you should be able to enter a negative number. On Desktop, in Settings, Appearance, Editor maximum width, this field allows entering negative values and there should be no restriction for the lower and upper limit\r\n-If there are multiple invalid values, only one error alert should display (this seems to be the first value which was changed to an invalid value). After resolving one value, attempting to save again should raise an error alert for the other value, and once that is resolved then save should work. On desktop, confirming the alert should not leave text inputs in a disabled state (however, I did find the last input has lost focus in my testing)\r\n-On desktop, clear out the value of a number setting input, then click switch to a setting screen which prompts the switching screen prompt (eg. Web Clipper and Encryption screens). Clicking cancel should prevent the screen from switching (existing behaviour for this is it switches screen on clicking cancel, I have fixed this), clicking ok should raise an error alert about the field which was cleared and prevent the screen from switching. Clicking ok or cancel with and without an error should not leave text inputs in a disabled state. After setting a valid value in that number setting input, switching screen again and clicking ok should result in the screen switching to the new one and the new value being successfully saved.\r\nNOTE: the plugins screen has been added to the screens which trigger the switching screen prompt on desktop, in order to ensure changes are saved before entering this screen. Otherwise when toggling a plugin, the message to restart for changes to take effect will be misleading if the user has not successfully saved the plugin change\r\n-On desktop if you navigate around settings screens which don't trigger the switch screen prompt while there are unsaved changes, the back button should say cancel, and clicking it should discard unsaved changed without a prompt. This is the existing behaviour and should remain unchanged\r\n-On mobile, clear out the value of a number setting input, then attempt to exit the top level settings screen (verify using both the back button in the top bar of the app, and using the device back button). Choosing discard changes should prevent the screen from switching and choosing save changes should raise an error alert about the field which was cleared and prevent the screen from switching. After setting a valid value in that number setting input, switching screen again and clicking save changes should result in the screen switching to the new one and the new value being successfully saved. The behaviour should be the same when going to Settings > Tools > Manage Profiles, or Settings > Synchronisation > Encryption Config, which prompts a switching screen prompt in desktop\r\n-On mobile, verify that the save is blocked by a validation error where the value of a number setting input has an invalid value and then an auto save field has the value changed. Examples of this are going to Settings > Plugins > Enable / disable plugin support, and enabling / disabling biometrics in Settings > General, after setting up biometric data on the device. In both cases, toggling the option will trigger a save immediately, and the validation error should be displayed. This should leave the settings screen in a state where there are unsaved changes pending. On mobile you will still be prompted to save unsaved changes when trying the exit the top level settings screen and have the option to save and discard after failing to save when the auto save triggered, nor is there any prompt to restart the app for setting changes which require a restart, so this would not cause flow issues that would happen on the desktop app if the auto save was unable to complete.\r\n\r\nVideos are attached showing all of these test scenarios, following the code changes:\r\n\r\nMobile (Android):\r\nhttps://github.com/user-attachments/assets/0a55706e-752a-4c7c-8069-2a1bd2681345\r\n\r\nDesktop (Windows):\r\nhttps://github.com/user-attachments/assets/8874d48e-1e8c-42fb-827f-ff7d6616ad0a",
		"closed_by": {
			"login": "mrjo118",
			"id": 6963004,
			"node_id": "MDQ6VXNlcjY5NjMwMDQ=",
			"avatar_url": "https://avatars.githubusercontent.com/u/6963004?v=4",
			"gravatar_id": "",
			"url": "https://api.github.com/users/mrjo118",
			"html_url": "https://github.com/mrjo118",
			"followers_url": "https://api.github.com/users/mrjo118/followers",
			"following_url": "https://api.github.com/users/mrjo118/following{/other_user}",
			"gists_url": "https://api.github.com/users/mrjo118/gists{/gist_id}",
			"starred_url": "https://api.github.com/users/mrjo118/starred{/owner}{/repo}",
			"subscriptions_url": "https://api.github.com/users/mrjo118/subscriptions",
			"organizations_url": "https://api.github.com/users/mrjo118/orgs",
			"repos_url": "https://api.github.com/users/mrjo118/repos",
			"events_url": "https://api.github.com/users/mrjo118/events{/privacy}",
			"received_events_url": "https://api.github.com/users/mrjo118/received_events",
			"type": "User",
			"user_view_type": "public",
			"site_admin": false
		},
		"reactions": {
			"url": "https://api.github.com/repos/laurent22/joplin/issues/11069/reactions",
			"total_count": 2,
			"+1": 0,
			"-1": 0,
			"laugh": 0,
			"hooray": 0,
			"confused": 0,
			"heart": 0,
			"rocket": 2,
			"eyes": 0
		},
		"timeline_url": "https://api.github.com/repos/laurent22/joplin/issues/11069/timeline",
		"performed_via_github_app": null,
		"state_reason": null
	},
	"comments": [
		{
			"url": "https://api.github.com/repos/laurent22/joplin/issues/comments/2354236805",
			"html_url": "https://github.com/laurent22/joplin/pull/11069#issuecomment-2354236805",
			"issue_url": "https://api.github.com/repos/laurent22/joplin/issues/11069",
			"id": 2354236805,
			"node_id": "IC_kwDOBLftOs6MUs2F",
			"user": {
				"login": "github-actions[bot]",
				"id": 41898282,
				"node_id": "MDM6Qm90NDE4OTgyODI=",
				"avatar_url": "https://avatars.githubusercontent.com/in/15368?v=4",
				"gravatar_id": "",
				"url": "https://api.github.com/users/github-actions%5Bbot%5D",
				"html_url": "https://github.com/apps/github-actions",
				"followers_url": "https://api.github.com/users/github-actions%5Bbot%5D/followers",
				"following_url": "https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}",
				"gists_url": "https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}",
				"starred_url": "https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}",
				"subscriptions_url": "https://api.github.com/users/github-actions%5Bbot%5D/subscriptions",
				"organizations_url": "https://api.github.com/users/github-actions%5Bbot%5D/orgs",
				"repos_url": "https://api.github.com/users/github-actions%5Bbot%5D/repos",
				"events_url": "https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}",
				"received_events_url": "https://api.github.com/users/github-actions%5Bbot%5D/received_events",
				"type": "Bot",
				"user_view_type": "public",
				"site_admin": false
			},
			"created_at": "2024-09-17T00:01:41Z",
			"updated_at": "2025-02-11T00:32:36Z",
			"author_association": "CONTRIBUTOR",
			"body": "****CLA Assistant Lite bot**** All contributors have signed the CLA  ✍️ ✅",
			"reactions": {
				"url": "https://api.github.com/repos/laurent22/joplin/issues/comments/2354236805/reactions",
				"total_count": 0,
				"+1": 0,
				"-1": 0,
				"laugh": 0,
				"hooray": 0,
				"confused": 0,
				"heart": 0,
				"rocket": 0,
				"eyes": 0
			},
			"performed_via_github_app": {
				"id": 15368,
				"client_id": "Iv1.05c79e9ad1f6bdfa",
				"slug": "github-actions",
				"node_id": "MDM6QXBwMTUzNjg=",
				"owner": {
					"login": "github",
					"id": 9919,
					"node_id": "MDEyOk9yZ2FuaXphdGlvbjk5MTk=",
					"avatar_url": "https://avatars.githubusercontent.com/u/9919?v=4",
					"gravatar_id": "",
					"url": "https://api.github.com/users/github",
					"html_url": "https://github.com/github",
					"followers_url": "https://api.github.com/users/github/followers",
					"following_url": "https://api.github.com/users/github/following{/other_user}",
					"gists_url": "https://api.github.com/users/github/gists{/gist_id}",
					"starred_url": "https://api.github.com/users/github/starred{/owner}{/repo}",
					"subscriptions_url": "https://api.github.com/users/github/subscriptions",
					"organizations_url": "https://api.github.com/users/github/orgs",
					"repos_url": "https://api.github.com/users/github/repos",
					"events_url": "https://api.github.com/users/github/events{/privacy}",
					"received_events_url": "https://api.github.com/users/github/received_events",
					"type": "Organization",
					"user_view_type": "public",
					"site_admin": false
				},
				"name": "GitHub Actions",
				"description": "Automate your workflow from idea to production",
				"external_url": "https://help.github.com/en/actions",
				"html_url": "https://github.com/apps/github-actions",
				"created_at": "2018-07-30T09:30:17Z",
				"updated_at": "2025-03-07T16:35:00Z",
				"permissions": {
					"actions": "write",
					"administration": "read",
					"attestations": "write",
					"checks": "write",
					"contents": "write",
					"deployments": "write",
					"discussions": "write",
					"issues": "write",
					"merge_queues": "write",
					"metadata": "read",
					"models": "read",
					"packages": "write",
					"pages": "write",
					"pull_requests": "write",
					"repository_hooks": "write",
					"repository_projects": "write",
					"security_events": "write",
					"statuses": "write",
					"vulnerability_alerts": "read"
				},
				"events": [
					"branch_protection_rule",
					"check_run",
					"check_suite",
					"create",
					"delete",
					"deployment",
					"deployment_status",
					"discussion",
					"discussion_comment",
					"fork",
					"gollum",
					"issues",
					"issue_comment",
					"label",
					"merge_group",
					"milestone",
					"page_build",
					"project",
					"project_card",
					"project_column",
					"public",
					"pull_request",
					"pull_request_review",
					"pull_request_review_comment",
					"push",
					"registry_package",
					"release",
					"repository",
					"repository_dispatch",
					"status",
					"watch",
					"workflow_dispatch",
					"workflow_run"
				]
			}
		},
		{
			"url": "https://api.github.com/repos/laurent22/joplin/issues/comments/2354247743",
			"html_url": "https://github.com/laurent22/joplin/pull/11069#issuecomment-2354247743",
			"issue_url": "https://api.github.com/repos/laurent22/joplin/issues/11069",
			"id": 2354247743,
			"node_id": "IC_kwDOBLftOs6MUvg_",
			"user": {
				"login": "mrjo118",
				"id": 6963004,
				"node_id": "MDQ6VXNlcjY5NjMwMDQ=",
				"avatar_url": "https://avatars.githubusercontent.com/u/6963004?v=4",
				"gravatar_id": "",
				"url": "https://api.github.com/users/mrjo118",
				"html_url": "https://github.com/mrjo118",
				"followers_url": "https://api.github.com/users/mrjo118/followers",
				"following_url": "https://api.github.com/users/mrjo118/following{/other_user}",
				"gists_url": "https://api.github.com/users/mrjo118/gists{/gist_id}",
				"starred_url": "https://api.github.com/users/mrjo118/starred{/owner}{/repo}",
				"subscriptions_url": "https://api.github.com/users/mrjo118/subscriptions",
				"organizations_url": "https://api.github.com/users/mrjo118/orgs",
				"repos_url": "https://api.github.com/users/mrjo118/repos",
				"events_url": "https://api.github.com/users/mrjo118/events{/privacy}",
				"received_events_url": "https://api.github.com/users/mrjo118/received_events",
				"type": "User",
				"user_view_type": "public",
				"site_admin": false
			},
			"created_at": "2024-09-17T00:12:53Z",
			"updated_at": "2024-09-17T00:12:53Z",
			"author_association": "CONTRIBUTOR",
			"body": "I have read the CLA Document and I hereby sign the CLA",
			"reactions": {
				"url": "https://api.github.com/repos/laurent22/joplin/issues/comments/2354247743/reactions",
				"total_count": 0,
				"+1": 0,
				"-1": 0,
				"laugh": 0,
				"hooray": 0,
				"confused": 0,
				"heart": 0,
				"rocket": 0,
				"eyes": 0
			},
			"performed_via_github_app": null
		},
		{
			"url": "https://api.github.com/repos/laurent22/joplin/issues/comments/2354692539",
			"html_url": "https://github.com/laurent22/joplin/pull/11069#issuecomment-2354692539",
			"issue_url": "https://api.github.com/repos/laurent22/joplin/issues/11069",
			"id": 2354692539,
			"node_id": "IC_kwDOBLftOs6MWcG7",
			"user": {
				"login": "laurent22",
				"id": 1285584,
				"node_id": "MDQ6VXNlcjEyODU1ODQ=",
				"avatar_url": "https://avatars.githubusercontent.com/u/1285584?v=4",
				"gravatar_id": "",
				"url": "https://api.github.com/users/laurent22",
				"html_url": "https://github.com/laurent22",
				"followers_url": "https://api.github.com/users/laurent22/followers",
				"following_url": "https://api.github.com/users/laurent22/following{/other_user}",
				"gists_url": "https://api.github.com/users/laurent22/gists{/gist_id}",
				"starred_url": "https://api.github.com/users/laurent22/starred{/owner}{/repo}",
				"subscriptions_url": "https://api.github.com/users/laurent22/subscriptions",
				"organizations_url": "https://api.github.com/users/laurent22/orgs",
				"repos_url": "https://api.github.com/users/laurent22/repos",
				"events_url": "https://api.github.com/users/laurent22/events{/privacy}",
				"received_events_url": "https://api.github.com/users/laurent22/received_events",
				"type": "User",
				"user_view_type": "public",
				"site_admin": false
			},
			"created_at": "2024-09-17T06:51:59Z",
			"updated_at": "2024-09-17T06:51:59Z",
			"author_association": "OWNER",
			"body": "Thanks for creating this change. It needs to have the same quality of validation as the slider since we don't want invalid values to get in. As personalizedrefrigerator mentioned I'd also rather not have a new type. Why not detect what should be displayed depending on the min/max value?\r\n\r\nBut also I'm not sure this is the right fix and that probably should be discussed before spending too much time on implementation and review. How do other mobile apps handle large number input?",
			"reactions": {
				"url": "https://api.github.com/repos/laurent22/joplin/issues/comments/2354692539/reactions",
				"total_count": 0,
				"+1": 0,
				"-1": 0,
				"laugh": 0,
				"hooray": 0,
				"confused": 0,
				"heart": 0,
				"rocket": 0,
				"eyes": 0
			},
			"performed_via_github_app": null
		},
		{
			"url": "https://api.github.com/repos/laurent22/joplin/issues/comments/2354712289",
			"html_url": "https://github.com/laurent22/joplin/pull/11069#issuecomment-2354712289",
			"issue_url": "https://api.github.com/repos/laurent22/joplin/issues/11069",
			"id": 2354712289,
			"node_id": "IC_kwDOBLftOs6MWg7h",
			"user": {
				"login": "tomasz1986",
				"id": 5626656,
				"node_id": "MDQ6VXNlcjU2MjY2NTY=",
				"avatar_url": "https://avatars.githubusercontent.com/u/5626656?v=4",
				"gravatar_id": "",
				"url": "https://api.github.com/users/tomasz1986",
				"html_url": "https://github.com/tomasz1986",
				"followers_url": "https://api.github.com/users/tomasz1986/followers",
				"following_url": "https://api.github.com/users/tomasz1986/following{/other_user}",
				"gists_url": "https://api.github.com/users/tomasz1986/gists{/gist_id}",
				"starred_url": "https://api.github.com/users/tomasz1986/starred{/owner}{/repo}",
				"subscriptions_url": "https://api.github.com/users/tomasz1986/subscriptions",
				"organizations_url": "https://api.github.com/users/tomasz1986/orgs",
				"repos_url": "https://api.github.com/users/tomasz1986/repos",
				"events_url": "https://api.github.com/users/tomasz1986/events{/privacy}",
				"received_events_url": "https://api.github.com/users/tomasz1986/received_events",
				"type": "User",
				"user_view_type": "public",
				"site_admin": false
			},
			"created_at": "2024-09-17T07:04:38Z",
			"updated_at": "2024-09-17T07:04:38Z",
			"author_association": "NONE",
			"body": "> How do other mobile apps handle large number input?\r\n\r\nFrom my experience, apps either show a pre-defined list of options to select from, so that the user doesn't need to input anything manually, or they use the same input as in this PR. For example, the following screenshot comes from Google Calendar:\r\n\r\n![Untitled](https://github.com/user-attachments/assets/efca63e4-9b9f-4f07-8f5a-36362787d22b)\r\n\r\nSliders are usually only used for a small range of numbers, e.g. if you need to select from `1` to `7` (e.g. days) or similar.",
			"reactions": {
				"url": "https://api.github.com/repos/laurent22/joplin/issues/comments/2354712289/reactions",
				"total_count": 0,
				"+1": 0,
				"-1": 0,
				"laugh": 0,
				"hooray": 0,
				"confused": 0,
				"heart": 0,
				"rocket": 0,
				"eyes": 0
			},
			"performed_via_github_app": null
		},
		{
			"url": "https://api.github.com/repos/laurent22/joplin/issues/comments/2358281533",
			"html_url": "https://github.com/laurent22/joplin/pull/11069#issuecomment-2358281533",
			"issue_url": "https://api.github.com/repos/laurent22/joplin/issues/11069",
			"id": 2358281533,
			"node_id": "IC_kwDOBLftOs6MkIU9",
			"user": {
				"login": "mrjo118",
				"id": 6963004,
				"node_id": "MDQ6VXNlcjY5NjMwMDQ=",
				"avatar_url": "https://avatars.githubusercontent.com/u/6963004?v=4",
				"gravatar_id": "",
				"url": "https://api.github.com/users/mrjo118",
				"html_url": "https://github.com/mrjo118",
				"followers_url": "https://api.github.com/users/mrjo118/followers",
				"following_url": "https://api.github.com/users/mrjo118/following{/other_user}",
				"gists_url": "https://api.github.com/users/mrjo118/gists{/gist_id}",
				"starred_url": "https://api.github.com/users/mrjo118/starred{/owner}{/repo}",
				"subscriptions_url": "https://api.github.com/users/mrjo118/subscriptions",
				"organizations_url": "https://api.github.com/users/mrjo118/orgs",
				"repos_url": "https://api.github.com/users/mrjo118/repos",
				"events_url": "https://api.github.com/users/mrjo118/events{/privacy}",
				"received_events_url": "https://api.github.com/users/mrjo118/received_events",
				"type": "User",
				"user_view_type": "public",
				"site_admin": false
			},
			"created_at": "2024-09-18T12:03:01Z",
			"updated_at": "2024-09-18T13:47:02Z",
			"author_association": "CONTRIBUTOR",
			"body": "I don't personally like the idea of automatically changing the component based on the max size of a number setting, as whether it is needed also depends how long the bar is rendered in portrait mode on mobile, and that will depend on the length of the labels used. I think it is better to leave that in the control of the developer. But using a subtype instead is certainly a logical suggestion. Regarding the quality of the validation, what about if I gave the 2 settings a new subtype, and for that scenario on mobile, make it use the same component as an enum, with the values generated as a range between the min and max values? That way the validation stays solid, and although the list will be fairly big, the component supports variable scrolling speed, so you can scroll from min to max value in not that long. I have attached a video of a quick POC for an enum number range, demonstrating how this behaves in the UI (I scrolled through the list by swiping with the mouse, rather than using the scroll wheel on the mouse).\r\n\r\nhttps://github.com/user-attachments/assets/bb684c79-3565-4bbf-a2a0-03ef86980c0f",
			"reactions": {
				"url": "https://api.github.com/repos/laurent22/joplin/issues/comments/2358281533/reactions",
				"total_count": 0,
				"+1": 0,
				"-1": 0,
				"laugh": 0,
				"hooray": 0,
				"confused": 0,
				"heart": 0,
				"rocket": 0,
				"eyes": 0
			},
			"performed_via_github_app": null
		},
		{
			"url": "https://api.github.com/repos/laurent22/joplin/issues/comments/2359112040",
			"html_url": "https://github.com/laurent22/joplin/pull/11069#issuecomment-2359112040",
			"issue_url": "https://api.github.com/repos/laurent22/joplin/issues/11069",
			"id": 2359112040,
			"node_id": "IC_kwDOBLftOs6MnTFo",
			"user": {
				"login": "mrjo118",
				"id": 6963004,
				"node_id": "MDQ6VXNlcjY5NjMwMDQ=",
				"avatar_url": "https://avatars.githubusercontent.com/u/6963004?v=4",
				"gravatar_id": "",
				"url": "https://api.github.com/users/mrjo118",
				"html_url": "https://github.com/mrjo118",
				"followers_url": "https://api.github.com/users/mrjo118/followers",
				"following_url": "https://api.github.com/users/mrjo118/following{/other_user}",
				"gists_url": "https://api.github.com/users/mrjo118/gists{/gist_id}",
				"starred_url": "https://api.github.com/users/mrjo118/starred{/owner}{/repo}",
				"subscriptions_url": "https://api.github.com/users/mrjo118/subscriptions",
				"organizations_url": "https://api.github.com/users/mrjo118/orgs",
				"repos_url": "https://api.github.com/users/mrjo118/repos",
				"events_url": "https://api.github.com/users/mrjo118/events{/privacy}",
				"received_events_url": "https://api.github.com/users/mrjo118/received_events",
				"type": "User",
				"user_view_type": "public",
				"site_admin": false
			},
			"created_at": "2024-09-18T18:10:24Z",
			"updated_at": "2024-09-18T18:10:24Z",
			"author_association": "CONTRIBUTOR",
			"body": "> Thanks for creating this change. It needs to have the same quality of validation as the slider since we don't want invalid values to get in. As personalizedrefrigerator mentioned I'd also rather not have a new type. Why not detect what should be displayed depending on the min/max value?\r\n> \r\n> But also I'm not sure this is the right fix and that probably should be discussed before spending too much time on implementation and review. How do other mobile apps handle large number input?\r\n\r\nI've now come up with and drafted another solution for dealing with large numbers. We can use a slider component on mobile still, but additionally have decrement and increment buttons on either side of it. In order to cater for the extra space taken for the buttons (which further reduce the width of the slider), the selected value can be appended to the label's view on a new line, in brackets. I have added validation to the buttons to prevent surpassing the min and max values, and they work without any graphical defects while providing the same quality of validation as existing.\r\n\r\nYou might consider this solution can be used for all slider components on mobile, or it can just be limited to settings which deal with large numbers like this.\r\n\r\nhttps://github.com/user-attachments/assets/04b1d3f3-248d-409c-953f-b91985ba4ae4\r\n\r\nWhat do you think?",
			"reactions": {
				"url": "https://api.github.com/repos/laurent22/joplin/issues/comments/2359112040/reactions",
				"total_count": 0,
				"+1": 0,
				"-1": 0,
				"laugh": 0,
				"hooray": 0,
				"confused": 0,
				"heart": 0,
				"rocket": 0,
				"eyes": 0
			},
			"performed_via_github_app": null
		},
		{
			"url": "https://api.github.com/repos/laurent22/joplin/issues/comments/2359166999",
			"html_url": "https://github.com/laurent22/joplin/pull/11069#issuecomment-2359166999",
			"issue_url": "https://api.github.com/repos/laurent22/joplin/issues/11069",
			"id": 2359166999,
			"node_id": "IC_kwDOBLftOs6MnggX",
			"user": {
				"login": "tomasz1986",
				"id": 5626656,
				"node_id": "MDQ6VXNlcjU2MjY2NTY=",
				"avatar_url": "https://avatars.githubusercontent.com/u/5626656?v=4",
				"gravatar_id": "",
				"url": "https://api.github.com/users/tomasz1986",
				"html_url": "https://github.com/tomasz1986",
				"followers_url": "https://api.github.com/users/tomasz1986/followers",
				"following_url": "https://api.github.com/users/tomasz1986/following{/other_user}",
				"gists_url": "https://api.github.com/users/tomasz1986/gists{/gist_id}",
				"starred_url": "https://api.github.com/users/tomasz1986/starred{/owner}{/repo}",
				"subscriptions_url": "https://api.github.com/users/tomasz1986/subscriptions",
				"organizations_url": "https://api.github.com/users/tomasz1986/orgs",
				"repos_url": "https://api.github.com/users/tomasz1986/repos",
				"events_url": "https://api.github.com/users/tomasz1986/events{/privacy}",
				"received_events_url": "https://api.github.com/users/tomasz1986/received_events",
				"type": "User",
				"user_view_type": "public",
				"site_admin": false
			},
			"created_at": "2024-09-18T18:41:41Z",
			"updated_at": "2024-09-18T18:41:41Z",
			"author_association": "NONE",
			"body": "> What do you think?\r\n\r\nHonestly, the previous version with the dropdown list seems way more usable. The slider in the current version with this range of numbers is completely useless, especially on phone screens. Maybe on larger tablets it may have some utility.",
			"reactions": {
				"url": "https://api.github.com/repos/laurent22/joplin/issues/comments/2359166999/reactions",
				"total_count": 1,
				"+1": 1,
				"-1": 0,
				"laugh": 0,
				"hooray": 0,
				"confused": 0,
				"heart": 0,
				"rocket": 0,
				"eyes": 0
			},
			"performed_via_github_app": null
		},
		{
			"url": "https://api.github.com/repos/laurent22/joplin/issues/comments/2359369187",
			"html_url": "https://github.com/laurent22/joplin/pull/11069#issuecomment-2359369187",
			"issue_url": "https://api.github.com/repos/laurent22/joplin/issues/11069",
			"id": 2359369187,
			"node_id": "IC_kwDOBLftOs6MoR3j",
			"user": {
				"login": "mrjo118",
				"id": 6963004,
				"node_id": "MDQ6VXNlcjY5NjMwMDQ=",
				"avatar_url": "https://avatars.githubusercontent.com/u/6963004?v=4",
				"gravatar_id": "",
				"url": "https://api.github.com/users/mrjo118",
				"html_url": "https://github.com/mrjo118",
				"followers_url": "https://api.github.com/users/mrjo118/followers",
				"following_url": "https://api.github.com/users/mrjo118/following{/other_user}",
				"gists_url": "https://api.github.com/users/mrjo118/gists{/gist_id}",
				"starred_url": "https://api.github.com/users/mrjo118/starred{/owner}{/repo}",
				"subscriptions_url": "https://api.github.com/users/mrjo118/subscriptions",
				"organizations_url": "https://api.github.com/users/mrjo118/orgs",
				"repos_url": "https://api.github.com/users/mrjo118/repos",
				"events_url": "https://api.github.com/users/mrjo118/events{/privacy}",
				"received_events_url": "https://api.github.com/users/mrjo118/received_events",
				"type": "User",
				"user_view_type": "public",
				"site_admin": false
			},
			"created_at": "2024-09-18T20:42:58Z",
			"updated_at": "2024-09-18T20:44:33Z",
			"author_association": "CONTRIBUTOR",
			"body": "> > What do you think?\r\n> \r\n> Honestly, the previous version with the dropdown list seems way more usable. The slider in the current version with this range of numbers is completely useless, especially on phone screens. Maybe on larger tablets it may have some utility.\r\n\r\nFair enough. I guess then it's a question of whether the pop-in you get when scrolling really fast is acceptable. This looks to be a trade-off of using a FlatList https://github.com/facebook/react-native/issues/23442 , but at least the large amount of values is not going to be a performance issue, when using this component with a low initialNumToRender value.\r\n\r\nAnother alternative would be to implement a searchable dropdown menu via a third party library such as this https://www.npmjs.com/package/react-native-element-dropdown . That also is common approach (combined with lazy loading) for handling fairly large lists I think. But it's more commonly used for multi selects, and frankly seems a bit overkill for an ordered list of numbers.",
			"reactions": {
				"url": "https://api.github.com/repos/laurent22/joplin/issues/comments/2359369187/reactions",
				"total_count": 0,
				"+1": 0,
				"-1": 0,
				"laugh": 0,
				"hooray": 0,
				"confused": 0,
				"heart": 0,
				"rocket": 0,
				"eyes": 0
			},
			"performed_via_github_app": null
		},
		{
			"url": "https://api.github.com/repos/laurent22/joplin/issues/comments/2359430849",
			"html_url": "https://github.com/laurent22/joplin/pull/11069#issuecomment-2359430849",
			"issue_url": "https://api.github.com/repos/laurent22/joplin/issues/11069",
			"id": 2359430849,
			"node_id": "IC_kwDOBLftOs6Mog7B",
			"user": {
				"login": "tomasz1986",
				"id": 5626656,
				"node_id": "MDQ6VXNlcjU2MjY2NTY=",
				"avatar_url": "https://avatars.githubusercontent.com/u/5626656?v=4",
				"gravatar_id": "",
				"url": "https://api.github.com/users/tomasz1986",
				"html_url": "https://github.com/tomasz1986",
				"followers_url": "https://api.github.com/users/tomasz1986/followers",
				"following_url": "https://api.github.com/users/tomasz1986/following{/other_user}",
				"gists_url": "https://api.github.com/users/tomasz1986/gists{/gist_id}",
				"starred_url": "https://api.github.com/users/tomasz1986/starred{/owner}{/repo}",
				"subscriptions_url": "https://api.github.com/users/tomasz1986/subscriptions",
				"organizations_url": "https://api.github.com/users/tomasz1986/orgs",
				"repos_url": "https://api.github.com/users/tomasz1986/repos",
				"events_url": "https://api.github.com/users/tomasz1986/events{/privacy}",
				"received_events_url": "https://api.github.com/users/tomasz1986/received_events",
				"type": "User",
				"user_view_type": "public",
				"site_admin": false
			},
			"created_at": "2024-09-18T21:23:38Z",
			"updated_at": "2024-09-18T21:23:58Z",
			"author_association": "NONE",
			"body": "> Fair enough.\r\n\r\nJust for the record, by \"current version\" of the slider I meant what we've currently got in Joplin, not necessarily your implementation above. A slider with buttons would of course be much better than the current slider with no buttons, but still, you would likely have to press those buttons at least tens of times in order to actually get to the expected value, which doesn't sound like great user experience.",
			"reactions": {
				"url": "https://api.github.com/repos/laurent22/joplin/issues/comments/2359430849/reactions",
				"total_count": 1,
				"+1": 1,
				"-1": 0,
				"laugh": 0,
				"hooray": 0,
				"confused": 0,
				"heart": 0,
				"rocket": 0,
				"eyes": 0
			},
			"performed_via_github_app": null
		},
		{
			"url": "https://api.github.com/repos/laurent22/joplin/issues/comments/2365287808",
			"html_url": "https://github.com/laurent22/joplin/pull/11069#issuecomment-2365287808",
			"issue_url": "https://api.github.com/repos/laurent22/joplin/issues/11069",
			"id": 2365287808,
			"node_id": "IC_kwDOBLftOs6M-22A",
			"user": {
				"login": "mrjo118",
				"id": 6963004,
				"node_id": "MDQ6VXNlcjY5NjMwMDQ=",
				"avatar_url": "https://avatars.githubusercontent.com/u/6963004?v=4",
				"gravatar_id": "",
				"url": "https://api.github.com/users/mrjo118",
				"html_url": "https://github.com/mrjo118",
				"followers_url": "https://api.github.com/users/mrjo118/followers",
				"following_url": "https://api.github.com/users/mrjo118/following{/other_user}",
				"gists_url": "https://api.github.com/users/mrjo118/gists{/gist_id}",
				"starred_url": "https://api.github.com/users/mrjo118/starred{/owner}{/repo}",
				"subscriptions_url": "https://api.github.com/users/mrjo118/subscriptions",
				"organizations_url": "https://api.github.com/users/mrjo118/orgs",
				"repos_url": "https://api.github.com/users/mrjo118/repos",
				"events_url": "https://api.github.com/users/mrjo118/events{/privacy}",
				"received_events_url": "https://api.github.com/users/mrjo118/received_events",
				"type": "User",
				"user_view_type": "public",
				"site_admin": false
			},
			"created_at": "2024-09-21T18:55:45Z",
			"updated_at": "2024-09-21T18:55:45Z",
			"author_association": "CONTRIBUTOR",
			"body": "@laurent22 could you clarify if by \"quality of validation\" you just mean that is needs to prevent invalid values getting in, or also the fact that for the TextInput solution you can see the invalid character briefly before being removed, which might give the impression of the app looking buggy?\r\n\r\nI'm guessing this bug / limitation is considered a low priority issue, but if you are not satisfied with the behaviour shown for my TextInput or DropDown solutions due to the latter point, would you consider my decrement and increment button solution, as an interim solution to at least solve the inability to enter an accurate value for the ttl settings on mobile, until a more long term solution is decided for a better user experience?\r\n\r\nWith regards to using a sub type for large numbers vs automatically changing the widget depending on the range of numbers, I'd be confident to implement either of those solutions myself. I would prefer opting to use a subtype, but if you did have a stronger preference to go with dynamically using the modified widget based on the number range, I would propose to also move the selected value onto the label side of the row for normal slider widgets which don't need to include the decrement and increment buttons, as is shown in the latest video I attached. The reason for this would be that the slider width will then always be consistent, and wont vary in size, depending on the length of the unit text where specified",
			"reactions": {
				"url": "https://api.github.com/repos/laurent22/joplin/issues/comments/2365287808/reactions",
				"total_count": 0,
				"+1": 0,
				"-1": 0,
				"laugh": 0,
				"hooray": 0,
				"confused": 0,
				"heart": 0,
				"rocket": 0,
				"eyes": 0
			},
			"performed_via_github_app": null
		},
		{
			"url": "https://api.github.com/repos/laurent22/joplin/issues/comments/2368907520",
			"html_url": "https://github.com/laurent22/joplin/pull/11069#issuecomment-2368907520",
			"issue_url": "https://api.github.com/repos/laurent22/joplin/issues/11069",
			"id": 2368907520,
			"node_id": "IC_kwDOBLftOs6NMqkA",
			"user": {
				"login": "laurent22",
				"id": 1285584,
				"node_id": "MDQ6VXNlcjEyODU1ODQ=",
				"avatar_url": "https://avatars.githubusercontent.com/u/1285584?v=4",
				"gravatar_id": "",
				"url": "https://api.github.com/users/laurent22",
				"html_url": "https://github.com/laurent22",
				"followers_url": "https://api.github.com/users/laurent22/followers",
				"following_url": "https://api.github.com/users/laurent22/following{/other_user}",
				"gists_url": "https://api.github.com/users/laurent22/gists{/gist_id}",
				"starred_url": "https://api.github.com/users/laurent22/starred{/owner}{/repo}",
				"subscriptions_url": "https://api.github.com/users/laurent22/subscriptions",
				"organizations_url": "https://api.github.com/users/laurent22/orgs",
				"repos_url": "https://api.github.com/users/laurent22/repos",
				"events_url": "https://api.github.com/users/laurent22/events{/privacy}",
				"received_events_url": "https://api.github.com/users/laurent22/received_events",
				"type": "User",
				"user_view_type": "public",
				"site_admin": false
			},
			"created_at": "2024-09-23T17:22:33Z",
			"updated_at": "2024-09-23T17:22:33Z",
			"author_association": "OWNER",
			"body": "> @laurent22 could you clarify if by \"quality of validation\" you just mean that is needs to prevent invalid values getting in, or also the fact that for the TextInput solution you can see the invalid character briefly before being removed, which might give the impression of the app looking buggy?\r\n\r\nYes, to prevent invalid values to get in.\r\n\r\n> I'm guessing this bug / limitation is considered a low priority issue, but if you are not satisfied with the behaviour shown for my TextInput or DropDown solutions due to the latter point, would you consider my decrement and increment button solution, as an interim solution to at least solve the inability to enter an accurate value for the ttl settings on mobile, until a more long term solution is decided for a better user experience?\r\n\r\nI'm not a fan of it to be honest as I don't feel it helps that much, and it doesn't exactly look good (we could probably fix this but I don't feel it's worth the time)",
			"reactions": {
				"url": "https://api.github.com/repos/laurent22/joplin/issues/comments/2368907520/reactions",
				"total_count": 0,
				"+1": 0,
				"-1": 0,
				"laugh": 0,
				"hooray": 0,
				"confused": 0,
				"heart": 0,
				"rocket": 0,
				"eyes": 0
			},
			"performed_via_github_app": null
		},
		{
			"url": "https://api.github.com/repos/laurent22/joplin/issues/comments/2369700423",
			"html_url": "https://github.com/laurent22/joplin/pull/11069#issuecomment-2369700423",
			"issue_url": "https://api.github.com/repos/laurent22/joplin/issues/11069",
			"id": 2369700423,
			"node_id": "IC_kwDOBLftOs6NPsJH",
			"user": {
				"login": "mrjo118",
				"id": 6963004,
				"node_id": "MDQ6VXNlcjY5NjMwMDQ=",
				"avatar_url": "https://avatars.githubusercontent.com/u/6963004?v=4",
				"gravatar_id": "",
				"url": "https://api.github.com/users/mrjo118",
				"html_url": "https://github.com/mrjo118",
				"followers_url": "https://api.github.com/users/mrjo118/followers",
				"following_url": "https://api.github.com/users/mrjo118/following{/other_user}",
				"gists_url": "https://api.github.com/users/mrjo118/gists{/gist_id}",
				"starred_url": "https://api.github.com/users/mrjo118/starred{/owner}{/repo}",
				"subscriptions_url": "https://api.github.com/users/mrjo118/subscriptions",
				"organizations_url": "https://api.github.com/users/mrjo118/orgs",
				"repos_url": "https://api.github.com/users/mrjo118/repos",
				"events_url": "https://api.github.com/users/mrjo118/events{/privacy}",
				"received_events_url": "https://api.github.com/users/mrjo118/received_events",
				"type": "User",
				"user_view_type": "public",
				"site_admin": false
			},
			"created_at": "2024-09-23T22:54:37Z",
			"updated_at": "2024-09-23T23:18:30Z",
			"author_association": "CONTRIBUTOR",
			"body": "> > @laurent22 could you clarify if by \"quality of validation\" you just mean that is needs to prevent invalid values getting in, or also the fact that for the TextInput solution you can see the invalid character briefly before being removed, which might give the impression of the app looking buggy?\r\n> \r\n> Yes, to prevent invalid values to get in.\r\n> \r\n> > I'm guessing this bug / limitation is considered a low priority issue, but if you are not satisfied with the behaviour shown for my TextInput or DropDown solutions due to the latter point, would you consider my decrement and increment button solution, as an interim solution to at least solve the inability to enter an accurate value for the ttl settings on mobile, until a more long term solution is decided for a better user experience?\r\n> \r\n> I'm not a fan of it to be honest as I don't feel it helps that much, and it doesn't exactly look good (we could probably fix this but I don't feel it's worth the time)\r\n\r\nThanks for getting back on that. As your original concern is just preventing invalid values getting in, using the text input originally implemented in this PR should be sufficient, if I extend the onChangeText behaviour to replace the value with the min value or max value when the value is out of bounds (in a similar way to how the desktop app substitutes the value with 0 when removing all characters, which I replicated in this PR).\r\n\r\nRegarding not liking how the increment and decrement solution looks, ok fair enough. Although I could change the styling of the buttons if that helps (maybe remove the blue boxes and just show the plus and minus characters in black?)\r\n\r\nWith regards to the final point about this being not worth fixing: there's at least 2 other people interested in a fix, based on likes on my bug report. But from my perspective I consider it worth fixing because the larger the note history ttl, the larger the number of objects are stored at the sync source. My use case is I use the android app daily, but I only use the desktop version rarely, so with a large note history, a sync after some months will have a lot to catch up on, because I make a lot of brief note edits every day (and I can only view note history on the desktop version in case of accidental data loss). On android the note history ttl value is basically limited to the default 90 days, 1 day, 730 days, or a completely random value in between, because you can't consistently move it to the same position using your finger (even with an external keyboard, using the arrow keys skip over many values). I'd like to be able to have more flexibility, to choose a good compromise between a large amount of objects to sync and a bit of leeway to retain note history more than a day.\r\n\r\nI understand you might not think the fix is necessary, but I am offering to fix the issue myself. Would you consider to be acceptable any of the solutions I have proposed on this PR thread, or some variation of them?",
			"reactions": {
				"url": "https://api.github.com/repos/laurent22/joplin/issues/comments/2369700423/reactions",
				"total_count": 0,
				"+1": 0,
				"-1": 0,
				"laugh": 0,
				"hooray": 0,
				"confused": 0,
				"heart": 0,
				"rocket": 0,
				"eyes": 0
			},
			"performed_via_github_app": null
		},
		{
			"url": "https://api.github.com/repos/laurent22/joplin/issues/comments/2378117119",
			"html_url": "https://github.com/laurent22/joplin/pull/11069#issuecomment-2378117119",
			"issue_url": "https://api.github.com/repos/laurent22/joplin/issues/11069",
			"id": 2378117119,
			"node_id": "IC_kwDOBLftOs6Nvy__",
			"user": {
				"login": "mrjo118",
				"id": 6963004,
				"node_id": "MDQ6VXNlcjY5NjMwMDQ=",
				"avatar_url": "https://avatars.githubusercontent.com/u/6963004?v=4",
				"gravatar_id": "",
				"url": "https://api.github.com/users/mrjo118",
				"html_url": "https://github.com/mrjo118",
				"followers_url": "https://api.github.com/users/mrjo118/followers",
				"following_url": "https://api.github.com/users/mrjo118/following{/other_user}",
				"gists_url": "https://api.github.com/users/mrjo118/gists{/gist_id}",
				"starred_url": "https://api.github.com/users/mrjo118/starred{/owner}{/repo}",
				"subscriptions_url": "https://api.github.com/users/mrjo118/subscriptions",
				"organizations_url": "https://api.github.com/users/mrjo118/orgs",
				"repos_url": "https://api.github.com/users/mrjo118/repos",
				"events_url": "https://api.github.com/users/mrjo118/events{/privacy}",
				"received_events_url": "https://api.github.com/users/mrjo118/received_events",
				"type": "User",
				"user_view_type": "public",
				"site_admin": false
			},
			"created_at": "2024-09-26T23:31:29Z",
			"updated_at": "2024-09-26T23:34:19Z",
			"author_association": "CONTRIBUTOR",
			"body": "@laurent22 I have yet another idea. If you absolutely don't want the aesthetics of the configuration screens to be changed, I could simply add an event handler when you tap the value (i.e. the displayed number and unit, where specified) of any slider component, which will increment the value except when the max value has been reached. That will be a minimal code change which will provide a means to solve the issue that is at least better than what we currently have",
			"reactions": {
				"url": "https://api.github.com/repos/laurent22/joplin/issues/comments/2378117119/reactions",
				"total_count": 0,
				"+1": 0,
				"-1": 0,
				"laugh": 0,
				"hooray": 0,
				"confused": 0,
				"heart": 0,
				"rocket": 0,
				"eyes": 0
			},
			"performed_via_github_app": null
		},
		{
			"url": "https://api.github.com/repos/laurent22/joplin/issues/comments/2378122870",
			"html_url": "https://github.com/laurent22/joplin/pull/11069#issuecomment-2378122870",
			"issue_url": "https://api.github.com/repos/laurent22/joplin/issues/11069",
			"id": 2378122870,
			"node_id": "IC_kwDOBLftOs6Nv0Z2",
			"user": {
				"login": "personalizedrefrigerator",
				"id": 46334387,
				"node_id": "MDQ6VXNlcjQ2MzM0Mzg3",
				"avatar_url": "https://avatars.githubusercontent.com/u/46334387?v=4",
				"gravatar_id": "",
				"url": "https://api.github.com/users/personalizedrefrigerator",
				"html_url": "https://github.com/personalizedrefrigerator",
				"followers_url": "https://api.github.com/users/personalizedrefrigerator/followers",
				"following_url": "https://api.github.com/users/personalizedrefrigerator/following{/other_user}",
				"gists_url": "https://api.github.com/users/personalizedrefrigerator/gists{/gist_id}",
				"starred_url": "https://api.github.com/users/personalizedrefrigerator/starred{/owner}{/repo}",
				"subscriptions_url": "https://api.github.com/users/personalizedrefrigerator/subscriptions",
				"organizations_url": "https://api.github.com/users/personalizedrefrigerator/orgs",
				"repos_url": "https://api.github.com/users/personalizedrefrigerator/repos",
				"events_url": "https://api.github.com/users/personalizedrefrigerator/events{/privacy}",
				"received_events_url": "https://api.github.com/users/personalizedrefrigerator/received_events",
				"type": "User",
				"user_view_type": "public",
				"site_admin": false
			},
			"created_at": "2024-09-26T23:37:50Z",
			"updated_at": "2024-09-26T23:47:05Z",
			"author_association": "COLLABORATOR",
			"body": "It could alternatively make sense to remove all slider components for a similar UI to the desktop app.\r\n\r\nAt present, we're [patching](https://github.com/laurent22/joplin/blob/dev/.yarn/patches/%40react-native-community-slider-npm-4.4.4-d78e472f48.patch) the slider library to prevent a crash on certain Android devices when opening settings (see https://github.com/laurent22/joplin/issues/7974). ~~Removing all slider components would mean fewer patches to maintain.~~ **Edit**: The issue [seems to be fixed upstream!](https://github.com/callstack/react-native-slider/pull/638) The fix was merged 3 days ago and hasn't yet been included in a release.",
			"reactions": {
				"url": "https://api.github.com/repos/laurent22/joplin/issues/comments/2378122870/reactions",
				"total_count": 1,
				"+1": 1,
				"-1": 0,
				"laugh": 0,
				"hooray": 0,
				"confused": 0,
				"heart": 0,
				"rocket": 0,
				"eyes": 0
			},
			"performed_via_github_app": null
		},
		{
			"url": "https://api.github.com/repos/laurent22/joplin/issues/comments/2388729431",
			"html_url": "https://github.com/laurent22/joplin/pull/11069#issuecomment-2388729431",
			"issue_url": "https://api.github.com/repos/laurent22/joplin/issues/11069",
			"id": 2388729431,
			"node_id": "IC_kwDOBLftOs6OYR5X",
			"user": {
				"login": "mrjo118",
				"id": 6963004,
				"node_id": "MDQ6VXNlcjY5NjMwMDQ=",
				"avatar_url": "https://avatars.githubusercontent.com/u/6963004?v=4",
				"gravatar_id": "",
				"url": "https://api.github.com/users/mrjo118",
				"html_url": "https://github.com/mrjo118",
				"followers_url": "https://api.github.com/users/mrjo118/followers",
				"following_url": "https://api.github.com/users/mrjo118/following{/other_user}",
				"gists_url": "https://api.github.com/users/mrjo118/gists{/gist_id}",
				"starred_url": "https://api.github.com/users/mrjo118/starred{/owner}{/repo}",
				"subscriptions_url": "https://api.github.com/users/mrjo118/subscriptions",
				"organizations_url": "https://api.github.com/users/mrjo118/orgs",
				"repos_url": "https://api.github.com/users/mrjo118/repos",
				"events_url": "https://api.github.com/users/mrjo118/events{/privacy}",
				"received_events_url": "https://api.github.com/users/mrjo118/received_events",
				"type": "User",
				"user_view_type": "public",
				"site_admin": false
			},
			"created_at": "2024-10-02T14:03:12Z",
			"updated_at": "2024-10-02T14:03:12Z",
			"author_association": "CONTRIBUTOR",
			"body": "> @laurent22 I have yet another idea. If you absolutely don't want the aesthetics of the configuration screens to be changed, I could simply add an event handler when you tap the value (i.e. the displayed number and unit, where specified) of any slider component, which will increment the value except when the max value has been reached. That will be a minimal code change which will provide a means to solve the issue that is at least better than what we currently have\r\n\r\nI have pushed up this change now in case you would consider it. Here is a video which shows the behaviour:\r\n\r\nhttps://github.com/user-attachments/assets/69b40a97-fe1a-442f-8b58-87e0227db9d7",
			"reactions": {
				"url": "https://api.github.com/repos/laurent22/joplin/issues/comments/2388729431/reactions",
				"total_count": 0,
				"+1": 0,
				"-1": 0,
				"laugh": 0,
				"hooray": 0,
				"confused": 0,
				"heart": 0,
				"rocket": 0,
				"eyes": 0
			},
			"performed_via_github_app": null
		},
		{
			"url": "https://api.github.com/repos/laurent22/joplin/issues/comments/2449929963",
			"html_url": "https://github.com/laurent22/joplin/pull/11069#issuecomment-2449929963",
			"issue_url": "https://api.github.com/repos/laurent22/joplin/issues/11069",
			"id": 2449929963,
			"node_id": "IC_kwDOBLftOs6SBvbr",
			"user": {
				"login": "mrjo118",
				"id": 6963004,
				"node_id": "MDQ6VXNlcjY5NjMwMDQ=",
				"avatar_url": "https://avatars.githubusercontent.com/u/6963004?v=4",
				"gravatar_id": "",
				"url": "https://api.github.com/users/mrjo118",
				"html_url": "https://github.com/mrjo118",
				"followers_url": "https://api.github.com/users/mrjo118/followers",
				"following_url": "https://api.github.com/users/mrjo118/following{/other_user}",
				"gists_url": "https://api.github.com/users/mrjo118/gists{/gist_id}",
				"starred_url": "https://api.github.com/users/mrjo118/starred{/owner}{/repo}",
				"subscriptions_url": "https://api.github.com/users/mrjo118/subscriptions",
				"organizations_url": "https://api.github.com/users/mrjo118/orgs",
				"repos_url": "https://api.github.com/users/mrjo118/repos",
				"events_url": "https://api.github.com/users/mrjo118/events{/privacy}",
				"received_events_url": "https://api.github.com/users/mrjo118/received_events",
				"type": "User",
				"user_view_type": "public",
				"site_admin": false
			},
			"created_at": "2024-10-31T14:05:04Z",
			"updated_at": "2024-10-31T14:05:04Z",
			"author_association": "CONTRIBUTOR",
			"body": "@laurent22 Is there any chance of this cut down code change getting merged? Note history and trash ttl are pretty much set and forget, so not a big deal if the user experience isn't great (but still better than it is now anyway) and it would at least allow those settings to be set consistently across mobile and desktop.",
			"reactions": {
				"url": "https://api.github.com/repos/laurent22/joplin/issues/comments/2449929963/reactions",
				"total_count": 0,
				"+1": 0,
				"-1": 0,
				"laugh": 0,
				"hooray": 0,
				"confused": 0,
				"heart": 0,
				"rocket": 0,
				"eyes": 0
			},
			"performed_via_github_app": null
		},
		{
			"url": "https://api.github.com/repos/laurent22/joplin/issues/comments/2466202464",
			"html_url": "https://github.com/laurent22/joplin/pull/11069#issuecomment-2466202464",
			"issue_url": "https://api.github.com/repos/laurent22/joplin/issues/11069",
			"id": 2466202464,
			"node_id": "IC_kwDOBLftOs6S_0Ng",
			"user": {
				"login": "laurent22",
				"id": 1285584,
				"node_id": "MDQ6VXNlcjEyODU1ODQ=",
				"avatar_url": "https://avatars.githubusercontent.com/u/1285584?v=4",
				"gravatar_id": "",
				"url": "https://api.github.com/users/laurent22",
				"html_url": "https://github.com/laurent22",
				"followers_url": "https://api.github.com/users/laurent22/followers",
				"following_url": "https://api.github.com/users/laurent22/following{/other_user}",
				"gists_url": "https://api.github.com/users/laurent22/gists{/gist_id}",
				"starred_url": "https://api.github.com/users/laurent22/starred{/owner}{/repo}",
				"subscriptions_url": "https://api.github.com/users/laurent22/subscriptions",
				"organizations_url": "https://api.github.com/users/laurent22/orgs",
				"repos_url": "https://api.github.com/users/laurent22/repos",
				"events_url": "https://api.github.com/users/laurent22/events{/privacy}",
				"received_events_url": "https://api.github.com/users/laurent22/received_events",
				"type": "User",
				"user_view_type": "public",
				"site_admin": false
			},
			"created_at": "2024-11-09T12:49:51Z",
			"updated_at": "2024-11-09T12:49:51Z",
			"author_association": "OWNER",
			"body": "> @laurent22 Is there any chance of this cut down code change getting merged? Note history and trash ttl are pretty much set and forget, so not a big deal if the user experience isn't great (but still better than it is now anyway) and it would at least allow those settings to be set consistently across mobile and desktop.\r\n\r\nI wouldn't mind a text input only but it needs to be validate the value, like the slider currently does. I'm not sure how easy it is to do though",
			"reactions": {
				"url": "https://api.github.com/repos/laurent22/joplin/issues/comments/2466202464/reactions",
				"total_count": 0,
				"+1": 0,
				"-1": 0,
				"laugh": 0,
				"hooray": 0,
				"confused": 0,
				"heart": 0,
				"rocket": 0,
				"eyes": 0
			},
			"performed_via_github_app": null
		},
		{
			"url": "https://api.github.com/repos/laurent22/joplin/issues/comments/2472024006",
			"html_url": "https://github.com/laurent22/joplin/pull/11069#issuecomment-2472024006",
			"issue_url": "https://api.github.com/repos/laurent22/joplin/issues/11069",
			"id": 2472024006,
			"node_id": "IC_kwDOBLftOs6TWBfG",
			"user": {
				"login": "mrjo118",
				"id": 6963004,
				"node_id": "MDQ6VXNlcjY5NjMwMDQ=",
				"avatar_url": "https://avatars.githubusercontent.com/u/6963004?v=4",
				"gravatar_id": "",
				"url": "https://api.github.com/users/mrjo118",
				"html_url": "https://github.com/mrjo118",
				"followers_url": "https://api.github.com/users/mrjo118/followers",
				"following_url": "https://api.github.com/users/mrjo118/following{/other_user}",
				"gists_url": "https://api.github.com/users/mrjo118/gists{/gist_id}",
				"starred_url": "https://api.github.com/users/mrjo118/starred{/owner}{/repo}",
				"subscriptions_url": "https://api.github.com/users/mrjo118/subscriptions",
				"organizations_url": "https://api.github.com/users/mrjo118/orgs",
				"repos_url": "https://api.github.com/users/mrjo118/repos",
				"events_url": "https://api.github.com/users/mrjo118/events{/privacy}",
				"received_events_url": "https://api.github.com/users/mrjo118/received_events",
				"type": "User",
				"user_view_type": "public",
				"site_admin": false
			},
			"created_at": "2024-11-13T00:34:38Z",
			"updated_at": "2024-11-13T00:35:43Z",
			"author_association": "CONTRIBUTOR",
			"body": "> > @laurent22 Is there any chance of this cut down code change getting merged? Note history and trash ttl are pretty much set and forget, so not a big deal if the user experience isn't great (but still better than it is now anyway) and it would at least allow those settings to be set consistently across mobile and desktop.\r\n> \r\n> I wouldn't mind a text input only but it needs to be validate the value, like the slider currently does. I'm not sure how easy it is to do though\r\n\r\nThanks for making a decision on this. There is actually an existing validation mechanism on save of settings which I could work with. However it was a bit of a can of worms as there were a number of issues I found with it, which may or may not have ever surfaced depending on how it was possible to get the existing validation error currently. I have pushed up some changes to implement as described, which includes a number of other changes to facilitate the validation flows working properly as well. I've updated the original description of the PR with the new details",
			"reactions": {
				"url": "https://api.github.com/repos/laurent22/joplin/issues/comments/2472024006/reactions",
				"total_count": 0,
				"+1": 0,
				"-1": 0,
				"laugh": 0,
				"hooray": 0,
				"confused": 0,
				"heart": 0,
				"rocket": 0,
				"eyes": 0
			},
			"performed_via_github_app": null
		},
		{
			"url": "https://api.github.com/repos/laurent22/joplin/issues/comments/2529980941",
			"html_url": "https://github.com/laurent22/joplin/pull/11069#issuecomment-2529980941",
			"issue_url": "https://api.github.com/repos/laurent22/joplin/issues/11069",
			"id": 2529980941,
			"node_id": "IC_kwDOBLftOs6WzHIN",
			"user": {
				"login": "mrjo118",
				"id": 6963004,
				"node_id": "MDQ6VXNlcjY5NjMwMDQ=",
				"avatar_url": "https://avatars.githubusercontent.com/u/6963004?v=4",
				"gravatar_id": "",
				"url": "https://api.github.com/users/mrjo118",
				"html_url": "https://github.com/mrjo118",
				"followers_url": "https://api.github.com/users/mrjo118/followers",
				"following_url": "https://api.github.com/users/mrjo118/following{/other_user}",
				"gists_url": "https://api.github.com/users/mrjo118/gists{/gist_id}",
				"starred_url": "https://api.github.com/users/mrjo118/starred{/owner}{/repo}",
				"subscriptions_url": "https://api.github.com/users/mrjo118/subscriptions",
				"organizations_url": "https://api.github.com/users/mrjo118/orgs",
				"repos_url": "https://api.github.com/users/mrjo118/repos",
				"events_url": "https://api.github.com/users/mrjo118/events{/privacy}",
				"received_events_url": "https://api.github.com/users/mrjo118/received_events",
				"type": "User",
				"user_view_type": "public",
				"site_admin": false
			},
			"created_at": "2024-12-10T01:26:04Z",
			"updated_at": "2024-12-10T01:41:46Z",
			"author_association": "CONTRIBUTOR",
			"body": "@laurent22 All feedback should now be addressed. I've updated the testing scenarios in the description as well",
			"reactions": {
				"url": "https://api.github.com/repos/laurent22/joplin/issues/comments/2529980941/reactions",
				"total_count": 0,
				"+1": 0,
				"-1": 0,
				"laugh": 0,
				"hooray": 0,
				"confused": 0,
				"heart": 0,
				"rocket": 0,
				"eyes": 0
			},
			"performed_via_github_app": null
		},
		{
			"url": "https://api.github.com/repos/laurent22/joplin/issues/comments/2576268493",
			"html_url": "https://github.com/laurent22/joplin/pull/11069#issuecomment-2576268493",
			"issue_url": "https://api.github.com/repos/laurent22/joplin/issues/11069",
			"id": 2576268493,
			"node_id": "IC_kwDOBLftOs6ZjrzN",
			"user": {
				"login": "mrjo118",
				"id": 6963004,
				"node_id": "MDQ6VXNlcjY5NjMwMDQ=",
				"avatar_url": "https://avatars.githubusercontent.com/u/6963004?v=4",
				"gravatar_id": "",
				"url": "https://api.github.com/users/mrjo118",
				"html_url": "https://github.com/mrjo118",
				"followers_url": "https://api.github.com/users/mrjo118/followers",
				"following_url": "https://api.github.com/users/mrjo118/following{/other_user}",
				"gists_url": "https://api.github.com/users/mrjo118/gists{/gist_id}",
				"starred_url": "https://api.github.com/users/mrjo118/starred{/owner}{/repo}",
				"subscriptions_url": "https://api.github.com/users/mrjo118/subscriptions",
				"organizations_url": "https://api.github.com/users/mrjo118/orgs",
				"repos_url": "https://api.github.com/users/mrjo118/repos",
				"events_url": "https://api.github.com/users/mrjo118/events{/privacy}",
				"received_events_url": "https://api.github.com/users/mrjo118/received_events",
				"type": "User",
				"user_view_type": "public",
				"site_admin": false
			},
			"created_at": "2025-01-07T21:37:39Z",
			"updated_at": "2025-01-07T21:37:39Z",
			"author_association": "CONTRIBUTOR",
			"body": "@laurent22 I didn't get round to uploading new videos of the behaviour and test scenarios last month. I've now updated the original post with updated videos of the behaviour following the review feedback, so the PR description has all the up to date information now",
			"reactions": {
				"url": "https://api.github.com/repos/laurent22/joplin/issues/comments/2576268493/reactions",
				"total_count": 0,
				"+1": 0,
				"-1": 0,
				"laugh": 0,
				"hooray": 0,
				"confused": 0,
				"heart": 0,
				"rocket": 0,
				"eyes": 0
			},
			"performed_via_github_app": null
		},
		{
			"url": "https://api.github.com/repos/laurent22/joplin/issues/comments/2649560704",
			"html_url": "https://github.com/laurent22/joplin/pull/11069#issuecomment-2649560704",
			"issue_url": "https://api.github.com/repos/laurent22/joplin/issues/11069",
			"id": 2649560704,
			"node_id": "IC_kwDOBLftOs6d7RaA",
			"user": {
				"login": "mrjo118",
				"id": 6963004,
				"node_id": "MDQ6VXNlcjY5NjMwMDQ=",
				"avatar_url": "https://avatars.githubusercontent.com/u/6963004?v=4",
				"gravatar_id": "",
				"url": "https://api.github.com/users/mrjo118",
				"html_url": "https://github.com/mrjo118",
				"followers_url": "https://api.github.com/users/mrjo118/followers",
				"following_url": "https://api.github.com/users/mrjo118/following{/other_user}",
				"gists_url": "https://api.github.com/users/mrjo118/gists{/gist_id}",
				"starred_url": "https://api.github.com/users/mrjo118/starred{/owner}{/repo}",
				"subscriptions_url": "https://api.github.com/users/mrjo118/subscriptions",
				"organizations_url": "https://api.github.com/users/mrjo118/orgs",
				"repos_url": "https://api.github.com/users/mrjo118/repos",
				"events_url": "https://api.github.com/users/mrjo118/events{/privacy}",
				"received_events_url": "https://api.github.com/users/mrjo118/received_events",
				"type": "User",
				"user_view_type": "public",
				"site_admin": false
			},
			"created_at": "2025-02-11T00:32:21Z",
			"updated_at": "2025-02-11T00:32:21Z",
			"author_association": "CONTRIBUTOR",
			"body": "Closing this in favour of https://github.com/laurent22/joplin/pull/11822",
			"reactions": {
				"url": "https://api.github.com/repos/laurent22/joplin/issues/comments/2649560704/reactions",
				"total_count": 0,
				"+1": 0,
				"-1": 0,
				"laugh": 0,
				"hooray": 0,
				"confused": 0,
				"heart": 0,
				"rocket": 0,
				"eyes": 0
			},
			"performed_via_github_app": null
		}
	]
}