@@ -56,6 +59,7 @@ function renderRouter(hash: string, options: { preferences?: Record
));
- return { renderComposer, renderMessages, renderNotifications, renderPost, renderProfile, renderTimeline };
+ return {
+ renderComposer,
+ renderMessages,
+ renderNotifications,
+ renderPost,
+ renderPostEngagement,
+ renderProfile,
+ renderTimeline,
+ };
}
describe("AppRouter", () => {
@@ -120,6 +132,16 @@ describe("AppRouter", () => {
expect(screen.getByTestId("shell")).toHaveAttribute("data-full-width", "false");
});
+ it("renders post engagement routes with the decoded post uri", async () => {
+ const uri = "at://did:plc:alice/app.bsky.feed.post/123";
+ const { renderPostEngagement } = renderRouter(`#/post/${encodeURIComponent(uri)}/engagement?tab=quotes`);
+
+ await screen.findByTestId("post-engagement-view");
+
+ expect(renderPostEngagement.mock.lastCall?.[0].uri).toBe(uri);
+ expect(screen.getByTestId("shell")).toHaveAttribute("data-full-width", "false");
+ });
+
it("renders the saved posts route inside the protected shell", async () => {
renderRouter("#/saved");
diff --git a/src/router.tsx b/src/router.tsx
index e5fdd02..f9a7271 100644
--- a/src/router.tsx
+++ b/src/router.tsx
@@ -29,6 +29,7 @@ type AppRouterProps = {
renderComposer: () => JSX.Element;
renderMessages: Component;
renderNotifications: () => JSX.Element;
+ renderPostEngagement: Component;
renderPost: Component;
renderProfile: Component;
renderShell: Component;
@@ -113,6 +114,16 @@ export function AppRouter(props: AppRouterProps) {
);
};
+ const PostEngagementRoute = () => {
+ const params = useParams<{ encodedUri: string }>();
+
+ return (
+
+
+
+ );
+ };
+
const HashtagRoute = () => {
const params = useParams<{ hashtag: string }>();
const tag = decodeHashtagRouteTag(params.hashtag);
@@ -187,6 +198,7 @@ export function AppRouter(props: AppRouterProps) {
+