mattermost-mobile-upstream/ios/MattermostShare/Views/ContentViews/ServerListView/ServerItemView.swift
Carlos Garcia a5ff8a0d95
Mm 68767 zero persistence (#9803)
* implements auto cache cleanup when zero persistence mode is enabled (0 value)

* uses memory flag with sqlite instead of loki when running in zero persistence mode

* renames ephemeral mode manager and improves readability

* zero persistence refactors and restore values during transitions

* fixes ephemeral mode tests

* use initializeClient instead of just initialize to wait for doReconnect to finish

that way teams loading is awaited while WS reconnects during ZPM transitions

* adds inital sync as a mount hook to prevent undesired load error states

during app cold start in ZPM mode, we need a way to load team and channels
without showing loading error during the transition. The nre is initial sync
hook allows for it

* reset started sync subject on wipe

* removes extra log lines

* resets tracked server during ephemeral mode transitions

* improvements to apply persistence mode changes when something fails

* address coderabbit PR suggestions

* add batching time logging

* throws ephemeral mode change error as is

* make deleteServerDatabaseFiles private

* inline derive persistence flag function

* return current user id when refetching current user

* support zero persistence mode server for push notifications

* adds support for zero persistence mode when sharing to mattermost

* adds clarifying comment

* catch and log error deleting files

* reorder translations to correct position

* adds some new tests to improve coverage

* ios push notification native fix

* logout when fetchMe fails with 401 status code during reconnection

* properly surface errors

* return proper false value when checking for zero persistence flag

* change comments and properly await on some operations

* prevent not set persistence mode to report as an error

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

* include servers with no persistence flag set in share list

* disable button for accessibility

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

* improves when to store and remove signing key from global area

* review push notification reception running in zero persistence mode

* add server to ephemeral mode manager right after login

---------

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
2026-07-16 13:55:45 +02:00

70 lines
2.1 KiB
Swift

//
// ServerItemView.swift
// MattermostShare
//
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.
//
import SwiftUI
struct ServerItemView: View {
@Environment(\.presentationMode) var presentationMode: Binding<PresentationMode>
@EnvironmentObject var shareViewModel: ShareViewModel
var server: ServerModel
var body: some View {
Button(action: {
guard !server.isZeroPersistence else { return }
shareViewModel.selectServer(server)
self.presentationMode.wrappedValue.dismiss()
}) {
HStack {
FontIcon.text(
.compassIcons(code: .server),
fontsize: 24,
color: Color.theme.centerChannelColor.opacity(0.56)
)
VStack(alignment: .leading) {
Text(server.displayName)
.foregroundColor(Color.theme.centerChannelColor)
.lineLimit(1)
.font(Font.custom("OpenSans-SemiBold", size: 16))
Text(server.url)
.foregroundColor(Color.theme.centerChannelColor.opacity(0.72))
.lineLimit(1)
.font(Font.custom("OpenSans", size: 12))
if server.isZeroPersistence {
Text(NSLocalizedString(
"share_extension.server_item.zero_persistence_unavailable",
value: "Sharing unavailable for this server",
comment: ""
))
.foregroundColor(Color.theme.centerChannelColor.opacity(0.56))
.lineLimit(1)
.font(Font.custom("OpenSans", size: 12))
}
}
}
.padding(.horizontal)
.frame(
minWidth: 0,
maxWidth: .infinity,
minHeight: 72,
idealHeight: 72,
alignment: .leading
)
}
.opacity(server.isZeroPersistence ? 0.48 : 1.0)
.disabled(server.isZeroPersistence)
.background(
RoundedRectangle(cornerRadius: 8)
.fill(Color.theme.centerChannelColor.opacity(0.04))
)
.buttonStyle(.borderless)
.listRowSeparator(.hidden)
.listRowInsets(EdgeInsets(top: 8, leading: 0, bottom: 0, trailing: 0))
}
}