stream-chat-react-native-core
Version:
The official React Native and Expo components for Stream Chat, a service for building chat applications
56 lines (48 loc) • 1.92 kB
text/typescript
import { useMemo } from 'react';
import { PollState } from 'stream-chat';
import { useChatContext } from '../../../contexts/chatContext/ChatContext';
import { useTranslationContext } from '../../../contexts/translationContext/TranslationContext';
import { useStateStore } from '../../../hooks/useStateStore';
export type UseChannelPreviewPollLabelProps = {
pollId: string;
};
const selector = (nextValue: PollState) => ({
latest_votes_by_option: nextValue.latest_votes_by_option,
options: nextValue.options,
});
/**
* Hook to get the label of the poll
* @param pollId - The id of the poll
* @returns The label of the poll
*/
export const useChannelPreviewPollLabel = ({ pollId }: UseChannelPreviewPollLabelProps) => {
const { client } = useChatContext();
const { t } = useTranslationContext();
const poll = client.polls.fromState(pollId);
const pollState = useStateStore(poll?.state, selector) ?? ({} as PollState);
const { latest_votes_by_option: latestVotesByOption, options: pollOptions } = pollState;
const latestVotes = useMemo(
() =>
latestVotesByOption
? Object.values(latestVotesByOption)
.map((votes) => votes?.[0])
.sort((a, b) => new Date(b.created_at).getTime() - new Date(a.created_at).getTime())
: [],
[latestVotesByOption],
);
return useMemo(() => {
if (!(latestVotes && latestVotes.length && latestVotes[0].user)) return;
{
const option = pollOptions?.find((option) => option.id === latestVotes[0].option_id);
const voteUser = latestVotes[0].user;
if (voteUser.id === client.user?.id) {
return t('You voted: {{ option }}', { option: option?.text });
} else {
return t('{{ user }} voted: {{ option }}', {
user: voteUser.name || voteUser.id,
option: option?.text,
});
}
}
}, [latestVotes, pollOptions, client.user?.id, t]);
};