Changeset View
Changeset View
Standalone View
Standalone View
lib/shared/edit-messages-utils.js
// @flow | // @flow | ||||
import invariant from 'invariant'; | |||||
import * as React from 'react'; | |||||
import { threadHasPermission } from './thread-utils.js'; | import { threadHasPermission } from './thread-utils.js'; | ||||
import { messageTypes } from '../types/message-types.js'; | import { | ||||
sendEditMessageActionTypes, | |||||
sendEditMessage, | |||||
} from '../actions/message-actions.js'; | |||||
import type { | import type { | ||||
SendEditMessageResult, | |||||
RobotextMessageInfo, | RobotextMessageInfo, | ||||
ComposableMessageInfo, | ComposableMessageInfo, | ||||
} from '../types/message-types.js'; | } from '../types/message-types'; | ||||
import { messageTypes } from '../types/message-types.js'; | |||||
import { threadPermissions, type ThreadInfo } from '../types/thread-types.js'; | import { threadPermissions, type ThreadInfo } from '../types/thread-types.js'; | ||||
import { | |||||
useDispatchActionPromise, | |||||
useServerCall, | |||||
} from '../utils/action-utils.js'; | |||||
import { useSelector } from '../utils/redux-utils.js'; | import { useSelector } from '../utils/redux-utils.js'; | ||||
function useEditMessage( | |||||
messageID?: string, | |||||
): (newText: string) => Promise<SendEditMessageResult> { | |||||
const callEditMessage = useServerCall(sendEditMessage); | |||||
const dispatchActionPromise = useDispatchActionPromise(); | |||||
return React.useCallback( | |||||
newText => { | |||||
invariant(messageID, 'messageID should be set!'); | |||||
const editMessagePromise = (async () => { | |||||
const result = await callEditMessage({ | |||||
targetMessageID: messageID, | |||||
text: newText, | |||||
}); | |||||
return { | |||||
newMessageInfos: result.newMessageInfos, | |||||
}; | |||||
})(); | |||||
dispatchActionPromise(sendEditMessageActionTypes, editMessagePromise); | |||||
return editMessagePromise; | |||||
}, | |||||
[messageID, dispatchActionPromise, callEditMessage], | |||||
); | |||||
} | |||||
function useCanEditMessage( | function useCanEditMessage( | ||||
threadInfo: ThreadInfo, | threadInfo: ThreadInfo, | ||||
targetMessageInfo: ComposableMessageInfo | RobotextMessageInfo, | targetMessageInfo: ComposableMessageInfo | RobotextMessageInfo, | ||||
): boolean { | ): boolean { | ||||
const currentUserInfo = useSelector(state => state.currentUserInfo); | const currentUserInfo = useSelector(state => state.currentUserInfo); | ||||
if (targetMessageInfo.type !== messageTypes.TEXT) { | if (targetMessageInfo.type !== messageTypes.TEXT) { | ||||
return false; | return false; | ||||
Show All 11 Lines | ): boolean { | ||||
const hasPermission = threadHasPermission( | const hasPermission = threadHasPermission( | ||||
threadInfo, | threadInfo, | ||||
threadPermissions.EDIT_MESSAGE, | threadPermissions.EDIT_MESSAGE, | ||||
); | ); | ||||
return hasPermission; | return hasPermission; | ||||
} | } | ||||
export { useCanEditMessage }; | export { useCanEditMessage, useEditMessage }; |