@@ -26,6 +26,7 @@ final class PostsPageViewController: ViewController {
2626 private var cancellables : Set < AnyCancellable > = [ ]
2727 @FoilDefaultStorage ( Settings . canSendPrivateMessages) private var canSendPrivateMessages
2828 @FoilDefaultStorage ( Settings . darkMode) private var darkMode
29+ @FoilDefaultStorage ( Settings . embedBlueskyPosts) private var embedBlueskyPosts
2930 @FoilDefaultStorage ( Settings . embedTweets) private var embedTweets
3031 @FoilDefaultStorage ( Settings . enableHaptics) private var enableHaptics
3132 private var flagRequest : Task < Void , Error > ?
@@ -42,6 +43,7 @@ final class PostsPageViewController: ViewController {
4243 private var messageViewController : MessageComposeViewController ?
4344 private var networkOperation : Task < ( posts: [ Post ] , firstUnreadPost: Int ? , advertisementHTML: String ) , Error > ?
4445 private var observers : [ NSKeyValueObservation ] = [ ]
46+ private lazy var oEmbedFetcher : OEmbedFetcher = . init( )
4547 private( set) var page : ThreadPage ?
4648 @FoilDefaultStorage ( Settings . pullForNext) private var pullForNext
4749 private var replyWorkspace : ReplyWorkspace ?
@@ -100,6 +102,7 @@ final class PostsPageViewController: ViewController {
100102 postsView. renderView. registerMessage ( RenderView . BuiltInMessage. DidFinishLoadingTweets. self)
101103 postsView. renderView. registerMessage ( RenderView . BuiltInMessage. DidTapPostActionButton. self)
102104 postsView. renderView. registerMessage ( RenderView . BuiltInMessage. DidTapAuthorHeader. self)
105+ postsView. renderView. registerMessage ( RenderView . BuiltInMessage. FetchOEmbedFragment. self)
103106 postsView. topBar. goToParentForum = { [ unowned self] in
104107 guard let forum = self . thread. forum else { return }
105108 AppDelegate . instance. open ( route: . forum( id: forum. forumID) )
@@ -1352,6 +1355,13 @@ final class PostsPageViewController: ViewController {
13521355
13531356 hiddenMenuButton. show ( menu: postActionMenu, from: frame)
13541357 }
1358+
1359+ private func fetchOEmbed( url: URL , id: String ) {
1360+ Task {
1361+ let callbackData = await oEmbedFetcher. fetch ( url: url, id: id)
1362+ postsView. renderView. didFetchOEmbed ( id: id, response: callbackData)
1363+ }
1364+ }
13551365
13561366 private func presentDraftMenu(
13571367 from source: DraftMenuSource ,
@@ -1552,6 +1562,13 @@ final class PostsPageViewController: ViewController {
15521562 . sink { [ weak self] in self ? . postsView. renderView. setExternalStylesheet ( $0. stylesheet) }
15531563 . store ( in: & cancellables)
15541564
1565+ $embedBlueskyPosts
1566+ . dropFirst ( )
1567+ . filter { $0 }
1568+ . receive ( on: RunLoop . main)
1569+ . sink { [ weak self] _ in self ? . postsView. renderView. embedBlueskyPosts ( ) }
1570+ . store ( in: & cancellables)
1571+
15551572 $embedTweets
15561573 . dropFirst ( )
15571574 . receive ( on: RunLoop . main)
@@ -1717,6 +1734,9 @@ extension PostsPageViewController: ComposeTextViewControllerDelegate {
17171734
17181735extension PostsPageViewController : RenderViewDelegate {
17191736 func didFinishRenderingHTML( in view: RenderView ) {
1737+ if embedBlueskyPosts {
1738+ view. embedBlueskyPosts ( )
1739+ }
17201740 if embedTweets {
17211741 view. embedTweets ( )
17221742 }
@@ -1766,6 +1786,9 @@ extension PostsPageViewController: RenderViewDelegate {
17661786 offset. y = fraction
17671787 postsView. renderView. scrollToFractionalOffset ( offset)
17681788 }
1789+
1790+ case let message as RenderView . BuiltInMessage . FetchOEmbedFragment :
1791+ fetchOEmbed ( url: message. url, id: message. id)
17691792
17701793 case is FYADFlagRequest :
17711794 fetchNewFlag ( )
0 commit comments