diff --git a/package.json b/package.json index 0507f906..1d6c37c1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "impro", - "version": "0.20.102", + "version": "0.20.103", "type": "module", "scripts": { "start": "rm -rf \"${BUILD_DIR:-build}\" && NODE_ENV=development eleventy --serve", diff --git a/src/js/postComposerService.js b/src/js/postComposerService.js index e1aa8393..a4a6e8f3 100644 --- a/src/js/postComposerService.js +++ b/src/js/postComposerService.js @@ -19,6 +19,7 @@ export class PostComposerService { replyTo = null, replyRoot = null, quotedPost = null, + initialText = null, }) { if (!currentUser) { console.warn("composePost: No current user"); @@ -113,6 +114,12 @@ export class PostComposerService { // can't wait on plugin init before opening this.currentPostComposer.open(); const composer = this.currentPostComposer; + if (initialText) { + composer.applyComposerInit({ + text: initialText, + cursor: initialText.length, + }); + } if (!replyTo) { // Set default interaction settings from preferences this.dataLayer.preferencesProvider diff --git a/src/js/views/home.view.js b/src/js/views/home.view.js index 7d44dbbc..47e5daf4 100644 --- a/src/js/views/home.view.js +++ b/src/js/views/home.view.js @@ -385,7 +385,13 @@ export default async function homeView({ // so revisiting the cached page doesn't reopen it. if (window.location.pathname === "/intent/compose" && isAuthenticated) { dataLayer.declarative.ensureCurrentUser().then((currentUser) => { - postComposerService.composePost({ currentUser }); + const initialText = new URLSearchParams(window.location.search).get( + "text", + ); + postComposerService.composePost({ + currentUser, + initialText, + }); window.history.replaceState(null, "", "/"); }); } diff --git a/tests/e2e/specs/views/home.view.test.js b/tests/e2e/specs/views/home.view.test.js index 6512080d..cbec6147 100644 --- a/tests/e2e/specs/views/home.view.test.js +++ b/tests/e2e/specs/views/home.view.test.js @@ -1416,6 +1416,27 @@ test.describe("Home view", () => { await expect(page).toHaveURL("/"); }); + test("should prefill the post composer from the /intent/compose text param", async ({ + page, + }) => { + const mockServer = new MockServer(); + await mockServer.setup(page); + + await login(page); + + await page.goto( + `/intent/compose?text=${encodeURIComponent("Hello from an intent #test")}`, + ); + + const composer = page.locator("post-composer .post-composer"); + await expect(composer).toBeVisible({ timeout: 10000 }); + await expect(composer.locator(".rich-text-input")).toHaveText( + "Hello from an intent #test", + ); + + await expect(page).toHaveURL("/"); + }); + test.describe("Show Less / Show More feedback", () => { test("should send Show Less interaction and show feedback message", async ({ page,