Files
mattermost-mobile/ios/MattermostShare/Models/ChannelModel.swift
Elias Nahum 3a3123674a [Gekidou] iOS Share extension (#6432)
* iOS Share extension

* Add Fastlane steps for iOS Share Extension

* new multi file layout

* Add recent label

* Refactor code & identation

* ux feedback

* downsample images

* remove options horizontal padding
2022-07-27 10:31:45 -04:00

117 lines
3.4 KiB
Swift

//
// ChannelModel.swift
// MattermostShare
//
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.
//
import Gekidou
import SwiftUI
import Foundation
struct ChannelModel: Hashable, Codable, Identifiable {
var id: String
var name: String
var displayName: String
var type: String
var teamName: String?
var deactivated: Bool?
var memberCount: Int?
var lastViewedAt: Int64?
enum ChannelCodingKeys: String, CodingKey {
case id, name, type, deactivated
case displayName = "display_name"
case teamName = "team_display_name"
case memberCount = "member_count"
case lastViewedAt = "last_viewed_at"
}
init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: ChannelCodingKeys.self)
id = try container.decode(String.self, forKey: .id)
name = try container.decode(String.self, forKey: .name)
displayName = try container.decode(String.self, forKey: .displayName)
type = try container.decode(String.self, forKey: .type)
teamName = container.contains(.teamName) ? try? container.decode(String.self, forKey: .teamName) : nil
memberCount = container.contains(.memberCount) ? try? container.decode(Int.self, forKey: .memberCount) : 0
deactivated = container.contains(.deactivated) ? try? container.decode(Bool.self, forKey: .deactivated) : false
lastViewedAt = container.contains(.lastViewedAt) ? try? container.decode(Int64.self, forKey: .lastViewedAt) : 0
}
init(id: String, name: String, displayName: String, type: String, teamName: String?, memberCount: Int?) {
self.id = id
self.name = name
self.displayName = displayName
self.type = type
self.teamName = teamName
}
private func getUserIdFromChannelName(name: String, knownId: String) -> String? {
let ids = name.components(separatedBy: "__")
if ids.first == knownId {
return ids.last
}
return ids.first
}
var formattedTeamName: String {
if (teamName == nil || teamName!.isEmpty) {
return ""
}
return "(\(teamName!))"
}
@ViewBuilder
func icon(serverUrl: String) -> some View {
switch (type) {
case "P":
FontIcon.text(
.compassIcons(code: .lock),
fontsize: 24,
color: Color.theme.centerChannelColor.opacity(0.72)
)
case "O":
FontIcon.text(
.compassIcons(code: .globe),
fontsize: 24,
color: Color.theme.centerChannelColor.opacity(0.72)
)
default:
ZStack {
RoundedRectangle(cornerRadius: 4)
.fill(Color.theme.centerChannelColor.opacity(0.16))
.frame(width: 20, height: 20)
Text("\(memberCount ?? 0)")
.font(Font.custom("OpenSans-SemiBold", size: 12))
.foregroundColor(Color.theme.centerChannelColor)
}
}
}
@ViewBuilder
func image(serverUrl: String) -> some View {
if (type == "D") {
if let currentUserId = try? Gekidou.Database.default.queryCurrentUserId(serverUrl),
let otherId = getUserIdFromChannelName(name: name, knownId: currentUserId) {
CustomAsyncImage(serverUrl: serverUrl, userId: otherId) {image in
image
.resizable()
.scaledToFit()
.frame(width: 24, height: 24)
.clipShape(Circle())
} placeholder: {
ProgressView()
.frame(width: 24, height: 24)
}
}
}
EmptyView()
}
}