Preserve composer focus when adding thread posts (#11605)
This commit is contained in:
@@ -1700,7 +1700,7 @@ let ComposerPost = memo(function ComposerPost({
|
|||||||
style={[a.pt_xs]}
|
style={[a.pt_xs]}
|
||||||
richtext={richtext}
|
richtext={richtext}
|
||||||
placeholder={selectTextInputPlaceholder}
|
placeholder={selectTextInputPlaceholder}
|
||||||
autoFocus={isLastPost}
|
autoFocus={isActive}
|
||||||
webForceMinHeight={forceMinHeight}
|
webForceMinHeight={forceMinHeight}
|
||||||
// To avoid overlap with the close button:
|
// To avoid overlap with the close button:
|
||||||
hasRightPadding={isPartOfThread}
|
hasRightPadding={isPartOfThread}
|
||||||
|
|||||||
@@ -0,0 +1,60 @@
|
|||||||
|
import {composerReducer, createComposerState} from './composer'
|
||||||
|
|
||||||
|
jest.mock('#/state/gallery', () => ({
|
||||||
|
createInitialImages: jest.fn(),
|
||||||
|
}))
|
||||||
|
jest.mock('#/logger', () => ({
|
||||||
|
logger: {
|
||||||
|
warn: jest.fn(),
|
||||||
|
},
|
||||||
|
}))
|
||||||
|
jest.mock('#/state/queries/postgate/util', () => ({
|
||||||
|
createPostgateRecord: jest.fn(() => ({})),
|
||||||
|
}))
|
||||||
|
jest.mock('#/state/queries/threadgate', () => ({
|
||||||
|
threadgateRecordToAllowUISetting: jest.fn(() => []),
|
||||||
|
}))
|
||||||
|
|
||||||
|
function createState() {
|
||||||
|
return createComposerState({
|
||||||
|
initText: undefined,
|
||||||
|
initMention: undefined,
|
||||||
|
initImageUris: undefined,
|
||||||
|
initQuoteUri: undefined,
|
||||||
|
initInteractionSettings: undefined,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
describe('composerReducer', () => {
|
||||||
|
describe('add_post', () => {
|
||||||
|
it('selects the appended post and requests focus', () => {
|
||||||
|
const state = createState()
|
||||||
|
|
||||||
|
const nextState = composerReducer(state, {type: 'add_post'})
|
||||||
|
|
||||||
|
expect(nextState.thread.posts).toHaveLength(2)
|
||||||
|
expect(nextState.activePostIndex).toBe(1)
|
||||||
|
expect(nextState.mutableNeedsFocusActive).toBe(true)
|
||||||
|
})
|
||||||
|
|
||||||
|
it('selects a post inserted in the middle of a thread', () => {
|
||||||
|
let state = createState()
|
||||||
|
state = composerReducer(state, {type: 'add_post'})
|
||||||
|
state = composerReducer(state, {type: 'add_post'})
|
||||||
|
|
||||||
|
const lastPostId = state.thread.posts[2].id
|
||||||
|
state = composerReducer(state, {
|
||||||
|
type: 'focus_post',
|
||||||
|
postId: state.thread.posts[0].id,
|
||||||
|
})
|
||||||
|
|
||||||
|
const nextState = composerReducer(state, {type: 'add_post'})
|
||||||
|
|
||||||
|
expect(nextState.thread.posts).toHaveLength(4)
|
||||||
|
expect(nextState.activePostIndex).toBe(1)
|
||||||
|
expect(nextState.thread.posts[2].id).not.toBe(lastPostId)
|
||||||
|
expect(nextState.thread.posts[3].id).toBe(lastPostId)
|
||||||
|
expect(nextState.mutableNeedsFocusActive).toBe(true)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
@@ -253,6 +253,8 @@ export function composerReducer(
|
|||||||
return {
|
return {
|
||||||
...state,
|
...state,
|
||||||
isDirty: true,
|
isDirty: true,
|
||||||
|
activePostIndex: activePostIndex + 1,
|
||||||
|
mutableNeedsFocusActive: true,
|
||||||
thread: {
|
thread: {
|
||||||
...state.thread,
|
...state.thread,
|
||||||
posts: nextPosts,
|
posts: nextPosts,
|
||||||
|
|||||||
Reference in New Issue
Block a user