( memberInfo: RelativeMemberInfo, threadInfo: ThreadInfo, canEdit: ?boolean = true, )
| 1460 | } |
| 1461 | |
| 1462 | function useAvailableThreadMemberActions( |
| 1463 | memberInfo: RelativeMemberInfo, |
| 1464 | threadInfo: ThreadInfo, |
| 1465 | canEdit: ?boolean = true, |
| 1466 | ): $ReadOnlyArray<'change_role' | 'remove_user'> { |
| 1467 | const canRemoveMembers = useThreadHasPermission( |
| 1468 | threadInfo, |
| 1469 | threadPermissions.REMOVE_MEMBERS, |
| 1470 | ); |
| 1471 | const canChangeRoles = useThreadHasPermission( |
| 1472 | threadInfo, |
| 1473 | threadPermissions.CHANGE_ROLE, |
| 1474 | ); |
| 1475 | |
| 1476 | return React.useMemo(() => { |
| 1477 | const { role } = memberInfo; |
| 1478 | if (!canEdit || !role || roleIsInviteeRole(threadInfo.roles[role])) { |
| 1479 | return []; |
| 1480 | } |
| 1481 | |
| 1482 | const result = []; |
| 1483 | |
| 1484 | const protocol = threadSpecs[threadInfo.type].protocol(); |
| 1485 | const viewerCanUpdateOwnRole = protocol.viewerCanUpdateOwnRole; |
| 1486 | |
| 1487 | if ( |
| 1488 | canChangeRoles && |
| 1489 | memberInfo.username && |
| 1490 | threadHasAdminRole(threadInfo) && |
| 1491 | (!memberInfo.isViewer || viewerCanUpdateOwnRole) |
| 1492 | ) { |
| 1493 | result.push('change_role'); |
| 1494 | } |
| 1495 | |
| 1496 | if ( |
| 1497 | canRemoveMembers && |
| 1498 | !memberInfo.isViewer && |
| 1499 | (canChangeRoles || roleIsDefaultRole(threadInfo.roles[role])) |
| 1500 | ) { |
| 1501 | result.push('remove_user'); |
| 1502 | } |
| 1503 | |
| 1504 | return result; |
| 1505 | }, [canChangeRoles, canEdit, canRemoveMembers, memberInfo, threadInfo]); |
| 1506 | } |
| 1507 | |
| 1508 | function patchThreadInfoToIncludeMentionedMembersOfParent( |
| 1509 | threadInfo: ThreadInfo, |
no test coverage detected