@@ -25,6 +25,10 @@ import { useViewport } from "../../../hooks/use-viewport";
2525import { useTranslation } from "../../../lib/i18n" ;
2626import { notificationPreferencesAtom } from "../../notifications/atoms" ;
2727import { MobilePageHeader } from "../../shared/components/mobile-page-header" ;
28+ import {
29+ resolveTerminalCopyOnSelectSetting ,
30+ terminalPreferencesAtom ,
31+ } from "../../terminal-panel/preferences" ;
2832import { type ProviderInfo , ProviderSettings } from "./provider-settings" ;
2933import { resolveSettingsExitTargetFromBrowserHistory } from "./settings-navigation" ;
3034import {
@@ -147,6 +151,7 @@ export function SettingsPage() {
147151 const [ terminalRenderer , setTerminalRendererState ] = useState < "standard" | "compatibility" > (
148152 "standard"
149153 ) ;
154+ const [ terminalCopyOnSelect , setTerminalCopyOnSelectState ] = useState ( false ) ;
150155 const [ providerAdditionalArgsById , setProviderAdditionalArgsById ] = useState <
151156 Record < string , string >
152157 > ( { } ) ;
@@ -156,10 +161,12 @@ export function SettingsPage() {
156161 const [ locale , setLocaleState ] = useAtom ( localeAtom ) ;
157162 const [ theme , setTheme ] = useAtom ( themeAtom ) ;
158163 const setNotificationPreferences = useSetAtom ( notificationPreferencesAtom ) ;
164+ const setTerminalPreferences = useSetAtom ( terminalPreferencesAtom ) ;
159165 const settingsLoadFailedUnknownRef = useRef ( settingsLoadFailedUnknown ) ;
160166 const appearanceSelectionVersionRef = useRef ( {
161167 locale : 0 ,
162168 terminalRenderer : 0 ,
169+ terminalCopyOnSelect : 0 ,
163170 } ) ;
164171 const detailSection =
165172 navigationState . kind === "detail" ? navigationState . section : navigationState . lastSection ;
@@ -233,6 +240,14 @@ export function SettingsPage() {
233240 setTerminalRendererState ( settings [ "appearance.terminalRenderer" ] ) ;
234241 }
235242 }
243+ if ( typeof settings [ "appearance.terminalCopyOnSelect" ] === "boolean" ) {
244+ if (
245+ appearanceSelectionVersionRef . current . terminalCopyOnSelect ===
246+ appearanceSelectionVersionAtRequestStart . terminalCopyOnSelect
247+ ) {
248+ setTerminalCopyOnSelectState ( settings [ "appearance.terminalCopyOnSelect" ] ) ;
249+ }
250+ }
236251 if ( settings [ "appearance.locale" ] === "zh" || settings [ "appearance.locale" ] === "en" ) {
237252 if (
238253 appearanceSelectionVersionRef . current . locale ===
@@ -241,14 +256,24 @@ export function SettingsPage() {
241256 setLocaleState ( settings [ "appearance.locale" ] ) ;
242257 }
243258 }
259+ setTerminalPreferences ( {
260+ copyOnSelect : resolveTerminalCopyOnSelectSetting ( settings ) ,
261+ } ) ;
244262 setProviderAdditionalArgsById ( loadProviderAdditionalArgs ( settings , providers ) ) ;
245263 } ;
246264
247265 void loadSettings ( ) ;
248266 return ( ) => {
249267 cancelled = true ;
250268 } ;
251- } , [ connectionStatus , dispatch , setLocaleState , setNotificationPreferences , settingsRefreshKey ] ) ;
269+ } , [
270+ connectionStatus ,
271+ dispatch ,
272+ setLocaleState ,
273+ setNotificationPreferences ,
274+ setTerminalPreferences ,
275+ settingsRefreshKey ,
276+ ] ) ;
252277
253278 const handleLocaleSelection = ( value : "zh" | "en" ) => {
254279 appearanceSelectionVersionRef . current . locale += 1 ;
@@ -260,6 +285,12 @@ export function SettingsPage() {
260285 setTerminalRendererState ( value ) ;
261286 } ;
262287
288+ const handleTerminalCopyOnSelectSelection = ( value : boolean ) => {
289+ appearanceSelectionVersionRef . current . terminalCopyOnSelect += 1 ;
290+ setTerminalCopyOnSelectState ( value ) ;
291+ setTerminalPreferences ( { copyOnSelect : value } ) ;
292+ } ;
293+
263294 useEffect ( ( ) => {
264295 if ( detailSection !== "providers" ) {
265296 setContentLayoutMode ( "default" ) ;
@@ -307,6 +338,8 @@ export function SettingsPage() {
307338 setLocale = { handleLocaleSelection }
308339 terminalRenderer = { terminalRenderer }
309340 setTerminalRenderer = { handleTerminalRendererSelection }
341+ terminalCopyOnSelect = { terminalCopyOnSelect }
342+ setTerminalCopyOnSelect = { handleTerminalCopyOnSelectSelection }
310343 theme = { theme }
311344 setTheme = { setTheme }
312345 />
@@ -727,6 +760,8 @@ interface AppearanceSettingsProps {
727760 setLocale : ( value : "zh" | "en" ) => void ;
728761 terminalRenderer : "standard" | "compatibility" ;
729762 setTerminalRenderer : ( value : "standard" | "compatibility" ) => void ;
763+ terminalCopyOnSelect : boolean ;
764+ setTerminalCopyOnSelect : ( value : boolean ) => void ;
730765 theme : "dark" | "light" ;
731766 setTheme : ( value : "dark" | "light" ) => void ;
732767}
@@ -736,6 +771,8 @@ function AppearanceSettings({
736771 setLocale,
737772 terminalRenderer,
738773 setTerminalRenderer,
774+ terminalCopyOnSelect,
775+ setTerminalCopyOnSelect,
739776 theme,
740777 setTheme,
741778} : AppearanceSettingsProps ) {
@@ -744,6 +781,8 @@ function AppearanceSettings({
744781 const themeDescId = useId ( ) ;
745782 const terminalRendererTitleId = useId ( ) ;
746783 const terminalRendererDescId = useId ( ) ;
784+ const copyOnSelectLabelId = useId ( ) ;
785+ const copyOnSelectDescId = useId ( ) ;
747786 const languageTitleId = useId ( ) ;
748787 const languageDescId = useId ( ) ;
749788 const dispatch = useAtomValue ( dispatchCommandAtom ) ;
@@ -826,6 +865,27 @@ function AppearanceSettings({
826865 { t ( "settings.terminal_compatibility" ) }
827866 </ Pill >
828867 </ div >
868+
869+ < div className = "settings-toggle-row" >
870+ < div className = "settings-toggle-info" >
871+ < span className = "settings-toggle-label" id = { copyOnSelectLabelId } >
872+ { t ( "settings.copy_on_select" ) }
873+ </ span >
874+ < span className = "settings-toggle-desc" id = { copyOnSelectDescId } >
875+ { t ( "settings.copy_on_select_hint" ) }
876+ </ span >
877+ </ div >
878+ < Switch
879+ aria-describedby = { copyOnSelectDescId }
880+ aria-labelledby = { copyOnSelectLabelId }
881+ checked = { terminalCopyOnSelect }
882+ className = "settings-toggle"
883+ onCheckedChange = { ( nextValue ) => {
884+ setTerminalCopyOnSelect ( nextValue ) ;
885+ void saveSettings ( { appearance : { terminalCopyOnSelect : nextValue } } ) ;
886+ } }
887+ />
888+ </ div >
829889 </ div >
830890
831891 < div className = "settings-group" >
0 commit comments