Some checks failed
Build & Test / Analyze (javascript, affine) (push) Failing after 4s
Build & Test / Analyze (typescript, affine) (push) Failing after 3s
Build & Test / Rust test filter (push) Failing after 4s
Build & Test / Check yarn binary (push) Failing after 3s
Build & Test / E2E BlockSuite Test (3) (push) Failing after 3s
Build & Test / Analyze (javascript, blocksuite) (push) Failing after 3s
Build & Test / Analyze (typescript, blocksuite) (push) Failing after 3s
Build & Test / Mobile native build filter (push) Failing after 3s
Build & Test / E2E BlockSuite Test (1) (push) Failing after 4s
Build & Test / E2E BlockSuite Test (2) (push) Failing after 4s
Build & Test / E2E Mobile Test (1) (push) Failing after 3s
Build & Test / Unit Test (1) (push) Has been skipped
Build & Test / Unit Test (2) (push) Has been skipped
Build & Test / Unit Test (3) (push) Has been skipped
Build & Test / Unit Test (4) (push) Has been skipped
Build & Test / Unit Test (5) (push) Has been skipped
Build & Test / Native Unit Test (push) Has been skipped
Build & Test / E2E BlockSuite Test (4) (push) Failing after 3s
Build & Test / E2E BlockSuite Test (5) (push) Failing after 3s
Build & Test / E2E BlockSuite Cross Browser Test (push) Failing after 3s
Build & Test / E2E Mobile Test (2) (push) Failing after 3s
Build & Test / Build AFFiNE native (x86_64-unknown-linux-gnu) (push) Failing after 3s
Build & Test / Build Server native (push) Failing after 3s
Build & Test / Check Git Status (push) Has been skipped
Build & Test / Server Test (0, 4) (push) Has been skipped
Build & Test / Server Test (1, 4) (push) Has been skipped
Build & Test / Server Test (2, 4) (push) Has been skipped
Build & Test / Server Test (3, 4) (push) Has been skipped
Build & Test / Server Test with Elasticsearch (push) Has been skipped
Build & Test / Build @affine/electron renderer (push) Failing after 3s
Build & Test / Copilot test filter (push) Failing after 4s
Build & Test / Lint Rust (push) Has been skipped
Build & Test / Server Test with Embedded Search (push) Has been skipped
Build & Test / Server Test with Manticore Search (push) Has been skipped
Build & Test / Server E2E Test (push) Has been skipped
Build & Test / Cloud Desktop E2E Test (push) Has been skipped
Build & Test / Cloud E2E Test 1/2 (push) Has been skipped
Build & Test / Cloud E2E Test 2/2 (push) Has been skipped
Build & Test / Build Android app (push) Has been skipped
Build & Test / Test Android app (push) Has been skipped
Build & Test / Run native tests (push) Has been skipped
Build & Test / Server Copilot Api Test (push) Has been skipped
Build & Test / Frontend Copilot E2E Test (1, 5) (push) Has been skipped
Build & Test / Frontend Copilot E2E Test (2, 5) (push) Has been skipped
Build & Test / Frontend Copilot E2E Test (3, 5) (push) Has been skipped
Build & Test / Frontend Copilot E2E Test (4, 5) (push) Has been skipped
Build & Test / Frontend Copilot E2E Test (5, 5) (push) Has been skipped
Release / Canary Gate (push) Has been skipped
Build & Test / Build AFFiNE native (aarch64-apple-darwin) (push) Has been cancelled
Build & Test / Lint (push) Has been cancelled
Build & Test / Typecheck (push) Has been cancelled
Build & Test / Build AFFiNE native (x86_64-apple-darwin) (push) Has been cancelled
Build & Test / Desktop Test (ubuntu-latest, linux, x64, x86_64-unknown-linux-gnu, true) (push) Has been cancelled
Build & Test / Desktop Test (windows-latest, windows, x64, x86_64-pc-windows-msvc, true) (push) Has been cancelled
Build & Test / E2E Test (1) (push) Has been cancelled
Build & Test / E2E Test (2) (push) Has been cancelled
Build & Test / E2E Test (3) (push) Has been cancelled
Build & Test / E2E Test (4) (push) Has been cancelled
Build & Test / E2E Test (5) (push) Has been cancelled
Build & Test / Build AFFiNE native (aarch64-pc-windows-msvc) (push) Has been cancelled
Build & Test / Build AFFiNE native (x86_64-pc-windows-msvc) (push) Has been cancelled
Build & Test / Desktop Test (macos-latest, macos, arm64, aarch64-apple-darwin, true) (push) Has been cancelled
Build & Test / Desktop Test (macos-latest, macos, x64, x86_64-apple-darwin, false) (push) Has been cancelled
Build & Test / 3, 2, 1 Launch (push) Has been cancelled
Build & Test / Build iOS app (push) Has been cancelled
Copilot Test Automatically / Setup Test (push) Failing after 1s
Release / Prepare (push) Failing after 2s
Release / Release Cloud (push) Has been skipped
Release / Release Desktop (push) Has been skipped
Release / Release Docker Image (push) Has been skipped
Release / Release Mobile (push) Has been skipped
206 lines
5.8 KiB
Swift
206 lines
5.8 KiB
Swift
import Foundation
|
|
|
|
struct ShareInboxAttachment: Codable, Equatable {
|
|
var fileName: String
|
|
var mimeType: String
|
|
var relativePath: String
|
|
}
|
|
|
|
struct ShareInboxResolvedAttachment: Equatable {
|
|
var itemId: String
|
|
var url: URL
|
|
var relativePath: String
|
|
var name: String
|
|
var mimeType: String
|
|
var size: Int
|
|
}
|
|
|
|
enum ShareInboxContentKind: String, Codable {
|
|
case url
|
|
case text
|
|
case image
|
|
case pdf
|
|
}
|
|
|
|
struct ShareInboxContent: Codable, Equatable {
|
|
var kind: ShareInboxContentKind
|
|
var url: String?
|
|
var text: String?
|
|
}
|
|
|
|
struct ShareInboxTarget: Codable, Equatable {
|
|
var workspaceId: String
|
|
var workspaceFlavour: String
|
|
var tagIds: [String]
|
|
var collectionId: String?
|
|
}
|
|
|
|
struct ShareInboxResult: Codable, Equatable {
|
|
var docId: String
|
|
var committedAt: Date
|
|
}
|
|
|
|
enum SharePreviewRoute: String, Codable {
|
|
case official
|
|
case deferred
|
|
}
|
|
|
|
enum ShareWorkspaceMode: String, Codable {
|
|
case selfHostedPresent
|
|
case cloudOnly
|
|
case signedOut
|
|
case unknown
|
|
}
|
|
|
|
struct ShareWorkspaceModeSnapshot: Codable {
|
|
var version = 1
|
|
var mode: ShareWorkspaceMode
|
|
var updatedAt = Date()
|
|
}
|
|
|
|
struct ShareInboxItem: Codable, Equatable, Identifiable {
|
|
static let currentSchemaVersion = 2
|
|
|
|
private enum CodingKeys: String, CodingKey {
|
|
case schemaVersion
|
|
case importAttemptId
|
|
case id
|
|
case documentId
|
|
case createdAt
|
|
case title
|
|
case content
|
|
case target
|
|
case previewRoute
|
|
case previewText
|
|
case attachments
|
|
case result
|
|
case lastError
|
|
}
|
|
|
|
var schemaVersion: Int
|
|
var importAttemptId: String
|
|
var id: String
|
|
var documentId: String
|
|
var createdAt: Date
|
|
var title: String
|
|
var content: ShareInboxContent
|
|
var target: ShareInboxTarget?
|
|
var previewRoute: SharePreviewRoute
|
|
var previewText: String?
|
|
var attachments: [ShareInboxAttachment]
|
|
var result: ShareInboxResult?
|
|
var lastError: String?
|
|
|
|
init(
|
|
id: String = UUID().uuidString,
|
|
documentId: String = UUID().uuidString,
|
|
importAttemptId: String = UUID().uuidString,
|
|
createdAt: Date = Date(),
|
|
title: String,
|
|
content: ShareInboxContent,
|
|
target: ShareInboxTarget? = nil,
|
|
previewRoute: SharePreviewRoute = .deferred,
|
|
previewText: String? = nil,
|
|
attachments: [ShareInboxAttachment] = [],
|
|
result: ShareInboxResult? = nil,
|
|
lastError: String? = nil
|
|
) {
|
|
schemaVersion = Self.currentSchemaVersion
|
|
self.importAttemptId = importAttemptId
|
|
self.id = id
|
|
self.documentId = documentId
|
|
self.createdAt = createdAt
|
|
self.title = title
|
|
self.content = content
|
|
self.target = target
|
|
self.previewRoute = previewRoute
|
|
self.previewText = previewText
|
|
self.attachments = attachments
|
|
self.result = result
|
|
self.lastError = lastError
|
|
}
|
|
|
|
init(from decoder: Decoder) throws {
|
|
let container = try decoder.container(keyedBy: CodingKeys.self)
|
|
let schemaVersion = try container.decodeIfPresent(Int.self, forKey: .schemaVersion) ?? 1
|
|
self.schemaVersion = schemaVersion
|
|
if schemaVersion == 1 {
|
|
importAttemptId = UUID().uuidString
|
|
} else {
|
|
let importAttemptId = try container.decode(String.self, forKey: .importAttemptId)
|
|
guard !importAttemptId.isEmpty else {
|
|
throw DecodingError.dataCorruptedError(
|
|
forKey: .importAttemptId,
|
|
in: container,
|
|
debugDescription: "importAttemptId must not be empty"
|
|
)
|
|
}
|
|
self.importAttemptId = importAttemptId
|
|
}
|
|
id = try container.decode(String.self, forKey: .id)
|
|
documentId = try container.decode(String.self, forKey: .documentId)
|
|
createdAt = try container.decode(Date.self, forKey: .createdAt)
|
|
title = try container.decode(String.self, forKey: .title)
|
|
content = try container.decode(ShareInboxContent.self, forKey: .content)
|
|
target = try container.decodeIfPresent(ShareInboxTarget.self, forKey: .target)
|
|
previewRoute = (try? container.decode(SharePreviewRoute.self, forKey: .previewRoute)) ?? .deferred
|
|
previewText = try container.decodeIfPresent(String.self, forKey: .previewText)
|
|
attachments =
|
|
try container.decodeIfPresent([ShareInboxAttachment].self, forKey: .attachments) ?? []
|
|
result = try container.decodeIfPresent(ShareInboxResult.self, forKey: .result)
|
|
lastError = try container.decodeIfPresent(String.self, forKey: .lastError)
|
|
}
|
|
|
|
func encode(to encoder: Encoder) throws {
|
|
var container = encoder.container(keyedBy: CodingKeys.self)
|
|
try container.encode(Self.currentSchemaVersion, forKey: .schemaVersion)
|
|
try container.encode(importAttemptId, forKey: .importAttemptId)
|
|
try container.encode(id, forKey: .id)
|
|
try container.encode(documentId, forKey: .documentId)
|
|
try container.encode(createdAt, forKey: .createdAt)
|
|
try container.encode(title, forKey: .title)
|
|
try container.encode(content, forKey: .content)
|
|
try container.encodeIfPresent(target, forKey: .target)
|
|
try container.encode(previewRoute, forKey: .previewRoute)
|
|
try container.encodeIfPresent(previewText, forKey: .previewText)
|
|
try container.encode(attachments, forKey: .attachments)
|
|
try container.encodeIfPresent(result, forKey: .result)
|
|
try container.encodeIfPresent(lastError, forKey: .lastError)
|
|
}
|
|
}
|
|
|
|
enum ShareInboxPendingEntry: Equatable {
|
|
case ready(ShareInboxItem)
|
|
case unsupportedVersion(itemId: String, schemaVersion: Int)
|
|
|
|
var createdAt: Date {
|
|
switch self {
|
|
case let .ready(item):
|
|
item.createdAt
|
|
case .unsupportedVersion:
|
|
.distantFuture
|
|
}
|
|
}
|
|
}
|
|
|
|
struct SharePayloadFile: Equatable {
|
|
var ownedStagingURL: URL
|
|
var name: String
|
|
var mimeType: String
|
|
var size: Int
|
|
var thumbnailData: Data
|
|
}
|
|
|
|
struct SharePayloadDraft: Equatable {
|
|
var title: String
|
|
var content: ShareInboxContent?
|
|
var previewText: String
|
|
var file: SharePayloadFile?
|
|
var errorMessage: String?
|
|
|
|
func discardStagingFiles() {
|
|
guard let file else { return }
|
|
SharePayloadBuilder.removeOwnedStagingFile(at: file.ownedStagingURL)
|
|
}
|
|
}
|