import { ReactNode } from "react";
import { Channel } from "stream-chat-react";
import type { PollCreationDialogProps } from "stream-chat-react";
const CustomPollCreationDialog = ({ close }: PollCreationDialogProps) => (
<div onClick={close}>Custom Poll Creation Dialog</div>
);
const ChannelWrapper = ({ children }: { children: ReactNode }) => (
<Channel PollCreationDialog={CustomPollCreationDialog}>{children}</Channel>
);Attachment Selector
Messages can be enriched with attachments or polls by default. The AttachmentSelector component is a component that allows to select what information is to be attached to a message. The attachment objects are included in message.attachments property and represent various file uploads. The poll representation is available via message.poll property.
Enabling the default attachment selector features
The configuration is possible via Stream dashboard. File uploads and poll creation can be controlled via
- role permissions

- channel type configuration

File uploads
Uploads are possible only if both Upload Attachment permission is granted to the user role and channel type Uploads configuration is enabled.
Poll creation
Polls feature is available in the React SDK as of version 12.5.0
Poll creation is enabled only if both Create Poll permission is granted to the user role and channel type Polls configuration is enabled. Poll creation is not possible withing threads.
Poll creation UI
The component in charge of rendering the poll creation UI is PollCreationDialog. The component is rendered in a modal and therefore accepts a prop close.

Custom PollCreationDialog can be provided via Channel prop PollCreationDialog:
Created poll is then rendered within a message list by Poll component.
Attachment selector customization
Custom attachment selector actions
Items in the AttachementSelector menu can be customized via its attachmentSelectorActionSet prop:
import { ReactNode } from "react";
import {
AttachmentSelector,
Channel,
defaultAttachmentSelectorActionSet,
} from "stream-chat-react";
import type {
AttachmentSelectorAction,
AttachmentSelectorActionProps,
AttachmentSelectorModalContentProps,
} from "stream-chat-react";
// Define the menu button
const AddLocationAttachmentAction = ({
closeMenu,
openModalForAction,
}: AttachmentSelectorActionProps) => (
<button
onClick={() => {
openModalForAction("addLocation");
closeMenu();
}}
>
Location
</button>
);
// Define the modal contents to be rendered if AddLocationAttachmentAction button is clicked
const AddLocationModalContent = ({
close,
}: AttachmentSelectorModalContentProps) => {
return <div onClick={close}>abc</div>;
};
// the custom action will be at the top of the menu
const attachmentSelectorActionSet: AttachmentSelectorAction[] = [
{
ActionButton: AddLocationAttachmentAction,
ModalContent: AddLocationModalContent,
type: "addLocation",
},
...defaultAttachmentSelectorActionSet,
];
const CustomAttachmentSelector = () => (
<AttachmentSelector
attachmentSelectorActionSet={attachmentSelectorActionSet}
/>
);
const ChannelWrapper = ({ children }: { children: ReactNode }) => (
<Channel AttachmentSelector={CustomAttachmentSelector}>{children}</Channel>
);Custom modal portal destination
By default, the modals invoked by clicking on AttachmentSelector menu buttons are anchored to the channel container div element. The destination element can be changed by providing getModalPortalDestination prop to AttachmentSelector. This would be function that would return a reference to the target element that would serve as a parent for the modal.
const getModalPortalDestination = () =>
document.querySelector<HTMLDivElement>("#my-element-id");
const CustomAttachmentSelector = () => (
<AttachmentSelector getModalPortalDestination={getModalPortalDestination} />
);AttachmentSelector context
Components rendered as children of AttachmentSelector can access AttachmentSelectorContext. The context exposes the following properties:
fileInput
Reference to input element of type file used to select files to upload. The reference is null if the user does not have a permission to upload files.
| Type | Default |
|---|---|
HTMLInputElement | null |