Skip to content

Commit f91d4f4

Browse files
committed
fix: allow to delete selected server
1 parent 3365394 commit f91d4f4

8 files changed

Lines changed: 69 additions & 28 deletions

File tree

app/src/main/kotlin/features/proxy/server/list/ProxyServerListMessages.kt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ internal data class ProxyServerListMessages(
2323
val serviceStarted: String,
2424
val serviceStopped: String,
2525
val selectServerFirst: String,
26-
val deleteSelectedBlocked: String,
2726
val latencyResultTemplate: String,
2827
val latencyFailed: String,
2928
val importResultTemplate: String,
@@ -52,7 +51,6 @@ internal fun proxyServerListMessages(): ProxyServerListMessages {
5251
serviceStarted = stringResource(R.string.proxy_server_list_service_started),
5352
serviceStopped = stringResource(R.string.proxy_server_list_service_stopped),
5453
selectServerFirst = stringResource(R.string.proxy_server_list_select_first),
55-
deleteSelectedBlocked = stringResource(R.string.proxy_server_list_delete_selected_blocked),
5654
latencyResultTemplate = stringResource(R.string.proxy_server_list_latency_result),
5755
latencyFailed = stringResource(R.string.proxy_server_list_latency_failed),
5856
importResultTemplate = stringResource(R.string.proxy_server_list_import_result),

app/src/main/kotlin/features/proxy/server/list/ProxyServerListPage.kt

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ import top.yukonga.miuix.kmp.basic.MiuixScrollBehavior
4646
import top.yukonga.miuix.kmp.basic.Scaffold
4747
import ui.layout.pageContentPaddingWithCutout
4848
import ui.layout.pageListPadding
49+
import ui.text.formatTemplate
4950

5051
private const val ProxyServerEditResultKey = "proxy-server-edit-result"
5152

@@ -146,6 +147,54 @@ fun ProxyServerListPage(
146147
)
147148
}
148149

150+
fun deleteProxyServer(server: ProxyServerState) {
151+
runProxyServiceOperation {
152+
when (val stopResult = proxyServiceUseCase.stop(stateStore.state.value.runMode)) {
153+
is ProxyServiceResult.Success -> {
154+
val remarks = server.server.getInfo().remarks
155+
var deleted = false
156+
var nextSelectedServerId = stateStore.state.value.selectedProxyServerId
157+
updateAppState { state ->
158+
val nextServers = state.proxyServers.filterNot { it.id == server.id }
159+
if (nextServers.size == state.proxyServers.size) {
160+
state.copy(
161+
proxyRunning = stopResult.proxyRunning,
162+
localProxyPort = stopResult.appState?.localProxyPort ?: state.localProxyPort,
163+
)
164+
} else {
165+
deleted = true
166+
val selectedProxyServerId = if (state.selectedProxyServerId == server.id) {
167+
nextServers.firstOrNull()?.id ?: state.selectedProxyServerId
168+
} else {
169+
state.selectedProxyServerId
170+
}
171+
nextSelectedServerId = selectedProxyServerId
172+
state.copy(
173+
proxyServers = nextServers,
174+
selectedProxyServerId = selectedProxyServerId,
175+
proxyRunning = stopResult.proxyRunning,
176+
localProxyPort = stopResult.appState?.localProxyPort ?: state.localProxyPort,
177+
)
178+
}
179+
}
180+
selectedServerId = nextSelectedServerId
181+
if (deleted) {
182+
tipNotifier.show(messages.deletedTemplate.formatTemplate("name" to remarks))
183+
}
184+
}
185+
186+
ProxyServiceResult.MissingServer -> {
187+
tipNotifier.show(messages.selectServerFirst)
188+
}
189+
190+
is ProxyServiceResult.Failed -> {
191+
updateAppState { state -> state.copy(proxyRunning = false) }
192+
tipNotifier.showError(stopResult.error, messages.serviceStopped)
193+
}
194+
}
195+
}
196+
}
197+
149198
ProxyServerEditResultHandler(
150199
navigator = navigator,
151200
resultKey = ProxyServerEditResultKey,
@@ -273,6 +322,7 @@ fun ProxyServerListPage(
273322
messages = messages,
274323
resultKey = ProxyServerEditResultKey,
275324
onSelectedServerIdChange = { selectedServerId = it },
325+
onDeleteServer = ::deleteProxyServer,
276326
)
277327
ProxyServerListFloatingToolbar(
278328
running = proxyRunning,

app/src/main/kotlin/features/proxy/server/list/ProxyServerListPager.kt

Lines changed: 4 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,6 @@ import ui.components.rememberReorderableLazyListContentPaddingWithoutTop
4747
import ui.components.rememberReorderableScrollThresholdPadding
4848
import ui.feedback.AndroidToastTipNotifier
4949
import ui.layout.pageScrollModifiers
50-
import ui.text.formatTemplate
5150

5251
@Composable
5352
internal fun ProxyServerListPager(
@@ -71,6 +70,7 @@ internal fun ProxyServerListPager(
7170
messages: ProxyServerListMessages,
7271
resultKey: String,
7372
onSelectedServerIdChange: (Int) -> Unit,
73+
onDeleteServer: (ProxyServerState) -> Unit,
7474
) {
7575
val context = LocalContext.current
7676

@@ -155,6 +155,7 @@ internal fun ProxyServerListPager(
155155
messages = messages,
156156
resultKey = resultKey,
157157
onSelectedServerIdChange = onSelectedServerIdChange,
158+
onDeleteServer = onDeleteServer,
158159
isDragging = isDragging,
159160
dragModifier = Modifier.longPressReorderDragHandle(
160161
scope = this,
@@ -200,6 +201,7 @@ private fun ProxyServerListItem(
200201
messages: ProxyServerListMessages,
201202
resultKey: String,
202203
onSelectedServerIdChange: (Int) -> Unit,
204+
onDeleteServer: (ProxyServerState) -> Unit,
203205
isDragging: Boolean,
204206
modifier: Modifier = Modifier,
205207
dragModifier: Modifier,
@@ -258,26 +260,7 @@ private fun ProxyServerListItem(
258260
)
259261
},
260262
onDelete = {
261-
var deleted = false
262-
updateAppState { state ->
263-
if (state.selectedProxyServerId == server.id) {
264-
state
265-
} else {
266-
deleted = true
267-
state.copy(
268-
proxyServers = state.proxyServers.filterNot { it.id == server.id },
269-
)
270-
}
271-
}
272-
scope.launch {
273-
tipNotifier.show(
274-
if (deleted) {
275-
messages.deletedTemplate.formatTemplate("name" to server.server.getInfo().remarks)
276-
} else {
277-
messages.deleteSelectedBlocked
278-
},
279-
)
280-
}
263+
onDeleteServer(server)
281264
},
282265
)
283266
}

app/src/main/kotlin/features/proxy/server/usecase/ProxyServerUseCases.kt

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,9 +56,11 @@ internal fun AppState.withImportedProxyServers(
5656
server = server,
5757
)
5858
}
59+
val nextServers = importedServers + proxyServers
5960
return copy(
60-
proxyServers = importedServers + proxyServers,
61+
proxyServers = nextServers,
6162
nextProxyServerId = maxOf(nextProxyServerId, nextServerId),
63+
selectedProxyServerId = selectedProxyServerIdOrFirstAvailable(nextServers),
6264
)
6365
}
6466

@@ -97,6 +99,7 @@ internal fun AppState.withSavedProxyServer(
9799
state = copy(
98100
proxyServers = nextServers,
99101
nextProxyServerId = maxOf(nextProxyServerId, serverId + 1),
102+
selectedProxyServerId = selectedProxyServerIdOrFirstAvailable(nextServers),
100103
),
101104
existingGroupId = existingGroupId,
102105
wasExisting = wasExisting,
@@ -125,6 +128,7 @@ internal fun AppState.withUpdatedSubscriptionServers(
125128
val selectedServerId = when {
126129
nextServers.any { server -> server.id == selectedProxyServerId } -> selectedProxyServerId
127130
else -> proxyServers.firstOrNull { server -> server.groupId !in updatedGroupIds }?.id
131+
?: nextServers.firstOrNull()?.id
128132
?: selectedProxyServerId
129133
}
130134
return copy(
@@ -253,6 +257,14 @@ internal fun createProxyServer(action: ProxyServerListAddAction): ProxyServer<*>
253257
}
254258
}
255259

260+
private fun AppState.selectedProxyServerIdOrFirstAvailable(nextServers: List<ProxyServerState>): Int {
261+
return if (nextServers.any { server -> server.id == selectedProxyServerId }) {
262+
selectedProxyServerId
263+
} else {
264+
nextServers.firstOrNull()?.id ?: selectedProxyServerId
265+
}
266+
}
267+
256268
private fun String.latencySortKey(): Int {
257269
return latencyResultNumberRegex.find(this)?.value?.toIntOrNull() ?: Int.MAX_VALUE
258270
}

app/src/main/kotlin/features/proxy/server/usecase/ProxyServiceUseCase.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ internal class ProxyServiceUseCase(
4848
)
4949
}
5050

51-
private suspend fun stop(runMode: Int): ProxyServiceResult {
51+
suspend fun stop(runMode: Int): ProxyServiceResult {
5252
return runCatching { proxyEngine.stop(runMode) }.fold(
5353
onSuccess = { status -> ProxyServiceResult.Success(proxyRunning = status.running, appState = status.appState) },
5454
onFailure = { error -> ProxyServiceResult.Failed(error) },

app/src/main/res/values-zh-rCN/strings.xml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -332,7 +332,6 @@
332332
<string name="proxy_server_list_service_started">代理服务已启动</string>
333333
<string name="proxy_server_list_service_stopped">代理服务已停止</string>
334334
<string name="proxy_server_list_select_first">请先选择一个代理节点</string>
335-
<string name="proxy_server_list_delete_selected_blocked">不能删除当前选择的代理节点</string>
336335
<string name="proxy_server_list_latency_result">{name} 延迟 {latency}</string>
337336
<string name="proxy_server_list_latency_failed">失败</string>
338337
<string name="proxy_server_list_import_result">导入成功{serverCount}个代理节点</string>

app/src/main/res/values/strings.xml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -332,7 +332,6 @@
332332
<string name="proxy_server_list_service_started">Proxy service started</string>
333333
<string name="proxy_server_list_service_stopped">Proxy service stopped</string>
334334
<string name="proxy_server_list_select_first">Select a proxy server first</string>
335-
<string name="proxy_server_list_delete_selected_blocked">The selected proxy server cannot be deleted</string>
336335
<string name="proxy_server_list_latency_result">{name} latency {latency}</string>
337336
<string name="proxy_server_list_latency_failed">Failed</string>
338337
<string name="proxy_server_list_import_result">Imported {serverCount} proxy servers</string>

gradle/libs.versions.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ kotlinx-serialization-json = "1.11.0"
1111
ksp = "2.3.9"
1212
ktor = "3.5.0"
1313
libsu = "6.0.0"
14-
miuix = "0.9.1"
14+
miuix = "0.9.2"
1515
reorderable = "3.1.0"
1616
snakeyaml-engine = "3.0.1"
1717
zxing-android-embedded = "4.3.0"

0 commit comments

Comments
 (0)