diff --git a/Shared/Generated/Strings.swift b/Shared/Generated/Strings.swift index 301d74ef..9c86798e 100644 --- a/Shared/Generated/Strings.swift +++ b/Shared/Generated/Strings.swift @@ -198,6 +198,8 @@ internal enum L10n { internal static var `none`: String { return L10n.tr("Localizable", "none") } /// No overview available internal static var noOverviewAvailable: String { return L10n.tr("Localizable", "noOverviewAvailable") } + /// No public users + internal static var noPublicUsers: String { return L10n.tr("Localizable", "noPublicUsers") } /// No results. internal static var noResults: String { return L10n.tr("Localizable", "noResults") } /// Normal diff --git a/Shared/ViewModels/UserSignInViewModel.swift b/Shared/ViewModels/UserSignInViewModel.swift index 5bc4ca56..412ff59c 100644 --- a/Shared/ViewModels/UserSignInViewModel.swift +++ b/Shared/ViewModels/UserSignInViewModel.swift @@ -17,6 +17,9 @@ final class UserSignInViewModel: ViewModel { var router: UserSignInCoordinator.Router? let server: SwiftfinStore.State.Server + @Published + var isLoadingUsers = false + @Published var publicUsers: [UserDto] = [] @@ -54,12 +57,14 @@ final class UserSignInViewModel: ViewModel { } func loadUsers() { + self.isLoadingUsers = true JellyfinAPIAPI.basePath = server.currentURI UserAPI.getPublicUsers() .sink(receiveCompletion: { completion in self.handleAPIRequestError(displayMessage: L10n.unableToConnectServer, completion: completion) }, receiveValue: { response in self.publicUsers = response + self.isLoadingUsers = false }) .store(in: &cancellables) } diff --git a/Swiftfin/Views/UserSignInView.swift b/Swiftfin/Views/UserSignInView.swift index b31669b4..a4c0d0fc 100644 --- a/Swiftfin/Views/UserSignInView.swift +++ b/Swiftfin/Views/UserSignInView.swift @@ -47,12 +47,31 @@ struct UserSignInView: View { L10n.signInToServer(viewModel.server.name).text } - if !viewModel.publicUsers.isEmpty { - Section(header: L10n.publicUsers.text) { + Section { + if !viewModel.publicUsers.isEmpty { ForEach(viewModel.publicUsers, id: \.id) { user in UserLoginCellView(viewModel: viewModel, user: user) .disabled(viewModel.isLoading) } + } else { + HStack(alignment: .center) { + Spacer() + L10n.noPublicUsers.text + .font(.callout) + .foregroundColor(.secondary) + Spacer() + } + } + } header: { + HStack { + L10n.publicUsers.text + Spacer() + Button { + viewModel.loadUsers() + } label: { + Image(systemName: "arrow.clockwise.circle.fill") + } + .disabled(viewModel.isLoadingUsers || viewModel.isLoading) } } } diff --git a/Translations/en.lproj/Localizable.strings b/Translations/en.lproj/Localizable.strings index a23e6b50..f41baf6a 100644 Binary files a/Translations/en.lproj/Localizable.strings and b/Translations/en.lproj/Localizable.strings differ