From e5fc481ab6685bf091b6c800b7ccff9e0e78087f Mon Sep 17 00:00:00 2001 From: Dmytro Oliinyk Date: Thu, 24 Sep 2026 17:41:28 +0000 Subject: [PATCH] Refactor compose path detection into a reusable utility function and add related tests (#40663) --- app/javascript/mastodon/actions/compose.js | 3 +- .../mastodon/actions/compose_path.test.ts | 35 +++++++++++++++++++ .../mastodon/actions/compose_path.ts | 7 ++++ 3 files changed, 44 insertions(+), 1 deletion(-) create mode 100644 app/javascript/mastodon/actions/compose_path.test.ts create mode 100644 app/javascript/mastodon/actions/compose_path.ts diff --git a/app/javascript/mastodon/actions/compose.js b/app/javascript/mastodon/actions/compose.js index 302651f78ac..05fb64a7ff8 100644 --- a/app/javascript/mastodon/actions/compose.js +++ b/app/javascript/mastodon/actions/compose.js @@ -10,6 +10,7 @@ import { tagHistory } from '@/mastodon/settings'; import { emojiMartSearch } from '@/mastodon/features/emoji/picker'; import { showAlert, showAlertForError } from './alerts'; +import { isStandaloneComposePath } from './compose_path'; import { emojiUse } from './emojis'; import { importFetchedAccounts, importFetchedStatus } from './importer'; import { openModal } from './modal'; @@ -278,7 +279,7 @@ export function submitCompose(successCallback) { 'Idempotency-Key': getState().getIn(['compose', 'idempotencyKey']), }, }).then(function (response) { - if ((browserHistory.location.pathname === '/publish' || browserHistory.location.pathname === '/statuses/new') && window.history.state) { + if (isStandaloneComposePath(browserHistory.location.pathname) && window.history.state) { browserHistory.goBack(); } diff --git a/app/javascript/mastodon/actions/compose_path.test.ts b/app/javascript/mastodon/actions/compose_path.test.ts new file mode 100644 index 00000000000..fdd6f0715d2 --- /dev/null +++ b/app/javascript/mastodon/actions/compose_path.test.ts @@ -0,0 +1,35 @@ +import { isStandaloneComposePath } from './compose_path'; + +describe('isStandaloneComposePath', () => { + test('returns true for /publish', () => { + expect(isStandaloneComposePath('/publish')).toBe(true); + }); + + test('returns true for /statuses/new', () => { + expect(isStandaloneComposePath('/statuses/new')).toBe(true); + }); + + test('returns true for /deck/publish', () => { + expect(isStandaloneComposePath('/deck/publish')).toBe(true); + }); + + test('returns true for /deck/statuses/new', () => { + expect(isStandaloneComposePath('/deck/statuses/new')).toBe(true); + }); + + test('returns false for /deck/home', () => { + expect(isStandaloneComposePath('/deck/home')).toBe(false); + }); + + test('returns false for /home', () => { + expect(isStandaloneComposePath('/home')).toBe(false); + }); + + test('returns false for /deck', () => { + expect(isStandaloneComposePath('/deck')).toBe(false); + }); + + test('returns false for /deck/publish/extra', () => { + expect(isStandaloneComposePath('/deck/publish/extra')).toBe(false); + }); +}); diff --git a/app/javascript/mastodon/actions/compose_path.ts b/app/javascript/mastodon/actions/compose_path.ts new file mode 100644 index 00000000000..7ac827ff7fa --- /dev/null +++ b/app/javascript/mastodon/actions/compose_path.ts @@ -0,0 +1,7 @@ +export function isStandaloneComposePath(pathname: string): boolean { + const normalized = pathname.startsWith('/deck/') + ? pathname.slice('/deck'.length) + : pathname; + + return normalized === '/publish' || normalized === '/statuses/new'; +}