mattermost-mobile/ios/MattermostShare/Models/AttachmentModel.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

108 lines
3.7 KiB
Swift

//
// AttachmentModel.swift
// MattermostShare
//
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.
//
import Foundation
import SwiftUI
enum AttachmentType {
case image, video, file
}
struct FileExtensionToType {
static var audio = ["mp3", "wav", "wma", "m4a", "flac", "aac", "ogg"]
static var code = ["as", "applescript", "osascript", "scpt", "bash", "sh", "zsh", "clj", "boot", "cl2", "cljc", "cljs", "cljs.hl", "cljscm", "cljx", "hic", "coffee", "_coffee", "cake", "cjsx", "cson", "iced", "cpp", "c", "cc", "h", "c++", "h++", "hpp", "cs", "csharp", "css", "d", "di", "dart", "delphi", "dpr", "dfm", "pas", "pascal", "freepascal", "lazarus", "lpr", "lfm", "diff", "django", "jinja", "dockerfile", "docker", "erl", "f90", "f95", "fsharp", "fs", "gcode", "nc", "go", "groovy", "handlebars", "hbs", "html.hbs", "html.handlebars", "hs", "hx", "java", "jsp", "js", "jsx", "json", "jl", "kt", "ktm", "kts", "less", "lisp", "lua", "mk", "mak", "md", "mkdown", "mkd", "matlab", "m", "mm", "objc", "obj-c", "ml", "perl", "pl", "php", "php3", "php4", "php5", "php6", "ps", "ps1", "pp", "py", "gyp", "r", "ruby", "rb", "gemspec", "podspec", "thor", "irb", "rs", "scala", "scm", "sld", "scss", "st", "sql", "swift", "ts", "tex", "vbnet", "vb", "bas", "vbs", "v", "veo", "xml", "html", "xhtml", "rss", "atom", "xsl", "plist", "yaml"]
static var document = ["doc", "docx", "odt", "pages"]
static var patch = ["patch"]
static var pdf = ["pdf"]
static var presentation = ["ppt", "pptx", "odp", "key"]
static var spreadsheet = ["xls", "xlsx", "csv", "ods", "numbers"]
static var text = ["txt", "rtf"]
static var zip = ["zip", "tar", "tar.gz"]
}
struct AttachmentModel: Hashable {
var fileName: String
var fileSize: Int64
var fileUrl: URL
var type: AttachmentType
var imagePixels: Int64?
var formattedFileSize: String {
return fileSize.formattedFileSize
}
func iconTypeColor() -> (CompassIconsCode, Color) {
let ext = fileUrl.pathExtension.lowercased()
if FileExtensionToType.audio.contains(ext) {
return (CompassIconsCode.audioFile, Color.icon.blue)
}
if FileExtensionToType.code.contains(ext) {
return (CompassIconsCode.codeFile, Color.icon.grey)
}
if FileExtensionToType.document.contains(ext) {
return (CompassIconsCode.documentFile, Color.icon.blue)
}
if FileExtensionToType.patch.contains(ext) {
return (CompassIconsCode.patchFile, Color.icon.blue)
}
if FileExtensionToType.pdf.contains(ext) {
return (CompassIconsCode.pdfFile, Color.icon.red)
}
if FileExtensionToType.presentation.contains(ext) {
return (CompassIconsCode.presentationFile, Color.icon.red)
}
if FileExtensionToType.spreadsheet.contains(ext) {
return (CompassIconsCode.spredsheetFile, Color.icon.green)
}
if FileExtensionToType.text.contains(ext) {
return (CompassIconsCode.textFile, Color.icon.grey)
}
if FileExtensionToType.zip.contains(ext) {
return (CompassIconsCode.zipFile, Color.icon.blue)
}
return (CompassIconsCode.genericFile, Color.icon.grey)
}
@ViewBuilder
func icon() -> some View {
let (code, color) = iconTypeColor()
FontIcon.text(
FontCode.compassIcons(code: code),
fontsize: 48,
color: color
)
}
func sizeError(server: ServerModel?) -> Bool {
if let s = server,
fileSize > s.maxFileSize {
return true
}
return false
}
func resolutionError(server: ServerModel?) -> Bool {
if let s = server,
let pixels = imagePixels,
pixels > s.maxImageResolution {
return true
}
return false
}
}