设置服务器名称

This commit is contained in:
Fin 2025-02-24 15:42:34 +08:00
parent 2bc0eb33b8
commit 355e2e7cb0
6 changed files with 77 additions and 7 deletions

View File

@ -3594,6 +3594,35 @@
} }
} }
}, },
"setServerName" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Set Server Name"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "サーバー名を設定"
}
},
"tr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sunucu Adını Ayarla"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "设置服务器名称"
}
}
}
},
"setSounds" : { "setSounds" : {
"extractionState" : "manual", "extractionState" : "manual",
"localizations" : { "localizations" : {

View File

@ -17,6 +17,7 @@ class Server: Codable {
let address: String let address: String
var key: String var key: String
var state: Client.ClienState var state: Client.ClienState
var name: String?
var host: String { var host: String {
return URL(string: address)?.host ?? "" return URL(string: address)?.host ?? ""
@ -33,6 +34,7 @@ class Server: Codable {
case id case id
case address case address
case key case key
case name
} }
// //
@ -41,6 +43,7 @@ class Server: Codable {
id = try container.decode(String.self, forKey: .id) id = try container.decode(String.self, forKey: .id)
address = try container.decode(String.self, forKey: .address) address = try container.decode(String.self, forKey: .address)
key = try container.decode(String.self, forKey: .key) key = try container.decode(String.self, forKey: .key)
name = try container.decode(String.self, forKey: .name)
state = .ok state = .ok
} }
} }
@ -182,4 +185,9 @@ class ServerManager: NSObject {
self.saveServers() self.saveServers()
} }
} }
func setServerName(server: Server, name: String?) {
server.name = name
saveServers()
}
} }

View File

@ -17,6 +17,7 @@ enum ServerActionType {
case copy case copy
case reset(key: String?) case reset(key: String?)
case delete case delete
case setName(name: String?)
} }
func == (lhs: ServerActionType, rhs: ServerActionType) -> Bool { func == (lhs: ServerActionType, rhs: ServerActionType) -> Bool {
@ -90,12 +91,21 @@ class ServerListViewController: BaseViewController<ServerListViewModel> {
} }
return nil return nil
}.asDriver(onErrorDriveWith: .empty()) }.asDriver(onErrorDriveWith: .empty())
//
let setServerName = action.compactMap { r -> (Server, String?)? in
if case ServerActionType.setName(let name) = r.1 {
return (r.0, name)
}
return nil
}.asDriver(onErrorDriveWith: .empty())
let output = viewModel.transform(input: ServerListViewModel.Input( let output = viewModel.transform(input: ServerListViewModel.Input(
selectServer: selectServer, selectServer: selectServer,
copyServer: copyServer, copyServer: copyServer,
deleteServer: deleteServer, deleteServer: deleteServer,
resetServer: resetServer resetServer: resetServer,
setServerName: setServerName
)) ))
let dataSource = RxTableViewSectionedReloadDataSource<SectionModel<String, ServerListTableViewCellViewModel>> { _, tableView, _, item -> UITableViewCell in let dataSource = RxTableViewSectionedReloadDataSource<SectionModel<String, ServerListTableViewCellViewModel>> { _, tableView, _, item -> UITableViewCell in
@ -136,7 +146,7 @@ class ServerListViewController: BaseViewController<ServerListViewModel> {
return relay return relay
} }
let alertController = UIAlertController(title: nil, message: "\(viewModel.address.value)", preferredStyle: .actionSheet) let alertController = UIAlertController(title: nil, message: "\(URL(string: viewModel.server.address)?.host ?? "")", preferredStyle: .actionSheet)
alertController.addAction(UIAlertAction(title: NSLocalizedString("copyAddressAndKey"), style: .default, handler: { _ in alertController.addAction(UIAlertAction(title: NSLocalizedString("copyAddressAndKey"), style: .default, handler: { _ in
relay.accept((viewModel.server, .copy)) relay.accept((viewModel.server, .copy))
})) }))
@ -157,6 +167,18 @@ class ServerListViewController: BaseViewController<ServerListViewModel> {
relay.accept((viewModel.server, .select)) relay.accept((viewModel.server, .select))
})) }))
alertController.addAction(UIAlertAction(title: NSLocalizedString("setServerName"), style: .default, handler: { _ in
let alertController = UIAlertController(title: NSLocalizedString("setServerName"), message: nil, preferredStyle: .alert)
alertController.addTextField { textField in
textField.text = viewModel.server.name
}
alertController.addAction(UIAlertAction(title: NSLocalizedString("confirm"), style: .default, handler: { _ in
relay.accept((viewModel.server, .setName(name: alertController.textFields?.first?.text)))
}))
alertController.addAction(UIAlertAction(title: NSLocalizedString("Cancel"), style: .cancel, handler: nil))
self.navigationController?.present(alertController, animated: true, completion: nil)
}))
alertController.addAction(UIAlertAction(title: NSLocalizedString("deleteServer"), style: .destructive, handler: { _ in alertController.addAction(UIAlertAction(title: NSLocalizedString("deleteServer"), style: .destructive, handler: { _ in
let alertController = UIAlertController(title: nil, message: NSLocalizedString("confirmDeleteServer"), preferredStyle: .alert) let alertController = UIAlertController(title: nil, message: NSLocalizedString("confirmDeleteServer"), preferredStyle: .alert)

View File

@ -19,6 +19,7 @@ class ServerListViewModel: ViewModel, ViewModelType {
let copyServer: Driver<Server> let copyServer: Driver<Server>
let deleteServer: Driver<Server> let deleteServer: Driver<Server>
let resetServer: Driver<(Server, String?)> let resetServer: Driver<(Server, String?)>
let setServerName: Driver<(Server, String?)>
} }
struct Output { struct Output {
@ -37,6 +38,11 @@ class ServerListViewModel: ViewModel, ViewModelType {
let copy = input.copyServer.map { server -> String in let copy = input.copyServer.map { server -> String in
"\(server.address)/\(server.key)/" "\(server.address)/\(server.key)/"
} }
//
input.setServerName.drive(onNext: { server, name in
ServerManager.shared.setServerName(server: server, name: name)
}).disposed(by: rx.disposeBag)
// //
let deleteCheck = input.deleteServer.map { server -> Server? in let deleteCheck = input.deleteServer.map { server -> Server? in
@ -134,7 +140,8 @@ class ServerListViewModel: ViewModel, ViewModelType {
.merge( .merge(
Observable.just(()), Observable.just(()),
serverDeleted, serverDeleted,
serverResetSuccess serverResetSuccess,
input.setServerName.map { _ in () }.asObservable()
) )
.map { .map {
[SectionModel( [SectionModel(

View File

@ -101,7 +101,7 @@ class ServerListTableViewCell: BaseTableViewCell<ServerListTableViewCellViewMode
override func bindViewModel(model: ServerListTableViewCellViewModel) { override func bindViewModel(model: ServerListTableViewCellViewModel) {
super.bindViewModel(model: model) super.bindViewModel(model: model)
model.address model.name
.bind(to: addressLabel.rx.text) .bind(to: addressLabel.rx.text)
.disposed(by: rx.reuseBag) .disposed(by: rx.reuseBag)

View File

@ -12,15 +12,19 @@ import UIKit
class ServerListTableViewCellViewModel: ViewModel { class ServerListTableViewCellViewModel: ViewModel {
let server: Server let server: Server
let address: BehaviorRelay<String> let name: BehaviorRelay<String>
let key: BehaviorRelay<String> let key: BehaviorRelay<String>
let state: BehaviorRelay<Bool> let state: BehaviorRelay<Bool>
init(server: Server) { init(server: Server) {
self.server = server self.server = server
self.address = BehaviorRelay<String>(value: { self.name = BehaviorRelay<String>(value: {
URL(string: server.address)?.host ?? "Invalid Server" var serverName = URL(string: server.address)?.host ?? "Invalid Server"
if let name = server.name, !name.isEmpty {
serverName = name + "\n" + serverName
}
return serverName
}()) }())
self.key = BehaviorRelay<String>(value: !server.key.isEmpty ? server.key : "none") self.key = BehaviorRelay<String>(value: !server.key.isEmpty ? server.key : "none")
self.state = BehaviorRelay<Bool>(value: server.state == .ok) self.state = BehaviorRelay<Bool>(value: server.state == .ok)