// // ShareViewController.swift // PocheShare // // Author: Simon-Pierre Boucher // Contact: contact@spboucher.ai // import UIKit import UniformTypeIdentifiers /// Share Extension: entry only (CLAUDE.md §4). The shared text or link is /// dropped into the app-group inbox; the app imports it as a note on next /// launch. Nothing leaves the device. final class ShareViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() view.backgroundColor = .clear let card = UIVisualEffectView(effect: UIBlurEffect(style: .systemMaterial)) card.layer.cornerRadius = 20 card.clipsToBounds = true card.translatesAutoresizingMaskIntoConstraints = false let label = UILabel() label.text = "Enregistré dans Poche ✓" label.font = .systemFont(ofSize: 17, weight: .semibold) label.translatesAutoresizingMaskIntoConstraints = false card.contentView.addSubview(label) view.addSubview(card) NSLayoutConstraint.activate([ card.centerXAnchor.constraint(equalTo: view.centerXAnchor), card.centerYAnchor.constraint(equalTo: view.centerYAnchor), label.topAnchor.constraint(equalTo: card.contentView.topAnchor, constant: 18), label.bottomAnchor.constraint(equalTo: card.contentView.bottomAnchor, constant: -18), label.leadingAnchor.constraint(equalTo: card.contentView.leadingAnchor, constant: 24), label.trailingAnchor.constraint(equalTo: card.contentView.trailingAnchor, constant: -24), ]) } override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) Task { await saveSharedContent() try? await Task.sleep(for: .seconds(0.8)) extensionContext?.completeRequest(returningItems: nil) } } private func saveSharedContent() async { guard let items = extensionContext?.inputItems as? [NSExtensionItem] else { return } for item in items { for provider in item.attachments ?? [] { if provider.hasItemConformingToTypeIdentifier(UTType.plainText.identifier), let raw = try? await provider.loadItem(forTypeIdentifier: UTType.plainText.identifier), let text = raw as? String { save(text: text, fallbackTitle: item.attributedContentText?.string) return } if provider.hasItemConformingToTypeIdentifier(UTType.url.identifier), let raw = try? await provider.loadItem(forTypeIdentifier: UTType.url.identifier), let url = raw as? URL { save(text: url.absoluteString, fallbackTitle: item.attributedContentText?.string) return } } } } private func save(text: String, fallbackTitle: String?) { let firstLine = text .components(separatedBy: .newlines) .first? .trimmingCharacters(in: .whitespaces) ?? "Partage" let title = String((fallbackTitle?.isEmpty == false ? fallbackTitle! : firstLine).prefix(80)) SharedInbox.append(SharedInboxItem( title: title, content: String(text.prefix(2000)), date: .now )) } }