From db2aaac981b442a9ca9f3b24570f43d06057a0cf Mon Sep 17 00:00:00 2001 From: Junwei Zhao Date: Mon, 18 Aug 2025 21:20:14 +1000 Subject: [PATCH] Integrate share capability --- mobile/Heygo/Views/LinkDetailView.swift | 29 +++++++++++++++++ mobile/Heygo/Views/LinkListView.swift | 43 +++++++++++++++++++++++-- 2 files changed, 70 insertions(+), 2 deletions(-) diff --git a/mobile/Heygo/Views/LinkDetailView.swift b/mobile/Heygo/Views/LinkDetailView.swift index 890e85a..a8c5d33 100644 --- a/mobile/Heygo/Views/LinkDetailView.swift +++ b/mobile/Heygo/Views/LinkDetailView.swift @@ -9,6 +9,23 @@ struct LinkDetailView: View { @State private var showingEdit = false @State private var templateParameters: [String: String] = [:] @State private var showingTemplateDialog = false + @State private var showingShareSheet = false + + private var shareItems: [Any] { + var items: [Any] = [] + + // Add the alias and URL for link/template types + if link.linkTypeEnum == .link || link.linkTypeEnum == .template { + if let url = link.originalURL, !url.isEmpty { + items.append("\(link.alias): \(url)") + items.append(URL(string: url) ?? url) + } else { + items.append(link.alias) + } + } + + return items + } enum TimeRange: String, CaseIterable { case threeMonths = "3m" @@ -141,6 +158,9 @@ struct LinkDetailView: View { } ) } + .sheet(isPresented: $showingShareSheet) { + ShareSheet(activityItems: shareItems) + } } private var headerSection: some View { @@ -341,6 +361,15 @@ struct LinkDetailView: View { private var toolbarMenu: some View { Menu { + // Share button for link and template types (not for custom) + if link.linkTypeEnum == .link || link.linkTypeEnum == .template { + Button(action: { + showingShareSheet = true + }) { + Label("Share", systemImage: "square.and.arrow.up") + } + } + Button("edit") { showingEdit = true } diff --git a/mobile/Heygo/Views/LinkListView.swift b/mobile/Heygo/Views/LinkListView.swift index f495d80..7f3e3a5 100644 --- a/mobile/Heygo/Views/LinkListView.swift +++ b/mobile/Heygo/Views/LinkListView.swift @@ -425,6 +425,21 @@ struct MarkdownContentView: View { @Environment(\.presentationMode) var presentationMode @EnvironmentObject var linkViewModel: LinkViewModel @State private var showingEditLink = false + @State private var showingShareSheet = false + + private var shareItems: [Any] { + var items: [Any] = [] + + // Add the alias as title + items.append("Custom Content: \(link.alias)") + + // Add the markdown content if available + if let content = link.text, !content.isEmpty { + items.append(content) + } + + return items + } var body: some View { NavigationView { @@ -472,8 +487,16 @@ struct MarkdownContentView: View { } } ToolbarItem(placement: .navigationBarTrailing) { - Button("Done") { - presentationMode.wrappedValue.dismiss() + HStack(spacing: 16) { + Button(action: { + showingShareSheet = true + }) { + Image(systemName: "square.and.arrow.up") + } + + Button("Done") { + presentationMode.wrappedValue.dismiss() + } } } } @@ -481,6 +504,22 @@ struct MarkdownContentView: View { LinkFormView(link: link) .environmentObject(linkViewModel) } + .sheet(isPresented: $showingShareSheet) { + ShareSheet(activityItems: shareItems) + } } } } + +struct ShareSheet: UIViewControllerRepresentable { + let activityItems: [Any] + + func makeUIViewController(context: Context) -> UIActivityViewController { + let controller = UIActivityViewController(activityItems: activityItems, applicationActivities: nil) + return controller + } + + func updateUIViewController(_ uiViewController: UIActivityViewController, context: Context) { + // No updates needed + } +}