diff --git a/GraphAPI/Sources/Operations/Queries/RichTextExampleProjectsQuery.graphql.swift b/GraphAPI/Sources/Operations/Queries/RichTextExampleProjectsQuery.graphql.swift index b4e8ab95d6..396ca770a3 100644 --- a/GraphAPI/Sources/Operations/Queries/RichTextExampleProjectsQuery.graphql.swift +++ b/GraphAPI/Sources/Operations/Queries/RichTextExampleProjectsQuery.graphql.swift @@ -7,7 +7,7 @@ public class RichTextExampleProjectsQuery: GraphQLQuery { public static let operationName: String = "RichTextExampleProjectsQuery" public static let operationDocument: ApolloAPI.OperationDocument = .init( definition: .init( - #"query RichTextExampleProjectsQuery { projects(recommended: true, first: 20) { __typename nodes { __typename id name storyRichText { __typename ...RichTextComponentFragment } } } }"#, + #"query RichTextExampleProjectsQuery { projects(recommended: true, first: 10) { __typename nodes { __typename id name storyRichText { __typename ...RichTextComponentFragment } } } }"#, fragments: [RichTextComponentFragment.self, RichTextItemFragment.self] )) @@ -21,7 +21,7 @@ public class RichTextExampleProjectsQuery: GraphQLQuery { public static var __selections: [ApolloAPI.Selection] { [ .field("projects", Projects?.self, arguments: [ "recommended": true, - "first": 20 + "first": 10 ]), ] } diff --git a/Kickstarter-Framework/Sources/Kickstarter-Framework/Kickstarter-iOS/Features/BetaTools/Controller/BetaToolsViewController.swift b/Kickstarter-Framework/Sources/Kickstarter-Framework/Kickstarter-iOS/Features/BetaTools/Controller/BetaToolsViewController.swift index 5ef2e509e1..cc3d9abae5 100644 --- a/Kickstarter-Framework/Sources/Kickstarter-Framework/Kickstarter-iOS/Features/BetaTools/Controller/BetaToolsViewController.swift +++ b/Kickstarter-Framework/Sources/Kickstarter-Framework/Kickstarter-iOS/Features/BetaTools/Controller/BetaToolsViewController.swift @@ -4,6 +4,7 @@ import Library import MessageUI import Prelude import SafariServices +import ServerDrivenUI import SwiftUI import UIKit @@ -203,12 +204,24 @@ internal final class BetaToolsViewController: UITableViewController { self.navigationController?.pushViewController(viewController, animated: true) } + @ViewBuilder private func richTextView( + for project: RichTextExampleProjectsViewModel + .ProjectItem + ) -> some View { + ScrollView { + RichTextView(element: project.richText.asRichTextElements()) + } + .navigationTitle(project.name) + } + private func goToRichTextExample() { - let view = RichTextExampleProjectsView(onSelectProject: { [weak self] project in - let detail = UIHostingController(rootView: Text(project.name)) - self?.navigationController?.pushViewController(detail, animated: true) - }) - let viewController = UIHostingController(rootView: view) + let viewController = UIHostingController( + rootView: RichTextExampleProjectsView(onSelectProject: { [weak self] project in + guard let self else { return } + let detail = UIHostingController(rootView: self.richTextView(for: project)) + self.navigationController?.pushViewController(detail, animated: true) + }) + ) self.navigationController?.pushViewController(viewController, animated: true) } diff --git a/ServerDrivenUI/Sources/ServerDrivenUI/RichTextView.swift b/ServerDrivenUI/Sources/ServerDrivenUI/RichTextView.swift index e69de29bb2..37fc7e5bf1 100644 --- a/ServerDrivenUI/Sources/ServerDrivenUI/RichTextView.swift +++ b/ServerDrivenUI/Sources/ServerDrivenUI/RichTextView.swift @@ -0,0 +1,46 @@ +import KDS +import SwiftUI + +public struct RichTextView: View { + public var element: [RichTextElement] + @Environment(\.richTextStyle) var style: any RichTextStyle + + public init(element: [RichTextElement]) { + self.element = element + } + + @ViewBuilder private func unimplemented(_ text: String) -> some View { + Text("Unimplemented! \(text)") + .font(.footnote) + .foregroundStyle(Color.red) + .frame(maxWidth: .infinity, alignment: .center) + .padding() + .backgroundStyle(Color.gray) + } + + public var body: some View { + LazyVStack(spacing: self.style.blockSpacing) { + ForEach(Array(self.element.enumerated()), id: \.offset) { _, element in + switch element { + case let .text(text, header): + self.unimplemented("Text") + case let .listItem(listItem): + self.unimplemented("ListItem") + case .audio: + self.unimplemented("Audio") + case .photo: + self.unimplemented("Photo") + case .video: + self.unimplemented("Video") + case .oembed: + self.unimplemented("Oembed") + case .listItemOpen, .listItemClose: + Group {} + case .unknown: + EmptyView() + } + } + } + .padding(.horizontal, self.style.contentHorizontalPadding) + } +} diff --git a/graphql/queries/RichTextExampleProjectsQuery.graphql b/graphql/queries/RichTextExampleProjectsQuery.graphql index 98160e9796..7d52ede8c1 100644 --- a/graphql/queries/RichTextExampleProjectsQuery.graphql +++ b/graphql/queries/RichTextExampleProjectsQuery.graphql @@ -1,5 +1,5 @@ query RichTextExampleProjectsQuery{ - projects(recommended: true, first: 20) { + projects(recommended: true, first: 10) { nodes{ id name