forked from Ivasoft/mattermost-mobile
* 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
117 lines
3.4 KiB
Swift
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()
|
|
}
|
|
}
|