diff options
| author | Dustin Mierau <dustin@mierau.me> | 2024-05-02 18:53:56 -0700 |
|---|---|---|
| committer | Dustin Mierau <dustin@mierau.me> | 2024-05-02 18:53:56 -0700 |
| commit | 73208d70d21db7e526e371fa863acd0327caad9e (patch) | |
| tree | a93bed8633077e77a576e65f14244c82a32868bb /Hotline/Shared | |
| parent | 480500a3e7cfe1e2aa8ff261ca6f9e522c3aaf4c (diff) | |
Add link highlighting to agreements and message board. Add basic markdown styling and link highlighting to chat messages.
Diffstat (limited to 'Hotline/Shared')
| -rw-r--r-- | Hotline/Shared/AsyncLinkPreview.swift | 57 | ||||
| -rw-r--r-- | Hotline/Shared/FileImageView.swift (renamed from Hotline/Shared/AnimatedImageView.swift) | 2 |
2 files changed, 58 insertions, 1 deletions
diff --git a/Hotline/Shared/AsyncLinkPreview.swift b/Hotline/Shared/AsyncLinkPreview.swift new file mode 100644 index 0000000..9f0c4c2 --- /dev/null +++ b/Hotline/Shared/AsyncLinkPreview.swift @@ -0,0 +1,57 @@ +import SwiftUI +import LinkPresentation + +fileprivate class CustomLinkView: LPLinkView { + override var intrinsicContentSize: CGSize { CGSize(width: 0, height: super.intrinsicContentSize.height) } +} + +struct AsyncLinkPreview: View { + @State private var metadata: LPLinkMetadata? + @State private var isLoading = true + let url: URL? + + func fetchMetadata() async { + guard let url else { + self.isLoading = false + return + } + do { + let provider = LPMetadataProvider() + let metadata = try await provider.startFetchingMetadata(for: url) + self.metadata = metadata + self.isLoading = false + } catch { + self.isLoading = false + } + } + + var body: some View { + if isLoading { + ProgressView() + .controlSize(.small) + .task { + await self.fetchMetadata() + } + } else if let metadata = metadata { + LinkView(metadata: metadata) + .frame(width: 200) + } else { + Text(LocalizedStringKey(url!.absoluteString.convertLinksToMarkdown())) + .multilineTextAlignment(.leading) + .tint(Color("Link Color")) + } + } +} + +struct LinkView: NSViewRepresentable { + var metadata: LPLinkMetadata + + func makeNSView(context: Context) -> LPLinkView { + let linkView = CustomLinkView(metadata: metadata) + return linkView + } + + func updateNSView(_ nsView: LPLinkView, context: Context) { + // Nothing required + } +} diff --git a/Hotline/Shared/AnimatedImageView.swift b/Hotline/Shared/FileImageView.swift index 0d92715..0cc50f1 100644 --- a/Hotline/Shared/AnimatedImageView.swift +++ b/Hotline/Shared/FileImageView.swift @@ -1,6 +1,6 @@ import SwiftUI -struct AnimatedImageView: NSViewRepresentable { +struct FileImageView: NSViewRepresentable { var image: NSImage? let minimumSize: CGSize = CGSize(width: 350, height: 350) |