mirror of
https://github.com/toeverything/AFFiNE.git
synced 2026-09-02 06:39:46 +08:00
329839e467
<!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * Added iOS sharing for URLs, text, web pages, and images. * Shared content can be reviewed, titled, and saved to an AFFiNE workspace. * Choose destinations including workspaces, tags, and collections. * Added previews, attachment handling, import status, retry support, and success/error feedback. * Pending shares are processed when AFFiNE opens or returns to the foreground. * **Bug Fixes** * Improved workspace profile handling across different workspace types. * Onboarding completion is now recorded immediately after successful sign-in verification. <!-- end of auto-generated comment: release notes by coderabbit.ai --> --------- Co-authored-by: DarkSky <25152247+darkskygit@users.noreply.github.com>
51 lines
1.5 KiB
Swift
51 lines
1.5 KiB
Swift
import Foundation
|
|
|
|
enum ShareInboxSafety {
|
|
static func normalizedManifestID(_ value: String) -> String? {
|
|
UUID(uuidString: value)?.uuidString
|
|
}
|
|
|
|
static func normalizedWebURL(_ value: String) -> String? {
|
|
guard
|
|
let components = URLComponents(
|
|
string: value.trimmingCharacters(in: .whitespacesAndNewlines)
|
|
),
|
|
let scheme = components.scheme?.lowercased(),
|
|
scheme == "http" || scheme == "https",
|
|
components.host?.isEmpty == false,
|
|
components.user == nil,
|
|
components.password == nil,
|
|
let url = components.url
|
|
else {
|
|
return nil
|
|
}
|
|
return url.absoluteString
|
|
}
|
|
|
|
static func detectRasterImageMimeType(_ data: Data) -> String? {
|
|
let bytes = [UInt8](data.prefix(12))
|
|
if bytes.starts(with: [0xFF, 0xD8, 0xFF]) {
|
|
return "image/jpeg"
|
|
}
|
|
if bytes.starts(with: [0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A]) {
|
|
return "image/png"
|
|
}
|
|
if bytes.starts(with: Array("GIF87a".utf8)) || bytes.starts(with: Array("GIF89a".utf8)) {
|
|
return "image/gif"
|
|
}
|
|
if bytes.count >= 12,
|
|
Array(bytes[0..<4]) == Array("RIFF".utf8),
|
|
Array(bytes[8..<12]) == Array("WEBP".utf8)
|
|
{
|
|
return "image/webp"
|
|
}
|
|
if bytes.count >= 12, Array(bytes[4..<8]) == Array("ftyp".utf8) {
|
|
let brand = String(decoding: bytes[8..<12], as: UTF8.self).lowercased()
|
|
if ["heic", "heix", "hevc", "hevx", "mif1", "msf1"].contains(brand) {
|
|
return "image/heic"
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
}
|