// SPDX-FileCopyrightText: 2026 Kaede Akino // SPDX-License-Identifier: GPL-3.0-only /// The importer can dismiss before delivering its result. Keep the target until /// completion, without a separate presentation flag that can drift from it. struct MobileFileImportState { private enum Phase { case presented(Target) case awaitingResult(Target) } private var phase: Phase? var isPresented: Bool { get { if case .presented = phase { return true } return false } set { if !newValue, case .presented(let target) = phase { phase = .awaitingResult(target) } } } mutating func present(for target: Target) { phase = .presented(target) } mutating func takeTarget() -> Target? { defer { phase = nil } switch phase { case .presented(let target), .awaitingResult(let target): return target case nil: return nil } } }