diff --git a/ElementX/Resources/Localizations/en.lproj/Localizable.strings b/ElementX/Resources/Localizations/en.lproj/Localizable.strings index 4b36758e6..4a3e1ba17 100644 --- a/ElementX/Resources/Localizations/en.lproj/Localizable.strings +++ b/ElementX/Resources/Localizations/en.lproj/Localizable.strings @@ -293,6 +293,7 @@ "common_settings" = "Settings"; "common_share_space" = "Share space"; "common_shared_location" = "Shared location"; +"common_shared_space" = "Shared space"; "common_signing_out" = "Signing out"; "common_something_went_wrong" = "Something went wrong"; "common_something_went_wrong_message" = "We encountered an issue. Please try again."; @@ -573,6 +574,7 @@ "screen_knock_requests_list_empty_state_title" = "No pending request to join"; "screen_knock_requests_list_initial_loading_title" = "Loading requests to join…"; "screen_labs_enable_threads" = "Enable thread replies"; +"screen_labs_enable_threads_description" = "The app will restart to apply this change."; "screen_labs_header_description" = "Try out our latest ideas in development. These features are not finalised; they may be unstable, may change."; "screen_labs_header_title" = "Feeling experimental?"; "screen_labs_title" = "Labs"; @@ -834,14 +836,14 @@ "screen_invites_decline_direct_chat_title" = "Decline chat"; "screen_invites_empty_list" = "No Invites"; "screen_invites_invited_you" = "%1$@ (%2$@) invited you"; -"screen_join_room_ban_by_message" = "You were banned from this room by %1$@."; -"screen_join_room_ban_message" = "You were banned from this room"; +"screen_join_room_ban_by_message" = "You were banned by %1$@."; +"screen_join_room_ban_message" = "You were banned"; "screen_join_room_ban_reason" = "Reason: %1$@."; -"screen_join_room_fail_message" = "Joining the room failed."; +"screen_join_room_fail_message" = "Joining failed"; "screen_join_room_fail_reason" = "This room is either invite-only or there might be restrictions to access at space level."; -"screen_join_room_forget_action" = "Forget this room"; -"screen_join_room_invite_required_message" = "You need an invite in order to join this room"; -"screen_join_room_join_action" = "Join room"; +"screen_join_room_forget_action" = "Forget"; +"screen_join_room_invite_required_message" = "You need an invite in order to join"; +"screen_join_room_join_action" = "Join"; "screen_join_room_join_restricted_message" = "You may need to be invited or be a member of a space in order to join."; "screen_join_room_knock_action" = "Send request to join"; "screen_join_room_space_not_supported_description" = "%1$@ does not support spaces yet. You can access spaces on web."; diff --git a/ElementX/Sources/FlowCoordinators/SettingsFlowCoordinator.swift b/ElementX/Sources/FlowCoordinators/SettingsFlowCoordinator.swift index ab67fbf8b..1aa48065a 100644 --- a/ElementX/Sources/FlowCoordinators/SettingsFlowCoordinator.swift +++ b/ElementX/Sources/FlowCoordinators/SettingsFlowCoordinator.swift @@ -117,6 +117,15 @@ class SettingsFlowCoordinator: FlowCoordinatorProtocol { private func presentLabs() { let coordinator = LabsScreenCoordinator(parameters: .init(appSettings: flowParameters.appSettings)) + coordinator.actions + .sink { [weak self] action in + switch action { + case .clearCache: + self?.actionsSubject.send(.clearCache) + } + } + .store(in: &cancellables) + navigationStackCoordinator.push(coordinator) } diff --git a/ElementX/Sources/Generated/Strings.swift b/ElementX/Sources/Generated/Strings.swift index 45910ebde..34d6d7b38 100644 --- a/ElementX/Sources/Generated/Strings.swift +++ b/ElementX/Sources/Generated/Strings.swift @@ -662,6 +662,8 @@ internal enum L10n { internal static var commonShareSpace: String { return L10n.tr("Localizable", "common_share_space") } /// Shared location internal static var commonSharedLocation: String { return L10n.tr("Localizable", "common_shared_location") } + /// Shared space + internal static var commonSharedSpace: String { return L10n.tr("Localizable", "common_shared_space") } /// Signing out internal static var commonSigningOut: String { return L10n.tr("Localizable", "common_signing_out") } /// Something went wrong @@ -1682,11 +1684,11 @@ internal enum L10n { internal static func screenInvitesInvitedYou(_ p1: Any, _ p2: Any) -> String { return L10n.tr("Localizable", "screen_invites_invited_you", String(describing: p1), String(describing: p2)) } - /// You were banned from this room by %1$@. + /// You were banned by %1$@. internal static func screenJoinRoomBanByMessage(_ p1: Any) -> String { return L10n.tr("Localizable", "screen_join_room_ban_by_message", String(describing: p1)) } - /// You were banned from this room + /// You were banned internal static var screenJoinRoomBanMessage: String { return L10n.tr("Localizable", "screen_join_room_ban_message") } /// Reason: %1$@. internal static func screenJoinRoomBanReason(_ p1: Any) -> String { @@ -1710,17 +1712,17 @@ internal enum L10n { internal static var screenJoinRoomDeclineAndBlockAlertTitle: String { return L10n.tr("Localizable", "screen_join_room_decline_and_block_alert_title") } /// Decline and block internal static var screenJoinRoomDeclineAndBlockButtonTitle: String { return L10n.tr("Localizable", "screen_join_room_decline_and_block_button_title") } - /// Joining the room failed. + /// Joining failed internal static var screenJoinRoomFailMessage: String { return L10n.tr("Localizable", "screen_join_room_fail_message") } /// This room is either invite-only or there might be restrictions to access at space level. internal static var screenJoinRoomFailReason: String { return L10n.tr("Localizable", "screen_join_room_fail_reason") } - /// Forget this room + /// Forget internal static var screenJoinRoomForgetAction: String { return L10n.tr("Localizable", "screen_join_room_forget_action") } - /// You need an invite in order to join this room + /// You need an invite in order to join internal static var screenJoinRoomInviteRequiredMessage: String { return L10n.tr("Localizable", "screen_join_room_invite_required_message") } /// Invited by internal static var screenJoinRoomInvitedBy: String { return L10n.tr("Localizable", "screen_join_room_invited_by") } - /// Join room + /// Join internal static var screenJoinRoomJoinAction: String { return L10n.tr("Localizable", "screen_join_room_join_action") } /// You may need to be invited or be a member of a space in order to join. internal static var screenJoinRoomJoinRestrictedMessage: String { return L10n.tr("Localizable", "screen_join_room_join_restricted_message") } @@ -1826,6 +1828,8 @@ internal enum L10n { internal static var screenKnockRequestsListTitle: String { return L10n.tr("Localizable", "screen_knock_requests_list_title") } /// Enable thread replies internal static var screenLabsEnableThreads: String { return L10n.tr("Localizable", "screen_labs_enable_threads") } + /// The app will restart to apply this change. + internal static var screenLabsEnableThreadsDescription: String { return L10n.tr("Localizable", "screen_labs_enable_threads_description") } /// Try out our latest ideas in development. These features are not finalised; they may be unstable, may change. internal static var screenLabsHeaderDescription: String { return L10n.tr("Localizable", "screen_labs_header_description") } /// Feeling experimental? diff --git a/ElementX/Sources/Screens/LabsScreen/LabsScreenCoordinator.swift b/ElementX/Sources/Screens/LabsScreen/LabsScreenCoordinator.swift index b897d859b..ee720a3de 100644 --- a/ElementX/Sources/Screens/LabsScreen/LabsScreenCoordinator.swift +++ b/ElementX/Sources/Screens/LabsScreen/LabsScreenCoordinator.swift @@ -14,14 +14,35 @@ struct LabsScreenCoordinatorParameters { let appSettings: AppSettings } +enum LabsScreenCoordinatorAction { + case clearCache +} + final class LabsScreenCoordinator: CoordinatorProtocol { private let viewModel: LabsScreenViewModelProtocol + private let actionsSubject: PassthroughSubject = .init() + var actions: AnyPublisher { + actionsSubject.eraseToAnyPublisher() + } + + private var cancellables = Set() + init(parameters: LabsScreenCoordinatorParameters) { viewModel = LabsScreenViewModel(labsOptions: parameters.appSettings) } - func start() { } + func start() { + viewModel + .actionsPublisher + .sink { [weak self] action in + switch action { + case .clearCache: + self?.actionsSubject.send(.clearCache) + } + } + .store(in: &cancellables) + } func toPresentable() -> AnyView { AnyView(LabsScreen(context: viewModel.context)) diff --git a/ElementX/Sources/Screens/LabsScreen/LabsScreenModels.swift b/ElementX/Sources/Screens/LabsScreen/LabsScreenModels.swift index 037c6d654..9c2b6b4cc 100644 --- a/ElementX/Sources/Screens/LabsScreen/LabsScreenModels.swift +++ b/ElementX/Sources/Screens/LabsScreen/LabsScreenModels.swift @@ -7,9 +7,13 @@ import Foundation -enum LabsScreenViewAction { } +enum LabsScreenViewAction { + case clearCache +} -enum LabsScreenViewModelAction { } +enum LabsScreenViewModelAction { + case clearCache +} struct LabsScreenViewState: BindableState { var bindings: LabsScreenViewStateBindings diff --git a/ElementX/Sources/Screens/LabsScreen/LabsScreenViewModel.swift b/ElementX/Sources/Screens/LabsScreen/LabsScreenViewModel.swift index 224d55108..5cfe69af8 100644 --- a/ElementX/Sources/Screens/LabsScreen/LabsScreenViewModel.swift +++ b/ElementX/Sources/Screens/LabsScreen/LabsScreenViewModel.swift @@ -22,4 +22,11 @@ class LabsScreenViewModel: LabsScreenViewModelType, LabsScreenViewModelProtocol super.init(initialViewState: state) } + + override func process(viewAction: LabsScreenViewAction) { + switch viewAction { + case .clearCache: + actionsSubject.send(.clearCache) + } + } } diff --git a/ElementX/Sources/Screens/LabsScreen/View/LabsScreen.swift b/ElementX/Sources/Screens/LabsScreen/View/LabsScreen.swift index 0187ab888..a93761f6e 100644 --- a/ElementX/Sources/Screens/LabsScreen/View/LabsScreen.swift +++ b/ElementX/Sources/Screens/LabsScreen/View/LabsScreen.swift @@ -14,7 +14,7 @@ struct LabsScreen: View { var body: some View { Form { header - settingsSection + threadsSection } .compoundList() .navigationTitle(L10n.screenLabsTitle) @@ -39,16 +39,23 @@ struct LabsScreen: View { .multilineTextAlignment(.center) .foregroundColor(.compound.textSecondary) } + .compoundListSectionHeader() } .frame(maxWidth: .infinity) } } - private var settingsSection: some View { + private var threadsSection: some View { Section { ListRow(label: .default(title: L10n.screenLabsEnableThreads, icon: \.threads), kind: .toggle($context.threadsEnabled)) + } footer: { + Text(L10n.screenLabsEnableThreadsDescription) + .compoundListSectionFooter() + } + .onChange(of: context.threadsEnabled) { _, _ in + context.send(viewAction: .clearCache) } } } @@ -56,7 +63,7 @@ struct LabsScreen: View { // MARK: - Previews struct LabsScreen_Previews: PreviewProvider, TestablePreview { - static let viewModel = LabsScreenViewModel(labsOptions: ServiceLocator.shared.settings) + static let viewModel = LabsScreenViewModel(labsOptions: AppSettings()) static var previews: some View { NavigationStack { diff --git a/PreviewTests/Sources/__Snapshots__/PreviewTests/labsScreen.iPad-en-GB-0.png b/PreviewTests/Sources/__Snapshots__/PreviewTests/labsScreen.iPad-en-GB-0.png index 44d8ba3fa..184fc96dc 100644 --- a/PreviewTests/Sources/__Snapshots__/PreviewTests/labsScreen.iPad-en-GB-0.png +++ b/PreviewTests/Sources/__Snapshots__/PreviewTests/labsScreen.iPad-en-GB-0.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f2170efb3086308662f9dca90475254c16123f856ff295c4fe9cadb308310dc6 -size 109823 +oid sha256:96544b24f533f3295762a591b66632d8795bbe87258c8ea8cdd30cc2996dfdb7 +size 116014 diff --git a/PreviewTests/Sources/__Snapshots__/PreviewTests/labsScreen.iPad-pseudo-0.png b/PreviewTests/Sources/__Snapshots__/PreviewTests/labsScreen.iPad-pseudo-0.png index 18b3a8efc..c977e7061 100644 --- a/PreviewTests/Sources/__Snapshots__/PreviewTests/labsScreen.iPad-pseudo-0.png +++ b/PreviewTests/Sources/__Snapshots__/PreviewTests/labsScreen.iPad-pseudo-0.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:1865e6f52775f4a98309bd7daf8cb15680a0f2adf445d1ed6eeacf405021b9dc -size 122231 +oid sha256:6356d8bdd6c5d68262702dd73731fff5958c1e93c54f0d0158874b200e5ff9d4 +size 130952 diff --git a/PreviewTests/Sources/__Snapshots__/PreviewTests/labsScreen.iPhone-16-en-GB-0.png b/PreviewTests/Sources/__Snapshots__/PreviewTests/labsScreen.iPhone-16-en-GB-0.png index 08bf82da1..65e50be13 100644 --- a/PreviewTests/Sources/__Snapshots__/PreviewTests/labsScreen.iPhone-16-en-GB-0.png +++ b/PreviewTests/Sources/__Snapshots__/PreviewTests/labsScreen.iPhone-16-en-GB-0.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c9ff0be2476921e4c18a3ff885a00c8470b1d1b0005b48ac88832dc49a3f1a01 -size 65214 +oid sha256:4ce215c7568042d010cc42185fda078f7352820fa13ce46b4c732d7fa281d260 +size 70341 diff --git a/PreviewTests/Sources/__Snapshots__/PreviewTests/labsScreen.iPhone-16-pseudo-0.png b/PreviewTests/Sources/__Snapshots__/PreviewTests/labsScreen.iPhone-16-pseudo-0.png index 71db1a1b2..29529209f 100644 --- a/PreviewTests/Sources/__Snapshots__/PreviewTests/labsScreen.iPhone-16-pseudo-0.png +++ b/PreviewTests/Sources/__Snapshots__/PreviewTests/labsScreen.iPhone-16-pseudo-0.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:92e459c69eda664e3c2bef2cdf8b592deb66b4e5258626f85d7c91417c3a55b6 -size 90188 +oid sha256:f492183d661c74d61304a8c46a8e5640eb592aebec49340eac25af580415c3d4 +size 100989