OwnCapabilitiesContext
OwnCapabilitiesContext tells the components inside Channel or Thread what the current user may do in the channel, as one boolean for each capability. The SDK's components read it to decide what to show, such as which message actions are in the menu. Read it with useOwnCapabilitiesContext().
The values come from the channel's own_capabilities, which the server sends with the channel and which follow capabilities.changed events. They depend on the user's role, the channel type and the channel's settings. See What channels and threads hold.
Best practices
- Check a capability before showing a control for an action, so the user doesn't get an error from the server.
- Use
overrideOwnCapabilitiesonChannelandThreadto hide a control the user's capabilities would show, or to show one they would hide. It changes only what the SDK's UI shows: the server still checks the user's permissions. - Call
useOwnCapabilitiesContext()only insideChannelorThread. It throws anywhere else. For a channel outside them,useChannelOwnCapabilities(channel)returns the rawown_capabilitieslist.
Basic usage
import { Button } from "react-native";
import type { LocalMessage } from "stream-chat";
import {
useChannel,
useOwnCapabilitiesContext,
} from "stream-chat-react-native";
export const PinButton = ({ message }: { message: LocalMessage }) => {
const channel = useChannel();
const { pinMessage } = useOwnCapabilitiesContext();
if (!pinMessage) return null;
return (
<Button
onPress={() => void channel.getClient().pinMessage({ id: message.id })}
title="Pin"
/>
);
};To change a capability for the SDK's UI, pass overrideOwnCapabilities. This channel shows no reaction picker and no voting buttons, whatever the user's role:
import type { PropsWithChildren } from "react";
import type { Channel as StreamChannel } from "stream-chat";
import { Channel } from "stream-chat-react-native";
import type { OwnCapabilitiesContextValue } from "stream-chat-react-native";
const capabilityOverrides: Partial<OwnCapabilitiesContextValue> = {
castPollVote: false,
sendReaction: false,
};
export const ReadOnlyReactionsChannel = ({
channel,
children,
}: PropsWithChildren<{ channel: StreamChannel }>) => (
<Channel
channel={channel}
keyboardVerticalOffset={0}
overrideOwnCapabilities={capabilityOverrides}
>
{children}
</Channel>
);A key you leave out keeps the value from the server. The context is rebuilt when the channel's capabilities change, or when the contents of overrideOwnCapabilities do; a new object with the same values doesn't rebuild it.
Values
Every value is a boolean, true when the channel's own_capabilities include the capability in the second column. The type is OwnCapabilitiesContextValue, which is Record<OwnCapability, boolean>.
| Value | Type | Capability | What the SDK uses it for |
|---|---|---|---|
banChannelMembers |
boolean |
ban-channel-members |
The Ban User action, on other users' messages |
castPollVote |
boolean |
cast-poll-vote |
The voting buttons of a poll's options, while the poll is open |
deleteAnyMessage |
boolean |
delete-any-message |
The Delete Message action, on other users' messages |
deleteOwnMessage |
boolean |
delete-own-message |
The Delete Message action, on the user's own messages |
flagMessage |
boolean |
flag-message |
The Flag Message action, on other users' messages |
pinMessage |
boolean |
pin-message |
The Pin to Conversation and Unpin from Conversation actions |
queryPollVotes |
boolean |
query-poll-votes |
The "Show All" button of an option with more than five votes in a poll's results |
quoteMessage |
boolean |
quote-message |
The Reply action, outside threads |
readEvents |
boolean |
read-events |
The Mark as Unread action on other users' messages, and the unread messages notification in the message list |
sendLinks |
boolean |
send-links |
Without it, the composer refuses to send a message with a link and shows an alert |
sendMessage |
boolean |
send-message |
Without it, the composer renders SendMessageDisallowedIndicator in place of the input, unless the user is editing a message |
sendPoll |
boolean |
send-poll |
The poll button of the attachment picker |
sendReaction |
boolean |
send-reaction |
The reaction picker in the message menu, and reacting from a message's reactions |
sendReply |
boolean |
send-reply |
The Thread Reply action, outside threads |
sendTypingEvents |
boolean |
send-typing-events |
No SDK component reads it |
updateAnyMessage |
boolean |
update-any-message |
The Edit Message action, on other users' messages |
updateChannelMembers |
boolean |
update-channel-members |
No SDK component reads it |
updateOwnMessage |
boolean |
update-own-message |
The Edit Message action, on the user's own messages |
uploadFile |
boolean |
upload-file |
The attach button of the composer |
allOwnCapabilities maps each key to its capability string, and OwnCapability is the union of the keys. Both are exported.
The menu's actions have other conditions too, such as whether the message failed to send. Message actions lists them.
Related hooks
useOwnCapabilitiesContext()returns the value above, and throws outsideChannelandThread.useChannelOwnCapabilities(channel)returns the channel'sown_capabilitiesfromchannel.state, for any channel. It doesn't applyoverrideOwnCapabilities.