1
- import { Button , Input , Tab , Tabs } from '@nextui-org/react'
1
+ import { Button , Input , Switch , Tab , Tabs } from '@nextui-org/react'
2
2
import BasePage from '@renderer/components/base/base-page'
3
3
import SettingCard from '@renderer/components/base/base-setting-card'
4
4
import SettingItem from '@renderer/components/base/base-setting-item'
@@ -7,6 +7,7 @@ import { useAppConfig } from '@renderer/hooks/use-app-config'
7
7
import { triggerSysProxy } from '@renderer/utils/ipc'
8
8
import { Key , useState } from 'react'
9
9
import React from 'react'
10
+ import { MdDeleteForever } from 'react-icons/md'
10
11
11
12
const defaultPacScript = `
12
13
function FindProxyForURL(url, host) {
@@ -16,10 +17,35 @@ function FindProxyForURL(url, host) {
16
17
17
18
const Sysproxy : React . FC = ( ) => {
18
19
const { appConfig, patchAppConfig } = useAppConfig ( )
19
- const { sysProxy } = appConfig || { sysProxy : { enable : false } }
20
+ const { sysProxy } = appConfig || ( { sysProxy : { enable : false } } as IAppConfig )
21
+
22
+ const [ values , setValues ] = useState ( {
23
+ enable : sysProxy . enable ,
24
+ host : sysProxy . host ?? '' ,
25
+ useDefaultBypass : sysProxy . useDefaultBypass ?? true ,
26
+ bypass : sysProxy . bypass ?? [ ] ,
27
+ mode : sysProxy . mode ?? 'manual' ,
28
+ pacScript : sysProxy . pacScript ?? defaultPacScript
29
+ } )
20
30
21
- const [ values , setValues ] = useState < ISysProxyConfig > ( sysProxy )
22
31
const [ openPacEditor , setOpenPacEditor ] = useState ( false )
32
+
33
+ const handleBypassChange = ( value : string , index : number ) : void => {
34
+ const newBypass = [ ...values . bypass ]
35
+ if ( index === newBypass . length ) {
36
+ if ( value . trim ( ) !== '' ) {
37
+ newBypass . push ( value )
38
+ }
39
+ } else {
40
+ if ( value . trim ( ) === '' ) {
41
+ newBypass . splice ( index , 1 )
42
+ } else {
43
+ newBypass [ index ] = value
44
+ }
45
+ }
46
+ setValues ( { ...values , bypass : newBypass } )
47
+ }
48
+
23
49
const onSave = async ( ) : Promise < void > => {
24
50
// check valid TODO
25
51
await patchAppConfig ( { sysProxy : values } )
@@ -74,11 +100,52 @@ const Sysproxy: React.FC = () => {
74
100
< Tab className = "select-none" key = "auto" title = "PAC" />
75
101
</ Tabs >
76
102
</ SettingItem >
77
- < SettingItem title = "代理模式" >
78
- < Button size = "sm" onPress = { ( ) => setOpenPacEditor ( true ) } variant = "bordered" >
79
- 编辑PAC脚本
80
- </ Button >
81
- </ SettingItem >
103
+
104
+ { values . mode === 'auto' && (
105
+ < SettingItem title = "代理模式" >
106
+ < Button size = "sm" onPress = { ( ) => setOpenPacEditor ( true ) } variant = "bordered" >
107
+ 编辑PAC脚本
108
+ </ Button >
109
+ </ SettingItem >
110
+ ) }
111
+ { values . mode === 'manual' && (
112
+ < >
113
+ < SettingItem title = "使用默认代理绕过" divider >
114
+ < Switch
115
+ size = "sm"
116
+ isSelected = { values . useDefaultBypass }
117
+ onValueChange = { ( v ) => {
118
+ setValues ( { ...values , useDefaultBypass : v } )
119
+ } }
120
+ />
121
+ </ SettingItem >
122
+ < div className = "flex flex-col items-stretch" >
123
+ < h3 className = "select-none mb-2" > 代理绕过</ h3 >
124
+ { [ ...values . bypass , '' ] . map ( ( domain , index ) => (
125
+ < div key = { index } className = "mb-2 flex" >
126
+ < Input
127
+ fullWidth
128
+ size = "sm"
129
+ placeholder = "例: *.baidu.com"
130
+ value = { domain }
131
+ onValueChange = { ( v ) => handleBypassChange ( v , index ) }
132
+ />
133
+ { index < values . bypass . length && (
134
+ < Button
135
+ className = "ml-2"
136
+ size = "sm"
137
+ variant = "flat"
138
+ color = "warning"
139
+ onClick = { ( ) => handleBypassChange ( '' , index ) }
140
+ >
141
+ < MdDeleteForever className = "text-lg" />
142
+ </ Button >
143
+ ) }
144
+ </ div >
145
+ ) ) }
146
+ </ div >
147
+ </ >
148
+ ) }
82
149
</ SettingCard >
83
150
</ BasePage >
84
151
)
0 commit comments