From 91b08f30d5e7a085329d7edac4f6306f6ddf5e00 Mon Sep 17 00:00:00 2001 From: martincupela Date: Wed, 2 Oct 2024 13:26:55 +0200 Subject: [PATCH 01/71] feat: add Poll component for Message --- .../Attachment/components/ProgressBar.tsx | 7 +- src/components/Dialog/FormDialog.tsx | 145 +++++++++++ src/components/Dialog/PromptDialog.tsx | 27 +++ src/components/Dialog/index.ts | 2 + .../InfiniteScroll.tsx | 10 + .../InfiniteScrollPaginator.tsx | 112 +++++++++ .../hooks/useCursorPaginator.ts | 42 ++++ src/components/Loading/LoadingIndicator.tsx | 1 + src/components/Message/MessageSimple.tsx | 3 + src/components/Message/hooks/useUserRole.ts | 5 +- src/components/Poll/Poll.tsx | 29 +++ src/components/Poll/PollActions.tsx | 229 ++++++++++++++++++ src/components/Poll/PollHeader.tsx | 43 ++++ src/components/Poll/PollOptionList.tsx | 41 ++++ src/components/Poll/PollOptionSelector.tsx | 135 +++++++++++ src/components/Poll/PollVote.tsx | 110 +++++++++ src/components/Poll/config.ts | 1 + src/components/Poll/constants.ts | 1 + src/components/Poll/hooks/index.ts | 4 + src/components/Poll/hooks/usePoll.ts | 9 + .../Poll/hooks/usePollAnswersPagination.ts | 44 ++++ .../hooks/usePollOptionVotesPagination.ts | 47 ++++ src/components/Poll/hooks/usePollState.ts | 14 ++ src/components/Poll/icons.tsx | 5 + src/components/Poll/identity.ts | 9 + src/components/Poll/index.ts | 1 + src/components/Poll/modals/ModalHeader.tsx | 17 ++ .../Poll/modals/PollAnswersList.tsx | 42 ++++ .../Poll/modals/PollOptionsFullList.tsx | 38 +++ .../PollResults/PollOptionVotesList.tsx | 54 +++++ .../PollResults/PollOptionWithLatestVotes.tsx | 58 +++++ .../PollResults/PollOptionWithVotesHeader.tsx | 55 +++++ .../Poll/modals/PollResults/PollResults.tsx | 71 ++++++ src/context/PollContext.tsx | 52 ++++ src/context/index.ts | 1 + src/i18n/de.json | 38 ++- src/i18n/en.json | 26 ++ src/i18n/es.json | 72 ++++-- src/i18n/fr.json | 94 ++++--- src/i18n/hi.json | 26 ++ src/i18n/it.json | 74 ++++-- src/i18n/ja.json | 22 ++ src/i18n/ko.json | 22 ++ src/i18n/nl.json | 32 ++- src/i18n/pt.json | 54 ++++- src/i18n/ru.json | 46 +++- src/i18n/tr.json | 34 ++- src/types/types.ts | 2 + 48 files changed, 1895 insertions(+), 111 deletions(-) create mode 100644 src/components/Dialog/FormDialog.tsx create mode 100644 src/components/Dialog/PromptDialog.tsx create mode 100644 src/components/InfiniteScrollPaginator/InfiniteScrollPaginator.tsx create mode 100644 src/components/InfiniteScrollPaginator/hooks/useCursorPaginator.ts create mode 100644 src/components/Poll/Poll.tsx create mode 100644 src/components/Poll/PollActions.tsx create mode 100644 src/components/Poll/PollHeader.tsx create mode 100644 src/components/Poll/PollOptionList.tsx create mode 100644 src/components/Poll/PollOptionSelector.tsx create mode 100644 src/components/Poll/PollVote.tsx create mode 100644 src/components/Poll/config.ts create mode 100644 src/components/Poll/constants.ts create mode 100644 src/components/Poll/hooks/index.ts create mode 100644 src/components/Poll/hooks/usePoll.ts create mode 100644 src/components/Poll/hooks/usePollAnswersPagination.ts create mode 100644 src/components/Poll/hooks/usePollOptionVotesPagination.ts create mode 100644 src/components/Poll/hooks/usePollState.ts create mode 100644 src/components/Poll/icons.tsx create mode 100644 src/components/Poll/identity.ts create mode 100644 src/components/Poll/index.ts create mode 100644 src/components/Poll/modals/ModalHeader.tsx create mode 100644 src/components/Poll/modals/PollAnswersList.tsx create mode 100644 src/components/Poll/modals/PollOptionsFullList.tsx create mode 100644 src/components/Poll/modals/PollResults/PollOptionVotesList.tsx create mode 100644 src/components/Poll/modals/PollResults/PollOptionWithLatestVotes.tsx create mode 100644 src/components/Poll/modals/PollResults/PollOptionWithVotesHeader.tsx create mode 100644 src/components/Poll/modals/PollResults/PollResults.tsx create mode 100644 src/context/PollContext.tsx diff --git a/src/components/Attachment/components/ProgressBar.tsx b/src/components/Attachment/components/ProgressBar.tsx index d8eb0d2be9..1e5d5fd10a 100644 --- a/src/components/Attachment/components/ProgressBar.tsx +++ b/src/components/Attachment/components/ProgressBar.tsx @@ -1,13 +1,14 @@ +import clsx from 'clsx'; import React from 'react'; export type ProgressBarProps = { /** Progress expressed in fractional number value btw 0 and 100. */ progress: number; -} & Pick, 'onClick'>; +} & Pick, 'className' | 'onClick'>; -export const ProgressBar = ({ onClick, progress }: ProgressBarProps) => ( +export const ProgressBar = ({ className, onClick, progress }: ProgressBarProps) => (
Error[]; + +export type FieldConfig = { + element: FormElements; + props: ComponentProps; + label?: React.ReactNode; + validator?: Validator; +}; + +type TextInputFormProps>> = { + close: () => void; + fields: Record; + onSubmit: (formValue: F) => Promise; + className?: string; + shouldDisableSubmitButton?: (formValue: F) => boolean; + title?: string; +}; + +type FormValue> = { + [K in keyof F]: F[K]['props']['value']; +}; + +export const FormDialog = < + F extends FormValue> = FormValue> +>({ + className, + close, + fields, + onSubmit, + shouldDisableSubmitButton, + title, +}: TextInputFormProps) => { + const { t } = useTranslationContext(); + const [fieldErrors, setFieldErrors] = useState>({}); + const [value, setValue] = useState(() => { + let acc: Partial = {}; + for (const [id, config] of Object.entries(fields)) { + acc = { ...acc, [id]: config.props.value }; + } + return acc as F; + }); + + const handleChange = useCallback>( + (event) => { + const fieldId = event.target.id; + const fieldConfig = fields[fieldId]; + if (!fieldConfig) return; + + const errors = fieldConfig.validator?.(event.target.value); + if (errors?.length) setFieldErrors((prev) => ({ [fieldId]: errors, ...prev })); + setValue((prev) => ({ ...prev, [fieldId]: event.target.value })); + + if (!fieldConfig.props.onChange) return; + + if (fieldConfig.element === 'input') { + (fieldConfig.props.onChange as ChangeEventHandler)( + event as ChangeEvent, + ); + } else if (fieldConfig.element === 'textarea') { + (fieldConfig.props.onChange as ChangeEventHandler)( + event as ChangeEvent, + ); + } + }, + [fields], + ); + + const handleSubmit = async () => { + if (!Object.keys(value).length) return; + const errors: Record = {}; + for (const [id, fieldValue] of Object.entries(value)) { + const thisFieldErrors = fields[id].validator?.(fieldValue); + if (thisFieldErrors?.length) { + errors[id] = thisFieldErrors; + } + } + if (Object.keys(errors).length) { + setFieldErrors(errors); + return; + } + await onSubmit(value); + close(); + }; + + return ( +
+
+ {title &&
{title}
} +
+ {Object.entries(fields).map(([id, fieldConfig]) => ( +
+ {fieldConfig.label && ( + + )} + {React.createElement(fieldConfig.element, { + id, + ...fieldConfig.props, + onChange: handleChange, + value: value[id], + })} + {fieldErrors[id]?.map((error, errIndex) => ( +
+ {error.message} +
+ ))} +
+ ))} +
+
+
+ + +
+
+ ); +}; diff --git a/src/components/Dialog/PromptDialog.tsx b/src/components/Dialog/PromptDialog.tsx new file mode 100644 index 0000000000..c916fb5a80 --- /dev/null +++ b/src/components/Dialog/PromptDialog.tsx @@ -0,0 +1,27 @@ +import React, { ComponentProps } from 'react'; +import clsx from 'clsx'; + +export type ConfirmationDialogProps = { + actions: ComponentProps<'button'>[]; + prompt: string; + className?: string; + title?: string; +}; + +export const PromptDialog = ({ actions, className, prompt, title }: ConfirmationDialogProps) => ( +
+
+ {title &&
{title}
} +
{prompt}
+
+
+ {actions.map(({ className, ...props }, i) => ( +
+
+); diff --git a/src/components/Dialog/index.ts b/src/components/Dialog/index.ts index a2462dbcdd..f423f6866e 100644 --- a/src/components/Dialog/index.ts +++ b/src/components/Dialog/index.ts @@ -2,3 +2,5 @@ export * from './DialogAnchor'; export * from './DialogManager'; export * from './DialogPortal'; export * from './hooks'; +export * from './FormDialog'; +export * from './PromptDialog'; diff --git a/src/components/InfiniteScrollPaginator/InfiniteScroll.tsx b/src/components/InfiniteScrollPaginator/InfiniteScroll.tsx index 212b999ae4..3793bdc28a 100644 --- a/src/components/InfiniteScrollPaginator/InfiniteScroll.tsx +++ b/src/components/InfiniteScrollPaginator/InfiniteScroll.tsx @@ -45,6 +45,16 @@ export type InfiniteScrollProps = PaginatorProps & { useCapture?: boolean; }; +/** + * This component serves a single purpose - load more items on scroll inside the MessageList component + * It is not a general purpose infinite scroll controller, because: + * 1. It is re-rendered whenever isLoading, hasNext, hasPrev changes. This can lead to scrollListener to have stale data. + * 2. It pretends to invoke scrollListener on resize event even though this event is emitted only on window resize. It should + * rather use ResizeObserver. But then again, it ResizeObserver would invoke a stale version of scrollListener. + * + * In general, the infinite scroll controller should not aim for checking the loading state and whether there is more data to load. + * That should be controlled by the loading function. + */ export const InfiniteScroll = (props: PropsWithChildren) => { const { children, diff --git a/src/components/InfiniteScrollPaginator/InfiniteScrollPaginator.tsx b/src/components/InfiniteScrollPaginator/InfiniteScrollPaginator.tsx new file mode 100644 index 0000000000..b26b7168af --- /dev/null +++ b/src/components/InfiniteScrollPaginator/InfiniteScrollPaginator.tsx @@ -0,0 +1,112 @@ +import clsx from 'clsx'; +import debounce from 'lodash.debounce'; +import React, { PropsWithChildren, useEffect, useMemo, useRef } from 'react'; +import { DEFAULT_LOAD_PAGE_SCROLL_THRESHOLD } from '../../constants/limits'; + +/** + * Prevents Chrome hangups + * See: https://stackoverflow.com/questions/47524205/random-high-content-download-time-in-chrome/47684257#47684257 + */ +const mousewheelListener = (event: Event) => { + if (event instanceof WheelEvent && event.deltaY === 1) { + event.preventDefault(); + } +}; + +export type InfiniteScrollPaginatorProps = React.ComponentProps<'div'> & { + listenToScroll?: (distanceFromBottom: number, distanceFromTop: number, threshold: number) => void; + loadNextOnScrollToBottom?: () => void; + loadNextOnScrollToTop?: () => void; + /** Offset from when to start the loadNextPage call */ + threshold?: number; + useCapture?: boolean; +}; + +export const InfiniteScrollPaginator = (props: PropsWithChildren) => { + const { + children, + listenToScroll, + loadNextOnScrollToBottom, + loadNextOnScrollToTop, + threshold = DEFAULT_LOAD_PAGE_SCROLL_THRESHOLD, + useCapture = false, + className, + ...componentProps + } = props; + + const rootRef = useRef(null); + const childRef = useRef(null); + + const scrollListener = useMemo( + () => + debounce(() => { + const root = rootRef.current; + const child = childRef.current; + if (!root || root.offsetParent === null || !child) { + return; + } + + const distanceFromBottom = child.scrollHeight - root.scrollTop - root.clientHeight; + const distanceFromTop = root.scrollTop; + + if (listenToScroll) { + listenToScroll(distanceFromBottom, distanceFromTop, threshold); + } + + if (distanceFromTop < Number(threshold)) { + loadNextOnScrollToTop?.(); + } + + if (distanceFromBottom < Number(threshold)) { + loadNextOnScrollToBottom?.(); + } + }, 500), + [listenToScroll, loadNextOnScrollToBottom, loadNextOnScrollToTop, threshold], + ); + + useEffect(() => { + const scrollElement = rootRef.current; + if (!scrollElement) return; + + scrollElement.addEventListener('scroll', scrollListener, useCapture); + + return () => { + scrollElement.removeEventListener('scroll', scrollListener, useCapture); + }; + }, [scrollListener, useCapture]); + + useEffect(() => { + const root = rootRef.current; + if (!root || typeof ResizeObserver === 'undefined' || !scrollListener) return; + const observer = new ResizeObserver(scrollListener); + observer.observe(root as Element); + + return () => { + observer.disconnect(); + }; + }, [scrollListener]); + + useEffect(() => { + const root = rootRef.current; + if (root) { + root.addEventListener('wheel', mousewheelListener, { passive: false }); + } + return () => { + if (root) { + root.removeEventListener('wheel', mousewheelListener, useCapture); + } + }; + }, [useCapture]); + + return ( +
+
+ {children} +
+
+ ); +}; diff --git a/src/components/InfiniteScrollPaginator/hooks/useCursorPaginator.ts b/src/components/InfiniteScrollPaginator/hooks/useCursorPaginator.ts new file mode 100644 index 0000000000..32d2ebb83c --- /dev/null +++ b/src/components/InfiniteScrollPaginator/hooks/useCursorPaginator.ts @@ -0,0 +1,42 @@ +import uniqBy from 'lodash.uniqby'; +import { useCallback, useEffect, useRef, useState } from 'react'; + +export type PaginationFn = (next?: string) => Promise<{ items: T[]; next?: string }>; + +export const useCursorPaginator = (paginationFn: PaginationFn, loadFirstPage?: boolean) => { + const [items, setItems] = useState([]); + const [loading, setLoading] = useState(false); + const [error, setError] = useState(); + const cursorRef = useRef(); + const queryInProgress = useRef(false); + + const loadMore = useCallback(async () => { + if (cursorRef.current === null || queryInProgress.current) return; + + setLoading(true); + queryInProgress.current = true; + try { + const { items, next } = await paginationFn(cursorRef.current); + cursorRef.current = next || null; + setItems((prev) => uniqBy([...prev, ...items], 'id')); + } catch (e) { + setError(e as Error); + } + queryInProgress.current = false; + setLoading(false); + }, [paginationFn]); + + useEffect(() => { + if (!loadFirstPage || items.length) return; + loadMore(); + }, [loadFirstPage, loadMore, items]); + + return { + error, + hasNextPage: cursorRef.current !== null, + items, + loading, + loadMore, + next: cursorRef.current, + }; +}; diff --git a/src/components/Loading/LoadingIndicator.tsx b/src/components/Loading/LoadingIndicator.tsx index 690107a943..73b2314dc1 100644 --- a/src/components/Loading/LoadingIndicator.tsx +++ b/src/components/Loading/LoadingIndicator.tsx @@ -1,5 +1,6 @@ import React from 'react'; +// FIXME: remove color and size props and let the loading indicator to be styled via CSS export type LoadingIndicatorProps = { /** Set the color of the LoadingIndicator */ color?: string; diff --git a/src/components/Message/MessageSimple.tsx b/src/components/Message/MessageSimple.tsx index 4b6746446c..a421810d37 100644 --- a/src/components/Message/MessageSimple.tsx +++ b/src/components/Message/MessageSimple.tsx @@ -23,6 +23,7 @@ import { CUSTOM_MESSAGE_TYPE } from '../../constants/messageTypes'; import { EditMessageForm as DefaultEditMessageForm, MessageInput } from '../MessageInput'; import { MML } from '../MML'; import { Modal } from '../Modal'; +import { Poll } from '../Poll'; import { ReactionsList as DefaultReactionList } from '../Reactions'; import { MessageBounceModal } from '../MessageBounce/MessageBounceModal'; import { useComponentContext } from '../../context/ComponentContext'; @@ -30,6 +31,7 @@ import { MessageContextValue, useMessageContext } from '../../context/MessageCon import { useTranslationContext } from '../../context'; import { MessageEditedTimestamp } from './MessageEditedTimestamp'; +import type { PollResponse } from 'stream-chat'; import type { MessageUIComponentProps } from './types'; import type { DefaultStreamChatGenerics } from '../../types/types'; @@ -176,6 +178,7 @@ const MessageSimpleWithContext = < {hasReactions && }
+ {message.poll && } />} {message.attachments?.length && !message.quoted_message ? ( ) : null} diff --git a/src/components/Message/hooks/useUserRole.ts b/src/components/Message/hooks/useUserRole.ts index 35ade23b2b..b4077b6d53 100644 --- a/src/components/Message/hooks/useUserRole.ts +++ b/src/components/Message/hooks/useUserRole.ts @@ -41,8 +41,9 @@ export const useUserRole = < const isMyMessage = client.userID === message.user?.id; const canEdit = - (!onlySenderCanEdit && channelCapabilities['update-any-message']) || - (isMyMessage && channelCapabilities['update-own-message']); + !message.poll && + ((!onlySenderCanEdit && channelCapabilities['update-any-message']) || + (isMyMessage && channelCapabilities['update-own-message'])); const canDelete = channelCapabilities['delete-any-message'] || diff --git a/src/components/Poll/Poll.tsx b/src/components/Poll/Poll.tsx new file mode 100644 index 0000000000..c3825f42c4 --- /dev/null +++ b/src/components/Poll/Poll.tsx @@ -0,0 +1,29 @@ +import clsx from 'clsx'; +import React from 'react'; +import { PollActions } from './PollActions'; +import { PollHeader } from './PollHeader'; +import { PollOptionList } from './PollOptionList'; +import { MAX_OPTIONS_DISPLAYED } from './config'; +import { PollProvider } from '../../context'; +import type { PollResponse } from 'stream-chat'; +import type { DefaultStreamChatGenerics } from '../../types'; + +export const Poll = < + StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics +>({ + poll, +}: { + poll: PollResponse; +}) => { + if (!poll) return null; + + return ( + +
+ + + +
+
+ ); +}; diff --git a/src/components/Poll/PollActions.tsx b/src/components/Poll/PollActions.tsx new file mode 100644 index 0000000000..06675fc66f --- /dev/null +++ b/src/components/Poll/PollActions.tsx @@ -0,0 +1,229 @@ +import React, { PropsWithChildren, useCallback, useState } from 'react'; +import { PollAnswersList } from './modals/PollAnswersList'; +import { PollOptionsFullList } from './modals/PollOptionsFullList'; +import { FormDialog, PromptDialog } from '../Dialog'; +import { MAX_OPTIONS_DISPLAYED } from './config'; +import { MAX_POLL_OPTIONS } from './constants'; +import { PollResults } from './modals/PollResults/PollResults'; +import { Modal } from '../Modal'; +import { usePoll, usePollState } from './hooks'; +import { + useChannelStateContext, + useChatContext, + useMessageContext, + useTranslationContext, +} from '../../context'; + +import type { PollAnswer, PollOption, PollState } from 'stream-chat'; +import type { DefaultStreamChatGenerics } from '../../types'; + +type ModalName = + | 'suggest-option' + | 'add-comment' + | 'view-all-options' + | 'view-comments' + | 'view-results' + | 'end-vote'; + +type PollStateSelectorReturnValue = [ + boolean | undefined, + boolean | undefined, + number, + string, + boolean | undefined, + PollOption[], + PollAnswer | undefined, +]; +const pollStateSelector = < + StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics +>( + nextValue: PollState, +): PollStateSelectorReturnValue => [ + nextValue.allow_answers, + nextValue.allow_user_suggested_options, + nextValue.answers_count, + nextValue.created_by_id, + nextValue.is_closed, + nextValue.options, + nextValue.ownAnswer, +]; + +export const PollActions = < + StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics +>() => { + const { client } = useChatContext(); + const { t } = useTranslationContext('PollActions'); + const { channelCapabilities = {} } = useChannelStateContext('PollActions'); + const { message } = useMessageContext('PollActions'); + const poll = usePoll(); + const [ + allow_answers, + allow_user_suggested_options, + answers_count, + created_by_id, + is_closed, + options, + ownAnswer, + ] = usePollState(pollStateSelector); + const [modalOpen, setModalOpen] = useState(); + + const closeModal = useCallback(() => setModalOpen(undefined), []); + + return ( +
+ {options.length > MAX_OPTIONS_DISPLAYED && ( + ('See all options ({{count}})', { + count: options.length, + })} + closeModal={closeModal} + modalIsOpen={modalOpen === 'view-all-options'} + openModal={() => setModalOpen('view-all-options')} + > + + + )} + + {!is_closed && allow_user_suggested_options && options.length < MAX_POLL_OPTIONS && ( + ('Suggest an option')} + closeModal={closeModal} + modalIsOpen={modalOpen === 'suggest-option'} + openModal={() => setModalOpen('suggest-option')} + > + + className='str-chat__modal__suggest-poll-option' + close={closeModal} + fields={{ + optionText: { + element: 'input', + props: { + id: 'optionText', + name: 'optionText', + required: true, + type: 'text', + value: '', + }, + }, + }} + onSubmit={async (value) => { + await client.createPollOption(poll.id, { text: value.optionText }); + }} + shouldDisableSubmitButton={(value) => !value.optionText} + title={t('Suggest an option')} + /> + + )} + + {!is_closed && allow_answers && ( + ('Update your comment') : t('Add a comment')} + closeModal={closeModal} + modalIsOpen={modalOpen === 'add-comment'} + openModal={() => setModalOpen('add-comment')} + > + + className='str-chat__modal__poll-add-comment' + close={closeModal} + fields={{ + comment: { + element: 'input', + props: { + id: 'comment', + name: 'comment', + required: true, + type: 'text', + value: ownAnswer?.answer_text ?? '', + }, + }, + }} + onSubmit={async (value) => { + await poll.addAnswer(value.comment, message.id); + }} + shouldDisableSubmitButton={(value) => + !value.comment || value.comment === ownAnswer?.answer_text + } + title={ownAnswer ? t('Update your comment') : t('Add a comment')} + /> + + )} + + {answers_count > 0 && channelCapabilities['query-poll-votes'] && ( + ('View {{count}} comments', { count: answers_count })} + closeModal={closeModal} + modalIsOpen={modalOpen === 'view-comments'} + openModal={() => setModalOpen('view-comments')} + > + + + + )} + + ('View results')} + closeModal={closeModal} + modalIsOpen={modalOpen === 'view-results'} + openModal={() => setModalOpen('view-results')} + > + + + + {!is_closed && created_by_id === client.user?.id && ( + ('End vote')} + closeModal={closeModal} + modalIsOpen={modalOpen === 'end-vote'} + openModal={() => setModalOpen('end-vote')} + > + ('Cancel'), + className: 'str-chat__dialog__controls-button--cancel', + onClick: closeModal, + }, + { + children: t('End'), + className: + '.str-chat__dialog__controls-button--submit str-chat__dialog__controls-button--end-poll', + onClick: poll.close, + }, + ]} + className='str-chat__modal__end-vote' + prompt={t('Nobody will be able to vote in this poll anymore.')} + title={t('End vote')} + /> + + )} +
+ ); +}; + +export type PollActionProps = { + buttonText: string; + closeModal: () => void; + modalIsOpen: boolean; + openModal: () => void; + modalClassName?: string; +}; + +const PollAction = ({ + buttonText, + children, + closeModal, + modalClassName, + modalIsOpen, + openModal, +}: PropsWithChildren) => ( + <> + + + {children} + + +); diff --git a/src/components/Poll/PollHeader.tsx b/src/components/Poll/PollHeader.tsx new file mode 100644 index 0000000000..fecb9eb090 --- /dev/null +++ b/src/components/Poll/PollHeader.tsx @@ -0,0 +1,43 @@ +import React, { useMemo } from 'react'; +import { usePollState } from './hooks'; +import { useTranslationContext } from '../../context'; +import type { PollState } from 'stream-chat'; +import type { DefaultStreamChatGenerics } from '../../types'; + +type PollStateSelectorReturnValue = [boolean, boolean | undefined, number, string]; +const pollStateSelector = < + StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics +>( + nextValue: PollState, +): PollStateSelectorReturnValue => [ + nextValue.enforce_unique_vote, + nextValue.is_closed, + nextValue.max_votes_allowed, + nextValue.name, +]; + +export const PollHeader = < + StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics +>() => { + const { t } = useTranslationContext('PollHeader'); + const [enforce_unique_vote, is_closed, max_votes_allowed, name] = usePollState< + PollStateSelectorReturnValue, + StreamChatGenerics + >(pollStateSelector); + + const selectionInstructions = useMemo(() => { + if (is_closed) return t('Vote ended'); + if (enforce_unique_vote) return t('Select one'); + if (max_votes_allowed) return t('Select up to {{count}}', { count: max_votes_allowed }); + return t('Select one or more'); + }, [is_closed, enforce_unique_vote, max_votes_allowed, t]); + + if (!name) return; + + return ( +
+
{name}
+
{selectionInstructions}
+
+ ); +}; diff --git a/src/components/Poll/PollOptionList.tsx b/src/components/Poll/PollOptionList.tsx new file mode 100644 index 0000000000..3a38253f70 --- /dev/null +++ b/src/components/Poll/PollOptionList.tsx @@ -0,0 +1,41 @@ +import clsx from 'clsx'; +import React from 'react'; +import { PollOptionSelector } from './PollOptionSelector'; +import { usePollState } from './hooks'; +import type { PollOption, PollState } from 'stream-chat'; +import type { DefaultStreamChatGenerics } from '../../types'; + +type PollStateSelectorReturnValue< + StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics +> = [PollOption[]]; +const pollStateSelector = < + StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics +>( + nextValue: PollState, +): PollStateSelectorReturnValue => [nextValue.options]; + +export type PollOptionListProps = { + optionsDisplayCount?: number; +}; + +export const PollOptionList = < + StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics +>({ + optionsDisplayCount, +}: PollOptionListProps) => { + const [options] = usePollState( + pollStateSelector, + ); + + return ( +
+ {options.slice(0, optionsDisplayCount ?? options.length).map((option) => ( + + ))} +
+ ); +}; diff --git a/src/components/Poll/PollOptionSelector.tsx b/src/components/Poll/PollOptionSelector.tsx new file mode 100644 index 0000000000..0ace60141f --- /dev/null +++ b/src/components/Poll/PollOptionSelector.tsx @@ -0,0 +1,135 @@ +import clsx from 'clsx'; +import React from 'react'; +import { isVoteAnswer } from 'stream-chat'; +import { usePoll, usePollState } from './hooks'; +import { Avatar } from '../Avatar'; +import { useChannelStateContext, useMessageContext, useTranslationContext } from '../../context'; +import type { PollOption, PollState, PollVote } from 'stream-chat'; +import type { DefaultStreamChatGenerics } from '../../types'; + +type AmountBarProps = { + amount: number; + className?: string; +}; + +export const AmountBar = ({ amount, className }: AmountBarProps) => ( +
+); + +export type CheckmarkProps = { checked?: boolean }; + +export const Checkmark = ({ checked }: CheckmarkProps) => ( +
+); + +type PollStateSelectorReturnValue< + StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics +> = [ + boolean | undefined, + Record[]>, + string[], + Record, + number, + Record, +]; +const pollStateSelector = < + StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics +>( + nextValue: PollState, +): PollStateSelectorReturnValue => [ + nextValue.is_closed, + nextValue.latest_votes_by_option, + nextValue.maxVotedOptionIds, + nextValue.ownVotesByOptionId, + nextValue.vote_count, + nextValue.vote_counts_by_option, +]; + +export type PollOptionSelectorProps< + StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics +> = { + option: PollOption; + avatarCount?: number; + voteCountVerbose?: boolean; +}; + +export const PollOptionSelector = < + StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics +>({ + avatarCount, + option, + voteCountVerbose, +}: PollOptionSelectorProps) => { + const { t } = useTranslationContext(); + const { channelCapabilities = {} } = useChannelStateContext( + 'PollOptionsShortlist', + ); + const { message } = useMessageContext(); + const [ + is_closed, + latest_votes_by_option, + maxVotedOptionIds, + ownVotesByOptionId, + vote_count, + vote_counts_by_option, + ] = usePollState(pollStateSelector); + const poll = usePoll(); + const canCastVote = channelCapabilities['cast-poll-vote'] && !is_closed; + + return ( +
{ + if (!canCastVote) return; + const haveVotedForTheOption = !!ownVotesByOptionId[option.id]; + return haveVotedForTheOption + ? poll.removeVote(ownVotesByOptionId[option.id], message.id) + : poll.castVote(option.id, message.id); + }} + > + {!is_closed && } +
+

{option.text}

+ {avatarCount && ( +
+ {latest_votes_by_option?.[option.id] && + (latest_votes_by_option[option.id] as PollVote[]) + .filter((vote) => !!vote.user && !isVoteAnswer(vote)) + .slice(0, avatarCount) // todo: check how many avatars should be shown + .map(({ user }) => ( + + ))} +
+ )} +
+ {voteCountVerbose + ? t('{{count}} votes', { count: vote_counts_by_option[option.id] ?? 0 }) + : vote_counts_by_option[option.id] ?? 0} +
+
+ +
+ ); +}; diff --git a/src/components/Poll/PollVote.tsx b/src/components/Poll/PollVote.tsx new file mode 100644 index 0000000000..9ce81ca345 --- /dev/null +++ b/src/components/Poll/PollVote.tsx @@ -0,0 +1,110 @@ +import React, { useState } from 'react'; +import { Avatar } from '../Avatar'; +import { useChatContext, useTranslationContext } from '../../context'; + +import type { DefaultStreamChatGenerics } from '../../types'; +import type { PollVote as PollVoteType } from 'stream-chat'; +import { useEnterLeaveHandlers } from '../Tooltip/hooks'; +import { PopperTooltip } from '../Tooltip'; + +const PollVoteTimestamp = ({ timestamp }: { timestamp: string }) => { + const { t } = useTranslationContext(); + const { handleEnter, handleLeave, tooltipVisible } = useEnterLeaveHandlers(); + const [referenceElement, setReferenceElement] = useState(null); + const timestampDate = new Date(timestamp); + return ( +
+ {t('timestamp/PollVote', { timestamp: timestampDate })} + + {t('timestamp/PollVoteTooltip', { timestamp: timestampDate })} + +
+ ); +}; + +type PollVoteProps< + StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics +> = { + vote: PollVoteType; +}; + +const PollVoteAuthor = < + StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics +>({ + vote, +}: PollVoteProps) => { + const { t } = useTranslationContext(); + const { client } = useChatContext(); + const { handleEnter, handleLeave, tooltipVisible } = useEnterLeaveHandlers(); + const [referenceElement, setReferenceElement] = useState(null); + const displayName = + client.user?.id && client.user.id === vote.user?.id + ? t('You') + : vote.user?.name || t('Anonymous'); + + return ( +
+ {vote.user && ( + + )} +
{displayName}
+ + {displayName} + +
+ ); +}; + +export const PollVote = < + StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics +>({ + vote, +}: PollVoteProps) => ( +
+ + +
+); + +export type PollVoteListingProps< + StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics +> = { + votes: PollVoteType[]; +}; + +export const PollVoteListing = < + StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics +>({ + votes, +}: PollVoteListingProps) => ( +
+ {votes.map((vote) => ( + + ))} +
+); diff --git a/src/components/Poll/config.ts b/src/components/Poll/config.ts new file mode 100644 index 0000000000..72704a356b --- /dev/null +++ b/src/components/Poll/config.ts @@ -0,0 +1 @@ +export const MAX_OPTIONS_DISPLAYED = 10 as const; diff --git a/src/components/Poll/constants.ts b/src/components/Poll/constants.ts new file mode 100644 index 0000000000..885f6f5e05 --- /dev/null +++ b/src/components/Poll/constants.ts @@ -0,0 +1 @@ +export const MAX_POLL_OPTIONS = 100 as const; diff --git a/src/components/Poll/hooks/index.ts b/src/components/Poll/hooks/index.ts new file mode 100644 index 0000000000..c64540f67c --- /dev/null +++ b/src/components/Poll/hooks/index.ts @@ -0,0 +1,4 @@ +export * from './usePoll'; +export * from './usePollState'; +export * from './usePollAnswersPagination'; +export * from './usePollOptionVotesPagination'; diff --git a/src/components/Poll/hooks/usePoll.ts b/src/components/Poll/hooks/usePoll.ts new file mode 100644 index 0000000000..71f615988a --- /dev/null +++ b/src/components/Poll/hooks/usePoll.ts @@ -0,0 +1,9 @@ +import { usePollContext } from '../../../context'; +import type { DefaultStreamChatGenerics } from '../../../types'; + +export const usePoll = < + StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics +>() => { + const { poll } = usePollContext(); + return poll; +}; diff --git a/src/components/Poll/hooks/usePollAnswersPagination.ts b/src/components/Poll/hooks/usePollAnswersPagination.ts new file mode 100644 index 0000000000..fc98dad99d --- /dev/null +++ b/src/components/Poll/hooks/usePollAnswersPagination.ts @@ -0,0 +1,44 @@ +import { useCallback } from 'react'; +import { + PaginationFn, + useCursorPaginator, +} from '../../InfiniteScrollPaginator/hooks/useCursorPaginator'; +import { usePollContext } from '../../../context'; + +import type { DefaultStreamChatGenerics } from '../../../types'; +import type { PollAnswer, PollAnswersQueryParams } from 'stream-chat'; + +type UsePollAnswersPaginationParams = { + paginationParams?: PollAnswersQueryParams; +}; + +export const usePollAnswersPagination = < + StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics +>({ paginationParams }: UsePollAnswersPaginationParams = {}) => { + const { poll } = usePollContext('usePollAnswersPagination'); + + const paginationFn = useCallback>( + async (next) => { + const { next: newNext, votes } = await poll.queryAnswers({ + filter: paginationParams?.filter, + options: !next ? paginationParams?.options : { ...paginationParams?.options, next }, + sort: { created_at: -1, ...paginationParams?.sort }, + }); + return { items: votes, next: newNext }; + }, + [paginationParams, poll], + ); + + const { error, hasNextPage, items: pollAnswers, loading, loadMore } = useCursorPaginator( + paginationFn, + true, + ); + + return { + error, + hasNextPage, + loading, + loadMore, + pollAnswers, + }; +}; diff --git a/src/components/Poll/hooks/usePollOptionVotesPagination.ts b/src/components/Poll/hooks/usePollOptionVotesPagination.ts new file mode 100644 index 0000000000..a68ed45572 --- /dev/null +++ b/src/components/Poll/hooks/usePollOptionVotesPagination.ts @@ -0,0 +1,47 @@ +import { useCallback } from 'react'; +import { usePoll } from './usePoll'; +import { + PaginationFn, + useCursorPaginator, +} from '../../InfiniteScrollPaginator/hooks/useCursorPaginator'; + +import type { DefaultStreamChatGenerics } from '../../../types'; +import type { PollOptionVotesQueryParams, PollVote } from 'stream-chat'; + +type UsePollOptionVotesPaginationParams = { + paginationParams: PollOptionVotesQueryParams; +}; + +export const usePollOptionVotesPagination = < + StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics +>({ + paginationParams, +}: UsePollOptionVotesPaginationParams) => { + const poll = usePoll(); + + const paginationFn = useCallback>>( + async (next) => { + const { next: newNext, votes } = await poll.queryOptionVotes({ + filter: paginationParams.filter, + options: !next ? paginationParams?.options : { ...paginationParams?.options, next }, + sort: { created_at: -1, ...paginationParams?.sort }, + }); + return { items: votes, next: newNext }; + }, + [paginationParams, poll], + ); + + const { error, hasNextPage, items: votes, loading, loadMore, next } = useCursorPaginator( + paginationFn, + true, + ); + + return { + error, + hasNextPage, + loading, + loadMore, + next, + votes, + }; +}; diff --git a/src/components/Poll/hooks/usePollState.ts b/src/components/Poll/hooks/usePollState.ts new file mode 100644 index 0000000000..e699ecee94 --- /dev/null +++ b/src/components/Poll/hooks/usePollState.ts @@ -0,0 +1,14 @@ +import { usePollContext } from '../../../context'; +import type { DefaultStreamChatGenerics } from '../../../types'; +import { useStateStore } from '../../../store'; +import { PollState } from 'stream-chat'; + +export const usePollState = < + T extends readonly unknown[], + StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics +>( + selector: (nextValue: PollState) => T, +) => { + const { poll } = usePollContext('usePollState'); + return useStateStore(poll.state, selector); +}; diff --git a/src/components/Poll/icons.tsx b/src/components/Poll/icons.tsx new file mode 100644 index 0000000000..40eba0d04a --- /dev/null +++ b/src/components/Poll/icons.tsx @@ -0,0 +1,5 @@ +import React from 'react'; + +export const WinningOptionIcon = () => ( +
+); diff --git a/src/components/Poll/identity.ts b/src/components/Poll/identity.ts new file mode 100644 index 0000000000..d42efdef79 --- /dev/null +++ b/src/components/Poll/identity.ts @@ -0,0 +1,9 @@ +import type { PollAnswer, PollVote } from 'stream-chat'; +import type { DefaultStreamChatGenerics } from '../../types'; + +export const isPollAnswer = < + StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics +>( + value: PollAnswer | PollVote, +): value is PollAnswer => + !!(value as PollAnswer)?.answer_text; diff --git a/src/components/Poll/index.ts b/src/components/Poll/index.ts new file mode 100644 index 0000000000..465071b835 --- /dev/null +++ b/src/components/Poll/index.ts @@ -0,0 +1 @@ +export { Poll } from './Poll'; diff --git a/src/components/Poll/modals/ModalHeader.tsx b/src/components/Poll/modals/ModalHeader.tsx new file mode 100644 index 0000000000..4bfbb9352b --- /dev/null +++ b/src/components/Poll/modals/ModalHeader.tsx @@ -0,0 +1,17 @@ +import React from 'react'; +import clsx from 'clsx'; + +export type ModalHeaderProps = { + title: string; + className?: string; + close?: () => void; + goBack?: () => void; +}; + +export const ModalHeader = ({ className, close, goBack, title }: ModalHeaderProps) => ( +
+ {goBack &&
+); diff --git a/src/components/Poll/modals/PollAnswersList.tsx b/src/components/Poll/modals/PollAnswersList.tsx new file mode 100644 index 0000000000..2d82830fab --- /dev/null +++ b/src/components/Poll/modals/PollAnswersList.tsx @@ -0,0 +1,42 @@ +import React from 'react'; +import { ModalHeader } from './ModalHeader'; +import { PollVote } from '../PollVote'; +import { usePollAnswersPagination } from '../hooks'; +import { InfiniteScrollPaginator } from '../../InfiniteScrollPaginator/InfiniteScrollPaginator'; +import { LoadingIndicator } from '../../Loading'; +import { useTranslationContext } from '../../../context'; + +export type PollAnswersListProps = { + close?: () => void; +}; + +export const PollAnswersList = ({ close }: PollAnswersListProps) => { + const { t } = useTranslationContext(); + const { error, hasNextPage, loading, loadMore, pollAnswers } = usePollAnswersPagination(); + + return ( +
+ ('Poll comments')} /> +
+ +
+ {pollAnswers.map((answer) => ( +
+ {answer.answer_text && ( +

{answer.answer_text}

+ )} + +
+ ))} +
+ {hasNextPage && ( +
+ {loading && } +
+ )} +
+ {error?.message &&
{error?.message}
} +
+
+ ); +}; diff --git a/src/components/Poll/modals/PollOptionsFullList.tsx b/src/components/Poll/modals/PollOptionsFullList.tsx new file mode 100644 index 0000000000..5c7709627d --- /dev/null +++ b/src/components/Poll/modals/PollOptionsFullList.tsx @@ -0,0 +1,38 @@ +import React from 'react'; +import { ModalHeader } from './ModalHeader'; +import { usePollState } from '../hooks'; +import { PollOptionList } from '../PollOptionList'; +import { useTranslationContext } from '../../../context'; + +import type { PollState } from 'stream-chat'; +import type { DefaultStreamChatGenerics } from '../../../types'; + +type PollStateSelectorReturnValue = [string]; +const pollStateSelector = < + StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics +>( + nextValue: PollState, +): PollStateSelectorReturnValue => [nextValue.name]; + +export type FullPollOptionsListingProps = { + close?: () => void; +}; + +export const PollOptionsFullList = < + StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics +>({ + close, +}: FullPollOptionsListingProps) => { + const { t } = useTranslationContext(); + const [name] = usePollState(pollStateSelector); + + return ( +
+ ('Poll options')} /> +
+
{name}
+ +
+
+ ); +}; diff --git a/src/components/Poll/modals/PollResults/PollOptionVotesList.tsx b/src/components/Poll/modals/PollResults/PollOptionVotesList.tsx new file mode 100644 index 0000000000..a34caf4135 --- /dev/null +++ b/src/components/Poll/modals/PollResults/PollOptionVotesList.tsx @@ -0,0 +1,54 @@ +import React, { useEffect, useMemo } from 'react'; +import { PollVoteListing } from '../../PollVote'; +import { usePollOptionVotesPagination } from '../../hooks'; +import { LoadingIndicator } from '../../../Loading'; +import { InfiniteScrollPaginator } from '../../../InfiniteScrollPaginator/InfiniteScrollPaginator'; +import { PollOptionWithVotesHeader } from './PollOptionWithVotesHeader'; +import type { PollOption, PollOptionVotesQueryParams } from 'stream-chat'; +import type { DefaultStreamChatGenerics } from '../../../../types'; + +export type PollOptionVotesListingProps< + StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics +> = { + option: PollOption; +}; + +export const PollOptionVotesList = < + StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics +>({ + option, +}: PollOptionVotesListingProps) => { + const paginationParams = useMemo( + () => ({ filter: { option_id: option.id } }), + [option.id], + ); + const { + error, + hasNextPage, + loading, + loadMore, + votes, + } = usePollOptionVotesPagination({ + paginationParams, + }); + + useEffect(() => { + if (votes.length) return; + loadMore(); + }, [loadMore, votes]); + + return ( +
+ + + + {hasNextPage && ( +
+ {loading && } +
+ )} +
+ {error && error.message} +
+ ); +}; diff --git a/src/components/Poll/modals/PollResults/PollOptionWithLatestVotes.tsx b/src/components/Poll/modals/PollResults/PollOptionWithLatestVotes.tsx new file mode 100644 index 0000000000..9650c0a0cb --- /dev/null +++ b/src/components/Poll/modals/PollResults/PollOptionWithLatestVotes.tsx @@ -0,0 +1,58 @@ +import React from 'react'; +import { PollVoteListing } from '../../PollVote'; +import { usePollState } from '../../hooks'; +import { useChannelStateContext, useTranslationContext } from '../../../../context'; +import type { PollOption, PollState, PollVote } from 'stream-chat'; +import type { DefaultStreamChatGenerics } from '../../../../types'; +import { PollOptionWithVotesHeader } from './PollOptionWithVotesHeader'; + +type PollStateSelectorReturnValue< + StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics +> = [Record[]>, Record]; +const pollStateSelector = < + StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics +>( + nextValue: PollState, +): PollStateSelectorReturnValue => [ + nextValue.latest_votes_by_option, + nextValue.vote_counts_by_option, +]; + +export type PollOptionWithVotesProps< + StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics +> = { + option: PollOption; + countVotesPreview?: number; + showAllVotes?: () => void; +}; + +export const PollOptionWithLatestVotes = < + StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics +>({ + countVotesPreview = 5, + option, + showAllVotes, +}: PollOptionWithVotesProps) => { + const { t } = useTranslationContext(); + const { channelCapabilities = {} } = useChannelStateContext( + 'PollOptionWithLatestVotes', + ); + const [latest_votes_by_option] = usePollState( + pollStateSelector, + ); + const votes = latest_votes_by_option && latest_votes_by_option[option.id]; + + return ( +
+ + {votes && } + {channelCapabilities['query-poll-votes'] && + showAllVotes && + votes?.length > countVotesPreview && ( + + )} +
+ ); +}; diff --git a/src/components/Poll/modals/PollResults/PollOptionWithVotesHeader.tsx b/src/components/Poll/modals/PollResults/PollOptionWithVotesHeader.tsx new file mode 100644 index 0000000000..e33a997aff --- /dev/null +++ b/src/components/Poll/modals/PollResults/PollOptionWithVotesHeader.tsx @@ -0,0 +1,55 @@ +import React from 'react'; +import { usePollState } from '../../hooks'; +import { WinningOptionIcon } from '../../icons'; +import { useTranslationContext } from '../../../../context'; +import type { PollOption, PollState } from 'stream-chat'; +import type { DefaultStreamChatGenerics } from '../../../../types'; + +type PollStateSelectorReturnValue = [string[], Record]; +const pollStateSelector = < + StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics +>( + nextValue: PollState, +): PollStateSelectorReturnValue => [nextValue.maxVotedOptionIds, nextValue.vote_counts_by_option]; + +export type PollResultOptionVoteCounterProps = { + optionId: string; +}; + +export const PollResultOptionVoteCounter = < + StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics +>({ + optionId, +}: PollResultOptionVoteCounterProps) => { + const { t } = useTranslationContext(); + const [maxVotedOptionIds, vote_counts_by_option] = usePollState< + PollStateSelectorReturnValue, + StreamChatGenerics + >(pollStateSelector); + + return ( +
+ {maxVotedOptionIds.length === 1 && maxVotedOptionIds[0] === optionId && } + + {t('{{count}} votes', { count: vote_counts_by_option[optionId] ?? 0 })} + +
+ ); +}; + +export type PollOptionWithVotesHeaderProps< + StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics +> = { + option: PollOption; +}; + +export const PollOptionWithVotesHeader = < + StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics +>({ + option, +}: PollOptionWithVotesHeaderProps) => ( +
+
{option.text}
+ +
+); diff --git a/src/components/Poll/modals/PollResults/PollResults.tsx b/src/components/Poll/modals/PollResults/PollResults.tsx new file mode 100644 index 0000000000..1bc5fb504c --- /dev/null +++ b/src/components/Poll/modals/PollResults/PollResults.tsx @@ -0,0 +1,71 @@ +import clsx from 'clsx'; +import React, { useCallback, useState } from 'react'; +import { ModalHeader } from '../ModalHeader'; +import { PollOptionVotesList } from './PollOptionVotesList'; +import { PollOptionWithLatestVotes } from './PollOptionWithLatestVotes'; +import { usePollState } from '../../hooks'; +import { useTranslationContext } from '../../../../context'; +import type { PollOption, PollState } from 'stream-chat'; +import type { DefaultStreamChatGenerics } from '../../../../types'; + +type PollStateSelectorReturnValue< + StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics +> = [string, PollOption[]]; +const pollStateSelector = < + StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics +>( + nextValue: PollState, +): PollStateSelectorReturnValue => [nextValue.name, nextValue.options]; + +export type PollResultsProps = { + close?: () => void; +}; + +export const PollResults = < + StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics +>({ + close, +}: PollResultsProps) => { + const { t } = useTranslationContext(); + const [name, options] = usePollState< + PollStateSelectorReturnValue, + StreamChatGenerics + >(pollStateSelector); + const [optionToView, setOptionToView] = useState>(); + + const goBack = useCallback(() => setOptionToView(undefined), []); + + return ( +
+ {optionToView ? ( + <> + +
+ +
+ + ) : ( + <> + ('Poll results')} /> +
+
{name}
+ {options.map((option) => ( + setOptionToView(option)} + /> + ))} +
+ + )} +
+ ); +}; diff --git a/src/context/PollContext.tsx b/src/context/PollContext.tsx new file mode 100644 index 0000000000..762676ee29 --- /dev/null +++ b/src/context/PollContext.tsx @@ -0,0 +1,52 @@ +import React, { PropsWithChildren, useContext, useEffect, useMemo } from 'react'; +import { Poll } from 'stream-chat'; +import { useChatContext } from './ChatContext'; + +import type { PollResponse } from 'stream-chat'; +import type { DefaultStreamChatGenerics } from '../types/types'; + +export type PollContextValue< + StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics +> = { + poll: Poll; +}; + +export const PollContext = React.createContext(undefined); + +export const PollProvider = < + StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics +>({ + children, + poll: pollData, +}: PropsWithChildren<{ + poll: PollResponse; +}>) => { + const { client } = useChatContext(); + + const poll = useMemo(() => new Poll({ client, poll: pollData }), [client, pollData]); + + useEffect(() => { + poll.registerSubscriptions(); + return poll.unregisterSubscriptions; + }, [poll]); + + return {children}; +}; + +export const usePollContext = < + StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics +>( + componentName?: string, +) => { + const contextValue = useContext(PollContext); + + if (!contextValue) { + console.warn( + `The usePollContext hook was called outside of the PollContext provider. Make sure this hook is called within a child of the Channel component. The errored call is located in the ${componentName} component.`, + ); + + return {} as PollContextValue; + } + + return (contextValue as unknown) as PollContextValue; +}; diff --git a/src/context/index.ts b/src/context/index.ts index 15e3f422be..d42a0569a6 100644 --- a/src/context/index.ts +++ b/src/context/index.ts @@ -8,6 +8,7 @@ export * from './MessageContext'; export * from './MessageBounceContext'; export * from './MessageInputContext'; export * from './MessageListContext'; +export * from './PollContext'; export * from './TranslationContext'; export * from './TypingContext'; export * from './WithComponents'; diff --git a/src/i18n/de.json b/src/i18n/de.json index 49453e1759..0d00d51392 100644 --- a/src/i18n/de.json +++ b/src/i18n/de.json @@ -1,8 +1,10 @@ { + "Add a comment": "Einen Kommentar hinzufügen", "Allow access to camera": "Zugriff auf Kamera erlauben", "Allow access to microphone": "Zugriff auf Mikrofon erlauben", "An error has occurred during recording": "Ein Fehler ist während der Aufnahme aufgetreten", "An error has occurred during the recording processing": "Ein Fehler ist während der Aufnahmeverarbeitung aufgetreten", + "Anonymous": "Anonym", "Attach files": "Dateien anhängen", "Cancel": "Stornieren", "Cannot seek in the recording": "In der Aufnahme es kann nicht gesucht werden", @@ -21,8 +23,10 @@ "Edited": "Bearbeitet", "Emoji matching": "Emoji passend", "Empty message...": "Leere Nachricht...", + "End": "Beenden", + "End vote": "Abstimmung beenden", "Error adding flag": "Fehler beim Hinzufügen des Flags", - "Error connecting to chat, refresh the page to try again.": "Verbindungsfehler zum Chat, Aktualisiere die Seite um es erneut zu versuchen.", + "Error connecting to chat, refresh the page to try again.": "Verbindungsfehler zum Chat, aktualisiere die Seite, um es erneut zu versuchen.", "Error deleting message": "Fehler beim Löschen der Nachricht", "Error fetching reactions": "Fehler beim Laden von Reaktionen", "Error marking message unread. Cannot mark unread messages older than the newest 100 channel messages.": "Fehler beim Markieren der Nachricht als ungelesen. Kann keine älteren ungelesenen Nachrichten markieren als die neuesten 100 Kanalnachrichten.", @@ -35,7 +39,7 @@ "Error uploading attachment": "Fehler beim Hochladen des Anhangs", "Error uploading file": "Fehler beim Hochladen der Datei", "Error uploading image": "Hochladen des Bildes fehlgeschlagen", - "Error · Unsent": "Fehler nicht gesendet", + "Error · Unsent": "Fehler · Nicht gesendet", "Error: {{ errorMessage }}": "Fehler: {{ errorMessage }}", "Failed to jump to the first unread message": "Fehler beim Springen zur ersten ungelesenen Nachricht", "Failed to mark channel as read": "Fehler beim Markieren des Kanals als gelesen", @@ -57,25 +61,37 @@ "New": "Neu", "New Messages!": "Neue Nachrichten!", "No chats here yet…": "Noch keine Chats hier...", - "No results found": "keine Ergebnisse gefunden", + "No results found": "Keine Ergebnisse gefunden", + "Nobody will be able to vote in this poll anymore.": "Niemand kann mehr in dieser Umfrage abstimmen.", "Nothing yet...": "Noch nichts...", "Ok": "Ok", "Open emoji picker": "Emoji-Picker öffnen", "People matching": "Passende Personen", "Pin": "Pin", "Pinned by": "Gepinnt von", + "Poll comments": "Umfragekommentare", + "Poll options": "Umfrageoptionen", + "Poll results": "Umfrageergebnisse", "Recording format is not supported and cannot be reproduced": "Aufnahmeformat wird nicht unterstützt und kann nicht wiedergegeben werden", "Reply": "Antworten", "Reply to Message": "Auf Nachricht antworten", "Search": "Suche", "Searching...": "Suchen...", + "See all options ({{count}})_one": "Alle Optionen anzeigen ({{count}})", + "See all options ({{count}})_other": "Alle Optionen anzeigen ({{count}})", + "Select one": "Eine auswählen", + "Select one or more": "Eine oder mehrere auswählen", + "Select up to {{count}}_one": "Bis zu {{count}} auswählen", + "Select up to {{count}}_other": "Bis zu {{count}} auswählen", "Send": "Senden", "Send Anyway": "Trotzdem senden", "Send message request failed": "Senden der Nachrichtenanfrage fehlgeschlagen", "Sending...": "Senden...", + "Show all": "Alle anzeigen", "Shuffle": "Mischen", "Slow Mode ON": "Slow-Mode EIN", "Some of the files will not be accepted": "Einige der Dateien werden nicht akzeptiert", + "Suggest an option": "Option vorschlagen", "This message did not meet our content guidelines": "Diese Nachricht entsprach nicht unseren Inhaltsrichtlinien", "This message was deleted...": "Diese Nachricht wurde gelöscht...", "Thread": "Thread", @@ -86,11 +102,17 @@ "Unpin": "Pin entfernen", "Unread messages": "Ungelesene Nachrichten", "Unsupported attachment": "Nicht unterstützter Anhang", + "Update your comment": "Ihren Kommentar aktualisieren", "Upload type: \"{{ type }}\" is not allowed": "Upload-Typ: \"{{ type }}\" ist nicht erlaubt", - "User uploaded content": "Benutzer hochgeladenen Inhalts", + "User uploaded content": "Vom Benutzer hochgeladener Inhalt", + "View results": "Ergebnisse anzeigen", + "View {{count}} comments_one": "{{count}} Kommentar anzeigen", + "View {{count}} comments_other": "{{count}} Kommentare anzeigen", "Voice message": "Sprachnachricht", + "Vote ended": "Abstimmung beendet", "Wait until all attachments have uploaded": "Bitte warten, bis alle Anhänge hochgeladen wurden", - "You have no channels currently": "Du hast momentan noch keinen Channels", + "You": "Du", + "You have no channels currently": "Du hast momentan noch keine Channels", "You've reached the maximum number of files": "Die maximale Dateianzahl ist erreicht", "aria/Attachment": "Anhang", "aria/Cancel Reply": "Antwort abbrechen", @@ -127,6 +149,8 @@ "this content could not be displayed": "Dieser Inhalt konnte nicht angezeigt werden", "timestamp/DateSeparator": "{{ timestamp | timestampFormatter(calendar: true) }}", "timestamp/MessageTimestamp": "{{ timestamp | timestampFormatter(calendar: true) }}", + "timestamp/PollVote": "{{ timestamp | timestampFormatter(format: MMM D [at] HH:mm) }}", + "timestamp/PollVoteTooltip": "{{ timestamp | timestampFormatter(calendar: true) }}", "timestamp/SystemMessage": "{{ timestamp | timestampFormatter(format: dddd L) }}", "unban-command-args": "[@Benutzername]", "unban-command-description": "Einen Benutzer entbannen", @@ -134,7 +158,7 @@ "unmute-command-description": "Stummschaltung eines Benutzers aufheben", "unreadMessagesSeparatorText_one": "1 ungelesene Nachricht", "unreadMessagesSeparatorText_other": "{{count}} ungelesene Nachrichten", - "{{ commaSeparatedUsers }} and {{ moreCount }} more": "{{ commaSeparatedUsers }} und {{moreCount}} Mehr", + "{{ commaSeparatedUsers }} and {{ moreCount }} more": "{{ commaSeparatedUsers }} und {{moreCount}} mehr", "{{ commaSeparatedUsers }}, and {{ lastUser }}": "{{ commaSeparatedUsers }} und {{ lastUser }}", "{{ firstUser }} and {{ secondUser }}": "{{ firstUser }} und {{ secondUser }}", "{{ imageCount }} more": "{{ imageCount }} mehr", @@ -147,5 +171,7 @@ "{{ watcherCount }} online": "{{ watcherCount }} online", "{{count}} unread_one": "{{count}} ungelesen", "{{count}} unread_other": "{{count}} ungelesen", + "{{count}} votes_one": "{{count}} Stimme", + "{{count}} votes_other": "{{count}} Stimmen", "🏙 Attachment...": "🏙 Anhang..." } diff --git a/src/i18n/en.json b/src/i18n/en.json index 9266b8b70b..fef6f45972 100644 --- a/src/i18n/en.json +++ b/src/i18n/en.json @@ -1,8 +1,10 @@ { + "Add a comment": "Add a comment", "Allow access to camera": "Allow access to camera", "Allow access to microphone": "Allow access to microphone", "An error has occurred during recording": "An error has occurred during recording", "An error has occurred during the recording processing": "An error has occurred during the recording processing", + "Anonymous": "Anonymous", "Attach files": "Attach files", "Cancel": "Cancel", "Cannot seek in the recording": "Cannot seek in the recording", @@ -21,6 +23,8 @@ "Edited": "Edited", "Emoji matching": "Emoji matching", "Empty message...": "Empty message...", + "End": "End", + "End vote": "End vote", "Error adding flag": "Error adding flag", "Error connecting to chat, refresh the page to try again.": "Error connecting to chat, refresh the page to try again.", "Error deleting message": "Error deleting message", @@ -58,24 +62,36 @@ "New Messages!": "New Messages!", "No chats here yet…": "No chats here yet…", "No results found": "No results found", + "Nobody will be able to vote in this poll anymore.": "Nobody will be able to vote in this poll anymore.", "Nothing yet...": "Nothing yet...", "Ok": "Ok", "Open emoji picker": "Open emoji picker", "People matching": "People matching", "Pin": "Pin", "Pinned by": "Pinned by", + "Poll comments": "Poll comments", + "Poll options": "Poll options", + "Poll results": "Poll results", "Recording format is not supported and cannot be reproduced": "Recording format is not supported and cannot be reproduced", "Reply": "Reply", "Reply to Message": "Reply to Message", "Search": "Search", "Searching...": "Searching...", + "See all options ({{count}})_one": "See all options ({{count}})", + "See all options ({{count}})_other": "See all options ({{count}})", + "Select one": "Select one", + "Select one or more": "Select one or more", + "Select up to {{count}}_one": "Select up to {{count}}", + "Select up to {{count}}_other": "Select up to {{count}}", "Send": "Send", "Send Anyway": "Send Anyway", "Send message request failed": "Send message request failed", "Sending...": "Sending...", + "Show all": "Show all", "Shuffle": "Shuffle", "Slow Mode ON": "Slow Mode ON", "Some of the files will not be accepted": "Some of the files will not be accepted", + "Suggest an option": "Suggest an option", "This message did not meet our content guidelines": "This message did not meet our content guidelines", "This message was deleted...": "This message was deleted...", "Thread": "Thread", @@ -86,10 +102,16 @@ "Unpin": "Unpin", "Unread messages": "Unread messages", "Unsupported attachment": "Unsupported attachment", + "Update your comment": "Update your comment", "Upload type: \"{{ type }}\" is not allowed": "Upload type: \"{{ type }}\" is not allowed", "User uploaded content": "User uploaded content", + "View results": "View results", + "View {{count}} comments_one": "View {{count}} comments", + "View {{count}} comments_other": "View {{count}} comments", "Voice message": "Voice message", + "Vote ended": "Vote ended", "Wait until all attachments have uploaded": "Wait until all attachments have uploaded", + "You": "You", "You have no channels currently": "You have no channels currently", "You've reached the maximum number of files": "You've reached the maximum number of files", "aria/Attachment": "Attachment", @@ -121,6 +143,8 @@ "this content could not be displayed": "this content could not be displayed", "timestamp/DateSeparator": "{{ timestamp | timestampFormatter(calendar: true) }}", "timestamp/MessageTimestamp": "{{ timestamp | timestampFormatter(calendar: true) }}", + "timestamp/PollVote": "{{ timestamp | timestampFormatter(format: MMM D [at] HH:mm) }}", + "timestamp/PollVoteTooltip": "{{ timestamp | timestampFormatter(calendar: true) }}", "timestamp/SystemMessage": "{{ timestamp | timestampFormatter(format: dddd L) }}", "unreadMessagesSeparatorText_one": "1 unread message", "unreadMessagesSeparatorText_other": "{{count}} unread messages", @@ -137,5 +161,7 @@ "{{ watcherCount }} online": "{{ watcherCount }} online", "{{count}} unread_one": "{{count}} unread", "{{count}} unread_other": "{{count}} unread", + "{{count}} votes_one": "{{count}} votes", + "{{count}} votes_other": "{{count}} votes", "🏙 Attachment...": "🏙 Attachment..." } diff --git a/src/i18n/es.json b/src/i18n/es.json index 12ff22adee..da36220333 100644 --- a/src/i18n/es.json +++ b/src/i18n/es.json @@ -1,16 +1,18 @@ { + "Add a comment": "Agregar un comentario", "Allow access to camera": "Permitir acceso a la cámara", "Allow access to microphone": "Permitir acceso al micrófono", "An error has occurred during recording": "Se ha producido un error durante la grabación", "An error has occurred during the recording processing": "Se ha producido un error durante el procesamiento de la grabación", + "Anonymous": "Anónimo", "Attach files": "Adjuntar archivos", "Cancel": "Cancelar", "Cannot seek in the recording": "No se puede buscar en la grabación", "Channel Missing": "Falta canal", - "Close": "Cerca", + "Close": "Cerrar", "Close emoji picker": "Cerrar el selector de emojis", "Commands matching": "Coincidencia de comandos", - "Connection failure, reconnecting now...": "Fallo de conexión, reconectando ahora ...", + "Connection failure, reconnecting now...": "Fallo de conexión, reconectando ahora...", "Delete": "Borrar", "Delivered": "Entregado", "Download attachment {{ name }}": "Descargar adjunto {{ name }}", @@ -20,21 +22,23 @@ "Edit message request failed": "Error al editar la solicitud de mensaje", "Edited": "Editado", "Emoji matching": "Coincidencia de emoji", - "Empty message...": "Mensaje vacío ...", + "Empty message...": "Mensaje vacío...", + "End": "Final", + "End vote": "Finalizar votación", "Error adding flag": "Error al agregar la bandera", "Error connecting to chat, refresh the page to try again.": "Error al conectarse al chat, actualice la página para volver a intentarlo.", "Error deleting message": "Error al eliminar el mensaje", "Error fetching reactions": "Error al cargar las reacciones", "Error marking message unread. Cannot mark unread messages older than the newest 100 channel messages.": "Error al marcar el mensaje como no leído. No se pueden marcar mensajes no leídos más antiguos que los últimos 100 mensajes del canal.", - "Error muting a user ...": "Error al silenciar a un usuario ...", - "Error pinning message": "Mensaje de error al fijar", + "Error muting a user ...": "Error al silenciar el usuario...", + "Error pinning message": "Error al fijar el mensaje", "Error removing message pin": "Error al quitar el pin del mensaje", "Error reproducing the recording": "Error al reproducir la grabación", "Error starting recording": "Error al iniciar la grabación", - "Error unmuting a user ...": "Error al activar el silencio de un usuario ...", + "Error unmuting a user ...": "Error al desactivar el silencio del usuario...", "Error uploading attachment": "Error al subir el archivo adjunto", "Error uploading file": "Error al cargar el archivo", - "Error uploading image": "Error subiendo imagen", + "Error uploading image": "Error al subir la imagen", "Error · Unsent": "Error · No enviado", "Error: {{ errorMessage }}": "Error: {{ errorMessage }}", "Failed to jump to the first unread message": "Error al saltar al primer mensaje no leído", @@ -48,48 +52,69 @@ "Menu": "Menú", "Message Failed · Click to try again": "Mensaje fallido · Haga clic para volver a intentarlo", "Message Failed · Unauthorized": "Mensaje fallido · No autorizado", - "Message deleted": "Mensaje borrado", + "Message deleted": "Mensaje eliminado", "Message has been successfully flagged": "El mensaje se marcó correctamente", "Message pinned": "Mensaje fijado", "Messages have been marked unread.": "Los mensajes han sido marcados como no leídos.", - "Missing permissions to upload the attachment": "Permisos faltantes para subir el archivo adjunto", - "Mute": "Mudo", + "Missing permissions to upload the attachment": "Faltan permisos para subir el archivo adjunto", + "Mute": "Silenciar", "New": "Nuevo", "New Messages!": "¡Nuevos mensajes!", "No chats here yet…": "Aún no hay mensajes aquí...", "No results found": "No se han encontrado resultados", + "Nobody will be able to vote in this poll anymore.": "Nadie podrá votar en esta encuesta.", "Nothing yet...": "Nada aún...", "Ok": "Ok", - "Open emoji picker": "Selector de emoji abierto", + "Open emoji picker": "Abrir el selector de emojis", "People matching": "Personas que coinciden", - "Pin": "Alfiler", + "Pin": "Fijar", "Pinned by": "Fijado por", + "Poll comments": "Comentarios de la encuesta", + "Poll options": "Opciones de la encuesta", + "Poll results": "Resultados de la encuesta", "Recording format is not supported and cannot be reproduced": "El formato de grabación no es compatible y no se puede reproducir", - "Reply": "Respuesta", + "Reply": "Responder", "Reply to Message": "Responder al mensaje", "Search": "Buscar", "Searching...": "Buscando...", + "See all options ({{count}})_many": "Ver todas las opciones ({{count}})", + "See all options ({{count}})_one": "Ver todas las opciones ({{count}})", + "See all options ({{count}})_other": "Ver todas las opciones ({{count}})", + "Select one": "Seleccionar uno", + "Select one or more": "Seleccionar uno o más", + "Select up to {{count}}_many": "Selecciona hasta {{count}}", + "Select up to {{count}}_one": "Selecciona hasta {{count}}", + "Select up to {{count}}_other": "Selecciona hasta {{count}}", "Send": "Enviar", "Send Anyway": "Enviar de todos modos", "Send message request failed": "Error al enviar la solicitud de mensaje", "Sending...": "Enviando...", + "Show all": "Mostrar todo", "Shuffle": "Mezclar", "Slow Mode ON": "Modo lento activado", - "Some of the files will not be accepted": "Algunos de los archivos no serán aceptados", - "This message did not meet our content guidelines": "Este mensaje no cumple nuestras directrices de contenido", - "This message was deleted...": "Este mensaje fue eliminado ...", + "Some of the files will not be accepted": "Algunos archivos no serán aceptados", + "Suggest an option": "Sugerir una opción", + "This message did not meet our content guidelines": "Este mensaje no cumple con nuestras directrices de contenido", + "This message was deleted...": "Este mensaje fue eliminado...", "Thread": "Hilo", "To start recording, allow the camera access in your browser": "Para comenzar a grabar, permita el acceso a la cámara en su navegador", "To start recording, allow the microphone access in your browser": "Para comenzar a grabar, permita el acceso al micrófono en su navegador", "Type your message": "Escribe tu mensaje", "Unmute": "Activar sonido", - "Unpin": "Desprender", + "Unpin": "Desfijar", "Unread messages": "Mensajes no leídos", "Unsupported attachment": "Adjunto no compatible", + "Update your comment": "Actualizar tu comentario", "Upload type: \"{{ type }}\" is not allowed": "Tipo de carga: \"{{ type }}\" no está permitido", "User uploaded content": "Contenido subido por el usuario", + "View results": "Ver resultados", + "View {{count}} comments_many": "Ver {{count}} comentarios", + "View {{count}} comments_one": "Ver {{count}} comentario", + "View {{count}} comments_other": "Ver {{count}} comentarios", "Voice message": "Mensaje de voz", + "Vote ended": "Votación finalizada", "Wait until all attachments have uploaded": "Espere hasta que se hayan cargado todos los archivos adjuntos", + "You": "Tú", "You have no channels currently": "Actualmente no tienes canales", "You've reached the maximum number of files": "Has alcanzado el número máximo de archivos", "aria/Attachment": "Adjunto", @@ -107,7 +132,7 @@ "aria/Menu": "Menú", "aria/Message Options": "Opciones de mensaje", "aria/Open Message Actions Menu": "Abrir menú de acciones de mensaje", - "aria/Open Reaction Selector": "Abrir selector de reacción", + "aria/Open Reaction Selector": "Abrir selector de reacciones", "aria/Open Thread": "Abrir hilo", "aria/Reaction list": "Lista de reacciones", "aria/Remove attachment": "Eliminar adjunto", @@ -117,7 +142,7 @@ "ban-command-description": "Prohibir a un usuario", "giphy-command-args": "[texto]", "giphy-command-description": "Publicar un gif aleatorio en el canal", - "live": "En Vivo", + "live": "En vivo", "mute-command-args": "[@usuario]", "mute-command-description": "Silenciar a un usuario", "replyCount_many": "{{ count }} respuestas", @@ -126,14 +151,16 @@ "searchResultsCount_many": "{{ count }} resultados", "searchResultsCount_one": "1 resultado", "searchResultsCount_other": "{{ count }} resultados", - "this content could not be displayed": "este contenido no se pudo mostrar", + "this content could not be displayed": "Este contenido no se pudo mostrar", "timestamp/DateSeparator": "{{ timestamp | timestampFormatter(calendar: true) }}", "timestamp/MessageTimestamp": "{{ timestamp | timestampFormatter(calendar: true) }}", + "timestamp/PollVote": "{{ timestamp | timestampFormatter(format: MMM D [at] HH:mm) }}", + "timestamp/PollVoteTooltip": "{{ timestamp | timestampFormatter(calendar: true) }}", "timestamp/SystemMessage": "{{ timestamp | timestampFormatter(format: dddd L) }}", "unban-command-args": "[@usuario]", "unban-command-description": "Quitar la prohibición a un usuario", "unmute-command-args": "[@usuario]", - "unmute-command-description": "Anular el silencio de un usuario", + "unmute-command-description": "Desactivar el silencio de un usuario", "unreadMessagesSeparatorText_many": "{{count}} mensajes no leídos", "unreadMessagesSeparatorText_one": "1 mensaje no leído", "unreadMessagesSeparatorText_other": "{{count}} mensajes no leídos", @@ -151,5 +178,8 @@ "{{count}} unread_many": "{{count}} no leídos", "{{count}} unread_one": "{{count}} no leído", "{{count}} unread_other": "{{count}} no leídos", + "{{count}} votes_many": "{{count}} votos", + "{{count}} votes_one": "1 voto", + "{{count}} votes_other": "{{count}} votos", "🏙 Attachment...": "🏙 Adjunto..." } diff --git a/src/i18n/fr.json b/src/i18n/fr.json index 5841d26821..75b7b4431d 100644 --- a/src/i18n/fr.json +++ b/src/i18n/fr.json @@ -1,14 +1,16 @@ { + "Add a comment": "Ajouter un commentaire", "Allow access to camera": "Autoriser l'accès à la caméra", "Allow access to microphone": "Autoriser l'accès au microphone", "An error has occurred during recording": "Une erreur s'est produite pendant l'enregistrement", "An error has occurred during the recording processing": "Une erreur s'est produite pendant le traitement de l'enregistrement", - "Attach files": "Pièces jointes", + "Anonymous": "Anonyme", + "Attach files": "Joindre des fichiers", "Cancel": "Annuler", "Cannot seek in the recording": "Impossible de rechercher dans l'enregistrement", "Channel Missing": "Canal Manquant", "Close": "Fermer", - "Close emoji picker": "Fermer le sélecteur d'emojis", + "Close emoji picker": "Fermer le sélecteur d'émojis", "Commands matching": "Correspondance des commandes", "Connection failure, reconnecting now...": "Échec de la connexion, reconnexion en cours...", "Delete": "Supprimer", @@ -18,29 +20,31 @@ "Drag your files here to add to your post": "Glissez vos fichiers ici pour les ajouter à votre publication", "Edit Message": "Éditer un message", "Edit message request failed": "Échec de la demande de modification du message", - "Edited": "Édité", - "Emoji matching": "Correspondance emoji", + "Edited": "Modifié", + "Emoji matching": "Correspondance d'émojis", "Empty message...": "Message vide...", - "Error adding flag": "Erreur lors de l'ajout du drapeau", + "End": "Fin", + "End vote": "Fin du vote", + "Error adding flag": "Erreur lors de l'ajout du signalement", "Error connecting to chat, refresh the page to try again.": "Erreur de connexion au chat, rafraîchissez la page pour réessayer.", "Error deleting message": "Erreur lors de la suppression du message", - "Error fetching reactions": "Erreur de chargement des réactions", + "Error fetching reactions": "Erreur lors du chargement des réactions", "Error marking message unread. Cannot mark unread messages older than the newest 100 channel messages.": "Erreur lors de la marque du message comme non lu. Impossible de marquer des messages non lus plus anciens que les 100 derniers messages du canal.", - "Error muting a user ...": "Erreur de mise en sourdine d'un utilisateur ...", - "Error pinning message": "Erreur d'épinglage du message", - "Error removing message pin": "Erreur lors de la suppression du code PIN du message", + "Error muting a user ...": "Erreur lors de la mise en sourdine d'un utilisateur...", + "Error pinning message": "Erreur lors de l'épinglage du message", + "Error removing message pin": "Erreur lors du retrait de l'épinglage du message", "Error reproducing the recording": "Erreur lors de la reproduction de l'enregistrement", - "Error starting recording": "Erreur de démarrage de l'enregistrement", - "Error unmuting a user ...": "Erreur de désactivation de la fonction sourdine pour un utilisateur ...", + "Error starting recording": "Erreur lors du démarrage de l'enregistrement", + "Error unmuting a user ...": "Erreur lors du démarrage de la sourdine d'un utilisateur...", "Error uploading attachment": "Erreur lors du téléchargement de la pièce jointe", "Error uploading file": "Erreur lors du téléchargement du fichier", "Error uploading image": "Erreur lors de l'envoi de l'image", "Error · Unsent": "Erreur - Non envoyé", "Error: {{ errorMessage }}": "Erreur : {{ errorMessage }}", - "Failed to jump to the first unread message": "Échec de saut vers le premier message non lu", - "Failed to mark channel as read": "Échec de la marque du canal comme lu", + "Failed to jump to the first unread message": "Échec du saut vers le premier message non lu", + "Failed to mark channel as read": "Échec du marquage du canal comme lu", "Failed to play the recording": "Impossible de lire l'enregistrement", - "File is too large: {{ size }}, maximum upload size is {{ limit }}": "Le fichier est trop volumineux : {{ size }}, la taille de téléchargement maximale est de {{ limit }}", + "File is too large: {{ size }}, maximum upload size is {{ limit }}": "Le fichier est trop volumineux : {{ size }}, la taille maximale de téléchargement est de {{ limit }}", "Flag": "Signaler", "Latest Messages": "Derniers messages", "Load more": "Charger plus", @@ -54,49 +58,70 @@ "Messages have been marked unread.": "Les messages ont été marqués comme non lus.", "Missing permissions to upload the attachment": "Autorisations manquantes pour télécharger la pièce jointe", "Mute": "Muet", - "New": "Nouveaux", + "New": "Nouveau", "New Messages!": "Nouveaux Messages!", "No chats here yet…": "Pas encore de messages ici...", "No results found": "Aucun résultat trouvé", - "Nothing yet...": "Aucun message...", + "Nobody will be able to vote in this poll anymore.": "Personne ne pourra plus voter dans ce sondage.", + "Nothing yet...": "Rien pour l'instant...", "Ok": "D'accord", - "Open emoji picker": "Ouvrez le sélecteur d'emoji", + "Open emoji picker": "Ouvrir le sélecteur d'émojis", "People matching": "Correspondance de personnes", - "Pin": "Épingle", + "Pin": "Épingler", "Pinned by": "Épinglé par", + "Poll comments": "Commentaires du sondage", + "Poll options": "Options du sondage", + "Poll results": "Résultats du sondage", "Recording format is not supported and cannot be reproduced": "Le format d'enregistrement n'est pas pris en charge et ne peut pas être reproduit", - "Reply": "Réponse", + "Reply": "Répondre", "Reply to Message": "Répondre au message", "Search": "Rechercher", - "Searching...": "Recherche...", + "Searching...": "Recherche en cours...", + "See all options ({{count}})_many": "Voir toutes les options ({{count}})", + "See all options ({{count}})_one": "Voir toutes les options ({{count}})", + "See all options ({{count}})_other": "Voir toutes les options ({{count}})", + "Select one": "Sélectionner un", + "Select one or more": "Sélectionner un ou plusieurs", + "Select up to {{count}}_many": "Sélectionner jusqu'à {{count}}", + "Select up to {{count}}_one": "Sélectionner jusqu'à {{count}}", + "Select up to {{count}}_other": "Sélectionner jusqu'à {{count}}", "Send": "Envoyer", "Send Anyway": "Envoyer quand même", "Send message request failed": "Échec de la demande d'envoi de message", "Sending...": "Envoi en cours...", + "Show all": "Tout afficher", "Shuffle": "Mélanger", "Slow Mode ON": "Mode lent activé", "Some of the files will not be accepted": "Certains fichiers ne seront pas acceptés", - "This message did not meet our content guidelines": "Ce message n'est pas conforme à nos lignes directrices en matière de contenu", + "Suggest an option": "Suggérer une option", + "This message did not meet our content guidelines": "Ce message ne respecte pas nos directives de contenu", "This message was deleted...": "Ce message a été supprimé...", "Thread": "Fil de discussion", "To start recording, allow the camera access in your browser": "Pour commencer l'enregistrement, autorisez l'accès à la caméra dans votre navigateur", "To start recording, allow the microphone access in your browser": "Pour commencer l'enregistrement, autorisez l'accès au microphone dans votre navigateur", - "Type your message": "Saisissez votre message", + "Type your message": "Tapez votre message", "Unmute": "Désactiver muet", "Unpin": "Détacher", "Unread messages": "Messages non lus", "Unsupported attachment": "Pièce jointe non prise en charge", - "Upload type: \"{{ type }}\" is not allowed": "Le type de téléchargement: \"{{ type }}\" n'est pas autorisé", + "Update your comment": "Mettre à jour votre commentaire", + "Upload type: \"{{ type }}\" is not allowed": "Le type de fichier : \"{{ type }}\" n'est pas autorisé", "User uploaded content": "Contenu téléchargé par l'utilisateur", + "View results": "Voir les résultats", + "View {{count}} comments_many": "Voir {{count}} commentaires", + "View {{count}} comments_one": "Voir {{count}} commentaire", + "View {{count}} comments_other": "Voir {{count}} commentaires", "Voice message": "Message vocal", + "Vote ended": "Vote terminé", "Wait until all attachments have uploaded": "Attendez que toutes les pièces jointes soient téléchargées", + "You": "Vous", "You have no channels currently": "Vous n'avez actuellement aucun canal", - "You've reached the maximum number of files": "Vous avez atteint le nombre maximum de fichiers", + "You've reached the maximum number of files": "Vous avez atteint le nombre maximal de fichiers", "aria/Attachment": "Pièce jointe", "aria/Cancel Reply": "Annuler la réponse", "aria/Cancel upload": "Annuler le téléchargement", "aria/Channel list": "Liste des canaux", - "aria/Channel search results": "Résultats de la recherche de canaux", + "aria/Channel search results": "Résultats de recherche de canaux", "aria/Close thread": "Fermer le fil", "aria/Download attachment": "Télécharger la pièce jointe", "aria/Emoji picker": "Sélecteur d'émojis", @@ -105,9 +130,9 @@ "aria/Image input": "Entrée d'image", "aria/Load More Channels": "Charger plus de canaux", "aria/Menu": "Menu", - "aria/Message Options": "Options de message", - "aria/Open Message Actions Menu": "Ouvrir le menu des actions de message", - "aria/Open Reaction Selector": "Ouvrir le sélecteur de réaction", + "aria/Message Options": "Options du message", + "aria/Open Message Actions Menu": "Ouvrir le menu des actions du message", + "aria/Open Reaction Selector": "Ouvrir le sélecteur de réactions", "aria/Open Thread": "Ouvrir le fil", "aria/Reaction list": "Liste des réactions", "aria/Remove attachment": "Supprimer la pièce jointe", @@ -126,9 +151,11 @@ "searchResultsCount_many": "{{ count }} résultats", "searchResultsCount_one": "1 résultat", "searchResultsCount_other": "{{ count }} résultats", - "this content could not be displayed": "ce contenu n'a pu être affiché", + "this content could not be displayed": "ce contenu n'a pas pu être affiché", "timestamp/DateSeparator": "{{ timestamp | timestampFormatter(calendar: true) }}", "timestamp/MessageTimestamp": "{{ timestamp | timestampFormatter(calendar: true) }}", + "timestamp/PollVote": "{{ timestamp | timestampFormatter(format: MMM D [at] HH:mm) }}", + "timestamp/PollVoteTooltip": "{{ timestamp | timestampFormatter(calendar: true) }}", "timestamp/SystemMessage": "{{ timestamp | timestampFormatter(format: dddd L) }}", "unban-command-args": "[@nomdutilisateur]", "unban-command-description": "Débannir un utilisateur", @@ -144,12 +171,15 @@ "{{ memberCount }} members": "{{ memberCount }} membres", "{{ user }} has been muted": "{{ user }} a été mis en sourdine", "{{ user }} has been unmuted": "{{ user }} n'est plus en sourdine", - "{{ user }} is typing...": "{{ user }} is typing...", - "{{ users }} and more are typing...": "{{ users }} and more are typing...", - "{{ users }} and {{ user }} are typing...": "{{ users }} and {{ user }} are typing...", + "{{ user }} is typing...": "{{ user }} est en train d'écrire...", + "{{ users }} and more are typing...": "{{ users }} et plus sont en train d'écrire...", + "{{ users }} and {{ user }} are typing...": "{{ users }} et {{ user }} sont en train d'écrire...", "{{ watcherCount }} online": "{{ watcherCount }} en ligne", "{{count}} unread_many": "{{count}} non lus", "{{count}} unread_one": "{{count}} non lu", "{{count}} unread_other": "{{count}} non lus", + "{{count}} votes_many": "{{count}} votes", + "{{count}} votes_one": "{{count}} vote", + "{{count}} votes_other": "{{count}} votes", "🏙 Attachment...": "🏙 Pièce jointe..." } diff --git a/src/i18n/hi.json b/src/i18n/hi.json index d5724ada8c..79c786ffb4 100644 --- a/src/i18n/hi.json +++ b/src/i18n/hi.json @@ -1,8 +1,10 @@ { + "Add a comment": "एक टिप्पणी जोड़ें", "Allow access to camera": "कैमरा तक पहुँच दें", "Allow access to microphone": "माइक्रोफ़ोन तक पहुँच दें", "An error has occurred during recording": "रेकॉर्डिंग के दौरान एक त्रुटि आ गई है", "An error has occurred during the recording processing": "रेकॉर्डिंग प्रोसेसिंग के दौरान एक त्रुटि आ गई है", + "Anonymous": "गुमनाम", "Attach files": "फाइल्स अटैच करे", "Cancel": "रद्द करें", "Cannot seek in the recording": "रेकॉर्डिंग में खोज नहीं की जा सकती", @@ -21,6 +23,8 @@ "Edited": "संपादित", "Emoji matching": "इमोजी मिलान", "Empty message...": "खाली संदेश ...", + "End": "समाप्त", + "End vote": "मत समाप्त करें", "Error adding flag": "ध्वज जोड़ने में त्रुटि", "Error connecting to chat, refresh the page to try again.": "चैट से कनेक्ट करने में त्रुटि, पेज को रिफ्रेश करें", "Error deleting message": "संदेश हटाने में त्रुटि", @@ -59,24 +63,36 @@ "New Messages!": "नए मैसेज!", "No chats here yet…": "यहां अभी तक कोई चैट नहीं...", "No results found": "कोई परिणाम नहीं मिला", + "Nobody will be able to vote in this poll anymore.": "अब कोई भी इस मतदान में मतदान नहीं कर सकेगा।", "Nothing yet...": "कोई मैसेज नहीं है", "Ok": "ठीक है", "Open emoji picker": "इमोजी पिकर खोलिये", "People matching": "मेल खाते लोग", "Pin": "पिन", "Pinned by": "द्वारा पिन किया गया", + "Poll comments": "मतदान टिप्पणियाँ", + "Poll options": "मतदान विकल्प", + "Poll results": "मतदान परिणाम", "Recording format is not supported and cannot be reproduced": "रेकॉर्डिंग फ़ॉर्मेट समर्थित नहीं है और पुनः उत्पन्न नहीं किया जा सकता", "Reply": "जवाब दे दो", "Reply to Message": "संदेश का जवाब दें", "Search": "खोज", "Searching...": "खोज कर...", + "See all options ({{count}})_one": "सभी विकल्प देखें ({{count}})", + "See all options ({{count}})_other": "सभी विकल्प देखें ({{count}})", + "Select one": "एक चुनें", + "Select one or more": "एक या अधिक चुनें", + "Select up to {{count}}_one": "अधिकतम {{count}} तक चुनें", + "Select up to {{count}}_other": "अधिकतम {{count}} तक चुनें", "Send": "भेजे", "Send Anyway": "वैसे भी भेजें", "Send message request failed": "संदेश भेजने का अनुरोध विफल रहा", "Sending...": "भेजा जा रहा है", + "Show all": "सभी दिखाएँ", "Shuffle": "मिश्रित करें", "Slow Mode ON": "स्लो मोड ऑन", "Some of the files will not be accepted": "कुछ फ़ाइलें स्वीकार नहीं की जाएंगी", + "Suggest an option": "एक विकल्प सुझाव दें", "This message did not meet our content guidelines": "यह संदेश हमारे सामग्री दिशानिर्देशों के अनुरूप नहीं था", "This message was deleted...": "मैसेज हटा दिया गया", "Thread": "रिप्लाई थ्रेड", @@ -87,10 +103,16 @@ "Unpin": "अनपिन", "Unread messages": "अपठित संदेश", "Unsupported attachment": "असमर्थित अटैचमेंट", + "Update your comment": "अपने टिप्पणी को अपडेट करें", "Upload type: \"{{ type }}\" is not allowed": "अपलोड प्रकार: \"{{ type }}\" की अनुमति नहीं है", "User uploaded content": "उपयोगकर्ता अपलोड की गई सामग्री", + "View results": "परिणाम देखें", + "View {{count}} comments_one": "देखें {{count}} टिप्पणी", + "View {{count}} comments_other": "देखें {{count}} टिप्पणियाँ", "Voice message": "आवाज संदेश", + "Vote ended": "मतदान समाप्त", "Wait until all attachments have uploaded": "सभी अटैचमेंट अपलोड होने तक प्रतीक्षा करें", + "You": "आप", "You have no channels currently": "आपके पास कोई चैनल नहीं है", "You've reached the maximum number of files": "आप अधिकतम फ़ाइलों तक पहुँच गए हैं", "aria/Attachment": "अनुलग्नक", @@ -128,6 +150,8 @@ "this content could not be displayed": "यह कॉन्टेंट लोड नहीं हो पाया", "timestamp/DateSeparator": "{{ timestamp | timestampFormatter(calendar: true) }}", "timestamp/MessageTimestamp": "{{ timestamp | timestampFormatter(calendar: true) }}", + "timestamp/PollVote": "{{ timestamp | timestampFormatter(format: MMM D [at] HH:mm) }}", + "timestamp/PollVoteTooltip": "{{ timestamp | timestampFormatter(calendar: true) }}", "timestamp/SystemMessage": "{{ timestamp | timestampFormatter(format: dddd L) }}", "unban-command-args": "[@उपयोगकर्तनाम]", "unban-command-description": "एक उपयोगकर्ता को प्रतिषेध से मुक्त करें", @@ -148,5 +172,7 @@ "{{ watcherCount }} online": "{{ watcherCount }} online", "{{count}} unread_one": "{{count}} अपठित", "{{count}} unread_other": "{{count}} अपठित", + "{{count}} votes_one": "{{count}} वोट", + "{{count}} votes_other": "{{count}} वोट", "🏙 Attachment...": "🏙 अटैचमेंट" } diff --git a/src/i18n/it.json b/src/i18n/it.json index 2a1b8f99fd..7568fa19c9 100644 --- a/src/i18n/it.json +++ b/src/i18n/it.json @@ -1,8 +1,10 @@ { + "Add a comment": "Aggiungi un commento", "Allow access to camera": "Consenti l'accesso alla fotocamera", "Allow access to microphone": "Consenti l'accesso al microfono", "An error has occurred during recording": "Si è verificato un errore durante la registrazione", "An error has occurred during the recording processing": "Si è verificato un errore durante l'elaborazione della registrazione", + "Anonymous": "Anonimo", "Attach files": "Allega file", "Cancel": "Annulla", "Cannot seek in the recording": "Impossibile cercare nella registrazione", @@ -10,8 +12,8 @@ "Close": "Chiudi", "Close emoji picker": "Chiudi il selettore di emoji", "Commands matching": "Comandi corrispondenti", - "Connection failure, reconnecting now...": "Connessione fallitta, riconnessione in corso...", - "Delete": "Cancella", + "Connection failure, reconnecting now...": "Errore di connessione, riconnessione in corso...", + "Delete": "Elimina", "Delivered": "Consegnato", "Download attachment {{ name }}": "Scarica l'allegato {{ name }}", "Drag your files here": "Trascina i tuoi file qui", @@ -20,18 +22,20 @@ "Edit message request failed": "Richiesta di modifica del messaggio non riuscita", "Edited": "Modificato", "Emoji matching": "Abbinamento emoji", - "Empty message...": "Message vuoto...", + "Empty message...": "Messaggio vuoto...", + "End": "Fine", + "End vote": "Termina il voto", "Error adding flag": "Errore durante l'aggiunta del flag", - "Error connecting to chat, refresh the page to try again.": "Errore di connessione alla chat, aggiorna la pagina per riprovare", + "Error connecting to chat, refresh the page to try again.": "Errore di connessione alla chat, aggiorna la pagina per riprovare.", "Error deleting message": "Errore durante l'eliminazione del messaggio", "Error fetching reactions": "Errore nel caricamento delle reazioni", "Error marking message unread. Cannot mark unread messages older than the newest 100 channel messages.": "Errore durante la marcatura del messaggio come non letto. Impossibile marcare messaggi non letti più vecchi dei più recenti 100 messaggi del canale.", - "Error muting a user ...": "Errore silenziando un utente ...", + "Error muting a user ...": "Errore nel silenziare un utente ...", "Error pinning message": "Errore durante il blocco del messaggio", "Error removing message pin": "Errore durante la rimozione del PIN del messaggio", "Error reproducing the recording": "Errore durante la riproduzione della registrazione", "Error starting recording": "Errore durante l'avvio della registrazione", - "Error unmuting a user ...": "Errore riattivando le notifiche per l'utente ...", + "Error unmuting a user ...": "Errore nel riattivare un utente ...", "Error uploading attachment": "Errore durante il caricamento dell'allegato", "Error uploading file": "Errore durante il caricamento del file", "Error uploading image": "Errore durante il caricamento dell'immagine", @@ -49,47 +53,68 @@ "Message Failed · Click to try again": "Invio messaggio fallito · Clicca per riprovare", "Message Failed · Unauthorized": "Invio messaggio fallito · Non autorizzato", "Message deleted": "Messaggio cancellato", - "Message has been successfully flagged": "Il messaggio é stato segnalato con successo", + "Message has been successfully flagged": "Il messaggio è stato segnalato con successo", "Message pinned": "Messaggio bloccato", "Messages have been marked unread.": "I messaggi sono stati contrassegnati come non letti.", "Missing permissions to upload the attachment": "Autorizzazioni mancanti per caricare l'allegato", "Mute": "Silenzia", "New": "Nuovo", - "New Messages!": "Nuovo messaggio!", + "New Messages!": "Nuovi messaggi!", "No chats here yet…": "Non ci sono ancora messaggi qui...", "No results found": "Nessun risultato trovato", + "Nobody will be able to vote in this poll anymore.": "Nessuno potrà più votare in questo sondaggio.", "Nothing yet...": "Ancora niente...", "Ok": "Ok", - "Open emoji picker": "Apri il selettore dellle emoji", + "Open emoji picker": "Apri il selettore di emoji", "People matching": "Persone che corrispondono", "Pin": "Pin", "Pinned by": "Appuntato da", + "Poll comments": "Commenti del sondaggio", + "Poll options": "Opzioni del sondaggio", + "Poll results": "Risultati del sondaggio", "Recording format is not supported and cannot be reproduced": "Il formato di registrazione non è supportato e non può essere riprodotto", - "Reply": "Rispondere", + "Reply": "Rispondi", "Reply to Message": "Rispondi al messaggio", - "Search": "Ricerca", - "Searching...": "Ricerca in corso ...", + "Search": "Cerca", + "Searching...": "Ricerca in corso...", + "See all options ({{count}})_many": "Vedi tutte le opzioni ({{count}})", + "See all options ({{count}})_one": "Vedi tutte le opzioni ({{count}})", + "See all options ({{count}})_other": "Vedi tutte le opzioni ({{count}})", + "Select one": "Seleziona uno", + "Select one or more": "Seleziona uno o più", + "Select up to {{count}}_many": "Seleziona fino a {{count}}", + "Select up to {{count}}_one": "Seleziona fino a {{count}}", + "Select up to {{count}}_other": "Seleziona fino a {{count}}", "Send": "Invia", "Send Anyway": "Invia comunque", - "Send message request failed": "Invia messaggio di richiesta non riuscito", + "Send message request failed": "Richiesta di invio messaggio non riuscita", "Sending...": "Invio in corso...", + "Show all": "Mostra tutto", "Shuffle": "Mescolare", "Slow Mode ON": "Modalità lenta attivata", "Some of the files will not be accepted": "Alcuni dei file non saranno accettati", + "Suggest an option": "Suggerisci un'opzione", "This message did not meet our content guidelines": "Questo messaggio non soddisfa le nostre linee guida sui contenuti", - "This message was deleted...": "Questo messaggio é stato cancellato", - "Thread": "Thread", - "To start recording, allow the camera access in your browser": "Per iniziare la registrazione, consenti l'accesso alla fotocamera nel tuo browser", - "To start recording, allow the microphone access in your browser": "Per iniziare la registrazione, consenti l'accesso al microfono nel tuo browser", + "This message was deleted...": "Questo messaggio è stato cancellato...", + "Thread": "Discussione", + "To start recording, allow the camera access in your browser": "Per iniziare a registrare, consenti l'accesso alla fotocamera nel tuo browser", + "To start recording, allow the microphone access in your browser": "Per iniziare a registrare, consenti l'accesso al microfono nel tuo browser", "Type your message": "Scrivi il tuo messaggio", - "Unmute": "Riattiva le notifiche", + "Unmute": "Riattiva il notifiche", "Unpin": "Sblocca", "Unread messages": "Messaggi non letti", "Unsupported attachment": "Allegato non supportato", + "Update your comment": "Aggiorna il tuo commento", "Upload type: \"{{ type }}\" is not allowed": "Tipo di caricamento: \"{{ type }}\" non è consentito", "User uploaded content": "Contenuto caricato dall'utente", + "View results": "Vedi risultati", + "View {{count}} comments_many": "Visualizza {{count}} commenti", + "View {{count}} comments_one": "Visualizza {{count}} commenti", + "View {{count}} comments_other": "Visualizza {{count}} commenti", "Voice message": "Messaggio vocale", + "Vote ended": "Voto terminato", "Wait until all attachments have uploaded": "Attendi il caricamento di tutti gli allegati", + "You": "Tu", "You have no channels currently": "Al momento non sono presenti canali", "You've reached the maximum number of files": "Hai raggiunto il numero massimo di file", "aria/Attachment": "Allegato", @@ -129,6 +154,8 @@ "this content could not be displayed": "questo contenuto non puó essere mostrato", "timestamp/DateSeparator": "{{ timestamp | timestampFormatter(calendar: true) }}", "timestamp/MessageTimestamp": "{{ timestamp | timestampFormatter(calendar: true) }}", + "timestamp/PollVote": "{{ timestamp | timestampFormatter(format: MMM D [at] HH:mm) }}", + "timestamp/PollVoteTooltip": "{{ timestamp | timestampFormatter(calendar: true) }}", "timestamp/SystemMessage": "{{ timestamp | timestampFormatter(format: dddd L) }}", "unban-command-args": "[@nomeutente]", "unban-command-description": "Togliere il divieto a un utente", @@ -142,14 +169,17 @@ "{{ firstUser }} and {{ secondUser }}": "{{ firstUser }} e {{ secondUser }}", "{{ imageCount }} more": "+ {{ imageCount }}", "{{ memberCount }} members": "{{ memberCount }} membri", - "{{ user }} has been muted": "{{ user }} é stato silenziato", + "{{ user }} has been muted": "{{ user }} è stato silenziato", "{{ user }} has been unmuted": "Notifiche riattivate per {{ user }}", - "{{ user }} is typing...": "{{ user }} is typing...", - "{{ users }} and more are typing...": "{{ users }} and more are typing...", - "{{ users }} and {{ user }} are typing...": "{{ users }} and {{ user }} are typing...", + "{{ user }} is typing...": "{{ user }} sta digitando...", + "{{ users }} and more are typing...": "{{ users }} e altri stanno digitando...", + "{{ users }} and {{ user }} are typing...": "{{ users }} e {{ user }} stanno digitando...", "{{ watcherCount }} online": "{{ watcherCount }} online", "{{count}} unread_many": "{{count}} non letti", "{{count}} unread_one": "{{count}} non letto", "{{count}} unread_other": "{{count}} non letti", + "{{count}} votes_many": "{{count}} voti", + "{{count}} votes_one": "{{count}} voto", + "{{count}} votes_other": "{{count}} voti", "🏙 Attachment...": "🏙 Allegato..." } diff --git a/src/i18n/ja.json b/src/i18n/ja.json index d557cc432d..320859ba2e 100644 --- a/src/i18n/ja.json +++ b/src/i18n/ja.json @@ -1,8 +1,10 @@ { + "Add a comment": "コメントを追加", "Allow access to camera": "カメラへのアクセスを許可する", "Allow access to microphone": "マイクロフォンへのアクセスを許可する", "An error has occurred during recording": "録音中にエラーが発生しました", "An error has occurred during the recording processing": "録音処理中にエラーが発生しました", + "Anonymous": "匿名", "Attach files": "ファイルを添付する", "Cancel": "キャンセル", "Cannot seek in the recording": "録音中にシークできません", @@ -21,6 +23,8 @@ "Edited": "編集済み", "Emoji matching": "絵文字マッチング", "Empty message...": "空のメッセージ...", + "End": "終了", + "End vote": "投票を終了", "Error adding flag": "フラグを追加のエラーが発生しました", "Error connecting to chat, refresh the page to try again.": "チャットへの接続ができませんでした。ページを更新してください。", "Error deleting message": "メッセージを削除するエラーが発生しました", @@ -58,24 +62,34 @@ "New Messages!": "新しいメッセージ!", "No chats here yet…": "ここにはまだチャットはありません…", "No results found": "結果が見つかりません", + "Nobody will be able to vote in this poll anymore.": "この投票では、誰も投票できなくなります。", "Nothing yet...": "まだ何もありません...", "Ok": "OK", "Open emoji picker": "絵文字ピッカーを開く", "People matching": "一致する人", "Pin": "ピン", "Pinned by": "ピンした方", + "Poll comments": "投票コメント", + "Poll options": "投票オプション", + "Poll results": "投票結果", "Recording format is not supported and cannot be reproduced": "録音形式はサポートされておらず、再生できません", "Reply": "返事", "Reply to Message": "メッセージに返信", "Search": "探す", "Searching...": "検索中...", + "See all options ({{count}})_other": "すべてのオプションを見る ({{count}})", + "Select one": "1つ選択", + "Select one or more": "1つ以上選択", + "Select up to {{count}}_other": "最大{{count}}まで選択", "Send": "送信", "Send Anyway": "とにかく送信する", "Send message request failed": "メッセージ送信リクエストが失敗しました", "Sending...": "送信中...", + "Show all": "すべて表示", "Shuffle": "シャッフル", "Slow Mode ON": "スローモードオン", "Some of the files will not be accepted": "一部のファイルは受け付けられません", + "Suggest an option": "オプションを提案", "This message did not meet our content guidelines": "このメッセージはコンテンツガイドラインに適合していません", "This message was deleted...": "このメッセージは削除されました...", "Thread": "スレッド", @@ -86,10 +100,15 @@ "Unpin": "ピンを解除する", "Unread messages": "未読メッセージ", "Unsupported attachment": "サポートされていない添付ファイル", + "Update your comment": "コメントを更新", "Upload type: \"{{ type }}\" is not allowed": "アップロードタイプ:\"{{ type }}\"は許可されていません", "User uploaded content": "ユーザーがアップロードしたコンテンツ", + "View results": "結果を表示", + "View {{count}} comments_other": "{{count}} コメントを表示", "Voice message": "ボイスメッセージ", + "Vote ended": "投票が終了しました", "Wait until all attachments have uploaded": "すべての添付ファイルがアップロードされるまでお待ちください", + "You": "あなた", "You have no channels currently": "現在チャンネルはありません", "You've reached the maximum number of files": "ファイルの最大数に達しました", "aria/Attachment": "添付ファイル", @@ -127,6 +146,8 @@ "this content could not be displayed": "このコンテンツは表示できませんでした", "timestamp/DateSeparator": "{{ timestamp | timestampFormatter(calendar: true) }}", "timestamp/MessageTimestamp": "{{ timestamp | timestampFormatter(calendar: true) }}", + "timestamp/PollVote": "{{ timestamp | timestampFormatter(format: MMM D [at] HH:mm) }}", + "timestamp/PollVoteTooltip": "{{ timestamp | timestampFormatter(calendar: true) }}", "timestamp/SystemMessage": "{{ timestamp | timestampFormatter(format: dddd L) }}", "unban-command-args": "[@ユーザ名]", "unban-command-description": "ユーザーの禁止を解除する", @@ -145,5 +166,6 @@ "{{ users }} and {{ user }} are typing...": "{{ users }} and {{ user }} are typing...", "{{ watcherCount }} online": "{{ watcherCount }} オンライン", "{{count}} unread_other": "{{count}} 未読", + "{{count}} votes_other": "{{count}} 票", "🏙 Attachment...": "🏙 アタッチメント..." } diff --git a/src/i18n/ko.json b/src/i18n/ko.json index c04aa7acca..052bfbe26e 100644 --- a/src/i18n/ko.json +++ b/src/i18n/ko.json @@ -1,8 +1,10 @@ { + "Add a comment": "댓글 추가", "Allow access to camera": "카메라에 대한 액세스 허용", "Allow access to microphone": "마이크로폰에 대한 액세스 허용", "An error has occurred during recording": "녹음 중 오류가 발생했습니다", "An error has occurred during the recording processing": "녹음 처리 중 오류가 발생했습니다", + "Anonymous": "익명", "Attach files": "파일 첨부", "Cancel": "취소", "Cannot seek in the recording": "녹음에서 찾을 수 없습니다", @@ -21,6 +23,8 @@ "Edited": "편집됨", "Emoji matching": "이모티콘 매칭", "Empty message...": "빈 메시지...", + "End": "종료", + "End vote": "투표 종료", "Error adding flag": "플래그를 추가하는 동안 오류가 발생했습니다.", "Error connecting to chat, refresh the page to try again.": "채팅에 연결하는 동안 오류가 발생했습니다. 페이지를 새로고침하여 다시 시도하세요.", "Error deleting message": "메시지를 삭제하는 중에 오류가 발생했습니다.", @@ -58,24 +62,34 @@ "New Messages!": "새 메시지!", "No chats here yet…": "아직 채팅이 없습니다...", "No results found": "검색 결과가 없습니다", + "Nobody will be able to vote in this poll anymore.": "이 투표에 더 이상 아무도 투표할 수 없습니다.", "Nothing yet...": "아직 아무것도...", "Ok": "확인", "Open emoji picker": "이모티콘 선택기 열기", "People matching": "일치하는 사람", "Pin": "핀", "Pinned by": "핀했던 분:", + "Poll comments": "투표 댓글", + "Poll options": "투표 옵션", + "Poll results": "투표 결과", "Recording format is not supported and cannot be reproduced": "녹음 형식이 지원되지 않으므로 재생할 수 없습니다", "Reply": "답장", "Reply to Message": "메시지에 답장", "Search": "찾다", "Searching...": "수색...", + "See all options ({{count}})_other": "모든 옵션 보기 ({{count}})", + "Select one": "하나 선택", + "Select one or more": "하나 이상 선택", + "Select up to {{count}}_other": "{{count}}개까지 선택", "Send": "보내다", "Send Anyway": "어쨌든 보내기", "Send message request failed": "메시지 보내기 요청 실패", "Sending...": "배상중...", + "Show all": "모두 보기", "Shuffle": "셔플", "Slow Mode ON": "슬로우 모드 켜짐", "Some of the files will not be accepted": "일부 파일은 허용되지 않을 수 있습니다", + "Suggest an option": "옵션 제안", "This message did not meet our content guidelines": "이 메시지는 콘텐츠 가이드라인을 충족하지 않습니다.", "This message was deleted...": "이 메시지는 삭제되었습니다...", "Thread": "스레드", @@ -86,10 +100,15 @@ "Unpin": "핀 해제", "Unread messages": "읽지 않은 메시지", "Unsupported attachment": "지원되지 않는 첨부 파일", + "Update your comment": "댓글 업데이트", "Upload type: \"{{ type }}\" is not allowed": "업로드 유형: \"{{ type }}\"은(는) 허용되지 않습니다.", "User uploaded content": "사용자 업로드 콘텐츠", + "View results": "결과 보기", + "View {{count}} comments_other": "{{count}}개의 댓글 보기", "Voice message": "음성 메시지", + "Vote ended": "투표 종료", "Wait until all attachments have uploaded": "모든 첨부 파일이 업로드될 때까지 기다립니다.", + "You": "당신", "You have no channels currently": "현재 채널이 없습니다.", "You've reached the maximum number of files": "최대 파일 수에 도달했습니다.", "aria/Attachment": "첨부 파일", @@ -127,6 +146,8 @@ "this content could not be displayed": "이 콘텐츠를 표시할 수 없습니다", "timestamp/DateSeparator": "{{ timestamp | timestampFormatter(calendar: true) }}", "timestamp/MessageTimestamp": "{{ timestamp | timestampFormatter(calendar: true) }}", + "timestamp/PollVote": "{{ timestamp | timestampFormatter(format: MMM D [at] HH:mm) }}", + "timestamp/PollVoteTooltip": "{{ timestamp | timestampFormatter(calendar: true) }}", "timestamp/SystemMessage": "{{ timestamp | timestampFormatter(format: dddd L) }}", "unban-command-args": "[@사용자이름]", "unban-command-description": "사용자 차단 해제", @@ -145,5 +166,6 @@ "{{ users }} and {{ user }} are typing...": "{{ users }} and {{ user }} are typing...", "{{ watcherCount }} online": "{{ watcherCount }} 온라인", "{{count}} unread_other": "{{count}} 읽지 않음", + "{{count}} votes_other": "{{count}} 투표", "🏙 Attachment...": "🏙 부착..." } diff --git a/src/i18n/nl.json b/src/i18n/nl.json index b92a05cac0..02bbaeb5bf 100644 --- a/src/i18n/nl.json +++ b/src/i18n/nl.json @@ -1,8 +1,10 @@ { + "Add a comment": "Voeg een opmerking toe", "Allow access to camera": "Toegang tot camera toestaan", "Allow access to microphone": "Toegang tot microfoon toestaan", "An error has occurred during recording": "Er is een fout opgetreden tijdens het opnemen", "An error has occurred during the recording processing": "Er is een fout opgetreden tijdens de verwerking van de opname", + "Anonymous": "Anoniem", "Attach files": "Bijlage toevoegen", "Cancel": "Annuleer", "Cannot seek in the recording": "Kan niet zoeken in de opname", @@ -10,17 +12,19 @@ "Close": "Sluit", "Close emoji picker": "Sluit de emoji-kiezer", "Commands matching": "Bijpassende opdrachten", - "Connection failure, reconnecting now...": "Probleem met de verbinding, opnieuw verbinding maken...", + "Connection failure, reconnecting now...": "Verbindingsfout, opnieuw verbinden...", "Delete": "Verwijder", "Delivered": "Afgeleverd", "Download attachment {{ name }}": "Bijlage {{ name }} downloaden", "Drag your files here": "Sleep je bestanden hier naartoe", "Drag your files here to add to your post": "Sleep je bestanden hier naartoe om aan je bericht toe te voegen", - "Edit Message": "Pas bericht aan", + "Edit Message": "Bericht bewerken", "Edit message request failed": "Verzoek om bericht bewerken mislukt", "Edited": "Bewerkt", "Emoji matching": "Emoji-overeenkomsten", "Empty message...": "Leeg bericht...", + "End": "Einde", + "End vote": "Einde stem", "Error adding flag": "Fout bij toevoegen van vlag", "Error connecting to chat, refresh the page to try again.": "Fout bij het verbinden, ververs de pagina om nogmaals te proberen", "Error deleting message": "Fout bij verwijderen van bericht", @@ -58,24 +62,36 @@ "New Messages!": "Nieuwe Berichten!", "No chats here yet…": "Nog geen chats hier...", "No results found": "Geen resultaten gevonden", + "Nobody will be able to vote in this poll anymore.": "Niemand kan meer stemmen in deze poll.", "Nothing yet...": "Nog niets ...", "Ok": "Oké", "Open emoji picker": "Open emojipicker", "People matching": "Mensen die matchen", "Pin": "Pin", "Pinned by": "Vastgemaakt door", + "Poll comments": "Poll opmerkingen", + "Poll options": "Poll opties", + "Poll results": "Poll resultaten", "Recording format is not supported and cannot be reproduced": "Opnameformaat wordt niet ondersteund en kan niet worden gereproduceerd", "Reply": "Antwoord", "Reply to Message": "Antwoord op bericht", "Search": "Zoeken", "Searching...": "Zoeken...", + "See all options ({{count}})_one": "Bekijk alle opties ({{count}})", + "See all options ({{count}})_other": "Bekijk alle opties ({{count}})", + "Select one": "Selecteer er een", + "Select one or more": "Selecteer een of meer", + "Select up to {{count}}_one": "Selecteer tot {{count}}", + "Select up to {{count}}_other": "Selecteer tot {{count}}", "Send": "Verstuur", "Send Anyway": "Toch versturen", "Send message request failed": "Verzoek om bericht te verzenden mislukt", "Sending...": "Aan het verzenden...", + "Show all": "Toon alles", "Shuffle": "Schudden", "Slow Mode ON": "Langzame modus aan", "Some of the files will not be accepted": "Sommige bestanden zullen niet worden geaccepteerd", + "Suggest an option": "Stel een optie voor", "This message did not meet our content guidelines": "Dit bericht voldeed niet aan onze inhoudsrichtlijnen", "This message was deleted...": "Dit bericht was verwijderd", "Thread": "Draadje", @@ -86,10 +102,16 @@ "Unpin": "Losmaken", "Unread messages": "Ongelezen berichten", "Unsupported attachment": "Niet-ondersteunde bijlage", + "Update your comment": "Werk je opmerking bij", "Upload type: \"{{ type }}\" is not allowed": "Uploadtype: \"{{ type }}\" is niet toegestaan", "User uploaded content": "Gebruikersgeüploade inhoud", - "Voice message": "Voicemail", + "View results": "Bekijk resultaten", + "View {{count}} comments_one": "Bekijk {{count}} opmerkingen", + "View {{count}} comments_other": "Bekijk {{count}} opmerkingen", + "Voice message": "Spraakbericht", + "Vote ended": "Stemmen beëindigd", "Wait until all attachments have uploaded": "Wacht tot alle bijlagen zijn geüpload", + "You": "Jij", "You have no channels currently": "Er zijn geen chats beschikbaar", "You've reached the maximum number of files": "Je hebt het maximale aantal bestanden bereikt", "aria/Attachment": "Bijlage", @@ -127,6 +149,8 @@ "this content could not be displayed": "Deze inhoud kan niet weergegeven worden", "timestamp/DateSeparator": "{{ timestamp | timestampFormatter(calendar: true) }}", "timestamp/MessageTimestamp": "{{ timestamp | timestampFormatter(calendar: true) }}", + "timestamp/PollVote": "{{ timestamp | timestampFormatter(format: MMM D [at] HH:mm) }}", + "timestamp/PollVoteTooltip": "{{ timestamp | timestampFormatter(calendar: true) }}", "timestamp/SystemMessage": "{{ timestamp | timestampFormatter(format: dddd L) }}", "unban-command-args": "[@gebruikersnaam]", "unban-command-description": "Een gebruiker debannen", @@ -147,5 +171,7 @@ "{{ watcherCount }} online": "{{ watcherCount }} online", "{{count}} unread_one": "{{count}} ongelezen", "{{count}} unread_other": "{{count}} ongelezen", + "{{count}} votes_one": "{{count}} stem", + "{{count}} votes_other": "{{count}} stemmen", "🏙 Attachment...": "🏙 Bijlage..." } diff --git a/src/i18n/pt.json b/src/i18n/pt.json index 0bba525717..a21f503d6a 100644 --- a/src/i18n/pt.json +++ b/src/i18n/pt.json @@ -1,8 +1,10 @@ { + "Add a comment": "Adicionar um comentário", "Allow access to camera": "Permitir acesso à câmera", "Allow access to microphone": "Permitir acesso ao microfone", "An error has occurred during recording": "Ocorreu um erro durante a gravação", "An error has occurred during the recording processing": "Ocorreu um erro durante o processamento da gravação", + "Anonymous": "Anônimo", "Attach files": "Anexar arquivos", "Cancel": "Cancelar", "Cannot seek in the recording": "Não é possível buscar na gravação", @@ -21,10 +23,12 @@ "Edited": "Editada", "Emoji matching": "Emoji correspondente", "Empty message...": "Mensagem vazia...", + "End": "Fim", + "End vote": "Encerrar votação", "Error adding flag": "Erro ao reportar", "Error connecting to chat, refresh the page to try again.": "Erro ao conectar ao bate-papo, atualize a página para tentar novamente.", "Error deleting message": "Erro ao deletar mensagem", - "Error fetching reactions": "Erro ao carregar reacções", + "Error fetching reactions": "Erro ao carregar reações", "Error marking message unread. Cannot mark unread messages older than the newest 100 channel messages.": "Erro ao marcar a mensagem como não lida. Não é possível marcar mensagens não lidas mais antigas do que as 100 mensagens mais recentes do canal.", "Error muting a user ...": "Erro ao silenciar um usuário...", "Error pinning message": "Erro ao fixar mensagem", @@ -39,7 +43,7 @@ "Error: {{ errorMessage }}": "Erro: {{ errorMessage }}", "Failed to jump to the first unread message": "Falha ao pular para a primeira mensagem não lida", "Failed to mark channel as read": "Falha ao marcar o canal como lido", - "Failed to play the recording": "Permissões faltando para carregar o anexo", + "Failed to play the recording": "Falha ao reproduzir a gravação", "File is too large: {{ size }}, maximum upload size is {{ limit }}": "O arquivo é muito grande: {{ size }}, o tamanho máximo de upload é {{ limit }}", "Flag": "Reportar", "Latest Messages": "Mensagens mais recentes", @@ -52,44 +56,65 @@ "Message has been successfully flagged": "A mensagem foi reportada com sucesso", "Message pinned": "Mensagem fixada", "Messages have been marked unread.": "Mensagens foram marcadas como não lidas.", - "Missing permissions to upload the attachment": "Missing permissions to upload the attachment", - "Mute": "Mudo", + "Missing permissions to upload the attachment": "Faltando permissões para enviar o anexo", + "Mute": "Silenciar", "New": "Novo", - "New Messages!": "Novas mensagens!", + "New Messages!": "Novas Mensagens!", "No chats here yet…": "Ainda não há conversas aqui...", "No results found": "Nenhum resultado encontrado", + "Nobody will be able to vote in this poll anymore.": "Ninguém mais poderá votar nesta pesquisa.", "Nothing yet...": "Nada ainda...", "Ok": "Ok", "Open emoji picker": "Abrir seletor de emoji", "People matching": "Pessoas correspondentes", "Pin": "Fixar", "Pinned by": "Fixado por", + "Poll comments": "Comentários da pesquisa", + "Poll options": "Opções da pesquisa", + "Poll results": "Resultados da pesquisa", "Recording format is not supported and cannot be reproduced": "Formato de gravação não é suportado e não pode ser reproduzido", "Reply": "Responder", - "Reply to Message": "Responder a mensagem", - "Search": "Procurar", - "Searching...": "Procurando...", + "Reply to Message": "Responder à mensagem", + "Search": "Buscar", + "Searching...": "Buscando...", + "See all options ({{count}})_many": "Ver todas as opções ({{count}})", + "See all options ({{count}})_one": "Ver todas as opções ({{count}})", + "See all options ({{count}})_other": "Ver todas as opções ({{count}})", + "Select one": "Selecionar um", + "Select one or more": "Selecionar um ou mais", + "Select up to {{count}}_many": "Selecionar até {{count}}", + "Select up to {{count}}_one": "Selecionar até {{count}}", + "Select up to {{count}}_other": "Selecionar até {{count}}", "Send": "Enviar", "Send Anyway": "Enviar de qualquer forma", - "Send message request failed": "O pedido de envio de mensagem falhou", + "Send message request failed": "O pedido de envio da mensagem falhou", "Sending...": "Enviando...", + "Show all": "Mostrar tudo", "Shuffle": "Embaralhar", "Slow Mode ON": "Modo lento LIGADO", - "Some of the files will not be accepted": "Alguns dos arquivos não serão aceitos", - "This message did not meet our content guidelines": "Esta mensagem não corresponde às nossas directrizes de conteúdo", + "Some of the files will not be accepted": "Alguns arquivos não serão aceitos", + "Suggest an option": "Sugerir uma opção", + "This message did not meet our content guidelines": "Esta mensagem não corresponde às nossas diretrizes de conteúdo", "This message was deleted...": "Esta mensagem foi excluída...", "Thread": "Fio", "To start recording, allow the camera access in your browser": "Para começar a gravar, permita o acesso à câmera no seu navegador", "To start recording, allow the microphone access in your browser": "Para começar a gravar, permita o acesso ao microfone no seu navegador", "Type your message": "Digite sua mensagem", "Unmute": "Ativar som", - "Unpin": "Liberar", + "Unpin": "Desfixar", "Unread messages": "Mensagens não lidas", "Unsupported attachment": "Anexo não suportado", + "Update your comment": "Atualizar seu comentário", "Upload type: \"{{ type }}\" is not allowed": "Tipo de upload: \"{{ type }}\" não é permitido", "User uploaded content": "Conteúdo enviado pelo usuário", + "View results": "Ver resultados", + "View {{count}} comments_many": "Ver {{count}} comentários", + "View {{count}} comments_one": "Ver {{count}} comentários", + "View {{count}} comments_other": "Ver {{count}} comentários", "Voice message": "Mensagem de voz", + "Vote ended": "Votação encerrada", "Wait until all attachments have uploaded": "Espere até que todos os anexos tenham sido carregados", + "You": "Você", "You have no channels currently": "Você não tem canais atualmente", "You've reached the maximum number of files": "Você atingiu o número máximo de arquivos", "aria/Attachment": "Anexo", @@ -129,6 +154,8 @@ "this content could not be displayed": "este conteúdo não pôde ser exibido", "timestamp/DateSeparator": "{{ timestamp | timestampFormatter(calendar: true) }}", "timestamp/MessageTimestamp": "{{ timestamp | timestampFormatter(calendar: true) }}", + "timestamp/PollVote": "{{ timestamp | timestampFormatter(format: MMM D [at] HH:mm) }}", + "timestamp/PollVoteTooltip": "{{ timestamp | timestampFormatter(calendar: true) }}", "timestamp/SystemMessage": "{{ timestamp | timestampFormatter(format: dddd L) }}", "unban-command-args": "[@nomedeusuário]", "unban-command-description": "Desbanir um usuário", @@ -151,5 +178,8 @@ "{{count}} unread_many": "{{count}} não lidos", "{{count}} unread_one": "{{count}} não lido", "{{count}} unread_other": "{{count}} não lidos", + "{{count}} votes_many": "{{count}} votos", + "{{count}} votes_one": "{{count}} voto", + "{{count}} votes_other": "{{count}} votos", "🏙 Attachment...": "🏙 Anexo..." } diff --git a/src/i18n/ru.json b/src/i18n/ru.json index b4afcb66af..c22f954fe8 100644 --- a/src/i18n/ru.json +++ b/src/i18n/ru.json @@ -1,8 +1,10 @@ { + "Add a comment": "Добавить комментарий", "Allow access to camera": "Разрешить доступ к камере", "Allow access to microphone": "Разрешить доступ к микрофон", "An error has occurred during recording": "Произошла ошибка во время записи", "An error has occurred during the recording processing": "Произошла ошибка во время обработки записи", + "Anonymous": "Аноним", "Attach files": "Прикрепить файлы", "Cancel": "Отмена", "Cannot seek in the recording": "Невозможно осуществить поиск в записи", @@ -21,6 +23,8 @@ "Edited": "Отредактировано", "Emoji matching": "Соответствие эмодзи", "Empty message...": "Пустое сообщение...", + "End": "Конец", + "End vote": "Закончить голосование", "Error adding flag": "Ошибка добавления флага", "Error connecting to chat, refresh the page to try again.": "Ошибка подключения к чату, обновите страницу чтобы попробовать снова.", "Error deleting message": "Ошибка при удалении сообщения", @@ -57,25 +61,41 @@ "New": "Новые", "New Messages!": "Новые сообщения!", "No chats here yet…": "Здесь еще нет чатов...", - "No results found": "результаты не найдены", + "No results found": "Результаты не найдены", + "Nobody will be able to vote in this poll anymore.": "Никто больше не сможет голосовать в этом опросе.", "Nothing yet...": "Пока ничего нет...", - "Ok": "Ok", - "Open emoji picker": "Выбрать emoji", - "People matching": "Соответствующие люди", - "Pin": "Штырь", + "Ok": "Ок", + "Open emoji picker": "Открыть выбор смайлов", + "People matching": "Совпадающие люди", + "Pin": "Закрепить", "Pinned by": "Закреплено", + "Poll comments": "Комментарии к опросу", + "Poll options": "Опции опроса", + "Poll results": "Результаты опроса", "Recording format is not supported and cannot be reproduced": "Формат записи не поддерживается и не может быть воспроизведен", - "Reply": "Отвечать", + "Reply": "Ответить", "Reply to Message": "Ответить на сообщение", "Search": "Поиск", "Searching...": "Ищем...", + "See all options ({{count}})_few": "Посмотреть все варианты ({{count}})", + "See all options ({{count}})_many": "Посмотреть все варианты ({{count}})", + "See all options ({{count}})_one": "Посмотреть все варианты ({{count}})", + "See all options ({{count}})_other": "Посмотреть все варианты ({{count}})", + "Select one": "Выберите один", + "Select one or more": "Выберите один или несколько", + "Select up to {{count}}_few": "Выберите до {{count}}", + "Select up to {{count}}_many": "Выберите до {{count}}", + "Select up to {{count}}_one": "Выберите до {{count}}", + "Select up to {{count}}_other": "Выберите до {{count}}", "Send": "Отправить", "Send Anyway": "Мне всё равно, отправить", "Send message request failed": "Не удалось отправить запрос на отправку сообщения", "Sending...": "Отправка...", + "Show all": "Показать все", "Shuffle": "Перемешать", "Slow Mode ON": "Медленный режим включен", "Some of the files will not be accepted": "Некоторые файлы не будут приняты", + "Suggest an option": "Предложить вариант", "This message did not meet our content guidelines": "Сообщение не соответствует правилам", "This message was deleted...": "Сообщение было удалено...", "Thread": "Ветка", @@ -86,10 +106,18 @@ "Unpin": "Открепить", "Unread messages": "Непрочитанные сообщения", "Unsupported attachment": "Неподдерживаемое вложение", + "Update your comment": "Обновите ваш комментарий", "Upload type: \"{{ type }}\" is not allowed": "Тип загрузки: \"{{ type }}\" не разрешен", "User uploaded content": "Пользователь загрузил контент", + "View results": "Посмотреть результаты", + "View {{count}} comments_few": "Просмотреть {{count}} комментариев", + "View {{count}} comments_many": "Просмотреть {{count}} комментариев", + "View {{count}} comments_one": "Просмотреть {{count}} комментарий", + "View {{count}} comments_other": "Просмотреть {{count}} комментариев", "Voice message": "Голосовое сообщение", + "Vote ended": "Голосование завершено", "Wait until all attachments have uploaded": "Подождите, пока все вложения загрузятся", + "You": "Вы", "You have no channels currently": "У вас нет каналов в данный момент", "You've reached the maximum number of files": "Вы достигли максимального количества файлов", "aria/Attachment": "Вложение", @@ -131,6 +159,8 @@ "this content could not be displayed": "Этот контент не может быть отображен в данный момент", "timestamp/DateSeparator": "{{ timestamp | timestampFormatter(calendar: true) }}", "timestamp/MessageTimestamp": "{{ timestamp | timestampFormatter(calendar: true) }}", + "timestamp/PollVote": "{{ timestamp | timestampFormatter(format: MMM D [at] HH:mm) }}", + "timestamp/PollVoteTooltip": "{{ timestamp | timestampFormatter(calendar: true) }}", "timestamp/SystemMessage": "{{ timestamp | timestampFormatter(format: dddd L) }}", "unban-command-args": "[@имяпользователя]", "unban-command-description": "Разблокировать пользователя", @@ -155,5 +185,9 @@ "{{count}} unread_many": "{{count}} непрочитанных", "{{count}} unread_one": "{{count}} непрочитанное", "{{count}} unread_other": "{{count}} непрочитанных", + "{{count}} votes_few": "{{count}} голоса", + "{{count}} votes_many": "{{count}} голосов", + "{{count}} votes_one": "{{count}} голос", + "{{count}} votes_other": "{{count}} голосов", "🏙 Attachment...": "🏙 Вложение..." } diff --git a/src/i18n/tr.json b/src/i18n/tr.json index 38aba03bc9..fcc8803a60 100644 --- a/src/i18n/tr.json +++ b/src/i18n/tr.json @@ -1,8 +1,10 @@ { + "Add a comment": "Yorum ekle", "Allow access to camera": "Kameraya erişime izin ver", "Allow access to microphone": "Mikrofona erişime izin ver", "An error has occurred during recording": "Kayıt sırasında bir hata oluştu", "An error has occurred during the recording processing": "Kayıt işlemi sırasında bir hata oluştu", + "Anonymous": "Anonim", "Attach files": "Dosya ekle", "Cancel": "İptal", "Cannot seek in the recording": "Kayıtta arama yapılamıyor", @@ -21,6 +23,8 @@ "Edited": "Düzenlendi", "Emoji matching": "Emoji eşleştirme", "Empty message...": "Boş mesaj...", + "End": "Son", + "End vote": "Oyu bitir", "Error adding flag": "Bayrak eklenirken hata oluştu", "Error connecting to chat, refresh the page to try again.": "Bağlantı hatası, sayfayı yenileyip tekrar deneyin.", "Error deleting message": "Mesaj silinirken hata oluştu", @@ -58,26 +62,38 @@ "New Messages!": "Yeni Mesajlar!", "No chats here yet…": "Henüz burada sohbet yok...", "No results found": "Sonuç bulunamadı", + "Nobody will be able to vote in this poll anymore.": "Artık bu ankette kimse oy kullanamayacak.", "Nothing yet...": "Şimdilik hiçbir şey...", "Ok": "Tamam", "Open emoji picker": "Emoji klavyesini aç", "People matching": "Eşleşen kişiler", "Pin": "Toplu iğne", "Pinned by": "Sabitleyen", + "Poll comments": "Anket yorumları", + "Poll options": "Anket seçenekleri", + "Poll results": "Anket sonuçları", "Recording format is not supported and cannot be reproduced": "Kayıt formatı desteklenmiyor ve çoğaltılamıyor", "Reply": "Cevapla", - "Reply to Message": "Mesajı Cevapla", + "Reply to Message": "Mesaja Cevapla", "Search": "Arama", "Searching...": "Aranıyor...", + "See all options ({{count}})_one": "Tüm seçenekleri göster ({{count}})", + "See all options ({{count}})_other": "Tüm seçenekleri göster ({{count}})", + "Select one": "Birini seçin", + "Select one or more": "Bir veya daha fazlasını seçin", + "Select up to {{count}}_one": "En fazla {{count}}'yi seçin", + "Select up to {{count}}_other": "En fazla {{count}}'yi seçin", "Send": "Gönder", - "Send Anyway": "Neyse Gönder", + "Send Anyway": "Yine de gönder", "Send message request failed": "Mesaj gönderme isteği başarısız oldu", "Sending...": "Gönderiliyor...", + "Show all": "Tümünü göster", "Shuffle": "Karıştır", "Slow Mode ON": "Yavaş Mod Açık", - "Some of the files will not be accepted": "Bazı dosyalar kabul edilmeyecektir", + "Some of the files will not be accepted": "Bazı dosyalar kabul edilmeyecek", + "Suggest an option": "Bir seçenek önerin", "This message did not meet our content guidelines": "Bu mesaj içerik yönergelerimize uygun değil", - "This message was deleted...": "Bu mesaj silindi", + "This message was deleted...": "Bu mesaj silindi...", "Thread": "Konu", "To start recording, allow the camera access in your browser": "Kayıt yapmaya başlamak için tarayıcınızda kameraya erişime izin verin", "To start recording, allow the microphone access in your browser": "Kayıt yapmaya başlamak için tarayıcınızda mikrofona erişime izin verin", @@ -86,10 +102,16 @@ "Unpin": "Sabitlemeyi kaldır", "Unread messages": "Okunmamış mesajlar", "Unsupported attachment": "Desteklenmeyen ek", + "Update your comment": "Yorumunuzu güncelleyin", "Upload type: \"{{ type }}\" is not allowed": "Yükleme türü: \"{{ type }}\" izin verilmez", "User uploaded content": "Kullanıcı tarafından yüklenen içerik", + "View results": "Sonuçları görüntüle", + "View {{count}} comments_one": "{{count}} yorumu görüntüle", + "View {{count}} comments_other": "{{count}} yorumu görüntüle", "Voice message": "Sesli mesaj", + "Vote ended": "Oylama sona erdi", "Wait until all attachments have uploaded": "Tüm ekler yüklenene kadar bekleyin", + "You": "Sen", "You have no channels currently": "Henüz kanalınız yok", "You've reached the maximum number of files": "Maksimum dosya sayısına ulaştınız", "aria/Attachment": "Bijlage", @@ -127,6 +149,8 @@ "this content could not be displayed": "bu içerik gösterilemiyor", "timestamp/DateSeparator": "{{ timestamp | timestampFormatter(calendar: true) }}", "timestamp/MessageTimestamp": "{{ timestamp | timestampFormatter(calendar: true) }}", + "timestamp/PollVote": "{{ timestamp | timestampFormatter(format: MMM D [at] HH:mm) }}", + "timestamp/PollVoteTooltip": "{{ timestamp | timestampFormatter(calendar: true) }}", "timestamp/SystemMessage": "{{ timestamp | timestampFormatter(format: dddd L) }}", "unban-command-args": "[@kullanıcıadı]", "unban-command-description": "Bir kullanıcının yasağını kaldır", @@ -147,5 +171,7 @@ "{{ watcherCount }} online": "{{ watcherCount }} çevrimiçi", "{{count}} unread_one": "{{count}} okunmamış", "{{count}} unread_other": "{{count}} okunmamış", + "{{count}} votes_one": "{{count}} oy", + "{{count}} votes_other": "{{count}} oy", "🏙 Attachment...": "🏙 Ek..." } diff --git a/src/types/types.ts b/src/types/types.ts index 404908c23d..2dae8848e7 100644 --- a/src/types/types.ts +++ b/src/types/types.ts @@ -69,6 +69,8 @@ export type DefaultStreamChatGenerics = ExtendableGenerics & { commandType: LiteralStringForUnion; eventType: UnknownType; messageType: DefaultMessageType; + pollOptionType: UnknownType; + pollType: UnknownType; reactionType: UnknownType; userType: DefaultUserType; }; From 0efdaa1a4a57cb4f6146ffcbe2ae23d2fc13abdf Mon Sep 17 00:00:00 2001 From: martincupela Date: Wed, 2 Oct 2024 15:33:57 +0200 Subject: [PATCH 02/71] feat: add QuotedPoll component --- src/components/Message/QuotedMessage.tsx | 24 ++++++++++++------ .../MessageInput/QuotedMessagePreview.tsx | 19 +++++++++----- src/components/Poll/QuotedPoll.tsx | 25 +++++++++++++++++++ src/components/Poll/index.ts | 3 ++- 4 files changed, 57 insertions(+), 14 deletions(-) create mode 100644 src/components/Poll/QuotedPoll.tsx diff --git a/src/components/Message/QuotedMessage.tsx b/src/components/Message/QuotedMessage.tsx index 93baa5b97b..afb3a1f6c3 100644 --- a/src/components/Message/QuotedMessage.tsx +++ b/src/components/Message/QuotedMessage.tsx @@ -8,10 +8,11 @@ import { useMessageContext } from '../../context/MessageContext'; import { useTranslationContext } from '../../context/TranslationContext'; import { useChannelActionContext } from '../../context/ChannelActionContext'; -import type { TranslationLanguages } from 'stream-chat'; +import type { PollResponse, TranslationLanguages } from 'stream-chat'; import type { DefaultStreamChatGenerics } from '../../types/types'; import { Attachment as DefaultAttachment } from '../Attachment'; +import { QuotedPoll } from '../Poll'; export const QuotedMessage = < StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics @@ -41,7 +42,7 @@ export const QuotedMessage = < ? quoted_message.attachments[0] : null; - if (!quotedMessageText && !quotedMessageAttachment) return null; + if (!quoted_message.poll && !quotedMessageText && !quotedMessageAttachment) return null; return ( <> @@ -63,12 +64,21 @@ export const QuotedMessage = < /> )}
- {quotedMessageAttachment && ( - + {quoted_message.poll ? ( + } /> + ) : ( + <> + {quotedMessageAttachment && ( + + )} +
+ {quotedMessageText} +
+ )} -
- {quotedMessageText} -
{message.attachments?.length ? : null} diff --git a/src/components/MessageInput/QuotedMessagePreview.tsx b/src/components/MessageInput/QuotedMessagePreview.tsx index 9569c2ba95..2aafbeb7fd 100644 --- a/src/components/MessageInput/QuotedMessagePreview.tsx +++ b/src/components/MessageInput/QuotedMessagePreview.tsx @@ -1,5 +1,5 @@ import React, { useMemo } from 'react'; -import type { TranslationLanguages } from 'stream-chat'; +import type { PollResponse, TranslationLanguages } from 'stream-chat'; import { Attachment as DefaultAttachment } from '../Attachment'; import { Avatar as DefaultAvatar } from '../Avatar'; @@ -11,6 +11,7 @@ import { useTranslationContext } from '../../context/TranslationContext'; import type { StreamMessage } from '../../context/ChannelStateContext'; import type { DefaultStreamChatGenerics } from '../../types/types'; +import { QuotedPoll } from '../Poll'; export const QuotedMessagePreviewHeader = < StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics @@ -73,12 +74,18 @@ export const QuotedMessagePreview = < /> )}
- {!!quotedMessageAttachment.length && ( - + {quotedMessage.poll ? ( + } /> + ) : ( + <> + {!!quotedMessageAttachment.length && ( + + )} +
+

{quotedMessageText}

+
+ )} -
-

{quotedMessageText}

-
); diff --git a/src/components/Poll/QuotedPoll.tsx b/src/components/Poll/QuotedPoll.tsx new file mode 100644 index 0000000000..c6242d111f --- /dev/null +++ b/src/components/Poll/QuotedPoll.tsx @@ -0,0 +1,25 @@ +import React from 'react'; +import { PollResponse } from 'stream-chat'; +import type { DefaultStreamChatGenerics } from '../../types'; +import clsx from 'clsx'; + +export type QuotedPollProps< + StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics +> = { + poll: PollResponse; +}; + +export const QuotedPoll = < + StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics +>({ + poll, +}: QuotedPollProps) => ( +
+
📊
+
{poll.name}
+
+); diff --git a/src/components/Poll/index.ts b/src/components/Poll/index.ts index 465071b835..7b82a1b0d5 100644 --- a/src/components/Poll/index.ts +++ b/src/components/Poll/index.ts @@ -1 +1,2 @@ -export { Poll } from './Poll'; +export * from './Poll'; +export * from './QuotedPoll'; From 4831f45521cc36f99f3a54ee8e62600f08560a88 Mon Sep 17 00:00:00 2001 From: martincupela Date: Fri, 4 Oct 2024 12:48:16 +0200 Subject: [PATCH 03/71] feat: add AttachmentSelector component --- .../docs/React/guides/dialog-management.mdx | 2 +- src/components/Channel/Channel.tsx | 4 + src/components/Dialog/DialogAnchor.tsx | 2 +- src/components/Dialog/DialogMenu.tsx | 11 +++ .../MessageInput/AttachmentSelector.tsx | 99 +++++++++++++++++++ src/components/MessageInput/MessageInput.tsx | 17 ++-- .../MessageInput/MessageInputFlat.tsx | 25 +---- .../ReactFileUtilities/UploadButton.tsx | 80 +++++++++++++-- src/context/ComponentContext.tsx | 2 + src/context/PollContext.tsx | 2 +- src/types/types.ts | 2 + 11 files changed, 207 insertions(+), 39 deletions(-) create mode 100644 src/components/Dialog/DialogMenu.tsx create mode 100644 src/components/MessageInput/AttachmentSelector.tsx diff --git a/docusaurus/docs/React/guides/dialog-management.mdx b/docusaurus/docs/React/guides/dialog-management.mdx index f2c5001156..9055b79af3 100644 --- a/docusaurus/docs/React/guides/dialog-management.mdx +++ b/docusaurus/docs/React/guides/dialog-management.mdx @@ -65,7 +65,7 @@ const Container = () => { - diff --git a/src/components/Channel/Channel.tsx b/src/components/Channel/Channel.tsx index e7c6abbbfd..c1b9f7ac42 100644 --- a/src/components/Channel/Channel.tsx +++ b/src/components/Channel/Channel.tsx @@ -103,6 +103,8 @@ type ChannelPropsForwardedToComponentContext< Attachment?: ComponentContextValue['Attachment']; /** Custom UI component to display an attachment previews in MessageInput, defaults to and accepts same props as: [Attachment](https://github.com/GetStream/stream-chat-react/blob/master/src/components/MessageInput/AttachmentPreviewList.tsx) */ AttachmentPreviewList?: ComponentContextValue['AttachmentPreviewList']; + /** Custom UI component to control adding attachments to MessageInput, defaults to and accepts same props as: [AttachmentSelector](https://github.com/GetStream/stream-chat-react/blob/master/src/components/MessageInput/AttachmentSelector.tsx) */ + AttachmentSelector?: ComponentContextValue['AttachmentSelector']; /** Custom UI component to display AudioRecorder in MessageInput, defaults to and accepts same props as: [AudioRecorder](https://github.com/GetStream/stream-chat-react/blob/master/src/components/MessageInput/AudioRecorder.tsx) */ AudioRecorder?: ComponentContextValue['AudioRecorder']; /** Optional UI component to override the default suggestion Item component, defaults to and accepts same props as: [Item](https://github.com/GetStream/stream-chat-react/blob/master/src/components/AutoCompleteTextarea/Item.js) */ @@ -1256,6 +1258,7 @@ const ChannelInner = < () => ({ Attachment: props.Attachment, AttachmentPreviewList: props.AttachmentPreviewList, + AttachmentSelector: props.AttachmentSelector, AudioRecorder: props.AudioRecorder, AutocompleteSuggestionItem: props.AutocompleteSuggestionItem, AutocompleteSuggestionList: props.AutocompleteSuggestionList, @@ -1306,6 +1309,7 @@ const ChannelInner = < [ props.Attachment, props.AttachmentPreviewList, + props.AttachmentSelector, props.AudioRecorder, props.AutocompleteSuggestionItem, props.AutocompleteSuggestionList, diff --git a/src/components/Dialog/DialogAnchor.tsx b/src/components/Dialog/DialogAnchor.tsx index 5e411ba0f4..fd42389f55 100644 --- a/src/components/Dialog/DialogAnchor.tsx +++ b/src/components/Dialog/DialogAnchor.tsx @@ -53,7 +53,7 @@ export function useDialogAnchor({ }; } -type DialogAnchorProps = PropsWithChildren> & { +export type DialogAnchorProps = PropsWithChildren> & { id: string; focus?: boolean; trapFocus?: boolean; diff --git a/src/components/Dialog/DialogMenu.tsx b/src/components/Dialog/DialogMenu.tsx new file mode 100644 index 0000000000..9fe04f9986 --- /dev/null +++ b/src/components/Dialog/DialogMenu.tsx @@ -0,0 +1,11 @@ +import React, { ComponentProps } from 'react'; +import clsx from 'clsx'; + +export type DialogMenuButtonProps = ComponentProps<'button'>; + +export const DialogMenuButton = ({ children, className, ...props }: DialogMenuButtonProps) => ( + +); diff --git a/src/components/MessageInput/AttachmentSelector.tsx b/src/components/MessageInput/AttachmentSelector.tsx new file mode 100644 index 0000000000..c40908fe47 --- /dev/null +++ b/src/components/MessageInput/AttachmentSelector.tsx @@ -0,0 +1,99 @@ +import { nanoid } from 'nanoid'; +import React, { ElementRef, useEffect, useMemo, useRef, useState } from 'react'; +import { UploadIcon as DefaultUploadIcon } from './icons'; +import { UploadFileInput } from '../ReactFileUtilities'; +import { DialogAnchor, useDialog, useDialogIsOpen } from '../Dialog'; +import { DialogMenuButton } from '../Dialog/DialogMenu'; +import { useChannelStateContext, useComponentContext, useTranslationContext } from '../../context'; +import type { DefaultStreamChatGenerics } from '../../types'; + +export const SimpleAttachmentSelector = () => { + const { FileUploadIcon = DefaultUploadIcon } = useComponentContext('SimpleAttachmentSelector'); + const inputRef = useRef>(null); + const [labelElement, setLabelElement] = useState(null); + const id = useMemo(() => nanoid(), []); + + useEffect(() => { + if (!labelElement) return; + const handleKeyUp = (event: KeyboardEvent) => { + if (![' ', 'Enter'].includes(event.key) || !inputRef.current) return; + event.preventDefault(); + inputRef.current.click(); + }; + labelElement.addEventListener('keyup', handleKeyUp); + return () => { + labelElement.removeEventListener('keyup', handleKeyUp); + }; + }, [labelElement]); + + return ( +
+ + +
+ ); +}; + +export const AttachmentSelector = < + StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics +>() => { + const { t } = useTranslationContext('AttachmentSelectorActionsMenu'); + const { channelCapabilities } = useChannelStateContext(); + const [input, setInput] = useState(null); + + const menuButtonRef = useRef>(null); + + const dialogId = 'attachment-actions-menu'; + const dialog = useDialog({ id: dialogId }); + const dialogIsOpen = useDialogIsOpen(dialogId); + + if (!channelCapabilities['send-poll'] && !channelCapabilities['upload-file']) return null; + + return ( +
+ + + +
+ {channelCapabilities['upload-file'] && ( + { + input?.click(); + dialog.close(); + }} + > + {t('File')} + + )} + {channelCapabilities['send-poll'] && ( + { + dialog.close(); + }} + > + {t('Poll')} + + )} +
+
+
+ ); +}; diff --git a/src/components/MessageInput/MessageInput.tsx b/src/components/MessageInput/MessageInput.tsx index 355d1673ad..2e57fedfa5 100644 --- a/src/components/MessageInput/MessageInput.tsx +++ b/src/components/MessageInput/MessageInput.tsx @@ -22,6 +22,7 @@ import type { } from '../../types/types'; import type { URLEnrichmentConfig } from './hooks/useLinkPreviews'; import type { CustomAudioRecordingConfig } from '../MediaRecorder'; +import { DialogManagerProvider } from '../../context'; export type EmojiSearchIndexResult = { id: string; @@ -167,19 +168,21 @@ const UnMemoizedMessageInput = < if (dragAndDropWindow) return ( - <> + - + ); return ( - - - - - + + + + + + + ); }; diff --git a/src/components/MessageInput/MessageInputFlat.tsx b/src/components/MessageInput/MessageInputFlat.tsx index 25a1393bc5..77d9a6d3d2 100644 --- a/src/components/MessageInput/MessageInputFlat.tsx +++ b/src/components/MessageInput/MessageInputFlat.tsx @@ -1,11 +1,9 @@ import React, { useCallback, useEffect, useMemo, useState } from 'react'; -import { UploadButton } from '../ReactFileUtilities'; import type { Event } from 'stream-chat'; import clsx from 'clsx'; import { useDropzone } from 'react-dropzone'; -import { nanoid } from 'nanoid'; - -import { UploadIcon as DefaultUploadIcon } from './icons'; +import { AttachmentSelector as DefaultAttachmentSelector } from './AttachmentSelector'; +// import { SimpleAttachmentSelector as DefaultAttachmentSelector } from './AttachmentSelector'; import { CooldownTimer as DefaultCooldownTimer } from './CooldownTimer'; import { SendButton as DefaultSendButton } from './SendButton'; import { @@ -59,8 +57,8 @@ export const MessageInputFlat = < const { AudioRecorder = DefaultAudioRecorder, AttachmentPreviewList = DefaultAttachmentPreviewList, + AttachmentSelector = DefaultAttachmentSelector, CooldownTimer = DefaultCooldownTimer, - FileUploadIcon = DefaultUploadIcon, LinkPreviewList = DefaultLinkPreviewList, QuotedMessagePreview = DefaultQuotedMessagePreview, RecordingPermissionDeniedNotification = DefaultRecordingPermissionDeniedNotification, @@ -84,7 +82,6 @@ export const MessageInputFlat = < setShowRecordingPermissionDeniedNotification(false); }, []); - const id = useMemo(() => nanoid(), []); const failedUploadsCount = useMemo( () => attachments.filter((a) => a.localMetadata?.uploadState === 'failed').length, [attachments], @@ -161,21 +158,7 @@ export const MessageInputFlat = < {displayQuotedMessage && }
-
- - -
+
{displayQuotedMessage && } {isUploadEnabled && diff --git a/src/components/ReactFileUtilities/UploadButton.tsx b/src/components/ReactFileUtilities/UploadButton.tsx index 59c96ea492..31821699b2 100644 --- a/src/components/ReactFileUtilities/UploadButton.tsx +++ b/src/components/ReactFileUtilities/UploadButton.tsx @@ -1,18 +1,82 @@ -import React, { ComponentProps } from 'react'; +import clsx from 'clsx'; +import { nanoid } from 'nanoid'; +import React, { ComponentProps, forwardRef, useCallback, useMemo } from 'react'; import { useHandleFileChangeWrapper } from './utils'; +import { + useChannelStateContext, + useMessageInputContext, + useTranslationContext, +} from '../../context'; +import type { DefaultStreamChatGenerics } from '../../types'; +import { PartialSelected } from '../../types/types'; +/** + * @deprecated Use FileInputProps instead. + */ export type UploadButtonProps = { onFileChange: (files: Array) => void; resetOnChange?: boolean; } & Omit, 'type' | 'onChange'>; -export const UploadButton = ({ - onFileChange, - resetOnChange = true, - ...rest -}: UploadButtonProps) => { +/** + * @deprecated Use FileInput instead + */ + +export const UploadButton = forwardRef(function UploadButton( + { onFileChange, resetOnChange = true, ...rest }: UploadButtonProps, + ref: React.ForwardedRef, +) { const handleInputChange = useHandleFileChangeWrapper(resetOnChange, onFileChange); - return ; -}; + return ; +}); + +export type FileInputProps = UploadButtonProps; + +export const FileInput = UploadButton; + +export const UploadFileInput = forwardRef(function UploadFileInput< + StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics +>( + { + className, + onFileChange: onFileChangeCustom, + ...props + }: PartialSelected, + ref: React.ForwardedRef, +) { + const { t } = useTranslationContext('UploadFileInput'); + const { acceptedFiles = [], multipleUploads } = useChannelStateContext( + 'UploadFileInput', + ); + const { + isUploadEnabled, + maxFilesLeft, + uploadNewFiles, + } = useMessageInputContext('UploadFileInput'); + const id = useMemo(() => nanoid(), []); + + const onFileChange = useCallback( + (files: Array) => { + uploadNewFiles(files); + onFileChangeCustom?.(files); + }, + [onFileChangeCustom, uploadNewFiles], + ); + + return ( + + ); +}); diff --git a/src/context/ComponentContext.tsx b/src/context/ComponentContext.tsx index d2237319f7..aa2b46f738 100644 --- a/src/context/ComponentContext.tsx +++ b/src/context/ComponentContext.tsx @@ -50,6 +50,7 @@ import type { import type { MessageBouncePromptProps } from '../components/MessageBounce'; import type { TimestampProps } from '../components/Message/Timestamp'; import type { CustomTrigger, DefaultStreamChatGenerics, UnknownType } from '../types/types'; +import { AttachmentSelectorProps } from '../components/MessageInput/AttachmentSelector'; export type ComponentContextValue< StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics, @@ -57,6 +58,7 @@ export type ComponentContextValue< > = { Attachment?: React.ComponentType>; AttachmentPreviewList?: React.ComponentType; + AttachmentSelector?: React.ComponentType; AudioRecorder?: React.ComponentType; AutocompleteSuggestionItem?: React.ComponentType>; AutocompleteSuggestionList?: React.ComponentType>; diff --git a/src/context/PollContext.tsx b/src/context/PollContext.tsx index 762676ee29..3164e1b515 100644 --- a/src/context/PollContext.tsx +++ b/src/context/PollContext.tsx @@ -3,7 +3,7 @@ import { Poll } from 'stream-chat'; import { useChatContext } from './ChatContext'; import type { PollResponse } from 'stream-chat'; -import type { DefaultStreamChatGenerics } from '../types/types'; +import type { DefaultStreamChatGenerics } from '../types'; export type PollContextValue< StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics diff --git a/src/types/types.ts b/src/types/types.ts index 2dae8848e7..7fd6c54f98 100644 --- a/src/types/types.ts +++ b/src/types/types.ts @@ -159,3 +159,5 @@ export type Readable = { } & {}; export type ValuesType = T[keyof T]; + +export type PartialSelected = Omit & Partial>; From 034ee16284a447c830d780d6389130e27faa3287 Mon Sep 17 00:00:00 2001 From: martincupela Date: Thu, 10 Oct 2024 14:18:15 +0200 Subject: [PATCH 04/71] feat: add poll creation dialog --- src/components/ChatView/ChatView.tsx | 4 +- src/components/Dialog/DialogPortal.tsx | 23 ++- .../DragAndDrop/DragAndDropContainer.tsx | 139 +++++++++++++++ src/components/Form/SwitchField.tsx | 47 +++++ .../MessageInput/AttachmentSelector.tsx | 47 +++-- .../MessageInput/hooks/useSubmitHandler.ts | 8 +- src/components/Modal/ModalHeader.tsx | 17 ++ src/components/Poll/PollActions.tsx | 4 +- src/components/Poll/PollHeader.tsx | 20 ++- src/components/Poll/PollOptionSelector.tsx | 9 +- src/components/Poll/constants.ts | 2 + src/components/Poll/modals/ModalHeader.tsx | 17 -- .../Poll/modals/PollAnswersList.tsx | 2 +- .../Poll/modals/PollCreationDialog.tsx | 162 ++++++++++++++++++ .../modals/PollCreationDialog/FieldError.tsx | 8 + .../PollCreationDialog/OptionFieldSet.tsx | 114 ++++++++++++ .../PollCreationDialogControls.tsx | 76 ++++++++ .../Poll/modals/PollCreationDialog/types.ts | 24 +++ .../Poll/modals/PollOptionsFullList.tsx | 2 +- .../Poll/modals/PollResults/PollResults.tsx | 3 +- src/components/Portal/Portal.ts | 24 +++ src/context/ComponentContext.tsx | 3 +- src/types/types.ts | 4 + 23 files changed, 698 insertions(+), 61 deletions(-) create mode 100644 src/components/DragAndDrop/DragAndDropContainer.tsx create mode 100644 src/components/Form/SwitchField.tsx create mode 100644 src/components/Modal/ModalHeader.tsx delete mode 100644 src/components/Poll/modals/ModalHeader.tsx create mode 100644 src/components/Poll/modals/PollCreationDialog.tsx create mode 100644 src/components/Poll/modals/PollCreationDialog/FieldError.tsx create mode 100644 src/components/Poll/modals/PollCreationDialog/OptionFieldSet.tsx create mode 100644 src/components/Poll/modals/PollCreationDialog/PollCreationDialogControls.tsx create mode 100644 src/components/Poll/modals/PollCreationDialog/types.ts create mode 100644 src/components/Portal/Portal.ts diff --git a/src/components/ChatView/ChatView.tsx b/src/components/ChatView/ChatView.tsx index 6fa14b6cfe..00283afa38 100644 --- a/src/components/ChatView/ChatView.tsx +++ b/src/components/ChatView/ChatView.tsx @@ -33,7 +33,9 @@ export const ChatView = ({ children }: PropsWithChildren) => { return ( -
{children}
+
+ {children} +
); }; diff --git a/src/components/Dialog/DialogPortal.tsx b/src/components/Dialog/DialogPortal.tsx index e9bb63de7f..aa814abacc 100644 --- a/src/components/Dialog/DialogPortal.tsx +++ b/src/components/Dialog/DialogPortal.tsx @@ -1,6 +1,6 @@ -import React, { PropsWithChildren, useLayoutEffect, useState } from 'react'; -import { createPortal } from 'react-dom'; +import React, { PropsWithChildren, useCallback } from 'react'; import { useDialogIsOpen, useOpenedDialogCount } from './hooks'; +import { Portal } from '../Portal/Portal'; import { useDialogManager } from '../../context'; export const DialogPortalDestination = () => { @@ -32,16 +32,15 @@ export const DialogPortalEntry = ({ }: PropsWithChildren) => { const { dialogManager } = useDialogManager(); const dialogIsOpen = useDialogIsOpen(dialogId); - const [portalDestination, setPortalDestination] = useState(null); - useLayoutEffect(() => { - const destination = document.querySelector( - `div[data-str-chat__portal-id="${dialogManager.id}"]`, - ); - if (!destination) return; - setPortalDestination(destination); - }, [dialogManager, dialogIsOpen]); - if (!portalDestination) return null; + const getPortalDestination = useCallback( + () => document.querySelector(`div[data-str-chat__portal-id="${dialogManager.id}"]`), + [dialogManager.id], + ); - return createPortal(children, portalDestination); + return ( + + {children} + + ); }; diff --git a/src/components/DragAndDrop/DragAndDropContainer.tsx b/src/components/DragAndDrop/DragAndDropContainer.tsx new file mode 100644 index 0000000000..2d6ebac132 --- /dev/null +++ b/src/components/DragAndDrop/DragAndDropContainer.tsx @@ -0,0 +1,139 @@ +import React, { PropsWithChildren, useEffect, useState } from 'react'; +import clsx from 'clsx'; + +export type DragAndDropContainerProps = PropsWithChildren<{ + className?: string; + draggable?: boolean; + onSetNewOrder?: (newOrder: number[]) => void; +}>; + +export const DragAndDropContainer = ({ + children, + className, + draggable, + onSetNewOrder, +}: DragAndDropContainerProps) => { + const [order, setOrder] = useState([]); + const [dragStartIndex, setDragStartIndex] = useState(null); + const [dragOverIndex, setDragOverIndex] = useState(null); + const [container, setContainer] = useState(null); + + const moveDirection = + dragStartIndex === null || dragOverIndex === null + ? undefined + : dragStartIndex <= dragOverIndex + ? 'down' + : 'up'; + + const childrenArray = React.Children.toArray(children); + + useEffect(() => { + setOrder(React.Children.map(children, (_, index) => index) || []); + }, [children]); + + useEffect(() => { + if (!container) return; + + const handleDragStart = (e: DragEvent) => { + const target = e.target as HTMLElement; + const draggableItem = target.closest('.str-chat__drag-and-drop-container__item'); + if (e.dataTransfer) { + e.dataTransfer.effectAllowed = 'move'; + } + + if (draggableItem instanceof HTMLElement) { + const index = Array.from(draggableItem.parentElement?.children || []).indexOf( + draggableItem, + ); + setDragStartIndex(index); + e.dataTransfer?.setData('text/plain', index.toString()); + draggableItem.style.opacity = '0.3'; + } + }; + + const handleDragOver = (e: DragEvent) => { + e.preventDefault(); + const target = e.target as HTMLElement; + const draggableItem = target.closest('.str-chat__drag-and-drop-container__item'); + if (draggableItem instanceof HTMLElement) { + const index = Array.from(draggableItem.parentElement?.children || []).indexOf( + draggableItem, + ); + setDragOverIndex(index); + } + }; + + const handleDragLeave = () => { + setDragOverIndex(null); + }; + + const handleDrop = (e: DragEvent) => { + e.preventDefault(); + const draggedIndex = parseInt(e.dataTransfer?.getData('text/plain') || '-1', 10); + const target = e.target as HTMLElement; + const draggableItem = target.closest('.str-chat__drag-and-drop-container__item'); + if (draggableItem instanceof HTMLElement) { + const dropIndex = Array.from(draggableItem.parentElement?.children || []).indexOf( + draggableItem, + ); + if (draggedIndex !== -1 && draggedIndex !== dropIndex) { + setOrder((prevOrder) => { + const newOrder = [...prevOrder]; + const [removed] = newOrder.splice(draggedIndex, 1); + newOrder.splice(dropIndex, 0, removed); + onSetNewOrder?.(newOrder); + return newOrder; + }); + } + } + setDragStartIndex(null); + setDragOverIndex(null); + }; + + const handleDragEnd = (e: DragEvent) => { + const target = e.target as HTMLElement; + if (target instanceof HTMLElement) { + target.style.opacity = ''; + } + setDragStartIndex(null); + setDragOverIndex(null); + }; + + container.addEventListener('dragstart', handleDragStart); + container.addEventListener('dragover', handleDragOver); + container.addEventListener('dragleave', handleDragLeave); + container.addEventListener('drop', handleDrop); + container.addEventListener('dragend', handleDragEnd); + + return () => { + container.removeEventListener('dragstart', handleDragStart); + container.removeEventListener('dragover', handleDragOver); + container.removeEventListener('dragleave', handleDragLeave); + container.removeEventListener('drop', handleDrop); + container.removeEventListener('dragend', handleDragEnd); + }; + }, [container, onSetNewOrder]); + + return ( +
+ {order.map((originalIndex, currentIndex) => { + const child = childrenArray[originalIndex]; + return ( +
+ {child} +
+ ); + })} +
+ ); +}; diff --git a/src/components/Form/SwitchField.tsx b/src/components/Form/SwitchField.tsx new file mode 100644 index 0000000000..3b6a6067ac --- /dev/null +++ b/src/components/Form/SwitchField.tsx @@ -0,0 +1,47 @@ +import clsx from 'clsx'; +import React, { + ComponentProps, + ElementRef, + KeyboardEventHandler, + PropsWithChildren, + useRef, +} from 'react'; + +export type SwitchFieldProps = PropsWithChildren>; + +export const SwitchField = ({ children, ...props }: SwitchFieldProps) => { + const inputRef = useRef>(null); + const handleKeyUp: KeyboardEventHandler = (event) => { + if (![' ', 'Enter'].includes(event.key) || !inputRef.current) return; + event.preventDefault(); + inputRef.current.click(); + }; + + return ( +
+
); }; diff --git a/src/components/MessageInput/hooks/useSubmitHandler.ts b/src/components/MessageInput/hooks/useSubmitHandler.ts index 188780bfcf..5df169afd7 100644 --- a/src/components/MessageInput/hooks/useSubmitHandler.ts +++ b/src/components/MessageInput/hooks/useSubmitHandler.ts @@ -65,7 +65,13 @@ export const useSubmitHandler = < trimmedMessage === '__' || trimmedMessage === '****'; - if (isEmptyMessage && numberOfUploads === 0 && attachments.length === 0) return; + if ( + isEmptyMessage && + numberOfUploads === 0 && + attachments.length === 0 && + !customMessageData?.poll_id + ) + return; const someAttachmentsUploading = attachments.some( (att) => att.localMetadata?.uploadState === 'uploading', ); diff --git a/src/components/Modal/ModalHeader.tsx b/src/components/Modal/ModalHeader.tsx new file mode 100644 index 0000000000..6bb84591ea --- /dev/null +++ b/src/components/Modal/ModalHeader.tsx @@ -0,0 +1,17 @@ +import React from 'react'; +import clsx from 'clsx'; + +export type ModalHeaderProps = { + title: string; + className?: string; + close?: () => void; + goBack?: () => void; +}; + +export const ModalHeader = ({ className, close, goBack, title }: ModalHeaderProps) => ( +
+ {goBack &&
+); diff --git a/src/components/Poll/PollActions.tsx b/src/components/Poll/PollActions.tsx index 06675fc66f..00bcf8b298 100644 --- a/src/components/Poll/PollActions.tsx +++ b/src/components/Poll/PollActions.tsx @@ -92,7 +92,7 @@ export const PollActions = < openModal={() => setModalOpen('suggest-option')} > - className='str-chat__modal__suggest-poll-option' + className='str-chat__prompt-dialog str-chat__modal__suggest-poll-option' close={closeModal} fields={{ optionText: { @@ -123,7 +123,7 @@ export const PollActions = < openModal={() => setModalOpen('add-comment')} > - className='str-chat__modal__poll-add-comment' + className='str-chat__prompt-dialog str-chat__modal__poll-add-comment' close={closeModal} fields={{ comment: { diff --git a/src/components/Poll/PollHeader.tsx b/src/components/Poll/PollHeader.tsx index fecb9eb090..3597054b15 100644 --- a/src/components/Poll/PollHeader.tsx +++ b/src/components/Poll/PollHeader.tsx @@ -1,36 +1,42 @@ import React, { useMemo } from 'react'; import { usePollState } from './hooks'; import { useTranslationContext } from '../../context'; -import type { PollState } from 'stream-chat'; +import type { PollOption, PollState } from 'stream-chat'; import type { DefaultStreamChatGenerics } from '../../types'; -type PollStateSelectorReturnValue = [boolean, boolean | undefined, number, string]; +type PollStateSelectorReturnValue< + StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics +> = [boolean, boolean | undefined, number, string, PollOption[]]; const pollStateSelector = < StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics >( nextValue: PollState, -): PollStateSelectorReturnValue => [ +): PollStateSelectorReturnValue => [ nextValue.enforce_unique_vote, nextValue.is_closed, nextValue.max_votes_allowed, nextValue.name, + nextValue.options, ]; export const PollHeader = < StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics >() => { const { t } = useTranslationContext('PollHeader'); - const [enforce_unique_vote, is_closed, max_votes_allowed, name] = usePollState< - PollStateSelectorReturnValue, + const [enforce_unique_vote, is_closed, max_votes_allowed, name, options] = usePollState< + PollStateSelectorReturnValue, StreamChatGenerics >(pollStateSelector); const selectionInstructions = useMemo(() => { if (is_closed) return t('Vote ended'); if (enforce_unique_vote) return t('Select one'); - if (max_votes_allowed) return t('Select up to {{count}}', { count: max_votes_allowed }); + if (max_votes_allowed) + return t('Select up to {{count}}', { + count: max_votes_allowed > options.length ? options.length : max_votes_allowed, + }); return t('Select one or more'); - }, [is_closed, enforce_unique_vote, max_votes_allowed, t]); + }, [is_closed, enforce_unique_vote, max_votes_allowed, options.length, t]); if (!name) return; diff --git a/src/components/Poll/PollOptionSelector.tsx b/src/components/Poll/PollOptionSelector.tsx index 0ace60141f..be14a6b37c 100644 --- a/src/components/Poll/PollOptionSelector.tsx +++ b/src/components/Poll/PollOptionSelector.tsx @@ -38,7 +38,6 @@ type PollStateSelectorReturnValue< Record[]>, string[], Record, - number, Record, ]; const pollStateSelector = < @@ -50,7 +49,6 @@ const pollStateSelector = < nextValue.latest_votes_by_option, nextValue.maxVotedOptionIds, nextValue.ownVotesByOptionId, - nextValue.vote_count, nextValue.vote_counts_by_option, ]; @@ -79,11 +77,11 @@ export const PollOptionSelector = < latest_votes_by_option, maxVotedOptionIds, ownVotesByOptionId, - vote_count, vote_counts_by_option, ] = usePollState(pollStateSelector); const poll = usePoll(); const canCastVote = channelCapabilities['cast-poll-vote'] && !is_closed; + const winningOptionCount = maxVotedOptionIds[0] ? vote_counts_by_option[maxVotedOptionIds[0]] : 0; return (
{ + // todo: throttle if (!canCastVote) return; const haveVotedForTheOption = !!ownVotesByOptionId[option.id]; return haveVotedForTheOption @@ -124,7 +123,9 @@ export const PollOptionSelector = <
void; - goBack?: () => void; -}; - -export const ModalHeader = ({ className, close, goBack, title }: ModalHeaderProps) => ( -
- {goBack &&
-); diff --git a/src/components/Poll/modals/PollAnswersList.tsx b/src/components/Poll/modals/PollAnswersList.tsx index 2d82830fab..e5028f5d06 100644 --- a/src/components/Poll/modals/PollAnswersList.tsx +++ b/src/components/Poll/modals/PollAnswersList.tsx @@ -1,5 +1,5 @@ import React from 'react'; -import { ModalHeader } from './ModalHeader'; +import { ModalHeader } from '../../Modal/ModalHeader'; import { PollVote } from '../PollVote'; import { usePollAnswersPagination } from '../hooks'; import { InfiniteScrollPaginator } from '../../InfiniteScrollPaginator/InfiniteScrollPaginator'; diff --git a/src/components/Poll/modals/PollCreationDialog.tsx b/src/components/Poll/modals/PollCreationDialog.tsx new file mode 100644 index 0000000000..7777a09658 --- /dev/null +++ b/src/components/Poll/modals/PollCreationDialog.tsx @@ -0,0 +1,162 @@ +import clsx from 'clsx'; +import { nanoid } from 'nanoid'; +import React, { useState } from 'react'; +import { FieldError } from './PollCreationDialog/FieldError'; +import { OptionFieldSet } from './PollCreationDialog/OptionFieldSet'; +import { ModalHeader } from '../../Modal/ModalHeader'; +import { SimpleSwitchField } from '../../Form/SwitchField'; +import { useChatContext, useTranslationContext } from '../../../context'; + +import type { VotingVisibility } from 'stream-chat'; +import type { OptionErrors, PollFormState } from './PollCreationDialog/types'; +import { PollCreationDialogControls } from './PollCreationDialog/PollCreationDialogControls'; +import { VALID_MAX_VOTES_VALUE_REGEX } from '../constants'; + +export type PollCreationDialogProps = { + close: () => void; +}; + +export const PollCreationDialog = ({ close }: PollCreationDialogProps) => { + const { client } = useChatContext(); + const { t } = useTranslationContext('PollCreationDialog'); + + const [nameError, setNameError] = useState(); + const [optionsErrors, setOptionsErrors] = useState({}); + const [multipleAnswerCountError, setMultipleAnswerCountError] = useState(); + const [state, setState] = useState( + () => + ({ + allow_answers: false, + allow_user_suggested_options: false, + description: '', + enforce_unique_vote: true, + id: nanoid(), + max_votes_allowed: '', + name: '', + options: [{ id: nanoid(), text: '' }], + user_id: client.user?.id, + voting_visibility: 'public', + } as PollFormState), + ); + + return ( +
+ ('Create poll')} /> +
+
+
+ +
+ + { + if (!e.target.value) { + setNameError('The field is required'); + } + }} + onChange={(e) => { + setState((prev) => ({ ...prev, name: e.target.value })); + if (nameError && e.target.value) { + setNameError(undefined); + } + }} + placeholder={t('Ask a question')} + type='text' + value={state.name} + /> +
+
+ +
+ ('Multiple answers')} + onChange={(e) => { + setState((prev) => ({ + ...prev, + enforce_unique_vote: !e.target.checked, + max_votes_allowed: '', + })); + setMultipleAnswerCountError( + e.target.checked ? t('Type a number from 2 to 10') : undefined, + ); + }} + /> + {!state.enforce_unique_vote && ( + <> + + { + const isValidValue = + !e.target.value || e.target.value.match(VALID_MAX_VOTES_VALUE_REGEX); + if (!isValidValue) { + setMultipleAnswerCountError(t('Type a number from 2 to 10')); + } else if (multipleAnswerCountError) { + setMultipleAnswerCountError(undefined); + } + setState((prev) => ({ ...prev, max_votes_allowed: e.target.value })); + }} + placeholder={t('Maximum number of votes (from 2 to 10)')} + type='text' + value={state.max_votes_allowed} + /> + + )} +
+ ('Anonymous poll')} + onChange={(e) => + setState((prev) => ({ + ...prev, + voting_visibility: (e.target.checked ? 'anonymous' : 'public') as VotingVisibility, + })) + } + /> + ('Allow option suggestion')} + onChange={(e) => + setState((prev) => ({ ...prev, allow_user_suggested_options: e.target.checked })) + } + /> + ('Allow comments')} + onChange={(e) => setState((prev) => ({ ...prev, allow_answers: e.target.checked }))} + /> + +
+ +
+ ); +}; diff --git a/src/components/Poll/modals/PollCreationDialog/FieldError.tsx b/src/components/Poll/modals/PollCreationDialog/FieldError.tsx new file mode 100644 index 0000000000..abaf48ced3 --- /dev/null +++ b/src/components/Poll/modals/PollCreationDialog/FieldError.tsx @@ -0,0 +1,8 @@ +import clsx from 'clsx'; +import React from 'react'; + +type FieldErrorProps = { + text?: string; +}; +export const FieldError = ({ text }: FieldErrorProps) => + text ?
{text}
: null; diff --git a/src/components/Poll/modals/PollCreationDialog/OptionFieldSet.tsx b/src/components/Poll/modals/PollCreationDialog/OptionFieldSet.tsx new file mode 100644 index 0000000000..68be33aef9 --- /dev/null +++ b/src/components/Poll/modals/PollCreationDialog/OptionFieldSet.tsx @@ -0,0 +1,114 @@ +// @ts-nocheck +import clsx from 'clsx'; +import { MAX_POLL_OPTIONS } from '../../constants'; +import { nanoid } from 'nanoid'; +import React, { useCallback } from 'react'; +import { FieldError } from './FieldError'; +import { DragAndDropContainer } from '../../../DragAndDrop/DragAndDropContainer'; +import { useTranslationContext } from '../../../../context'; +import type { OptionErrors, PollFormState, PollOptionFormData } from './types'; + +const VALIDATION_ERRORS = ({ 'Option already exists': true } as const) as Record; + +export type OptionFieldSetProps = { + errors: OptionErrors; + options: PollFormState['options']; + setErrors: (fn: (prev: OptionErrors) => OptionErrors) => void; + setState: (fn: (prev: PollFormState) => PollFormState) => void; +}; + +export const OptionFieldSet = ({ errors, options, setErrors, setState }: OptionFieldSetProps) => { + const { t } = useTranslationContext('OptionFieldSet'); + + const findOptionDuplicate = (sourceOption: PollOptionFormData) => { + const isDuplicateFilter = (option: PollOptionFormData) => + !!sourceOption.text.trim() && // do not include empty options into consideration + option.id !== sourceOption.id && + option.text.trim() === sourceOption.text.trim(); + + return options.find(isDuplicateFilter); + }; + + const onSetNewOrder = useCallback( + (newOrder: number[]) => { + setState((prev) => ({ ...prev, options: newOrder.map((index) => prev.options[index]) })); + }, + [setState], + ); + + const draggable = options.length > 1; + + return ( +
+ {t('Options')} + + {options.map((option, i) => ( +
+
+ + { + if (findOptionDuplicate({ id: e.target.id, text: e.target.value })) { + setErrors((prev) => ({ + ...prev, + [e.target.id]: t('Option already exists'), + })); + } + }} + onChange={(e) => { + setState((prev) => { + const shouldAddEmptyOption = + prev.options.length < MAX_POLL_OPTIONS && + (!prev.options || + (prev.options.slice(i + 1).length === 0 && !!e.target.value)); + const shouldRemoveOption = + prev.options && prev.options.slice(i + 1).length > 0 && !e.target.value; + + const optionListHead = prev.options ? prev.options.slice(0, i) : []; + const optionListTail = shouldAddEmptyOption + ? [{ id: nanoid(), text: '' }] + : (prev.options || []).slice(i + 1); + + if ( + (errors[option.id] && !e.target.value) || + (VALIDATION_ERRORS[errors[option.id]] && + !findOptionDuplicate({ id: e.target.id, text: e.target.value })) + ) { + setErrors((prev) => { + delete prev[option.id]; + return prev; + }); + } + + return { + ...prev, + options: [ + ...optionListHead, + ...(shouldRemoveOption ? [] : [{ ...option, text: e.target.value }]), + ...optionListTail, + ], + }; + }); + }} + placeholder={t('Add an option')} + type='text' + value={option.text} + /> +
+ {draggable &&
} +
+ ))} + +
+ ); +}; diff --git a/src/components/Poll/modals/PollCreationDialog/PollCreationDialogControls.tsx b/src/components/Poll/modals/PollCreationDialog/PollCreationDialogControls.tsx new file mode 100644 index 0000000000..bc15487293 --- /dev/null +++ b/src/components/Poll/modals/PollCreationDialog/PollCreationDialogControls.tsx @@ -0,0 +1,76 @@ +import React from 'react'; +import { VALID_MAX_VOTES_VALUE_REGEX } from '../../constants'; +import { useChatContext, useMessageInputContext, useTranslationContext } from '../../../../context'; +import type { PollFormState } from './types'; + +export type PollCreationDialogControlsProps = { + close: () => void; + errors: string[]; + state: PollFormState; +}; + +export const PollCreationDialogControls = ({ + close, + errors, + state, +}: PollCreationDialogControlsProps) => { + const { client } = useChatContext(); + const { t } = useTranslationContext('PollCreationDialog'); + const { handleSubmit: handleSubmitMessage } = useMessageInputContext('PollCreationDialog'); + + const canSubmit = () => { + const hasAtLeastOneOption = state.options.filter((o) => !!o.text).length > 0; + const hasName = !!state.name; + const maxVotesAllowed = parseInt( + state.max_votes_allowed?.match(VALID_MAX_VOTES_VALUE_REGEX)?.[0] || '', + ); + const hasValidVoteLimit = + state.enforce_unique_vote || + (maxVotesAllowed && (2 <= maxVotesAllowed || maxVotesAllowed <= 10)); + + const noErrors = errors.length === 0; + + return hasAtLeastOneOption && hasName && hasValidVoteLimit && noErrors; + }; + + return ( +
+ + +
+ ); +}; diff --git a/src/components/Poll/modals/PollCreationDialog/types.ts b/src/components/Poll/modals/PollCreationDialog/types.ts new file mode 100644 index 0000000000..25c1734ed0 --- /dev/null +++ b/src/components/Poll/modals/PollCreationDialog/types.ts @@ -0,0 +1,24 @@ +import type { VotingVisibility } from 'stream-chat'; + +type Id = string; + +export type PollOptionFormData = { + id: Id; + text: string; +}; + +export type PollFormState = { + id: Id; + max_votes_allowed: string; + name: string; + options: PollOptionFormData[]; + allow_answers?: boolean; + allow_user_suggested_options?: boolean; + description?: string; + enforce_unique_vote?: boolean; + is_closed?: boolean; + user_id?: string; + voting_visibility?: VotingVisibility; +}; + +export type OptionErrors = Record; diff --git a/src/components/Poll/modals/PollOptionsFullList.tsx b/src/components/Poll/modals/PollOptionsFullList.tsx index 5c7709627d..b3971ddb6b 100644 --- a/src/components/Poll/modals/PollOptionsFullList.tsx +++ b/src/components/Poll/modals/PollOptionsFullList.tsx @@ -1,5 +1,5 @@ import React from 'react'; -import { ModalHeader } from './ModalHeader'; +import { ModalHeader } from '../../Modal/ModalHeader'; import { usePollState } from '../hooks'; import { PollOptionList } from '../PollOptionList'; import { useTranslationContext } from '../../../context'; diff --git a/src/components/Poll/modals/PollResults/PollResults.tsx b/src/components/Poll/modals/PollResults/PollResults.tsx index 1bc5fb504c..4670d22cd1 100644 --- a/src/components/Poll/modals/PollResults/PollResults.tsx +++ b/src/components/Poll/modals/PollResults/PollResults.tsx @@ -1,6 +1,6 @@ import clsx from 'clsx'; import React, { useCallback, useState } from 'react'; -import { ModalHeader } from '../ModalHeader'; +import { ModalHeader } from '../../../Modal/ModalHeader'; import { PollOptionVotesList } from './PollOptionVotesList'; import { PollOptionWithLatestVotes } from './PollOptionWithLatestVotes'; import { usePollState } from '../../hooks'; @@ -21,6 +21,7 @@ export type PollResultsProps = { close?: () => void; }; +// todo: sort options by vote count export const PollResults = < StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics >({ diff --git a/src/components/Portal/Portal.ts b/src/components/Portal/Portal.ts new file mode 100644 index 0000000000..763f85b967 --- /dev/null +++ b/src/components/Portal/Portal.ts @@ -0,0 +1,24 @@ +import { PropsWithChildren, useLayoutEffect, useState } from 'react'; +import { createPortal } from 'react-dom'; + +export type PortalProps = { + getPortalDestination: () => Element | null; + isOpen?: boolean; +}; + +export const Portal = ({ + children, + getPortalDestination, + isOpen, +}: PropsWithChildren) => { + const [portalDestination, setPortalDestination] = useState(null); + useLayoutEffect(() => { + const destination = getPortalDestination(); + if (!destination || !isOpen) return; + setPortalDestination(destination); + }, [getPortalDestination, isOpen]); + + if (!portalDestination) return null; + + return createPortal(children, portalDestination); +}; diff --git a/src/context/ComponentContext.tsx b/src/context/ComponentContext.tsx index aa2b46f738..ad04543ed1 100644 --- a/src/context/ComponentContext.tsx +++ b/src/context/ComponentContext.tsx @@ -50,7 +50,6 @@ import type { import type { MessageBouncePromptProps } from '../components/MessageBounce'; import type { TimestampProps } from '../components/Message/Timestamp'; import type { CustomTrigger, DefaultStreamChatGenerics, UnknownType } from '../types/types'; -import { AttachmentSelectorProps } from '../components/MessageInput/AttachmentSelector'; export type ComponentContextValue< StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics, @@ -58,7 +57,7 @@ export type ComponentContextValue< > = { Attachment?: React.ComponentType>; AttachmentPreviewList?: React.ComponentType; - AttachmentSelector?: React.ComponentType; + AttachmentSelector?: React.ComponentType; AudioRecorder?: React.ComponentType; AutocompleteSuggestionItem?: React.ComponentType>; AutocompleteSuggestionList?: React.ComponentType>; diff --git a/src/types/types.ts b/src/types/types.ts index 7fd6c54f98..d83cf4ad14 100644 --- a/src/types/types.ts +++ b/src/types/types.ts @@ -161,3 +161,7 @@ export type Readable = { export type ValuesType = T[keyof T]; export type PartialSelected = Omit & Partial>; + +export type DeepRequired = { + [K in keyof T]-?: T[K] extends object ? DeepRequired : T[K]; +}; From b900256a540876657e38000d11146a1e4d7bc9ae Mon Sep 17 00:00:00 2001 From: martincupela Date: Tue, 15 Oct 2024 12:19:45 +0200 Subject: [PATCH 05/71] fix: reflect WS events in vote and answers listings --- .../hooks/useCursorPaginator.ts | 65 +++++++++++------ .../Poll/hooks/useManagePollVotesRealtime.ts | 71 +++++++++++++++++++ .../Poll/hooks/usePollAnswersPagination.ts | 24 +++++-- .../hooks/usePollOptionVotesPagination.ts | 22 ++++-- .../Poll/modals/PollAnswersList.tsx | 17 ++++- src/components/Portal/Portal.ts | 1 + 6 files changed, 165 insertions(+), 35 deletions(-) create mode 100644 src/components/Poll/hooks/useManagePollVotesRealtime.ts diff --git a/src/components/InfiniteScrollPaginator/hooks/useCursorPaginator.ts b/src/components/InfiniteScrollPaginator/hooks/useCursorPaginator.ts index 32d2ebb83c..3adb06f10d 100644 --- a/src/components/InfiniteScrollPaginator/hooks/useCursorPaginator.ts +++ b/src/components/InfiniteScrollPaginator/hooks/useCursorPaginator.ts @@ -1,42 +1,61 @@ import uniqBy from 'lodash.uniqby'; -import { useCallback, useEffect, useRef, useState } from 'react'; +import { useCallback, useEffect, useMemo } from 'react'; +import { StateStore } from 'stream-chat'; + +export type CursorPaginatorState = { + hasNextPage: boolean; + items: T[]; + latestPageItems: T[]; + loading: boolean; + error?: Error; + next?: string | null; +}; + +export type CursorPaginatorStateStore = StateStore>; export type PaginationFn = (next?: string) => Promise<{ items: T[]; next?: string }>; export const useCursorPaginator = (paginationFn: PaginationFn, loadFirstPage?: boolean) => { - const [items, setItems] = useState([]); - const [loading, setLoading] = useState(false); - const [error, setError] = useState(); - const cursorRef = useRef(); - const queryInProgress = useRef(false); + const cursorPaginatorState = useMemo( + () => + new StateStore>({ + hasNextPage: true, + items: [], + latestPageItems: [], + loading: false, + }), + [], + ); const loadMore = useCallback(async () => { - if (cursorRef.current === null || queryInProgress.current) return; + const { loading, next: currentNext } = cursorPaginatorState.getLatestValue(); + if (currentNext === null || loading) return; + + cursorPaginatorState.partialNext({ loading: true }); - setLoading(true); - queryInProgress.current = true; try { - const { items, next } = await paginationFn(cursorRef.current); - cursorRef.current = next || null; - setItems((prev) => uniqBy([...prev, ...items], 'id')); - } catch (e) { - setError(e as Error); + const { items, next } = await paginationFn(currentNext); + cursorPaginatorState.next((prev) => ({ + ...prev, + hasNextPage: next !== null, + items: uniqBy(prev.items.concat(items), 'id'), + latestPageItems: items, + next: next || null, + })); + } catch (error) { + cursorPaginatorState.partialNext({ error: error as Error }); } - queryInProgress.current = false; - setLoading(false); - }, [paginationFn]); + cursorPaginatorState.partialNext({ loading: false }); + }, [cursorPaginatorState, paginationFn]); useEffect(() => { + const { items } = cursorPaginatorState.getLatestValue(); if (!loadFirstPage || items.length) return; loadMore(); - }, [loadFirstPage, loadMore, items]); + }, [cursorPaginatorState, loadFirstPage, loadMore]); return { - error, - hasNextPage: cursorRef.current !== null, - items, - loading, + cursorPaginatorState, loadMore, - next: cursorRef.current, }; }; diff --git a/src/components/Poll/hooks/useManagePollVotesRealtime.ts b/src/components/Poll/hooks/useManagePollVotesRealtime.ts new file mode 100644 index 0000000000..68ca7f6e08 --- /dev/null +++ b/src/components/Poll/hooks/useManagePollVotesRealtime.ts @@ -0,0 +1,71 @@ +import { useEffect, useState } from 'react'; +import { isVoteAnswer } from 'stream-chat'; +import { useChatContext } from '../../../context'; +import type { Event, PollAnswer, PollVote } from 'stream-chat'; +import type { DefaultStreamChatGenerics } from '../../../types'; +import { CursorPaginatorStateStore } from '../../InfiniteScrollPaginator/hooks/useCursorPaginator'; + +export function useManagePollVotesRealtime< + StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics, + T extends + | PollVote + | PollAnswer = PollVote +>( + managedVoteType: 'answer' | 'vote', + cursorPaginatorState?: CursorPaginatorStateStore, + optionId?: string, +) { + const { client } = useChatContext(); + const [votesInRealtime, setVotesInRealtime] = useState( + cursorPaginatorState?.getLatestValue().items ?? [], + ); + + useEffect( + () => + cursorPaginatorState?.subscribeWithSelector( + (state) => [state.latestPageItems], + ([latestPageItems]) => setVotesInRealtime((prev) => [...prev, ...latestPageItems]), + ), + [cursorPaginatorState], + ); + + useEffect(() => { + const handleVoteEvent = (event: Event) => { + if (!event.poll_vote) return; + const isAnswer = isVoteAnswer(event.poll_vote); + if ( + (managedVoteType === 'answer' && !isAnswer) || + (managedVoteType === 'vote' && (isAnswer || event.poll_vote.option_id !== optionId)) + ) + return; + + if (event.type === 'poll.vote_removed') { + setVotesInRealtime((prev) => + event.poll_vote ? prev.filter((vote) => vote.id !== (event.poll_vote as T).id) : prev, + ); + } + if (event.type === 'poll.vote_changed') { + setVotesInRealtime((prev) => + event.poll_vote + ? prev.filter((vote) => vote.user_id !== (event.poll_vote as T).user_id) + : prev, + ); + } + if (['poll.vote_casted', 'poll.vote_changed'].includes(event.type)) { + setVotesInRealtime((prev) => (event.poll_vote ? [event.poll_vote as T, ...prev] : prev)); + } + }; + + const voteCastedSubscription = client.on('poll.vote_casted', handleVoteEvent); + const voteRemovedSubscription = client.on('poll.vote_removed', handleVoteEvent); + const voteChangedSubscription = client.on('poll.vote_changed', handleVoteEvent); + + return () => { + voteCastedSubscription.unsubscribe(); + voteRemovedSubscription.unsubscribe(); + voteChangedSubscription.unsubscribe(); + }; + }, [client, optionId, managedVoteType]); + + return votesInRealtime; +} diff --git a/src/components/Poll/hooks/usePollAnswersPagination.ts b/src/components/Poll/hooks/usePollAnswersPagination.ts index fc98dad99d..8e36939145 100644 --- a/src/components/Poll/hooks/usePollAnswersPagination.ts +++ b/src/components/Poll/hooks/usePollAnswersPagination.ts @@ -1,12 +1,21 @@ import { useCallback } from 'react'; +import { useManagePollVotesRealtime } from './useManagePollVotesRealtime'; import { + CursorPaginatorState, PaginationFn, useCursorPaginator, } from '../../InfiniteScrollPaginator/hooks/useCursorPaginator'; import { usePollContext } from '../../../context'; import type { DefaultStreamChatGenerics } from '../../../types'; -import type { PollAnswer, PollAnswersQueryParams } from 'stream-chat'; +import type { PollAnswer, PollAnswersQueryParams, PollVote } from 'stream-chat'; +import { useStateStore } from '../../../store'; + +const paginationStateSelector = < + StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics +>( + state: CursorPaginatorState>, +): [Error | undefined, boolean, boolean] => [state.error, state.hasNextPage, state.loading]; type UsePollAnswersPaginationParams = { paginationParams?: PollAnswersQueryParams; @@ -29,16 +38,21 @@ export const usePollAnswersPagination = < [paginationParams, poll], ); - const { error, hasNextPage, items: pollAnswers, loading, loadMore } = useCursorPaginator( - paginationFn, - true, + const { cursorPaginatorState, loadMore } = useCursorPaginator(paginationFn, true); + const answers = useManagePollVotesRealtime>( + 'answer', + cursorPaginatorState, + ); + const [error, hasNextPage, loading] = useStateStore( + cursorPaginatorState, + paginationStateSelector, ); return { + answers, error, hasNextPage, loading, loadMore, - pollAnswers, }; }; diff --git a/src/components/Poll/hooks/usePollOptionVotesPagination.ts b/src/components/Poll/hooks/usePollOptionVotesPagination.ts index a68ed45572..af12918bd3 100644 --- a/src/components/Poll/hooks/usePollOptionVotesPagination.ts +++ b/src/components/Poll/hooks/usePollOptionVotesPagination.ts @@ -1,12 +1,21 @@ import { useCallback } from 'react'; import { usePoll } from './usePoll'; +import { useManagePollVotesRealtime } from './useManagePollVotesRealtime'; import { + CursorPaginatorState, PaginationFn, useCursorPaginator, } from '../../InfiniteScrollPaginator/hooks/useCursorPaginator'; import type { DefaultStreamChatGenerics } from '../../../types'; import type { PollOptionVotesQueryParams, PollVote } from 'stream-chat'; +import { useStateStore } from '../../../store'; + +const paginationStateSelector = < + StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics +>( + state: CursorPaginatorState>, +): [Error | undefined, boolean, boolean] => [state.error, state.hasNextPage, state.loading]; type UsePollOptionVotesPaginationParams = { paginationParams: PollOptionVotesQueryParams; @@ -31,9 +40,15 @@ export const usePollOptionVotesPagination = < [paginationParams, poll], ); - const { error, hasNextPage, items: votes, loading, loadMore, next } = useCursorPaginator( - paginationFn, - true, + const { cursorPaginatorState, loadMore } = useCursorPaginator(paginationFn, true); + const votes = useManagePollVotesRealtime>( + 'vote', + cursorPaginatorState, + paginationParams.filter.option_id, + ); + const [error, hasNextPage, loading] = useStateStore( + cursorPaginatorState, + paginationStateSelector, ); return { @@ -41,7 +56,6 @@ export const usePollOptionVotesPagination = < hasNextPage, loading, loadMore, - next, votes, }; }; diff --git a/src/components/Poll/modals/PollAnswersList.tsx b/src/components/Poll/modals/PollAnswersList.tsx index e5028f5d06..c7250fd8f6 100644 --- a/src/components/Poll/modals/PollAnswersList.tsx +++ b/src/components/Poll/modals/PollAnswersList.tsx @@ -5,14 +5,25 @@ import { usePollAnswersPagination } from '../hooks'; import { InfiniteScrollPaginator } from '../../InfiniteScrollPaginator/InfiniteScrollPaginator'; import { LoadingIndicator } from '../../Loading'; import { useTranslationContext } from '../../../context'; +import type { DefaultStreamChatGenerics } from '../../../types'; export type PollAnswersListProps = { close?: () => void; }; -export const PollAnswersList = ({ close }: PollAnswersListProps) => { +export const PollAnswersList = < + StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics +>({ + close, +}: PollAnswersListProps) => { const { t } = useTranslationContext(); - const { error, hasNextPage, loading, loadMore, pollAnswers } = usePollAnswersPagination(); + const { + answers, + error, + hasNextPage, + loading, + loadMore, + } = usePollAnswersPagination(); return (
@@ -20,7 +31,7 @@ export const PollAnswersList = ({ close }: PollAnswersListProps) => {
- {pollAnswers.map((answer) => ( + {answers.map((answer) => (
{answer.answer_text && (

{answer.answer_text}

diff --git a/src/components/Portal/Portal.ts b/src/components/Portal/Portal.ts index 763f85b967..92eb19676f 100644 --- a/src/components/Portal/Portal.ts +++ b/src/components/Portal/Portal.ts @@ -12,6 +12,7 @@ export const Portal = ({ isOpen, }: PropsWithChildren) => { const [portalDestination, setPortalDestination] = useState(null); + useLayoutEffect(() => { const destination = getPortalDestination(); if (!destination || !isOpen) return; From 5c3f39030b97f69916af7daa7d7290f8c231a0b7 Mon Sep 17 00:00:00 2001 From: martincupela Date: Tue, 15 Oct 2024 14:29:10 +0200 Subject: [PATCH 06/71] feat: support poll info in latest message message preview --- src/components/ChannelPreview/utils.tsx | 47 ++++++++++++++++++++++++- 1 file changed, 46 insertions(+), 1 deletion(-) diff --git a/src/components/ChannelPreview/utils.tsx b/src/components/ChannelPreview/utils.tsx index 1aaa77672b..1bf1e3b290 100644 --- a/src/components/ChannelPreview/utils.tsx +++ b/src/components/ChannelPreview/utils.tsx @@ -2,7 +2,7 @@ import React from 'react'; import ReactMarkdown from 'react-markdown'; -import type { Channel, TranslationLanguages, UserResponse } from 'stream-chat'; +import type { Channel, PollVote, TranslationLanguages, UserResponse } from 'stream-chat'; import type { TranslationContextValue } from '../../context/TranslationContext'; @@ -10,6 +10,22 @@ import type { DefaultStreamChatGenerics } from '../../types/types'; export const renderPreviewText = (text: string) => {text}; +const getLatestPollVote = < + StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics +>( + latestVotesByOption: Record[]>, +) => { + let latestVote: PollVote | undefined; + for (const optionVotes of Object.values(latestVotesByOption)) { + optionVotes.forEach((vote) => { + if (latestVote && new Date(latestVote.updated_at) >= new Date(vote.created_at)) return; + latestVote = vote; + }); + } + + return latestVote; +}; + export const getLatestMessagePreview = < StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics >( @@ -22,6 +38,7 @@ export const getLatestMessagePreview = < const previewTextToRender = latestMessage?.i18n?.[`${userLanguage}_text` as `${TranslationLanguages}_text`] || latestMessage?.text; + const { poll } = latestMessage; if (!latestMessage) { return t('Nothing yet...'); @@ -31,6 +48,34 @@ export const getLatestMessagePreview = < return t('Message deleted'); } + if (poll) { + if (!poll.vote_count) { + const createdBy = + poll.created_by?.id === channel.getClient().userID + ? t('You') + : poll.created_by?.name ?? t('Poll'); + return t('📊 {{createdBy}} created: {{ pollName}}', { + createdBy, + pollName: poll.name, + }); + } else { + const latestVote = getLatestPollVote( + poll.latest_votes_by_option as Record[]>, + ); + const option = latestVote && poll.options.find((opt) => opt.id === latestVote.option_id); + + if (option && latestVote) { + return t('📊 {{votedBy}} voted: {{pollOptionText}}', { + pollOptionText: option.text, + votedBy: + latestVote?.user?.id === channel.getClient().userID + ? t('You') + : latestVote.user?.name ?? t('Poll'), + }); + } + } + } + if (previewTextToRender) { return renderPreviewText(previewTextToRender); } From 6b13c34379a0c7fe9a33b1fc0d5f73d8752d74ee Mon Sep 17 00:00:00 2001 From: martincupela Date: Tue, 15 Oct 2024 16:56:09 +0200 Subject: [PATCH 07/71] refactor: take poll instances from client poll manager --- src/components/Chat/hooks/useChat.ts | 2 ++ src/components/Message/MessageSimple.tsx | 9 +++--- src/components/Poll/Poll.tsx | 39 ++++++++++++++++-------- src/context/PollContext.tsx | 29 ++++++------------ 4 files changed, 43 insertions(+), 36 deletions(-) diff --git a/src/components/Chat/hooks/useChat.ts b/src/components/Chat/hooks/useChat.ts index 157b38bee9..408d2c944b 100644 --- a/src/components/Chat/hooks/useChat.ts +++ b/src/components/Chat/hooks/useChat.ts @@ -66,9 +66,11 @@ export const useChat = < } client.threads.registerSubscriptions(); + client.polls.registerSubscriptions(); return () => { client.threads.unregisterSubscriptions(); + client.polls.unregisterSubscriptions(); }; }, [client]); diff --git a/src/components/Message/MessageSimple.tsx b/src/components/Message/MessageSimple.tsx index a421810d37..8d91868447 100644 --- a/src/components/Message/MessageSimple.tsx +++ b/src/components/Message/MessageSimple.tsx @@ -29,9 +29,8 @@ import { MessageBounceModal } from '../MessageBounce/MessageBounceModal'; import { useComponentContext } from '../../context/ComponentContext'; import { MessageContextValue, useMessageContext } from '../../context/MessageContext'; -import { useTranslationContext } from '../../context'; +import { useChatContext, useTranslationContext } from '../../context'; import { MessageEditedTimestamp } from './MessageEditedTimestamp'; -import type { PollResponse } from 'stream-chat'; import type { MessageUIComponentProps } from './types'; import type { DefaultStreamChatGenerics } from '../../types/types'; @@ -63,7 +62,7 @@ const MessageSimpleWithContext = < renderText, threadList, } = props; - + const { client } = useChatContext('MessageSimple'); const { t } = useTranslationContext('MessageSimple'); const [isBounceDialogOpen, setIsBounceDialogOpen] = useState(false); const [isEditedTimestampOpen, setEditedTimestampOpen] = useState(false); @@ -132,6 +131,8 @@ const MessageSimpleWithContext = < }, ); + const poll = message.poll_id && client.polls.fromState(message.poll_id); + return ( <> {editing && ( @@ -178,7 +179,7 @@ const MessageSimpleWithContext = < {hasReactions && }
- {message.poll && } />} + {poll && } {message.attachments?.length && !message.quoted_message ? ( ) : null} diff --git a/src/components/Poll/Poll.tsx b/src/components/Poll/Poll.tsx index c3825f42c4..73e4242f40 100644 --- a/src/components/Poll/Poll.tsx +++ b/src/components/Poll/Poll.tsx @@ -4,26 +4,39 @@ import { PollActions } from './PollActions'; import { PollHeader } from './PollHeader'; import { PollOptionList } from './PollOptionList'; import { MAX_OPTIONS_DISPLAYED } from './config'; +import { usePollState } from './hooks'; import { PollProvider } from '../../context'; -import type { PollResponse } from 'stream-chat'; +import type { Poll as PollClass, PollState } from 'stream-chat'; import type { DefaultStreamChatGenerics } from '../../types'; +type PollStateSelectorReturnValue = [boolean | undefined]; +const pollStateSelector = < + StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics +>( + nextValue: PollState, +): PollStateSelectorReturnValue => [nextValue.is_closed]; + +const PollUI = () => { + const [isClosed] = usePollState(pollStateSelector); + + return ( +
+ + + +
+ ); +}; + export const Poll = < StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics >({ poll, }: { - poll: PollResponse; -}) => { - if (!poll) return null; - - return ( + poll: PollClass; +}) => + poll ? ( -
- - - -
+
- ); -}; + ) : null; diff --git a/src/context/PollContext.tsx b/src/context/PollContext.tsx index 3164e1b515..d212c75768 100644 --- a/src/context/PollContext.tsx +++ b/src/context/PollContext.tsx @@ -1,8 +1,5 @@ -import React, { PropsWithChildren, useContext, useEffect, useMemo } from 'react'; -import { Poll } from 'stream-chat'; -import { useChatContext } from './ChatContext'; - -import type { PollResponse } from 'stream-chat'; +import React, { PropsWithChildren, useContext } from 'react'; +import type { Poll } from 'stream-chat'; import type { DefaultStreamChatGenerics } from '../types'; export type PollContextValue< @@ -17,21 +14,15 @@ export const PollProvider = < StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics >({ children, - poll: pollData, + poll, }: PropsWithChildren<{ - poll: PollResponse; -}>) => { - const { client } = useChatContext(); - - const poll = useMemo(() => new Poll({ client, poll: pollData }), [client, pollData]); - - useEffect(() => { - poll.registerSubscriptions(); - return poll.unregisterSubscriptions; - }, [poll]); - - return {children}; -}; + poll: Poll; +}>) => + poll ? ( + + {children} + + ) : null; export const usePollContext = < StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics From b04b6f744fd926ecdb331ae1e416b4928aac3993 Mon Sep 17 00:00:00 2001 From: martincupela Date: Wed, 16 Oct 2024 12:45:52 +0200 Subject: [PATCH 08/71] fix: check for undefined value in the next cursor --- .../InfiniteScrollPaginator/hooks/useCursorPaginator.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/InfiniteScrollPaginator/hooks/useCursorPaginator.ts b/src/components/InfiniteScrollPaginator/hooks/useCursorPaginator.ts index 3adb06f10d..68c1b4d631 100644 --- a/src/components/InfiniteScrollPaginator/hooks/useCursorPaginator.ts +++ b/src/components/InfiniteScrollPaginator/hooks/useCursorPaginator.ts @@ -37,7 +37,7 @@ export const useCursorPaginator = (paginationFn: PaginationFn, loadFirstPa const { items, next } = await paginationFn(currentNext); cursorPaginatorState.next((prev) => ({ ...prev, - hasNextPage: next !== null, + hasNextPage: !!next, items: uniqBy(prev.items.concat(items), 'id'), latestPageItems: items, next: next || null, From 22bcdcf04116de138039c8d8c55422c7b9157175 Mon Sep 17 00:00:00 2001 From: martincupela Date: Wed, 16 Oct 2024 12:46:14 +0200 Subject: [PATCH 09/71] refactor: remove unnecessary effect --- .../PollResults/PollOptionVotesList.tsx | 7 +---- .../Poll/modals/PollResults/PollResults.tsx | 30 ++++++++++++------- 2 files changed, 21 insertions(+), 16 deletions(-) diff --git a/src/components/Poll/modals/PollResults/PollOptionVotesList.tsx b/src/components/Poll/modals/PollResults/PollOptionVotesList.tsx index a34caf4135..ffdeb740c7 100644 --- a/src/components/Poll/modals/PollResults/PollOptionVotesList.tsx +++ b/src/components/Poll/modals/PollResults/PollOptionVotesList.tsx @@ -1,4 +1,4 @@ -import React, { useEffect, useMemo } from 'react'; +import React, { useMemo } from 'react'; import { PollVoteListing } from '../../PollVote'; import { usePollOptionVotesPagination } from '../../hooks'; import { LoadingIndicator } from '../../../Loading'; @@ -32,11 +32,6 @@ export const PollOptionVotesList = < paginationParams, }); - useEffect(() => { - if (votes.length) return; - loadMore(); - }, [loadMore, votes]); - return (
diff --git a/src/components/Poll/modals/PollResults/PollResults.tsx b/src/components/Poll/modals/PollResults/PollResults.tsx index 4670d22cd1..7ddf17523d 100644 --- a/src/components/Poll/modals/PollResults/PollResults.tsx +++ b/src/components/Poll/modals/PollResults/PollResults.tsx @@ -10,12 +10,16 @@ import type { DefaultStreamChatGenerics } from '../../../../types'; type PollStateSelectorReturnValue< StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics -> = [string, PollOption[]]; +> = [string, PollOption[], Record]; const pollStateSelector = < StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics >( nextValue: PollState, -): PollStateSelectorReturnValue => [nextValue.name, nextValue.options]; +): PollStateSelectorReturnValue => [ + nextValue.name, + nextValue.options, + nextValue.vote_counts_by_option, +]; export type PollResultsProps = { close?: () => void; @@ -28,7 +32,7 @@ export const PollResults = < close, }: PollResultsProps) => { const { t } = useTranslationContext(); - const [name, options] = usePollState< + const [name, options, voteCountsByOption] = usePollState< PollStateSelectorReturnValue, StreamChatGenerics >(pollStateSelector); @@ -57,13 +61,19 @@ export const PollResults = < ('Poll results')} />
{name}
- {options.map((option) => ( - setOptionToView(option)} - /> - ))} +
+ {options + .sort((current, next) => + voteCountsByOption[current.id] >= voteCountsByOption[next.id] ? -1 : 1, + ) + .map((option) => ( + setOptionToView(option)} + /> + ))} +
)} From d204f86bf14a8f4a96644eab0a5c89201d75f361 Mon Sep 17 00:00:00 2001 From: martincupela Date: Thu, 17 Oct 2024 09:51:05 +0200 Subject: [PATCH 10/71] fix: add close button to PollCreationDialog --- src/components/Poll/modals/PollCreationDialog.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/Poll/modals/PollCreationDialog.tsx b/src/components/Poll/modals/PollCreationDialog.tsx index 7777a09658..82ac0b2369 100644 --- a/src/components/Poll/modals/PollCreationDialog.tsx +++ b/src/components/Poll/modals/PollCreationDialog.tsx @@ -41,7 +41,7 @@ export const PollCreationDialog = ({ close }: PollCreationDialogProps) => { return (
- ('Create poll')} /> + ('Create poll')} />
From ac72f6979b1b5b67861432aa31fd11b45f06ef60 Mon Sep 17 00:00:00 2001 From: martincupela Date: Thu, 17 Oct 2024 12:24:38 +0200 Subject: [PATCH 11/71] refactor: attach poll creation modal to Channel container --- src/components/Channel/Channel.tsx | 79 +++++++++++-------- src/components/Channel/constants.ts | 1 + .../hooks/useChannelContainerClasses.ts | 21 +++-- src/components/ChatView/ChatView.tsx | 4 +- .../MessageInput/AttachmentSelector.tsx | 3 +- 5 files changed, 62 insertions(+), 46 deletions(-) create mode 100644 src/components/Channel/constants.ts diff --git a/src/components/Channel/Channel.tsx b/src/components/Channel/Channel.tsx index d8e86b539f..6bb437aab0 100644 --- a/src/components/Channel/Channel.tsx +++ b/src/components/Channel/Channel.tsx @@ -1,4 +1,5 @@ import React, { + ComponentProps, PropsWithChildren, useCallback, useEffect, @@ -70,7 +71,11 @@ import { } from '../../constants/limits'; import { hasMoreMessagesProbably } from '../MessageList'; -import { useChannelContainerClasses } from './hooks/useChannelContainerClasses'; +import { + getChatContainerClass, + useChannelContainerClasses, + useImageFlagEmojisOnWindowsClass, +} from './hooks/useChannelContainerClasses'; import { findInMsgSetByDate, findInMsgSetById, makeAddNotifications } from './utils'; import { getChannel } from '../../utils'; @@ -92,6 +97,7 @@ import { } from '../Attachment/attachment-sizing'; import type { URLEnrichmentConfig } from '../MessageInput/hooks/useLinkPreviews'; import { useThreadContext } from '../Threads'; +import { CHANNEL_CONTAINER_ID } from './constants'; type ChannelPropsForwardedToComponentContext< StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics @@ -238,6 +244,25 @@ export type ChannelProps< videoAttachmentSizeHandler?: VideoAttachmentSizeHandler; }; +const ChannelContainer = < + StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics +>({ + children, + className: additionalClassName, + ...props +}: PropsWithChildren>) => { + const { customClasses, theme } = useChatContext('Channel'); + const { channelClass, chatClass } = useChannelContainerClasses({ + customClasses, + }); + const className = clsx(chatClass, theme, channelClass, additionalClassName); + return ( +
+ {children} +
+ ); +}; + const UnMemoizedChannel = < StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics, V extends CustomTrigger = CustomTrigger @@ -251,38 +276,30 @@ const UnMemoizedChannel = < LoadingIndicator = DefaultLoadingIndicator, } = props; - const { - channel: contextChannel, - channelsQueryState, - customClasses, - theme, - } = useChatContext('Channel'); - const { channelClass, chatClass } = useChannelContainerClasses({ - customClasses, - }); + const { channel: contextChannel, channelsQueryState } = useChatContext( + 'Channel', + ); const channel = propsChannel || contextChannel; - const className = clsx(chatClass, theme, channelClass); - if (channelsQueryState.queryInProgress === 'reload' && LoadingIndicator) { return ( -
+ -
+ ); } if (channelsQueryState.error && LoadingErrorIndicator) { return ( -
+ -
+ ); } if (!channel?.cid) { - return
{EmptyPlaceholder}
; + return {EmptyPlaceholder}; } return ; @@ -338,16 +355,10 @@ const ChannelInner = < customClasses, latestMessageDatesByChannels, mutes, - theme, } = useChatContext('Channel'); const { t } = useTranslationContext('Channel'); - const { - channelClass, - chatClass, - chatContainerClass, - windowsEmojiClass, - } = useChannelContainerClasses({ customClasses }); - + const chatContainerClass = getChatContainerClass(customClasses?.chatContainer); + const windowsEmojiClass = useImageFlagEmojisOnWindowsClass(); const thread = useThreadContext(); const [channelConfig, setChannelConfig] = useState(channel.getConfig()); @@ -1313,34 +1324,32 @@ const ChannelInner = < typing, }); - const className = clsx(chatClass, theme, channelClass); - if (state.error) { return ( -
+ -
+ ); } if (state.loading) { return ( -
+ -
+ ); } if (!channel.watch) { return ( -
+
{t('Channel Missing')}
-
+ ); } return ( -
+ @@ -1355,7 +1364,7 @@ const ChannelInner = < -
+ ); }; diff --git a/src/components/Channel/constants.ts b/src/components/Channel/constants.ts new file mode 100644 index 0000000000..925b246a34 --- /dev/null +++ b/src/components/Channel/constants.ts @@ -0,0 +1 @@ +export const CHANNEL_CONTAINER_ID = 'str-chat__channel'; diff --git a/src/components/Channel/hooks/useChannelContainerClasses.ts b/src/components/Channel/hooks/useChannelContainerClasses.ts index a901a903d8..f3d8477350 100644 --- a/src/components/Channel/hooks/useChannelContainerClasses.ts +++ b/src/components/Channel/hooks/useChannelContainerClasses.ts @@ -3,20 +3,27 @@ import { useChatContext } from '../../../context/ChatContext'; import type { DefaultStreamChatGenerics } from '../../../types/types'; +export const useImageFlagEmojisOnWindowsClass = < + StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics +>() => { + const { useImageFlagEmojisOnWindows } = useChatContext('Channel'); + return useImageFlagEmojisOnWindows && navigator.userAgent.match(/Win/) + ? 'str-chat--windows-flags' + : ''; +}; + +export const getChatContainerClass = (customClass?: string) => customClass ?? 'str-chat__container'; + export const useChannelContainerClasses = < StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics >({ customClasses, }: Pick) => { - const { useImageFlagEmojisOnWindows } = useChatContext('Channel'); - + const windowsEmojiClass = useImageFlagEmojisOnWindowsClass(); return { channelClass: customClasses?.channel ?? 'str-chat__channel', chatClass: customClasses?.chat ?? 'str-chat', - chatContainerClass: customClasses?.chatContainer ?? 'str-chat__container', - windowsEmojiClass: - useImageFlagEmojisOnWindows && navigator.userAgent.match(/Win/) - ? 'str-chat--windows-flags' - : '', + chatContainerClass: getChatContainerClass(customClasses?.chatContainer), + windowsEmojiClass, }; }; diff --git a/src/components/ChatView/ChatView.tsx b/src/components/ChatView/ChatView.tsx index 00283afa38..6fa14b6cfe 100644 --- a/src/components/ChatView/ChatView.tsx +++ b/src/components/ChatView/ChatView.tsx @@ -33,9 +33,7 @@ export const ChatView = ({ children }: PropsWithChildren) => { return ( -
- {children} -
+
{children}
); }; diff --git a/src/components/MessageInput/AttachmentSelector.tsx b/src/components/MessageInput/AttachmentSelector.tsx index 3821e7aea1..87ab5bcbc1 100644 --- a/src/components/MessageInput/AttachmentSelector.tsx +++ b/src/components/MessageInput/AttachmentSelector.tsx @@ -8,6 +8,7 @@ import { UploadFileInput } from '../ReactFileUtilities'; import { DialogAnchor, useDialog, useDialogIsOpen } from '../Dialog'; import { DialogMenuButton } from '../Dialog/DialogMenu'; import { useChannelStateContext, useComponentContext, useTranslationContext } from '../../context'; +import { CHANNEL_CONTAINER_ID } from '../Channel/constants'; import type { DefaultStreamChatGenerics } from '../../types'; export const SimpleAttachmentSelector = () => { @@ -58,7 +59,7 @@ export const AttachmentSelector = < const openPollModal = useCallback(() => setCreatePollModalIsOpen(true), []); const getCreatePollModalDestination = useCallback( - () => document.getElementById('str-chat__chat-view'), + () => document.getElementById(CHANNEL_CONTAINER_ID), [], ); From 75ac167cee16d6b9cfae61af9b1f344f2dc72ea9 Mon Sep 17 00:00:00 2001 From: martincupela Date: Thu, 17 Oct 2024 12:25:41 +0200 Subject: [PATCH 12/71] fix: account for possible undefined latestMessage in ChannelPreview --- src/components/ChannelPreview/utils.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/ChannelPreview/utils.tsx b/src/components/ChannelPreview/utils.tsx index 1bf1e3b290..527f4e62e4 100644 --- a/src/components/ChannelPreview/utils.tsx +++ b/src/components/ChannelPreview/utils.tsx @@ -38,7 +38,7 @@ export const getLatestMessagePreview = < const previewTextToRender = latestMessage?.i18n?.[`${userLanguage}_text` as `${TranslationLanguages}_text`] || latestMessage?.text; - const { poll } = latestMessage; + const poll = latestMessage?.poll; if (!latestMessage) { return t('Nothing yet...'); From 32349c0fef2de6d27e0eeb7d31302c83670e309a Mon Sep 17 00:00:00 2001 From: martincupela Date: Thu, 17 Oct 2024 13:15:16 +0200 Subject: [PATCH 13/71] refactor: keep poll answers list UI together --- src/components/Poll/PollActions.tsx | 17 ++++++++++++----- src/components/Poll/hooks/index.ts | 2 +- ...gination.ts => usePollAnswerPagination.ts} | 12 ++++++------ ...PollAnswersList.tsx => PollAnswerList.tsx} | 19 ++++++++++++++----- 4 files changed, 33 insertions(+), 17 deletions(-) rename src/components/Poll/hooks/{usePollAnswersPagination.ts => usePollAnswerPagination.ts} (91%) rename src/components/Poll/modals/{PollAnswersList.tsx => PollAnswerList.tsx} (75%) diff --git a/src/components/Poll/PollActions.tsx b/src/components/Poll/PollActions.tsx index 00bcf8b298..ca6d0f2389 100644 --- a/src/components/Poll/PollActions.tsx +++ b/src/components/Poll/PollActions.tsx @@ -1,5 +1,5 @@ import React, { PropsWithChildren, useCallback, useState } from 'react'; -import { PollAnswersList } from './modals/PollAnswersList'; +import { PollAnswerList } from './modals/PollAnswerList'; import { PollOptionsFullList } from './modals/PollOptionsFullList'; import { FormDialog, PromptDialog } from '../Dialog'; import { MAX_OPTIONS_DISPLAYED } from './config'; @@ -68,6 +68,7 @@ export const PollActions = < const [modalOpen, setModalOpen] = useState(); const closeModal = useCallback(() => setModalOpen(undefined), []); + const onUpdateAnswerClick = useCallback(() => setModalOpen('add-comment'), []); return (
@@ -88,6 +89,7 @@ export const PollActions = < ('Suggest an option')} closeModal={closeModal} + modalClassName='str-chat__suggest-poll-option-modal' modalIsOpen={modalOpen === 'suggest-option'} openModal={() => setModalOpen('suggest-option')} > @@ -119,6 +121,7 @@ export const PollActions = < ('Update your comment') : t('Add a comment')} closeModal={closeModal} + modalClassName='str-chat__add-poll-answer-modal' modalIsOpen={modalOpen === 'add-comment'} openModal={() => setModalOpen('add-comment')} > @@ -152,19 +155,22 @@ export const PollActions = < ('View {{count}} comments', { count: answers_count })} closeModal={closeModal} + modalClassName='str-chat__poll-answer-list-modal' modalIsOpen={modalOpen === 'view-comments'} openModal={() => setModalOpen('view-comments')} > - - + )} ('View results')} closeModal={closeModal} + modalClassName='str-chat__poll-results-modal' modalIsOpen={modalOpen === 'view-results'} openModal={() => setModalOpen('view-results')} > @@ -175,6 +181,7 @@ export const PollActions = < ('End vote')} closeModal={closeModal} + modalClassName='str-chat__end-poll-modal' modalIsOpen={modalOpen === 'end-vote'} openModal={() => setModalOpen('end-vote')} > diff --git a/src/components/Poll/hooks/index.ts b/src/components/Poll/hooks/index.ts index c64540f67c..88f813eec3 100644 --- a/src/components/Poll/hooks/index.ts +++ b/src/components/Poll/hooks/index.ts @@ -1,4 +1,4 @@ export * from './usePoll'; export * from './usePollState'; -export * from './usePollAnswersPagination'; +export * from './usePollAnswerPagination'; export * from './usePollOptionVotesPagination'; diff --git a/src/components/Poll/hooks/usePollAnswersPagination.ts b/src/components/Poll/hooks/usePollAnswerPagination.ts similarity index 91% rename from src/components/Poll/hooks/usePollAnswersPagination.ts rename to src/components/Poll/hooks/usePollAnswerPagination.ts index 8e36939145..79950fc79c 100644 --- a/src/components/Poll/hooks/usePollAnswersPagination.ts +++ b/src/components/Poll/hooks/usePollAnswerPagination.ts @@ -7,9 +7,9 @@ import { } from '../../InfiniteScrollPaginator/hooks/useCursorPaginator'; import { usePollContext } from '../../../context'; -import type { DefaultStreamChatGenerics } from '../../../types'; -import type { PollAnswer, PollAnswersQueryParams, PollVote } from 'stream-chat'; import { useStateStore } from '../../../store'; +import type { PollAnswer, PollAnswersQueryParams, PollVote } from 'stream-chat'; +import type { DefaultStreamChatGenerics } from '../../../types'; const paginationStateSelector = < StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics @@ -17,14 +17,14 @@ const paginationStateSelector = < state: CursorPaginatorState>, ): [Error | undefined, boolean, boolean] => [state.error, state.hasNextPage, state.loading]; -type UsePollAnswersPaginationParams = { +type UsePollAnswerPaginationParams = { paginationParams?: PollAnswersQueryParams; }; -export const usePollAnswersPagination = < +export const usePollAnswerPagination = < StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics ->({ paginationParams }: UsePollAnswersPaginationParams = {}) => { - const { poll } = usePollContext('usePollAnswersPagination'); +>({ paginationParams }: UsePollAnswerPaginationParams = {}) => { + const { poll } = usePollContext('usePollAnswerPagination'); const paginationFn = useCallback>( async (next) => { diff --git a/src/components/Poll/modals/PollAnswersList.tsx b/src/components/Poll/modals/PollAnswerList.tsx similarity index 75% rename from src/components/Poll/modals/PollAnswersList.tsx rename to src/components/Poll/modals/PollAnswerList.tsx index c7250fd8f6..61609dedd8 100644 --- a/src/components/Poll/modals/PollAnswersList.tsx +++ b/src/components/Poll/modals/PollAnswerList.tsx @@ -1,21 +1,25 @@ import React from 'react'; import { ModalHeader } from '../../Modal/ModalHeader'; import { PollVote } from '../PollVote'; -import { usePollAnswersPagination } from '../hooks'; +import { usePollAnswerPagination } from '../hooks'; import { InfiniteScrollPaginator } from '../../InfiniteScrollPaginator/InfiniteScrollPaginator'; import { LoadingIndicator } from '../../Loading'; import { useTranslationContext } from '../../../context'; import type { DefaultStreamChatGenerics } from '../../../types'; -export type PollAnswersListProps = { +export type PollAnswerListProps = { + onUpdateOwnAnswerClick: () => void; + ownAnswerExists: boolean; close?: () => void; }; -export const PollAnswersList = < +export const PollAnswerList = < StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics >({ close, -}: PollAnswersListProps) => { + onUpdateOwnAnswerClick, + ownAnswerExists, +}: PollAnswerListProps) => { const { t } = useTranslationContext(); const { answers, @@ -23,7 +27,7 @@ export const PollAnswersList = < hasNextPage, loading, loadMore, - } = usePollAnswersPagination(); + } = usePollAnswerPagination(); return (
@@ -48,6 +52,11 @@ export const PollAnswersList = < {error?.message &&
{error?.message}
}
+ {answers.length > 0 && ( + + )}
); }; From 01e2112a09275c7eb7776b44c224eb5d06719208 Mon Sep 17 00:00:00 2001 From: martincupela Date: Thu, 17 Oct 2024 14:27:52 +0200 Subject: [PATCH 14/71] fix: prevent allowing to update poll answer on closed poll --- src/components/Poll/PollActions.tsx | 6 +----- src/components/Poll/modals/PollAnswerList.tsx | 20 ++++++++++++++----- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/src/components/Poll/PollActions.tsx b/src/components/Poll/PollActions.tsx index ca6d0f2389..e2144bd00e 100644 --- a/src/components/Poll/PollActions.tsx +++ b/src/components/Poll/PollActions.tsx @@ -159,11 +159,7 @@ export const PollActions = < modalIsOpen={modalOpen === 'view-comments'} openModal={() => setModalOpen('view-comments')} > - + )} diff --git a/src/components/Poll/modals/PollAnswerList.tsx b/src/components/Poll/modals/PollAnswerList.tsx index 61609dedd8..d61040dbc7 100644 --- a/src/components/Poll/modals/PollAnswerList.tsx +++ b/src/components/Poll/modals/PollAnswerList.tsx @@ -1,15 +1,22 @@ import React from 'react'; import { ModalHeader } from '../../Modal/ModalHeader'; import { PollVote } from '../PollVote'; -import { usePollAnswerPagination } from '../hooks'; +import { usePollAnswerPagination, usePollState } from '../hooks'; import { InfiniteScrollPaginator } from '../../InfiniteScrollPaginator/InfiniteScrollPaginator'; import { LoadingIndicator } from '../../Loading'; import { useTranslationContext } from '../../../context'; import type { DefaultStreamChatGenerics } from '../../../types'; +import type { PollAnswer, PollState } from 'stream-chat'; + +type PollStateSelectorReturnValue = [boolean | undefined, PollAnswer | undefined]; +const pollStateSelector = < + StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics +>( + nextValue: PollState, +): PollStateSelectorReturnValue => [nextValue.is_closed, nextValue.ownAnswer]; export type PollAnswerListProps = { onUpdateOwnAnswerClick: () => void; - ownAnswerExists: boolean; close?: () => void; }; @@ -18,9 +25,12 @@ export const PollAnswerList = < >({ close, onUpdateOwnAnswerClick, - ownAnswerExists, }: PollAnswerListProps) => { const { t } = useTranslationContext(); + const [isClosed, ownAnswer] = usePollState( + pollStateSelector, + ); + const { answers, error, @@ -52,9 +62,9 @@ export const PollAnswerList = < {error?.message &&
{error?.message}
}
- {answers.length > 0 && ( + {answers.length > 0 && !isClosed && ( )}
From da4eda15c60ceb452ce90dc8dcee010ac80e6d04 Mon Sep 17 00:00:00 2001 From: martincupela Date: Thu, 17 Oct 2024 16:08:37 +0200 Subject: [PATCH 15/71] feat: debounce poll voting --- src/components/Poll/PollOptionSelector.tsx | 28 +++++++++++-------- .../Poll/modals/PollResults/PollResults.tsx | 1 - 2 files changed, 17 insertions(+), 12 deletions(-) diff --git a/src/components/Poll/PollOptionSelector.tsx b/src/components/Poll/PollOptionSelector.tsx index be14a6b37c..6a3a6bf5c6 100644 --- a/src/components/Poll/PollOptionSelector.tsx +++ b/src/components/Poll/PollOptionSelector.tsx @@ -1,10 +1,11 @@ import clsx from 'clsx'; -import React from 'react'; +import debounce from 'lodash.debounce'; +import React, { useMemo } from 'react'; +import type { PollOption, PollState, PollVote } from 'stream-chat'; import { isVoteAnswer } from 'stream-chat'; import { usePoll, usePollState } from './hooks'; import { Avatar } from '../Avatar'; import { useChannelStateContext, useMessageContext, useTranslationContext } from '../../context'; -import type { PollOption, PollState, PollVote } from 'stream-chat'; import type { DefaultStreamChatGenerics } from '../../types'; type AmountBarProps = { @@ -83,20 +84,25 @@ export const PollOptionSelector = < const canCastVote = channelCapabilities['cast-poll-vote'] && !is_closed; const winningOptionCount = maxVotedOptionIds[0] ? vote_counts_by_option[maxVotedOptionIds[0]] : 0; + const toggleVote = useMemo( + () => + debounce(() => { + if (!canCastVote) return; + const haveVotedForTheOption = !!ownVotesByOptionId[option.id]; + return haveVotedForTheOption + ? poll.removeVote(ownVotesByOptionId[option.id], message.id) + : poll.castVote(option.id, message.id); + }, 100), + [canCastVote, message.id, option.id, ownVotesByOptionId, poll], + ); + return (
{ - // todo: throttle - if (!canCastVote) return; - const haveVotedForTheOption = !!ownVotesByOptionId[option.id]; - return haveVotedForTheOption - ? poll.removeVote(ownVotesByOptionId[option.id], message.id) - : poll.castVote(option.id, message.id); - }} + onClick={toggleVote} > {!is_closed && }
@@ -106,7 +112,7 @@ export const PollOptionSelector = < {latest_votes_by_option?.[option.id] && (latest_votes_by_option[option.id] as PollVote[]) .filter((vote) => !!vote.user && !isVoteAnswer(vote)) - .slice(0, avatarCount) // todo: check how many avatars should be shown + .slice(0, avatarCount) .map(({ user }) => ( void; }; -// todo: sort options by vote count export const PollResults = < StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics >({ From 5205969ac9d8d1eb62e71c79a38a338406aa34cf Mon Sep 17 00:00:00 2001 From: martincupela Date: Thu, 17 Oct 2024 17:40:59 +0200 Subject: [PATCH 16/71] feat: adapt AttachmentSelector contents to Thread --- .../components/contexts/message-input-context.mdx | 8 ++++++++ .../message-input-components/message-input.mdx | 8 ++++++++ .../MessageInput/AttachmentSelector.tsx | 15 ++++++++++----- src/components/MessageInput/MessageInput.tsx | 9 +++++++-- .../hooks/useCreateMessageInputContext.ts | 3 +++ src/components/Thread/Thread.tsx | 1 + 6 files changed, 37 insertions(+), 7 deletions(-) diff --git a/docusaurus/docs/React/components/contexts/message-input-context.mdx b/docusaurus/docs/React/components/contexts/message-input-context.mdx index 9756827cc8..c57a222e95 100644 --- a/docusaurus/docs/React/components/contexts/message-input-context.mdx +++ b/docusaurus/docs/React/components/contexts/message-input-context.mdx @@ -229,6 +229,14 @@ Function to insert text into the value of the underlying `textarea` component. | ------------------------------ | | (textToInsert: string) => void | +### isThreadInput + +Signals that the MessageInput is rendered in a message thread (Thread component). + +| Type | +| ------- | +| boolean | + ### isUploadEnabled If true, file uploads are enabled in the currently active channel. diff --git a/docusaurus/docs/React/components/message-input-components/message-input.mdx b/docusaurus/docs/React/components/message-input-components/message-input.mdx index 38373d48dc..f918a7d923 100644 --- a/docusaurus/docs/React/components/message-input-components/message-input.mdx +++ b/docusaurus/docs/React/components/message-input-components/message-input.mdx @@ -131,6 +131,14 @@ Custom UI component handling how the message input is rendered. | --------- | ------------------------------------------------------------------------------------------------------------------------------- | | component | [MessageInputFlat](https://github.com/GetStream/stream-chat-react/blob/master/src/components/MessageInput/MessageInputFlat.tsx) | +### isThreadInput + +Signals that the MessageInput is rendered in a message thread (Thread component). + +| Type | +| ------- | +| boolean | + ### maxRows Max number of rows the underlying `textarea` component is allowed to grow. diff --git a/src/components/MessageInput/AttachmentSelector.tsx b/src/components/MessageInput/AttachmentSelector.tsx index 87ab5bcbc1..9770ee8668 100644 --- a/src/components/MessageInput/AttachmentSelector.tsx +++ b/src/components/MessageInput/AttachmentSelector.tsx @@ -7,7 +7,12 @@ import { Portal } from '../Portal/Portal'; import { UploadFileInput } from '../ReactFileUtilities'; import { DialogAnchor, useDialog, useDialogIsOpen } from '../Dialog'; import { DialogMenuButton } from '../Dialog/DialogMenu'; -import { useChannelStateContext, useComponentContext, useTranslationContext } from '../../context'; +import { + useChannelStateContext, + useComponentContext, + useMessageInputContext, + useTranslationContext, +} from '../../context'; import { CHANNEL_CONTAINER_ID } from '../Channel/constants'; import type { DefaultStreamChatGenerics } from '../../types'; @@ -45,12 +50,12 @@ export const AttachmentSelector = < >() => { const { t } = useTranslationContext('AttachmentSelectorActionsMenu'); const { channelCapabilities } = useChannelStateContext(); - + const { isThreadInput } = useMessageInputContext(); const [fileInput, setFileInput] = useState(null); const menuButtonRef = useRef>(null); - const menuDialogId = 'attachment-actions-menu'; + const menuDialogId = `attachment-actions-menu${isThreadInput ? '-thread' : ''}`; const menuDialog = useDialog({ id: menuDialogId }); const menuDialogIsOpen = useDialogIsOpen(menuDialogId); @@ -80,7 +85,7 @@ export const AttachmentSelector = < @@ -96,7 +101,7 @@ export const AttachmentSelector = < {t('File')} )} - {channelCapabilities['send-poll'] && ( + {!isThreadInput && channelCapabilities['send-poll'] && ( { diff --git a/src/components/MessageInput/MessageInput.tsx b/src/components/MessageInput/MessageInput.tsx index 2e57fedfa5..5e7aec2459 100644 --- a/src/components/MessageInput/MessageInput.tsx +++ b/src/components/MessageInput/MessageInput.tsx @@ -87,6 +87,8 @@ export type MessageInputProps< hideSendButton?: boolean; /** Custom UI component handling how the message input is rendered, defaults to and accepts the same props as [MessageInputFlat](https://github.com/GetStream/stream-chat-react/blob/master/src/components/MessageInput/MessageInputFlat.tsx) */ Input?: React.ComponentType>; + /** Signals that the MessageInput is rendered in a message thread (Thread component) */ + isThreadInput?: boolean; /** Max number of rows the underlying `textarea` component is allowed to grow */ maxRows?: number; /** If true, the suggestion list will search all app users for an @mention, not just current channel members/watchers. Default: false. */ @@ -165,10 +167,13 @@ const UnMemoizedMessageInput = < >('MessageInput'); const Input = PropInput || ContextInput || MessageInputFlat; + const dialogManagerId = props.isThreadInput + ? 'message-input-dialog-manager-thread' + : 'message-input-dialog-manager'; if (dragAndDropWindow) return ( - + @@ -176,7 +181,7 @@ const UnMemoizedMessageInput = < ); return ( - + diff --git a/src/components/MessageInput/hooks/useCreateMessageInputContext.ts b/src/components/MessageInput/hooks/useCreateMessageInputContext.ts index 95f734d9e8..60f09df242 100644 --- a/src/components/MessageInput/hooks/useCreateMessageInputContext.ts +++ b/src/components/MessageInput/hooks/useCreateMessageInputContext.ts @@ -35,6 +35,7 @@ export const useCreateMessageInputContext = < handleSubmit, hideSendButton, insertText, + isThreadInput, isUploadEnabled, linkPreviews, maxFilesLeft, @@ -100,6 +101,7 @@ export const useCreateMessageInputContext = < handleSubmit, hideSendButton, insertText, + isThreadInput, isUploadEnabled, linkPreviews, maxFilesLeft, @@ -147,6 +149,7 @@ export const useCreateMessageInputContext = < handleSubmit, hideSendButton, isUploadEnabled, + isThreadInput, linkPreviewsValue, mentionedUsersLength, minRows, diff --git a/src/components/Thread/Thread.tsx b/src/components/Thread/Thread.tsx index a02b1c7370..06088c1359 100644 --- a/src/components/Thread/Thread.tsx +++ b/src/components/Thread/Thread.tsx @@ -198,6 +198,7 @@ const ThreadInner = < Date: Mon, 21 Oct 2024 16:17:40 +0200 Subject: [PATCH 17/71] feat: allow to override Poll component --- src/components/Channel/Channel.tsx | 3 +++ src/context/ComponentContext.tsx | 15 ++++++++------- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/components/Channel/Channel.tsx b/src/components/Channel/Channel.tsx index 6bb437aab0..26d4852647 100644 --- a/src/components/Channel/Channel.tsx +++ b/src/components/Channel/Channel.tsx @@ -137,6 +137,7 @@ type ChannelPropsForwardedToComponentContext< | 'MessageTimestamp' | 'ModalGallery' | 'PinIndicator' + | 'Poll' | 'QuotedMessage' | 'QuotedMessagePreview' | 'reactionOptions' @@ -1250,6 +1251,7 @@ const ChannelInner = < MessageTimestamp: props.MessageTimestamp, ModalGallery: props.ModalGallery, PinIndicator: props.PinIndicator, + Poll: props.Poll, QuotedMessage: props.QuotedMessage, QuotedMessagePreview: props.QuotedMessagePreview, reactionOptions: props.reactionOptions, @@ -1300,6 +1302,7 @@ const ChannelInner = < props.MessageTimestamp, props.ModalGallery, props.PinIndicator, + props.Poll, props.QuotedMessage, props.QuotedMessagePreview, props.ReactionSelector, diff --git a/src/context/ComponentContext.tsx b/src/context/ComponentContext.tsx index 4c7b82a91c..7a37f8b205 100644 --- a/src/context/ComponentContext.tsx +++ b/src/context/ComponentContext.tsx @@ -1,12 +1,5 @@ import React, { PropsWithChildren, useContext } from 'react'; -import { - BaseImageProps, - CooldownTimerProps, - CustomMessageActionsListProps, - StartRecordingAudioButtonProps, -} from '../components'; - import type { AttachmentPreviewListProps, AttachmentProps, @@ -46,6 +39,12 @@ import type { UnreadMessagesNotificationProps, UnreadMessagesSeparatorProps, } from '../components'; +import { + BaseImageProps, + CooldownTimerProps, + CustomMessageActionsListProps, + StartRecordingAudioButtonProps, +} from '../components'; import type { MessageBouncePromptProps } from '../components/MessageBounce'; import type { TimestampProps } from '../components/Message/Timestamp'; @@ -127,6 +126,8 @@ export type ComponentContextValue< ModalGallery?: React.ComponentType; /** Custom UI component to override default pinned message indicator, defaults to and accepts same props as: [PinIndicator](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Message/icons.tsx) */ PinIndicator?: React.ComponentType>; + /** Custom UI component to override default poll rendering in a message, defaults to and accepts same props as: [Poll](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Poll/Poll.tsx) */ + Poll?: React.ComponentType; /** Custom UI component to override quoted message UI on a sent message, defaults to and accepts same props as: [QuotedMessage](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Message/QuotedMessage.tsx) */ QuotedMessage?: React.ComponentType; /** Custom UI component to override the message input's quoted message preview, defaults to and accepts same props as: [QuotedMessagePreview](https://github.com/GetStream/stream-chat-react/blob/master/src/components/MessageInput/QuotedMessagePreview.tsx) */ From f1ef9afe7aba8006cebb940912849fca734ae524 Mon Sep 17 00:00:00 2001 From: martincupela Date: Mon, 21 Oct 2024 16:45:44 +0200 Subject: [PATCH 18/71] feat: allow to override PollCreationDialog component --- src/components/Channel/Channel.tsx | 3 +++ .../PollCreationDialog/PollCreationDialogControls.tsx | 6 ++++-- src/context/ComponentContext.tsx | 3 +++ 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/components/Channel/Channel.tsx b/src/components/Channel/Channel.tsx index 26d4852647..fc6d1f9580 100644 --- a/src/components/Channel/Channel.tsx +++ b/src/components/Channel/Channel.tsx @@ -138,6 +138,7 @@ type ChannelPropsForwardedToComponentContext< | 'ModalGallery' | 'PinIndicator' | 'Poll' + | 'PollCreationDialog' | 'QuotedMessage' | 'QuotedMessagePreview' | 'reactionOptions' @@ -1252,6 +1253,7 @@ const ChannelInner = < ModalGallery: props.ModalGallery, PinIndicator: props.PinIndicator, Poll: props.Poll, + PollCreationDialog: props.PollCreationDialog, QuotedMessage: props.QuotedMessage, QuotedMessagePreview: props.QuotedMessagePreview, reactionOptions: props.reactionOptions, @@ -1303,6 +1305,7 @@ const ChannelInner = < props.ModalGallery, props.PinIndicator, props.Poll, + props.PollCreationDialog, props.QuotedMessage, props.QuotedMessagePreview, props.ReactionSelector, diff --git a/src/components/Poll/modals/PollCreationDialog/PollCreationDialogControls.tsx b/src/components/Poll/modals/PollCreationDialog/PollCreationDialogControls.tsx index bc15487293..5ab870a0e0 100644 --- a/src/components/Poll/modals/PollCreationDialog/PollCreationDialogControls.tsx +++ b/src/components/Poll/modals/PollCreationDialog/PollCreationDialogControls.tsx @@ -15,8 +15,10 @@ export const PollCreationDialogControls = ({ state, }: PollCreationDialogControlsProps) => { const { client } = useChatContext(); - const { t } = useTranslationContext('PollCreationDialog'); - const { handleSubmit: handleSubmitMessage } = useMessageInputContext('PollCreationDialog'); + const { t } = useTranslationContext('PollCreationDialogControls'); + const { handleSubmit: handleSubmitMessage } = useMessageInputContext( + 'PollCreationDialogControls', + ); const canSubmit = () => { const hasAtLeastOneOption = state.options.filter((o) => !!o.text).length > 0; diff --git a/src/context/ComponentContext.tsx b/src/context/ComponentContext.tsx index 7a37f8b205..e6cb0ee421 100644 --- a/src/context/ComponentContext.tsx +++ b/src/context/ComponentContext.tsx @@ -54,6 +54,7 @@ import type { PropsWithChildrenOnly, UnknownType, } from '../types/types'; +import { PollCreationDialogProps } from '../components/Poll/modals/PollCreationDialog'; export type ComponentContextValue< StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics, @@ -128,6 +129,8 @@ export type ComponentContextValue< PinIndicator?: React.ComponentType>; /** Custom UI component to override default poll rendering in a message, defaults to and accepts same props as: [Poll](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Poll/Poll.tsx) */ Poll?: React.ComponentType; + /** Custom UI component to override default poll rendering in a message, defaults to and accepts same props as: [Poll](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Poll/PollCreationDialog.tsx) */ + PollCreationDialog?: React.ComponentType; /** Custom UI component to override quoted message UI on a sent message, defaults to and accepts same props as: [QuotedMessage](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Message/QuotedMessage.tsx) */ QuotedMessage?: React.ComponentType; /** Custom UI component to override the message input's quoted message preview, defaults to and accepts same props as: [QuotedMessagePreview](https://github.com/GetStream/stream-chat-react/blob/master/src/components/MessageInput/QuotedMessagePreview.tsx) */ From 3a1cacfff5a32e42b726fb72063823a383598980 Mon Sep 17 00:00:00 2001 From: martincupela Date: Mon, 21 Oct 2024 18:22:42 +0200 Subject: [PATCH 19/71] feat: allow to override poll actions components in PollActions --- .../MessageInput/AttachmentSelector.tsx | 8 +- src/components/Poll/Poll.tsx | 2 +- .../Poll/PollActions/AddCommentForm.tsx | 57 +++++++ .../Poll/PollActions/EndPollDialog.tsx | 38 +++++ .../Poll/PollActions/PollAction.tsx | 28 ++++ .../Poll/{ => PollActions}/PollActions.tsx | 139 +++++------------- .../PollAnswerList.tsx | 1 + .../PollOptionsFullList.tsx | 0 .../PollResults/PollOptionVotesList.tsx | 0 .../PollResults/PollOptionWithLatestVotes.tsx | 2 +- .../PollResults/PollOptionWithVotesHeader.tsx | 5 +- .../PollResults/PollResults.tsx | 0 .../Poll/PollActions/PollResults/index.ts | 1 + .../PollActions/SuggestPollOptionForm.tsx | 42 ++++++ src/components/Poll/PollActions/index.ts | 4 + .../PollCreationDialog/FieldError.tsx | 0 .../PollCreationDialog/OptionFieldSet.tsx | 6 +- .../PollCreationDialog.tsx | 10 +- .../PollCreationDialogControls.tsx | 4 +- .../Poll/PollCreationDialog/index.ts | 1 + .../{modals => }/PollCreationDialog/types.ts | 0 src/components/Poll/PollVote.tsx | 6 +- src/components/Poll/config.ts | 1 - src/components/Poll/constants.ts | 2 + src/components/Poll/icons.tsx | 5 - src/components/Poll/identity.ts | 9 -- src/components/Poll/index.ts | 5 + src/context/ComponentContext.tsx | 2 +- 28 files changed, 240 insertions(+), 138 deletions(-) create mode 100644 src/components/Poll/PollActions/AddCommentForm.tsx create mode 100644 src/components/Poll/PollActions/EndPollDialog.tsx create mode 100644 src/components/Poll/PollActions/PollAction.tsx rename src/components/Poll/{ => PollActions}/PollActions.tsx (54%) rename src/components/Poll/{modals => PollActions}/PollAnswerList.tsx (99%) rename src/components/Poll/{modals => PollActions}/PollOptionsFullList.tsx (100%) rename src/components/Poll/{modals => PollActions}/PollResults/PollOptionVotesList.tsx (100%) rename src/components/Poll/{modals => PollActions}/PollResults/PollOptionWithLatestVotes.tsx (100%) rename src/components/Poll/{modals => PollActions}/PollResults/PollOptionWithVotesHeader.tsx (95%) rename src/components/Poll/{modals => PollActions}/PollResults/PollResults.tsx (100%) create mode 100644 src/components/Poll/PollActions/PollResults/index.ts create mode 100644 src/components/Poll/PollActions/SuggestPollOptionForm.tsx create mode 100644 src/components/Poll/PollActions/index.ts rename src/components/Poll/{modals => }/PollCreationDialog/FieldError.tsx (100%) rename src/components/Poll/{modals => }/PollCreationDialog/OptionFieldSet.tsx (95%) rename src/components/Poll/{modals => PollCreationDialog}/PollCreationDialog.tsx (96%) rename src/components/Poll/{modals => }/PollCreationDialog/PollCreationDialogControls.tsx (95%) create mode 100644 src/components/Poll/PollCreationDialog/index.ts rename src/components/Poll/{modals => }/PollCreationDialog/types.ts (100%) delete mode 100644 src/components/Poll/config.ts delete mode 100644 src/components/Poll/icons.tsx delete mode 100644 src/components/Poll/identity.ts diff --git a/src/components/MessageInput/AttachmentSelector.tsx b/src/components/MessageInput/AttachmentSelector.tsx index 9770ee8668..202fe11038 100644 --- a/src/components/MessageInput/AttachmentSelector.tsx +++ b/src/components/MessageInput/AttachmentSelector.tsx @@ -1,19 +1,19 @@ import { nanoid } from 'nanoid'; import React, { ElementRef, useCallback, useEffect, useMemo, useRef, useState } from 'react'; import { UploadIcon as DefaultUploadIcon } from './icons'; +import { CHANNEL_CONTAINER_ID } from '../Channel/constants'; +import { DialogAnchor, useDialog, useDialogIsOpen } from '../Dialog'; +import { DialogMenuButton } from '../Dialog/DialogMenu'; import { Modal } from '../Modal'; -import { PollCreationDialog } from '../Poll/modals/PollCreationDialog'; +import { PollCreationDialog } from '../Poll/PollCreationDialog'; import { Portal } from '../Portal/Portal'; import { UploadFileInput } from '../ReactFileUtilities'; -import { DialogAnchor, useDialog, useDialogIsOpen } from '../Dialog'; -import { DialogMenuButton } from '../Dialog/DialogMenu'; import { useChannelStateContext, useComponentContext, useMessageInputContext, useTranslationContext, } from '../../context'; -import { CHANNEL_CONTAINER_ID } from '../Channel/constants'; import type { DefaultStreamChatGenerics } from '../../types'; export const SimpleAttachmentSelector = () => { diff --git a/src/components/Poll/Poll.tsx b/src/components/Poll/Poll.tsx index 73e4242f40..8930536498 100644 --- a/src/components/Poll/Poll.tsx +++ b/src/components/Poll/Poll.tsx @@ -3,11 +3,11 @@ import React from 'react'; import { PollActions } from './PollActions'; import { PollHeader } from './PollHeader'; import { PollOptionList } from './PollOptionList'; -import { MAX_OPTIONS_DISPLAYED } from './config'; import { usePollState } from './hooks'; import { PollProvider } from '../../context'; import type { Poll as PollClass, PollState } from 'stream-chat'; import type { DefaultStreamChatGenerics } from '../../types'; +import { MAX_OPTIONS_DISPLAYED } from './constants'; type PollStateSelectorReturnValue = [boolean | undefined]; const pollStateSelector = < diff --git a/src/components/Poll/PollActions/AddCommentForm.tsx b/src/components/Poll/PollActions/AddCommentForm.tsx new file mode 100644 index 0000000000..501b9f5552 --- /dev/null +++ b/src/components/Poll/PollActions/AddCommentForm.tsx @@ -0,0 +1,57 @@ +import { FormDialog } from '../../Dialog'; +import React from 'react'; +import { useTranslationContext } from '../../../context'; +import { usePoll, usePollState } from '../hooks'; +import type { PollAnswer, PollState } from 'stream-chat'; +import type { DefaultStreamChatGenerics } from '../../../types'; + +type PollStateSelectorReturnValue = [PollAnswer | undefined]; +const pollStateSelector = < + StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics +>( + nextValue: PollState, +): PollStateSelectorReturnValue => [nextValue.ownAnswer]; + +export type AddCommentFormProps = { + close: () => void; + messageId: string; +}; + +export const AddCommentForm = < + StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics +>({ + close, + messageId, +}: AddCommentFormProps) => { + const { t } = useTranslationContext('AddCommentForm'); + const poll = usePoll(); + const [ownAnswer] = usePollState( + pollStateSelector, + ); + + return ( + + className='str-chat__prompt-dialog str-chat__modal__poll-add-comment' + close={close} + fields={{ + comment: { + element: 'input', + props: { + id: 'comment', + name: 'comment', + required: true, + type: 'text', + value: ownAnswer?.answer_text ?? '', + }, + }, + }} + onSubmit={async (value) => { + await poll.addAnswer(value.comment, messageId); + }} + shouldDisableSubmitButton={(value) => + !value.comment || value.comment === ownAnswer?.answer_text + } + title={ownAnswer ? t('Update your comment') : t('Add a comment')} + /> + ); +}; diff --git a/src/components/Poll/PollActions/EndPollDialog.tsx b/src/components/Poll/PollActions/EndPollDialog.tsx new file mode 100644 index 0000000000..8e1b5d5c33 --- /dev/null +++ b/src/components/Poll/PollActions/EndPollDialog.tsx @@ -0,0 +1,38 @@ +import { PromptDialog } from '../../Dialog'; +import React from 'react'; +import { useTranslationContext } from '../../../context'; +import { usePoll } from '../hooks'; +import type { DefaultStreamChatGenerics } from '../../../types'; + +export type EndPollDialogProps = { + close: () => void; +}; + +export const EndPollDialog = < + StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics +>({ + close, +}: EndPollDialogProps) => { + const { t } = useTranslationContext('SuggestPollOptionForm'); + const poll = usePoll(); + return ( + ('Cancel'), + className: 'str-chat__dialog__controls-button--cancel', + onClick: close, + }, + { + children: t('End'), + className: + '.str-chat__dialog__controls-button--submit str-chat__dialog__controls-button--end-poll', + onClick: poll.close, + }, + ]} + className='str-chat__modal__end-vote' + prompt={t('Nobody will be able to vote in this poll anymore.')} + title={t('End vote')} + /> + ); +}; diff --git a/src/components/Poll/PollActions/PollAction.tsx b/src/components/Poll/PollActions/PollAction.tsx new file mode 100644 index 0000000000..c309a10e36 --- /dev/null +++ b/src/components/Poll/PollActions/PollAction.tsx @@ -0,0 +1,28 @@ +import React, { PropsWithChildren } from 'react'; +import { Modal } from '../../Modal'; + +export type PollActionProps = { + buttonText: string; + closeModal: () => void; + modalIsOpen: boolean; + openModal: () => void; + modalClassName?: string; +}; + +export const PollAction = ({ + buttonText, + children, + closeModal, + modalClassName, + modalIsOpen, + openModal, +}: PropsWithChildren) => ( + <> + + + {children} + + +); diff --git a/src/components/Poll/PollActions.tsx b/src/components/Poll/PollActions/PollActions.tsx similarity index 54% rename from src/components/Poll/PollActions.tsx rename to src/components/Poll/PollActions/PollActions.tsx index e2144bd00e..6b54fb5afb 100644 --- a/src/components/Poll/PollActions.tsx +++ b/src/components/Poll/PollActions/PollActions.tsx @@ -1,21 +1,28 @@ -import React, { PropsWithChildren, useCallback, useState } from 'react'; -import { PollAnswerList } from './modals/PollAnswerList'; -import { PollOptionsFullList } from './modals/PollOptionsFullList'; -import { FormDialog, PromptDialog } from '../Dialog'; -import { MAX_OPTIONS_DISPLAYED } from './config'; -import { MAX_POLL_OPTIONS } from './constants'; -import { PollResults } from './modals/PollResults/PollResults'; -import { Modal } from '../Modal'; -import { usePoll, usePollState } from './hooks'; +import React, { useCallback, useState } from 'react'; +import { PollAction } from './PollAction'; +import { AddCommentFormProps, AddCommentForm as DefaultAddCommentForm } from './AddCommentForm'; +import { + SuggestPollOptionForm as DefaultSuggestPollOptionForm, + SuggestPollOptionFormProps, +} from './SuggestPollOptionForm'; +import { EndPollDialog as DefaultEndPollDialog, EndPollDialogProps } from './EndPollDialog'; +import { PollAnswerList as DefaultPollAnswerList, PollAnswerListProps } from './PollAnswerList'; +import { + PollOptionsFullList as DefaultPollOptionsFullList, + FullPollOptionsListingProps, +} from './PollOptionsFullList'; +import { PollResults as DefaultPollResults, PollResultsProps } from './PollResults'; +import { usePollState } from '../hooks'; import { useChannelStateContext, useChatContext, useMessageContext, useTranslationContext, -} from '../../context'; +} from '../../../context'; +import { MAX_OPTIONS_DISPLAYED, MAX_POLL_OPTIONS } from '../constants'; import type { PollAnswer, PollOption, PollState } from 'stream-chat'; -import type { DefaultStreamChatGenerics } from '../../types'; +import type { DefaultStreamChatGenerics } from '../../../types'; type ModalName = | 'suggest-option' @@ -48,14 +55,29 @@ const pollStateSelector = < nextValue.ownAnswer, ]; +export type PollActionsProps = { + AddCommentForm: React.ComponentType; + EndPollDialog: React.ComponentType; + PollAnswerList: React.ComponentType; + PollOptionsFullList: React.ComponentType; + PollResults: React.ComponentType; + SuggestPollOptionForm: React.ComponentType; +}; + export const PollActions = < StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics ->() => { +>({ + AddCommentForm = DefaultAddCommentForm, + EndPollDialog = DefaultEndPollDialog, + PollAnswerList = DefaultPollAnswerList, + PollOptionsFullList = DefaultPollOptionsFullList, + PollResults = DefaultPollResults, + SuggestPollOptionForm = DefaultSuggestPollOptionForm, +}: PollActionsProps) => { const { client } = useChatContext(); const { t } = useTranslationContext('PollActions'); const { channelCapabilities = {} } = useChannelStateContext('PollActions'); const { message } = useMessageContext('PollActions'); - const poll = usePoll(); const [ allow_answers, allow_user_suggested_options, @@ -93,27 +115,7 @@ export const PollActions = < modalIsOpen={modalOpen === 'suggest-option'} openModal={() => setModalOpen('suggest-option')} > - - className='str-chat__prompt-dialog str-chat__modal__suggest-poll-option' - close={closeModal} - fields={{ - optionText: { - element: 'input', - props: { - id: 'optionText', - name: 'optionText', - required: true, - type: 'text', - value: '', - }, - }, - }} - onSubmit={async (value) => { - await client.createPollOption(poll.id, { text: value.optionText }); - }} - shouldDisableSubmitButton={(value) => !value.optionText} - title={t('Suggest an option')} - /> + )} @@ -125,29 +127,7 @@ export const PollActions = < modalIsOpen={modalOpen === 'add-comment'} openModal={() => setModalOpen('add-comment')} > - - className='str-chat__prompt-dialog str-chat__modal__poll-add-comment' - close={closeModal} - fields={{ - comment: { - element: 'input', - props: { - id: 'comment', - name: 'comment', - required: true, - type: 'text', - value: ownAnswer?.answer_text ?? '', - }, - }, - }} - onSubmit={async (value) => { - await poll.addAnswer(value.comment, message.id); - }} - shouldDisableSubmitButton={(value) => - !value.comment || value.comment === ownAnswer?.answer_text - } - title={ownAnswer ? t('Update your comment') : t('Add a comment')} - /> + )} @@ -181,52 +161,9 @@ export const PollActions = < modalIsOpen={modalOpen === 'end-vote'} openModal={() => setModalOpen('end-vote')} > - ('Cancel'), - className: 'str-chat__dialog__controls-button--cancel', - onClick: closeModal, - }, - { - children: t('End'), - className: - '.str-chat__dialog__controls-button--submit str-chat__dialog__controls-button--end-poll', - onClick: poll.close, - }, - ]} - className='str-chat__modal__end-vote' - prompt={t('Nobody will be able to vote in this poll anymore.')} - title={t('End vote')} - /> + )}
); }; - -export type PollActionProps = { - buttonText: string; - closeModal: () => void; - modalIsOpen: boolean; - openModal: () => void; - modalClassName?: string; -}; - -const PollAction = ({ - buttonText, - children, - closeModal, - modalClassName, - modalIsOpen, - openModal, -}: PropsWithChildren) => ( - <> - - - {children} - - -); diff --git a/src/components/Poll/modals/PollAnswerList.tsx b/src/components/Poll/PollActions/PollAnswerList.tsx similarity index 99% rename from src/components/Poll/modals/PollAnswerList.tsx rename to src/components/Poll/PollActions/PollAnswerList.tsx index d61040dbc7..1b6655d0be 100644 --- a/src/components/Poll/modals/PollAnswerList.tsx +++ b/src/components/Poll/PollActions/PollAnswerList.tsx @@ -5,6 +5,7 @@ import { usePollAnswerPagination, usePollState } from '../hooks'; import { InfiniteScrollPaginator } from '../../InfiniteScrollPaginator/InfiniteScrollPaginator'; import { LoadingIndicator } from '../../Loading'; import { useTranslationContext } from '../../../context'; + import type { DefaultStreamChatGenerics } from '../../../types'; import type { PollAnswer, PollState } from 'stream-chat'; diff --git a/src/components/Poll/modals/PollOptionsFullList.tsx b/src/components/Poll/PollActions/PollOptionsFullList.tsx similarity index 100% rename from src/components/Poll/modals/PollOptionsFullList.tsx rename to src/components/Poll/PollActions/PollOptionsFullList.tsx diff --git a/src/components/Poll/modals/PollResults/PollOptionVotesList.tsx b/src/components/Poll/PollActions/PollResults/PollOptionVotesList.tsx similarity index 100% rename from src/components/Poll/modals/PollResults/PollOptionVotesList.tsx rename to src/components/Poll/PollActions/PollResults/PollOptionVotesList.tsx diff --git a/src/components/Poll/modals/PollResults/PollOptionWithLatestVotes.tsx b/src/components/Poll/PollActions/PollResults/PollOptionWithLatestVotes.tsx similarity index 100% rename from src/components/Poll/modals/PollResults/PollOptionWithLatestVotes.tsx rename to src/components/Poll/PollActions/PollResults/PollOptionWithLatestVotes.tsx index 9650c0a0cb..b45f36b506 100644 --- a/src/components/Poll/modals/PollResults/PollOptionWithLatestVotes.tsx +++ b/src/components/Poll/PollActions/PollResults/PollOptionWithLatestVotes.tsx @@ -1,10 +1,10 @@ import React from 'react'; +import { PollOptionWithVotesHeader } from './PollOptionWithVotesHeader'; import { PollVoteListing } from '../../PollVote'; import { usePollState } from '../../hooks'; import { useChannelStateContext, useTranslationContext } from '../../../../context'; import type { PollOption, PollState, PollVote } from 'stream-chat'; import type { DefaultStreamChatGenerics } from '../../../../types'; -import { PollOptionWithVotesHeader } from './PollOptionWithVotesHeader'; type PollStateSelectorReturnValue< StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics diff --git a/src/components/Poll/modals/PollResults/PollOptionWithVotesHeader.tsx b/src/components/Poll/PollActions/PollResults/PollOptionWithVotesHeader.tsx similarity index 95% rename from src/components/Poll/modals/PollResults/PollOptionWithVotesHeader.tsx rename to src/components/Poll/PollActions/PollResults/PollOptionWithVotesHeader.tsx index e33a997aff..633e5a913e 100644 --- a/src/components/Poll/modals/PollResults/PollOptionWithVotesHeader.tsx +++ b/src/components/Poll/PollActions/PollResults/PollOptionWithVotesHeader.tsx @@ -1,6 +1,5 @@ import React from 'react'; import { usePollState } from '../../hooks'; -import { WinningOptionIcon } from '../../icons'; import { useTranslationContext } from '../../../../context'; import type { PollOption, PollState } from 'stream-chat'; import type { DefaultStreamChatGenerics } from '../../../../types'; @@ -29,7 +28,9 @@ export const PollResultOptionVoteCounter = < return (
- {maxVotedOptionIds.length === 1 && maxVotedOptionIds[0] === optionId && } + {maxVotedOptionIds.length === 1 && maxVotedOptionIds[0] === optionId && ( +
+ )} {t('{{count}} votes', { count: vote_counts_by_option[optionId] ?? 0 })} diff --git a/src/components/Poll/modals/PollResults/PollResults.tsx b/src/components/Poll/PollActions/PollResults/PollResults.tsx similarity index 100% rename from src/components/Poll/modals/PollResults/PollResults.tsx rename to src/components/Poll/PollActions/PollResults/PollResults.tsx diff --git a/src/components/Poll/PollActions/PollResults/index.ts b/src/components/Poll/PollActions/PollResults/index.ts new file mode 100644 index 0000000000..93cfd3acb2 --- /dev/null +++ b/src/components/Poll/PollActions/PollResults/index.ts @@ -0,0 +1 @@ +export * from './PollResults'; diff --git a/src/components/Poll/PollActions/SuggestPollOptionForm.tsx b/src/components/Poll/PollActions/SuggestPollOptionForm.tsx new file mode 100644 index 0000000000..e940a2a3d9 --- /dev/null +++ b/src/components/Poll/PollActions/SuggestPollOptionForm.tsx @@ -0,0 +1,42 @@ +import { FormDialog } from '../../Dialog'; +import React from 'react'; +import { useChatContext, useTranslationContext } from '../../../context'; +import { usePoll } from '../hooks'; +import type { DefaultStreamChatGenerics } from '../../../types'; + +export type SuggestPollOptionFormProps = { + close: () => void; +}; + +export const SuggestPollOptionForm = < + StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics +>({ + close, +}: SuggestPollOptionFormProps) => { + const { client } = useChatContext('SuggestPollOptionForm'); + const { t } = useTranslationContext('SuggestPollOptionForm'); + const poll = usePoll(); + return ( + + className='str-chat__prompt-dialog str-chat__modal__suggest-poll-option' + close={close} + fields={{ + optionText: { + element: 'input', + props: { + id: 'optionText', + name: 'optionText', + required: true, + type: 'text', + value: '', + }, + }, + }} + onSubmit={async (value) => { + await client.createPollOption(poll.id, { text: value.optionText }); + }} + shouldDisableSubmitButton={(value) => !value.optionText} + title={t('Suggest an option')} + /> + ); +}; diff --git a/src/components/Poll/PollActions/index.ts b/src/components/Poll/PollActions/index.ts new file mode 100644 index 0000000000..d9a2730b53 --- /dev/null +++ b/src/components/Poll/PollActions/index.ts @@ -0,0 +1,4 @@ +export * from './AddCommentForm'; +export * from './EndPollDialog'; +export * from './PollActions'; +export * from './SuggestPollOptionForm'; diff --git a/src/components/Poll/modals/PollCreationDialog/FieldError.tsx b/src/components/Poll/PollCreationDialog/FieldError.tsx similarity index 100% rename from src/components/Poll/modals/PollCreationDialog/FieldError.tsx rename to src/components/Poll/PollCreationDialog/FieldError.tsx diff --git a/src/components/Poll/modals/PollCreationDialog/OptionFieldSet.tsx b/src/components/Poll/PollCreationDialog/OptionFieldSet.tsx similarity index 95% rename from src/components/Poll/modals/PollCreationDialog/OptionFieldSet.tsx rename to src/components/Poll/PollCreationDialog/OptionFieldSet.tsx index 68be33aef9..aa178be275 100644 --- a/src/components/Poll/modals/PollCreationDialog/OptionFieldSet.tsx +++ b/src/components/Poll/PollCreationDialog/OptionFieldSet.tsx @@ -1,11 +1,11 @@ // @ts-nocheck import clsx from 'clsx'; -import { MAX_POLL_OPTIONS } from '../../constants'; +import { MAX_POLL_OPTIONS } from '../constants'; import { nanoid } from 'nanoid'; import React, { useCallback } from 'react'; import { FieldError } from './FieldError'; -import { DragAndDropContainer } from '../../../DragAndDrop/DragAndDropContainer'; -import { useTranslationContext } from '../../../../context'; +import { DragAndDropContainer } from '../../DragAndDrop/DragAndDropContainer'; +import { useTranslationContext } from '../../../context'; import type { OptionErrors, PollFormState, PollOptionFormData } from './types'; const VALIDATION_ERRORS = ({ 'Option already exists': true } as const) as Record; diff --git a/src/components/Poll/modals/PollCreationDialog.tsx b/src/components/Poll/PollCreationDialog/PollCreationDialog.tsx similarity index 96% rename from src/components/Poll/modals/PollCreationDialog.tsx rename to src/components/Poll/PollCreationDialog/PollCreationDialog.tsx index 82ac0b2369..5724579147 100644 --- a/src/components/Poll/modals/PollCreationDialog.tsx +++ b/src/components/Poll/PollCreationDialog/PollCreationDialog.tsx @@ -1,16 +1,16 @@ import clsx from 'clsx'; import { nanoid } from 'nanoid'; import React, { useState } from 'react'; -import { FieldError } from './PollCreationDialog/FieldError'; -import { OptionFieldSet } from './PollCreationDialog/OptionFieldSet'; +import { FieldError } from './FieldError'; +import { OptionFieldSet } from './OptionFieldSet'; +import { PollCreationDialogControls } from './PollCreationDialogControls'; +import { VALID_MAX_VOTES_VALUE_REGEX } from '../constants'; import { ModalHeader } from '../../Modal/ModalHeader'; import { SimpleSwitchField } from '../../Form/SwitchField'; import { useChatContext, useTranslationContext } from '../../../context'; import type { VotingVisibility } from 'stream-chat'; -import type { OptionErrors, PollFormState } from './PollCreationDialog/types'; -import { PollCreationDialogControls } from './PollCreationDialog/PollCreationDialogControls'; -import { VALID_MAX_VOTES_VALUE_REGEX } from '../constants'; +import type { OptionErrors, PollFormState } from './types'; export type PollCreationDialogProps = { close: () => void; diff --git a/src/components/Poll/modals/PollCreationDialog/PollCreationDialogControls.tsx b/src/components/Poll/PollCreationDialog/PollCreationDialogControls.tsx similarity index 95% rename from src/components/Poll/modals/PollCreationDialog/PollCreationDialogControls.tsx rename to src/components/Poll/PollCreationDialog/PollCreationDialogControls.tsx index 5ab870a0e0..b8e18298cc 100644 --- a/src/components/Poll/modals/PollCreationDialog/PollCreationDialogControls.tsx +++ b/src/components/Poll/PollCreationDialog/PollCreationDialogControls.tsx @@ -1,6 +1,6 @@ import React from 'react'; -import { VALID_MAX_VOTES_VALUE_REGEX } from '../../constants'; -import { useChatContext, useMessageInputContext, useTranslationContext } from '../../../../context'; +import { VALID_MAX_VOTES_VALUE_REGEX } from '../constants'; +import { useChatContext, useMessageInputContext, useTranslationContext } from '../../../context'; import type { PollFormState } from './types'; export type PollCreationDialogControlsProps = { diff --git a/src/components/Poll/PollCreationDialog/index.ts b/src/components/Poll/PollCreationDialog/index.ts new file mode 100644 index 0000000000..e4eb0a0a99 --- /dev/null +++ b/src/components/Poll/PollCreationDialog/index.ts @@ -0,0 +1 @@ +export * from './PollCreationDialog'; diff --git a/src/components/Poll/modals/PollCreationDialog/types.ts b/src/components/Poll/PollCreationDialog/types.ts similarity index 100% rename from src/components/Poll/modals/PollCreationDialog/types.ts rename to src/components/Poll/PollCreationDialog/types.ts diff --git a/src/components/Poll/PollVote.tsx b/src/components/Poll/PollVote.tsx index 9ce81ca345..439dbaa285 100644 --- a/src/components/Poll/PollVote.tsx +++ b/src/components/Poll/PollVote.tsx @@ -1,11 +1,11 @@ import React, { useState } from 'react'; import { Avatar } from '../Avatar'; +import { PopperTooltip } from '../Tooltip'; +import { useEnterLeaveHandlers } from '../Tooltip/hooks'; import { useChatContext, useTranslationContext } from '../../context'; -import type { DefaultStreamChatGenerics } from '../../types'; import type { PollVote as PollVoteType } from 'stream-chat'; -import { useEnterLeaveHandlers } from '../Tooltip/hooks'; -import { PopperTooltip } from '../Tooltip'; +import type { DefaultStreamChatGenerics } from '../../types'; const PollVoteTimestamp = ({ timestamp }: { timestamp: string }) => { const { t } = useTranslationContext(); diff --git a/src/components/Poll/config.ts b/src/components/Poll/config.ts deleted file mode 100644 index 72704a356b..0000000000 --- a/src/components/Poll/config.ts +++ /dev/null @@ -1 +0,0 @@ -export const MAX_OPTIONS_DISPLAYED = 10 as const; diff --git a/src/components/Poll/constants.ts b/src/components/Poll/constants.ts index cd8c9959d2..f81c63c4aa 100644 --- a/src/components/Poll/constants.ts +++ b/src/components/Poll/constants.ts @@ -1,3 +1,5 @@ export const MAX_POLL_OPTIONS = 100 as const; export const VALID_MAX_VOTES_VALUE_REGEX = /^([2-9]|10)$/; + +export const MAX_OPTIONS_DISPLAYED = 10 as const; diff --git a/src/components/Poll/icons.tsx b/src/components/Poll/icons.tsx deleted file mode 100644 index 40eba0d04a..0000000000 --- a/src/components/Poll/icons.tsx +++ /dev/null @@ -1,5 +0,0 @@ -import React from 'react'; - -export const WinningOptionIcon = () => ( -
-); diff --git a/src/components/Poll/identity.ts b/src/components/Poll/identity.ts deleted file mode 100644 index d42efdef79..0000000000 --- a/src/components/Poll/identity.ts +++ /dev/null @@ -1,9 +0,0 @@ -import type { PollAnswer, PollVote } from 'stream-chat'; -import type { DefaultStreamChatGenerics } from '../../types'; - -export const isPollAnswer = < - StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics ->( - value: PollAnswer | PollVote, -): value is PollAnswer => - !!(value as PollAnswer)?.answer_text; diff --git a/src/components/Poll/index.ts b/src/components/Poll/index.ts index 7b82a1b0d5..1d1d614fbb 100644 --- a/src/components/Poll/index.ts +++ b/src/components/Poll/index.ts @@ -1,2 +1,7 @@ export * from './Poll'; +export * from './PollActions'; +export * from './PollCreationDialog'; +export * from './PollHeader'; +export * from './PollOptionSelector'; +export * from './PollVote'; export * from './QuotedPoll'; diff --git a/src/context/ComponentContext.tsx b/src/context/ComponentContext.tsx index e6cb0ee421..ade03998f5 100644 --- a/src/context/ComponentContext.tsx +++ b/src/context/ComponentContext.tsx @@ -54,7 +54,7 @@ import type { PropsWithChildrenOnly, UnknownType, } from '../types/types'; -import { PollCreationDialogProps } from '../components/Poll/modals/PollCreationDialog'; +import type { PollCreationDialogProps } from '../components/Poll'; export type ComponentContextValue< StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics, From 684db80ac7f9467b0915eaa5b86d18a79e2ef87c Mon Sep 17 00:00:00 2001 From: martincupela Date: Mon, 21 Oct 2024 18:27:49 +0200 Subject: [PATCH 20/71] fix: export component props types that which components can be overridden --- src/components/Message/index.ts | 1 + src/components/index.ts | 2 ++ src/context/ComponentContext.tsx | 16 +++++++--------- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/components/Message/index.ts b/src/components/Message/index.ts index fd48f87c58..efb921fc33 100644 --- a/src/components/Message/index.ts +++ b/src/components/Message/index.ts @@ -13,3 +13,4 @@ export * from './QuotedMessage'; export * from './renderText'; export * from './types'; export * from './utils'; +export type { TimestampProps } from './Timestamp'; diff --git a/src/components/index.ts b/src/components/index.ts index 872fd5e083..fa79feeaa1 100644 --- a/src/components/index.ts +++ b/src/components/index.ts @@ -21,10 +21,12 @@ export * from './LoadMore'; export * from './MediaRecorder'; export * from './Message'; export * from './MessageActions'; +export type { MessageBouncePromptProps } from './MessageBounce'; export * from './MessageInput'; export * from './MessageList'; export * from './MML'; export * from './Modal'; +export * from './Poll'; export * from './Reactions'; export * from './SafeAnchor'; export * from './Thread'; diff --git a/src/context/ComponentContext.tsx b/src/context/ComponentContext.tsx index ade03998f5..99d48b56a5 100644 --- a/src/context/ComponentContext.tsx +++ b/src/context/ComponentContext.tsx @@ -4,6 +4,9 @@ import type { AttachmentPreviewListProps, AttachmentProps, AvatarProps, + BaseImageProps, + CooldownTimerProps, + CustomMessageActionsListProps, DateSeparatorProps, EmojiSearchIndex, EmptyStateIndicatorProps, @@ -12,6 +15,7 @@ import type { GiphyPreviewMessageProps, LinkPreviewListProps, LoadingIndicatorProps, + MessageBouncePromptProps, MessageDeletedProps, MessageInputProps, MessageListNotificationsProps, @@ -24,37 +28,31 @@ import type { MessageUIComponentProps, ModalGalleryProps, PinIndicatorProps, + PollCreationDialogProps, QuotedMessagePreviewProps, ReactionOptions, ReactionSelectorProps, ReactionsListProps, RecordingPermissionDeniedNotificationProps, SendButtonProps, + StartRecordingAudioButtonProps, SuggestionItemProps, SuggestionListProps, ThreadHeaderProps, ThreadListItemProps, ThreadListItemUIProps, + TimestampProps, TypingIndicatorProps, UnreadMessagesNotificationProps, UnreadMessagesSeparatorProps, } from '../components'; -import { - BaseImageProps, - CooldownTimerProps, - CustomMessageActionsListProps, - StartRecordingAudioButtonProps, -} from '../components'; -import type { MessageBouncePromptProps } from '../components/MessageBounce'; -import type { TimestampProps } from '../components/Message/Timestamp'; import type { CustomTrigger, DefaultStreamChatGenerics, PropsWithChildrenOnly, UnknownType, } from '../types/types'; -import type { PollCreationDialogProps } from '../components/Poll'; export type ComponentContextValue< StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics, From 17e2afffa1c160f16fd155d9d322412f5e4bda90 Mon Sep 17 00:00:00 2001 From: martincupela Date: Mon, 21 Oct 2024 18:29:46 +0200 Subject: [PATCH 21/71] fix: make props in PollActionsProps to be optional --- src/components/Poll/PollActions/PollActions.tsx | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/components/Poll/PollActions/PollActions.tsx b/src/components/Poll/PollActions/PollActions.tsx index 6b54fb5afb..5a6443660d 100644 --- a/src/components/Poll/PollActions/PollActions.tsx +++ b/src/components/Poll/PollActions/PollActions.tsx @@ -56,12 +56,12 @@ const pollStateSelector = < ]; export type PollActionsProps = { - AddCommentForm: React.ComponentType; - EndPollDialog: React.ComponentType; - PollAnswerList: React.ComponentType; - PollOptionsFullList: React.ComponentType; - PollResults: React.ComponentType; - SuggestPollOptionForm: React.ComponentType; + AddCommentForm?: React.ComponentType; + EndPollDialog?: React.ComponentType; + PollAnswerList?: React.ComponentType; + PollOptionsFullList?: React.ComponentType; + PollResults?: React.ComponentType; + SuggestPollOptionForm?: React.ComponentType; }; export const PollActions = < From 4e770ccd5798837ea5bd2b9429616006eca8cace Mon Sep 17 00:00:00 2001 From: martincupela Date: Tue, 22 Oct 2024 12:02:43 +0200 Subject: [PATCH 22/71] feat: add translations --- src/i18n/de.json | 60 ++++++++++++++++++++++++++-------------- src/i18n/en.json | 20 +++++++++++++- src/i18n/es.json | 24 ++++++++++++++-- src/i18n/fr.json | 20 +++++++++++++- src/i18n/hi.json | 34 +++++++++++++++++------ src/i18n/it.json | 26 ++++++++++++++--- src/i18n/ja.json | 26 ++++++++++++++--- src/i18n/ko.json | 26 ++++++++++++++--- src/i18n/nl.json | 46 +++++++++++++++++++++---------- src/i18n/pt.json | 26 ++++++++++++++--- src/i18n/ru.json | 30 ++++++++++++++++---- src/i18n/tr.json | 72 ++++++++++++++++++++++++++++++------------------ 12 files changed, 313 insertions(+), 97 deletions(-) diff --git a/src/i18n/de.json b/src/i18n/de.json index 0d00d51392..1a126e923b 100644 --- a/src/i18n/de.json +++ b/src/i18n/de.json @@ -1,18 +1,25 @@ { "Add a comment": "Einen Kommentar hinzufügen", + "Add an option": "Eine Option hinzufügen", "Allow access to camera": "Zugriff auf Kamera erlauben", "Allow access to microphone": "Zugriff auf Mikrofon erlauben", + "Allow comments": "Kommentare erlauben", + "Allow option suggestion": "Optionsvorschläge erlauben", "An error has occurred during recording": "Ein Fehler ist während der Aufnahme aufgetreten", "An error has occurred during the recording processing": "Ein Fehler ist während der Aufnahmeverarbeitung aufgetreten", "Anonymous": "Anonym", + "Anonymous poll": "Anonyme Umfrage", + "Ask a question": "Eine Frage stellen", "Attach files": "Dateien anhängen", - "Cancel": "Stornieren", - "Cannot seek in the recording": "In der Aufnahme es kann nicht gesucht werden", + "Cancel": "Abbrechen", + "Cannot seek in the recording": "In der Aufnahme kann nicht gesucht werden", "Channel Missing": "Kanal fehlt", "Close": "Schließen", - "Close emoji picker": "Emoji-Picker schließen", + "Close emoji picker": "Emoji-Auswahl schließen", "Commands matching": "Übereinstimmende Befehle", "Connection failure, reconnecting now...": "Verbindungsfehler, Wiederherstellung der Verbindung...", + "Create": "Erstellen", + "Create poll": "Umfrage erstellen", "Delete": "Löschen", "Delivered": "Zugestellt", "Download attachment {{ name }}": "Anhang {{ name }} herunterladen", @@ -21,12 +28,12 @@ "Edit Message": "Nachricht bearbeiten", "Edit message request failed": "Anfrage zum Bearbeiten der Nachricht fehlgeschlagen", "Edited": "Bearbeitet", - "Emoji matching": "Emoji passend", + "Emoji matching": "Passende Emojis", "Empty message...": "Leere Nachricht...", "End": "Beenden", "End vote": "Abstimmung beenden", "Error adding flag": "Fehler beim Hinzufügen des Flags", - "Error connecting to chat, refresh the page to try again.": "Verbindungsfehler zum Chat, aktualisiere die Seite, um es erneut zu versuchen.", + "Error connecting to chat, refresh the page to try again.": "Verbindungsfehler zum Chat, aktualisieren Sie die Seite, um es erneut zu versuchen.", "Error deleting message": "Fehler beim Löschen der Nachricht", "Error fetching reactions": "Fehler beim Laden von Reaktionen", "Error marking message unread. Cannot mark unread messages older than the newest 100 channel messages.": "Fehler beim Markieren der Nachricht als ungelesen. Kann keine älteren ungelesenen Nachrichten markieren als die neuesten 100 Kanalnachrichten.", @@ -35,29 +42,32 @@ "Error removing message pin": "Fehler beim Entfernen der gepinnten Nachricht", "Error reproducing the recording": "Fehler bei der Wiedergabe der Aufnahme", "Error starting recording": "Fehler beim Starten der Aufnahme", - "Error unmuting a user ...": "Stummschaltung des Nutzers fehlgeschlagen ...", + "Error unmuting a user ...": "Fehler beim Aufheben der Stummschaltung eines Nutzers ...", "Error uploading attachment": "Fehler beim Hochladen des Anhangs", "Error uploading file": "Fehler beim Hochladen der Datei", - "Error uploading image": "Hochladen des Bildes fehlgeschlagen", + "Error uploading image": "Fehler beim Hochladen des Bildes", "Error · Unsent": "Fehler · Nicht gesendet", "Error: {{ errorMessage }}": "Fehler: {{ errorMessage }}", "Failed to jump to the first unread message": "Fehler beim Springen zur ersten ungelesenen Nachricht", "Failed to mark channel as read": "Fehler beim Markieren des Kanals als gelesen", "Failed to play the recording": "Wiedergabe der Aufnahme fehlgeschlagen", + "File": "Datei", "File is too large: {{ size }}, maximum upload size is {{ limit }}": "Datei ist zu groß: {{ size }}, maximale Upload-Größe beträgt {{ limit }}", - "Flag": "Meldung", + "Flag": "Melden", "Latest Messages": "Neueste Nachrichten", "Load more": "Mehr laden", "Mark as unread": "Als ungelesen markieren", + "Maximum number of votes (from 2 to 10)": "Maximale Anzahl der Stimmen (von 2 bis 10)", "Menu": "Menü", "Message Failed · Click to try again": "Nachricht fehlgeschlagen · Klicken, um es erneut zu versuchen", "Message Failed · Unauthorized": "Nachricht fehlgeschlagen · Nicht autorisiert", "Message deleted": "Nachricht gelöscht", "Message has been successfully flagged": "Nachricht wurde erfolgreich gemeldet", - "Message pinned": "Nachricht gepinnt", + "Message pinned": "Nachricht angeheftet", "Messages have been marked unread.": "Nachrichten wurden als ungelesen markiert.", - "Missing permissions to upload the attachment": "Berechtigungen zum Hochladen des Anhangs fehlen", - "Mute": "Stumm schalten", + "Missing permissions to upload the attachment": "Fehlende Berechtigungen zum Hochladen des Anhangs", + "Multiple answers": "Mehrere Antworten", + "Mute": "Stummschalten", "New": "Neu", "New Messages!": "Neue Nachrichten!", "No chats here yet…": "Noch keine Chats hier...", @@ -65,13 +75,17 @@ "Nobody will be able to vote in this poll anymore.": "Niemand kann mehr in dieser Umfrage abstimmen.", "Nothing yet...": "Noch nichts...", "Ok": "Ok", - "Open emoji picker": "Emoji-Picker öffnen", + "Open emoji picker": "Emoji-Auswahl öffnen", + "Option already exists": "Option existiert bereits", + "Options": "Optionen", "People matching": "Passende Personen", - "Pin": "Pin", - "Pinned by": "Gepinnt von", + "Pin": "Anheften", + "Pinned by": "Angeheftet von", + "Poll": "Umfrage", "Poll comments": "Umfragekommentare", "Poll options": "Umfrageoptionen", "Poll results": "Umfrageergebnisse", + "Question": "Frage", "Recording format is not supported and cannot be reproduced": "Aufnahmeformat wird nicht unterstützt und kann nicht wiedergegeben werden", "Reply": "Antworten", "Reply to Message": "Auf Nachricht antworten", @@ -89,17 +103,18 @@ "Sending...": "Senden...", "Show all": "Alle anzeigen", "Shuffle": "Mischen", - "Slow Mode ON": "Slow-Mode EIN", + "Slow Mode ON": "Langsamer Modus EIN", "Some of the files will not be accepted": "Einige der Dateien werden nicht akzeptiert", - "Suggest an option": "Option vorschlagen", + "Suggest an option": "Eine Option vorschlagen", "This message did not meet our content guidelines": "Diese Nachricht entsprach nicht unseren Inhaltsrichtlinien", "This message was deleted...": "Diese Nachricht wurde gelöscht...", "Thread": "Thread", "To start recording, allow the camera access in your browser": "Um mit der Aufnahme zu beginnen, erlauben Sie den Zugriff auf die Kamera in Ihrem Browser", "To start recording, allow the microphone access in your browser": "Um mit der Aufnahme zu beginnen, erlauben Sie den Zugriff auf das Mikrofon in Ihrem Browser", + "Type a number from 2 to 10": "Geben Sie eine Zahl von 2 bis 10 ein", "Type your message": "Nachricht eingeben", "Unmute": "Stummschaltung aufheben", - "Unpin": "Pin entfernen", + "Unpin": "Anheftung aufheben", "Unread messages": "Ungelesene Nachrichten", "Unsupported attachment": "Nicht unterstützter Anhang", "Update your comment": "Ihren Kommentar aktualisieren", @@ -112,8 +127,8 @@ "Vote ended": "Abstimmung beendet", "Wait until all attachments have uploaded": "Bitte warten, bis alle Anhänge hochgeladen wurden", "You": "Du", - "You have no channels currently": "Du hast momentan noch keine Channels", - "You've reached the maximum number of files": "Die maximale Dateianzahl ist erreicht", + "You have no channels currently": "Du hast momentan noch keine Kanäle", + "You've reached the maximum number of files": "Die maximale Anzahl an Dateien ist erreicht", "aria/Attachment": "Anhang", "aria/Cancel Reply": "Antwort abbrechen", "aria/Cancel upload": "Upload abbrechen", @@ -128,6 +143,7 @@ "aria/Load More Channels": "Mehr Kanäle laden", "aria/Menu": "Menü", "aria/Message Options": "Nachrichtenoptionen", + "aria/Open Attachment Selector": "Anhang-Auswahl öffnen", "aria/Open Message Actions Menu": "Nachrichtenaktionsmenü öffnen", "aria/Open Reaction Selector": "Reaktionsauswahl öffnen", "aria/Open Thread": "Thread öffnen", @@ -164,7 +180,7 @@ "{{ imageCount }} more": "{{ imageCount }} mehr", "{{ memberCount }} members": "{{ memberCount }} Mitglieder", "{{ user }} has been muted": "{{ user }} wurde stummgeschaltet", - "{{ user }} has been unmuted": "{{ user }} wurde nicht stummgeschaltet", + "{{ user }} has been unmuted": "Die Stummschaltung von {{ user }} wurde aufgehoben", "{{ user }} is typing...": "{{ user }} tippt...", "{{ users }} and more are typing...": "{{ users }} und mehr tippen...", "{{ users }} and {{ user }} are typing...": "{{ users }} und {{ user }} tippen...", @@ -173,5 +189,7 @@ "{{count}} unread_other": "{{count}} ungelesen", "{{count}} votes_one": "{{count}} Stimme", "{{count}} votes_other": "{{count}} Stimmen", - "🏙 Attachment...": "🏙 Anhang..." + "🏙 Attachment...": "🏙 Anhang...", + "📊 {{createdBy}} created: {{ pollName}}": "📊 {{createdBy}} hat erstellt: {{ pollName}}", + "📊 {{votedBy}} voted: {{pollOptionText}}": "📊 {{votedBy}} hat abgestimmt: {{pollOptionText}}" } diff --git a/src/i18n/en.json b/src/i18n/en.json index fef6f45972..da2d3a0582 100644 --- a/src/i18n/en.json +++ b/src/i18n/en.json @@ -1,10 +1,15 @@ { "Add a comment": "Add a comment", + "Add an option": "Add an option", "Allow access to camera": "Allow access to camera", "Allow access to microphone": "Allow access to microphone", + "Allow comments": "Allow comments", + "Allow option suggestion": "Allow option suggestion", "An error has occurred during recording": "An error has occurred during recording", "An error has occurred during the recording processing": "An error has occurred during the recording processing", "Anonymous": "Anonymous", + "Anonymous poll": "Anonymous poll", + "Ask a question": "Ask a question", "Attach files": "Attach files", "Cancel": "Cancel", "Cannot seek in the recording": "Cannot seek in the recording", @@ -13,6 +18,8 @@ "Close emoji picker": "Close emoji picker", "Commands matching": "Commands matching", "Connection failure, reconnecting now...": "Connection failure, reconnecting now...", + "Create": "Create", + "Create poll": "Create poll", "Delete": "Delete", "Delivered": "Delivered", "Download attachment {{ name }}": "Download attachment {{ name }}", @@ -44,11 +51,13 @@ "Failed to jump to the first unread message": "Failed to jump to the first unread message", "Failed to mark channel as read": "Failed to mark channel as read", "Failed to play the recording": "Failed to play the recording", + "File": "File", "File is too large: {{ size }}, maximum upload size is {{ limit }}": "File is too large: {{ size }}, maximum upload size is {{ limit }}", "Flag": "Flag", "Latest Messages": "Latest Messages", "Load more": "Load more", "Mark as unread": "Mark as unread", + "Maximum number of votes (from 2 to 10)": "Maximum number of votes (from 2 to 10)", "Menu": "Menu", "Message Failed · Click to try again": "Message Failed · Click to try again", "Message Failed · Unauthorized": "Message Failed · Unauthorized", @@ -57,6 +66,7 @@ "Message pinned": "Message pinned", "Messages have been marked unread.": "Messages have been marked unread.", "Missing permissions to upload the attachment": "Missing permissions to upload the attachment", + "Multiple answers": "Multiple answers", "Mute": "Mute", "New": "New", "New Messages!": "New Messages!", @@ -66,12 +76,16 @@ "Nothing yet...": "Nothing yet...", "Ok": "Ok", "Open emoji picker": "Open emoji picker", + "Option already exists": "Option already exists", + "Options": "Options", "People matching": "People matching", "Pin": "Pin", "Pinned by": "Pinned by", + "Poll": "Poll", "Poll comments": "Poll comments", "Poll options": "Poll options", "Poll results": "Poll results", + "Question": "Question", "Recording format is not supported and cannot be reproduced": "Recording format is not supported and cannot be reproduced", "Reply": "Reply", "Reply to Message": "Reply to Message", @@ -97,6 +111,7 @@ "Thread": "Thread", "To start recording, allow the camera access in your browser": "To start recording, allow the camera access in your browser", "To start recording, allow the microphone access in your browser": "To start recording, allow the microphone access in your browser", + "Type a number from 2 to 10": "Type a number from 2 to 10", "Type your message": "Type your message", "Unmute": "Unmute", "Unpin": "Unpin", @@ -128,6 +143,7 @@ "aria/Load More Channels": "Load More Channels", "aria/Menu": "Menu", "aria/Message Options": "Message Options", + "aria/Open Attachment Selector": "aria/Open Attachment Selector", "aria/Open Message Actions Menu": "Open Message Actions Menu", "aria/Open Reaction Selector": "Open Reaction Selector", "aria/Open Thread": "Open Thread", @@ -163,5 +179,7 @@ "{{count}} unread_other": "{{count}} unread", "{{count}} votes_one": "{{count}} votes", "{{count}} votes_other": "{{count}} votes", - "🏙 Attachment...": "🏙 Attachment..." + "🏙 Attachment...": "🏙 Attachment...", + "📊 {{createdBy}} created: {{ pollName}}": "📊 {{createdBy}} created: {{ pollName}}", + "📊 {{votedBy}} voted: {{pollOptionText}}": "📊 {{votedBy}} voted: {{pollOptionText}}" } diff --git a/src/i18n/es.json b/src/i18n/es.json index da36220333..ddc183752b 100644 --- a/src/i18n/es.json +++ b/src/i18n/es.json @@ -1,10 +1,15 @@ { "Add a comment": "Agregar un comentario", + "Add an option": "Agregar una opción", "Allow access to camera": "Permitir acceso a la cámara", "Allow access to microphone": "Permitir acceso al micrófono", + "Allow comments": "Permitir comentarios", + "Allow option suggestion": "Permitir sugerencia de opciones", "An error has occurred during recording": "Se ha producido un error durante la grabación", "An error has occurred during the recording processing": "Se ha producido un error durante el procesamiento de la grabación", "Anonymous": "Anónimo", + "Anonymous poll": "Encuesta anónima", + "Ask a question": "Hacer una pregunta", "Attach files": "Adjuntar archivos", "Cancel": "Cancelar", "Cannot seek in the recording": "No se puede buscar en la grabación", @@ -13,6 +18,8 @@ "Close emoji picker": "Cerrar el selector de emojis", "Commands matching": "Coincidencia de comandos", "Connection failure, reconnecting now...": "Fallo de conexión, reconectando ahora...", + "Create": "Crear", + "Create poll": "Crear encuesta", "Delete": "Borrar", "Delivered": "Entregado", "Download attachment {{ name }}": "Descargar adjunto {{ name }}", @@ -44,11 +51,13 @@ "Failed to jump to the first unread message": "Error al saltar al primer mensaje no leído", "Failed to mark channel as read": "Error al marcar el canal como leído", "Failed to play the recording": "No se pudo reproducir la grabación", + "File": "Archivo", "File is too large: {{ size }}, maximum upload size is {{ limit }}": "El archivo es demasiado grande: {{ size }}, el tamaño máximo de carga es de {{ limit }}", - "Flag": "Bandera", + "Flag": "Marcar", "Latest Messages": "Últimos mensajes", "Load more": "Cargar más", "Mark as unread": "Marcar como no leído", + "Maximum number of votes (from 2 to 10)": "Número máximo de votos (de 2 a 10)", "Menu": "Menú", "Message Failed · Click to try again": "Mensaje fallido · Haga clic para volver a intentarlo", "Message Failed · Unauthorized": "Mensaje fallido · No autorizado", @@ -57,6 +66,7 @@ "Message pinned": "Mensaje fijado", "Messages have been marked unread.": "Los mensajes han sido marcados como no leídos.", "Missing permissions to upload the attachment": "Faltan permisos para subir el archivo adjunto", + "Multiple answers": "Múltiples respuestas", "Mute": "Silenciar", "New": "Nuevo", "New Messages!": "¡Nuevos mensajes!", @@ -66,12 +76,16 @@ "Nothing yet...": "Nada aún...", "Ok": "Ok", "Open emoji picker": "Abrir el selector de emojis", + "Option already exists": "La opción ya existe", + "Options": "Opciones", "People matching": "Personas que coinciden", "Pin": "Fijar", "Pinned by": "Fijado por", + "Poll": "Encuesta", "Poll comments": "Comentarios de la encuesta", "Poll options": "Opciones de la encuesta", "Poll results": "Resultados de la encuesta", + "Question": "Pregunta", "Recording format is not supported and cannot be reproduced": "El formato de grabación no es compatible y no se puede reproducir", "Reply": "Responder", "Reply to Message": "Responder al mensaje", @@ -99,6 +113,7 @@ "Thread": "Hilo", "To start recording, allow the camera access in your browser": "Para comenzar a grabar, permita el acceso a la cámara en su navegador", "To start recording, allow the microphone access in your browser": "Para comenzar a grabar, permita el acceso al micrófono en su navegador", + "Type a number from 2 to 10": "Escribe un número del 2 al 10", "Type your message": "Escribe tu mensaje", "Unmute": "Activar sonido", "Unpin": "Desfijar", @@ -131,6 +146,7 @@ "aria/Load More Channels": "Cargar más canales", "aria/Menu": "Menú", "aria/Message Options": "Opciones de mensaje", + "aria/Open Attachment Selector": "Abrir selector de adjuntos", "aria/Open Message Actions Menu": "Abrir menú de acciones de mensaje", "aria/Open Reaction Selector": "Abrir selector de reacciones", "aria/Open Thread": "Abrir hilo", @@ -170,7 +186,7 @@ "{{ imageCount }} more": "{{ imageCount }} más", "{{ memberCount }} members": "{{ memberCount }} miembros", "{{ user }} has been muted": "{{ user }} ha sido silenciado", - "{{ user }} has been unmuted": "{{ user }} se ha desactivado", + "{{ user }} has been unmuted": "Se ha desactivado el silencio de {{ user }}", "{{ user }} is typing...": "{{ user }} está escribiendo...", "{{ users }} and more are typing...": "{{ users }} y más están escribiendo...", "{{ users }} and {{ user }} are typing...": "{{ users }} y {{ user }} están escribiendo...", @@ -181,5 +197,7 @@ "{{count}} votes_many": "{{count}} votos", "{{count}} votes_one": "1 voto", "{{count}} votes_other": "{{count}} votos", - "🏙 Attachment...": "🏙 Adjunto..." + "🏙 Attachment...": "🏙 Adjunto...", + "📊 {{createdBy}} created: {{ pollName}}": "📊 {{createdBy}} creó: {{ pollName}}", + "📊 {{votedBy}} voted: {{pollOptionText}}": "📊 {{votedBy}} votó: {{pollOptionText}}" } diff --git a/src/i18n/fr.json b/src/i18n/fr.json index 75b7b4431d..0895d94d8e 100644 --- a/src/i18n/fr.json +++ b/src/i18n/fr.json @@ -1,10 +1,15 @@ { "Add a comment": "Ajouter un commentaire", + "Add an option": "Ajouter une option", "Allow access to camera": "Autoriser l'accès à la caméra", "Allow access to microphone": "Autoriser l'accès au microphone", + "Allow comments": "Autoriser les commentaires", + "Allow option suggestion": "Autoriser la suggestion d'options", "An error has occurred during recording": "Une erreur s'est produite pendant l'enregistrement", "An error has occurred during the recording processing": "Une erreur s'est produite pendant le traitement de l'enregistrement", "Anonymous": "Anonyme", + "Anonymous poll": "Sondage anonyme", + "Ask a question": "Poser une question", "Attach files": "Joindre des fichiers", "Cancel": "Annuler", "Cannot seek in the recording": "Impossible de rechercher dans l'enregistrement", @@ -13,6 +18,8 @@ "Close emoji picker": "Fermer le sélecteur d'émojis", "Commands matching": "Correspondance des commandes", "Connection failure, reconnecting now...": "Échec de la connexion, reconnexion en cours...", + "Create": "Créer", + "Create poll": "Créer un sondage", "Delete": "Supprimer", "Delivered": "Publié", "Download attachment {{ name }}": "Télécharger la pièce jointe {{ name }}", @@ -44,11 +51,13 @@ "Failed to jump to the first unread message": "Échec du saut vers le premier message non lu", "Failed to mark channel as read": "Échec du marquage du canal comme lu", "Failed to play the recording": "Impossible de lire l'enregistrement", + "File": "Fichier", "File is too large: {{ size }}, maximum upload size is {{ limit }}": "Le fichier est trop volumineux : {{ size }}, la taille maximale de téléchargement est de {{ limit }}", "Flag": "Signaler", "Latest Messages": "Derniers messages", "Load more": "Charger plus", "Mark as unread": "Marquer comme non lu", + "Maximum number of votes (from 2 to 10)": "Nombre maximum de votes (de 2 à 10)", "Menu": "Menu", "Message Failed · Click to try again": "Échec de l'envoi du message - Cliquez pour réessayer", "Message Failed · Unauthorized": "Échec de l'envoi du message - Non autorisé", @@ -57,6 +66,7 @@ "Message pinned": "Message épinglé", "Messages have been marked unread.": "Les messages ont été marqués comme non lus.", "Missing permissions to upload the attachment": "Autorisations manquantes pour télécharger la pièce jointe", + "Multiple answers": "Réponses multiples", "Mute": "Muet", "New": "Nouveau", "New Messages!": "Nouveaux Messages!", @@ -66,12 +76,16 @@ "Nothing yet...": "Rien pour l'instant...", "Ok": "D'accord", "Open emoji picker": "Ouvrir le sélecteur d'émojis", + "Option already exists": "L'option existe déjà", + "Options": "Options", "People matching": "Correspondance de personnes", "Pin": "Épingler", "Pinned by": "Épinglé par", + "Poll": "Sondage", "Poll comments": "Commentaires du sondage", "Poll options": "Options du sondage", "Poll results": "Résultats du sondage", + "Question": "Question", "Recording format is not supported and cannot be reproduced": "Le format d'enregistrement n'est pas pris en charge et ne peut pas être reproduit", "Reply": "Répondre", "Reply to Message": "Répondre au message", @@ -99,6 +113,7 @@ "Thread": "Fil de discussion", "To start recording, allow the camera access in your browser": "Pour commencer l'enregistrement, autorisez l'accès à la caméra dans votre navigateur", "To start recording, allow the microphone access in your browser": "Pour commencer l'enregistrement, autorisez l'accès au microphone dans votre navigateur", + "Type a number from 2 to 10": "Tapez un nombre de 2 à 10", "Type your message": "Tapez votre message", "Unmute": "Désactiver muet", "Unpin": "Détacher", @@ -131,6 +146,7 @@ "aria/Load More Channels": "Charger plus de canaux", "aria/Menu": "Menu", "aria/Message Options": "Options du message", + "aria/Open Attachment Selector": "Ouvrir le sélecteur de pièces jointes", "aria/Open Message Actions Menu": "Ouvrir le menu des actions du message", "aria/Open Reaction Selector": "Ouvrir le sélecteur de réactions", "aria/Open Thread": "Ouvrir le fil", @@ -181,5 +197,7 @@ "{{count}} votes_many": "{{count}} votes", "{{count}} votes_one": "{{count}} vote", "{{count}} votes_other": "{{count}} votes", - "🏙 Attachment...": "🏙 Pièce jointe..." + "🏙 Attachment...": "🏙 Pièce jointe...", + "📊 {{createdBy}} created: {{ pollName}}": "📊 {{createdBy}} a créé : {{ pollName}}", + "📊 {{votedBy}} voted: {{pollOptionText}}": "📊 {{votedBy}} a voté : {{pollOptionText}}" } diff --git a/src/i18n/hi.json b/src/i18n/hi.json index 79c786ffb4..cd4a3ccfaf 100644 --- a/src/i18n/hi.json +++ b/src/i18n/hi.json @@ -1,10 +1,15 @@ { "Add a comment": "एक टिप्पणी जोड़ें", + "Add an option": "एक विकल्प जोड़ें", "Allow access to camera": "कैमरा तक पहुँच दें", "Allow access to microphone": "माइक्रोफ़ोन तक पहुँच दें", + "Allow comments": "टिप्पणियाँ की अनुमति दें", + "Allow option suggestion": "विकल्प सुझाव की अनुमति दें", "An error has occurred during recording": "रेकॉर्डिंग के दौरान एक त्रुटि आ गई है", "An error has occurred during the recording processing": "रेकॉर्डिंग प्रोसेसिंग के दौरान एक त्रुटि आ गई है", "Anonymous": "गुमनाम", + "Anonymous poll": "गुमनाम मतदान", + "Ask a question": "एक प्रश्न पूछें", "Attach files": "फाइल्स अटैच करे", "Cancel": "रद्द करें", "Cannot seek in the recording": "रेकॉर्डिंग में खोज नहीं की जा सकती", @@ -13,6 +18,8 @@ "Close emoji picker": "इमोजी पिकर बंद करें", "Commands matching": "मेल खाती है", "Connection failure, reconnecting now...": "कनेक्शन विफल रहा, अब पुनः कनेक्ट हो रहा है ...", + "Create": "बनाएँ", + "Create poll": "मतदान बनाएँ", "Delete": "डिलीट", "Delivered": "पहुंच गया", "Download attachment {{ name }}": "अनुलग्नक {{ name }} डाउनलोड करें", @@ -45,19 +52,22 @@ "Failed to jump to the first unread message": "पहले अपठित संदेश पर जाने में विफल", "Failed to mark channel as read": "चैनल को पढ़ा हुआ चिह्नित करने में विफल।", "Failed to play the recording": "रेकॉर्डिंग प्ले करने में विफल", + "File": "फ़ाइल", "File is too large: {{ size }}, maximum upload size is {{ limit }}": "फ़ाइल बहुत बड़ी है: {{ size }}, अधिकतम अपलोड साइज़ {{ limit }} है", "Flag": "फ्लैग करे", "Latest Messages": "नवीनतम संदेश", "Load more": "और लोड करें", "Mark as unread": "अपठित चिह्नित करें", + "Maximum number of votes (from 2 to 10)": "अधिकतम वोटों की संख्या (2 से 10)", "Menu": "मेन्यू", - "Message Failed · Click to try again": "मैसेज फ़ैल - पुनः कोशिश करें", - "Message Failed · Unauthorized": "मैसेज फ़ैल - अनधिकृत", + "Message Failed · Click to try again": "मैसेज फ़ैल - पुनः कोशिश करें", + "Message Failed · Unauthorized": "मैसेज फ़ैल - अनधिकृत", "Message deleted": "मैसेज हटा दिया गया", "Message has been successfully flagged": "मैसेज को फ्लैग कर दिया गया है", "Message pinned": "संदेश पिन किया गया", "Messages have been marked unread.": "संदेशों को अपठित चिह्नित किया गया है।", "Missing permissions to upload the attachment": "अटैचमेंट अपलोड करने के लिए अनुमतियां गायब", + "Multiple answers": "कई उत्तर", "Mute": "म्यूट करे", "New": "नए", "New Messages!": "नए मैसेज!", @@ -67,12 +77,16 @@ "Nothing yet...": "कोई मैसेज नहीं है", "Ok": "ठीक है", "Open emoji picker": "इमोजी पिकर खोलिये", + "Option already exists": "विकल्प पहले से मौजूद है", + "Options": "विकल्प", "People matching": "मेल खाते लोग", "Pin": "पिन", "Pinned by": "द्वारा पिन किया गया", + "Poll": "मतदान", "Poll comments": "मतदान टिप्पणियाँ", "Poll options": "मतदान विकल्प", "Poll results": "मतदान परिणाम", + "Question": "प्रश्न", "Recording format is not supported and cannot be reproduced": "रेकॉर्डिंग फ़ॉर्मेट समर्थित नहीं है और पुनः उत्पन्न नहीं किया जा सकता", "Reply": "जवाब दे दो", "Reply to Message": "संदेश का जवाब दें", @@ -97,7 +111,8 @@ "This message was deleted...": "मैसेज हटा दिया गया", "Thread": "रिप्लाई थ्रेड", "To start recording, allow the camera access in your browser": "रिकॉर्डिंग शुरू करने के लिए, अपने ब्राउज़र में कैमरा तक पहुँच दें", - "To start recording, allow the microphone access in your browser": "Tरिकॉर्डिंग शुरू करने के लिए, अपने ब्राउज़र में माइक्रोफ़ोन तक पहुँच दें", + "To start recording, allow the microphone access in your browser": "रिकॉर्डिंग शुरू करने के लिए, अपने ब्राउज़र में माइक्रोफ़ोन तक पहुँच दें", + "Type a number from 2 to 10": "2 से 10 तक का एक नंबर टाइप करें", "Type your message": "अपना मैसेज लिखे", "Unmute": "अनम्यूट", "Unpin": "अनपिन", @@ -129,6 +144,7 @@ "aria/Load More Channels": "और चैनल लोड करें", "aria/Menu": "मेन्यू", "aria/Message Options": "संदेश विकल्प", + "aria/Open Attachment Selector": "अटैचमेंट चयनकर्ता खोलें", "aria/Open Message Actions Menu": "संदेश क्रिया मेन्यू खोलें", "aria/Open Reaction Selector": "प्रतिक्रिया चयनकर्ता खोलें", "aria/Open Thread": "थ्रेड खोलें", @@ -166,13 +182,15 @@ "{{ memberCount }} members": "{{ memberCount }} मेंबर्स", "{{ user }} has been muted": "{{ user }} को म्यूट कर दिया गया है", "{{ user }} has been unmuted": "{{ user }} को अनम्यूट कर दिया गया है", - "{{ user }} is typing...": "{{ user }} is typing...", - "{{ users }} and more are typing...": "{{ users }} and more are typing...", - "{{ users }} and {{ user }} are typing...": "{{ users }} and {{ user }} are typing...", - "{{ watcherCount }} online": "{{ watcherCount }} online", + "{{ user }} is typing...": "{{ user }} टाइप कर रहा है...", + "{{ users }} and more are typing...": "{{ users }} और अधिक टाइप कर रहे हैं...", + "{{ users }} and {{ user }} are typing...": "{{ users }} और {{ user }} टाइप कर रहे हैं...", + "{{ watcherCount }} online": "{{ watcherCount }} ऑनलाइन", "{{count}} unread_one": "{{count}} अपठित", "{{count}} unread_other": "{{count}} अपठित", "{{count}} votes_one": "{{count}} वोट", "{{count}} votes_other": "{{count}} वोट", - "🏙 Attachment...": "🏙 अटैचमेंट" + "🏙 Attachment...": "🏙 अटैचमेंट", + "📊 {{createdBy}} created: {{ pollName}}": "📊 {{createdBy}} ने बनाया: {{ pollName}}", + "📊 {{votedBy}} voted: {{pollOptionText}}": "📊 {{votedBy}} ने वोट दिया: {{pollOptionText}}" } diff --git a/src/i18n/it.json b/src/i18n/it.json index 7568fa19c9..d76b4505b5 100644 --- a/src/i18n/it.json +++ b/src/i18n/it.json @@ -1,10 +1,15 @@ { "Add a comment": "Aggiungi un commento", + "Add an option": "Aggiungi un'opzione", "Allow access to camera": "Consenti l'accesso alla fotocamera", "Allow access to microphone": "Consenti l'accesso al microfono", + "Allow comments": "Consenti i commenti", + "Allow option suggestion": "Consenti il suggerimento di opzioni", "An error has occurred during recording": "Si è verificato un errore durante la registrazione", "An error has occurred during the recording processing": "Si è verificato un errore durante l'elaborazione della registrazione", "Anonymous": "Anonimo", + "Anonymous poll": "Sondaggio anonimo", + "Ask a question": "Fai una domanda", "Attach files": "Allega file", "Cancel": "Annulla", "Cannot seek in the recording": "Impossibile cercare nella registrazione", @@ -13,6 +18,8 @@ "Close emoji picker": "Chiudi il selettore di emoji", "Commands matching": "Comandi corrispondenti", "Connection failure, reconnecting now...": "Errore di connessione, riconnessione in corso...", + "Create": "Crea", + "Create poll": "Crea sondaggio", "Delete": "Elimina", "Delivered": "Consegnato", "Download attachment {{ name }}": "Scarica l'allegato {{ name }}", @@ -44,11 +51,13 @@ "Failed to jump to the first unread message": "Impossibile passare al primo messaggio non letto", "Failed to mark channel as read": "Impossibile contrassegnare il canale come letto", "Failed to play the recording": "Impossibile riprodurre la registrazione", + "File": "File", "File is too large: {{ size }}, maximum upload size is {{ limit }}": "Il file è troppo grande: {{ size }}, la dimensione massima di caricamento è {{ limit }}", "Flag": "Segnala", "Latest Messages": "Ultimi messaggi", "Load more": "Carica di più", "Mark as unread": "Contrassegna come non letto", + "Maximum number of votes (from 2 to 10)": "Numero massimo di voti (da 2 a 10)", "Menu": "Menù", "Message Failed · Click to try again": "Invio messaggio fallito · Clicca per riprovare", "Message Failed · Unauthorized": "Invio messaggio fallito · Non autorizzato", @@ -57,6 +66,7 @@ "Message pinned": "Messaggio bloccato", "Messages have been marked unread.": "I messaggi sono stati contrassegnati come non letti.", "Missing permissions to upload the attachment": "Autorizzazioni mancanti per caricare l'allegato", + "Multiple answers": "Risposte multiple", "Mute": "Silenzia", "New": "Nuovo", "New Messages!": "Nuovi messaggi!", @@ -66,12 +76,16 @@ "Nothing yet...": "Ancora niente...", "Ok": "Ok", "Open emoji picker": "Apri il selettore di emoji", + "Option already exists": "L'opzione esiste già", + "Options": "Opzioni", "People matching": "Persone che corrispondono", "Pin": "Pin", "Pinned by": "Appuntato da", + "Poll": "Sondaggio", "Poll comments": "Commenti del sondaggio", "Poll options": "Opzioni del sondaggio", "Poll results": "Risultati del sondaggio", + "Question": "Domanda", "Recording format is not supported and cannot be reproduced": "Il formato di registrazione non è supportato e non può essere riprodotto", "Reply": "Rispondi", "Reply to Message": "Rispondi al messaggio", @@ -99,6 +113,7 @@ "Thread": "Discussione", "To start recording, allow the camera access in your browser": "Per iniziare a registrare, consenti l'accesso alla fotocamera nel tuo browser", "To start recording, allow the microphone access in your browser": "Per iniziare a registrare, consenti l'accesso al microfono nel tuo browser", + "Type a number from 2 to 10": "Digita un numero da 2 a 10", "Type your message": "Scrivi il tuo messaggio", "Unmute": "Riattiva il notifiche", "Unpin": "Sblocca", @@ -109,7 +124,7 @@ "User uploaded content": "Contenuto caricato dall'utente", "View results": "Vedi risultati", "View {{count}} comments_many": "Visualizza {{count}} commenti", - "View {{count}} comments_one": "Visualizza {{count}} commenti", + "View {{count}} comments_one": "Visualizza {{count}} commento", "View {{count}} comments_other": "Visualizza {{count}} commenti", "Voice message": "Messaggio vocale", "Vote ended": "Voto terminato", @@ -131,11 +146,12 @@ "aria/Load More Channels": "Carica altri canali", "aria/Menu": "Menu", "aria/Message Options": "Opzioni di messaggio", + "aria/Open Attachment Selector": "Apri selettore allegati", "aria/Open Message Actions Menu": "Apri il menu delle azioni di messaggio", "aria/Open Reaction Selector": "Apri il selettore di reazione", "aria/Open Thread": "Apri discussione", "aria/Reaction list": "Elenco delle reazioni", - "aria/Remove attachment": "Rimuovere allegato", + "aria/Remove attachment": "Rimuovi allegato", "aria/Retry upload": "Riprova caricamento", "aria/Send": "Invia", "ban-command-args": "[@nomeutente] [testo]", @@ -151,7 +167,7 @@ "searchResultsCount_many": "{{ count }} risultati", "searchResultsCount_one": "1 risultato", "searchResultsCount_other": "{{ count }} risultati", - "this content could not be displayed": "questo contenuto non puó essere mostrato", + "this content could not be displayed": "questo contenuto non può essere mostrato", "timestamp/DateSeparator": "{{ timestamp | timestampFormatter(calendar: true) }}", "timestamp/MessageTimestamp": "{{ timestamp | timestampFormatter(calendar: true) }}", "timestamp/PollVote": "{{ timestamp | timestampFormatter(format: MMM D [at] HH:mm) }}", @@ -181,5 +197,7 @@ "{{count}} votes_many": "{{count}} voti", "{{count}} votes_one": "{{count}} voto", "{{count}} votes_other": "{{count}} voti", - "🏙 Attachment...": "🏙 Allegato..." + "🏙 Attachment...": "🏙 Allegato...", + "📊 {{createdBy}} created: {{ pollName}}": "📊 {{createdBy}} ha creato: {{ pollName}}", + "📊 {{votedBy}} voted: {{pollOptionText}}": "📊 {{votedBy}} ha votato: {{pollOptionText}}" } diff --git a/src/i18n/ja.json b/src/i18n/ja.json index 320859ba2e..b724a0c79f 100644 --- a/src/i18n/ja.json +++ b/src/i18n/ja.json @@ -1,10 +1,15 @@ { "Add a comment": "コメントを追加", + "Add an option": "オプションを追加", "Allow access to camera": "カメラへのアクセスを許可する", "Allow access to microphone": "マイクロフォンへのアクセスを許可する", + "Allow comments": "コメントを許可", + "Allow option suggestion": "オプションの提案を許可", "An error has occurred during recording": "録音中にエラーが発生しました", "An error has occurred during the recording processing": "録音処理中にエラーが発生しました", "Anonymous": "匿名", + "Anonymous poll": "匿名投票", + "Ask a question": "質問する", "Attach files": "ファイルを添付する", "Cancel": "キャンセル", "Cannot seek in the recording": "録音中にシークできません", @@ -13,6 +18,8 @@ "Close emoji picker": "絵文字ピッカーを閉める", "Commands matching": "一致するコマンド", "Connection failure, reconnecting now...": "接続が失敗しました。再接続中...", + "Create": "作成", + "Create poll": "投票を作成", "Delete": "消去", "Delivered": "配信しました", "Download attachment {{ name }}": "添付ファイル {{ name }} をダウンロード", @@ -44,11 +51,13 @@ "Failed to jump to the first unread message": "最初の未読メッセージにジャンプできませんでした", "Failed to mark channel as read": "チャンネルを既読にすることができませんでした", "Failed to play the recording": "録音の再生に失敗しました", + "File": "ファイル", "File is too large: {{ size }}, maximum upload size is {{ limit }}": "ファイルが大きすぎます:{{ size }}、最大アップロードサイズは{{ limit }}です", "Flag": "フラグ", "Latest Messages": "最新のメッセージ", "Load more": "もっと読み込む", "Mark as unread": "未読としてマーク", + "Maximum number of votes (from 2 to 10)": "最大投票数(2から10まで)", "Menu": "メニュー", "Message Failed · Click to try again": "メッセージが失敗しました · クリックして再試行してください", "Message Failed · Unauthorized": "メッセージが失敗しました · 許可されていません", @@ -57,6 +66,7 @@ "Message pinned": "メッセージにピンが付けられました", "Messages have been marked unread.": "メッセージは未読としてマークされました。", "Missing permissions to upload the attachment": "添付ファイルをアップロードするための許可がありません", + "Multiple answers": "複数回答", "Mute": "無音", "New": "新しい", "New Messages!": "新しいメッセージ!", @@ -66,12 +76,16 @@ "Nothing yet...": "まだ何もありません...", "Ok": "OK", "Open emoji picker": "絵文字ピッカーを開く", + "Option already exists": "オプションは既に存在します", + "Options": "オプション", "People matching": "一致する人", "Pin": "ピン", "Pinned by": "ピンした方", + "Poll": "投票", "Poll comments": "投票コメント", "Poll options": "投票オプション", "Poll results": "投票結果", + "Question": "質問", "Recording format is not supported and cannot be reproduced": "録音形式はサポートされておらず、再生できません", "Reply": "返事", "Reply to Message": "メッセージに返信", @@ -95,6 +109,7 @@ "Thread": "スレッド", "To start recording, allow the camera access in your browser": "録音を開始するには、ブラウザーでカメラへのアクセスを許可してください", "To start recording, allow the microphone access in your browser": "録音を開始するには、ブラウザーでマイクロフォンへのアクセスを許可してください", + "Type a number from 2 to 10": "2から10までの数字を入力してください", "Type your message": "メッセージを入力してください", "Unmute": "無音を解除する", "Unpin": "ピンを解除する", @@ -125,6 +140,7 @@ "aria/Load More Channels": "さらにチャンネルを読み込む", "aria/Menu": "メニュー", "aria/Message Options": "メッセージオプション", + "aria/Open Attachment Selector": "添付ファイル選択を開く", "aria/Open Message Actions Menu": "メッセージアクションメニューを開く", "aria/Open Reaction Selector": "リアクションセレクターを開く", "aria/Open Thread": "スレッドを開く", @@ -161,11 +177,13 @@ "{{ memberCount }} members": "{{ memberCount }} メンバー", "{{ user }} has been muted": "{{ user }} 無音されています", "{{ user }} has been unmuted": "{{ user }} 無音されていません", - "{{ user }} is typing...": "{{ user }} is typing...", - "{{ users }} and more are typing...": "{{ users }} and more are typing...", - "{{ users }} and {{ user }} are typing...": "{{ users }} and {{ user }} are typing...", + "{{ user }} is typing...": "{{ user }} が入力中...", + "{{ users }} and more are typing...": "{{ users }} とその他が入力中...", + "{{ users }} and {{ user }} are typing...": "{{ users }} と {{ user }} が入力中...", "{{ watcherCount }} online": "{{ watcherCount }} オンライン", "{{count}} unread_other": "{{count}} 未読", "{{count}} votes_other": "{{count}} 票", - "🏙 Attachment...": "🏙 アタッチメント..." + "🏙 Attachment...": "🏙 アタッチメント...", + "📊 {{createdBy}} created: {{ pollName}}": "📊 {{createdBy}} が作成: {{ pollName}}", + "📊 {{votedBy}} voted: {{pollOptionText}}": "📊 {{votedBy}} が投票: {{pollOptionText}}" } diff --git a/src/i18n/ko.json b/src/i18n/ko.json index 052bfbe26e..a2849ef655 100644 --- a/src/i18n/ko.json +++ b/src/i18n/ko.json @@ -1,10 +1,15 @@ { "Add a comment": "댓글 추가", + "Add an option": "옵션 추가", "Allow access to camera": "카메라에 대한 액세스 허용", "Allow access to microphone": "마이크로폰에 대한 액세스 허용", + "Allow comments": "댓글 허용", + "Allow option suggestion": "옵션 제안 허용", "An error has occurred during recording": "녹음 중 오류가 발생했습니다", "An error has occurred during the recording processing": "녹음 처리 중 오류가 발생했습니다", "Anonymous": "익명", + "Anonymous poll": "익명 투표", + "Ask a question": "질문하기", "Attach files": "파일 첨부", "Cancel": "취소", "Cannot seek in the recording": "녹음에서 찾을 수 없습니다", @@ -13,6 +18,8 @@ "Close emoji picker": "이모티콘 선택기 닫기", "Commands matching": "일치하는 명령", "Connection failure, reconnecting now...": "연결 실패, 지금 다시 연결 중...", + "Create": "생성", + "Create poll": "투표 생성", "Delete": "삭제", "Delivered": "배달됨", "Download attachment {{ name }}": "첨부 파일 {{ name }} 다운로드", @@ -44,11 +51,13 @@ "Failed to jump to the first unread message": "첫 번째 읽지 않은 메시지로 이동하지 못했습니다", "Failed to mark channel as read": "채널을 읽음으로 표시하는 데 실패했습니다", "Failed to play the recording": "녹음을 재생하지 못했습니다", + "File": "파일", "File is too large: {{ size }}, maximum upload size is {{ limit }}": "파일이 너무 큽니다: {{ size }}, 최대 업로드 크기는 {{ limit }}입니다", "Flag": "플래그", "Latest Messages": "최신 메시지", "Load more": "더 불러오기", "Mark as unread": "읽지 않음으로 표시", + "Maximum number of votes (from 2 to 10)": "최대 투표 수 (2에서 10까지)", "Menu": "메뉴", "Message Failed · Click to try again": "메시지 실패 · 다시 시도하려면 클릭하세요.", "Message Failed · Unauthorized": "메시지 실패 · 승인되지 않음", @@ -57,6 +66,7 @@ "Message pinned": "메시지 핀했습니다", "Messages have been marked unread.": "메시지가 읽지 않음으로 표시되었습니다.", "Missing permissions to upload the attachment": "첨부 파일을 업로드하려면 권한이 필요합니다", + "Multiple answers": "복수 응답", "Mute": "무음", "New": "새로운", "New Messages!": "새 메시지!", @@ -66,12 +76,16 @@ "Nothing yet...": "아직 아무것도...", "Ok": "확인", "Open emoji picker": "이모티콘 선택기 열기", + "Option already exists": "옵션이 이미 존재합니다", + "Options": "옵션", "People matching": "일치하는 사람", "Pin": "핀", "Pinned by": "핀했던 분:", + "Poll": "투표", "Poll comments": "투표 댓글", "Poll options": "투표 옵션", "Poll results": "투표 결과", + "Question": "질문", "Recording format is not supported and cannot be reproduced": "녹음 형식이 지원되지 않으므로 재생할 수 없습니다", "Reply": "답장", "Reply to Message": "메시지에 답장", @@ -95,6 +109,7 @@ "Thread": "스레드", "To start recording, allow the camera access in your browser": "브라우저에서 카메라 액세스를 허용하여 녹음을 시작합니다", "To start recording, allow the microphone access in your browser": "브라우저에서 마이크로폰 액세스를 허용하여 녹음을 시작합니다", + "Type a number from 2 to 10": "2에서 10 사이의 숫자를 입력하세요", "Type your message": "메시지 입력", "Unmute": "음소거 해제", "Unpin": "핀 해제", @@ -125,6 +140,7 @@ "aria/Load More Channels": "더 많은 채널 불러오기", "aria/Menu": "메뉴", "aria/Message Options": "메시지 옵션", + "aria/Open Attachment Selector": "첨부 파일 선택기 열기", "aria/Open Message Actions Menu": "메시지 액션 메뉴 열기", "aria/Open Reaction Selector": "반응 선택기 열기", "aria/Open Thread": "스레드 열기", @@ -161,11 +177,13 @@ "{{ memberCount }} members": "{{ memberCount }}명", "{{ user }} has been muted": "{{ user }} 음소거되었습니다", "{{ user }} has been unmuted": "{{ user }} 음소거가 해제되었습니다", - "{{ user }} is typing...": "{{ user }} is typing...", - "{{ users }} and more are typing...": "{{ users }} and more are typing...", - "{{ users }} and {{ user }} are typing...": "{{ users }} and {{ user }} are typing...", + "{{ user }} is typing...": "{{ user }}이(가) 입력 중입니다...", + "{{ users }} and more are typing...": "{{ users }}와(과) 더 많은 사람들이 입력 중입니다...", + "{{ users }} and {{ user }} are typing...": "{{ users }}와(과) {{ user }}이(가) 입력 중입니다...", "{{ watcherCount }} online": "{{ watcherCount }} 온라인", "{{count}} unread_other": "{{count}} 읽지 않음", "{{count}} votes_other": "{{count}} 투표", - "🏙 Attachment...": "🏙 부착..." + "🏙 Attachment...": "🏙 부착...", + "📊 {{createdBy}} created: {{ pollName}}": "📊 {{createdBy}}이(가) 생성함: {{ pollName}}", + "📊 {{votedBy}} voted: {{pollOptionText}}": "📊 {{votedBy}}이(가) 투표함: {{pollOptionText}}" } diff --git a/src/i18n/nl.json b/src/i18n/nl.json index 02bbaeb5bf..9ae11b262d 100644 --- a/src/i18n/nl.json +++ b/src/i18n/nl.json @@ -1,10 +1,15 @@ { "Add a comment": "Voeg een opmerking toe", + "Add an option": "Voeg een optie toe", "Allow access to camera": "Toegang tot camera toestaan", "Allow access to microphone": "Toegang tot microfoon toestaan", + "Allow comments": "Sta opmerkingen toe", + "Allow option suggestion": "Sta optie-suggesties toe", "An error has occurred during recording": "Er is een fout opgetreden tijdens het opnemen", "An error has occurred during the recording processing": "Er is een fout opgetreden tijdens de verwerking van de opname", "Anonymous": "Anoniem", + "Anonymous poll": "Anonieme peiling", + "Ask a question": "Stel een vraag", "Attach files": "Bijlage toevoegen", "Cancel": "Annuleer", "Cannot seek in the recording": "Kan niet zoeken in de opname", @@ -13,6 +18,8 @@ "Close emoji picker": "Sluit de emoji-kiezer", "Commands matching": "Bijpassende opdrachten", "Connection failure, reconnecting now...": "Verbindingsfout, opnieuw verbinden...", + "Create": "Maak", + "Create poll": "Maak peiling", "Delete": "Verwijder", "Delivered": "Afgeleverd", "Download attachment {{ name }}": "Bijlage {{ name }} downloaden", @@ -39,16 +46,18 @@ "Error uploading attachment": "Fout bij het uploaden van de bijlage", "Error uploading file": "Fout bij uploaden bestand", "Error uploading image": "Fout bij uploaden afbeelding", - "Error · Unsent": "Error: · niet verzonden", - "Error: {{ errorMessage }}": "Error: {{ errorMessage }}", + "Error · Unsent": "Fout · niet verzonden", + "Error: {{ errorMessage }}": "Fout: {{ errorMessage }}", "Failed to jump to the first unread message": "Niet gelukt om naar het eerste ongelezen bericht te springen", "Failed to mark channel as read": "Kanaal kon niet als gelezen worden gemarkeerd", "Failed to play the recording": "Kan de opname niet afspelen", + "File": "Bestand", "File is too large: {{ size }}, maximum upload size is {{ limit }}": "Bestand is te groot: {{ size }}, maximale uploadgrootte is {{ limit }}", "Flag": "Markeer", "Latest Messages": "Laatste berichten", "Load more": "Meer laden", "Mark as unread": "Markeren als ongelezen", + "Maximum number of votes (from 2 to 10)": "Maximaal aantal stemmen (van 2 tot 10)", "Menu": "Menu", "Message Failed · Click to try again": "Bericht mislukt, klik om het nogmaals te proberen", "Message Failed · Unauthorized": "Bericht mislukt, ongeautoriseerd", @@ -57,21 +66,26 @@ "Message pinned": "Bericht vastgezet", "Messages have been marked unread.": "Berichten zijn gemarkeerd als ongelezen.", "Missing permissions to upload the attachment": "Missende toestemmingen om de bijlage te uploaden", - "Mute": "Mute", + "Multiple answers": "Meerdere antwoorden", + "Mute": "Dempen", "New": "Nieuwe", "New Messages!": "Nieuwe Berichten!", "No chats here yet…": "Nog geen chats hier...", "No results found": "Geen resultaten gevonden", - "Nobody will be able to vote in this poll anymore.": "Niemand kan meer stemmen in deze poll.", + "Nobody will be able to vote in this poll anymore.": "Niemand kan meer stemmen in deze peiling.", "Nothing yet...": "Nog niets ...", "Ok": "Oké", "Open emoji picker": "Open emojipicker", + "Option already exists": "Optie bestaat al", + "Options": "Opties", "People matching": "Mensen die matchen", "Pin": "Pin", "Pinned by": "Vastgemaakt door", - "Poll comments": "Poll opmerkingen", - "Poll options": "Poll opties", - "Poll results": "Poll resultaten", + "Poll": "Peiling", + "Poll comments": "Peiling opmerkingen", + "Poll options": "Peiling opties", + "Poll results": "Peiling resultaten", + "Question": "Vraag", "Recording format is not supported and cannot be reproduced": "Opnameformaat wordt niet ondersteund en kan niet worden gereproduceerd", "Reply": "Antwoord", "Reply to Message": "Antwoord op bericht", @@ -97,8 +111,9 @@ "Thread": "Draadje", "To start recording, allow the camera access in your browser": "Om te beginnen met opnemen, sta toegang tot de camera toe in uw browser", "To start recording, allow the microphone access in your browser": "Om te beginnen met opnemen, sta toegang tot de microfoon toe in uw browser", + "Type a number from 2 to 10": "Typ een getal van 2 tot 10", "Type your message": "Type je bericht", - "Unmute": "Unmute", + "Unmute": "Dempen opheffen", "Unpin": "Losmaken", "Unread messages": "Ongelezen berichten", "Unsupported attachment": "Niet-ondersteunde bijlage", @@ -128,6 +143,7 @@ "aria/Load More Channels": "Meer kanalen laden", "aria/Menu": "Menu", "aria/Message Options": "Berichtopties", + "aria/Open Attachment Selector": "Open bijlage selector", "aria/Open Message Actions Menu": "Menu voor berichtacties openen", "aria/Open Reaction Selector": "Reactiekiezer openen", "aria/Open Thread": "Draad openen", @@ -163,15 +179,17 @@ "{{ firstUser }} and {{ secondUser }}": "{{ firstUser }} en {{ secondUser }}", "{{ imageCount }} more": "+{{ imageCount }}", "{{ memberCount }} members": "{{ memberCount }} deelnemers", - "{{ user }} has been muted": "{{ user }} is muted", - "{{ user }} has been unmuted": "{{ user }} is unmuted", - "{{ user }} is typing...": "{{ user }} is typing...", - "{{ users }} and more are typing...": "{{ users }} and more are typing...", - "{{ users }} and {{ user }} are typing...": "{{ users }} and {{ user }} are typing...", + "{{ user }} has been muted": "{{ user }} is gedempt", + "{{ user }} has been unmuted": "{{ user }} is niet meer gedempt", + "{{ user }} is typing...": "{{ user }} is aan het typen...", + "{{ users }} and more are typing...": "{{ users }} en meer zijn aan het typen...", + "{{ users }} and {{ user }} are typing...": "{{ users }} en {{ user }} zijn aan het typen...", "{{ watcherCount }} online": "{{ watcherCount }} online", "{{count}} unread_one": "{{count}} ongelezen", "{{count}} unread_other": "{{count}} ongelezen", "{{count}} votes_one": "{{count}} stem", "{{count}} votes_other": "{{count}} stemmen", - "🏙 Attachment...": "🏙 Bijlage..." + "🏙 Attachment...": "🏙 Bijlage...", + "📊 {{createdBy}} created: {{ pollName}}": "📊 {{createdBy}} heeft gemaakt: {{ pollName}}", + "📊 {{votedBy}} voted: {{pollOptionText}}": "📊 {{votedBy}} heeft gestemd: {{pollOptionText}}" } diff --git a/src/i18n/pt.json b/src/i18n/pt.json index a21f503d6a..0a5370ba48 100644 --- a/src/i18n/pt.json +++ b/src/i18n/pt.json @@ -1,10 +1,15 @@ { "Add a comment": "Adicionar um comentário", + "Add an option": "Adicionar uma opção", "Allow access to camera": "Permitir acesso à câmera", "Allow access to microphone": "Permitir acesso ao microfone", + "Allow comments": "Permitir comentários", + "Allow option suggestion": "Permitir sugestão de opção", "An error has occurred during recording": "Ocorreu um erro durante a gravação", "An error has occurred during the recording processing": "Ocorreu um erro durante o processamento da gravação", "Anonymous": "Anônimo", + "Anonymous poll": "Enquete anônima", + "Ask a question": "Faça uma pergunta", "Attach files": "Anexar arquivos", "Cancel": "Cancelar", "Cannot seek in the recording": "Não é possível buscar na gravação", @@ -13,6 +18,8 @@ "Close emoji picker": "Fechar seletor de emoji", "Commands matching": "Comandos correspondentes", "Connection failure, reconnecting now...": "Falha de conexão, reconectando agora...", + "Create": "Criar", + "Create poll": "Criar enquete", "Delete": "Excluir", "Delivered": "Entregue", "Download attachment {{ name }}": "Baixar anexo {{ name }}", @@ -44,11 +51,13 @@ "Failed to jump to the first unread message": "Falha ao pular para a primeira mensagem não lida", "Failed to mark channel as read": "Falha ao marcar o canal como lido", "Failed to play the recording": "Falha ao reproduzir a gravação", + "File": "Arquivo", "File is too large: {{ size }}, maximum upload size is {{ limit }}": "O arquivo é muito grande: {{ size }}, o tamanho máximo de upload é {{ limit }}", "Flag": "Reportar", "Latest Messages": "Mensagens mais recentes", "Load more": "Carregar mais", "Mark as unread": "Marcar como não lida", + "Maximum number of votes (from 2 to 10)": "Número máximo de votos (de 2 a 10)", "Menu": "Menu", "Message Failed · Click to try again": "A mensagem falhou · Clique para tentar novamente", "Message Failed · Unauthorized": "A mensagem falhou · não autorizado", @@ -57,6 +66,7 @@ "Message pinned": "Mensagem fixada", "Messages have been marked unread.": "Mensagens foram marcadas como não lidas.", "Missing permissions to upload the attachment": "Faltando permissões para enviar o anexo", + "Multiple answers": "Múltiplas respostas", "Mute": "Silenciar", "New": "Novo", "New Messages!": "Novas Mensagens!", @@ -66,12 +76,16 @@ "Nothing yet...": "Nada ainda...", "Ok": "Ok", "Open emoji picker": "Abrir seletor de emoji", + "Option already exists": "Opção já existe", + "Options": "Opções", "People matching": "Pessoas correspondentes", "Pin": "Fixar", "Pinned by": "Fixado por", + "Poll": "Enquete", "Poll comments": "Comentários da pesquisa", "Poll options": "Opções da pesquisa", "Poll results": "Resultados da pesquisa", + "Question": "Pergunta", "Recording format is not supported and cannot be reproduced": "Formato de gravação não é suportado e não pode ser reproduzido", "Reply": "Responder", "Reply to Message": "Responder à mensagem", @@ -99,6 +113,7 @@ "Thread": "Fio", "To start recording, allow the camera access in your browser": "Para começar a gravar, permita o acesso à câmera no seu navegador", "To start recording, allow the microphone access in your browser": "Para começar a gravar, permita o acesso ao microfone no seu navegador", + "Type a number from 2 to 10": "Digite um número de 2 a 10", "Type your message": "Digite sua mensagem", "Unmute": "Ativar som", "Unpin": "Desfixar", @@ -131,6 +146,7 @@ "aria/Load More Channels": "Carregar mais canais", "aria/Menu": "Menu", "aria/Message Options": "Opções de mensagem", + "aria/Open Attachment Selector": "Abrir seletor de anexos", "aria/Open Message Actions Menu": "Abrir menu de ações de mensagem", "aria/Open Reaction Selector": "Abrir seletor de reações", "aria/Open Thread": "Abrir tópico", @@ -171,9 +187,9 @@ "{{ memberCount }} members": "{{ memberCount }} membros", "{{ user }} has been muted": "{{ user }} foi silenciado", "{{ user }} has been unmuted": "{{ user }} foi reativado", - "{{ user }} is typing...": "{{ user }} is typing...", - "{{ users }} and more are typing...": "{{ users }} and more are typing...", - "{{ users }} and {{ user }} are typing...": "{{ users }} and {{ user }} are typing...", + "{{ user }} is typing...": "{{ user }} está digitando...", + "{{ users }} and more are typing...": "{{ users }} e mais estão digitando...", + "{{ users }} and {{ user }} are typing...": "{{ users }} e {{ user }} estão digitando...", "{{ watcherCount }} online": "{{ watcherCount }} online", "{{count}} unread_many": "{{count}} não lidos", "{{count}} unread_one": "{{count}} não lido", @@ -181,5 +197,7 @@ "{{count}} votes_many": "{{count}} votos", "{{count}} votes_one": "{{count}} voto", "{{count}} votes_other": "{{count}} votos", - "🏙 Attachment...": "🏙 Anexo..." + "🏙 Attachment...": "🏙 Anexo...", + "📊 {{createdBy}} created: {{ pollName}}": "📊 {{createdBy}} criou: {{ pollName}}", + "📊 {{votedBy}} voted: {{pollOptionText}}": "📊 {{votedBy}} votou: {{pollOptionText}}" } diff --git a/src/i18n/ru.json b/src/i18n/ru.json index c22f954fe8..777ff4561f 100644 --- a/src/i18n/ru.json +++ b/src/i18n/ru.json @@ -1,10 +1,15 @@ { "Add a comment": "Добавить комментарий", + "Add an option": "Добавить вариант", "Allow access to camera": "Разрешить доступ к камере", - "Allow access to microphone": "Разрешить доступ к микрофон", + "Allow access to microphone": "Разрешить доступ к микрофону", + "Allow comments": "Разрешить комментарии", + "Allow option suggestion": "Разрешить предложение вариантов", "An error has occurred during recording": "Произошла ошибка во время записи", "An error has occurred during the recording processing": "Произошла ошибка во время обработки записи", "Anonymous": "Аноним", + "Anonymous poll": "Анонимный опрос", + "Ask a question": "Задать вопрос", "Attach files": "Прикрепить файлы", "Cancel": "Отмена", "Cannot seek in the recording": "Невозможно осуществить поиск в записи", @@ -13,6 +18,8 @@ "Close emoji picker": "Закрыть окно выбора смайлов", "Commands matching": "Соответствие команд", "Connection failure, reconnecting now...": "Ошибка соединения, переподключение...", + "Create": "Создать", + "Create poll": "Создать опрос", "Delete": "Удалить", "Delivered": "Отправлено", "Download attachment {{ name }}": "Скачать вложение {{ name }}", @@ -44,11 +51,13 @@ "Failed to jump to the first unread message": "Не удалось перейти к первому непрочитанному сообщению", "Failed to mark channel as read": "Не удалось пометить канал как прочитанный", "Failed to play the recording": "Не удалось воспроизвести запись", + "File": "Файл", "File is too large: {{ size }}, maximum upload size is {{ limit }}": "Файл слишком большой: {{ size }}, максимальный размер загрузки составляет {{ limit }}", "Flag": "Пожаловаться", "Latest Messages": "Последние сообщения", "Load more": "Загрузить больше", "Mark as unread": "Отметить как непрочитанное", + "Maximum number of votes (from 2 to 10)": "Максимальное количество голосов (от 2 до 10)", "Menu": "Меню", "Message Failed · Click to try again": "Ошибка отправки сообщения · Нажмите чтобы повторить", "Message Failed · Unauthorized": "Ошибка отправки сообщения · Неавторизованный", @@ -57,6 +66,7 @@ "Message pinned": "Сообщение закреплено", "Messages have been marked unread.": "Сообщения были отмечены как непрочитанные.", "Missing permissions to upload the attachment": "Отсутствуют разрешения для загрузки вложения", + "Multiple answers": "Несколько ответов", "Mute": "Отключить уведомления", "New": "Новые", "New Messages!": "Новые сообщения!", @@ -66,12 +76,16 @@ "Nothing yet...": "Пока ничего нет...", "Ok": "Ок", "Open emoji picker": "Открыть выбор смайлов", + "Option already exists": "Вариант уже существует", + "Options": "Варианты", "People matching": "Совпадающие люди", "Pin": "Закрепить", "Pinned by": "Закреплено", + "Poll": "Опрос", "Poll comments": "Комментарии к опросу", "Poll options": "Опции опроса", "Poll results": "Результаты опроса", + "Question": "Вопрос", "Recording format is not supported and cannot be reproduced": "Формат записи не поддерживается и не может быть воспроизведен", "Reply": "Ответить", "Reply to Message": "Ответить на сообщение", @@ -101,6 +115,7 @@ "Thread": "Ветка", "To start recording, allow the camera access in your browser": "Для начала записи разрешите доступ к камере в вашем браузере", "To start recording, allow the microphone access in your browser": "Для начала записи разрешите доступ к микрофону в вашем браузере", + "Type a number from 2 to 10": "Введите число от 2 до 10", "Type your message": "Ваше сообщение", "Unmute": "Включить уведомления", "Unpin": "Открепить", @@ -134,6 +149,7 @@ "aria/Load More Channels": "Загрузить больше каналов", "aria/Menu": "Меню", "aria/Message Options": "Параметры сообщения", + "aria/Open Attachment Selector": "Открыть выбор вложений", "aria/Open Message Actions Menu": "Открыть меню действий с сообщениями", "aria/Open Reaction Selector": "Открыть селектор реакций", "aria/Open Thread": "Открыть тему", @@ -174,12 +190,12 @@ "{{ commaSeparatedUsers }}, and {{ lastUser }}": "{{ commaSeparatedUsers }} и {{ lastUser }}", "{{ firstUser }} and {{ secondUser }}": "{{ firstUser }} и {{ secondUser }}", "{{ imageCount }} more": "Ещё {{ imageCount }}", - "{{ memberCount }} members": "{{ memberCount }} члены", + "{{ memberCount }} members": "{{ memberCount }} участников", "{{ user }} has been muted": "Вы отписались от уведомлений от {{ user }}", "{{ user }} has been unmuted": "Уведомления от {{ user }} были включены", - "{{ user }} is typing...": "{{ user }} is typing...", - "{{ users }} and more are typing...": "{{ users }} and more are typing...", - "{{ users }} and {{ user }} are typing...": "{{ users }} and {{ user }} are typing...", + "{{ user }} is typing...": "{{ user }} печатает...", + "{{ users }} and more are typing...": "{{ users }} и другие печатают...", + "{{ users }} and {{ user }} are typing...": "{{ users }} и {{ user }} печатают...", "{{ watcherCount }} online": "{{ watcherCount }} в сети", "{{count}} unread_few": "{{count}} непрочитанных", "{{count}} unread_many": "{{count}} непрочитанных", @@ -189,5 +205,7 @@ "{{count}} votes_many": "{{count}} голосов", "{{count}} votes_one": "{{count}} голос", "{{count}} votes_other": "{{count}} голосов", - "🏙 Attachment...": "🏙 Вложение..." + "🏙 Attachment...": "🏙 Вложение...", + "📊 {{createdBy}} created: {{ pollName}}": "📊 {{createdBy}} создал(а): {{ pollName}}", + "📊 {{votedBy}} voted: {{pollOptionText}}": "📊 {{votedBy}} проголосовал(а): {{pollOptionText}}" } diff --git a/src/i18n/tr.json b/src/i18n/tr.json index fcc8803a60..852b8a759b 100644 --- a/src/i18n/tr.json +++ b/src/i18n/tr.json @@ -1,10 +1,15 @@ { "Add a comment": "Yorum ekle", + "Add an option": "Bir seçenek ekle", "Allow access to camera": "Kameraya erişime izin ver", "Allow access to microphone": "Mikrofona erişime izin ver", + "Allow comments": "Yorumlara izin ver", + "Allow option suggestion": "Seçenek önerisine izin ver", "An error has occurred during recording": "Kayıt sırasında bir hata oluştu", "An error has occurred during the recording processing": "Kayıt işlemi sırasında bir hata oluştu", "Anonymous": "Anonim", + "Anonymous poll": "Anonim anket", + "Ask a question": "Bir soru sor", "Attach files": "Dosya ekle", "Cancel": "İptal", "Cannot seek in the recording": "Kayıtta arama yapılamıyor", @@ -13,6 +18,8 @@ "Close emoji picker": "Emoji seçiciyi kapat", "Commands matching": "Eşleşen komutlar", "Connection failure, reconnecting now...": "Bağlantı hatası, tekrar bağlanılıyor...", + "Create": "Oluştur", + "Create poll": "Anket oluştur", "Delete": "Sil", "Delivered": "İletildi", "Download attachment {{ name }}": "Ek {{ name }}'i indir", @@ -44,11 +51,13 @@ "Failed to jump to the first unread message": "İlk okunmamış mesaja atlamada hata oluştu", "Failed to mark channel as read": "Kanalı okundu olarak işaretleme başarısız oldu", "Failed to play the recording": "Kayıt oynatılamadı", + "File": "Dosya", "File is too large: {{ size }}, maximum upload size is {{ limit }}": "Dosya çok büyük: {{ size }}, maksimum yükleme boyutu {{ limit }}", "Flag": "Bayrak", "Latest Messages": "Son Mesajlar", "Load more": "Daha fazla yükle", "Mark as unread": "Okunmamış olarak işaretle", + "Maximum number of votes (from 2 to 10)": "Maksimum oy sayısı (2 ile 10 arası)", "Menu": "Menü", "Message Failed · Click to try again": "Mesaj Başarısız · Tekrar denemek için tıklayın", "Message Failed · Unauthorized": "Mesaj Başarısız · Yetkisiz", @@ -57,6 +66,7 @@ "Message pinned": "Mesaj sabitlendi", "Messages have been marked unread.": "Mesajlar okunmamış olarak işaretlendi.", "Missing permissions to upload the attachment": "Ek yüklemek için izinler eksik", + "Multiple answers": "Çoklu cevaplar", "Mute": "Sessiz", "New": "Yeni", "New Messages!": "Yeni Mesajlar!", @@ -66,12 +76,16 @@ "Nothing yet...": "Şimdilik hiçbir şey...", "Ok": "Tamam", "Open emoji picker": "Emoji klavyesini aç", + "Option already exists": "Seçenek zaten mevcut", + "Options": "Seçenekler", "People matching": "Eşleşen kişiler", - "Pin": "Toplu iğne", + "Pin": "Sabitle", "Pinned by": "Sabitleyen", + "Poll": "Anket", "Poll comments": "Anket yorumları", "Poll options": "Anket seçenekleri", "Poll results": "Anket sonuçları", + "Question": "Soru", "Recording format is not supported and cannot be reproduced": "Kayıt formatı desteklenmiyor ve çoğaltılamıyor", "Reply": "Cevapla", "Reply to Message": "Mesaja Cevapla", @@ -97,6 +111,7 @@ "Thread": "Konu", "To start recording, allow the camera access in your browser": "Kayıt yapmaya başlamak için tarayıcınızda kameraya erişime izin verin", "To start recording, allow the microphone access in your browser": "Kayıt yapmaya başlamak için tarayıcınızda mikrofona erişime izin verin", + "Type a number from 2 to 10": "2 ile 10 arasında bir sayı yazın", "Type your message": "Mesajınızı yazın", "Unmute": "Sesini aç", "Unpin": "Sabitlemeyi kaldır", @@ -114,27 +129,28 @@ "You": "Sen", "You have no channels currently": "Henüz kanalınız yok", "You've reached the maximum number of files": "Maksimum dosya sayısına ulaştınız", - "aria/Attachment": "Bijlage", - "aria/Cancel Reply": "Antwoord annuleren", - "aria/Cancel upload": "Upload annuleren", - "aria/Channel list": "Kanaallijst", - "aria/Channel search results": "Zoekresultaten voor kanalen", - "aria/Close thread": "Draad sluiten", + "aria/Attachment": "Ek", + "aria/Cancel Reply": "Cevabı İptal Et", + "aria/Cancel upload": "Yüklemeyi İptal Et", + "aria/Channel list": "Kanal listesi", + "aria/Channel search results": "Kanal arama sonuçları", + "aria/Close thread": "Konuyu kapat", "aria/Download attachment": "Ek indir", - "aria/Emoji picker": "Emoji kiezer", - "aria/File input": "Bestandsinvoer", - "aria/File upload": "Bestand uploaden", - "aria/Image input": "Afbeelding invoeren", - "aria/Load More Channels": "Meer kanalen laden", - "aria/Menu": "Menu", - "aria/Message Options": "Berichtopties", - "aria/Open Message Actions Menu": "Menu voor berichtacties openen", - "aria/Open Reaction Selector": "Reactiekiezer openen", - "aria/Open Thread": "Draad openen", - "aria/Reaction list": "Reactielijst", + "aria/Emoji picker": "Emoji seçici", + "aria/File input": "Dosya girişi", + "aria/File upload": "Dosya yükleme", + "aria/Image input": "Resim girişi", + "aria/Load More Channels": "Daha Fazla Kanal Yükle", + "aria/Menu": "Menü", + "aria/Message Options": "Mesaj Seçenekleri", + "aria/Open Attachment Selector": "Ek Seçiciyi Aç", + "aria/Open Message Actions Menu": "Mesaj İşlemleri Menüsünü Aç", + "aria/Open Reaction Selector": "Tepki Seçiciyi Aç", + "aria/Open Thread": "Konuyu Aç", + "aria/Reaction list": "Tepki listesi", "aria/Remove attachment": "Eki kaldır", - "aria/Retry upload": "Upload opnieuw proberen", - "aria/Send": "Verzenden", + "aria/Retry upload": "Yüklemeyi Tekrar Dene", + "aria/Send": "Gönder", "ban-command-args": "[@kullanıcıadı] [metin]", "ban-command-description": "Bir kullanıcıyı yasakla", "giphy-command-args": "[metin]", @@ -143,7 +159,7 @@ "mute-command-args": "[@kullanıcıadı]", "mute-command-description": "Bir kullanıcının sesini kapat", "replyCount_one": "1 cevap", - "replyCount_other": "{{ count }} cevaplar", + "replyCount_other": "{{ count }} cevap", "searchResultsCount_one": "1 sonuç", "searchResultsCount_other": "{{ count }} sonuç", "this content could not be displayed": "bu içerik gösterilemiyor", @@ -159,19 +175,21 @@ "unreadMessagesSeparatorText_one": "1 okunmamış mesaj", "unreadMessagesSeparatorText_other": "{{count}} okunmamış mesaj", "{{ commaSeparatedUsers }} and {{ moreCount }} more": "{{ commaSeparatedUsers }} ve {{ moreCount }} daha", - "{{ commaSeparatedUsers }}, and {{ lastUser }}": "{{ commaSeparatedUsers }}, ve {{ lastUser }}", + "{{ commaSeparatedUsers }}, and {{ lastUser }}": "{{ commaSeparatedUsers }} ve {{ lastUser }}", "{{ firstUser }} and {{ secondUser }}": "{{ firstUser }} ve {{ secondUser }}", "{{ imageCount }} more": "{{ imageCount }} adet daha", - "{{ memberCount }} members": "{{ memberCount }} üyeler", + "{{ memberCount }} members": "{{ memberCount }} üye", "{{ user }} has been muted": "{{ user }} sessize alındı", "{{ user }} has been unmuted": "{{ user }} sesi açıldı", - "{{ user }} is typing...": "{{ user }} is typing...", - "{{ users }} and more are typing...": "{{ users }} and more are typing...", - "{{ users }} and {{ user }} are typing...": "{{ users }} and {{ user }} are typing...", + "{{ user }} is typing...": "{{ user }} yazıyor...", + "{{ users }} and more are typing...": "{{ users }} ve diğerleri yazıyor...", + "{{ users }} and {{ user }} are typing...": "{{ users }} ve {{ user }} yazıyor...", "{{ watcherCount }} online": "{{ watcherCount }} çevrimiçi", "{{count}} unread_one": "{{count}} okunmamış", "{{count}} unread_other": "{{count}} okunmamış", "{{count}} votes_one": "{{count}} oy", "{{count}} votes_other": "{{count}} oy", - "🏙 Attachment...": "🏙 Ek..." + "🏙 Attachment...": "🏙 Ek...", + "📊 {{createdBy}} created: {{ pollName}}": "📊 {{createdBy}} oluşturdu: {{ pollName}}", + "📊 {{votedBy}} voted: {{pollOptionText}}": "📊 {{votedBy}} oy verdi: {{pollOptionText}}" } From 6e53375316631e15f96a6747387ab33a153a7e68 Mon Sep 17 00:00:00 2001 From: martincupela Date: Tue, 22 Oct 2024 12:23:59 +0200 Subject: [PATCH 23/71] fix: fix English translations of singular --- src/i18n/en.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/i18n/en.json b/src/i18n/en.json index da2d3a0582..6a932ff9c2 100644 --- a/src/i18n/en.json +++ b/src/i18n/en.json @@ -121,7 +121,7 @@ "Upload type: \"{{ type }}\" is not allowed": "Upload type: \"{{ type }}\" is not allowed", "User uploaded content": "User uploaded content", "View results": "View results", - "View {{count}} comments_one": "View {{count}} comments", + "View {{count}} comments_one": "View {{count}} comment", "View {{count}} comments_other": "View {{count}} comments", "Voice message": "Voice message", "Vote ended": "Vote ended", @@ -177,7 +177,7 @@ "{{ watcherCount }} online": "{{ watcherCount }} online", "{{count}} unread_one": "{{count}} unread", "{{count}} unread_other": "{{count}} unread", - "{{count}} votes_one": "{{count}} votes", + "{{count}} votes_one": "{{count}} vote", "{{count}} votes_other": "{{count}} votes", "🏙 Attachment...": "🏙 Attachment...", "📊 {{createdBy}} created: {{ pollName}}": "📊 {{createdBy}} created: {{ pollName}}", From d5b5e090379cd1b511d62e7bdba502841cf8bf85 Mon Sep 17 00:00:00 2001 From: martincupela Date: Tue, 22 Oct 2024 12:32:39 +0200 Subject: [PATCH 24/71] fix: add return type to Portal component --- src/components/Portal/Portal.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/Portal/Portal.ts b/src/components/Portal/Portal.ts index 92eb19676f..8b5a263a5a 100644 --- a/src/components/Portal/Portal.ts +++ b/src/components/Portal/Portal.ts @@ -1,4 +1,4 @@ -import { PropsWithChildren, useLayoutEffect, useState } from 'react'; +import { PropsWithChildren, ReactPortal, useLayoutEffect, useState } from 'react'; import { createPortal } from 'react-dom'; export type PortalProps = { @@ -10,7 +10,7 @@ export const Portal = ({ children, getPortalDestination, isOpen, -}: PropsWithChildren) => { +}: PropsWithChildren): ReactPortal | null => { const [portalDestination, setPortalDestination] = useState(null); useLayoutEffect(() => { From 0876cb8451f131d30a320bcc918510d9ca0f558a Mon Sep 17 00:00:00 2001 From: martincupela Date: Tue, 22 Oct 2024 13:31:25 +0200 Subject: [PATCH 25/71] style: remove commented code --- src/components/DragAndDrop/DragAndDropContainer.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/src/components/DragAndDrop/DragAndDropContainer.tsx b/src/components/DragAndDrop/DragAndDropContainer.tsx index 2d6ebac132..fda1cbd903 100644 --- a/src/components/DragAndDrop/DragAndDropContainer.tsx +++ b/src/components/DragAndDrop/DragAndDropContainer.tsx @@ -121,7 +121,6 @@ export const DragAndDropContainer = ({ return (
Date: Tue, 22 Oct 2024 14:59:37 +0200 Subject: [PATCH 26/71] fix: sort poll results descending --- src/components/Poll/PollActions/PollResults/PollResults.tsx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/components/Poll/PollActions/PollResults/PollResults.tsx b/src/components/Poll/PollActions/PollResults/PollResults.tsx index c57453438c..0165dce03c 100644 --- a/src/components/Poll/PollActions/PollResults/PollResults.tsx +++ b/src/components/Poll/PollActions/PollResults/PollResults.tsx @@ -62,8 +62,10 @@ export const PollResults = <
{name}
{options - .sort((current, next) => - voteCountsByOption[current.id] >= voteCountsByOption[next.id] ? -1 : 1, + .sort((next, current) => + (voteCountsByOption[current.id] ?? 0) >= (voteCountsByOption[next.id] ?? 0) + ? 1 + : -1, ) .map((option) => ( Date: Tue, 22 Oct 2024 16:39:59 +0200 Subject: [PATCH 27/71] feat: unify form field error rendering --- src/components/Dialog/FormDialog.tsx | 29 +++++++++---------- .../Poll/PollCreationDialog/FieldError.tsx | 5 +++- .../PollCreationDialog/OptionFieldSet.tsx | 3 +- .../PollCreationDialog/PollCreationDialog.tsx | 7 +++-- 4 files changed, 25 insertions(+), 19 deletions(-) diff --git a/src/components/Dialog/FormDialog.tsx b/src/components/Dialog/FormDialog.tsx index a69ed8a742..7f81ae6922 100644 --- a/src/components/Dialog/FormDialog.tsx +++ b/src/components/Dialog/FormDialog.tsx @@ -1,4 +1,3 @@ -import { useTranslationContext } from '../../context'; import React, { ChangeEvent, ChangeEventHandler, @@ -7,10 +6,14 @@ import React, { useState, } from 'react'; import clsx from 'clsx'; +import { FieldError } from '../Poll/PollCreationDialog/FieldError'; +import { useTranslationContext } from '../../context'; type FormElements = 'input' | 'textarea'; type FieldId = string; -type Validator = (value: string | readonly string[] | number | boolean | undefined) => Error[]; +type Validator = ( + value: string | readonly string[] | number | boolean | undefined, +) => Error | undefined; export type FieldConfig = { element: FormElements; @@ -43,7 +46,7 @@ export const FormDialog = < title, }: TextInputFormProps) => { const { t } = useTranslationContext(); - const [fieldErrors, setFieldErrors] = useState>({}); + const [fieldErrors, setFieldErrors] = useState>({}); const [value, setValue] = useState(() => { let acc: Partial = {}; for (const [id, config] of Object.entries(fields)) { @@ -58,8 +61,8 @@ export const FormDialog = < const fieldConfig = fields[fieldId]; if (!fieldConfig) return; - const errors = fieldConfig.validator?.(event.target.value); - if (errors?.length) setFieldErrors((prev) => ({ [fieldId]: errors, ...prev })); + const error = fieldConfig.validator?.(event.target.value); + if (error) setFieldErrors((prev) => ({ [fieldId]: error, ...prev })); setValue((prev) => ({ ...prev, [fieldId]: event.target.value })); if (!fieldConfig.props.onChange) return; @@ -79,11 +82,11 @@ export const FormDialog = < const handleSubmit = async () => { if (!Object.keys(value).length) return; - const errors: Record = {}; + const errors: Record = {}; for (const [id, fieldValue] of Object.entries(value)) { - const thisFieldErrors = fields[id].validator?.(fieldValue); - if (thisFieldErrors?.length) { - errors[id] = thisFieldErrors; + const thisFieldError = fields[id].validator?.(fieldValue); + if (thisFieldError) { + errors[id] = thisFieldError; } } if (Object.keys(errors).length) { @@ -98,7 +101,7 @@ export const FormDialog = <
{title &&
{title}
} - + {Object.entries(fields).map(([id, fieldConfig]) => (
{fieldConfig.label && ( @@ -115,11 +118,7 @@ export const FormDialog = < onChange: handleChange, value: value[id], })} - {fieldErrors[id]?.map((error, errIndex) => ( -
- {error.message} -
- ))} +
))} diff --git a/src/components/Poll/PollCreationDialog/FieldError.tsx b/src/components/Poll/PollCreationDialog/FieldError.tsx index abaf48ced3..73252b85dd 100644 --- a/src/components/Poll/PollCreationDialog/FieldError.tsx +++ b/src/components/Poll/PollCreationDialog/FieldError.tsx @@ -1,8 +1,11 @@ import clsx from 'clsx'; import React from 'react'; +import ReactMarkdown from 'react-markdown'; +import className = ReactMarkdown.propTypes.className; type FieldErrorProps = { + className?: string; text?: string; }; export const FieldError = ({ text }: FieldErrorProps) => - text ?
{text}
: null; + text ?
{text}
: null; diff --git a/src/components/Poll/PollCreationDialog/OptionFieldSet.tsx b/src/components/Poll/PollCreationDialog/OptionFieldSet.tsx index aa178be275..482bba4982 100644 --- a/src/components/Poll/PollCreationDialog/OptionFieldSet.tsx +++ b/src/components/Poll/PollCreationDialog/OptionFieldSet.tsx @@ -50,11 +50,12 @@ export const OptionFieldSet = ({ errors, options, setErrors, setState }: OptionF
- + { diff --git a/src/components/Poll/PollCreationDialog/PollCreationDialog.tsx b/src/components/Poll/PollCreationDialog/PollCreationDialog.tsx index 5724579147..d772a9764d 100644 --- a/src/components/Poll/PollCreationDialog/PollCreationDialog.tsx +++ b/src/components/Poll/PollCreationDialog/PollCreationDialog.tsx @@ -53,7 +53,7 @@ export const PollCreationDialog = ({ close }: PollCreationDialogProps) => { 'str-chat__form__input-field__value--has-error': nameError, })} > - + { @@ -101,7 +101,10 @@ export const PollCreationDialog = ({ close }: PollCreationDialogProps) => { /> {!state.enforce_unique_vote && ( <> - + { From f96c91e92dae8abca75f2d7bd42f7ee9b678fe76 Mon Sep 17 00:00:00 2001 From: martincupela Date: Tue, 22 Oct 2024 16:40:58 +0200 Subject: [PATCH 28/71] fix: vote for suggested option --- .../Poll/PollActions/PollActions.tsx | 2 +- .../PollActions/SuggestPollOptionForm.tsx | 34 +++++++++++++++++-- 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/src/components/Poll/PollActions/PollActions.tsx b/src/components/Poll/PollActions/PollActions.tsx index 5a6443660d..e76cc145e7 100644 --- a/src/components/Poll/PollActions/PollActions.tsx +++ b/src/components/Poll/PollActions/PollActions.tsx @@ -115,7 +115,7 @@ export const PollActions = < modalIsOpen={modalOpen === 'suggest-option'} openModal={() => setModalOpen('suggest-option')} > - + )} diff --git a/src/components/Poll/PollActions/SuggestPollOptionForm.tsx b/src/components/Poll/PollActions/SuggestPollOptionForm.tsx index e940a2a3d9..7b713112fc 100644 --- a/src/components/Poll/PollActions/SuggestPollOptionForm.tsx +++ b/src/components/Poll/PollActions/SuggestPollOptionForm.tsx @@ -1,21 +1,38 @@ import { FormDialog } from '../../Dialog'; import React from 'react'; +import { usePoll, usePollState } from '../hooks'; import { useChatContext, useTranslationContext } from '../../../context'; -import { usePoll } from '../hooks'; +import type { PollOption, PollState } from 'stream-chat'; import type { DefaultStreamChatGenerics } from '../../../types'; +type PollStateSelectorReturnValue< + StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics +> = [PollOption[]]; +const pollStateSelector = < + StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics +>( + nextValue: PollState, +): PollStateSelectorReturnValue => [nextValue.options]; + export type SuggestPollOptionFormProps = { close: () => void; + messageId: string; }; export const SuggestPollOptionForm = < StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics >({ close, + messageId, }: SuggestPollOptionFormProps) => { const { client } = useChatContext('SuggestPollOptionForm'); const { t } = useTranslationContext('SuggestPollOptionForm'); const poll = usePoll(); + const [options] = usePollState< + PollStateSelectorReturnValue, + StreamChatGenerics + >(pollStateSelector); + return ( className='str-chat__prompt-dialog str-chat__modal__suggest-poll-option' @@ -30,10 +47,23 @@ export const SuggestPollOptionForm = < type: 'text', value: '', }, + validator: (value) => { + if (!value) return; + const existingOption = options.find( + (option) => option.text === (value as string).trim(), + ); + if (existingOption) { + return new Error(t('Option already exists')); + } + return; + }, }, }} onSubmit={async (value) => { - await client.createPollOption(poll.id, { text: value.optionText }); + const { poll_option } = await client.createPollOption(poll.id, { + text: value.optionText, + }); + poll.castVote(poll_option.id, messageId); }} shouldDisableSubmitButton={(value) => !value.optionText} title={t('Suggest an option')} From 03c57aa14fbe55c23f4c2ebf250d80a206e3dc8a Mon Sep 17 00:00:00 2001 From: martincupela Date: Tue, 22 Oct 2024 17:29:32 +0200 Subject: [PATCH 29/71] fix: maximum number of votes is not mandatory if multiple votes are enabled --- .../Poll/PollCreationDialog/FieldError.tsx | 5 +++-- .../Poll/PollCreationDialog/PollCreationDialog.tsx | 14 ++++++++------ .../PollCreationDialogControls.tsx | 11 ++++++----- 3 files changed, 17 insertions(+), 13 deletions(-) diff --git a/src/components/Poll/PollCreationDialog/FieldError.tsx b/src/components/Poll/PollCreationDialog/FieldError.tsx index 73252b85dd..31e00f6053 100644 --- a/src/components/Poll/PollCreationDialog/FieldError.tsx +++ b/src/components/Poll/PollCreationDialog/FieldError.tsx @@ -7,5 +7,6 @@ type FieldErrorProps = { className?: string; text?: string; }; -export const FieldError = ({ text }: FieldErrorProps) => - text ?
{text}
: null; +export const FieldError = ({ text }: FieldErrorProps) => ( +
{text}
+); diff --git a/src/components/Poll/PollCreationDialog/PollCreationDialog.tsx b/src/components/Poll/PollCreationDialog/PollCreationDialog.tsx index d772a9764d..bdedda732a 100644 --- a/src/components/Poll/PollCreationDialog/PollCreationDialog.tsx +++ b/src/components/Poll/PollCreationDialog/PollCreationDialog.tsx @@ -94,13 +94,15 @@ export const PollCreationDialog = ({ close }: PollCreationDialogProps) => { enforce_unique_vote: !e.target.checked, max_votes_allowed: '', })); - setMultipleAnswerCountError( - e.target.checked ? t('Type a number from 2 to 10') : undefined, - ); + setMultipleAnswerCountError(undefined); }} /> {!state.enforce_unique_vote && ( - <> +
{ setState((prev) => ({ ...prev, max_votes_allowed: e.target.value })); }} placeholder={t('Maximum number of votes (from 2 to 10)')} - type='text' + type='number' value={state.max_votes_allowed} /> - +
)}
{ const hasAtLeastOneOption = state.options.filter((o) => !!o.text).length > 0; const hasName = !!state.name; - const maxVotesAllowed = parseInt( + const maxVotesAllowedNumber = parseInt( state.max_votes_allowed?.match(VALID_MAX_VOTES_VALUE_REGEX)?.[0] || '', ); - const hasValidVoteLimit = - state.enforce_unique_vote || - (maxVotesAllowed && (2 <= maxVotesAllowed || maxVotesAllowed <= 10)); + + const validMaxVotesAllowed = + state.max_votes_allowed === '' || + (!!maxVotesAllowedNumber && (2 <= maxVotesAllowedNumber || maxVotesAllowedNumber <= 10)); const noErrors = errors.length === 0; - return hasAtLeastOneOption && hasName && hasValidVoteLimit && noErrors; + return hasAtLeastOneOption && hasName && validMaxVotesAllowed && noErrors; }; return ( From 094bcd709739a6b201fd4c8cf48cacf86dc6a0f4 Mon Sep 17 00:00:00 2001 From: martincupela Date: Tue, 22 Oct 2024 17:59:26 +0200 Subject: [PATCH 30/71] fix: remove the oldest vote if reached voting limit --- src/components/Poll/PollOptionSelector.tsx | 38 ++++++++++++++++++---- 1 file changed, 31 insertions(+), 7 deletions(-) diff --git a/src/components/Poll/PollOptionSelector.tsx b/src/components/Poll/PollOptionSelector.tsx index 6a3a6bf5c6..aeb473be30 100644 --- a/src/components/Poll/PollOptionSelector.tsx +++ b/src/components/Poll/PollOptionSelector.tsx @@ -37,8 +37,9 @@ type PollStateSelectorReturnValue< > = [ boolean | undefined, Record[]>, + number, string[], - Record, + Record>, Record, ]; const pollStateSelector = < @@ -48,6 +49,7 @@ const pollStateSelector = < ): PollStateSelectorReturnValue => [ nextValue.is_closed, nextValue.latest_votes_by_option, + nextValue.max_votes_allowed, nextValue.maxVotedOptionIds, nextValue.ownVotesByOptionId, nextValue.vote_counts_by_option, @@ -76,24 +78,46 @@ export const PollOptionSelector = < const [ is_closed, latest_votes_by_option, + max_votes_allowed, maxVotedOptionIds, ownVotesByOptionId, vote_counts_by_option, - ] = usePollState(pollStateSelector); + ] = usePollState, StreamChatGenerics>( + pollStateSelector, + ); const poll = usePoll(); const canCastVote = channelCapabilities['cast-poll-vote'] && !is_closed; const winningOptionCount = maxVotedOptionIds[0] ? vote_counts_by_option[maxVotedOptionIds[0]] : 0; const toggleVote = useMemo( () => - debounce(() => { + debounce(async () => { if (!canCastVote) return; const haveVotedForTheOption = !!ownVotesByOptionId[option.id]; - return haveVotedForTheOption - ? poll.removeVote(ownVotesByOptionId[option.id], message.id) - : poll.castVote(option.id, message.id); + const reachedVoteLimit = + max_votes_allowed && max_votes_allowed === Object.keys(ownVotesByOptionId).length; + + if (reachedVoteLimit) { + let oldestVotedOption: { optionId?: string; vote?: PollVote } = {}; + Object.entries(ownVotesByOptionId).forEach(([optionId, vote]) => { + if ( + !oldestVotedOption.vote?.created_at || + new Date(vote.created_at) < new Date(oldestVotedOption.vote.created_at) + ) { + oldestVotedOption = { optionId, vote }; + } + }); + if (oldestVotedOption.vote?.id) { + await poll.removeVote(oldestVotedOption.vote?.id, message.id); + } + poll.castVote(option.id, message.id); + } else if (haveVotedForTheOption) { + poll.removeVote(ownVotesByOptionId[option.id].id, message.id); + } else { + poll.castVote(option.id, message.id); + } }, 100), - [canCastVote, message.id, option.id, ownVotesByOptionId, poll], + [canCastVote, max_votes_allowed, message.id, option.id, ownVotesByOptionId, poll], ); return ( From e22cd0f22dbe385f58edbbcdb67f0544d4b1b810 Mon Sep 17 00:00:00 2001 From: martincupela Date: Wed, 23 Oct 2024 11:35:23 +0200 Subject: [PATCH 31/71] Revert "fix: remove the oldest vote if reached voting limit" This reverts commit 094bcd709739a6b201fd4c8cf48cacf86dc6a0f4. --- src/components/Poll/PollOptionSelector.tsx | 38 ++++------------------ 1 file changed, 7 insertions(+), 31 deletions(-) diff --git a/src/components/Poll/PollOptionSelector.tsx b/src/components/Poll/PollOptionSelector.tsx index aeb473be30..6a3a6bf5c6 100644 --- a/src/components/Poll/PollOptionSelector.tsx +++ b/src/components/Poll/PollOptionSelector.tsx @@ -37,9 +37,8 @@ type PollStateSelectorReturnValue< > = [ boolean | undefined, Record[]>, - number, string[], - Record>, + Record, Record, ]; const pollStateSelector = < @@ -49,7 +48,6 @@ const pollStateSelector = < ): PollStateSelectorReturnValue => [ nextValue.is_closed, nextValue.latest_votes_by_option, - nextValue.max_votes_allowed, nextValue.maxVotedOptionIds, nextValue.ownVotesByOptionId, nextValue.vote_counts_by_option, @@ -78,46 +76,24 @@ export const PollOptionSelector = < const [ is_closed, latest_votes_by_option, - max_votes_allowed, maxVotedOptionIds, ownVotesByOptionId, vote_counts_by_option, - ] = usePollState, StreamChatGenerics>( - pollStateSelector, - ); + ] = usePollState(pollStateSelector); const poll = usePoll(); const canCastVote = channelCapabilities['cast-poll-vote'] && !is_closed; const winningOptionCount = maxVotedOptionIds[0] ? vote_counts_by_option[maxVotedOptionIds[0]] : 0; const toggleVote = useMemo( () => - debounce(async () => { + debounce(() => { if (!canCastVote) return; const haveVotedForTheOption = !!ownVotesByOptionId[option.id]; - const reachedVoteLimit = - max_votes_allowed && max_votes_allowed === Object.keys(ownVotesByOptionId).length; - - if (reachedVoteLimit) { - let oldestVotedOption: { optionId?: string; vote?: PollVote } = {}; - Object.entries(ownVotesByOptionId).forEach(([optionId, vote]) => { - if ( - !oldestVotedOption.vote?.created_at || - new Date(vote.created_at) < new Date(oldestVotedOption.vote.created_at) - ) { - oldestVotedOption = { optionId, vote }; - } - }); - if (oldestVotedOption.vote?.id) { - await poll.removeVote(oldestVotedOption.vote?.id, message.id); - } - poll.castVote(option.id, message.id); - } else if (haveVotedForTheOption) { - poll.removeVote(ownVotesByOptionId[option.id].id, message.id); - } else { - poll.castVote(option.id, message.id); - } + return haveVotedForTheOption + ? poll.removeVote(ownVotesByOptionId[option.id], message.id) + : poll.castVote(option.id, message.id); }, 100), - [canCastVote, max_votes_allowed, message.id, option.id, ownVotesByOptionId, poll], + [canCastVote, message.id, option.id, ownVotesByOptionId, poll], ); return ( From d4db28d9ffd4da1079cb1662d2958f95c0dc7559 Mon Sep 17 00:00:00 2001 From: martincupela Date: Wed, 23 Oct 2024 12:22:29 +0200 Subject: [PATCH 32/71] fix: reflect ownVotesByOptionId maps PollVote values --- src/components/Poll/PollOptionSelector.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/Poll/PollOptionSelector.tsx b/src/components/Poll/PollOptionSelector.tsx index 6a3a6bf5c6..83fe5d16ae 100644 --- a/src/components/Poll/PollOptionSelector.tsx +++ b/src/components/Poll/PollOptionSelector.tsx @@ -1,11 +1,11 @@ import clsx from 'clsx'; import debounce from 'lodash.debounce'; import React, { useMemo } from 'react'; -import type { PollOption, PollState, PollVote } from 'stream-chat'; import { isVoteAnswer } from 'stream-chat'; import { usePoll, usePollState } from './hooks'; import { Avatar } from '../Avatar'; import { useChannelStateContext, useMessageContext, useTranslationContext } from '../../context'; +import type { PollOption, PollState, PollVote } from 'stream-chat'; import type { DefaultStreamChatGenerics } from '../../types'; type AmountBarProps = { @@ -38,7 +38,7 @@ type PollStateSelectorReturnValue< boolean | undefined, Record[]>, string[], - Record, + Record>, Record, ]; const pollStateSelector = < @@ -90,7 +90,7 @@ export const PollOptionSelector = < if (!canCastVote) return; const haveVotedForTheOption = !!ownVotesByOptionId[option.id]; return haveVotedForTheOption - ? poll.removeVote(ownVotesByOptionId[option.id], message.id) + ? poll.removeVote(ownVotesByOptionId[option.id].id, message.id) : poll.castVote(option.id, message.id); }, 100), [canCastVote, message.id, option.id, ownVotesByOptionId, poll], From 9bd76a7b9d392a5c6445eb3b4be2fe3522fd294f Mon Sep 17 00:00:00 2001 From: martincupela Date: Wed, 23 Oct 2024 12:24:06 +0200 Subject: [PATCH 33/71] fix: remove stale error in FormDialog --- src/components/Dialog/FormDialog.tsx | 11 +++++++++-- .../{Poll/PollCreationDialog => Form}/FieldError.tsx | 0 .../Poll/PollCreationDialog/OptionFieldSet.tsx | 2 +- .../Poll/PollCreationDialog/PollCreationDialog.tsx | 2 +- 4 files changed, 11 insertions(+), 4 deletions(-) rename src/components/{Poll/PollCreationDialog => Form}/FieldError.tsx (100%) diff --git a/src/components/Dialog/FormDialog.tsx b/src/components/Dialog/FormDialog.tsx index 7f81ae6922..ba52f690a8 100644 --- a/src/components/Dialog/FormDialog.tsx +++ b/src/components/Dialog/FormDialog.tsx @@ -6,7 +6,7 @@ import React, { useState, } from 'react'; import clsx from 'clsx'; -import { FieldError } from '../Poll/PollCreationDialog/FieldError'; +import { FieldError } from '../Form/FieldError'; import { useTranslationContext } from '../../context'; type FormElements = 'input' | 'textarea'; @@ -62,7 +62,14 @@ export const FormDialog = < if (!fieldConfig) return; const error = fieldConfig.validator?.(event.target.value); - if (error) setFieldErrors((prev) => ({ [fieldId]: error, ...prev })); + if (error) { + setFieldErrors((prev) => ({ [fieldId]: error, ...prev })); + } else { + setFieldErrors((prev) => { + delete prev[fieldId]; + return prev; + }); + } setValue((prev) => ({ ...prev, [fieldId]: event.target.value })); if (!fieldConfig.props.onChange) return; diff --git a/src/components/Poll/PollCreationDialog/FieldError.tsx b/src/components/Form/FieldError.tsx similarity index 100% rename from src/components/Poll/PollCreationDialog/FieldError.tsx rename to src/components/Form/FieldError.tsx diff --git a/src/components/Poll/PollCreationDialog/OptionFieldSet.tsx b/src/components/Poll/PollCreationDialog/OptionFieldSet.tsx index 482bba4982..102bebc041 100644 --- a/src/components/Poll/PollCreationDialog/OptionFieldSet.tsx +++ b/src/components/Poll/PollCreationDialog/OptionFieldSet.tsx @@ -3,7 +3,7 @@ import clsx from 'clsx'; import { MAX_POLL_OPTIONS } from '../constants'; import { nanoid } from 'nanoid'; import React, { useCallback } from 'react'; -import { FieldError } from './FieldError'; +import { FieldError } from '../../Form/FieldError'; import { DragAndDropContainer } from '../../DragAndDrop/DragAndDropContainer'; import { useTranslationContext } from '../../../context'; import type { OptionErrors, PollFormState, PollOptionFormData } from './types'; diff --git a/src/components/Poll/PollCreationDialog/PollCreationDialog.tsx b/src/components/Poll/PollCreationDialog/PollCreationDialog.tsx index bdedda732a..bd12411972 100644 --- a/src/components/Poll/PollCreationDialog/PollCreationDialog.tsx +++ b/src/components/Poll/PollCreationDialog/PollCreationDialog.tsx @@ -1,7 +1,7 @@ import clsx from 'clsx'; import { nanoid } from 'nanoid'; import React, { useState } from 'react'; -import { FieldError } from './FieldError'; +import { FieldError } from '../../Form/FieldError'; import { OptionFieldSet } from './OptionFieldSet'; import { PollCreationDialogControls } from './PollCreationDialogControls'; import { VALID_MAX_VOTES_VALUE_REGEX } from '../constants'; From 22f14b2d5ce84ece81a4d16b0548b5f6b61e2c31 Mon Sep 17 00:00:00 2001 From: martincupela Date: Thu, 24 Oct 2024 13:58:56 +0200 Subject: [PATCH 34/71] fix: add poll creation dialog layout fixes --- .../PollCreationDialog/OptionFieldSet.tsx | 8 +-- .../PollCreationDialog/PollCreationDialog.tsx | 61 ++++++++++--------- 2 files changed, 37 insertions(+), 32 deletions(-) diff --git a/src/components/Poll/PollCreationDialog/OptionFieldSet.tsx b/src/components/Poll/PollCreationDialog/OptionFieldSet.tsx index 102bebc041..1f084c4a69 100644 --- a/src/components/Poll/PollCreationDialog/OptionFieldSet.tsx +++ b/src/components/Poll/PollCreationDialog/OptionFieldSet.tsx @@ -48,13 +48,13 @@ export const OptionFieldSet = ({ errors, options, setErrors, setState }: OptionF > {options.map((option, i) => (
-
+
{ ('Create poll')} />
-
+
-
+
{ /> {!state.enforce_unique_vote && (
- - { - const isValidValue = - !e.target.value || e.target.value.match(VALID_MAX_VOTES_VALUE_REGEX); - if (!isValidValue) { - setMultipleAnswerCountError(t('Type a number from 2 to 10')); - } else if (multipleAnswerCountError) { - setMultipleAnswerCountError(undefined); - } - setState((prev) => ({ ...prev, max_votes_allowed: e.target.value })); - }} - placeholder={t('Maximum number of votes (from 2 to 10)')} - type='number' - value={state.max_votes_allowed} - /> +
+ + { + const isValidValue = + !e.target.value || e.target.value.match(VALID_MAX_VOTES_VALUE_REGEX); + if (!isValidValue) { + setMultipleAnswerCountError(t('Type a number from 2 to 10')); + } else if (multipleAnswerCountError) { + setMultipleAnswerCountError(undefined); + } + setState((prev) => ({ ...prev, max_votes_allowed: e.target.value })); + }} + placeholder={t('Maximum number of votes (from 2 to 10)')} + type='number' + value={state.max_votes_allowed} + /> +
)}
From 3e3cfdff32b164b306835b223633df4a96ed4355 Mon Sep 17 00:00:00 2001 From: martincupela Date: Fri, 25 Oct 2024 14:39:44 +0200 Subject: [PATCH 35/71] refactor: prevent warning logs from usePollContext hook --- .../Poll/hooks/usePollAnswerPagination.ts | 2 +- src/components/Poll/hooks/usePollState.ts | 2 +- src/context/PollContext.tsx | 13 +------------ 3 files changed, 3 insertions(+), 14 deletions(-) diff --git a/src/components/Poll/hooks/usePollAnswerPagination.ts b/src/components/Poll/hooks/usePollAnswerPagination.ts index 79950fc79c..5c7a8b8767 100644 --- a/src/components/Poll/hooks/usePollAnswerPagination.ts +++ b/src/components/Poll/hooks/usePollAnswerPagination.ts @@ -24,7 +24,7 @@ type UsePollAnswerPaginationParams = { export const usePollAnswerPagination = < StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics >({ paginationParams }: UsePollAnswerPaginationParams = {}) => { - const { poll } = usePollContext('usePollAnswerPagination'); + const { poll } = usePollContext(); const paginationFn = useCallback>( async (next) => { diff --git a/src/components/Poll/hooks/usePollState.ts b/src/components/Poll/hooks/usePollState.ts index e699ecee94..d5dd2f279a 100644 --- a/src/components/Poll/hooks/usePollState.ts +++ b/src/components/Poll/hooks/usePollState.ts @@ -9,6 +9,6 @@ export const usePollState = < >( selector: (nextValue: PollState) => T, ) => { - const { poll } = usePollContext('usePollState'); + const { poll } = usePollContext(); return useStateStore(poll.state, selector); }; diff --git a/src/context/PollContext.tsx b/src/context/PollContext.tsx index d212c75768..229287611b 100644 --- a/src/context/PollContext.tsx +++ b/src/context/PollContext.tsx @@ -26,18 +26,7 @@ export const PollProvider = < export const usePollContext = < StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics ->( - componentName?: string, -) => { +>() => { const contextValue = useContext(PollContext); - - if (!contextValue) { - console.warn( - `The usePollContext hook was called outside of the PollContext provider. Make sure this hook is called within a child of the Channel component. The errored call is located in the ${componentName} component.`, - ); - - return {} as PollContextValue; - } - return (contextValue as unknown) as PollContextValue; }; From 4b1590f230b829b65363abe68bd590eef3ec0185 Mon Sep 17 00:00:00 2001 From: martincupela Date: Fri, 25 Oct 2024 14:41:55 +0200 Subject: [PATCH 36/71] fix: retrieve Poll component from ComponentContext in MessageSimple --- src/components/Message/MessageSimple.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/Message/MessageSimple.tsx b/src/components/Message/MessageSimple.tsx index 8d91868447..f54fad53a9 100644 --- a/src/components/Message/MessageSimple.tsx +++ b/src/components/Message/MessageSimple.tsx @@ -23,7 +23,7 @@ import { CUSTOM_MESSAGE_TYPE } from '../../constants/messageTypes'; import { EditMessageForm as DefaultEditMessageForm, MessageInput } from '../MessageInput'; import { MML } from '../MML'; import { Modal } from '../Modal'; -import { Poll } from '../Poll'; +import { Poll as DefaultPoll } from '../Poll'; import { ReactionsList as DefaultReactionList } from '../Reactions'; import { MessageBounceModal } from '../MessageBounce/MessageBounceModal'; import { useComponentContext } from '../../context/ComponentContext'; @@ -77,7 +77,7 @@ const MessageSimpleWithContext = < MessageRepliesCountButton = DefaultMessageRepliesCountButton, MessageStatus = DefaultMessageStatus, MessageTimestamp = DefaultMessageTimestamp, - + Poll = DefaultPoll, ReactionsList = DefaultReactionList, PinIndicator, } = useComponentContext('MessageSimple'); From 420fa41d4644ac642079d707c67ec347faac2f88 Mon Sep 17 00:00:00 2001 From: martincupela Date: Fri, 25 Oct 2024 15:34:39 +0200 Subject: [PATCH 37/71] feat: jump to the next input in the OptionFieldSet on Enter key --- src/components/Poll/Poll.tsx | 2 +- src/components/Poll/PollCreationDialog/OptionFieldSet.tsx | 7 ++++++- src/components/Poll/PollOptionList.tsx | 1 + 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/components/Poll/Poll.tsx b/src/components/Poll/Poll.tsx index 8930536498..09c1ebacf2 100644 --- a/src/components/Poll/Poll.tsx +++ b/src/components/Poll/Poll.tsx @@ -4,10 +4,10 @@ import { PollActions } from './PollActions'; import { PollHeader } from './PollHeader'; import { PollOptionList } from './PollOptionList'; import { usePollState } from './hooks'; +import { MAX_OPTIONS_DISPLAYED } from './constants'; import { PollProvider } from '../../context'; import type { Poll as PollClass, PollState } from 'stream-chat'; import type { DefaultStreamChatGenerics } from '../../types'; -import { MAX_OPTIONS_DISPLAYED } from './constants'; type PollStateSelectorReturnValue = [boolean | undefined]; const pollStateSelector = < diff --git a/src/components/Poll/PollCreationDialog/OptionFieldSet.tsx b/src/components/Poll/PollCreationDialog/OptionFieldSet.tsx index 1f084c4a69..173caa1a27 100644 --- a/src/components/Poll/PollCreationDialog/OptionFieldSet.tsx +++ b/src/components/Poll/PollCreationDialog/OptionFieldSet.tsx @@ -1,4 +1,3 @@ -// @ts-nocheck import clsx from 'clsx'; import { MAX_POLL_OPTIONS } from '../constants'; import { nanoid } from 'nanoid'; @@ -101,6 +100,12 @@ export const OptionFieldSet = ({ errors, options, setErrors, setState }: OptionF }; }); }} + onKeyUp={(event) => { + if (event.key === 'Enter') { + const nextInputId = options[i + 1].id; + document.getElementById(nextInputId)?.focus(); + } + }} placeholder={t('Add an option')} type='text' value={option.text} diff --git a/src/components/Poll/PollOptionList.tsx b/src/components/Poll/PollOptionList.tsx index 3a38253f70..eeac7e881a 100644 --- a/src/components/Poll/PollOptionList.tsx +++ b/src/components/Poll/PollOptionList.tsx @@ -8,6 +8,7 @@ import type { DefaultStreamChatGenerics } from '../../types'; type PollStateSelectorReturnValue< StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics > = [PollOption[]]; + const pollStateSelector = < StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics >( From 185f68220a604e0a19f78dc3415f242850165d02 Mon Sep 17 00:00:00 2001 From: martincupela Date: Sat, 26 Oct 2024 19:16:06 +0200 Subject: [PATCH 38/71] refactor: use Poll component to display quoted poll --- src/components/Message/QuotedMessage.tsx | 14 ++++-- .../MessageInput/QuotedMessagePreview.tsx | 15 ++++-- src/components/Poll/Poll.tsx | 50 +++++++++++++++---- .../PollResults/PollOptionWithLatestVotes.tsx | 8 ++- src/components/Poll/QuotedPoll.tsx | 25 ---------- src/components/Poll/index.ts | 1 - 6 files changed, 62 insertions(+), 51 deletions(-) delete mode 100644 src/components/Poll/QuotedPoll.tsx diff --git a/src/components/Message/QuotedMessage.tsx b/src/components/Message/QuotedMessage.tsx index afb3a1f6c3..4bb629e347 100644 --- a/src/components/Message/QuotedMessage.tsx +++ b/src/components/Message/QuotedMessage.tsx @@ -1,18 +1,19 @@ import React from 'react'; import clsx from 'clsx'; +import { Attachment as DefaultAttachment } from '../Attachment'; import { Avatar as DefaultAvatar } from '../Avatar'; +import { Poll as DefaultPoll } from '../Poll'; +import { useChatContext } from '../../context/ChatContext'; import { useComponentContext } from '../../context/ComponentContext'; import { useMessageContext } from '../../context/MessageContext'; import { useTranslationContext } from '../../context/TranslationContext'; import { useChannelActionContext } from '../../context/ChannelActionContext'; -import type { PollResponse, TranslationLanguages } from 'stream-chat'; +import type { TranslationLanguages } from 'stream-chat'; import type { DefaultStreamChatGenerics } from '../../types/types'; -import { Attachment as DefaultAttachment } from '../Attachment'; -import { QuotedPoll } from '../Poll'; export const QuotedMessage = < StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics @@ -20,7 +21,9 @@ export const QuotedMessage = < const { Attachment = DefaultAttachment, Avatar: ContextAvatar, + Poll = DefaultPoll, } = useComponentContext('QuotedMessage'); + const { client } = useChatContext(); const { isMyMessage, message } = useMessageContext('QuotedMessage'); const { t, userLanguage } = useTranslationContext('QuotedMessage'); const { jumpToMessage } = useChannelActionContext('QuotedMessage'); @@ -30,6 +33,7 @@ export const QuotedMessage = < const { quoted_message } = message; if (!quoted_message) return null; + const poll = quoted_message.poll_id && client.polls.fromState(quoted_message.poll_id); const quotedMessageDeleted = quoted_message.deleted_at || quoted_message.type === 'deleted'; const quotedMessageText = quotedMessageDeleted @@ -64,8 +68,8 @@ export const QuotedMessage = < /> )}
- {quoted_message.poll ? ( - } /> + {poll ? ( + ) : ( <> {quotedMessageAttachment && ( diff --git a/src/components/MessageInput/QuotedMessagePreview.tsx b/src/components/MessageInput/QuotedMessagePreview.tsx index 2aafbeb7fd..f22c072b96 100644 --- a/src/components/MessageInput/QuotedMessagePreview.tsx +++ b/src/components/MessageInput/QuotedMessagePreview.tsx @@ -1,17 +1,18 @@ import React, { useMemo } from 'react'; -import type { PollResponse, TranslationLanguages } from 'stream-chat'; +import { CloseIcon } from './icons'; import { Attachment as DefaultAttachment } from '../Attachment'; import { Avatar as DefaultAvatar } from '../Avatar'; -import { CloseIcon } from './icons'; +import { Poll as DefaultPoll } from '../Poll'; +import { useChatContext } from '../../context/ChatContext'; import { useChannelActionContext } from '../../context/ChannelActionContext'; import { useComponentContext } from '../../context/ComponentContext'; import { useTranslationContext } from '../../context/TranslationContext'; +import type { TranslationLanguages } from 'stream-chat'; import type { StreamMessage } from '../../context/ChannelStateContext'; import type { DefaultStreamChatGenerics } from '../../types/types'; -import { QuotedPoll } from '../Poll'; export const QuotedMessagePreviewHeader = < StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics @@ -46,9 +47,11 @@ export const QuotedMessagePreview = < >({ quotedMessage, }: QuotedMessagePreviewProps) => { + const { client } = useChatContext(); const { Attachment = DefaultAttachment, Avatar = DefaultAvatar, + Poll = DefaultPoll, } = useComponentContext('QuotedMessagePreview'); const { userLanguage } = useTranslationContext('QuotedMessagePreview'); @@ -63,6 +66,8 @@ export const QuotedMessagePreview = < if (!quotedMessageText && !quotedMessageAttachment) return null; + const poll = quotedMessage.poll_id && client.polls.fromState(quotedMessage.poll_id); + return (
{quotedMessage.user && ( @@ -74,8 +79,8 @@ export const QuotedMessagePreview = < /> )}
- {quotedMessage.poll ? ( - } /> + {poll ? ( + ) : ( <> {!!quotedMessageAttachment.length && ( diff --git a/src/components/Poll/Poll.tsx b/src/components/Poll/Poll.tsx index 09c1ebacf2..652bf755f9 100644 --- a/src/components/Poll/Poll.tsx +++ b/src/components/Poll/Poll.tsx @@ -9,15 +9,47 @@ import { PollProvider } from '../../context'; import type { Poll as PollClass, PollState } from 'stream-chat'; import type { DefaultStreamChatGenerics } from '../../types'; -type PollStateSelectorReturnValue = [boolean | undefined]; -const pollStateSelector = < +type PollStateSelectorQuotedPollReturnValue = [boolean | undefined, string]; + +const pollStateSelectorQuotedPoll = < + StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics +>( + nextValue: PollState, +): PollStateSelectorQuotedPollReturnValue => [nextValue.is_closed, nextValue.name]; + +export const QuotedPoll = < + StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics +>() => { + const [is_closed, name] = usePollState< + PollStateSelectorQuotedPollReturnValue, + StreamChatGenerics + >(pollStateSelectorQuotedPoll); + + return ( +
+
📊
+
{name}
+
+ ); +}; + +type PollStateSelectorPollUIReturnValue = [boolean | undefined]; +const pollStateSelectorPollUI = < StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics >( nextValue: PollState, -): PollStateSelectorReturnValue => [nextValue.is_closed]; +): PollStateSelectorPollUIReturnValue => [nextValue.is_closed]; -const PollUI = () => { - const [isClosed] = usePollState(pollStateSelector); +const PollUI = < + StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics +>() => { + const [isClosed] = usePollState( + pollStateSelectorPollUI, + ); return (
@@ -31,12 +63,10 @@ const PollUI = () => { export const Poll = < StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics >({ + isQuoted, poll, }: { poll: PollClass; + isQuoted?: boolean; }) => - poll ? ( - - - - ) : null; + poll ? {isQuoted ? : } : null; diff --git a/src/components/Poll/PollActions/PollResults/PollOptionWithLatestVotes.tsx b/src/components/Poll/PollActions/PollResults/PollOptionWithLatestVotes.tsx index b45f36b506..1ecd82ab4e 100644 --- a/src/components/Poll/PollActions/PollResults/PollOptionWithLatestVotes.tsx +++ b/src/components/Poll/PollActions/PollResults/PollOptionWithLatestVotes.tsx @@ -8,15 +8,13 @@ import type { DefaultStreamChatGenerics } from '../../../../types'; type PollStateSelectorReturnValue< StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics -> = [Record[]>, Record]; +> = [Record[]>]; + const pollStateSelector = < StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics >( nextValue: PollState, -): PollStateSelectorReturnValue => [ - nextValue.latest_votes_by_option, - nextValue.vote_counts_by_option, -]; +): PollStateSelectorReturnValue => [nextValue.latest_votes_by_option]; export type PollOptionWithVotesProps< StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics diff --git a/src/components/Poll/QuotedPoll.tsx b/src/components/Poll/QuotedPoll.tsx deleted file mode 100644 index c6242d111f..0000000000 --- a/src/components/Poll/QuotedPoll.tsx +++ /dev/null @@ -1,25 +0,0 @@ -import React from 'react'; -import { PollResponse } from 'stream-chat'; -import type { DefaultStreamChatGenerics } from '../../types'; -import clsx from 'clsx'; - -export type QuotedPollProps< - StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics -> = { - poll: PollResponse; -}; - -export const QuotedPoll = < - StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics ->({ - poll, -}: QuotedPollProps) => ( -
-
📊
-
{poll.name}
-
-); diff --git a/src/components/Poll/index.ts b/src/components/Poll/index.ts index 1d1d614fbb..7de72b57d4 100644 --- a/src/components/Poll/index.ts +++ b/src/components/Poll/index.ts @@ -4,4 +4,3 @@ export * from './PollCreationDialog'; export * from './PollHeader'; export * from './PollOptionSelector'; export * from './PollVote'; -export * from './QuotedPoll'; From afff61f47b7e8aaa8a3b31394f473adaeaabf5a3 Mon Sep 17 00:00:00 2001 From: martincupela Date: Sat, 26 Oct 2024 19:16:26 +0200 Subject: [PATCH 39/71] test: add tests for quoted poll scenario --- .../Message/__tests__/QuotedMessage.test.js | 141 ++++++++++++---- .../__tests__/MessageInput.test.js | 43 +++++ src/mock-builders/generator/poll.js | 154 ++++++++++++++++++ 3 files changed, 310 insertions(+), 28 deletions(-) create mode 100644 src/mock-builders/generator/poll.js diff --git a/src/components/Message/__tests__/QuotedMessage.test.js b/src/components/Message/__tests__/QuotedMessage.test.js index 64f8beda8e..a82224ecb6 100644 --- a/src/components/Message/__tests__/QuotedMessage.test.js +++ b/src/components/Message/__tests__/QuotedMessage.test.js @@ -1,5 +1,5 @@ import '@testing-library/jest-dom'; -import { render } from '@testing-library/react'; +import { render, screen } from '@testing-library/react'; import { toHaveNoViolations } from 'jest-axe'; import React from 'react'; import { axe } from '../../../../axe-helper'; @@ -13,18 +13,20 @@ import { TranslationProvider, } from '../../../context'; import { - generateChannel, generateFileAttachment, + generateMessage, generateUser, - getTestClientWithUser, + initClientWithChannels, } from '../../../mock-builders'; import { Message } from '../Message'; import { MessageSimple } from '../MessageSimple'; import { QuotedMessage } from '../QuotedMessage'; +import { generatePoll } from '../../../mock-builders/generator/poll'; expect.extend(toHaveNoViolations); +const quotedPollPreviewClassSelector = '.str-chat__quoted-poll-preview'; const quotedMessageTestId = 'quoted-message'; const quotedMessageContentsTestId = 'quoted-message-contents'; const quotedMessageTextTestId = 'quoted-message-text'; @@ -39,18 +41,22 @@ const Attachment = (props) =>
; const alice = generateUser({ name: 'alice' }); const jumpToMessageMock = jest.fn(); -async function renderQuotedMessage(customProps) { - const client = await getTestClientWithUser(alice); - const channel = generateChannel({ - getConfig: () => {}, - state: { membership: {} }, - }); - const channelConfig = channel.getConfig(); +async function renderQuotedMessage({ + componentContext, + customChannel, + customClient, + customProps, +} = {}) { + const { + channels: [channel], + client, + } = await initClientWithChannels({ customUser: alice }); + const channelConfig = (customChannel ?? channel).getConfig(); const customDateTimeParser = jest.fn(() => ({ format: jest.fn() })); return render( - - + + , + Message() { + return ; + }, + ...componentContext, }} > @@ -81,14 +89,18 @@ async function renderQuotedMessage(customProps) { describe('QuotedMessage', () => { it('should not be rendered if no message.quoted_message', async () => { - const { container, queryByTestId } = await renderQuotedMessage({ message: {} }); + const { container, queryByTestId } = await renderQuotedMessage({ + customProps: { message: {} }, + }); expect(queryByTestId(quotedMessageTestId)).not.toBeInTheDocument(); const results = await axe(container); expect(results).toHaveNoViolations(); }); it('should not be rendered if no text neither attachments', async () => { const message = { quoted_message: {} }; - const { container, queryByTestId } = await renderQuotedMessage({ message }); + const { container, queryByTestId } = await renderQuotedMessage({ + customProps: { message }, + }); expect(queryByTestId(quotedMessageTestId)).not.toBeInTheDocument(); const results = await axe(container); expect(results).toHaveNoViolations(); @@ -96,7 +108,9 @@ describe('QuotedMessage', () => { it('should rendered text', async () => { const { container, queryByTestId, queryByText } = await renderQuotedMessage({ - message: { quoted_message: { text: quotedText } }, + customProps: { + message: { quoted_message: { text: quotedText } }, + }, }); expect(queryByText(quotedText)).toBeInTheDocument(); expect(queryByTestId(quotedAttachmentListTestId)).not.toBeInTheDocument(); @@ -111,7 +125,9 @@ describe('QuotedMessage', () => { text: '', }, }; - const { container, queryByTestId } = await renderQuotedMessage({ message }); + const { container, queryByTestId } = await renderQuotedMessage({ + customProps: { message }, + }); expect(queryByTestId(quotedAttachmentListTestId)).toBeInTheDocument(); expect(queryByTestId(quotedMessageTextTestId)).toBeEmptyDOMElement(); const results = await axe(container); @@ -125,7 +141,9 @@ describe('QuotedMessage', () => { text: quotedText, }, }; - const { container, queryByTestId, queryByText } = await renderQuotedMessage({ message }); + const { container, queryByTestId, queryByText } = await renderQuotedMessage({ + customProps: { message }, + }); expect(queryByTestId(quotedAttachmentListTestId)).toBeInTheDocument(); expect(queryByText(quotedText)).toBeInTheDocument(); const results = await axe(container); @@ -137,7 +155,9 @@ describe('QuotedMessage', () => { attachments: [generateFileAttachment({ testId: quotingAttachmentListTestId })], quoted_message: { text: quotedText }, }; - const { container, queryByTestId } = await renderQuotedMessage({ message }); + const { container, queryByTestId } = await renderQuotedMessage({ + customProps: { message }, + }); expect(queryByTestId(quotedAttachmentListTestId)).not.toBeInTheDocument(); expect(queryByTestId(quotingAttachmentListTestId)).toBeInTheDocument(); expect(queryByTestId(quotedMessageTextTestId)).toBeInTheDocument(); @@ -150,7 +170,9 @@ describe('QuotedMessage', () => { const message = { quoted_message: { text: quotedText, user: alice }, }; - const { container, queryByTestId } = await renderQuotedMessage({ message }); + const { container, queryByTestId } = await renderQuotedMessage({ + customProps: { message }, + }); expect(queryByTestId(avatarTestId)).toBeInTheDocument(); const results = await axe(container); expect(results).toHaveNoViolations(); @@ -160,18 +182,71 @@ describe('QuotedMessage', () => { const message = { quoted_message: { text: quotedText }, }; - const { container, queryByTestId } = await renderQuotedMessage({ message }); + const { container, queryByTestId } = await renderQuotedMessage({ + customProps: { message }, + }); expect(queryByTestId(avatarTestId)).not.toBeInTheDocument(); const results = await axe(container); expect(results).toHaveNoViolations(); }); + it('renders quoted Poll component if message contains poll', async () => { + const poll = generatePoll(); + const messageWithPoll = generateMessage({ poll, poll_id: poll.id, text: '' }); + const quotingMessage = generateMessage({ + quoted_message: messageWithPoll, + }); + const { + channels: [channel], + client, + } = await initClientWithChannels({ + channelsData: [{ messages: [messageWithPoll, quotingMessage] }], + customUser: alice, + }); + const { container } = await renderQuotedMessage({ + customChannel: channel, + customClient: client, + customProps: { message: quotingMessage }, + }); + const quotedPollPreview = container.querySelector(quotedPollPreviewClassSelector); + expect(quotedPollPreview).toBeInTheDocument(); + const results = await axe(container); + expect(results).toHaveNoViolations(); + }); + + it('renders custom quoted Poll component if message contains poll', async () => { + const poll = generatePoll(); + const messageWithPoll = generateMessage({ poll, poll_id: poll.id, text: '' }); + const quotingMessage = generateMessage({ + quoted_message: messageWithPoll, + }); + const { + channels: [channel], + client, + } = await initClientWithChannels({ + channelsData: [{ messages: [messageWithPoll, quotingMessage] }], + customUser: alice, + }); + const pollText = 'Custom Poll component'; + const Poll = () =>
{pollText}
; + + await renderQuotedMessage({ + componentContext: { Poll }, + customChannel: channel, + customClient: client, + customProps: { message: quotingMessage }, + }); + expect(screen.getByText(pollText)).toBeInTheDocument(); + }); + describe('deleted', () => { it(`should render text "${deletedMessageText}" for type "deleted"`, async () => { const message = { quoted_message: { text: quotedText, type: 'deleted' }, }; - const { container, queryByText } = await renderQuotedMessage({ message }); + const { container, queryByText } = await renderQuotedMessage({ + customProps: { message }, + }); expect(queryByText(deletedMessageText)).toBeInTheDocument(); expect(queryByText(quotedText)).not.toBeInTheDocument(); const results = await axe(container); @@ -185,7 +260,9 @@ describe('QuotedMessage', () => { type: 'deleted', }, }; - const { container, queryByTestId, queryByText } = await renderQuotedMessage({ message }); + const { container, queryByTestId, queryByText } = await renderQuotedMessage({ + customProps: { message }, + }); expect(queryByText(deletedMessageText)).toBeInTheDocument(); expect(queryByTestId(quotedAttachmentListTestId)).not.toBeInTheDocument(); const results = await axe(container); @@ -200,7 +277,9 @@ describe('QuotedMessage', () => { type: 'deleted', }, }; - const { container, queryByTestId, queryByText } = await renderQuotedMessage({ message }); + const { container, queryByTestId, queryByText } = await renderQuotedMessage({ + customProps: { message }, + }); expect(queryByText(deletedMessageText)).toBeInTheDocument(); expect(queryByTestId(quotingAttachmentListTestId)).toBeInTheDocument(); const results = await axe(container); @@ -211,7 +290,9 @@ describe('QuotedMessage', () => { const message = { quoted_message: { deleted_at: new Date().toISOString(), text: quotedText }, }; - const { container, queryByText } = await renderQuotedMessage({ message }); + const { container, queryByText } = await renderQuotedMessage({ + customProps: { message }, + }); expect(queryByText(deletedMessageText)).toBeInTheDocument(); expect(queryByText(quotedText)).not.toBeInTheDocument(); const results = await axe(container); @@ -225,7 +306,9 @@ describe('QuotedMessage', () => { deleted_at: new Date().toISOString(), }, }; - const { container, queryByTestId, queryByText } = await renderQuotedMessage({ message }); + const { container, queryByTestId, queryByText } = await renderQuotedMessage({ + customProps: { message }, + }); expect(queryByText(deletedMessageText)).toBeInTheDocument(); expect(queryByTestId(quotedAttachmentListTestId)).not.toBeInTheDocument(); const results = await axe(container); @@ -240,7 +323,9 @@ describe('QuotedMessage', () => { deleted_at: new Date().toISOString(), }, }; - const { container, queryByTestId, queryByText } = await renderQuotedMessage({ message }); + const { container, queryByTestId, queryByText } = await renderQuotedMessage({ + customProps: { message }, + }); expect(queryByText(deletedMessageText)).toBeInTheDocument(); expect(queryByTestId(quotingAttachmentListTestId)).toBeInTheDocument(); const results = await axe(container); diff --git a/src/components/MessageInput/__tests__/MessageInput.test.js b/src/components/MessageInput/__tests__/MessageInput.test.js index cf44c8cd73..9caeb36f04 100644 --- a/src/components/MessageInput/__tests__/MessageInput.test.js +++ b/src/components/MessageInput/__tests__/MessageInput.test.js @@ -24,6 +24,7 @@ import { generateUser, initClientWithChannels, } from '../../../mock-builders'; +import { generatePoll } from '../../../mock-builders/generator/poll'; expect.extend(toHaveNoViolations); @@ -1326,6 +1327,48 @@ describe(`MessageInputFlat only`, () => { }); quotedMessagePreviewIsNotDisplayed(mainListMessage); }); + + it('renders quoted Poll component if message contains poll', async () => { + const poll = generatePoll(); + const messageWithPoll = generateMessage({ poll, poll_id: poll.id, text: 'X' }); + const { + channels: [channel], + client, + } = await initClientWithChannels({ + channelsData: [{ messages: [messageWithPoll] }], + }); + const { container } = await renderComponent({ + customChannel: channel, + customClient: client, + messageContextOverrides: { ...defaultMessageContextValue, message: messageWithPoll }, + }); + + await initQuotedMessagePreview(messageWithPoll); + expect(container.querySelector('.str-chat__quoted-poll-preview')).toBeInTheDocument(); + }); + + it('renders custom quoted Poll component if message contains poll', async () => { + const poll = generatePoll(); + const messageWithPoll = generateMessage({ poll, poll_id: poll.id, text: 'X' }); + const { + channels: [channel], + client, + } = await initClientWithChannels({ + channelsData: [{ messages: [messageWithPoll] }], + }); + const pollText = 'Custom Poll component'; + const Poll = () =>
{pollText}
; + + await renderComponent({ + channelProps: { Poll }, + customChannel: channel, + customClient: client, + messageContextOverrides: { ...defaultMessageContextValue, message: messageWithPoll }, + }); + + await initQuotedMessagePreview(messageWithPoll); + expect(screen.queryByText(pollText)).toBeInTheDocument(); + }); }); describe('send button', () => { diff --git a/src/mock-builders/generator/poll.js b/src/mock-builders/generator/poll.js new file mode 100644 index 0000000000..b55d2dec64 --- /dev/null +++ b/src/mock-builders/generator/poll.js @@ -0,0 +1,154 @@ +export const generatePoll = (data = {}) => { + const pollId = 'WD4SBRJvLoGwB4oAoCQGM'; + + const user1 = { + banned: false, + created_at: '2022-03-08T09:46:56.840739Z', + id: 'admin', + last_active: '2024-10-23T08:14:23.299448386Z', + mutes: null, + name: 'Test User', + online: true, + role: 'admin', + updated_at: '2024-09-13T13:53:32.883409Z', + }; + + const user1Votes = [ + { + created_at: '2024-10-22T15:58:27.756166Z', + id: '332da4fe-e38c-465c-8f74-e8df69680f13', + option_id: '85610252-7d50-429c-8183-51a7eba46246', + poll_id: pollId, + updated_at: '2024-10-22T15:58:27.756166Z', + user: user1, + user_id: user1.id, + }, + { + created_at: '2024-10-22T15:58:25.886491Z', + id: '5657da00-256e-41fc-a580-b7adabcbfbe1', + option_id: 'dc22dcd6-4fc8-4c92-92c2-bfd63245724c', + poll_id: pollId, + updated_at: '2024-10-22T15:58:25.886491Z', + user: user1, + user_id: user1.id, + }, + ]; + + const user2 = { + banned: false, + created_at: '2022-01-27T08:28:28.412254Z', + id: 'SmithAnne', + image: 'https://getstream.io/random_png/?name=SmithAnne', + last_active: '2024-10-23T08:01:43.157632831Z', + name: 'SmithAnne', + nickname: 'Ann', + online: true, + role: 'user', + updated_at: '2024-09-26T10:12:23.427141Z', + }; + + const user2Votes = [ + { + created_at: '2024-10-22T16:00:50.2493Z', + id: 'f428f353-3057-4353-b0b5-b33dcdeb1992', + option_id: '7312e983-b042-4596-b5ce-f9e82deb363f', + poll_id: pollId, + updated_at: '2024-10-22T16:00:50.2493Z', + user: user2, + user_id: user2.id, + }, + { + created_at: '2024-10-22T16:00:54.410474Z', + id: '75ba8774-bf17-4edd-8ced-39e7dc6aa7dd', + option_id: '85610252-7d50-429c-8183-51a7eba46246', + poll_id: pollId, + updated_at: '2024-10-22T16:00:54.410474Z', + user: user2, + user_id: user2.id, + }, + ]; + + const user1Answer = { + answer_text: 'comment1', + created_at: '2024-10-23T13:12:57.944913Z', + id: 'dbb4506c-c5a8-4ca6-86ec-0c57498916fe', + is_answer: true, + option_id: '', + poll_id: pollId, + updated_at: '2024-10-23T13:12:57.944913Z', + user: user1, + user_id: user1.id, + }; + + const user2Answer = { + answer_text: 'comment2', + created_at: '2024-10-23T13:12:57.944913Z', + id: 'dbb4506c-c5a8-4ca6-86ec-0c57498916xy', + is_answer: true, + option_id: '', + poll_id: pollId, + updated_at: '2024-10-23T13:12:57.944913Z', + user: user2, + user_id: user2.id, + }; + + const pollConfigData = { + allow_answers: true, + allow_user_suggested_options: false, + description: 'Poll description', + enforce_unique_vote: false, + id: pollId, + max_votes_allowed: 2, + name: 'XY', + options: [ + { + id: '85610252-7d50-429c-8183-51a7eba46246', + text: 'A', + }, + { + id: '7312e983-b042-4596-b5ce-f9e82deb363f', + text: 'B', + }, + { + id: 'ba933470-c0da-4b6f-a4d2-d2176ac0d4a8', + text: 'C', + }, + { + id: 'dc22dcd6-4fc8-4c92-92c2-bfd63245724c', + text: 'D', + }, + ], + voting_visibility: 'public', + }; + + const pollEnrichData = { + answers_count: 1, + latest_answers: [user1Answer, user2Answer], + latest_votes_by_option: { + '7312e983-b042-4596-b5ce-f9e82deb363f': [user2Votes[0]], + '85610252-7d50-429c-8183-51a7eba46246': [user1Votes[0], user2Votes[1]], + 'dc22dcd6-4fc8-4c92-92c2-bfd63245724c': [user1Votes[1]], + }, + own_votes: [...user1Votes, user1Answer], + vote_count: 4, + vote_counts_by_option: { + '7312e983-b042-4596-b5ce-f9e82deb363f': 1, + '85610252-7d50-429c-8183-51a7eba46246': 2, + 'dc22dcd6-4fc8-4c92-92c2-bfd63245724c': 1, + }, + }; + + const pollMetadata = { + created_at: '2024-10-22T15:28:20.580523Z', + created_by: user1, + created_by_id: user1.id, + updated_at: '2024-10-22T15:28:20.580523Z', + }; + + return { + ...pollConfigData, + ...pollEnrichData, + ...pollMetadata, + ...data, + }; +}; From 6ea3c6f533791a8eee65ca9b1b0927c56c4ee7a2 Mon Sep 17 00:00:00 2001 From: martincupela Date: Mon, 28 Oct 2024 17:12:28 +0100 Subject: [PATCH 40/71] feat: make AttachmentSelectorActions customizable --- .../MessageInput/AttachmentSelector.tsx | 182 ++++++++++++------ src/components/MessageInput/MessageInput.tsx | 2 +- src/components/MessageInput/index.ts | 1 + .../PollCreationDialog/PollCreationDialog.tsx | 5 +- src/context/AttachmentSelectorContext.tsx | 20 ++ 5 files changed, 150 insertions(+), 60 deletions(-) create mode 100644 src/context/AttachmentSelectorContext.tsx diff --git a/src/components/MessageInput/AttachmentSelector.tsx b/src/components/MessageInput/AttachmentSelector.tsx index 202fe11038..3ed719b633 100644 --- a/src/components/MessageInput/AttachmentSelector.tsx +++ b/src/components/MessageInput/AttachmentSelector.tsx @@ -5,7 +5,7 @@ import { CHANNEL_CONTAINER_ID } from '../Channel/constants'; import { DialogAnchor, useDialog, useDialogIsOpen } from '../Dialog'; import { DialogMenuButton } from '../Dialog/DialogMenu'; import { Modal } from '../Modal'; -import { PollCreationDialog } from '../Poll/PollCreationDialog'; +import { PollCreationDialog } from '../Poll'; import { Portal } from '../Portal/Portal'; import { UploadFileInput } from '../ReactFileUtilities'; import { @@ -14,6 +14,10 @@ import { useMessageInputContext, useTranslationContext, } from '../../context'; +import { + AttachmentSelectorContextProvider, + useAttachmentSelectorContext, +} from '../../context/AttachmentSelectorContext'; import type { DefaultStreamChatGenerics } from '../../types'; export const SimpleAttachmentSelector = () => { @@ -45,15 +49,87 @@ export const SimpleAttachmentSelector = () => { ); }; +export type AttachmentSelectorActionProps = { + closeMenu: () => void; +}; + +export const DefaultAttachmentSelectorComponents = { + File({ closeMenu }: AttachmentSelectorActionProps) { + const { t } = useTranslationContext(); + const { fileInput } = useAttachmentSelectorContext(); + + return ( + { + if (fileInput) fileInput.click(); + closeMenu(); + }} + > + {t('File')} + + ); + }, + Poll({ closeMenu }: AttachmentSelectorActionProps) { + const { t } = useTranslationContext(); + const { openPollModal } = useAttachmentSelectorContext(); + return ( + { + openPollModal(); + closeMenu(); + }} + > + {t('Poll')} + + ); + }, +}; + +export type AttachmentSelectorAction = { + Component: React.ComponentType; + // eslint-disable-next-line @typescript-eslint/ban-types + type: 'uploadFile' | 'createPoll' | (string & {}); +}; + +export const defaultAttachmentSelectorActionSet: AttachmentSelectorAction[] = [ + { Component: DefaultAttachmentSelectorComponents.File, type: 'uploadFile' }, + { Component: DefaultAttachmentSelectorComponents.Poll, type: 'createPoll' }, +]; + +export type AttachmentSelectorProps = { + attachmentSelectorActionSet?: AttachmentSelectorAction[]; +}; + +const useAttachmentSelectorActionsFiltered = < + StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics +>( + original: AttachmentSelectorAction[], +) => { + const { channelCapabilities } = useChannelStateContext(); + const { isThreadInput } = useMessageInputContext(); + + return original.filter((action) => { + if (!channelCapabilities['upload-file'] && action.type === 'uploadFile') return false; + if ((isThreadInput || !channelCapabilities['send-poll']) && action.type === 'createPoll') + return false; + return true; + }); +}; + export const AttachmentSelector = < StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics ->() => { - const { t } = useTranslationContext('AttachmentSelectorActionsMenu'); +>({ + attachmentSelectorActionSet = defaultAttachmentSelectorActionSet, +}: AttachmentSelectorProps) => { + const { t } = useTranslationContext(); const { channelCapabilities } = useChannelStateContext(); const { isThreadInput } = useMessageInputContext(); - const [fileInput, setFileInput] = useState(null); - const menuButtonRef = useRef>(null); + const actions = useAttachmentSelectorActionsFiltered( + attachmentSelectorActionSet, + ); const menuDialogId = `attachment-actions-menu${isThreadInput ? '-thread' : ''}`; const menuDialog = useDialog({ id: menuDialogId }); @@ -63,66 +139,56 @@ export const AttachmentSelector = < const closePollModal = useCallback(() => setCreatePollModalIsOpen(false), []); const openPollModal = useCallback(() => setCreatePollModalIsOpen(true), []); + const [fileInput, setFileInput] = useState(null); + const menuButtonRef = useRef>(null); + const getCreatePollModalDestination = useCallback( () => document.getElementById(CHANNEL_CONTAINER_ID), [], ); - if (!channelCapabilities['send-poll'] && !channelCapabilities['upload-file']) return null; + if (actions.length === 0) return null; return ( -
- - - -
- {channelCapabilities['upload-file'] && ( - { - fileInput?.click(); - menuDialog.close(); - }} - > - {t('File')} - - )} - {!isThreadInput && channelCapabilities['send-poll'] && ( - { - openPollModal(); - menuDialog.close(); - }} - > - {t('Poll')} - - )} -
-
- - +
+ {channelCapabilities['upload-file'] && } +
+
+ + +
+ {actions.map(({ Component, type }) => ( + + ))} +
+
+ + + + + +
+ ); }; diff --git a/src/components/MessageInput/MessageInput.tsx b/src/components/MessageInput/MessageInput.tsx index 5e7aec2459..ce6a92f2db 100644 --- a/src/components/MessageInput/MessageInput.tsx +++ b/src/components/MessageInput/MessageInput.tsx @@ -8,6 +8,7 @@ import { useMessageInputState } from './hooks/useMessageInputState'; import { StreamMessage, useChannelStateContext } from '../../context/ChannelStateContext'; import { ComponentContextValue, useComponentContext } from '../../context/ComponentContext'; import { MessageInputContextProvider } from '../../context/MessageInputContext'; +import { DialogManagerProvider } from '../../context'; import type { Channel, Message, SendFileAPIResponse } from 'stream-chat'; @@ -22,7 +23,6 @@ import type { } from '../../types/types'; import type { URLEnrichmentConfig } from './hooks/useLinkPreviews'; import type { CustomAudioRecordingConfig } from '../MediaRecorder'; -import { DialogManagerProvider } from '../../context'; export type EmojiSearchIndexResult = { id: string; diff --git a/src/components/MessageInput/index.ts b/src/components/MessageInput/index.ts index 0c79e9d922..46c2d6e13e 100644 --- a/src/components/MessageInput/index.ts +++ b/src/components/MessageInput/index.ts @@ -1,3 +1,4 @@ +export * from './AttachmentSelector'; export { AttachmentPreviewList } from './AttachmentPreviewList'; export type { AttachmentPreviewListProps, diff --git a/src/components/Poll/PollCreationDialog/PollCreationDialog.tsx b/src/components/Poll/PollCreationDialog/PollCreationDialog.tsx index 4d3c246771..fb1e592bc6 100644 --- a/src/components/Poll/PollCreationDialog/PollCreationDialog.tsx +++ b/src/components/Poll/PollCreationDialog/PollCreationDialog.tsx @@ -40,7 +40,10 @@ export const PollCreationDialog = ({ close }: PollCreationDialogProps) => { ); return ( -
+
('Create poll')} />
diff --git a/src/context/AttachmentSelectorContext.tsx b/src/context/AttachmentSelectorContext.tsx new file mode 100644 index 0000000000..0e78e74f01 --- /dev/null +++ b/src/context/AttachmentSelectorContext.tsx @@ -0,0 +1,20 @@ +import React, { createContext, PropsWithChildren, useContext } from 'react'; + +export type AttachmentSelectorContextValue = { + fileInput: HTMLInputElement | null; + openPollModal: () => void; +}; + +const AttachmentSelectorContext = createContext({ + fileInput: null, + openPollModal: () => null, +}); + +export const AttachmentSelectorContextProvider = ({ + children, + value, +}: PropsWithChildren<{ value: AttachmentSelectorContextValue }>) => ( + {children} +); + +export const useAttachmentSelectorContext = () => useContext(AttachmentSelectorContext); From f1aca518f768bef90daf864a6ed4a59a8442f57b Mon Sep 17 00:00:00 2001 From: martincupela Date: Mon, 28 Oct 2024 17:12:56 +0100 Subject: [PATCH 41/71] test: add AttachmentSelector tests --- .../__tests__/AttachmentSelector.test.js | 164 ++++++++++++++++++ 1 file changed, 164 insertions(+) create mode 100644 src/components/MessageInput/__tests__/AttachmentSelector.test.js diff --git a/src/components/MessageInput/__tests__/AttachmentSelector.test.js b/src/components/MessageInput/__tests__/AttachmentSelector.test.js new file mode 100644 index 0000000000..bb39dfc9b3 --- /dev/null +++ b/src/components/MessageInput/__tests__/AttachmentSelector.test.js @@ -0,0 +1,164 @@ +import React from 'react'; +import { act, fireEvent, render, screen, waitFor } from '@testing-library/react'; +import '@testing-library/jest-dom'; +import { MessageInput } from '../MessageInput'; +import { Chat } from '../../Chat'; +import { + ChannelActionProvider, + ChannelStateProvider, + ComponentProvider, + TranslationProvider, +} from '../../../context'; +import { initClientWithChannels } from '../../../mock-builders'; +import { CHANNEL_CONTAINER_ID } from '../../Channel/constants'; +import { AttachmentSelector } from '../AttachmentSelector'; + +const ATTACHMENT_SELECTOR__ACTIONS_MENU_TEST_ID = 'attachment-selector-actions-menu'; +const POLL_CREATION_DIALOG_TEST_ID = 'poll-creation-dialog'; + +const UPLOAD_FILE_BUTTON_CLASS = 'str-chat__attachment-selector-actions-menu__upload-file-button'; +const CREATE_POLL_BUTTON_CLASS = 'str-chat__attachment-selector-actions-menu__create-poll-button'; + +const translationContext = { + t: (v) => v, +}; + +const defaultChannelStateContext = { + channelCapabilities: { 'send-poll': true, 'upload-file': true }, +}; + +const defaultMessageInputProps = { + isThreadInput: false, +}; + +const invokeMenu = async () => { + await act(async () => { + await fireEvent.click(screen.getByTestId('invoke-attachment-selector-button')); + }); +}; + +const renderComponent = async ({ + channelStateContext, + componentContext, + messageInputProps, +} = {}) => { + const { + channels: [channel], + client, + } = await initClientWithChannels(); + let result; + await act(() => { + result = render( + + + + + +
+ +
+
+
+
+
+
, + ); + }); + return result; +}; + +describe('AttachmentSelector', () => { + it('renders with upload file button and poll button if send-poll and upload-file permissions are granted', async () => { + await renderComponent(); + await invokeMenu(); + const menu = screen.getByTestId(ATTACHMENT_SELECTOR__ACTIONS_MENU_TEST_ID); + expect(menu).toBeInTheDocument(); + expect(menu).toHaveTextContent('File'); + expect(menu).toHaveTextContent('Poll'); + }); + + it('renders with single upload file button if send-poll permission is not granted', async () => { + await renderComponent({ + channelStateContext: { channelCapabilities: { 'upload-file': true } }, + }); + await invokeMenu(); + const menu = screen.getByTestId(ATTACHMENT_SELECTOR__ACTIONS_MENU_TEST_ID); + expect(menu).toBeInTheDocument(); + expect(menu).toHaveTextContent('File'); + expect(menu).not.toHaveTextContent('Poll'); + }); + + it('renders with single upload file button if rendered in a thread', async () => { + await renderComponent({ + messageInputProps: { isThreadInput: true }, + }); + await invokeMenu(); + const menu = screen.getByTestId(ATTACHMENT_SELECTOR__ACTIONS_MENU_TEST_ID); + expect(menu).toBeInTheDocument(); + expect(menu).toHaveTextContent('File'); + expect(menu).not.toHaveTextContent('Poll'); + }); + + it('renders with single poll button if upload-file permission is not granted', async () => { + await renderComponent({ + channelStateContext: { channelCapabilities: { 'send-poll': true } }, + }); + await invokeMenu(); + const menu = screen.getByTestId(ATTACHMENT_SELECTOR__ACTIONS_MENU_TEST_ID); + expect(menu).toBeInTheDocument(); + expect(menu).not.toHaveTextContent('File'); + expect(menu).toHaveTextContent('Poll'); + }); + + it('does not render the invoke button if send-poll and upload-file permission is not granted', async () => { + await renderComponent({ + channelStateContext: { channelCapabilities: {} }, + }); + expect(screen.queryByTestId(ATTACHMENT_SELECTOR__ACTIONS_MENU_TEST_ID)).not.toBeInTheDocument(); + }); + + it('opens poll creation dialog if Poll option is selected and closes the attachment selector menu', async () => { + await renderComponent(); + await invokeMenu(); + const menu = screen.getByTestId(ATTACHMENT_SELECTOR__ACTIONS_MENU_TEST_ID); + + const createPollButton = menu.querySelector(`.${CREATE_POLL_BUTTON_CLASS}`); + expect(createPollButton).toBeInTheDocument(); + fireEvent.click(createPollButton); + await waitFor(() => { + expect(menu).not.toBeInTheDocument(); + expect(screen.queryByTestId(POLL_CREATION_DIALOG_TEST_ID)).toBeInTheDocument(); + }); + }); + + it('is closed if File menu button is clicked', async () => { + await renderComponent(); + await invokeMenu(); + const menu = screen.getByTestId(ATTACHMENT_SELECTOR__ACTIONS_MENU_TEST_ID); + const uploadFileMenuBtn = menu.querySelector(`.${UPLOAD_FILE_BUTTON_CLASS}`); + expect(uploadFileMenuBtn).toBeInTheDocument(); + fireEvent.click(uploadFileMenuBtn); + await waitFor(() => { + expect(menu).not.toBeInTheDocument(); + }); + }); + + it('renders custom menu actions if provided', async () => { + const customText = 'Custom text'; + const CustomItem = () =>
{customText}
; + const CustomAttachmentSelector = () => ( + + ); + await renderComponent({ componentContext: { AttachmentSelector: CustomAttachmentSelector } }); + await invokeMenu(); + const menu = screen.getByTestId(ATTACHMENT_SELECTOR__ACTIONS_MENU_TEST_ID); + expect(menu).toBeInTheDocument(); + expect(menu).toHaveTextContent(customText); + expect(menu).not.toHaveTextContent('File'); + expect(menu).not.toHaveTextContent('Poll'); + }); +}); From b14da4970d59a7ae36ecaeb702fde2d5f7a1b1e4 Mon Sep 17 00:00:00 2001 From: martincupela Date: Thu, 31 Oct 2024 13:10:05 +0100 Subject: [PATCH 42/71] test: update snapshots --- .../Channel/__tests__/__snapshots__/Channel.test.js.snap | 4 ++++ src/components/Gallery/__tests__/Image.test.js | 1 + .../Gallery/__tests__/__snapshots__/Gallery.test.js.snap | 1 + .../__snapshots__/VirtualizedMessageList.test.js.snap | 1 + 4 files changed, 7 insertions(+) diff --git a/src/components/Channel/__tests__/__snapshots__/Channel.test.js.snap b/src/components/Channel/__tests__/__snapshots__/Channel.test.js.snap index 328c0e14ff..e8de2adff1 100644 --- a/src/components/Channel/__tests__/__snapshots__/Channel.test.js.snap +++ b/src/components/Channel/__tests__/__snapshots__/Channel.test.js.snap @@ -4,6 +4,7 @@ exports[`Channel should render a LoadingIndicator if it is loading 1`] = `
`; @@ -244,6 +247,7 @@ exports[`Channel should render empty channel container if channels query failed
`; diff --git a/src/components/Gallery/__tests__/Image.test.js b/src/components/Gallery/__tests__/Image.test.js index ecd211c6a5..64c83b1780 100644 --- a/src/components/Gallery/__tests__/Image.test.js +++ b/src/components/Gallery/__tests__/Image.test.js @@ -114,6 +114,7 @@ describe('Image', () => {
Date: Thu, 31 Oct 2024 13:12:00 +0100 Subject: [PATCH 43/71] refactor: deprecate FileUploadIcon from component context --- src/components/Channel/Channel.tsx | 3 ++ .../MessageInput/AttachmentSelector.tsx | 28 ++++++++++++++++--- src/context/ComponentContext.tsx | 7 ++++- 3 files changed, 33 insertions(+), 5 deletions(-) diff --git a/src/components/Channel/Channel.tsx b/src/components/Channel/Channel.tsx index 1748678eaa..55d9a7b4ab 100644 --- a/src/components/Channel/Channel.tsx +++ b/src/components/Channel/Channel.tsx @@ -106,6 +106,7 @@ type ChannelPropsForwardedToComponentContext< | 'Attachment' | 'AttachmentPreviewList' | 'AttachmentSelector' + | 'AttachmentSelectorInitiationButtonContents' | 'AudioRecorder' | 'AutocompleteSuggestionItem' | 'AutocompleteSuggestionList' @@ -1223,6 +1224,7 @@ const ChannelInner = < Attachment: props.Attachment, AttachmentPreviewList: props.AttachmentPreviewList, AttachmentSelector: props.AttachmentSelector, + AttachmentSelectorInitiationButtonContents: props.AttachmentSelectorInitiationButtonContents, AudioRecorder: props.AudioRecorder, AutocompleteSuggestionItem: props.AutocompleteSuggestionItem, AutocompleteSuggestionList: props.AutocompleteSuggestionList, @@ -1277,6 +1279,7 @@ const ChannelInner = < props.Attachment, props.AttachmentPreviewList, props.AttachmentSelector, + props.AttachmentSelectorInitiationButtonContents, props.AudioRecorder, props.AutocompleteSuggestionItem, props.AutocompleteSuggestionList, diff --git a/src/components/MessageInput/AttachmentSelector.tsx b/src/components/MessageInput/AttachmentSelector.tsx index 3ed719b633..062e0e9097 100644 --- a/src/components/MessageInput/AttachmentSelector.tsx +++ b/src/components/MessageInput/AttachmentSelector.tsx @@ -21,7 +21,10 @@ import { import type { DefaultStreamChatGenerics } from '../../types'; export const SimpleAttachmentSelector = () => { - const { FileUploadIcon = DefaultUploadIcon } = useComponentContext('SimpleAttachmentSelector'); + const { + AttachmentSelectorInitiationButtonContents, + FileUploadIcon = DefaultUploadIcon, + } = useComponentContext(); const inputRef = useRef>(null); const [labelElement, setLabelElement] = useState(null); const id = useMemo(() => nanoid(), []); @@ -41,14 +44,31 @@ export const SimpleAttachmentSelector = () => { return (
- +
); }; +const AttachmentSelectorMenuInitButtonIcon = () => { + const { AttachmentSelectorInitiationButtonContents, FileUploadIcon } = useComponentContext( + 'SimpleAttachmentSelector', + ); + if (AttachmentSelectorInitiationButtonContents) { + return ; + } + if (FileUploadIcon) { + return ; + } + return
; +}; + export type AttachmentSelectorActionProps = { closeMenu: () => void; }; @@ -162,7 +182,7 @@ export const AttachmentSelector = < onClick={() => menuDialog?.toggle()} ref={menuButtonRef} > -
+ ; /** Custom UI component to control adding attachments to MessageInput, defaults to and accepts same props as: [AttachmentSelector](https://github.com/GetStream/stream-chat-react/blob/master/src/components/MessageInput/AttachmentSelector.tsx) */ AttachmentSelector?: React.ComponentType; + /** Custom UI component for contents of attachment selector initiation button */ + AttachmentSelectorInitiationButtonContents?: React.ComponentType; /** Custom UI component to display AudioRecorder in MessageInput, defaults to and accepts same props as: [AudioRecorder](https://github.com/GetStream/stream-chat-react/blob/master/src/components/MessageInput/AudioRecorder.tsx) */ AudioRecorder?: React.ComponentType; /** Optional UI component to override the default suggestion Item component, defaults to and accepts same props as: [Item](https://github.com/GetStream/stream-chat-react/blob/master/src/components/AutoCompleteTextarea/Item.js) */ @@ -88,7 +90,10 @@ export type ComponentContextValue< emojiSearchIndex?: EmojiSearchIndex; /** Custom UI component to be displayed when the `MessageList` is empty, defaults to and accepts same props as: [EmptyStateIndicator](https://github.com/GetStream/stream-chat-react/blob/master/src/components/EmptyStateIndicator/EmptyStateIndicator.tsx) */ EmptyStateIndicator?: React.ComponentType; - /** Custom UI component for file upload icon, defaults to and accepts same props as: [FileUploadIcon](https://github.com/GetStream/stream-chat-react/blob/master/src/components/MessageInput/icons.tsx) */ + /** + * Custom UI component for file upload icon, defaults to and accepts same props as: [FileUploadIcon](https://github.com/GetStream/stream-chat-react/blob/master/src/components/MessageInput/icons.tsx) + * @deprecated use AttachmentSelectorInitiationButtonContents prop instead + */ FileUploadIcon?: React.ComponentType; /** Custom UI component to render a Giphy preview in the `VirtualizedMessageList` */ GiphyPreviewMessage?: React.ComponentType>; From 0e4cfacd0724dd42c6c8d1de1e0991349acdadf1 Mon Sep 17 00:00:00 2001 From: martincupela Date: Thu, 31 Oct 2024 13:12:36 +0100 Subject: [PATCH 44/71] fix: keep using SimpleAttachmentSelector in EditMessageForm --- src/components/MessageInput/MessageInputFlat.tsx | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/components/MessageInput/MessageInputFlat.tsx b/src/components/MessageInput/MessageInputFlat.tsx index 77d9a6d3d2..71aabbb723 100644 --- a/src/components/MessageInput/MessageInputFlat.tsx +++ b/src/components/MessageInput/MessageInputFlat.tsx @@ -2,8 +2,11 @@ import React, { useCallback, useEffect, useMemo, useState } from 'react'; import type { Event } from 'stream-chat'; import clsx from 'clsx'; import { useDropzone } from 'react-dropzone'; -import { AttachmentSelector as DefaultAttachmentSelector } from './AttachmentSelector'; -// import { SimpleAttachmentSelector as DefaultAttachmentSelector } from './AttachmentSelector'; +import { + AttachmentSelector as DefaultAttachmentSelector, + SimpleAttachmentSelector, +} from './AttachmentSelector'; +import { AttachmentPreviewList as DefaultAttachmentPreviewList } from './AttachmentPreviewList'; import { CooldownTimer as DefaultCooldownTimer } from './CooldownTimer'; import { SendButton as DefaultSendButton } from './SendButton'; import { @@ -16,7 +19,6 @@ import { QuotedMessagePreview as DefaultQuotedMessagePreview, QuotedMessagePreviewHeader, } from './QuotedMessagePreview'; -import { AttachmentPreviewList as DefaultAttachmentPreviewList } from './AttachmentPreviewList'; import { LinkPreviewList as DefaultLinkPreviewList } from './LinkPreviewList'; import { ChatAutoComplete } from '../ChatAutoComplete/ChatAutoComplete'; @@ -57,7 +59,7 @@ export const MessageInputFlat = < const { AudioRecorder = DefaultAudioRecorder, AttachmentPreviewList = DefaultAttachmentPreviewList, - AttachmentSelector = DefaultAttachmentSelector, + AttachmentSelector = message ? SimpleAttachmentSelector : DefaultAttachmentSelector, CooldownTimer = DefaultCooldownTimer, LinkPreviewList = DefaultLinkPreviewList, QuotedMessagePreview = DefaultQuotedMessagePreview, From 73632860d39d027d51151bde027a9ca68f4b6d71 Mon Sep 17 00:00:00 2001 From: martincupela Date: Thu, 31 Oct 2024 13:12:58 +0100 Subject: [PATCH 45/71] test: fix EditMessageForm tests --- .../__tests__/MessageInput.test.js | 374 ++++++++++++------ 1 file changed, 257 insertions(+), 117 deletions(-) diff --git a/src/components/MessageInput/__tests__/MessageInput.test.js b/src/components/MessageInput/__tests__/MessageInput.test.js index 9caeb36f04..75fc615279 100644 --- a/src/components/MessageInput/__tests__/MessageInput.test.js +++ b/src/components/MessageInput/__tests__/MessageInput.test.js @@ -133,6 +133,9 @@ const makeRenderFn = (InputComponent) => async ({ client = result.client; } let renderResult; + + const defaultMessageInputProps = + InputComponent.name === 'EditMessageForm' ? { message: mainListMessage } : {}; await act(() => { renderResult = render( @@ -147,7 +150,10 @@ const makeRenderFn = (InputComponent) => async ({ getMessageActions={defaultMessageContextValue.getMessageActions} /> - + , ); @@ -197,7 +203,7 @@ function axeNoViolations(container) { }); it('should contain placeholder text if no default message text provided', async () => { - await renderComponent(); + await renderComponent({ messageInputProps: { message: { text: '' } } }); await waitFor(() => { const textarea = screen.getByPlaceholderText(inputPlaceholder); expect(textarea).toBeInTheDocument(); @@ -205,35 +211,6 @@ function axeNoViolations(container) { }); }); - it('should contain default message text if provided', async () => { - const defaultValue = nanoid(); - await renderComponent({ - messageInputProps: { - additionalTextareaProps: { defaultValue }, - }, - }); - await waitFor(() => { - const textarea = screen.queryByDisplayValue(defaultValue); - expect(textarea).toBeInTheDocument(); - }); - }); - - it('should prefer value from getDefaultValue before additionalTextareaProps.defaultValue', async () => { - const defaultValue = nanoid(); - const generatedDefaultValue = nanoid(); - const getDefaultValue = () => generatedDefaultValue; - await renderComponent({ - messageInputProps: { - additionalTextareaProps: { defaultValue }, - getDefaultValue, - }, - }); - await waitFor(() => { - const textarea = screen.queryByDisplayValue(generatedDefaultValue); - expect(textarea).toBeInTheDocument(); - }); - }); - it('should shift focus to the textarea if the `focus` prop is true', async () => { const { container } = await renderComponent({ messageInputProps: { @@ -249,7 +226,10 @@ function axeNoViolations(container) { it('should render default file upload icon', async () => { const { container } = await renderComponent(); - const fileUploadIcon = await screen.findByTitle('Attach files'); + const fileUploadIcon = + componentName === 'EditMessageForm' + ? await screen.findByTitle('Attach files') + : await screen.getByTestId('invoke-attachment-selector-button'); await waitFor(() => { expect(fileUploadIcon).toBeInTheDocument(); @@ -276,6 +256,35 @@ function axeNoViolations(container) { expect(results).toHaveNoViolations(); }); + it('should prefer custom AttachmentSelectorInitiationButtonContents before custom FileUploadIcon', async () => { + const FileUploadIcon = () => ( + + NotFileUploadIcon + + ); + + const AttachmentSelectorInitiationButtonContents = () => ( + + AttachmentSelectorInitiationButtonContents + + ); + + const { container } = await renderComponent({ + channelProps: { AttachmentSelectorInitiationButtonContents, FileUploadIcon }, + }); + + const fileUploadIcon = await screen.queryByTitle('NotFileUploadIcon'); + const attachmentSelectorButtonIcon = await screen.getByTitle( + 'AttachmentSelectorInitiationButtonContents', + ); + await waitFor(() => { + expect(fileUploadIcon).not.toBeInTheDocument(); + expect(attachmentSelectorButtonIcon).toBeInTheDocument(); + }); + const results = await axe(container); + expect(results).toHaveNoViolations(); + }); + describe('Attachments', () => { it('Pasting images and files should result in uploading the files and showing previews', async () => { const doImageUploadRequest = mockUploadApi(); @@ -680,14 +689,6 @@ function axeNoViolations(container) { describe('Uploads disabled', () => { const channelData = { channel: { own_capabilities: [] } }; - it('should render file upload button disabled', async () => { - const { container } = await renderComponent({ - channelData, - }); - await waitFor(() => expect(screen.getByTestId(FILE_INPUT_TEST_ID)).toBeDisabled()); - const results = await axe(container); - expect(results).toHaveNoViolations(); - }); it('pasting images and files should do nothing', async () => { const doImageUploadRequest = mockUploadApi(); @@ -764,13 +765,23 @@ function axeNoViolations(container) { await act(() => submit()); - expect(submitMock).toHaveBeenCalledWith( - channel, - expect.objectContaining({ - text: messageText, - }), - {}, - ); + if (componentName === 'EditMessageForm') { + expect(editMock).toHaveBeenCalledWith( + channel.cid, + expect.objectContaining({ + text: messageText, + }), + {}, + ); + } else { + expect(submitMock).toHaveBeenCalledWith( + channel, + expect.objectContaining({ + text: messageText, + }), + {}, + ); + } await axeNoViolations(container); }); @@ -844,24 +855,33 @@ function axeNoViolations(container) { }); await act(() => submit()); - - expect(overrideMock).toHaveBeenCalledWith( - expect.objectContaining({ - text: messageText, - }), - channel.cid, - customMessageData, - {}, - ); + if (componentName === 'EditMessageForm') { + expect(editMock).toHaveBeenCalledWith( + channel.cid, + expect.objectContaining({ + text: messageText, + }), + {}, + ); + } else { + expect(overrideMock).toHaveBeenCalledWith( + expect.objectContaining({ + text: messageText, + }), + channel.cid, + customMessageData, + {}, + ); + } await axeNoViolations(container); }); it('should not do anything if the message is empty and has no files', async () => { - const { container, submit } = await renderComponent(); + const { container, submit } = await renderComponent({ messageInputProps: { message: {} } }); await act(() => submit()); - expect(submitMock).not.toHaveBeenCalled(); + expect(componentName === 'EditMessageForm' ? editMock : submitMock).not.toHaveBeenCalled(); await axeNoViolations(container); }); @@ -884,18 +904,28 @@ function axeNoViolations(container) { await act(() => submit()); - expect(submitMock).toHaveBeenCalledWith( - channel, - expect.objectContaining({ - attachments: expect.arrayContaining([ - expect.objectContaining({ - image_url: fileUploadUrl, - type: 'image', - }), - ]), - }), - {}, - ); + const msgFragment = { + attachments: expect.arrayContaining([ + expect.objectContaining({ + image_url: fileUploadUrl, + type: 'image', + }), + ]), + }; + + if (componentName === 'EditMessageForm') { + expect(editMock).toHaveBeenCalledWith( + channel.cid, + expect.objectContaining(msgFragment), + {}, + ); + } else { + expect(submitMock).toHaveBeenCalledWith( + channel, + expect.objectContaining(msgFragment), + {}, + ); + } await axeNoViolations(container); }); @@ -918,18 +948,28 @@ function axeNoViolations(container) { await act(() => submit()); - expect(submitMock).toHaveBeenCalledWith( - channel, - expect.objectContaining({ - attachments: expect.arrayContaining([ - expect.objectContaining({ - asset_url: fileUploadUrl, - type: 'file', - }), - ]), - }), - {}, - ); + const msgFragment = { + attachments: expect.arrayContaining([ + expect.objectContaining({ + asset_url: fileUploadUrl, + type: 'file', + }), + ]), + }; + + if (componentName === 'EditMessageForm') { + expect(editMock).toHaveBeenCalledWith( + channel.cid, + expect.objectContaining(msgFragment), + {}, + ); + } else { + expect(submitMock).toHaveBeenCalledWith( + channel, + expect.objectContaining(msgFragment), + {}, + ); + } await axeNoViolations(container); }); @@ -954,18 +994,28 @@ function axeNoViolations(container) { await act(() => submit()); - expect(submitMock).toHaveBeenCalledWith( - channel, - expect.objectContaining({ - attachments: expect.arrayContaining([ - expect.objectContaining({ - asset_url: fileUploadUrl, - type: 'audio', - }), - ]), - }), - {}, - ); + const msgFragment = { + attachments: expect.arrayContaining([ + expect.objectContaining({ + asset_url: fileUploadUrl, + type: 'audio', + }), + ]), + }; + + if (componentName === 'EditMessageForm') { + expect(editMock).toHaveBeenCalledWith( + channel.cid, + expect.objectContaining(msgFragment), + {}, + ); + } else { + expect(submitMock).toHaveBeenCalledWith( + channel, + expect.objectContaining(msgFragment), + {}, + ); + } await axeNoViolations(container); }); @@ -989,14 +1039,24 @@ function axeNoViolations(container) { await act(() => fireEvent.keyDown(input, { key: 'Enter' })); - expect(submitHandler).toHaveBeenCalledWith( - expect.objectContaining({ - text: messageText, - }), - channel.cid, - undefined, - {}, - ); + const msgFragment = { + text: messageText, + }; + + if (componentName === 'EditMessageForm') { + expect(editMock).toHaveBeenCalledWith( + channel.cid, + expect.objectContaining(msgFragment), + {}, + ); + } else { + expect(submitHandler).toHaveBeenCalledWith( + expect.objectContaining(msgFragment), + channel.cid, + undefined, + {}, + ); + } await axeNoViolations(container); }); @@ -1049,14 +1109,24 @@ function axeNoViolations(container) { }); }); - expect(submitHandler).toHaveBeenCalledWith( - expect.objectContaining({ - text: messageText, - }), - channel.cid, - undefined, - {}, - ); + const msgFragment = { + text: messageText, + }; + + if (componentName === 'EditMessageForm') { + expect(editMock).toHaveBeenCalledWith( + channel.cid, + expect.objectContaining(msgFragment), + {}, + ); + } else { + expect(submitHandler).toHaveBeenCalledWith( + expect.objectContaining(msgFragment), + channel.cid, + undefined, + {}, + ); + } await axeNoViolations(container); }); @@ -1177,13 +1247,38 @@ function axeNoViolations(container) { await act(() => submit()); - expect(submitMock).toHaveBeenCalledWith( - channel, - expect.objectContaining({ - mentioned_users: expect.arrayContaining([mentionId]), - }), - {}, - ); + if (componentName === 'EditMessageForm') { + expect(editMock).toHaveBeenCalledWith( + channel.cid, + expect.objectContaining({ + ...mainListMessage, + created_at: expect.any(Date), + mentioned_users: [ + { + banned: false, + created_at: '2020-04-27T13:39:49.331742Z', + id: 'mention-id', + image: expect.any(String), + name: 'mention-name', + online: false, + role: 'user', + updated_at: '2020-04-27T13:39:49.332087Z', + }, + ], + text: '@mention-name ', + updated_at: expect.any(Date), + }), + {}, + ); + } else { + expect(submitMock).toHaveBeenCalledWith( + channel, + expect.objectContaining({ + mentioned_users: expect.arrayContaining([mentionId]), + }), + {}, + ); + } const results = await axe(container); expect(results).toHaveNoViolations(); }); @@ -1254,11 +1349,56 @@ function axeNoViolations(container) { }); }); +describe('EditMessageForm only', () => { + afterEach(tearDown); + + const renderComponent = makeRenderFn(EditMessageForm); + + it('should render file upload button disabled', async () => { + const channelData = { channel: { own_capabilities: [] } }; + const { container } = await renderComponent({ + channelData, + }); + await waitFor(() => expect(screen.getByTestId(FILE_INPUT_TEST_ID)).toBeDisabled()); + const results = await axe(container); + expect(results).toHaveNoViolations(); + }); +}); + describe(`MessageInputFlat only`, () => { afterEach(tearDown); const renderComponent = makeRenderFn(MessageInputFlat); + it('should contain default message text if provided', async () => { + const defaultValue = nanoid(); + await renderComponent({ + messageInputProps: { + additionalTextareaProps: { defaultValue }, + }, + }); + await waitFor(() => { + const textarea = screen.queryByDisplayValue(defaultValue); + expect(textarea).toBeInTheDocument(); + }); + }); + + it('should prefer value from getDefaultValue before additionalTextareaProps.defaultValue', async () => { + const defaultValue = nanoid(); + const generatedDefaultValue = nanoid(); + const getDefaultValue = () => generatedDefaultValue; + await renderComponent({ + messageInputProps: { + additionalTextareaProps: { defaultValue }, + getDefaultValue, + }, + }); + await waitFor(() => { + const textarea = screen.queryByDisplayValue(generatedDefaultValue); + expect(textarea).toBeInTheDocument(); + }); + }); + const renderWithActiveCooldown = async ({ messageInputProps = {} } = {}) => { const { channels: [channel], From 3b3ee82f3959628133fda06bb976ebc4d8e5f426 Mon Sep 17 00:00:00 2001 From: martincupela Date: Thu, 31 Oct 2024 13:13:14 +0100 Subject: [PATCH 46/71] test: fix AudioRecorder tests related to MessageInput --- .../AudioRecorder/__tests__/AudioRecorder.test.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/components/MediaRecorder/AudioRecorder/__tests__/AudioRecorder.test.js b/src/components/MediaRecorder/AudioRecorder/__tests__/AudioRecorder.test.js index a944775d1e..eb260da33f 100644 --- a/src/components/MediaRecorder/AudioRecorder/__tests__/AudioRecorder.test.js +++ b/src/components/MediaRecorder/AudioRecorder/__tests__/AudioRecorder.test.js @@ -47,7 +47,9 @@ const DEFAULT_RENDER_PARAMS = { channelActionCtx: { addNotification: jest.fn(), }, - channelStateCtx: {}, + channelStateCtx: { + channelCapabilities: [], + }, chatCtx: { getAppSettings: jest.fn().mockReturnValue({}), latestMessageDatesByChannels: {}, From 1bf91426d5a43d74dad1b02d60fb86edcc93b963 Mon Sep 17 00:00:00 2001 From: martincupela Date: Thu, 31 Oct 2024 13:15:14 +0100 Subject: [PATCH 47/71] refactor: remove the use of usePollState hook --- src/components/Poll/Poll.tsx | 28 ++++----- .../Poll/PollActions/AddCommentForm.tsx | 17 +++--- .../Poll/PollActions/PollActions.tsx | 46 ++++++++------- .../Poll/PollActions/PollAnswerList.tsx | 22 ++++--- .../Poll/PollActions/PollOptionsFullList.tsx | 11 ++-- .../PollResults/PollOptionWithLatestVotes.tsx | 14 ++--- .../PollResults/PollOptionWithVotesHeader.tsx | 20 ++++--- .../PollActions/PollResults/PollResults.tsx | 30 +++++----- .../PollActions/SuggestPollOptionForm.tsx | 12 ++-- src/components/Poll/PollHeader.tsx | 36 ++++++----- src/components/Poll/PollOptionList.tsx | 18 +++--- src/components/Poll/PollOptionSelector.tsx | 59 +++++++++++-------- src/components/Poll/hooks/index.ts | 1 - src/components/Poll/hooks/usePollState.ts | 14 ----- 14 files changed, 173 insertions(+), 155 deletions(-) delete mode 100644 src/components/Poll/hooks/usePollState.ts diff --git a/src/components/Poll/Poll.tsx b/src/components/Poll/Poll.tsx index 652bf755f9..8314f63a39 100644 --- a/src/components/Poll/Poll.tsx +++ b/src/components/Poll/Poll.tsx @@ -3,27 +3,28 @@ import React from 'react'; import { PollActions } from './PollActions'; import { PollHeader } from './PollHeader'; import { PollOptionList } from './PollOptionList'; -import { usePollState } from './hooks'; import { MAX_OPTIONS_DISPLAYED } from './constants'; -import { PollProvider } from '../../context'; +import { useStateStore } from '../../store'; +import { PollProvider, usePollContext } from '../../context'; import type { Poll as PollClass, PollState } from 'stream-chat'; import type { DefaultStreamChatGenerics } from '../../types'; -type PollStateSelectorQuotedPollReturnValue = [boolean | undefined, string]; +type PollStateSelectorQuotedPollReturnValue = { is_closed: boolean | undefined; name: string }; const pollStateSelectorQuotedPoll = < StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics >( nextValue: PollState, -): PollStateSelectorQuotedPollReturnValue => [nextValue.is_closed, nextValue.name]; +): PollStateSelectorQuotedPollReturnValue => ({ + is_closed: nextValue.is_closed, + name: nextValue.name, +}); export const QuotedPoll = < StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics >() => { - const [is_closed, name] = usePollState< - PollStateSelectorQuotedPollReturnValue, - StreamChatGenerics - >(pollStateSelectorQuotedPoll); + const { poll } = usePollContext(); + const { is_closed, name } = useStateStore(poll.state, pollStateSelectorQuotedPoll); return (
( nextValue: PollState, -): PollStateSelectorPollUIReturnValue => [nextValue.is_closed]; +): PollStateSelectorPollUIReturnValue => ({ is_closed: nextValue.is_closed }); const PollUI = < StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics >() => { - const [isClosed] = usePollState( - pollStateSelectorPollUI, - ); + const { poll } = usePollContext(); + const { is_closed } = useStateStore(poll.state, pollStateSelectorPollUI); return ( -
+
diff --git a/src/components/Poll/PollActions/AddCommentForm.tsx b/src/components/Poll/PollActions/AddCommentForm.tsx index 501b9f5552..d6c4c9d6e5 100644 --- a/src/components/Poll/PollActions/AddCommentForm.tsx +++ b/src/components/Poll/PollActions/AddCommentForm.tsx @@ -1,16 +1,16 @@ -import { FormDialog } from '../../Dialog'; import React from 'react'; -import { useTranslationContext } from '../../../context'; -import { usePoll, usePollState } from '../hooks'; +import { FormDialog } from '../../Dialog'; +import { useStateStore } from '../../../store'; +import { usePollContext, useTranslationContext } from '../../../context'; import type { PollAnswer, PollState } from 'stream-chat'; import type { DefaultStreamChatGenerics } from '../../../types'; -type PollStateSelectorReturnValue = [PollAnswer | undefined]; +type PollStateSelectorReturnValue = { ownAnswer: PollAnswer | undefined }; const pollStateSelector = < StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics >( nextValue: PollState, -): PollStateSelectorReturnValue => [nextValue.ownAnswer]; +): PollStateSelectorReturnValue => ({ ownAnswer: nextValue.ownAnswer }); export type AddCommentFormProps = { close: () => void; @@ -24,10 +24,9 @@ export const AddCommentForm = < messageId, }: AddCommentFormProps) => { const { t } = useTranslationContext('AddCommentForm'); - const poll = usePoll(); - const [ownAnswer] = usePollState( - pollStateSelector, - ); + + const { poll } = usePollContext(); + const { ownAnswer } = useStateStore(poll.state, pollStateSelector); return ( diff --git a/src/components/Poll/PollActions/PollActions.tsx b/src/components/Poll/PollActions/PollActions.tsx index e76cc145e7..99fac20dae 100644 --- a/src/components/Poll/PollActions/PollActions.tsx +++ b/src/components/Poll/PollActions/PollActions.tsx @@ -12,14 +12,15 @@ import { FullPollOptionsListingProps, } from './PollOptionsFullList'; import { PollResults as DefaultPollResults, PollResultsProps } from './PollResults'; -import { usePollState } from '../hooks'; +import { MAX_OPTIONS_DISPLAYED, MAX_POLL_OPTIONS } from '../constants'; import { useChannelStateContext, useChatContext, useMessageContext, + usePollContext, useTranslationContext, } from '../../../context'; -import { MAX_OPTIONS_DISPLAYED, MAX_POLL_OPTIONS } from '../constants'; +import { useStateStore } from '../../../store'; import type { PollAnswer, PollOption, PollState } from 'stream-chat'; import type { DefaultStreamChatGenerics } from '../../../types'; @@ -32,28 +33,28 @@ type ModalName = | 'view-results' | 'end-vote'; -type PollStateSelectorReturnValue = [ - boolean | undefined, - boolean | undefined, - number, - string, - boolean | undefined, - PollOption[], - PollAnswer | undefined, -]; +type PollStateSelectorReturnValue = { + allow_answers: boolean | undefined; + allow_user_suggested_options: boolean | undefined; + answers_count: number; + created_by_id: string; + is_closed: boolean | undefined; + options: PollOption[]; + ownAnswer: PollAnswer | undefined; +}; const pollStateSelector = < StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics >( nextValue: PollState, -): PollStateSelectorReturnValue => [ - nextValue.allow_answers, - nextValue.allow_user_suggested_options, - nextValue.answers_count, - nextValue.created_by_id, - nextValue.is_closed, - nextValue.options, - nextValue.ownAnswer, -]; +): PollStateSelectorReturnValue => ({ + allow_answers: nextValue.allow_answers, + allow_user_suggested_options: nextValue.allow_user_suggested_options, + answers_count: nextValue.answers_count, + created_by_id: nextValue.created_by_id, + is_closed: nextValue.is_closed, + options: nextValue.options, + ownAnswer: nextValue.ownAnswer, +}); export type PollActionsProps = { AddCommentForm?: React.ComponentType; @@ -78,7 +79,8 @@ export const PollActions = < const { t } = useTranslationContext('PollActions'); const { channelCapabilities = {} } = useChannelStateContext('PollActions'); const { message } = useMessageContext('PollActions'); - const [ + const { poll } = usePollContext(); + const { allow_answers, allow_user_suggested_options, answers_count, @@ -86,7 +88,7 @@ export const PollActions = < is_closed, options, ownAnswer, - ] = usePollState(pollStateSelector); + } = useStateStore(poll.state, pollStateSelector); const [modalOpen, setModalOpen] = useState(); const closeModal = useCallback(() => setModalOpen(undefined), []); diff --git a/src/components/Poll/PollActions/PollAnswerList.tsx b/src/components/Poll/PollActions/PollAnswerList.tsx index 1b6655d0be..78a6e59b8c 100644 --- a/src/components/Poll/PollActions/PollAnswerList.tsx +++ b/src/components/Poll/PollActions/PollAnswerList.tsx @@ -1,20 +1,27 @@ import React from 'react'; import { ModalHeader } from '../../Modal/ModalHeader'; import { PollVote } from '../PollVote'; -import { usePollAnswerPagination, usePollState } from '../hooks'; +import { usePollAnswerPagination } from '../hooks'; import { InfiniteScrollPaginator } from '../../InfiniteScrollPaginator/InfiniteScrollPaginator'; import { LoadingIndicator } from '../../Loading'; -import { useTranslationContext } from '../../../context'; +import { useStateStore } from '../../../store'; +import { usePollContext, useTranslationContext } from '../../../context'; import type { DefaultStreamChatGenerics } from '../../../types'; import type { PollAnswer, PollState } from 'stream-chat'; -type PollStateSelectorReturnValue = [boolean | undefined, PollAnswer | undefined]; +type PollStateSelectorReturnValue = { + is_closed: boolean | undefined; + ownAnswer: PollAnswer | undefined; +}; const pollStateSelector = < StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics >( nextValue: PollState, -): PollStateSelectorReturnValue => [nextValue.is_closed, nextValue.ownAnswer]; +): PollStateSelectorReturnValue => ({ + is_closed: nextValue.is_closed, + ownAnswer: nextValue.ownAnswer, +}); export type PollAnswerListProps = { onUpdateOwnAnswerClick: () => void; @@ -28,9 +35,8 @@ export const PollAnswerList = < onUpdateOwnAnswerClick, }: PollAnswerListProps) => { const { t } = useTranslationContext(); - const [isClosed, ownAnswer] = usePollState( - pollStateSelector, - ); + const { poll } = usePollContext(); + const { is_closed, ownAnswer } = useStateStore(poll.state, pollStateSelector); const { answers, @@ -63,7 +69,7 @@ export const PollAnswerList = < {error?.message &&
{error?.message}
}
- {answers.length > 0 && !isClosed && ( + {answers.length > 0 && !is_closed && ( diff --git a/src/components/Poll/PollActions/PollOptionsFullList.tsx b/src/components/Poll/PollActions/PollOptionsFullList.tsx index b3971ddb6b..505b562074 100644 --- a/src/components/Poll/PollActions/PollOptionsFullList.tsx +++ b/src/components/Poll/PollActions/PollOptionsFullList.tsx @@ -1,18 +1,18 @@ import React from 'react'; import { ModalHeader } from '../../Modal/ModalHeader'; -import { usePollState } from '../hooks'; import { PollOptionList } from '../PollOptionList'; -import { useTranslationContext } from '../../../context'; +import { useStateStore } from '../../../store'; +import { usePollContext, useTranslationContext } from '../../../context'; import type { PollState } from 'stream-chat'; import type { DefaultStreamChatGenerics } from '../../../types'; -type PollStateSelectorReturnValue = [string]; +type PollStateSelectorReturnValue = { name: string }; const pollStateSelector = < StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics >( nextValue: PollState, -): PollStateSelectorReturnValue => [nextValue.name]; +): PollStateSelectorReturnValue => ({ name: nextValue.name }); export type FullPollOptionsListingProps = { close?: () => void; @@ -24,7 +24,8 @@ export const PollOptionsFullList = < close, }: FullPollOptionsListingProps) => { const { t } = useTranslationContext(); - const [name] = usePollState(pollStateSelector); + const { poll } = usePollContext(); + const { name } = useStateStore(poll.state, pollStateSelector); return (
diff --git a/src/components/Poll/PollActions/PollResults/PollOptionWithLatestVotes.tsx b/src/components/Poll/PollActions/PollResults/PollOptionWithLatestVotes.tsx index 1ecd82ab4e..2eb867b8aa 100644 --- a/src/components/Poll/PollActions/PollResults/PollOptionWithLatestVotes.tsx +++ b/src/components/Poll/PollActions/PollResults/PollOptionWithLatestVotes.tsx @@ -1,20 +1,20 @@ import React from 'react'; import { PollOptionWithVotesHeader } from './PollOptionWithVotesHeader'; import { PollVoteListing } from '../../PollVote'; -import { usePollState } from '../../hooks'; -import { useChannelStateContext, useTranslationContext } from '../../../../context'; +import { useStateStore } from '../../../../store'; +import { useChannelStateContext, usePollContext, useTranslationContext } from '../../../../context'; import type { PollOption, PollState, PollVote } from 'stream-chat'; import type { DefaultStreamChatGenerics } from '../../../../types'; type PollStateSelectorReturnValue< StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics -> = [Record[]>]; +> = { latest_votes_by_option: Record[]> }; const pollStateSelector = < StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics >( nextValue: PollState, -): PollStateSelectorReturnValue => [nextValue.latest_votes_by_option]; +): PollStateSelectorReturnValue => ({ latest_votes_by_option: nextValue.latest_votes_by_option }); export type PollOptionWithVotesProps< StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics @@ -35,9 +35,9 @@ export const PollOptionWithLatestVotes = < const { channelCapabilities = {} } = useChannelStateContext( 'PollOptionWithLatestVotes', ); - const [latest_votes_by_option] = usePollState( - pollStateSelector, - ); + const { poll } = usePollContext(); + const { latest_votes_by_option } = useStateStore(poll.state, pollStateSelector); + const votes = latest_votes_by_option && latest_votes_by_option[option.id]; return ( diff --git a/src/components/Poll/PollActions/PollResults/PollOptionWithVotesHeader.tsx b/src/components/Poll/PollActions/PollResults/PollOptionWithVotesHeader.tsx index 633e5a913e..55febf9588 100644 --- a/src/components/Poll/PollActions/PollResults/PollOptionWithVotesHeader.tsx +++ b/src/components/Poll/PollActions/PollResults/PollOptionWithVotesHeader.tsx @@ -1,15 +1,21 @@ import React from 'react'; -import { usePollState } from '../../hooks'; -import { useTranslationContext } from '../../../../context'; +import { useStateStore } from '../../../../store'; +import { usePollContext, useTranslationContext } from '../../../../context'; import type { PollOption, PollState } from 'stream-chat'; import type { DefaultStreamChatGenerics } from '../../../../types'; -type PollStateSelectorReturnValue = [string[], Record]; +type PollStateSelectorReturnValue = { + maxVotedOptionIds: string[]; + vote_counts_by_option: Record; +}; const pollStateSelector = < StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics >( nextValue: PollState, -): PollStateSelectorReturnValue => [nextValue.maxVotedOptionIds, nextValue.vote_counts_by_option]; +): PollStateSelectorReturnValue => ({ + maxVotedOptionIds: nextValue.maxVotedOptionIds, + vote_counts_by_option: nextValue.vote_counts_by_option, +}); export type PollResultOptionVoteCounterProps = { optionId: string; @@ -21,10 +27,8 @@ export const PollResultOptionVoteCounter = < optionId, }: PollResultOptionVoteCounterProps) => { const { t } = useTranslationContext(); - const [maxVotedOptionIds, vote_counts_by_option] = usePollState< - PollStateSelectorReturnValue, - StreamChatGenerics - >(pollStateSelector); + const { poll } = usePollContext(); + const { maxVotedOptionIds, vote_counts_by_option } = useStateStore(poll.state, pollStateSelector); return (
diff --git a/src/components/Poll/PollActions/PollResults/PollResults.tsx b/src/components/Poll/PollActions/PollResults/PollResults.tsx index 0165dce03c..c76b998711 100644 --- a/src/components/Poll/PollActions/PollResults/PollResults.tsx +++ b/src/components/Poll/PollActions/PollResults/PollResults.tsx @@ -1,25 +1,29 @@ import clsx from 'clsx'; import React, { useCallback, useState } from 'react'; -import { ModalHeader } from '../../../Modal/ModalHeader'; import { PollOptionVotesList } from './PollOptionVotesList'; import { PollOptionWithLatestVotes } from './PollOptionWithLatestVotes'; -import { usePollState } from '../../hooks'; -import { useTranslationContext } from '../../../../context'; +import { ModalHeader } from '../../../Modal/ModalHeader'; +import { useStateStore } from '../../../../store'; +import { usePollContext, useTranslationContext } from '../../../../context'; import type { PollOption, PollState } from 'stream-chat'; import type { DefaultStreamChatGenerics } from '../../../../types'; type PollStateSelectorReturnValue< StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics -> = [string, PollOption[], Record]; +> = { + name: string; + options: PollOption[]; + vote_counts_by_option: Record; +}; const pollStateSelector = < StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics >( nextValue: PollState, -): PollStateSelectorReturnValue => [ - nextValue.name, - nextValue.options, - nextValue.vote_counts_by_option, -]; +): PollStateSelectorReturnValue => ({ + name: nextValue.name, + options: nextValue.options, + vote_counts_by_option: nextValue.vote_counts_by_option, +}); export type PollResultsProps = { close?: () => void; @@ -31,10 +35,8 @@ export const PollResults = < close, }: PollResultsProps) => { const { t } = useTranslationContext(); - const [name, options, voteCountsByOption] = usePollState< - PollStateSelectorReturnValue, - StreamChatGenerics - >(pollStateSelector); + const { poll } = usePollContext(); + const { name, options, vote_counts_by_option } = useStateStore(poll.state, pollStateSelector); const [optionToView, setOptionToView] = useState>(); const goBack = useCallback(() => setOptionToView(undefined), []); @@ -63,7 +65,7 @@ export const PollResults = <
{options .sort((next, current) => - (voteCountsByOption[current.id] ?? 0) >= (voteCountsByOption[next.id] ?? 0) + (vote_counts_by_option[current.id] ?? 0) >= (vote_counts_by_option[next.id] ?? 0) ? 1 : -1, ) diff --git a/src/components/Poll/PollActions/SuggestPollOptionForm.tsx b/src/components/Poll/PollActions/SuggestPollOptionForm.tsx index 7b713112fc..61eea1adda 100644 --- a/src/components/Poll/PollActions/SuggestPollOptionForm.tsx +++ b/src/components/Poll/PollActions/SuggestPollOptionForm.tsx @@ -1,18 +1,19 @@ import { FormDialog } from '../../Dialog'; import React from 'react'; -import { usePoll, usePollState } from '../hooks'; +import { usePoll } from '../hooks'; +import { useStateStore } from '../../../store'; import { useChatContext, useTranslationContext } from '../../../context'; import type { PollOption, PollState } from 'stream-chat'; import type { DefaultStreamChatGenerics } from '../../../types'; type PollStateSelectorReturnValue< StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics -> = [PollOption[]]; +> = { options: PollOption[] }; const pollStateSelector = < StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics >( nextValue: PollState, -): PollStateSelectorReturnValue => [nextValue.options]; +): PollStateSelectorReturnValue => ({ options: nextValue.options }); export type SuggestPollOptionFormProps = { close: () => void; @@ -28,10 +29,7 @@ export const SuggestPollOptionForm = < const { client } = useChatContext('SuggestPollOptionForm'); const { t } = useTranslationContext('SuggestPollOptionForm'); const poll = usePoll(); - const [options] = usePollState< - PollStateSelectorReturnValue, - StreamChatGenerics - >(pollStateSelector); + const { options } = useStateStore(poll.state, pollStateSelector); return ( diff --git a/src/components/Poll/PollHeader.tsx b/src/components/Poll/PollHeader.tsx index 3597054b15..673da17679 100644 --- a/src/components/Poll/PollHeader.tsx +++ b/src/components/Poll/PollHeader.tsx @@ -1,32 +1,40 @@ import React, { useMemo } from 'react'; -import { usePollState } from './hooks'; -import { useTranslationContext } from '../../context'; +import { usePollContext, useTranslationContext } from '../../context'; +import { useStateStore } from '../../store'; import type { PollOption, PollState } from 'stream-chat'; import type { DefaultStreamChatGenerics } from '../../types'; type PollStateSelectorReturnValue< StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics -> = [boolean, boolean | undefined, number, string, PollOption[]]; +> = { + enforce_unique_vote: boolean; + is_closed: boolean | undefined; + max_votes_allowed: number; + name: string; + options: PollOption[]; +}; const pollStateSelector = < StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics >( nextValue: PollState, -): PollStateSelectorReturnValue => [ - nextValue.enforce_unique_vote, - nextValue.is_closed, - nextValue.max_votes_allowed, - nextValue.name, - nextValue.options, -]; +): PollStateSelectorReturnValue => ({ + enforce_unique_vote: nextValue.enforce_unique_vote, + is_closed: nextValue.is_closed, + max_votes_allowed: nextValue.max_votes_allowed, + name: nextValue.name, + options: nextValue.options, +}); export const PollHeader = < StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics >() => { const { t } = useTranslationContext('PollHeader'); - const [enforce_unique_vote, is_closed, max_votes_allowed, name, options] = usePollState< - PollStateSelectorReturnValue, - StreamChatGenerics - >(pollStateSelector); + + const { poll } = usePollContext(); + const { enforce_unique_vote, is_closed, max_votes_allowed, name, options } = useStateStore( + poll.state, + pollStateSelector, + ); const selectionInstructions = useMemo(() => { if (is_closed) return t('Vote ended'); diff --git a/src/components/Poll/PollOptionList.tsx b/src/components/Poll/PollOptionList.tsx index eeac7e881a..7e682c2573 100644 --- a/src/components/Poll/PollOptionList.tsx +++ b/src/components/Poll/PollOptionList.tsx @@ -1,19 +1,20 @@ import clsx from 'clsx'; import React from 'react'; import { PollOptionSelector } from './PollOptionSelector'; -import { usePollState } from './hooks'; import type { PollOption, PollState } from 'stream-chat'; import type { DefaultStreamChatGenerics } from '../../types'; +import { usePollContext } from '../../context'; +import { useStateStore } from '../../store'; type PollStateSelectorReturnValue< StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics -> = [PollOption[]]; +> = { options: PollOption[] }; const pollStateSelector = < StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics >( nextValue: PollState, -): PollStateSelectorReturnValue => [nextValue.options]; +): PollStateSelectorReturnValue => ({ options: nextValue.options }); export type PollOptionListProps = { optionsDisplayCount?: number; @@ -24,9 +25,8 @@ export const PollOptionList = < >({ optionsDisplayCount, }: PollOptionListProps) => { - const [options] = usePollState( - pollStateSelector, - ); + const { poll } = usePollContext(); + const { options } = useStateStore(poll.state, pollStateSelector); return (
{options.slice(0, optionsDisplayCount ?? options.length).map((option) => ( - + ))}
); diff --git a/src/components/Poll/PollOptionSelector.tsx b/src/components/Poll/PollOptionSelector.tsx index 83fe5d16ae..4b253ab9bb 100644 --- a/src/components/Poll/PollOptionSelector.tsx +++ b/src/components/Poll/PollOptionSelector.tsx @@ -1,10 +1,15 @@ import clsx from 'clsx'; import debounce from 'lodash.debounce'; import React, { useMemo } from 'react'; -import { isVoteAnswer } from 'stream-chat'; -import { usePoll, usePollState } from './hooks'; +import { isVoteAnswer, VotingVisibility } from 'stream-chat'; import { Avatar } from '../Avatar'; -import { useChannelStateContext, useMessageContext, useTranslationContext } from '../../context'; +import { + useChannelStateContext, + useMessageContext, + usePollContext, + useTranslationContext, +} from '../../context'; +import { useStateStore } from '../../store'; import type { PollOption, PollState, PollVote } from 'stream-chat'; import type { DefaultStreamChatGenerics } from '../../types'; @@ -34,37 +39,39 @@ export const Checkmark = ({ checked }: CheckmarkProps) => ( type PollStateSelectorReturnValue< StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics -> = [ - boolean | undefined, - Record[]>, - string[], - Record>, - Record, -]; +> = { + is_closed: boolean | undefined; + latest_votes_by_option: Record[]>; + maxVotedOptionIds: string[]; + ownVotesByOptionId: Record>; + vote_counts_by_option: Record; + voting_visibility: VotingVisibility | undefined; +}; const pollStateSelector = < StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics >( nextValue: PollState, -): PollStateSelectorReturnValue => [ - nextValue.is_closed, - nextValue.latest_votes_by_option, - nextValue.maxVotedOptionIds, - nextValue.ownVotesByOptionId, - nextValue.vote_counts_by_option, -]; +): PollStateSelectorReturnValue => ({ + is_closed: nextValue.is_closed, + latest_votes_by_option: nextValue.latest_votes_by_option, + maxVotedOptionIds: nextValue.maxVotedOptionIds, + ownVotesByOptionId: nextValue.ownVotesByOptionId, + vote_counts_by_option: nextValue.vote_counts_by_option, + voting_visibility: nextValue.voting_visibility, +}); export type PollOptionSelectorProps< StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics > = { option: PollOption; - avatarCount?: number; + displayAvatarCount?: number; voteCountVerbose?: boolean; }; export const PollOptionSelector = < StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics >({ - avatarCount, + displayAvatarCount, option, voteCountVerbose, }: PollOptionSelectorProps) => { @@ -73,14 +80,16 @@ export const PollOptionSelector = < 'PollOptionsShortlist', ); const { message } = useMessageContext(); - const [ + + const { poll } = usePollContext(); + const { is_closed, latest_votes_by_option, maxVotedOptionIds, ownVotesByOptionId, vote_counts_by_option, - ] = usePollState(pollStateSelector); - const poll = usePoll(); + voting_visibility, + } = useStateStore(poll.state, pollStateSelector); const canCastVote = channelCapabilities['cast-poll-vote'] && !is_closed; const winningOptionCount = maxVotedOptionIds[0] ? vote_counts_by_option[maxVotedOptionIds[0]] : 0; @@ -104,15 +113,15 @@ export const PollOptionSelector = < key={`base-poll-option-${option.id}`} onClick={toggleVote} > - {!is_closed && } + {canCastVote && }

{option.text}

- {avatarCount && ( + {displayAvatarCount && voting_visibility === 'public' && (
{latest_votes_by_option?.[option.id] && (latest_votes_by_option[option.id] as PollVote[]) .filter((vote) => !!vote.user && !isVoteAnswer(vote)) - .slice(0, avatarCount) + .slice(0, displayAvatarCount) .map(({ user }) => ( ( - selector: (nextValue: PollState) => T, -) => { - const { poll } = usePollContext(); - return useStateStore(poll.state, selector); -}; From 50b9719b18c59c69682679fe64bc3e4a23609d6f Mon Sep 17 00:00:00 2001 From: martincupela Date: Thu, 31 Oct 2024 13:15:49 +0100 Subject: [PATCH 48/71] fix: on poll.vote_changed remove votes by their id --- src/components/Poll/hooks/useManagePollVotesRealtime.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/components/Poll/hooks/useManagePollVotesRealtime.ts b/src/components/Poll/hooks/useManagePollVotesRealtime.ts index 68ca7f6e08..8682a11745 100644 --- a/src/components/Poll/hooks/useManagePollVotesRealtime.ts +++ b/src/components/Poll/hooks/useManagePollVotesRealtime.ts @@ -46,9 +46,7 @@ export function useManagePollVotesRealtime< } if (event.type === 'poll.vote_changed') { setVotesInRealtime((prev) => - event.poll_vote - ? prev.filter((vote) => vote.user_id !== (event.poll_vote as T).user_id) - : prev, + event.poll_vote ? prev.filter((vote) => vote.id !== (event.poll_vote as T).id) : prev, ); } if (['poll.vote_casted', 'poll.vote_changed'].includes(event.type)) { From ac3ffe279cb17e50fc5dfa11fa58a694930a57b8 Mon Sep 17 00:00:00 2001 From: martincupela Date: Thu, 31 Oct 2024 13:16:28 +0100 Subject: [PATCH 49/71] test: finish Poll related tests --- src/components/Dialog/FormDialog.tsx | 2 +- src/components/Form/FieldError.tsx | 13 +- .../PollCreationDialog/OptionFieldSet.tsx | 6 +- .../PollCreationDialog/PollCreationDialog.tsx | 7 +- .../Poll/__tests__/AddCommentForm.test.js | 82 ++++ .../Poll/__tests__/PollActions.test.js | 260 ++++++++++++ .../Poll/__tests__/PollCreationDialog.test.js | 398 ++++++++++++++++++ .../Poll/__tests__/PollHeader.test.js | 65 +++ .../Poll/__tests__/PollOptionList.test.js | 285 +++++++++++++ .../__tests__/SuggestPollOptionForm.test.js | 67 +++ src/mock-builders/generator/index.js | 1 + src/mock-builders/generator/poll.js | 306 ++++++++------ src/mock-builders/index.js | 1 - 13 files changed, 1348 insertions(+), 145 deletions(-) create mode 100644 src/components/Poll/__tests__/AddCommentForm.test.js create mode 100644 src/components/Poll/__tests__/PollActions.test.js create mode 100644 src/components/Poll/__tests__/PollCreationDialog.test.js create mode 100644 src/components/Poll/__tests__/PollHeader.test.js create mode 100644 src/components/Poll/__tests__/PollOptionList.test.js create mode 100644 src/components/Poll/__tests__/SuggestPollOptionForm.test.js diff --git a/src/components/Dialog/FormDialog.tsx b/src/components/Dialog/FormDialog.tsx index ba52f690a8..50a9411475 100644 --- a/src/components/Dialog/FormDialog.tsx +++ b/src/components/Dialog/FormDialog.tsx @@ -143,7 +143,7 @@ export const FormDialog = < onClick={handleSubmit} type='submit' > - {t('Send')} + {title ?? t('Submit')}
diff --git a/src/components/Form/FieldError.tsx b/src/components/Form/FieldError.tsx index 31e00f6053..1474524268 100644 --- a/src/components/Form/FieldError.tsx +++ b/src/components/Form/FieldError.tsx @@ -1,12 +1,11 @@ import clsx from 'clsx'; -import React from 'react'; -import ReactMarkdown from 'react-markdown'; -import className = ReactMarkdown.propTypes.className; +import React, { ComponentProps } from 'react'; -type FieldErrorProps = { - className?: string; +type FieldErrorProps = ComponentProps<'div'> & { text?: string; }; -export const FieldError = ({ text }: FieldErrorProps) => ( -
{text}
+export const FieldError = ({ className, text, ...props }: FieldErrorProps) => ( +
+ {text} +
); diff --git a/src/components/Poll/PollCreationDialog/OptionFieldSet.tsx b/src/components/Poll/PollCreationDialog/OptionFieldSet.tsx index 173caa1a27..0246c564c0 100644 --- a/src/components/Poll/PollCreationDialog/OptionFieldSet.tsx +++ b/src/components/Poll/PollCreationDialog/OptionFieldSet.tsx @@ -54,7 +54,11 @@ export const OptionFieldSet = ({ errors, options, setErrors, setState }: OptionF key={`new-poll-option-${i}`} >
- + { diff --git a/src/components/Poll/PollCreationDialog/PollCreationDialog.tsx b/src/components/Poll/PollCreationDialog/PollCreationDialog.tsx index fb1e592bc6..fe2afc0c30 100644 --- a/src/components/Poll/PollCreationDialog/PollCreationDialog.tsx +++ b/src/components/Poll/PollCreationDialog/PollCreationDialog.tsx @@ -59,7 +59,11 @@ export const PollCreationDialog = ({ close }: PollCreationDialogProps) => { {t('Question')}
- + { @@ -112,6 +116,7 @@ export const PollCreationDialog = ({ close }: PollCreationDialogProps) => {
v; + +const renderComponent = ({ poll, props }) => + render( + + + + + , + ); + +describe('AddCommentForm', () => { + afterEach(jest.resetAllMocks); + + it('renders update form for existing comment and submits it', async () => { + const poll = new Poll({ client: {}, poll: generatePoll() }); + const addAnswerSpy = jest.spyOn(poll, 'addAnswer').mockImplementation(); + const { container } = renderComponent({ poll }); + const input = container.querySelector('input'); + expect(input).toHaveValue(poll.data.ownAnswer.text); + const submitButton = container.querySelector('button[type="submit"]'); + expect(submitButton).toBeDisabled(); + expect(submitButton).toHaveTextContent(UPDATE_COMMENT_TEXT); + + act(() => { + fireEvent.change(input, { target: { value: newlyTypedValue } }); + }); + + await waitFor(() => { + expect(submitButton).toBeEnabled(); + expect(submitButton).toHaveTextContent(UPDATE_COMMENT_TEXT); + }); + + act(() => { + fireEvent.click(submitButton); + }); + + await waitFor(() => { + expect(addAnswerSpy).toHaveBeenCalledWith(newlyTypedValue, messageId); + }); + }); + + it('renders form to add a new answer and submits it', async () => { + const poll = new Poll({ client: {}, poll: generatePoll({ own_votes: [] }) }); + const addAnswerSpy = jest.spyOn(poll, 'addAnswer').mockImplementation(); + const { container } = renderComponent({ poll }); + const input = container.querySelector('input'); + expect(input).toHaveValue(''); + const submitButton = container.querySelector('button[type="submit"]'); + expect(submitButton).toBeDisabled(); + expect(submitButton).toHaveTextContent(ADD_COMMENT_TEXT); + act(() => { + fireEvent.change(input, { target: { value: newlyTypedValue } }); + }); + await waitFor(() => { + expect(submitButton).toBeEnabled(); + expect(submitButton).toHaveTextContent(ADD_COMMENT_TEXT); + }); + act(() => { + fireEvent.click(submitButton); + }); + + await waitFor(() => { + expect(addAnswerSpy).toHaveBeenCalledWith(newlyTypedValue, messageId); + }); + }); +}); diff --git a/src/components/Poll/__tests__/PollActions.test.js b/src/components/Poll/__tests__/PollActions.test.js new file mode 100644 index 0000000000..c30d7f8b41 --- /dev/null +++ b/src/components/Poll/__tests__/PollActions.test.js @@ -0,0 +1,260 @@ +import React from 'react'; +import { act, fireEvent, render, screen, waitFor } from '@testing-library/react'; +import '@testing-library/jest-dom'; +import { PollActions } from '../PollActions'; +import { + ChannelStateProvider, + ChatProvider, + MessageProvider, + PollProvider, + TranslationProvider, +} from '../../../context'; +import { + generateMessage, + generatePoll, + generateUser, + getTestClientWithUser, +} from '../../../mock-builders'; +import { Poll } from '../../../../../stream-chat-js'; +import { MAX_OPTIONS_DISPLAYED } from '../constants'; + +const SEE_ALL_OPTIONS_ACTION_TEXT = 'See all options ({{count}})'; +const SUGGEST_OPTION_ACTION_TEXT = 'Suggest an option'; +const UPDATE_COMMENT_ACTION_TEXT = 'Update your comment'; +const VIEW_COMMENTS_ACTION_TEXT = 'View {{count}} comments'; +const VIEW_RESULTS_ACTION_TEXT = 'View results'; +const END_VOTE_ACTION_TEXT = 'End vote'; + +const t = (v) => v; + +const defaultChannelStateContext = { + channelCapabilities: { 'query-poll-votes': true }, +}; + +const defaultMessageContext = { + message: generateMessage(), +}; + +const renderComponent = async ({ + channelStateContext, + client: customClient, + messageContext, + poll, + props, +}) => { + const client = customClient ?? (await getTestClientWithUser()); + return render( + + + + + + + + + + + , + ); +}; +describe('PollActions', () => { + beforeEach(() => { + jest.clearAllMocks(); + }); + it('shows "See all options ({{count}})" action if option count is above MAX_OPTIONS_DISPLAYED', async () => { + const pollData = generatePoll({ + options: Array.from({ length: MAX_OPTIONS_DISPLAYED + 1 }, (_, i) => ({ + id: i.toString(), + text: i.toString(), + })), + }); + const poll = new Poll({ client: {}, poll: pollData }); + await renderComponent({ poll }); + expect(screen.getByText(SEE_ALL_OPTIONS_ACTION_TEXT)).toBeInTheDocument(); + }); + + it('hides "See all options ({{count}})" action if option count is below MAX_OPTIONS_DISPLAYED', async () => { + const pollData = generatePoll({ + options: Array.from({ length: MAX_OPTIONS_DISPLAYED }, (_, i) => ({ + id: i.toString(), + text: i.toString(), + })), + }); + const poll = new Poll({ client: {}, poll: pollData }); + await renderComponent({ poll }); + expect(screen.queryByText(SEE_ALL_OPTIONS_ACTION_TEXT)).not.toBeInTheDocument(); + }); + + it('shows "Suggest an option" action if poll is not closed and suggestions are allowed', async () => { + const pollData = generatePoll({ allow_user_suggested_options: true, is_closed: false }); + const poll = new Poll({ client: {}, poll: pollData }); + await renderComponent({ poll }); + expect(screen.getByText(SUGGEST_OPTION_ACTION_TEXT)).toBeInTheDocument(); + }); + + it('hides "Suggest an option" action if poll is closed', async () => { + const pollData = generatePoll({ allow_user_suggested_options: true, is_closed: true }); + const poll = new Poll({ client: {}, poll: pollData }); + await renderComponent({ poll }); + expect(screen.queryByText(SUGGEST_OPTION_ACTION_TEXT)).not.toBeInTheDocument(); + }); + + it('hides "Suggest an option" action if suggestions are not allowed', async () => { + const pollData = generatePoll({ allow_user_suggested_options: false, is_closed: false }); + const poll = new Poll({ client: {}, poll: pollData }); + await renderComponent({ poll }); + expect(screen.queryByText(SUGGEST_OPTION_ACTION_TEXT)).not.toBeInTheDocument(); + }); + + it('shows "Update your comment" action', async () => { + const pollData = generatePoll({ allow_answers: true, is_closed: false }); + const poll = new Poll({ client: {}, poll: pollData }); + await renderComponent({ poll }); + expect(screen.getByText(UPDATE_COMMENT_ACTION_TEXT)).toBeInTheDocument(); + }); + + it('hides "Update your comment" action if poll is closed', async () => { + const pollData = generatePoll({ allow_answers: true, is_closed: true }); + const poll = new Poll({ client: {}, poll: pollData }); + await renderComponent({ poll }); + expect(screen.queryByText(UPDATE_COMMENT_ACTION_TEXT)).not.toBeInTheDocument(); + }); + + it('hides "Update your comment" action if answers are not allowed', async () => { + const pollData = generatePoll({ allow_answers: false, is_closed: false }); + const poll = new Poll({ client: {}, poll: pollData }); + await renderComponent({ poll }); + expect(screen.queryByText(UPDATE_COMMENT_ACTION_TEXT)).not.toBeInTheDocument(); + }); + + it('shows "View {{count}} comments" action if answers exist and query-poll-votes permission is granted', async () => { + const pollData = generatePoll({ answers_count: 1 }); + const poll = new Poll({ client: {}, poll: pollData }); + await renderComponent({ poll }); + expect(screen.getByText(VIEW_COMMENTS_ACTION_TEXT)).toBeInTheDocument(); + }); + + it('hides "View {{count}} comments" action if there are no answers', async () => { + const pollData = generatePoll({ answers_count: 0 }); + const poll = new Poll({ client: {}, poll: pollData }); + await renderComponent({ poll }); + expect(screen.queryByText(VIEW_COMMENTS_ACTION_TEXT)).not.toBeInTheDocument(); + }); + + it('hides "View {{count}} comments" action if the query-poll-votes permission is not granted', async () => { + const pollData = generatePoll({ answers_count: 1 }); + const poll = new Poll({ client: {}, poll: pollData }); + await renderComponent({ + channelStateContext: { channelCapabilities: { 'query-poll-votes': false } }, + poll, + }); + expect(screen.queryByText(VIEW_COMMENTS_ACTION_TEXT)).not.toBeInTheDocument(); + }); + + it('shows "View results" action', async () => { + const pollData = generatePoll(); + const poll = new Poll({ client: {}, poll: pollData }); + await renderComponent({ poll }); + expect(screen.getByText(VIEW_RESULTS_ACTION_TEXT)).toBeInTheDocument(); + }); + + it('shows "End vote" action if not closed already and the poll is own', async () => { + const user = generateUser(); + const client = await getTestClientWithUser(user); + const pollData = generatePoll({ created_by_id: user.id, is_closed: false }); + const poll = new Poll({ client, poll: pollData }); + await renderComponent({ client, poll }); + expect(screen.getByText(END_VOTE_ACTION_TEXT)).toBeInTheDocument(); + }); + + it('hides "End vote" action if poll is closed', async () => { + const user = generateUser(); + const client = await getTestClientWithUser(user); + const pollData = generatePoll({ created_by_id: user.id, is_closed: true }); + const poll = new Poll({ client, poll: pollData }); + await renderComponent({ client, poll }); + expect(screen.queryByText(END_VOTE_ACTION_TEXT)).not.toBeInTheDocument(); + }); + + it('hides "End vote" action if the poll is not own', async () => { + const user = generateUser(); + const client = await getTestClientWithUser(user); + const pollData = generatePoll({ is_closed: false }); + const poll = new Poll({ client, poll: pollData }); + await renderComponent({ client, poll }); + expect(screen.queryByText(END_VOTE_ACTION_TEXT)).not.toBeInTheDocument(); + }); + + it('allows custom actions contents overrides', async () => { + const user = generateUser(); + const client = await getTestClientWithUser(user); + const pollData = generatePoll({ + allow_answers: true, + allow_user_suggested_options: true, + answers_count: 1, + created_by_id: user.id, + is_closed: false, + options: Array.from({ length: MAX_OPTIONS_DISPLAYED + 1 }, (_, i) => ({ + id: i.toString(), + text: i.toString(), + })), + }); + const poll = new Poll({ client, poll: pollData }); + + const PollOptionsFullList = () =>
; + const SuggestPollOptionForm = () =>
; + const AddCommentForm = () =>
; + const PollAnswerList = () =>
; + const PollResults = () =>
; + const EndPollDialog = () =>
; + + await renderComponent({ + client, + poll, + props: { + AddCommentForm, + EndPollDialog, + PollAnswerList, + PollOptionsFullList, + PollResults, + SuggestPollOptionForm, + }, + }); + act(() => { + fireEvent.click(screen.getByText(SEE_ALL_OPTIONS_ACTION_TEXT)); + }); + await waitFor(() => { + expect(screen.getByTestId('poll-options-full-list-custom')).toBeInTheDocument(); + }); + act(() => { + fireEvent.click(screen.getByText(SUGGEST_OPTION_ACTION_TEXT)); + }); + await waitFor(() => { + expect(screen.getByTestId('suggest-poll-option-form-custom')).toBeInTheDocument(); + }); + act(() => { + fireEvent.click(screen.getByText(UPDATE_COMMENT_ACTION_TEXT)); + }); + await waitFor(() => { + expect(screen.getByTestId('add-comment-form-custom')).toBeInTheDocument(); + }); + act(() => { + fireEvent.click(screen.getByText(VIEW_COMMENTS_ACTION_TEXT)); + }); + await waitFor(() => { + expect(screen.getByTestId('poll-answer-list-custom')).toBeInTheDocument(); + }); + act(() => { + fireEvent.click(screen.getByText(VIEW_RESULTS_ACTION_TEXT)); + }); + await waitFor(() => { + expect(screen.getByTestId('poll-results-custom')).toBeInTheDocument(); + }); + act(() => { + fireEvent.click(screen.getByText(END_VOTE_ACTION_TEXT)); + }); + await waitFor(() => { + expect(screen.getByTestId('end-poll-dialog-custom')).toBeInTheDocument(); + }); + }); +}); diff --git a/src/components/Poll/__tests__/PollCreationDialog.test.js b/src/components/Poll/__tests__/PollCreationDialog.test.js new file mode 100644 index 0000000000..ac1c03dcdd --- /dev/null +++ b/src/components/Poll/__tests__/PollCreationDialog.test.js @@ -0,0 +1,398 @@ +import React from 'react'; +import { act, fireEvent, render, screen, waitFor } from '@testing-library/react'; +import '@testing-library/jest-dom'; +import { PollCreationDialog } from '../PollCreationDialog'; +import { ChatProvider, MessageInputContextProvider, TranslationProvider } from '../../../context'; +import { generateUser, getTestClientWithUser } from '../../../mock-builders'; + +const NAME_FIELD_PLACEHOLDER = 'Ask a question'; +const OPTION_FIELD_PLACEHOLDER = 'Add an option'; +const MAX_VOTES_FIELD_PLACEHOLDER = 'Maximum number of votes (from 2 to 10)'; +const MULTIPLE_ANSWERS_FIELD_LABEL = 'Multiple answers'; +const VOTING_VISIBILITY_FIELD_LABEL = 'Anonymous poll'; +const OPTION_SUGGESTION_FIELD_LABEL = 'Allow option suggestion'; +const ALLOW_COMMENTS_FIELD_LABEL = 'Allow comments'; +const CANCEL_BUTTON_TEXT = 'Cancel'; +const CREATE_BUTTON_TEXT = 'Create'; +const NAME_INPUT_FIELD_ERROR_TEST_ID = 'poll-name-input-field-error'; +const OPTION_INPUT_FIELD_ERROR_TEST_ID = 'poll-option-input-field-error'; +const MAX_VOTE_COUT_INPUT_FIELD_ERROR_TEST_ID = 'poll-max-votes-allowed-input-field-error'; +const REQUIRED_FIELD_ERROR_TEXT = 'The field is required'; +const DUPLICATE_OPTION_FIELD_ERROR_TEXT = 'Option already exists'; +const MAX_VOTE_COUNT_FIELD_ERROR_TEXT = 'Type a number from 2 to 10'; + +const getNameInput = () => screen.getByPlaceholderText(NAME_FIELD_PLACEHOLDER); +const getOptionInput = () => screen.getByPlaceholderText(OPTION_FIELD_PLACEHOLDER); + +const close = jest.fn(); +const handleSubmit = jest.fn(); +const t = (v) => v; + +const user = generateUser(); + +const renderComponent = async ({ client: customClient } = {}) => { + const client = customClient ?? (await getTestClientWithUser(user)); + + return render( + + + + + + + , + ); +}; + +describe('PollCreationDialog', () => { + beforeEach(() => { + jest.clearAllMocks(); + }); + + it('initiates with default state', async () => { + await renderComponent(); + expect(getNameInput()).toHaveValue(''); + const optionFieldCount = screen.getAllByPlaceholderText(OPTION_FIELD_PLACEHOLDER).length; + expect(optionFieldCount).toBe(1); + expect(getOptionInput()).toHaveValue(''); + expect(screen.getByLabelText(MULTIPLE_ANSWERS_FIELD_LABEL)).not.toBeChecked(); + expect(screen.queryByPlaceholderText(MAX_VOTES_FIELD_PLACEHOLDER)).not.toBeInTheDocument(); + expect(screen.getByLabelText(VOTING_VISIBILITY_FIELD_LABEL)).not.toBeChecked(); + expect(screen.getByLabelText(OPTION_SUGGESTION_FIELD_LABEL)).not.toBeChecked(); + expect(screen.getByLabelText(ALLOW_COMMENTS_FIELD_LABEL)).not.toBeChecked(); + expect(screen.getByText(CANCEL_BUTTON_TEXT)).toBeEnabled(); + expect(screen.getByText(CREATE_BUTTON_TEXT)).toBeDisabled(); + }); + + it('updates name field', async () => { + const text = 'Abc'; + await renderComponent(); + const nameInput = getNameInput(); + act(() => { + fireEvent.change(nameInput, { target: { value: text } }); + }); + expect(nameInput).toHaveValue(text); + expect(screen.getByText(CANCEL_BUTTON_TEXT)).toBeEnabled(); + expect(screen.getByText(CREATE_BUTTON_TEXT)).toBeDisabled(); + }); + + it('registers name field error and prevents submission', async () => { + await renderComponent(); + const nameInput = getNameInput(); + expect(screen.getByTestId(NAME_INPUT_FIELD_ERROR_TEST_ID)).not.toHaveTextContent(); + act(() => { + fireEvent.focus(nameInput); + }); + act(() => { + fireEvent.blur(nameInput); + }); + expect(screen.getByTestId(NAME_INPUT_FIELD_ERROR_TEST_ID)).toHaveTextContent( + REQUIRED_FIELD_ERROR_TEXT, + ); + expect(nameInput).toHaveValue(''); + expect(screen.getByText(CANCEL_BUTTON_TEXT)).toBeEnabled(); + expect(screen.getByText(CREATE_BUTTON_TEXT)).toBeDisabled(); + }); + + it('removes name field error when the field is filled', async () => { + const text = 'Abc'; + await renderComponent(); + const nameInput = getNameInput(); + expect(screen.getByTestId(NAME_INPUT_FIELD_ERROR_TEST_ID)).not.toHaveTextContent(); + act(() => { + fireEvent.focus(nameInput); + }); + act(() => { + fireEvent.blur(nameInput); + }); + act(() => { + fireEvent.change(nameInput, { target: { value: text } }); + }); + act(() => { + fireEvent.blur(nameInput); + }); + expect(screen.getByTestId(NAME_INPUT_FIELD_ERROR_TEST_ID)).not.toHaveTextContent(); + expect(nameInput).toHaveValue(text); + }); + + it('updates option input value', async () => { + const text = 'Abc'; + await renderComponent(); + const optionInput = getOptionInput(); + await act(async () => { + await fireEvent.change(optionInput, { target: { value: text } }); + }); + const optionFields = screen.getAllByPlaceholderText(OPTION_FIELD_PLACEHOLDER); + expect(optionFields).toHaveLength(2); + expect(optionFields[0]).toHaveValue(text); + expect(optionFields[1]).toHaveValue(''); + expect(screen.getByText(CANCEL_BUTTON_TEXT)).toBeEnabled(); + expect(screen.getByText(CREATE_BUTTON_TEXT)).toBeDisabled(); + }); + + it('allows submission with at least one option and name', async () => { + const text = 'Abc'; + await renderComponent(); + const nameInput = getNameInput(); + act(() => { + fireEvent.change(nameInput, { target: { value: text } }); + }); + const optionInput = getOptionInput(); + act(() => { + fireEvent.change(optionInput, { target: { value: text } }); + }); + expect(screen.getByText(CANCEL_BUTTON_TEXT)).toBeEnabled(); + expect(screen.getByText(CREATE_BUTTON_TEXT)).toBeEnabled(); + }); + + it('registers duplicate option error and prevents submission', async () => { + const text = 'Abc'; + await renderComponent(); + const optionInput = getOptionInput(); + await act(async () => { + await fireEvent.change(optionInput, { target: { value: text } }); + }); + let optionFields = screen.getAllByPlaceholderText(OPTION_FIELD_PLACEHOLDER); + await act(async () => { + await fireEvent.change(optionFields[1], { target: { value: text } }); + }); + optionFields = screen.getAllByPlaceholderText(OPTION_FIELD_PLACEHOLDER); + expect(optionFields).toHaveLength(3); + expect(optionFields[0]).toHaveValue(text); + expect(optionFields[1]).toHaveValue(text); + expect(optionFields[2]).toHaveValue(''); + + await act(async () => { + await fireEvent.blur(optionFields[1]); + }); + const optionErrors = screen.getAllByTestId(OPTION_INPUT_FIELD_ERROR_TEST_ID); + // eslint-disable-next-line jest-dom/prefer-in-document + expect(optionErrors).toHaveLength(3); + expect(optionErrors[1]).toHaveTextContent(DUPLICATE_OPTION_FIELD_ERROR_TEXT); + expect(screen.getByText(CANCEL_BUTTON_TEXT)).toBeEnabled(); + expect(screen.getByText(CREATE_BUTTON_TEXT)).toBeDisabled(); + }); + + it('removes the duplicate option error if duplicate text removed', async () => { + const text = 'Abc'; + await renderComponent(); + const optionInput = getOptionInput(); + await act(async () => { + await fireEvent.change(optionInput, { target: { value: text } }); + }); + let optionFields = screen.getAllByPlaceholderText(OPTION_FIELD_PLACEHOLDER); + await act(async () => { + await fireEvent.change(optionFields[1], { target: { value: text } }); + }); + await act(async () => { + await fireEvent.blur(optionFields[1]); + }); + await act(async () => { + await fireEvent.change(optionFields[0], { target: { value: 'a' } }); + }); + optionFields = screen.getAllByPlaceholderText(OPTION_FIELD_PLACEHOLDER); + expect(optionFields).toHaveLength(3); + expect(optionFields[0]).toHaveValue('a'); + expect(optionFields[1]).toHaveValue(text); + expect(optionFields[2]).toHaveValue(''); + const optionErrors = screen.getAllByTestId(OPTION_INPUT_FIELD_ERROR_TEST_ID); + // eslint-disable-next-line jest-dom/prefer-in-document + expect(optionErrors).toHaveLength(3); + expect(optionErrors[0]).not.toHaveTextContent(); + expect(optionErrors[1]).not.toHaveTextContent(); + expect(optionErrors[2]).not.toHaveTextContent(); + expect(screen.getByText(CANCEL_BUTTON_TEXT)).toBeEnabled(); + expect(screen.getByText(CREATE_BUTTON_TEXT)).toBeDisabled(); + }); + + it('removes the last option if any previous option has been cleared', async () => { + const text = 'Abc'; + await renderComponent(); + const nameInput = getNameInput(); + act(() => { + fireEvent.change(nameInput, { target: { value: text } }); + }); + const optionInput = getOptionInput(); + await act(async () => { + await fireEvent.change(optionInput, { target: { value: text } }); + }); + let optionFields = screen.getAllByPlaceholderText(OPTION_FIELD_PLACEHOLDER); + await act(async () => { + await fireEvent.change(optionFields[0], { target: { value: '' } }); + }); + optionFields = screen.getAllByPlaceholderText(OPTION_FIELD_PLACEHOLDER); + // eslint-disable-next-line jest-dom/prefer-in-document + expect(optionFields).toHaveLength(1); + expect(screen.getByText(CANCEL_BUTTON_TEXT)).toBeEnabled(); + expect(screen.getByText(CREATE_BUTTON_TEXT)).toBeDisabled(); + }); + + it('shows max vote count input on max vote count enabling', async () => { + await renderComponent(); + const enforceUniqueToggle = screen.getByLabelText(MULTIPLE_ANSWERS_FIELD_LABEL); + act(() => { + fireEvent.click(enforceUniqueToggle); + }); + expect(enforceUniqueToggle).toBeChecked(); + expect(screen.getByPlaceholderText(MAX_VOTES_FIELD_PLACEHOLDER).value).toBe(''); + expect(screen.getByText(CANCEL_BUTTON_TEXT)).toBeEnabled(); + expect(screen.getByText(CREATE_BUTTON_TEXT)).toBeDisabled(); + }); + + it('updates max vote count field', async () => { + const text = 'Abc'; + await renderComponent(); + const nameInput = getNameInput(); + act(() => { + fireEvent.change(nameInput, { target: { value: text } }); + }); + const optionInput = getOptionInput(); + act(() => { + fireEvent.change(optionInput, { target: { value: text } }); + }); + const enforceUniqueToggle = screen.getByLabelText(MULTIPLE_ANSWERS_FIELD_LABEL); + act(() => { + fireEvent.click(enforceUniqueToggle); + }); + const maxVoteCountInput = screen.getByPlaceholderText(MAX_VOTES_FIELD_PLACEHOLDER); + act(() => { + fireEvent.change(maxVoteCountInput, { target: { value: '2' } }); + }); + expect(screen.getByPlaceholderText(MAX_VOTES_FIELD_PLACEHOLDER).value).toBe('2'); + expect(screen.getByText(CANCEL_BUTTON_TEXT)).toBeEnabled(); + expect(screen.getByText(CREATE_BUTTON_TEXT)).toBeEnabled(); + }); + + it('registers max vote count field error and prevents submission', async () => { + const text = 'Abc'; + await renderComponent(); + const nameInput = getNameInput(); + act(() => { + fireEvent.change(nameInput, { target: { value: text } }); + }); + const optionInput = getOptionInput(); + act(() => { + fireEvent.change(optionInput, { target: { value: text } }); + }); + const enforceUniqueToggle = screen.getByLabelText(MULTIPLE_ANSWERS_FIELD_LABEL); + act(() => { + fireEvent.click(enforceUniqueToggle); + }); + const maxVoteCountInput = screen.getByPlaceholderText(MAX_VOTES_FIELD_PLACEHOLDER); + act(() => { + fireEvent.change(maxVoteCountInput, { target: { value: '1' } }); + }); + + const maxVoteCountErrors = screen.getAllByTestId(MAX_VOTE_COUT_INPUT_FIELD_ERROR_TEST_ID); + // eslint-disable-next-line jest-dom/prefer-in-document + expect(maxVoteCountErrors).toHaveLength(1); + expect(maxVoteCountErrors[0]).toHaveTextContent(MAX_VOTE_COUNT_FIELD_ERROR_TEXT); + expect(screen.getByPlaceholderText(MAX_VOTES_FIELD_PLACEHOLDER).value).toBe('1'); + expect(screen.getByText(CANCEL_BUTTON_TEXT)).toBeEnabled(); + expect(screen.getByText(CREATE_BUTTON_TEXT)).toBeDisabled(); + }); + + it('toggles voting visibility', async () => { + await renderComponent(); + const votingVisibilityToggle = screen.getByLabelText(VOTING_VISIBILITY_FIELD_LABEL); + act(() => { + fireEvent.click(votingVisibilityToggle); + }); + expect(votingVisibilityToggle).toBeChecked(); + expect(screen.getByText(CANCEL_BUTTON_TEXT)).toBeEnabled(); + expect(screen.getByText(CREATE_BUTTON_TEXT)).toBeDisabled(); + }); + + it('toggles allowing user suggested options', async () => { + await renderComponent(); + const suggestOptionToggle = screen.getByLabelText(OPTION_SUGGESTION_FIELD_LABEL); + act(() => { + fireEvent.click(suggestOptionToggle); + }); + expect(suggestOptionToggle).toBeChecked(); + expect(screen.getByText(CANCEL_BUTTON_TEXT)).toBeEnabled(); + expect(screen.getByText(CREATE_BUTTON_TEXT)).toBeDisabled(); + }); + + it('toggles allowing user comments', async () => { + await renderComponent(); + const allowCommentsToggle = screen.getByLabelText(ALLOW_COMMENTS_FIELD_LABEL); + act(() => { + fireEvent.click(allowCommentsToggle); + }); + expect(allowCommentsToggle).toBeChecked(); + expect(screen.getByText(CANCEL_BUTTON_TEXT)).toBeEnabled(); + expect(screen.getByText(CREATE_BUTTON_TEXT)).toBeDisabled(); + }); + + it('submits the form', async () => { + const formState = { + allow_answers: true, + allow_user_suggested_options: true, + description: '', + enforce_unique_vote: false, + max_votes_allowed: '10', + name: 'AAAA', + options: [{ text: 'Option 1' }, { text: 'Option 2' }], + user_id: user.id, + voting_visibility: 'anonymous', + }; + const expectedPollPayload = { ...formState, max_votes_allowed: 10 }; + + const client = await getTestClientWithUser(user); + let pollId; + const createPollSpy = jest.spyOn(client, 'createPoll').mockImplementationOnce((poll) => { + pollId = poll.id; + return Promise.resolve({ poll }); + }); + + await renderComponent({ client }); + act(() => { + fireEvent.change(getNameInput(), { target: { value: formState.name } }); + }); + act(() => { + fireEvent.change(getOptionInput(), { target: { value: formState.options[0].text } }); + }); + const optionFields = screen.getAllByPlaceholderText(OPTION_FIELD_PLACEHOLDER); + act(() => { + fireEvent.change(optionFields[1], { target: { value: formState.options[1].text } }); + }); + act(() => { + fireEvent.click(screen.getByLabelText(MULTIPLE_ANSWERS_FIELD_LABEL)); + }); + act(() => { + fireEvent.change(screen.getByPlaceholderText(MAX_VOTES_FIELD_PLACEHOLDER), { + target: { value: formState.max_votes_allowed }, + }); + }); + act(() => { + fireEvent.click(screen.getByLabelText(VOTING_VISIBILITY_FIELD_LABEL)); + }); + act(() => { + fireEvent.click(screen.getByLabelText(OPTION_SUGGESTION_FIELD_LABEL)); + }); + act(() => { + fireEvent.click(screen.getByLabelText(ALLOW_COMMENTS_FIELD_LABEL)); + }); + expect(screen.getByText(CANCEL_BUTTON_TEXT)).toBeEnabled(); + const submitButton = screen.getByText(CREATE_BUTTON_TEXT); + expect(submitButton).toBeEnabled(); + act(() => { + fireEvent.click(submitButton); + }); + + await waitFor(() => { + expect(createPollSpy).toHaveBeenCalledWith(expect.objectContaining(expectedPollPayload)); + expect(close).toHaveBeenCalledTimes(1); + expect(handleSubmit).toHaveBeenCalledWith(expect.any(Object), { poll_id: pollId }); + }); + }); + + it('closes the form on cancel', async () => { + await renderComponent(); + act(() => { + fireEvent.click(screen.getByText(CANCEL_BUTTON_TEXT)); + }); + expect(close).toHaveBeenCalledTimes(1); + }); +}); diff --git a/src/components/Poll/__tests__/PollHeader.test.js b/src/components/Poll/__tests__/PollHeader.test.js new file mode 100644 index 0000000000..1376cfc050 --- /dev/null +++ b/src/components/Poll/__tests__/PollHeader.test.js @@ -0,0 +1,65 @@ +import React from 'react'; +import { render } from '@testing-library/react'; +import '@testing-library/jest-dom'; +import { PollHeader } from '../PollHeader'; +import { PollProvider, TranslationProvider } from '../../../context'; +import { Poll } from 'stream-chat'; +import { generatePoll } from '../../../mock-builders'; + +const TITLE_SELECTOR = '.str-chat__poll-title'; +const SUBTITLE_SELECTOR = '.str-chat__poll-subtitle'; + +const t = (v) => v; + +const renderComponent = ({ poll }) => + render( + + + + + , + ); + +describe('PollHeader', () => { + it('should not render if poll name is missing', () => { + const pollData = generatePoll({ name: '' }); + const { container } = renderComponent({ poll: new Poll({ client: {}, poll: pollData }) }); + expect(container).toBeEmptyDOMElement(); + }); + + it('should render vote ended header', () => { + const pollData = generatePoll({ is_closed: true }); + const { container } = renderComponent({ poll: new Poll({ client: {}, poll: pollData }) }); + const nameDiv = container.querySelector(TITLE_SELECTOR); + const subtitleDiv = container.querySelector(SUBTITLE_SELECTOR); + expect(nameDiv).toHaveTextContent(pollData.name); + expect(subtitleDiv).toHaveTextContent('Vote ended'); + }); + + it('should render select one header', () => { + const pollData = generatePoll({ enforce_unique_vote: true }); + const { container } = renderComponent({ poll: new Poll({ client: {}, poll: pollData }) }); + const nameDiv = container.querySelector(TITLE_SELECTOR); + const subtitleDiv = container.querySelector(SUBTITLE_SELECTOR); + expect(nameDiv).toHaveTextContent(pollData.name); + expect(subtitleDiv).toHaveTextContent('Select one'); + }); + + it('should render Select up to {{count}} header', () => { + const pollData = generatePoll({ max_votes_allowed: 2 }); + const { container } = renderComponent({ poll: new Poll({ client: {}, poll: pollData }) }); + const nameDiv = container.querySelector(TITLE_SELECTOR); + const subtitleDiv = container.querySelector(SUBTITLE_SELECTOR); + expect(nameDiv).toHaveTextContent(pollData.name); + expect(subtitleDiv).toHaveTextContent('Select up to {{count}}'); + }); + + it('should render Select one or more header', () => { + const pollData = generatePoll({ max_votes_allowed: undefined }); + const { container } = renderComponent({ poll: new Poll({ client: {}, poll: pollData }) }); + const nameDiv = container.querySelector(TITLE_SELECTOR); + const subtitleDiv = container.querySelector(SUBTITLE_SELECTOR); + expect(nameDiv).toHaveTextContent(pollData.name); + expect(subtitleDiv).toHaveTextContent('Select one or more'); + }); +}); diff --git a/src/components/Poll/__tests__/PollOptionList.test.js b/src/components/Poll/__tests__/PollOptionList.test.js new file mode 100644 index 0000000000..a4381d217f --- /dev/null +++ b/src/components/Poll/__tests__/PollOptionList.test.js @@ -0,0 +1,285 @@ +import React from 'react'; +import { Poll } from 'stream-chat'; +import { act, fireEvent, render, waitFor } from '@testing-library/react'; +import '@testing-library/jest-dom'; +import { PollOptionList } from '../PollOptionList'; +import { + ChannelStateProvider, + MessageProvider, + PollProvider, + TranslationProvider, +} from '../../../context'; +import { + generateMessage, + generatePoll, + generatePollVoteCastedEvent, + generatePollVoteRemovedEvent, + generateUser, + getTestClientWithUser, +} from '../../../mock-builders'; + +const OPTION_SELECTOR = '.str-chat__poll-option'; +const VOTABLE_OPTION_SELECTOR = '.str-chat__poll-option--votable'; +const CHECKMARK_SELECTOR = '.str-chat__checkmark'; +const CHECKMARK_CHECKED_SELECTOR = '.str-chat__checkmark--checked'; +const VOTE_COUNT_SELECTOR = '.str-chat__poll-option-vote-count'; + +const pollWithNoVotes = generatePoll({ + answers_count: 1, + latest_answers: [], + latest_votes_by_option: {}, + own_votes: [], + vote_count: 0, + vote_counts_by_option: {}, +}); + +const t = (v) => v; + +const defaultChannelStateContext = { + channelCapabilities: { 'cast-poll-vote': true }, +}; + +const defaultMessageContext = { + message: generateMessage(), +}; + +const renderComponent = ({ channelStateContext, messageContext, poll }) => + render( + + + + + + + + + , + ); + +describe('PollOptionList', () => { + beforeEach(() => { + jest.clearAllMocks(); + }); + + it('renders empty container if no options', () => { + const pollData = generatePoll({ options: [] }); + const { container } = renderComponent({ poll: new Poll({ client: {}, poll: pollData }) }); + expect(container.firstChild).toBeEmptyDOMElement(); + }); + + it('renders votable poll option selectors', () => { + const pollData = generatePoll(); + const { container } = renderComponent({ poll: new Poll({ client: {}, poll: pollData }) }); + const votableOptions = container.querySelectorAll(VOTABLE_OPTION_SELECTOR); + expect(votableOptions).toHaveLength(pollData.options.length); + votableOptions.forEach((o) => { + expect(o.querySelector(CHECKMARK_SELECTOR)).toBeDefined(); + }); + }); + + it('renders non-votable poll option selectors if poll is closed and does nothing on option click', () => { + const pollData = generatePoll({ is_closed: true }); + const poll = new Poll({ client: {}, poll: pollData }); + const castVoteSpy = jest.spyOn(poll, 'castVote').mockResolvedValue({}); + const removeVoteSpy = jest.spyOn(poll, 'removeVote').mockResolvedValue({}); + const { container } = renderComponent({ poll }); + const votableOptions = container.querySelectorAll(VOTABLE_OPTION_SELECTOR); + const options = container.querySelectorAll(OPTION_SELECTOR); + expect(votableOptions).toHaveLength(0); + expect(options).toHaveLength(pollData.options.length); + options.forEach((o) => { + expect(o.querySelector(CHECKMARK_SELECTOR)).toBeNull(); + }); + + act(() => { + fireEvent.click(options[0]); + }); + + expect(castVoteSpy).not.toHaveBeenCalled(); + expect(removeVoteSpy).not.toHaveBeenCalled(); + }); + + it('renders non-votable poll option selectors if missing voting permission and does nothing on option click', () => { + const pollData = generatePoll(); + const poll = new Poll({ client: {}, poll: pollData }); + const castVoteSpy = jest.spyOn(poll, 'castVote').mockResolvedValue({}); + const removeVoteSpy = jest.spyOn(poll, 'removeVote').mockResolvedValue({}); + const { container } = renderComponent({ + channelStateContext: { channelCapabilities: { 'cast-poll-vote': false } }, + poll, + }); + const votableOptions = container.querySelectorAll(VOTABLE_OPTION_SELECTOR); + const options = container.querySelectorAll(OPTION_SELECTOR); + expect(votableOptions).toHaveLength(0); + expect(options).toHaveLength(pollData.options.length); + options.forEach((o) => { + expect(o.querySelector(CHECKMARK_SELECTOR)).toBeNull(); + }); + + act(() => { + fireEvent.click(options[0]); + }); + + expect(castVoteSpy).not.toHaveBeenCalled(); + expect(removeVoteSpy).not.toHaveBeenCalled(); + }); + + it('renders voter avatars with each option', () => { + const pollData = generatePoll(); + const { container } = renderComponent({ poll: new Poll({ client: {}, poll: pollData }) }); + const votableOptions = container.querySelectorAll(VOTABLE_OPTION_SELECTOR); + expect(votableOptions).toHaveLength(pollData.options.length); + votableOptions.forEach((o, i) => { + const optionId = pollData.options[i].id; + const voteCount = pollData.vote_counts_by_option[optionId] ?? 0; + const optionAvatars = o.querySelectorAll('[data-testid="avatar"]'); + expect(optionAvatars).toHaveLength(voteCount); + }); + }); + + it('does not renders voter avatars with options for anonymous poll', () => { + const pollData = generatePoll({ voting_visibility: 'anonymous' }); + const { container } = renderComponent({ poll: new Poll({ client: {}, poll: pollData }) }); + const votableOptions = container.querySelectorAll(VOTABLE_OPTION_SELECTOR); + expect(votableOptions).toHaveLength(pollData.options.length); + votableOptions.forEach((o) => { + const optionAvatars = o.querySelectorAll('[data-testid="avatar"]'); + expect(optionAvatars).toHaveLength(0); + }); + }); + + it('casts a vote if not voted previously for a given option', async () => { + const poll = new Poll({ + client: {}, + poll: pollWithNoVotes, + }); + const castVoteSpy = jest.spyOn(poll, 'castVote').mockResolvedValue({}); + const removeVoteSpy = jest.spyOn(poll, 'removeVote').mockResolvedValue({}); + const { container } = renderComponent({ poll }); + const votableOptions = container.querySelectorAll(VOTABLE_OPTION_SELECTOR); + + act(() => { + fireEvent.click(votableOptions[0]); + }); + await waitFor(() => { + expect(removeVoteSpy).not.toHaveBeenCalled(); + expect(castVoteSpy).toHaveBeenCalledWith( + pollWithNoVotes.options[0].id, + defaultMessageContext.message.id, + ); + }); + }); + + it('updates the UI on cast poll vote state update', () => { + const poll = new Poll({ client: {}, poll: pollWithNoVotes }); + const { container } = renderComponent({ poll }); + const votableOptions = container.querySelectorAll(VOTABLE_OPTION_SELECTOR); + votableOptions.forEach((option) => { + expect(option.querySelector(VOTE_COUNT_SELECTOR)).toHaveTextContent('0'); + }); + act(() => { + poll.handleVoteCasted( + generatePollVoteCastedEvent({ + poll: { + ...pollWithNoVotes, + ...{ + answers_count: 1, + latest_answers: [], + latest_votes_by_option: {}, // ignored + own_votes: [], + vote_count: 1, + vote_counts_by_option: { [pollWithNoVotes.options[0].id]: 1 }, + }, + }, + }), + ); + }); + expect(votableOptions[0].querySelector(VOTE_COUNT_SELECTOR)).toHaveTextContent('1'); + expect(votableOptions[1].querySelector(VOTE_COUNT_SELECTOR)).toHaveTextContent('0'); + }); + + it('updates the UI on cast poll vote state update with own vote', async () => { + const user = generateUser(); + const client = await getTestClientWithUser(user); + const poll = new Poll({ client, poll: pollWithNoVotes }); + const { container } = renderComponent({ poll }); + const votableOptions = container.querySelectorAll(VOTABLE_OPTION_SELECTOR); + act(() => { + poll.handleVoteCasted( + generatePollVoteCastedEvent({ + poll: { + ...pollWithNoVotes, + ...{ + answers_count: 1, + latest_answers: [], + latest_votes_by_option: {}, // ignored + own_votes: [], + vote_count: 1, + vote_counts_by_option: { [pollWithNoVotes.options[0].id]: 1 }, + }, + }, + pollVote: { + created_at: new Date().toISOString(), + id: '4c552daf-8f72-409c-a2ee-313b9db9fcd0', + option_id: pollWithNoVotes.options[0].id, + poll_id: pollWithNoVotes.id, + updated_at: new Date().toISOString(), + user, + user_id: user.id, + }, + }), + ); + }); + await waitFor(() => { + votableOptions.forEach((votableOption, i) => { + if (i === 0) { + expect(votableOption.querySelector(CHECKMARK_CHECKED_SELECTOR)).toBeInTheDocument(); + expect(votableOption.querySelector(VOTE_COUNT_SELECTOR)).toHaveTextContent('1'); + } else { + expect(votableOption.querySelector(CHECKMARK_CHECKED_SELECTOR)).not.toBeInTheDocument(); + expect(votableOption.querySelector(VOTE_COUNT_SELECTOR)).toHaveTextContent('0'); + } + }); + }); + }); + + it('removes the vote if voted previously for a given option', async () => { + const pollData = generatePoll(); + const removedVoteOptionId = pollData.options[0].id; + const poll = new Poll({ client: {}, poll: pollData }); + const { container } = renderComponent({ poll }); + const expectedVoteCountsByOption = { + ...pollData.vote_counts_by_option, + [removedVoteOptionId]: pollData.vote_counts_by_option[removedVoteOptionId] - 1, + }; + act(() => { + poll.handleVoteRemoved( + generatePollVoteRemovedEvent({ + poll: { + ...pollData, + ...{ + latest_votes_by_option: {}, // ignored + own_votes: [], + vote_count: pollData.vote_count - 1, + vote_counts_by_option: expectedVoteCountsByOption, + }, + }, + }), + ); + }); + await waitFor(() => { + const votableOptions = container.querySelectorAll(VOTABLE_OPTION_SELECTOR); + + votableOptions.forEach((votableOption, i) => { + const previousCount = pollData.vote_counts_by_option[pollData.options[i].id] ?? 0; + const expectedCount = + previousCount && pollData.options[i].id === removedVoteOptionId + ? previousCount - 1 + : previousCount; + expect(votableOption.querySelector(VOTE_COUNT_SELECTOR)).toHaveTextContent( + expectedCount.toString(), + ); + }); + }); + }); +}); diff --git a/src/components/Poll/__tests__/SuggestPollOptionForm.test.js b/src/components/Poll/__tests__/SuggestPollOptionForm.test.js new file mode 100644 index 0000000000..9825231a66 --- /dev/null +++ b/src/components/Poll/__tests__/SuggestPollOptionForm.test.js @@ -0,0 +1,67 @@ +import React from 'react'; +import { Poll } from 'stream-chat'; +import { act, fireEvent, render, waitFor } from '@testing-library/react'; +import '@testing-library/jest-dom'; +import { SuggestPollOptionForm } from '../PollActions'; +import { ChatProvider, PollProvider, TranslationProvider } from '../../../context'; +import { generatePoll } from '../../../mock-builders'; + +const SUBMIT_BUTTON_TEXT = 'Suggest an option'; + +const close = jest.fn(); +const messageId = 'messageId'; +const newlyTypedValue = 'XX'; + +const t = (v) => v; + +const renderComponent = ({ client, poll, props }) => + render( + + + + + + + , + ); + +describe('SuggestPollOptionForm', () => { + afterEach(jest.resetAllMocks); + + it('renders with empty input that is updated and submitted', async () => { + const createdPollOptionId = 'new-poll-option-id'; + const createPollOptionSpy = jest + .fn() + .mockResolvedValue({ poll_option: { id: createdPollOptionId } }); + const client = { createPollOption: createPollOptionSpy }; + const poll = new Poll({ + client, + poll: generatePoll(), + }); + const castVoteSpy = jest.spyOn(poll, 'castVote').mockImplementation(); + const { container } = renderComponent({ client, poll }); + const input = container.querySelector('input'); + expect(input).toHaveValue(''); + const submitButton = container.querySelector('button[type="submit"]'); + expect(submitButton).toBeDisabled(); + expect(submitButton).toHaveTextContent(SUBMIT_BUTTON_TEXT); + + act(() => { + fireEvent.change(input, { target: { value: newlyTypedValue } }); + }); + + await waitFor(() => { + expect(submitButton).toBeEnabled(); + expect(submitButton).toHaveTextContent(SUBMIT_BUTTON_TEXT); + }); + + act(() => { + fireEvent.click(submitButton); + }); + + await waitFor(() => { + expect(createPollOptionSpy).toHaveBeenCalledWith(poll.id, { text: newlyTypedValue }); + expect(castVoteSpy).toHaveBeenCalledWith(createdPollOptionId, messageId); + }); + }); +}); diff --git a/src/mock-builders/generator/index.js b/src/mock-builders/generator/index.js index 80104b6e18..956f847972 100644 --- a/src/mock-builders/generator/index.js +++ b/src/mock-builders/generator/index.js @@ -2,5 +2,6 @@ export * from './attachment'; export * from './channel'; export * from './member'; export * from './message'; +export * from './poll'; export * from './reaction'; export * from './user'; diff --git a/src/mock-builders/generator/poll.js b/src/mock-builders/generator/poll.js index b55d2dec64..5160c3d0a3 100644 --- a/src/mock-builders/generator/poll.js +++ b/src/mock-builders/generator/poll.js @@ -1,154 +1,192 @@ -export const generatePoll = (data = {}) => { - const pollId = 'WD4SBRJvLoGwB4oAoCQGM'; +const pollId = 'WD4SBRJvLoGwB4oAoCQGM'; - const user1 = { - banned: false, - created_at: '2022-03-08T09:46:56.840739Z', - id: 'admin', - last_active: '2024-10-23T08:14:23.299448386Z', - mutes: null, - name: 'Test User', - online: true, - role: 'admin', - updated_at: '2024-09-13T13:53:32.883409Z', - }; +const user1 = { + banned: false, + created_at: '2022-03-08T09:46:56.840739Z', + id: 'admin', + last_active: '2024-10-23T08:14:23.299448386Z', + mutes: null, + name: 'Test User', + online: true, + role: 'admin', + updated_at: '2024-09-13T13:53:32.883409Z', +}; + +const user1Votes = [ + { + created_at: '2024-10-22T15:58:27.756166Z', + id: '332da4fe-e38c-465c-8f74-e8df69680f13', + option_id: '85610252-7d50-429c-8183-51a7eba46246', + poll_id: pollId, + updated_at: '2024-10-22T15:58:27.756166Z', + user: user1, + user_id: user1.id, + }, + { + created_at: '2024-10-22T15:58:25.886491Z', + id: '5657da00-256e-41fc-a580-b7adabcbfbe1', + option_id: 'dc22dcd6-4fc8-4c92-92c2-bfd63245724c', + poll_id: pollId, + updated_at: '2024-10-22T15:58:25.886491Z', + user: user1, + user_id: user1.id, + }, +]; + +const user2 = { + banned: false, + created_at: '2022-01-27T08:28:28.412254Z', + id: 'SmithAnne', + image: 'https://getstream.io/random_png/?name=SmithAnne', + last_active: '2024-10-23T08:01:43.157632831Z', + name: 'SmithAnne', + nickname: 'Ann', + online: true, + role: 'user', + updated_at: '2024-09-26T10:12:23.427141Z', +}; + +const user2Votes = [ + { + created_at: '2024-10-22T16:00:50.2493Z', + id: 'f428f353-3057-4353-b0b5-b33dcdeb1992', + option_id: '7312e983-b042-4596-b5ce-f9e82deb363f', + poll_id: pollId, + updated_at: '2024-10-22T16:00:50.2493Z', + user: user2, + user_id: user2.id, + }, + { + created_at: '2024-10-22T16:00:54.410474Z', + id: '75ba8774-bf17-4edd-8ced-39e7dc6aa7dd', + option_id: '85610252-7d50-429c-8183-51a7eba46246', + poll_id: pollId, + updated_at: '2024-10-22T16:00:54.410474Z', + user: user2, + user_id: user2.id, + }, +]; + +const user1Answer = { + answer_text: 'comment1', + created_at: '2024-10-23T13:12:57.944913Z', + id: 'dbb4506c-c5a8-4ca6-86ec-0c57498916fe', + is_answer: true, + option_id: '', + poll_id: pollId, + updated_at: '2024-10-23T13:12:57.944913Z', + user: user1, + user_id: user1.id, +}; - const user1Votes = [ +const user2Answer = { + answer_text: 'comment2', + created_at: '2024-10-23T13:12:57.944913Z', + id: 'dbb4506c-c5a8-4ca6-86ec-0c57498916xy', + is_answer: true, + option_id: '', + poll_id: pollId, + updated_at: '2024-10-23T13:12:57.944913Z', + user: user2, + user_id: user2.id, +}; + +const pollConfigData = { + allow_answers: true, + allow_user_suggested_options: false, + description: 'Poll description', + enforce_unique_vote: false, + id: pollId, + max_votes_allowed: 2, + name: 'XY', + options: [ { - created_at: '2024-10-22T15:58:27.756166Z', - id: '332da4fe-e38c-465c-8f74-e8df69680f13', - option_id: '85610252-7d50-429c-8183-51a7eba46246', - poll_id: pollId, - updated_at: '2024-10-22T15:58:27.756166Z', - user: user1, - user_id: user1.id, + id: '85610252-7d50-429c-8183-51a7eba46246', + text: 'A', }, { - created_at: '2024-10-22T15:58:25.886491Z', - id: '5657da00-256e-41fc-a580-b7adabcbfbe1', - option_id: 'dc22dcd6-4fc8-4c92-92c2-bfd63245724c', - poll_id: pollId, - updated_at: '2024-10-22T15:58:25.886491Z', - user: user1, - user_id: user1.id, + id: '7312e983-b042-4596-b5ce-f9e82deb363f', + text: 'B', }, - ]; - - const user2 = { - banned: false, - created_at: '2022-01-27T08:28:28.412254Z', - id: 'SmithAnne', - image: 'https://getstream.io/random_png/?name=SmithAnne', - last_active: '2024-10-23T08:01:43.157632831Z', - name: 'SmithAnne', - nickname: 'Ann', - online: true, - role: 'user', - updated_at: '2024-09-26T10:12:23.427141Z', - }; - - const user2Votes = [ { - created_at: '2024-10-22T16:00:50.2493Z', - id: 'f428f353-3057-4353-b0b5-b33dcdeb1992', - option_id: '7312e983-b042-4596-b5ce-f9e82deb363f', - poll_id: pollId, - updated_at: '2024-10-22T16:00:50.2493Z', - user: user2, - user_id: user2.id, + id: 'ba933470-c0da-4b6f-a4d2-d2176ac0d4a8', + text: 'C', }, { - created_at: '2024-10-22T16:00:54.410474Z', - id: '75ba8774-bf17-4edd-8ced-39e7dc6aa7dd', - option_id: '85610252-7d50-429c-8183-51a7eba46246', - poll_id: pollId, - updated_at: '2024-10-22T16:00:54.410474Z', - user: user2, - user_id: user2.id, + id: 'dc22dcd6-4fc8-4c92-92c2-bfd63245724c', + text: 'D', }, - ]; + ], + voting_visibility: 'public', +}; - const user1Answer = { - answer_text: 'comment1', - created_at: '2024-10-23T13:12:57.944913Z', - id: 'dbb4506c-c5a8-4ca6-86ec-0c57498916fe', - is_answer: true, - option_id: '', - poll_id: pollId, - updated_at: '2024-10-23T13:12:57.944913Z', - user: user1, - user_id: user1.id, - }; +const pollEnrichData = { + answers_count: 1, + latest_answers: [user1Answer, user2Answer], + latest_votes_by_option: { + '7312e983-b042-4596-b5ce-f9e82deb363f': [user2Votes[0]], + '85610252-7d50-429c-8183-51a7eba46246': [user1Votes[0], user2Votes[1]], + 'dc22dcd6-4fc8-4c92-92c2-bfd63245724c': [user1Votes[1]], + }, + own_votes: [...user1Votes, user1Answer], + vote_count: 4, + vote_counts_by_option: { + '7312e983-b042-4596-b5ce-f9e82deb363f': 1, + '85610252-7d50-429c-8183-51a7eba46246': 2, + 'dc22dcd6-4fc8-4c92-92c2-bfd63245724c': 1, + }, +}; - const user2Answer = { - answer_text: 'comment2', - created_at: '2024-10-23T13:12:57.944913Z', - id: 'dbb4506c-c5a8-4ca6-86ec-0c57498916xy', - is_answer: true, - option_id: '', - poll_id: pollId, - updated_at: '2024-10-23T13:12:57.944913Z', - user: user2, - user_id: user2.id, - }; +const pollMetadata = { + created_at: '2024-10-22T15:28:20.580523Z', + created_by: user1, + created_by_id: user1.id, + updated_at: '2024-10-22T15:28:20.580523Z', +}; - const pollConfigData = { - allow_answers: true, - allow_user_suggested_options: false, - description: 'Poll description', - enforce_unique_vote: false, - id: pollId, - max_votes_allowed: 2, - name: 'XY', - options: [ - { - id: '85610252-7d50-429c-8183-51a7eba46246', - text: 'A', - }, - { - id: '7312e983-b042-4596-b5ce-f9e82deb363f', - text: 'B', - }, - { - id: 'ba933470-c0da-4b6f-a4d2-d2176ac0d4a8', - text: 'C', - }, - { - id: 'dc22dcd6-4fc8-4c92-92c2-bfd63245724c', - text: 'D', - }, - ], - voting_visibility: 'public', - }; +export const generatePoll = (data = {}) => ({ + ...pollConfigData, + ...pollEnrichData, + ...pollMetadata, + ...data, +}); - const pollEnrichData = { - answers_count: 1, - latest_answers: [user1Answer, user2Answer], - latest_votes_by_option: { - '7312e983-b042-4596-b5ce-f9e82deb363f': [user2Votes[0]], - '85610252-7d50-429c-8183-51a7eba46246': [user1Votes[0], user2Votes[1]], - 'dc22dcd6-4fc8-4c92-92c2-bfd63245724c': [user1Votes[1]], - }, - own_votes: [...user1Votes, user1Answer], - vote_count: 4, - vote_counts_by_option: { - '7312e983-b042-4596-b5ce-f9e82deb363f': 1, - '85610252-7d50-429c-8183-51a7eba46246': 2, - 'dc22dcd6-4fc8-4c92-92c2-bfd63245724c': 1, +export const generatePollVoteCastedEvent = ({ cid, createdAt, poll, pollVote } = {}) => { + const resultingPoll = generatePoll(poll); + return { + cid: cid ?? 'messaging:1708683907031', + created_at: createdAt ?? new Date().toISOString(), + poll: resultingPoll, + poll_vote: { + created_at: new Date().toISOString(), + id: '4c552daf-8f72-409c-a2ee-313b9db9fcd0', + option_id: resultingPoll.options[0].id, + poll_id: resultingPoll.id, + updated_at: new Date().toISOString(), + user: user1, + user_id: user1.id, + ...pollVote, }, + type: 'poll.vote_casted', }; +}; - const pollMetadata = { - created_at: '2024-10-22T15:28:20.580523Z', - created_by: user1, - created_by_id: user1.id, - updated_at: '2024-10-22T15:28:20.580523Z', - }; - +export const generatePollVoteRemovedEvent = ({ cid, createdAt, poll, pollVote } = {}) => { + const resultingPoll = generatePoll(poll); return { - ...pollConfigData, - ...pollEnrichData, - ...pollMetadata, - ...data, + cid: cid ?? 'messaging:1708683907031', + created_at: createdAt ?? new Date().toISOString(), + poll: resultingPoll, + poll_vote: { + created_at: new Date().toISOString(), + id: '4c552daf-8f72-409c-a2ee-313b9db9fcd0', + option_id: resultingPoll.options[0].id, + poll_id: resultingPoll.id, + updated_at: new Date().toISOString(), + user: user1, + user_id: user1.id, + ...pollVote, + }, + type: 'poll.vote_removed', }; }; diff --git a/src/mock-builders/index.js b/src/mock-builders/index.js index 1ecab6be1e..ada1049fc7 100644 --- a/src/mock-builders/index.js +++ b/src/mock-builders/index.js @@ -21,7 +21,6 @@ const connectUser = (client, user) => function mockClient(client, mocks = {}) { jest.spyOn(client, '_setToken').mockImplementation(); jest.spyOn(client, '_setupConnection').mockImplementation(); - jest.spyOn(client, '_setupConnection').mockImplementation(); jest.spyOn(client, 'getAppSettings').mockImplementation(mocks.getAppSettings); jest.spyOn(client, 'queryReactions').mockImplementation(mocks.queryReactions); client.tokenManager = { From f66be60a83c0051b764455bd7d5784dba43c0e10 Mon Sep 17 00:00:00 2001 From: martincupela Date: Thu, 31 Oct 2024 13:25:47 +0100 Subject: [PATCH 50/71] chore(deps): bump stream-chat version to 8.42.0 --- package.json | 4 ++-- yarn.lock | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 4b88c74c4f..152c56d001 100644 --- a/package.json +++ b/package.json @@ -145,7 +145,7 @@ "emoji-mart": "^5.4.0", "react": "^18.0.0 || ^17.0.0 || ^16.8.0", "react-dom": "^18.0.0 || ^17.0.0 || ^16.8.0", - "stream-chat": "^8.41.1" + "stream-chat": "^8.42.0" }, "peerDependenciesMeta": { "@breezystack/lamejs": { @@ -255,7 +255,7 @@ "react-dom": "^18.1.0", "react-test-renderer": "^18.1.0", "semantic-release": "^19.0.5", - "stream-chat": "^8.41.1", + "stream-chat": "^8.42.0", "ts-jest": "^29.1.4", "typescript": "^5.4.5" }, diff --git a/yarn.lock b/yarn.lock index 825b1c515f..35a6146ffa 100644 --- a/yarn.lock +++ b/yarn.lock @@ -12200,10 +12200,10 @@ statuses@2.0.1: resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== -stream-chat@^8.41.1: - version "8.41.1" - resolved "https://registry.yarnpkg.com/stream-chat/-/stream-chat-8.41.1.tgz#c991980b800b67ec38202a1aa3bbbd4112ccb5fa" - integrity sha512-WV0mHHm88D4RbAV42sD0+SqTWLCvjIwfGZ3nSBXRAuGpVYJEqnNUhEd4OIQ+YrXVbjY7qWz9L5XRk5fZIfE9kg== +stream-chat@^8.42.0: + version "8.42.0" + resolved "https://registry.yarnpkg.com/stream-chat/-/stream-chat-8.42.0.tgz#124ea2c10c6e8f7990304e1101c66751daf63e6c" + integrity sha512-8xZz+fmdHSOa3L1rHUOC4Wah+ipvLvdiOmeOfGK6uXnLOKlSHMOblwmQErrOoFM4SKfX9Bea3V8viaKUu6bPng== dependencies: "@babel/runtime" "^7.16.3" "@types/jsonwebtoken" "~9.0.0" From a2149286170a2c8ec7f3477e97ea1364f61cda98 Mon Sep 17 00:00:00 2001 From: martincupela Date: Thu, 31 Oct 2024 13:35:11 +0100 Subject: [PATCH 51/71] feat: add missing translations --- src/i18n/de.json | 3 ++- src/i18n/en.json | 1 + src/i18n/es.json | 3 ++- src/i18n/fr.json | 3 ++- src/i18n/hi.json | 3 ++- src/i18n/it.json | 3 ++- src/i18n/ja.json | 3 ++- src/i18n/ko.json | 3 ++- src/i18n/nl.json | 3 ++- src/i18n/pt.json | 3 ++- src/i18n/ru.json | 3 ++- src/i18n/tr.json | 3 ++- 12 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/i18n/de.json b/src/i18n/de.json index f93c190c17..af101ab87e 100644 --- a/src/i18n/de.json +++ b/src/i18n/de.json @@ -86,7 +86,7 @@ "Poll options": "Umfrageoptionen", "Poll results": "Umfrageergebnisse", "Question": "Frage", - "Quote": "Quote", + "Quote": "Zitieren", "Recording format is not supported and cannot be reproduced": "Aufnahmeformat wird nicht unterstützt und kann nicht wiedergegeben werden", "Reply": "Antworten", "Reply to Message": "Auf Nachricht antworten", @@ -106,6 +106,7 @@ "Shuffle": "Mischen", "Slow Mode ON": "Langsamer Modus EIN", "Some of the files will not be accepted": "Einige der Dateien werden nicht akzeptiert", + "Submit": "Absenden", "Suggest an option": "Eine Option vorschlagen", "This message did not meet our content guidelines": "Diese Nachricht entsprach nicht unseren Inhaltsrichtlinien", "This message was deleted...": "Diese Nachricht wurde gelöscht...", diff --git a/src/i18n/en.json b/src/i18n/en.json index 6bb4e5c1bf..d7e7523ee4 100644 --- a/src/i18n/en.json +++ b/src/i18n/en.json @@ -106,6 +106,7 @@ "Shuffle": "Shuffle", "Slow Mode ON": "Slow Mode ON", "Some of the files will not be accepted": "Some of the files will not be accepted", + "Submit": "Submit", "Suggest an option": "Suggest an option", "This message did not meet our content guidelines": "This message did not meet our content guidelines", "This message was deleted...": "This message was deleted...", diff --git a/src/i18n/es.json b/src/i18n/es.json index 5b12f23f48..24f9e2881d 100644 --- a/src/i18n/es.json +++ b/src/i18n/es.json @@ -86,7 +86,7 @@ "Poll options": "Opciones de la encuesta", "Poll results": "Resultados de la encuesta", "Question": "Pregunta", - "Quote": "Quote", + "Quote": "Citar", "Recording format is not supported and cannot be reproduced": "El formato de grabación no es compatible y no se puede reproducir", "Reply": "Responder", "Reply to Message": "Responder al mensaje", @@ -108,6 +108,7 @@ "Shuffle": "Mezclar", "Slow Mode ON": "Modo lento activado", "Some of the files will not be accepted": "Algunos archivos no serán aceptados", + "Submit": "Enviar", "Suggest an option": "Sugerir una opción", "This message did not meet our content guidelines": "Este mensaje no cumple con nuestras directrices de contenido", "This message was deleted...": "Este mensaje fue eliminado...", diff --git a/src/i18n/fr.json b/src/i18n/fr.json index ab58dd0af0..0588739520 100644 --- a/src/i18n/fr.json +++ b/src/i18n/fr.json @@ -86,7 +86,7 @@ "Poll options": "Options du sondage", "Poll results": "Résultats du sondage", "Question": "Question", - "Quote": "Quote", + "Quote": "Citer", "Recording format is not supported and cannot be reproduced": "Le format d'enregistrement n'est pas pris en charge et ne peut pas être reproduit", "Reply": "Répondre", "Reply to Message": "Répondre au message", @@ -108,6 +108,7 @@ "Shuffle": "Mélanger", "Slow Mode ON": "Mode lent activé", "Some of the files will not be accepted": "Certains fichiers ne seront pas acceptés", + "Submit": "Envoyer", "Suggest an option": "Suggérer une option", "This message did not meet our content guidelines": "Ce message ne respecte pas nos directives de contenu", "This message was deleted...": "Ce message a été supprimé...", diff --git a/src/i18n/hi.json b/src/i18n/hi.json index e3a43f45be..0dbe94f7a4 100644 --- a/src/i18n/hi.json +++ b/src/i18n/hi.json @@ -87,7 +87,7 @@ "Poll options": "मतदान विकल्प", "Poll results": "मतदान परिणाम", "Question": "प्रश्न", - "Quote": "Quote", + "Quote": "उद्धरण", "Recording format is not supported and cannot be reproduced": "रेकॉर्डिंग फ़ॉर्मेट समर्थित नहीं है और पुनः उत्पन्न नहीं किया जा सकता", "Reply": "जवाब दे दो", "Reply to Message": "संदेश का जवाब दें", @@ -107,6 +107,7 @@ "Shuffle": "मिश्रित करें", "Slow Mode ON": "स्लो मोड ऑन", "Some of the files will not be accepted": "कुछ फ़ाइलें स्वीकार नहीं की जाएंगी", + "Submit": "जमा करें", "Suggest an option": "एक विकल्प सुझाव दें", "This message did not meet our content guidelines": "यह संदेश हमारे सामग्री दिशानिर्देशों के अनुरूप नहीं था", "This message was deleted...": "मैसेज हटा दिया गया", diff --git a/src/i18n/it.json b/src/i18n/it.json index f2f210cdbe..aa2b16c404 100644 --- a/src/i18n/it.json +++ b/src/i18n/it.json @@ -86,7 +86,7 @@ "Poll options": "Opzioni del sondaggio", "Poll results": "Risultati del sondaggio", "Question": "Domanda", - "Quote": "Quote", + "Quote": "Citazione", "Recording format is not supported and cannot be reproduced": "Il formato di registrazione non è supportato e non può essere riprodotto", "Reply": "Rispondi", "Reply to Message": "Rispondi al messaggio", @@ -108,6 +108,7 @@ "Shuffle": "Mescolare", "Slow Mode ON": "Modalità lenta attivata", "Some of the files will not be accepted": "Alcuni dei file non saranno accettati", + "Submit": "Invia", "Suggest an option": "Suggerisci un'opzione", "This message did not meet our content guidelines": "Questo messaggio non soddisfa le nostre linee guida sui contenuti", "This message was deleted...": "Questo messaggio è stato cancellato...", diff --git a/src/i18n/ja.json b/src/i18n/ja.json index 96e328e75e..c2ca6ef48e 100644 --- a/src/i18n/ja.json +++ b/src/i18n/ja.json @@ -86,7 +86,7 @@ "Poll options": "投票オプション", "Poll results": "投票結果", "Question": "質問", - "Quote": "Quote", + "Quote": "引用", "Recording format is not supported and cannot be reproduced": "録音形式はサポートされておらず、再生できません", "Reply": "返事", "Reply to Message": "メッセージに返信", @@ -104,6 +104,7 @@ "Shuffle": "シャッフル", "Slow Mode ON": "スローモードオン", "Some of the files will not be accepted": "一部のファイルは受け付けられません", + "Submit": "送信", "Suggest an option": "オプションを提案", "This message did not meet our content guidelines": "このメッセージはコンテンツガイドラインに適合していません", "This message was deleted...": "このメッセージは削除されました...", diff --git a/src/i18n/ko.json b/src/i18n/ko.json index 0122bf1386..8d01cbc4c0 100644 --- a/src/i18n/ko.json +++ b/src/i18n/ko.json @@ -86,7 +86,7 @@ "Poll options": "투표 옵션", "Poll results": "투표 결과", "Question": "질문", - "Quote": "Quote", + "Quote": "인용", "Recording format is not supported and cannot be reproduced": "녹음 형식이 지원되지 않으므로 재생할 수 없습니다", "Reply": "답장", "Reply to Message": "메시지에 답장", @@ -104,6 +104,7 @@ "Shuffle": "셔플", "Slow Mode ON": "슬로우 모드 켜짐", "Some of the files will not be accepted": "일부 파일은 허용되지 않을 수 있습니다", + "Submit": "제출", "Suggest an option": "옵션 제안", "This message did not meet our content guidelines": "이 메시지는 콘텐츠 가이드라인을 충족하지 않습니다.", "This message was deleted...": "이 메시지는 삭제되었습니다...", diff --git a/src/i18n/nl.json b/src/i18n/nl.json index e76f627deb..744073fb42 100644 --- a/src/i18n/nl.json +++ b/src/i18n/nl.json @@ -86,7 +86,7 @@ "Poll options": "Peiling opties", "Poll results": "Peiling resultaten", "Question": "Vraag", - "Quote": "Quote", + "Quote": "Citeer", "Recording format is not supported and cannot be reproduced": "Opnameformaat wordt niet ondersteund en kan niet worden gereproduceerd", "Reply": "Antwoord", "Reply to Message": "Antwoord op bericht", @@ -106,6 +106,7 @@ "Shuffle": "Schudden", "Slow Mode ON": "Langzame modus aan", "Some of the files will not be accepted": "Sommige bestanden zullen niet worden geaccepteerd", + "Submit": "Versturen", "Suggest an option": "Stel een optie voor", "This message did not meet our content guidelines": "Dit bericht voldeed niet aan onze inhoudsrichtlijnen", "This message was deleted...": "Dit bericht was verwijderd", diff --git a/src/i18n/pt.json b/src/i18n/pt.json index 96860ba90a..c3e564c72f 100644 --- a/src/i18n/pt.json +++ b/src/i18n/pt.json @@ -86,7 +86,7 @@ "Poll options": "Opções da pesquisa", "Poll results": "Resultados da pesquisa", "Question": "Pergunta", - "Quote": "Quote", + "Quote": "Citar", "Recording format is not supported and cannot be reproduced": "Formato de gravação não é suportado e não pode ser reproduzido", "Reply": "Responder", "Reply to Message": "Responder à mensagem", @@ -108,6 +108,7 @@ "Shuffle": "Embaralhar", "Slow Mode ON": "Modo lento LIGADO", "Some of the files will not be accepted": "Alguns arquivos não serão aceitos", + "Submit": "Enviar", "Suggest an option": "Sugerir uma opção", "This message did not meet our content guidelines": "Esta mensagem não corresponde às nossas diretrizes de conteúdo", "This message was deleted...": "Esta mensagem foi excluída...", diff --git a/src/i18n/ru.json b/src/i18n/ru.json index 64a2693b04..7aa917ff85 100644 --- a/src/i18n/ru.json +++ b/src/i18n/ru.json @@ -86,7 +86,7 @@ "Poll options": "Опции опроса", "Poll results": "Результаты опроса", "Question": "Вопрос", - "Quote": "Quote", + "Quote": "Цитировать", "Recording format is not supported and cannot be reproduced": "Формат записи не поддерживается и не может быть воспроизведен", "Reply": "Ответить", "Reply to Message": "Ответить на сообщение", @@ -110,6 +110,7 @@ "Shuffle": "Перемешать", "Slow Mode ON": "Медленный режим включен", "Some of the files will not be accepted": "Некоторые файлы не будут приняты", + "Submit": "Отправить", "Suggest an option": "Предложить вариант", "This message did not meet our content guidelines": "Сообщение не соответствует правилам", "This message was deleted...": "Сообщение было удалено...", diff --git a/src/i18n/tr.json b/src/i18n/tr.json index 78a8f55ddb..717febc3df 100644 --- a/src/i18n/tr.json +++ b/src/i18n/tr.json @@ -86,7 +86,7 @@ "Poll options": "Anket seçenekleri", "Poll results": "Anket sonuçları", "Question": "Soru", - "Quote": "Quote", + "Quote": "Alıntı", "Recording format is not supported and cannot be reproduced": "Kayıt formatı desteklenmiyor ve çoğaltılamıyor", "Reply": "Cevapla", "Reply to Message": "Mesaja Cevapla", @@ -106,6 +106,7 @@ "Shuffle": "Karıştır", "Slow Mode ON": "Yavaş Mod Açık", "Some of the files will not be accepted": "Bazı dosyalar kabul edilmeyecek", + "Submit": "Gönder", "Suggest an option": "Bir seçenek önerin", "This message did not meet our content guidelines": "Bu mesaj içerik yönergelerimize uygun değil", "This message was deleted...": "Bu mesaj silindi...", From 72ccbc2d34e373271d1845357023a367e46aec97 Mon Sep 17 00:00:00 2001 From: martincupela Date: Thu, 31 Oct 2024 14:49:37 +0100 Subject: [PATCH 52/71] feat: respect channel.config.polls flag --- .../MessageInput/AttachmentSelector.tsx | 11 ++++-- .../__tests__/AttachmentSelector.test.js | 34 +++++++++++-------- .../__tests__/MessageInput.test.js | 2 +- src/mock-builders/generator/channel.js | 1 + 4 files changed, 29 insertions(+), 19 deletions(-) diff --git a/src/components/MessageInput/AttachmentSelector.tsx b/src/components/MessageInput/AttachmentSelector.tsx index 062e0e9097..bf8ac4932d 100644 --- a/src/components/MessageInput/AttachmentSelector.tsx +++ b/src/components/MessageInput/AttachmentSelector.tsx @@ -127,12 +127,15 @@ const useAttachmentSelectorActionsFiltered = < >( original: AttachmentSelectorAction[], ) => { - const { channelCapabilities } = useChannelStateContext(); + const { channelCapabilities, channelConfig } = useChannelStateContext(); const { isThreadInput } = useMessageInputContext(); return original.filter((action) => { - if (!channelCapabilities['upload-file'] && action.type === 'uploadFile') return false; - if ((isThreadInput || !channelCapabilities['send-poll']) && action.type === 'createPoll') + if (action.type === 'uploadFile' && !channelCapabilities['upload-file']) return false; + if ( + action.type === 'createPoll' && + (!channelConfig?.polls || isThreadInput || !channelCapabilities['send-poll']) + ) return false; return true; }); @@ -169,6 +172,8 @@ export const AttachmentSelector = < if (actions.length === 0) return null; + if (actions.length === 1 && actions[0].type === 'uploadFile') return ; + return (
diff --git a/src/components/MessageInput/__tests__/AttachmentSelector.test.js b/src/components/MessageInput/__tests__/AttachmentSelector.test.js index bb39dfc9b3..873710377a 100644 --- a/src/components/MessageInput/__tests__/AttachmentSelector.test.js +++ b/src/components/MessageInput/__tests__/AttachmentSelector.test.js @@ -16,6 +16,7 @@ import { AttachmentSelector } from '../AttachmentSelector'; const ATTACHMENT_SELECTOR__ACTIONS_MENU_TEST_ID = 'attachment-selector-actions-menu'; const POLL_CREATION_DIALOG_TEST_ID = 'poll-creation-dialog'; +const ATTACHMENT_SELECTOR_CLASS = 'str-chat__attachment-selector'; const UPLOAD_FILE_BUTTON_CLASS = 'str-chat__attachment-selector-actions-menu__upload-file-button'; const CREATE_POLL_BUTTON_CLASS = 'str-chat__attachment-selector-actions-menu__create-poll-button'; @@ -25,6 +26,7 @@ const translationContext = { const defaultChannelStateContext = { channelCapabilities: { 'send-poll': true, 'upload-file': true }, + channelConfig: { polls: true }, }; const defaultMessageInputProps = { @@ -79,29 +81,31 @@ describe('AttachmentSelector', () => { expect(menu).toHaveTextContent('Poll'); }); - it('renders with single upload file button if send-poll permission is not granted', async () => { - await renderComponent({ + it('falls back to SimpleAttachmentSelector if channel.config.polls is false', async () => { + const { container } = await renderComponent({ + channelStateContext: { channelConfig: { polls: false } }, + }); + expect(container.querySelector(`.${ATTACHMENT_SELECTOR_CLASS}`)).not.toBeInTheDocument(); + expect(screen.getByTestId('file-upload-button')).toBeInTheDocument(); + }); + + it('renders SimpleAttachmentSelector if send-poll permission is not granted', async () => { + const { container } = await renderComponent({ channelStateContext: { channelCapabilities: { 'upload-file': true } }, }); - await invokeMenu(); - const menu = screen.getByTestId(ATTACHMENT_SELECTOR__ACTIONS_MENU_TEST_ID); - expect(menu).toBeInTheDocument(); - expect(menu).toHaveTextContent('File'); - expect(menu).not.toHaveTextContent('Poll'); + expect(container.querySelector(`.${ATTACHMENT_SELECTOR_CLASS}`)).not.toBeInTheDocument(); + expect(screen.getByTestId('file-upload-button')).toBeInTheDocument(); }); - it('renders with single upload file button if rendered in a thread', async () => { - await renderComponent({ + it('renders SimpleAttachmentSelector if rendered in a thread', async () => { + const { container } = await renderComponent({ messageInputProps: { isThreadInput: true }, }); - await invokeMenu(); - const menu = screen.getByTestId(ATTACHMENT_SELECTOR__ACTIONS_MENU_TEST_ID); - expect(menu).toBeInTheDocument(); - expect(menu).toHaveTextContent('File'); - expect(menu).not.toHaveTextContent('Poll'); + expect(container.querySelector(`.${ATTACHMENT_SELECTOR_CLASS}`)).not.toBeInTheDocument(); + expect(screen.getByTestId('file-upload-button')).toBeInTheDocument(); }); - it('renders with single poll button if upload-file permission is not granted', async () => { + it('renders SimpleAttachmentSelector if upload-file permission is not granted', async () => { await renderComponent({ channelStateContext: { channelCapabilities: { 'send-poll': true } }, }); diff --git a/src/components/MessageInput/__tests__/MessageInput.test.js b/src/components/MessageInput/__tests__/MessageInput.test.js index 75fc615279..a6a47d17c7 100644 --- a/src/components/MessageInput/__tests__/MessageInput.test.js +++ b/src/components/MessageInput/__tests__/MessageInput.test.js @@ -54,7 +54,7 @@ const threadMessage = generateMessage({ user, }); const mockedChannelData = generateChannel({ - channel: { own_capabilities: ['upload-file'] }, + channel: { own_capabilities: ['send-poll', 'upload-file'] }, members: [generateMember({ user }), generateMember({ user: mentionUser })], messages: [mainListMessage], thread: [threadMessage], diff --git a/src/mock-builders/generator/channel.js b/src/mock-builders/generator/channel.js index 602d13f63b..e19d01a5d0 100644 --- a/src/mock-builders/generator/channel.js +++ b/src/mock-builders/generator/channel.js @@ -32,6 +32,7 @@ export const generateChannel = (options = { channel: {} }) => { message_retention: 'infinite', mutes: true, name: 'messaging', + polls: true, reactions: true, read_events: true, replies: true, From be03659e25bb153c5d9607ea53abbeab536ac69f Mon Sep 17 00:00:00 2001 From: martincupela Date: Thu, 31 Oct 2024 14:54:56 +0100 Subject: [PATCH 53/71] test: fix import --- src/components/Poll/__tests__/PollActions.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/Poll/__tests__/PollActions.test.js b/src/components/Poll/__tests__/PollActions.test.js index c30d7f8b41..a33b13c985 100644 --- a/src/components/Poll/__tests__/PollActions.test.js +++ b/src/components/Poll/__tests__/PollActions.test.js @@ -1,4 +1,5 @@ import React from 'react'; +import { Poll } from 'stream-chat'; import { act, fireEvent, render, screen, waitFor } from '@testing-library/react'; import '@testing-library/jest-dom'; import { PollActions } from '../PollActions'; @@ -15,7 +16,6 @@ import { generateUser, getTestClientWithUser, } from '../../../mock-builders'; -import { Poll } from '../../../../../stream-chat-js'; import { MAX_OPTIONS_DISPLAYED } from '../constants'; const SEE_ALL_OPTIONS_ACTION_TEXT = 'See all options ({{count}})'; From 28e34044a88cdcd607e7a9029b701ff59976880c Mon Sep 17 00:00:00 2001 From: martincupela Date: Thu, 31 Oct 2024 18:15:26 +0100 Subject: [PATCH 54/71] feat: add PollActions to the component context --- src/components/Channel/Channel.tsx | 3 + src/components/Poll/Poll.tsx | 5 +- src/components/Poll/__tests__/Poll.test.js | 90 ++++++++++++++++++++++ src/components/Poll/index.ts | 2 + src/context/ComponentContext.tsx | 2 + 5 files changed, 100 insertions(+), 2 deletions(-) create mode 100644 src/components/Poll/__tests__/Poll.test.js diff --git a/src/components/Channel/Channel.tsx b/src/components/Channel/Channel.tsx index 55d9a7b4ab..964fa374d7 100644 --- a/src/components/Channel/Channel.tsx +++ b/src/components/Channel/Channel.tsx @@ -140,6 +140,7 @@ type ChannelPropsForwardedToComponentContext< | 'ModalGallery' | 'PinIndicator' | 'Poll' + | 'PollActions' | 'PollCreationDialog' | 'QuotedMessage' | 'QuotedMessagePreview' @@ -1257,6 +1258,7 @@ const ChannelInner = < ModalGallery: props.ModalGallery, PinIndicator: props.PinIndicator, Poll: props.Poll, + PollActions: props.PollActions, PollCreationDialog: props.PollCreationDialog, QuotedMessage: props.QuotedMessage, QuotedMessagePreview: props.QuotedMessagePreview, @@ -1311,6 +1313,7 @@ const ChannelInner = < props.ModalGallery, props.PinIndicator, props.Poll, + props.PollActions, props.PollCreationDialog, props.QuotedMessage, props.QuotedMessagePreview, diff --git a/src/components/Poll/Poll.tsx b/src/components/Poll/Poll.tsx index 8314f63a39..a85d7ab79c 100644 --- a/src/components/Poll/Poll.tsx +++ b/src/components/Poll/Poll.tsx @@ -1,11 +1,11 @@ import clsx from 'clsx'; import React from 'react'; -import { PollActions } from './PollActions'; +import { PollActions as DefaultPollActions } from './PollActions'; import { PollHeader } from './PollHeader'; import { PollOptionList } from './PollOptionList'; import { MAX_OPTIONS_DISPLAYED } from './constants'; import { useStateStore } from '../../store'; -import { PollProvider, usePollContext } from '../../context'; +import { PollProvider, useComponentContext, usePollContext } from '../../context'; import type { Poll as PollClass, PollState } from 'stream-chat'; import type { DefaultStreamChatGenerics } from '../../types'; @@ -48,6 +48,7 @@ const pollStateSelectorPollUI = < const PollUI = < StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics >() => { + const { PollActions = DefaultPollActions } = useComponentContext(); const { poll } = usePollContext(); const { is_closed } = useStateStore(poll.state, pollStateSelectorPollUI); diff --git a/src/components/Poll/__tests__/Poll.test.js b/src/components/Poll/__tests__/Poll.test.js new file mode 100644 index 0000000000..e2769c8a0b --- /dev/null +++ b/src/components/Poll/__tests__/Poll.test.js @@ -0,0 +1,90 @@ +import React from 'react'; +import { Poll as PollClass } from 'stream-chat'; +import { render, screen } from '@testing-library/react'; +import '@testing-library/jest-dom'; +import { Poll } from '../Poll'; +import { + ChannelStateProvider, + ChatProvider, + ComponentProvider, + MessageProvider, + TranslationProvider, +} from '../../../context'; +import { generateMessage, generatePoll, getTestClientWithUser } from '../../../mock-builders'; + +const POLL_ACTIONS__CLASS = '.str-chat__poll-actions'; +const POLL_OPTION_LIST__CLASS = '.str-chat__poll-option-list'; +const POLL_HEADER__CLASS = '.str-chat__poll-header'; +const QUOTED_POLL__CLASS = '.str-chat__quoted-poll-preview'; + +const t = (v) => v; + +const defaultChannelStateContext = { + channelCapabilities: { 'query-poll-votes': true }, +}; + +const defaultMessageContext = { + message: generateMessage(), +}; + +const renderComponent = async ({ + channelStateContext, + client: customClient, + componentContext, + messageContext, + props, +}) => { + const client = customClient ?? (await getTestClientWithUser()); + return render( + + + + + + + + + + + , + ); +}; + +describe('Poll', () => { + it('renders default poll UI', async () => { + const pollData = generatePoll(); + const poll = new PollClass({ client: {}, poll: pollData }); + const { container } = await renderComponent({ + props: { poll }, + }); + expect(container.querySelector(POLL_HEADER__CLASS)).toBeInTheDocument(); + expect(container.querySelector(POLL_OPTION_LIST__CLASS)).toBeInTheDocument(); + expect(container.querySelector(POLL_ACTIONS__CLASS)).toBeInTheDocument(); + }); + it('renders custom PollActions', async () => { + const pollData = generatePoll(); + const poll = new PollClass({ client: {}, poll: pollData }); + const testId = 'custom-poll-actions'; + const CustomPollActions = () =>
; + const { container } = await renderComponent({ + componentContext: { PollActions: CustomPollActions }, + props: { poll }, + }); + expect(screen.getByTestId(testId)).toBeInTheDocument(); + expect(container.querySelector(POLL_HEADER__CLASS)).toBeInTheDocument(); + expect(container.querySelector(POLL_OPTION_LIST__CLASS)).toBeInTheDocument(); + expect(container.querySelector(POLL_ACTIONS__CLASS)).not.toBeInTheDocument(); + }); + + it('renders quoted version', async () => { + const pollData = generatePoll(); + const poll = new PollClass({ client: {}, poll: pollData }); + const { container } = await renderComponent({ + props: { isQuoted: true, poll }, + }); + expect(container.querySelector(QUOTED_POLL__CLASS)).toBeInTheDocument(); + expect(container.querySelector(POLL_HEADER__CLASS)).not.toBeInTheDocument(); + expect(container.querySelector(POLL_OPTION_LIST__CLASS)).not.toBeInTheDocument(); + expect(container.querySelector(POLL_ACTIONS__CLASS)).not.toBeInTheDocument(); + }); +}); diff --git a/src/components/Poll/index.ts b/src/components/Poll/index.ts index 7de72b57d4..c98ed34a43 100644 --- a/src/components/Poll/index.ts +++ b/src/components/Poll/index.ts @@ -2,5 +2,7 @@ export * from './Poll'; export * from './PollActions'; export * from './PollCreationDialog'; export * from './PollHeader'; +export * from './PollOptionList'; export * from './PollOptionSelector'; export * from './PollVote'; +export * from './hooks'; diff --git a/src/context/ComponentContext.tsx b/src/context/ComponentContext.tsx index f4dfba331e..fddbfab848 100644 --- a/src/context/ComponentContext.tsx +++ b/src/context/ComponentContext.tsx @@ -138,6 +138,8 @@ export type ComponentContextValue< PinIndicator?: React.ComponentType>; /** Custom UI component to override default poll rendering in a message, defaults to and accepts same props as: [Poll](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Poll/Poll.tsx) */ Poll?: React.ComponentType; + /** Custom UI component to override default poll actioons rendering in a message, defaults to and accepts same props as: [PollActions](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Poll/PollActions/PollActions.tsx) */ + PollActions?: React.ComponentType; /** Custom UI component to override default poll rendering in a message, defaults to and accepts same props as: [Poll](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Poll/PollCreationDialog.tsx) */ PollCreationDialog?: React.ComponentType; /** Custom UI component to override quoted message UI on a sent message, defaults to and accepts same props as: [QuotedMessage](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Message/QuotedMessage.tsx) */ From a74a39b576a12c11aaa4176a2f8350ccda07d1cf Mon Sep 17 00:00:00 2001 From: martincupela Date: Thu, 31 Oct 2024 18:20:19 +0100 Subject: [PATCH 55/71] feat: turn off autocomplete on forms --- src/components/Dialog/FormDialog.tsx | 2 +- src/components/MessageInput/EditMessageForm.tsx | 2 +- src/components/Poll/PollCreationDialog/PollCreationDialog.tsx | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/Dialog/FormDialog.tsx b/src/components/Dialog/FormDialog.tsx index 50a9411475..fe224dda6c 100644 --- a/src/components/Dialog/FormDialog.tsx +++ b/src/components/Dialog/FormDialog.tsx @@ -108,7 +108,7 @@ export const FormDialog = <
{title &&
{title}
} - + {Object.entries(fields).map(([id, fieldConfig]) => (
{fieldConfig.label && ( diff --git a/src/components/MessageInput/EditMessageForm.tsx b/src/components/MessageInput/EditMessageForm.tsx index 847e730534..34ad16fee8 100644 --- a/src/components/MessageInput/EditMessageForm.tsx +++ b/src/components/MessageInput/EditMessageForm.tsx @@ -25,7 +25,7 @@ export const EditMessageForm = < }, [clearEditingState]); return ( - +
- - - + + + {ModalContent && }
diff --git a/src/components/MessageInput/__tests__/AttachmentSelector.test.js b/src/components/MessageInput/__tests__/AttachmentSelector.test.js index c1917b8d05..ecabcfcc35 100644 --- a/src/components/MessageInput/__tests__/AttachmentSelector.test.js +++ b/src/components/MessageInput/__tests__/AttachmentSelector.test.js @@ -151,11 +151,9 @@ describe('AttachmentSelector', () => { it('renders custom menu actions if provided', async () => { const customText = 'Custom text'; - const CustomItem = () =>
{customText}
; + const ActionButton = () =>
{customText}
; const CustomAttachmentSelector = () => ( - + ); await renderComponent({ componentContext: { AttachmentSelector: CustomAttachmentSelector } }); await invokeMenu(); @@ -166,6 +164,62 @@ describe('AttachmentSelector', () => { expect(menu).not.toHaveTextContent('Poll'); }); + it('renders custom modal content if provided', async () => { + const buttonText = 'Custom text'; + const modalText = 'Modal text'; + const ActionButton = ({ closeMenu, openModalForAction }) => ( +
{ + openModalForAction('custom'); + closeMenu(); + }} + > + {buttonText} +
+ ); + const ModalContent = ({ close }) =>
{modalText}
; + const CustomAttachmentSelector = () => ( + + ); + await renderComponent({ componentContext: { AttachmentSelector: CustomAttachmentSelector } }); + await invokeMenu(); + act(() => { + fireEvent.click(screen.getByText(buttonText)); + }); + await waitFor(() => { + expect(screen.getByText(modalText)).toBeInTheDocument(); + }); + + act(() => { + fireEvent.click(screen.getByText(modalText)); + }); + + await waitFor(() => { + expect(screen.queryByText(modalText)).not.toBeInTheDocument(); + expect( + screen.queryByTestId(ATTACHMENT_SELECTOR__ACTIONS_MENU_TEST_ID), + ).not.toBeInTheDocument(); + }); + }); + + it('allows to customize the portal destination', async () => { + const getModalPortalDestination = jest.fn(); + const CustomAttachmentSelector = () => ( + + ); + await renderComponent({ componentContext: { AttachmentSelector: CustomAttachmentSelector } }); + await invokeMenu(); + act(() => { + fireEvent.click(screen.getByText('Poll')); + }); + + await waitFor(() => { + expect(getModalPortalDestination).toHaveBeenCalledWith(); + }); + }); + it('allows to override PollCreationDialog', async () => { const testId = 'custom-poll-creation-dialog'; const CustomPollCreationDialog = () =>
; diff --git a/src/components/Poll/PollCreationDialog/PollCreationDialog.tsx b/src/components/Poll/PollCreationDialog/PollCreationDialog.tsx index c3ab99b678..3750b2befc 100644 --- a/src/components/Poll/PollCreationDialog/PollCreationDialog.tsx +++ b/src/components/Poll/PollCreationDialog/PollCreationDialog.tsx @@ -18,7 +18,7 @@ export type PollCreationDialogProps = { export const PollCreationDialog = ({ close }: PollCreationDialogProps) => { const { client } = useChatContext(); - const { t } = useTranslationContext('PollCreationDialog'); + const { t } = useTranslationContext(); const [nameError, setNameError] = useState(); const [optionsErrors, setOptionsErrors] = useState({}); diff --git a/src/context/AttachmentSelectorContext.tsx b/src/context/AttachmentSelectorContext.tsx index 0e78e74f01..22991e98ae 100644 --- a/src/context/AttachmentSelectorContext.tsx +++ b/src/context/AttachmentSelectorContext.tsx @@ -2,12 +2,10 @@ import React, { createContext, PropsWithChildren, useContext } from 'react'; export type AttachmentSelectorContextValue = { fileInput: HTMLInputElement | null; - openPollModal: () => void; }; const AttachmentSelectorContext = createContext({ fileInput: null, - openPollModal: () => null, }); export const AttachmentSelectorContextProvider = ({ From 7c44c39b7cbdc8dd8c5bb50fad7ea374ff0cbf9f Mon Sep 17 00:00:00 2001 From: martincupela Date: Thu, 31 Oct 2024 23:47:36 +0100 Subject: [PATCH 58/71] feat: allow to customize PollHeader, PollOptionSelector, QuotedPoll --- src/components/Channel/Channel.tsx | 9 +++++ src/components/Poll/Poll.tsx | 45 ++++++--------------- src/components/Poll/PollOptionList.tsx | 9 +++-- src/components/Poll/QuotedPoll.tsx | 34 ++++++++++++++++ src/components/Poll/__tests__/Poll.test.js | 46 ++++++++++++++++++++++ src/components/Poll/index.ts | 1 + src/context/ComponentContext.tsx | 11 +++++- 7 files changed, 117 insertions(+), 38 deletions(-) create mode 100644 src/components/Poll/QuotedPoll.tsx diff --git a/src/components/Channel/Channel.tsx b/src/components/Channel/Channel.tsx index 964fa374d7..b78fea01f7 100644 --- a/src/components/Channel/Channel.tsx +++ b/src/components/Channel/Channel.tsx @@ -142,8 +142,11 @@ type ChannelPropsForwardedToComponentContext< | 'Poll' | 'PollActions' | 'PollCreationDialog' + | 'PollHeader' + | 'PollOptionSelector' | 'QuotedMessage' | 'QuotedMessagePreview' + | 'QuotedPoll' | 'reactionOptions' | 'ReactionSelector' | 'ReactionsList' @@ -1260,8 +1263,11 @@ const ChannelInner = < Poll: props.Poll, PollActions: props.PollActions, PollCreationDialog: props.PollCreationDialog, + PollHeader: props.PollHeader, + PollOptionSelector: props.PollOptionSelector, QuotedMessage: props.QuotedMessage, QuotedMessagePreview: props.QuotedMessagePreview, + QuotedPoll: props.QuotedPoll, reactionOptions: props.reactionOptions, ReactionSelector: props.ReactionSelector, ReactionsList: props.ReactionsList, @@ -1315,8 +1321,11 @@ const ChannelInner = < props.Poll, props.PollActions, props.PollCreationDialog, + props.PollHeader, + props.PollOptionSelector, props.QuotedMessage, props.QuotedMessagePreview, + props.QuotedPoll, props.ReactionSelector, props.ReactionsList, props.SendButton, diff --git a/src/components/Poll/Poll.tsx b/src/components/Poll/Poll.tsx index a85d7ab79c..7271ad8980 100644 --- a/src/components/Poll/Poll.tsx +++ b/src/components/Poll/Poll.tsx @@ -1,43 +1,15 @@ import clsx from 'clsx'; import React from 'react'; import { PollActions as DefaultPollActions } from './PollActions'; -import { PollHeader } from './PollHeader'; +import { PollHeader as DefaulPollHeader } from './PollHeader'; import { PollOptionList } from './PollOptionList'; +import { QuotedPoll as DefaultQuotedPoll } from './QuotedPoll'; import { MAX_OPTIONS_DISPLAYED } from './constants'; import { useStateStore } from '../../store'; import { PollProvider, useComponentContext, usePollContext } from '../../context'; import type { Poll as PollClass, PollState } from 'stream-chat'; import type { DefaultStreamChatGenerics } from '../../types'; -type PollStateSelectorQuotedPollReturnValue = { is_closed: boolean | undefined; name: string }; - -const pollStateSelectorQuotedPoll = < - StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics ->( - nextValue: PollState, -): PollStateSelectorQuotedPollReturnValue => ({ - is_closed: nextValue.is_closed, - name: nextValue.name, -}); - -export const QuotedPoll = < - StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics ->() => { - const { poll } = usePollContext(); - const { is_closed, name } = useStateStore(poll.state, pollStateSelectorQuotedPoll); - - return ( -
-
📊
-
{name}
-
- ); -}; - type PollStateSelectorPollUIReturnValue = { is_closed: boolean | undefined }; const pollStateSelectorPollUI = < StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics @@ -48,7 +20,10 @@ const pollStateSelectorPollUI = < const PollUI = < StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics >() => { - const { PollActions = DefaultPollActions } = useComponentContext(); + const { + PollHeader = DefaulPollHeader, + PollActions = DefaultPollActions, + } = useComponentContext(); const { poll } = usePollContext(); const { is_closed } = useStateStore(poll.state, pollStateSelectorPollUI); @@ -69,5 +44,9 @@ export const Poll = < }: { poll: PollClass; isQuoted?: boolean; -}) => - poll ? {isQuoted ? : } : null; +}) => { + const { QuotedPoll = DefaultQuotedPoll } = useComponentContext(); + return poll ? ( + {isQuoted ? : } + ) : null; +}; diff --git a/src/components/Poll/PollOptionList.tsx b/src/components/Poll/PollOptionList.tsx index 7e682c2573..16c816420b 100644 --- a/src/components/Poll/PollOptionList.tsx +++ b/src/components/Poll/PollOptionList.tsx @@ -1,10 +1,10 @@ import clsx from 'clsx'; import React from 'react'; -import { PollOptionSelector } from './PollOptionSelector'; +import { PollOptionSelector as DefaultPollOptionSelector } from './PollOptionSelector'; +import { useStateStore } from '../../store'; +import { useComponentContext, usePollContext } from '../../context'; import type { PollOption, PollState } from 'stream-chat'; import type { DefaultStreamChatGenerics } from '../../types'; -import { usePollContext } from '../../context'; -import { useStateStore } from '../../store'; type PollStateSelectorReturnValue< StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics @@ -25,6 +25,9 @@ export const PollOptionList = < >({ optionsDisplayCount, }: PollOptionListProps) => { + const { + PollOptionSelector = DefaultPollOptionSelector, + } = useComponentContext(); const { poll } = usePollContext(); const { options } = useStateStore(poll.state, pollStateSelector); diff --git a/src/components/Poll/QuotedPoll.tsx b/src/components/Poll/QuotedPoll.tsx new file mode 100644 index 0000000000..e995c6fa01 --- /dev/null +++ b/src/components/Poll/QuotedPoll.tsx @@ -0,0 +1,34 @@ +import clsx from 'clsx'; +import React from 'react'; +import { usePollContext } from '../../context'; +import { useStateStore } from '../../store'; +import type { PollState } from 'stream-chat'; +import type { DefaultStreamChatGenerics } from '../../types'; + +type PollStateSelectorQuotedPollReturnValue = { is_closed: boolean | undefined; name: string }; +const pollStateSelectorQuotedPoll = < + StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics +>( + nextValue: PollState, +): PollStateSelectorQuotedPollReturnValue => ({ + is_closed: nextValue.is_closed, + name: nextValue.name, +}); + +export const QuotedPoll = < + StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics +>() => { + const { poll } = usePollContext(); + const { is_closed, name } = useStateStore(poll.state, pollStateSelectorQuotedPoll); + + return ( +
+
📊
+
{name}
+
+ ); +}; diff --git a/src/components/Poll/__tests__/Poll.test.js b/src/components/Poll/__tests__/Poll.test.js index e2769c8a0b..580c32e581 100644 --- a/src/components/Poll/__tests__/Poll.test.js +++ b/src/components/Poll/__tests__/Poll.test.js @@ -87,4 +87,50 @@ describe('Poll', () => { expect(container.querySelector(POLL_OPTION_LIST__CLASS)).not.toBeInTheDocument(); expect(container.querySelector(POLL_ACTIONS__CLASS)).not.toBeInTheDocument(); }); + + it('allows to override the quoted version', async () => { + const testId = 'custom-quoted-poll'; + const QuotedPoll = () =>
; + const pollData = generatePoll(); + const poll = new PollClass({ client: {}, poll: pollData }); + const { container } = await renderComponent({ + componentContext: { QuotedPoll }, + props: { isQuoted: true, poll }, + }); + expect(screen.getByTestId(testId)).toBeInTheDocument(); + expect(container.querySelector(QUOTED_POLL__CLASS)).not.toBeInTheDocument(); + expect(container.querySelector(POLL_HEADER__CLASS)).not.toBeInTheDocument(); + expect(container.querySelector(POLL_OPTION_LIST__CLASS)).not.toBeInTheDocument(); + expect(container.querySelector(POLL_ACTIONS__CLASS)).not.toBeInTheDocument(); + }); + + it('allows to override the header', async () => { + const testId = 'custom-poll-header'; + const PollHeader = () =>
; + const pollData = generatePoll(); + const poll = new PollClass({ client: {}, poll: pollData }); + const { container } = await renderComponent({ + componentContext: { PollHeader }, + props: { poll }, + }); + expect(container.querySelector(POLL_HEADER__CLASS)).not.toBeInTheDocument(); + expect(screen.getByTestId(testId)).toBeInTheDocument(); + expect(container.querySelector(POLL_OPTION_LIST__CLASS)).toBeInTheDocument(); + expect(container.querySelector(POLL_ACTIONS__CLASS)).toBeInTheDocument(); + }); + + it('allows to override the poll option selector', async () => { + const testId = 'custom-poll-option-selector'; + const PollOptionSelector = () =>
; + const pollData = generatePoll(); + const poll = new PollClass({ client: {}, poll: pollData }); + const { container } = await renderComponent({ + componentContext: { PollOptionSelector }, + props: { poll }, + }); + expect(screen.getAllByTestId(testId)).toHaveLength(pollData.options.length); + expect(container.querySelector(POLL_HEADER__CLASS)).toBeInTheDocument(); + expect(container.querySelector(POLL_OPTION_LIST__CLASS)).toBeInTheDocument(); + expect(container.querySelector(POLL_ACTIONS__CLASS)).toBeInTheDocument(); + }); }); diff --git a/src/components/Poll/index.ts b/src/components/Poll/index.ts index c98ed34a43..46d8cb6275 100644 --- a/src/components/Poll/index.ts +++ b/src/components/Poll/index.ts @@ -5,4 +5,5 @@ export * from './PollHeader'; export * from './PollOptionList'; export * from './PollOptionSelector'; export * from './PollVote'; +export * from './QuotedPoll'; export * from './hooks'; diff --git a/src/context/ComponentContext.tsx b/src/context/ComponentContext.tsx index fddbfab848..c3a783b6e8 100644 --- a/src/context/ComponentContext.tsx +++ b/src/context/ComponentContext.tsx @@ -1,6 +1,6 @@ import React, { PropsWithChildren, useContext } from 'react'; -import type { +import { AttachmentPreviewListProps, AttachmentProps, AvatarProps, @@ -29,6 +29,7 @@ import type { ModalGalleryProps, PinIndicatorProps, PollCreationDialogProps, + PollOptionSelectorProps, QuotedMessagePreviewProps, ReactionOptions, ReactionSelectorProps, @@ -140,12 +141,18 @@ export type ComponentContextValue< Poll?: React.ComponentType; /** Custom UI component to override default poll actioons rendering in a message, defaults to and accepts same props as: [PollActions](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Poll/PollActions/PollActions.tsx) */ PollActions?: React.ComponentType; - /** Custom UI component to override default poll rendering in a message, defaults to and accepts same props as: [Poll](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Poll/PollCreationDialog.tsx) */ + /** Custom UI component to override default poll creation dialog contents, defaults to and accepts same props as: [PollCreationDialog](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Poll/PollCreationDialog/PollCreationDialog.tsx) */ PollCreationDialog?: React.ComponentType; + /** Custom UI component to override default poll header in a message, defaults to and accepts same props as: [PollHeader](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Poll/PollHeader.tsx) */ + PollHeader?: React.ComponentType; + /** Custom UI component to override default poll option selector, defaults to and accepts same props as: [PollOptionSelector](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Poll/PollOptionSelector.tsx) */ + PollOptionSelector?: React.ComponentType>; /** Custom UI component to override quoted message UI on a sent message, defaults to and accepts same props as: [QuotedMessage](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Message/QuotedMessage.tsx) */ QuotedMessage?: React.ComponentType; /** Custom UI component to override the message input's quoted message preview, defaults to and accepts same props as: [QuotedMessagePreview](https://github.com/GetStream/stream-chat-react/blob/master/src/components/MessageInput/QuotedMessagePreview.tsx) */ QuotedMessagePreview?: React.ComponentType>; + /** Custom UI component to override the rendering of quoted poll, defaults to and accepts same props as: [QuotedPoll](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Poll/Poll.tsx) */ + QuotedPoll?: React.ComponentType; /** Custom reaction options to be applied to ReactionSelector, ReactionList and SimpleReactionList components */ reactionOptions?: ReactionOptions; /** Custom UI component to display the reaction selector, defaults to and accepts same props as: [ReactionSelector](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Reactions/ReactionSelector.tsx) */ From 5da765b10bf2062ca28ca67d62a63d9d7522cb97 Mon Sep 17 00:00:00 2001 From: martincupela Date: Fri, 1 Nov 2024 00:16:59 +0100 Subject: [PATCH 59/71] refactor: make customizable the poll content, not the whole Poll component --- src/components/Channel/Channel.tsx | 6 +-- src/components/Message/MessageSimple.tsx | 3 +- src/components/Message/QuotedMessage.tsx | 3 +- .../Message/__tests__/QuotedMessage.test.js | 4 +- .../MessageInput/QuotedMessagePreview.tsx | 3 +- .../__tests__/MessageInput.test.js | 4 +- src/components/Poll/Poll.tsx | 44 ++++--------------- src/components/Poll/PollContent.tsx | 35 +++++++++++++++ src/components/Poll/__tests__/Poll.test.js | 15 +++++++ src/components/Poll/index.ts | 1 + src/context/ComponentContext.tsx | 6 +-- 11 files changed, 72 insertions(+), 52 deletions(-) create mode 100644 src/components/Poll/PollContent.tsx diff --git a/src/components/Channel/Channel.tsx b/src/components/Channel/Channel.tsx index b78fea01f7..419663eed6 100644 --- a/src/components/Channel/Channel.tsx +++ b/src/components/Channel/Channel.tsx @@ -139,8 +139,8 @@ type ChannelPropsForwardedToComponentContext< | 'MessageTimestamp' | 'ModalGallery' | 'PinIndicator' - | 'Poll' | 'PollActions' + | 'PollContent' | 'PollCreationDialog' | 'PollHeader' | 'PollOptionSelector' @@ -1260,8 +1260,8 @@ const ChannelInner = < MessageTimestamp: props.MessageTimestamp, ModalGallery: props.ModalGallery, PinIndicator: props.PinIndicator, - Poll: props.Poll, PollActions: props.PollActions, + PollContent: props.PollContent, PollCreationDialog: props.PollCreationDialog, PollHeader: props.PollHeader, PollOptionSelector: props.PollOptionSelector, @@ -1318,8 +1318,8 @@ const ChannelInner = < props.MessageTimestamp, props.ModalGallery, props.PinIndicator, - props.Poll, props.PollActions, + props.PollContent, props.PollCreationDialog, props.PollHeader, props.PollOptionSelector, diff --git a/src/components/Message/MessageSimple.tsx b/src/components/Message/MessageSimple.tsx index 4d4887d89d..9d08785e17 100644 --- a/src/components/Message/MessageSimple.tsx +++ b/src/components/Message/MessageSimple.tsx @@ -23,7 +23,7 @@ import { CUSTOM_MESSAGE_TYPE } from '../../constants/messageTypes'; import { EditMessageForm as DefaultEditMessageForm, MessageInput } from '../MessageInput'; import { MML } from '../MML'; import { Modal } from '../Modal'; -import { Poll as DefaultPoll } from '../Poll'; +import { Poll } from '../Poll'; import { ReactionsList as DefaultReactionList } from '../Reactions'; import { MessageBounceModal } from '../MessageBounce/MessageBounceModal'; import { useComponentContext } from '../../context/ComponentContext'; @@ -80,7 +80,6 @@ const MessageSimpleWithContext = < MessageRepliesCountButton = DefaultMessageRepliesCountButton, MessageStatus = DefaultMessageStatus, MessageTimestamp = DefaultMessageTimestamp, - Poll = DefaultPoll, ReactionsList = DefaultReactionList, PinIndicator, } = useComponentContext('MessageSimple'); diff --git a/src/components/Message/QuotedMessage.tsx b/src/components/Message/QuotedMessage.tsx index 4bb629e347..22c680355d 100644 --- a/src/components/Message/QuotedMessage.tsx +++ b/src/components/Message/QuotedMessage.tsx @@ -3,7 +3,7 @@ import clsx from 'clsx'; import { Attachment as DefaultAttachment } from '../Attachment'; import { Avatar as DefaultAvatar } from '../Avatar'; -import { Poll as DefaultPoll } from '../Poll'; +import { Poll } from '../Poll'; import { useChatContext } from '../../context/ChatContext'; import { useComponentContext } from '../../context/ComponentContext'; @@ -21,7 +21,6 @@ export const QuotedMessage = < const { Attachment = DefaultAttachment, Avatar: ContextAvatar, - Poll = DefaultPoll, } = useComponentContext('QuotedMessage'); const { client } = useChatContext(); const { isMyMessage, message } = useMessageContext('QuotedMessage'); diff --git a/src/components/Message/__tests__/QuotedMessage.test.js b/src/components/Message/__tests__/QuotedMessage.test.js index a82224ecb6..e41aa9f906 100644 --- a/src/components/Message/__tests__/QuotedMessage.test.js +++ b/src/components/Message/__tests__/QuotedMessage.test.js @@ -228,10 +228,10 @@ describe('QuotedMessage', () => { customUser: alice, }); const pollText = 'Custom Poll component'; - const Poll = () =>
{pollText}
; + const QuotedPoll = () =>
{pollText}
; await renderQuotedMessage({ - componentContext: { Poll }, + componentContext: { QuotedPoll }, customChannel: channel, customClient: client, customProps: { message: quotingMessage }, diff --git a/src/components/MessageInput/QuotedMessagePreview.tsx b/src/components/MessageInput/QuotedMessagePreview.tsx index f22c072b96..6f45849fb9 100644 --- a/src/components/MessageInput/QuotedMessagePreview.tsx +++ b/src/components/MessageInput/QuotedMessagePreview.tsx @@ -3,7 +3,7 @@ import React, { useMemo } from 'react'; import { CloseIcon } from './icons'; import { Attachment as DefaultAttachment } from '../Attachment'; import { Avatar as DefaultAvatar } from '../Avatar'; -import { Poll as DefaultPoll } from '../Poll'; +import { Poll } from '../Poll'; import { useChatContext } from '../../context/ChatContext'; import { useChannelActionContext } from '../../context/ChannelActionContext'; @@ -51,7 +51,6 @@ export const QuotedMessagePreview = < const { Attachment = DefaultAttachment, Avatar = DefaultAvatar, - Poll = DefaultPoll, } = useComponentContext('QuotedMessagePreview'); const { userLanguage } = useTranslationContext('QuotedMessagePreview'); diff --git a/src/components/MessageInput/__tests__/MessageInput.test.js b/src/components/MessageInput/__tests__/MessageInput.test.js index a6a47d17c7..9e72d2d438 100644 --- a/src/components/MessageInput/__tests__/MessageInput.test.js +++ b/src/components/MessageInput/__tests__/MessageInput.test.js @@ -1497,10 +1497,10 @@ describe(`MessageInputFlat only`, () => { channelsData: [{ messages: [messageWithPoll] }], }); const pollText = 'Custom Poll component'; - const Poll = () =>
{pollText}
; + const QuotedPoll = () =>
{pollText}
; await renderComponent({ - channelProps: { Poll }, + channelProps: { QuotedPoll }, customChannel: channel, customClient: client, messageContextOverrides: { ...defaultMessageContextValue, message: messageWithPoll }, diff --git a/src/components/Poll/Poll.tsx b/src/components/Poll/Poll.tsx index 7271ad8980..55dcbb058a 100644 --- a/src/components/Poll/Poll.tsx +++ b/src/components/Poll/Poll.tsx @@ -1,41 +1,10 @@ -import clsx from 'clsx'; import React from 'react'; -import { PollActions as DefaultPollActions } from './PollActions'; -import { PollHeader as DefaulPollHeader } from './PollHeader'; -import { PollOptionList } from './PollOptionList'; +import { PollContent as DefaultPollContent } from './PollContent'; import { QuotedPoll as DefaultQuotedPoll } from './QuotedPoll'; -import { MAX_OPTIONS_DISPLAYED } from './constants'; -import { useStateStore } from '../../store'; -import { PollProvider, useComponentContext, usePollContext } from '../../context'; -import type { Poll as PollClass, PollState } from 'stream-chat'; +import { PollProvider, useComponentContext } from '../../context'; +import type { Poll as PollClass } from 'stream-chat'; import type { DefaultStreamChatGenerics } from '../../types'; -type PollStateSelectorPollUIReturnValue = { is_closed: boolean | undefined }; -const pollStateSelectorPollUI = < - StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics ->( - nextValue: PollState, -): PollStateSelectorPollUIReturnValue => ({ is_closed: nextValue.is_closed }); - -const PollUI = < - StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics ->() => { - const { - PollHeader = DefaulPollHeader, - PollActions = DefaultPollActions, - } = useComponentContext(); - const { poll } = usePollContext(); - const { is_closed } = useStateStore(poll.state, pollStateSelectorPollUI); - - return ( -
- - - -
- ); -}; - export const Poll = < StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics >({ @@ -45,8 +14,11 @@ export const Poll = < poll: PollClass; isQuoted?: boolean; }) => { - const { QuotedPoll = DefaultQuotedPoll } = useComponentContext(); + const { + PollContent = DefaultPollContent, + QuotedPoll = DefaultQuotedPoll, + } = useComponentContext(); return poll ? ( - {isQuoted ? : } + {isQuoted ? : } ) : null; }; diff --git a/src/components/Poll/PollContent.tsx b/src/components/Poll/PollContent.tsx new file mode 100644 index 0000000000..7d1cc35d2e --- /dev/null +++ b/src/components/Poll/PollContent.tsx @@ -0,0 +1,35 @@ +import type { DefaultStreamChatGenerics } from '../../types'; +import type { PollState } from '../../../../stream-chat-js'; +import { PollHeader as DefaulPollHeader } from './PollHeader'; +import { PollActions as DefaultPollActions } from './PollActions'; +import { useComponentContext, usePollContext } from '../../context'; +import { useStateStore } from '../../store'; +import clsx from 'clsx'; +import { PollOptionList } from './PollOptionList'; +import { MAX_OPTIONS_DISPLAYED } from './constants'; +import React from 'react'; + +type PollStateSelectorPollContentReturnValue = { is_closed: boolean | undefined }; +const pollStateSelectorPollContent = < + StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics +>( + nextValue: PollState, +): PollStateSelectorPollContentReturnValue => ({ is_closed: nextValue.is_closed }); +export const PollContent = < + StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics +>() => { + const { + PollHeader = DefaulPollHeader, + PollActions = DefaultPollActions, + } = useComponentContext(); + const { poll } = usePollContext(); + const { is_closed } = useStateStore(poll.state, pollStateSelectorPollContent); + + return ( +
+ + + +
+ ); +}; diff --git a/src/components/Poll/__tests__/Poll.test.js b/src/components/Poll/__tests__/Poll.test.js index 580c32e581..be2d369813 100644 --- a/src/components/Poll/__tests__/Poll.test.js +++ b/src/components/Poll/__tests__/Poll.test.js @@ -133,4 +133,19 @@ describe('Poll', () => { expect(container.querySelector(POLL_OPTION_LIST__CLASS)).toBeInTheDocument(); expect(container.querySelector(POLL_ACTIONS__CLASS)).toBeInTheDocument(); }); + + it('allows to override the poll content', async () => { + const testId = 'custom-poll-content'; + const PollContent = () =>
; + const pollData = generatePoll(); + const poll = new PollClass({ client: {}, poll: pollData }); + const { container } = await renderComponent({ + componentContext: { PollContent }, + props: { poll }, + }); + expect(screen.getByTestId(testId)).toBeInTheDocument(); + expect(container.querySelector(POLL_HEADER__CLASS)).not.toBeInTheDocument(); + expect(container.querySelector(POLL_OPTION_LIST__CLASS)).not.toBeInTheDocument(); + expect(container.querySelector(POLL_ACTIONS__CLASS)).not.toBeInTheDocument(); + }); }); diff --git a/src/components/Poll/index.ts b/src/components/Poll/index.ts index 46d8cb6275..ce7769016d 100644 --- a/src/components/Poll/index.ts +++ b/src/components/Poll/index.ts @@ -1,5 +1,6 @@ export * from './Poll'; export * from './PollActions'; +export * from './PollContent'; export * from './PollCreationDialog'; export * from './PollHeader'; export * from './PollOptionList'; diff --git a/src/context/ComponentContext.tsx b/src/context/ComponentContext.tsx index c3a783b6e8..65d8df7b3c 100644 --- a/src/context/ComponentContext.tsx +++ b/src/context/ComponentContext.tsx @@ -137,10 +137,10 @@ export type ComponentContextValue< ModalGallery?: React.ComponentType; /** Custom UI component to override default pinned message indicator, defaults to and accepts same props as: [PinIndicator](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Message/icons.tsx) */ PinIndicator?: React.ComponentType>; - /** Custom UI component to override default poll rendering in a message, defaults to and accepts same props as: [Poll](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Poll/Poll.tsx) */ - Poll?: React.ComponentType; - /** Custom UI component to override default poll actioons rendering in a message, defaults to and accepts same props as: [PollActions](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Poll/PollActions/PollActions.tsx) */ + /** Custom UI component to override default poll actions rendering in a message, defaults to and accepts same props as: [PollActions](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Poll/PollActions/PollActions.tsx) */ PollActions?: React.ComponentType; + /** Custom UI component to override default poll rendering in a message, defaults to and accepts same props as: [PollContent](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Poll/PollContent.tsx) */ + PollContent?: React.ComponentType; /** Custom UI component to override default poll creation dialog contents, defaults to and accepts same props as: [PollCreationDialog](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Poll/PollCreationDialog/PollCreationDialog.tsx) */ PollCreationDialog?: React.ComponentType; /** Custom UI component to override default poll header in a message, defaults to and accepts same props as: [PollHeader](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Poll/PollHeader.tsx) */ From 5d29296a4ea7759a20e06e1aedcd8aa82fc7bd1c Mon Sep 17 00:00:00 2001 From: martincupela Date: Fri, 1 Nov 2024 00:17:44 +0100 Subject: [PATCH 60/71] fix: do not assign default poll creation dialog twice --- src/components/MessageInput/AttachmentSelector.tsx | 1 - .../MessageInput/__tests__/AttachmentSelector.test.js | 8 ++++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/components/MessageInput/AttachmentSelector.tsx b/src/components/MessageInput/AttachmentSelector.tsx index b4d1ade8fd..1fc7a935cd 100644 --- a/src/components/MessageInput/AttachmentSelector.tsx +++ b/src/components/MessageInput/AttachmentSelector.tsx @@ -122,7 +122,6 @@ export const defaultAttachmentSelectorActionSet: AttachmentSelectorAction[] = [ { ActionButton: DefaultAttachmentSelectorComponents.File, type: 'uploadFile' }, { ActionButton: DefaultAttachmentSelectorComponents.Poll, - ModalContent: DefaultPollCreationDialog, type: 'createPoll', }, ]; diff --git a/src/components/MessageInput/__tests__/AttachmentSelector.test.js b/src/components/MessageInput/__tests__/AttachmentSelector.test.js index ecabcfcc35..77cad06bf2 100644 --- a/src/components/MessageInput/__tests__/AttachmentSelector.test.js +++ b/src/components/MessageInput/__tests__/AttachmentSelector.test.js @@ -227,7 +227,11 @@ describe('AttachmentSelector', () => { await invokeMenu(); const menu = screen.getByTestId(ATTACHMENT_SELECTOR__ACTIONS_MENU_TEST_ID); const createPollButton = menu.querySelector(`.${CREATE_POLL_BUTTON_CLASS}`); - fireEvent.click(createPollButton); - expect(screen.getByTestId(testId)).toBeInTheDocument(); + act(() => { + fireEvent.click(createPollButton); + }); + await waitFor(() => { + expect(screen.getByTestId(testId)).toBeInTheDocument(); + }); }); }); From 817468252c97521fb5a0062a5bf23af197a8f7b6 Mon Sep 17 00:00:00 2001 From: martincupela Date: Fri, 1 Nov 2024 01:30:06 +0100 Subject: [PATCH 61/71] fix: change back the FormDialog submit button text --- src/components/Dialog/FormDialog.tsx | 2 +- src/components/Poll/__tests__/AddCommentForm.test.js | 11 ++++------- .../Poll/__tests__/SuggestPollOptionForm.test.js | 2 +- 3 files changed, 6 insertions(+), 9 deletions(-) diff --git a/src/components/Dialog/FormDialog.tsx b/src/components/Dialog/FormDialog.tsx index fe224dda6c..d9eacd9d37 100644 --- a/src/components/Dialog/FormDialog.tsx +++ b/src/components/Dialog/FormDialog.tsx @@ -143,7 +143,7 @@ export const FormDialog = < onClick={handleSubmit} type='submit' > - {title ?? t('Submit')} + {t('Send')}
diff --git a/src/components/Poll/__tests__/AddCommentForm.test.js b/src/components/Poll/__tests__/AddCommentForm.test.js index 176b75d363..12580a5b0b 100644 --- a/src/components/Poll/__tests__/AddCommentForm.test.js +++ b/src/components/Poll/__tests__/AddCommentForm.test.js @@ -6,9 +6,6 @@ import { AddCommentForm } from '../PollActions'; import { PollProvider, TranslationProvider } from '../../../context'; import { generatePoll } from '../../../mock-builders'; -const ADD_COMMENT_TEXT = 'Add a comment'; -const UPDATE_COMMENT_TEXT = 'Update your comment'; - const close = jest.fn(); const messageId = 'messageId'; const newlyTypedValue = 'XX'; @@ -35,7 +32,7 @@ describe('AddCommentForm', () => { expect(input).toHaveValue(poll.data.ownAnswer.text); const submitButton = container.querySelector('button[type="submit"]'); expect(submitButton).toBeDisabled(); - expect(submitButton).toHaveTextContent(UPDATE_COMMENT_TEXT); + expect(submitButton).toHaveTextContent('Send'); act(() => { fireEvent.change(input, { target: { value: newlyTypedValue } }); @@ -43,7 +40,7 @@ describe('AddCommentForm', () => { await waitFor(() => { expect(submitButton).toBeEnabled(); - expect(submitButton).toHaveTextContent(UPDATE_COMMENT_TEXT); + expect(submitButton).toHaveTextContent('Send'); }); act(() => { @@ -63,13 +60,13 @@ describe('AddCommentForm', () => { expect(input).toHaveValue(''); const submitButton = container.querySelector('button[type="submit"]'); expect(submitButton).toBeDisabled(); - expect(submitButton).toHaveTextContent(ADD_COMMENT_TEXT); + expect(submitButton).toHaveTextContent('Send'); act(() => { fireEvent.change(input, { target: { value: newlyTypedValue } }); }); await waitFor(() => { expect(submitButton).toBeEnabled(); - expect(submitButton).toHaveTextContent(ADD_COMMENT_TEXT); + expect(submitButton).toHaveTextContent('Send'); }); act(() => { fireEvent.click(submitButton); diff --git a/src/components/Poll/__tests__/SuggestPollOptionForm.test.js b/src/components/Poll/__tests__/SuggestPollOptionForm.test.js index 9825231a66..51af83fe34 100644 --- a/src/components/Poll/__tests__/SuggestPollOptionForm.test.js +++ b/src/components/Poll/__tests__/SuggestPollOptionForm.test.js @@ -6,7 +6,7 @@ import { SuggestPollOptionForm } from '../PollActions'; import { ChatProvider, PollProvider, TranslationProvider } from '../../../context'; import { generatePoll } from '../../../mock-builders'; -const SUBMIT_BUTTON_TEXT = 'Suggest an option'; +const SUBMIT_BUTTON_TEXT = 'Send'; const close = jest.fn(); const messageId = 'messageId'; From cd3c25a2bb86f20cc37a9ce2a03a2bd6af33b083 Mon Sep 17 00:00:00 2001 From: martincupela Date: Fri, 1 Nov 2024 01:30:35 +0100 Subject: [PATCH 62/71] docs: add poll documentation --- .../React/assets/add-poll-comment-form.png | Bin 0 -> 39420 bytes ...-channel-type-feature-configuration-ui.png | Bin 0 -> 173040 bytes .../assets/dashboard-roles-permissions-ui.png | Bin 0 -> 287062 bytes .../docs/React/assets/end-poll-dialog.png | Bin 0 -> 30944 bytes .../docs/React/assets/message-with-poll.png | Bin 0 -> 55791 bytes .../docs/React/assets/poll-comment-list.png | Bin 0 -> 139824 bytes .../React/assets/poll-creation-dialog.png | Bin 0 -> 159885 bytes .../React/assets/poll-option-full-list.png | Bin 0 -> 75451 bytes docusaurus/docs/React/assets/poll-results.png | Bin 0 -> 130709 bytes .../React/assets/suggest-poll-option-form.png | Bin 0 -> 35909 bytes .../components/message-components/poll.mdx | 194 ++++++++++++++++++ .../attachment-selector.mdx | 120 +++++++++++ docusaurus/sidebars-react.json | 2 + 13 files changed, 316 insertions(+) create mode 100644 docusaurus/docs/React/assets/add-poll-comment-form.png create mode 100644 docusaurus/docs/React/assets/dashboard-channel-type-feature-configuration-ui.png create mode 100644 docusaurus/docs/React/assets/dashboard-roles-permissions-ui.png create mode 100644 docusaurus/docs/React/assets/end-poll-dialog.png create mode 100644 docusaurus/docs/React/assets/message-with-poll.png create mode 100644 docusaurus/docs/React/assets/poll-comment-list.png create mode 100644 docusaurus/docs/React/assets/poll-creation-dialog.png create mode 100644 docusaurus/docs/React/assets/poll-option-full-list.png create mode 100644 docusaurus/docs/React/assets/poll-results.png create mode 100644 docusaurus/docs/React/assets/suggest-poll-option-form.png create mode 100644 docusaurus/docs/React/components/message-components/poll.mdx create mode 100644 docusaurus/docs/React/components/message-input-components/attachment-selector.mdx diff --git a/docusaurus/docs/React/assets/add-poll-comment-form.png b/docusaurus/docs/React/assets/add-poll-comment-form.png new file mode 100644 index 0000000000000000000000000000000000000000..bed1b19d8480c279f91c7b01b75173353bfe78e8 GIT binary patch literal 39420 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

7&{tXfE7GNi|32t2 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

+vE+cmNDGEF{}GCe@K>+Q45qvuT&b!gpXa)tGU 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 vhfcc=Y4?pnntC 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 YYe7qiI=a1i0sN7Es34Uq@xuH60sbqde*gdg literal 0 HcmV?d00001 diff --git a/docusaurus/docs/React/assets/end-poll-dialog.png b/docusaurus/docs/React/assets/end-poll-dialog.png new file mode 100644 index 0000000000000000000000000000000000000000..bb7647821b19aaf46b155f63145e4537d2f88b48 GIT binary patch literal 30944 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 x?UqJf0BsSawC%+Jqx3dO{&y7NNCo{#_l literal 0 HcmV?d00001 diff --git a/docusaurus/docs/React/assets/message-with-poll.png b/docusaurus/docs/React/assets/message-with-poll.png new file mode 100644 index 0000000000000000000000000000000000000000..54184f88c80cf3d1ca4298bf7608c4d119cec2c4 GIT binary patch literal 55791 zcmeFXb9-gY^DmrCY)x!VFv*T>XJSk^@x->BiEZ1qZQHhO=h<`L-yg2$ynyr1Sy$HX zUfo@d>Z(pve=1l`MhpQK2Nnbb1VKVvSOEkCv=0R2%LX(gu!Q+V*9!y$p5H`BNKQgX zh)B-X%Fx8z00cxlI9>%xRdE<2Ln9_CYU&HLI7~YXiNY6gnCw3rDCYiT{FDrkz9IN( zO4hVRs$BsUA(X11)ufIX{TrBYup=$1RWw!#{EHs@ZnqwGhn=5k&y&e^Mi=d1-Y+l} zs%d_vAW<|UiG7f-Oal~!^y2H@U+DQE;B`j#_k-1@r?){8x*sn0*AcvjR!R{W%e@{x z7juR&_pU+sbBJYj53g;Bc|kz5`q3nBK#4}2Z;PMxumjMIC3U=!0dd>#5EU`o%n%!- zjlq!yLTj+zu<@huzd^Dbv2Vh@XhF`&o%$_F^kIg8$QkjU#inv4BiT^*u}+D?S4(9k zKlsTEY%x({%+XehrI5@i5Lo(FXhUf#^Xq1R00oZt*r@5+GK3R&nl1t?646Y@Wl& z!r=Rh`JejB^qfodkPOSpi+alx5$27FtVA|7^ecAkT((j!|_*4SD?_I-$QniuKvybz3{yI)d^)c*wVPZ1fFv z;s#l+I$3@Yf;bZrVqvkrrNi+cc4;{^y(4)XnkQY&X2W(h3vn0c@po_6z=3v<&uz=h zLJf4`Ep^88*U;9&92-gPUv4#H>Mg$F$O>8er$RO|?#jOupmxNcG2sNUQWLTU! z#wQ4wiV-b2GLCqEi1Rm-g5Q}4BJsEATX85`T$i9bqRMDl$^Zp%;Er@4N4F-GR}A zx@M@(6ec;2J(JkTqeM-NlcgpuCqE~_|E5Xo5Y1auRFYK0UJ72ER}`caqC~CaSc0e6 zoO2_!&!pyOF7ZGn7X7?;yqCXMzGrwtZj1TMBoeD9eO=I}SVMVBX-4S~Hyh^`$5v8O zVpu{@!cZbO-&|s*^jMUk=uz|%T_RGSTT{GStZ;&Q;&=jcVsV0t6K*JSo0~s%VByVO% zyl2WrzVuwf!hx}oNutT+g5~1H?DUMyw8UI;fnu?pQlTQ|Z2ips(ZLbj{Cc6A(Bmw9 zu5OvGuWo3-JVGnuS^I`H4u^ybxEfYA<$x2K*}gYj{|=Z+M@mS-1@LJ6(z2W0H)q&Kl z{cZdK?STgd1qKQR6Rj!jg=!3Kazb)KDea_sM`KOHj~aEIdE-uCpMGL#}1mn@V@diyRw`Ih7yZX_((z@2)kt?msaOaDwPGLl0S6IY2@;o~QVDmov za$9nzS5xwf3~SXx)zjDe;-S%0q=}K-TsNt)rHT==%7v}Db)tVFsBz}GPwH#anI@ZO zo>z=ljMWwp+UD`|nFrTT}bWC&~xcdwAyCN8TwEQ?bW? zjd33eTwOgT?b`J1<`$+JbsX|ecDCWQ)wDahIz(0zkYd$3jOkl3Syen5Udj*#$d*h} zWXfnOYFAj*Uy}0K@pWvnb{c)xP{uIBJk9Tn?d!r5& zHcWTEj~||qT^e$9&IuRkS{WPZ+v(LLx!-2lYDsEUhA=A7I!0iJSCZ~|xv1UT9{6Px zWIQT$%wkH`#?8#{E=$A=8bqa1r0|Z!2)Ocp}}TsE__2 z@lf4TlvBIXHQkwepJgr#E~uAoOzkj!sqM+?*)-f@a%NIDOqobyyWRf2P&Qs0y=+pe zaga1gl`+f0=6n(166dmf>j|)>rUtlj@tJtqRm)$m?F@E;e=2C?D3ee%H+PwJ5Bzx& z-0pc0$;B+!yep5>cFi6uF3UL^)!W#C>x_7D7_S7AoJp($IB2x!V%sDeFNg1Uj5@`c zC157-X`xi-=#uLj9FH`XQj~LQZ!1*Wuo%?aI~=B5u}GWIF3@Sb8fYH0oW_5|-~SBw z8CtSYd05$5(`_ZRE}9!|fXiorYS~iH;cO>V|I?u#V<*9vR<@DClIIoowlT#5a&@G^ zW1VhgqnXrE%q-kZdR(SAUD9k?-Na(D;<}aY5^-r==}@k*S*x+b9BGMk{np*;WCQoL z=b`@0=%SKK$0h58=v~JIY=*u)yON={x|XWBcvtQyJHfE>z%LLV$%;?UHSeZqVmg12 zaxf$k0S~~v;U(yv^Z0vUc#t+${UQU$?L^&7%Ix*HYW8pfJe|WK!QtVFdx zv?pAHZE*9ft-o{LgX{32lncU%cQf5B(z^1lW8ggmDgdeEv+6y!W48SEsMkBtB65dd z-DAw{ZAW4w7NFTLYa&aNk<49s?0CUDgEnXP{M>Y?3FrgxJ|?^sKO4|02B*?;;uHDB^}0^YMebqB=`25U28czIsA@8OO|Qz{#@ zQ#=27w6aBU(Gwl~Xu8n`g;!?g!S`NV1qxVw23Q`iO2r3f)ll`xc+2B8M#p+UewaX=t|IZ)us3yS;S zc~MYG5U_vBzkq-Qnt*`+r;Q9S{rf}#-@i2freHAvAW*gZ5>C{a60W z2Cxo9Kv76S0+=f5+Zq^H+8JBfBXH1j0}EiR#ntRUKrqPvzMv8cWLLoc7fh5??Nz0v zIQ6Y8=yZQu=^4;DTUh_?2ZY<16PUFyu-7GWwlKG}<8;tAA|WeV10q&BdOCU%URWX`B5vE?hMWq*qW>WWe({hP+uK`n0su}griJ*z=H( z{2l1OpMU3R;B4|gBU#%0XIa1n0{+$j80hE$|J^r`l>2Wfr<{qifw`Kni3N~nz%h8) zn3%c$Y5#xJ{LhI0i&FJ}D4AIp|2O6Ts`>v@{O377(f?C%3=1^l7>H~pJ84)IWV z8Uq302aymKP;v%6ONY|=+K)M)P2CPN6RiayAlwo}6runTouk(q(EipR5`vDa2TBt{ z`BNTTNl92K# zI8i8gK)7_wb!}{IQpn>hlzmu2He0_lUy`3&XUbLmTdn(_HP_qwnJmwByzjw7Rf$@O z`hyXpaFaa55O5e{(=~hZW2BTpF82%7Yh+Qc(AMotnwp$lJdcp6el=NF#UQY!_loW88PH1px!K=~4!nSQa?jWz;}`fXO$3SxP3@zj z9@0F|2wwH{lzY=NY9+pGH#(#rxk0ED;6u@HmWj^jxwAM^vfn@RnqujbG4W&sEr+az z4qTG2%vLI&!d|$9gzcW{f$Q%d=%G5Mw@`QNbiPb2^C9XBFi2XePp)so! z5ea&KNCg$>D1LnD01oUCz3qugl+OM69oeE`x_{%p5u(67I0d?zvcw~3`}AB@mWmT#RULH7;q~yQHLTYH@Jy|ihuAj zEEB(I$0*{(#NcG}kx+4-;ziipG`qiG4vvz5q7K!Algyz8&t+0-28YZUN^DMyU^~b3rNY`OU{{~#40^iA%gz?J2@cDJ2+7kL=GvLsMvJh3DUx?;LuOsqJhjb znVv`?nNsMPn^Cx*K?Y=h8*hT^NMI-le8=)5RE_J{J-CbhMI0ni;$IksY&uJ+6z%ix z3O7;s6{&@*qdxlf1P#XI1%#Q7hJ^#urZRuC1|PJJOu_-DN(5>JJ~gRI#wrMVij<;a zCpp9*;E$ZaJkz;y%z+C45zQc8tGEi87Qc<%5XR4FAyspel5cfE3~e=?T>1*irvZCCUlDQ}sp6 z&6<^xSvNb7{D@U4bJjhw^&L16G!^(Ut1p$8p=es&P*ZMYBeO1f{3D`v)3Bl?!4t;XCXB0eFrM`qm5bTjIYm;x0m@kSZ%#LTRXysV5GOvXOUPs4(wC zp}mf)1^-t}qWD?Sy4;J%VMPo>A5EqpPn5XwXlj}l=(+yc$U<;>vfR7}ssPtC zy(tI=t$ySPX83;@NrwFWi**%Mb`I7EvXX#s=XP}L9VNm(g8s_idgKUjqCfetfem~N z#=b!e0fDjwCyj8u*UHx^5=y6nJnGV4!p#07 zeyBs<{Qjo8%Q?}$#p}N4HDp0a(U45D^nZE%m)(wN&=1IA-(hx$)8h}~CS-d5QBNSd zmZh`g%2-oR&RDu(lQD$xT`6B9^I_Yhu>T!boTwE>XCS4fpF|{G#t)T|HmEQb-}Z{V zyfM8vUo63Q zBJdJo@+WLo2N6DDwrb@>?j^Chp_4KC*xx~}uKjhs`j|v@seRFCG><{49Tsylw4io#bEV^}=JiC{%`qFxn+HM`6rcxeY##LGNR{J~pyGEPb zhh~E+YlSuqi|KrVs5D)SA??bM>}iy?Xg5|gqlm34@*^SKxxIx|$6J~E)x;^}fnOvK z=_B`>@KE;(lk;mmCYcOj1vC=Rby^&y{EX*P{l;sFW6e$`xuM(jO8WB3-L@6B=AZFx zbgz-rp8|d4jwYK@tYsRcC_sZ`LHkquKE=WIX(ZXB3FXOh#92U7^l1JOvU#h=&;%K8 zsZnKxrIcn^LP8;1&mg(hxm;KT!bVOr1<$W@w_GJ7cA8ZCHu(zwk(VTrmu2jY_9ZN? zA1rC0+`Jmkl5yRRxsITKgEr_KPyuLlWT)-qOR%6vUs&~M%~ml|WBx?4GoEkgRmkEO zu$mUEncQRyAiI?!JCSwqBMusj#E;MPN}`YkSd!11&W#95xWK~v4)2PBx`-=|9Y_|| z@_Ix&UN-Vx1a~@Lql5cMBTcV3$vAvz({_H5f8L3eKWNF(*V}s&mCpMye^O(4|6{pM zxBS$#avGy!apQTZ9{&v8IYpT=qZebR;%RC^E>;En`r))Pdedk!W@t!Ut@G8n>e8X* z_?eXcm?CN%>Yd7p9-JW+5V{=AkMrdNRxbtZb|}IR>Ot}puH^K)0phIm-SE@p-WLms zdf?r7hP!iBUS3|3(QeNCs?dUK0Ja%*{E)7|8aCz%Xizss-)y1m@G#o9y|fvFGPi__ znan^o)TYk|+`YkL#eBJKk{Z2HAN$!pfjbL)E*!$RMggzUqf$As-Q9fgXcAO({BxQg za*wZy8+YI+XEGV=bRwbXNT$tO`%sZe%+-)gWaQ*O)}l!ZCJgGSzSnBi`YgPT{o=cj zkTNgp>wC&D!QKZ{tRwm`B4YF^ev=jV@2JE0t~zu`4jKEC5&}iK3lVA%jS}Q%B^H~zx_7k5XcrepL#Ip6(hj|#G?ZH&-YVp$W zGxahOrkGHCKjv#6Gh3J4;77aLUTx$?{AHmGY8mMk(hkY_QTzVH>)s5aN>h4`%PuFj zduVN}+iL@DfdwJT)HFVRIZq=_2H{6Tow;4H+8{s)Rw-h}U?TocX_|Cdg`bh~l>g&J zDgcf%b2`oXWKIID)ABvQ_GhEkjMbJ!M&Z*MVqF+%08(sbftT5g+r>PJLa8Hdw!N1hx1Yu8(4XzMn48cxCB7;=N1$J%k+tj4A#Ok*d!(n-kWba4g*-(v@8+tjq}$~f z(mZya?-C1Tzv!&{sD9-Y%@r^5r!=+*U(BBZl*BvvQ-VQwwcR<@3(V42YuyT6{098; z)x%e8Ek1GcKf4692!A{8c6_AJNJrG4%*8(rO2s{|#Iat7%I;r6c#UNHL4`G%?-pQ= zD)wr{rnnM%{NX=sue3jV^?H4V!sb1rsx4L7JO#3tAYN81GEUp`O)H_43BtcZpm*SA z@3wb8=b&7w4ea%C7#DyL&(Zm&gVnqG*b}Ng6z&IE_`F(s7_SzPVSvZ{MC@`|uCf=o z>6tK3^TDuFWm`H6=o$emmAPszE6W^(KKi`7-Ss~f4Iix8?&qsA6c*ZDda^;k%p()2 zw{tc!oyM0aMKhpvu$?~bm-BADP(%oMJdL(t<+$8byb?Nagm;_W$I4rc?g98>*IONv zPX81-9#$+S9j4RRM54DrOX0AI&JvJ*T5RZ)akh~yE_Bv@fLSG;R&=UOk(na#xqpVc zWNdeA+Q0H>eIf?(JXeL`-uiIR&Uq4bqYA%u8&aRK$Lv7wPx^hjt;kpLgWldgF##ac z7Wr@=*i9Eoc7OE#80~O(yEC#po_Nt$Yq_?$Sdy4spJ=|Ha2w|s8pVy&KCHB!EA{eh zId(kW7_D|a)vY{qE5J6!hT3o~q`8zG@Ypq8t?)C$U9{`}sVUt-DjIHcez}$(I9UTv zc8G46NqfIUg=l(nD!ar#B&Ma8Lg;EGP6smd(#{lkamqBcIU-h8GmndW1ro@+g# z^5rrs_jZ0=bMX9F?evh%{OrkMo4WC~tZr6=PNQ=*8!6g;w&SiwCSv?mra;1NI0e7r zmagqcZ!l~b4xd~y&i=f1B*5TWuOC0Qa8f1~awH+yHFJYSZE)jrk48o9qU920&<@bK zztWIcZk;U{5xn_+rh0X0DAsJd-#$R4T$iN3w#es9>!pn4nsDtSmT5cMDSVA;=@Q`k zGnw(QW#7ce@4g%9ZSp7N+qlM{d?M|Fs_R0a3E!lhcPjd3hx^mD5x&Mlrfr?^{KBbC zpNI31T;pANTLXcV{jd4@!pU3f3vXPjTi1&CfXe)KZv6qT#A0Um{PSi$MUsR4JSn8s zp>gQ~V}kBg)`3T&UrS|w>N?wM<0@4pFveeJ*?)DJ_G(NG?iP%YCu&;mY?q&<25TqX zM{c@F?(FW4ac&%yRhv7nmZ-NEEJteh2J)C}jF`?B1Nc6w=ju1ro7;YpEwxtnFbLQ>Inh&;e@6JWgE2Os!l& zvOl5{*KKOzBQ_c^FQq7DZVsx}<``I=!aZs$*?DoZc-fhw)U|)^Lh0wQR%|@T%*ZTQ%NTdWRbXUC^u4!7-OIR(ZE=l5WY@>Pk|2YiE0SIL}JkVS8h()OkX zf-VR`A)^#lGn4Na@JvgsMv1|SWzIHgHI|JUr-I7ZE2Gdx)NkuPy1fI^`Ht-`BNusH z-4Mh|WdrV45n0KY<&33s)FS*eQ_q;p45wGD7V{15YGR4~A`a;eX#4L5AF#EAooDx; z>)coJ{7i<0rEW?09Hz7t3kwL~+=Ew-*R2iCSsQvh#0>HWCk^OO*B!409X9UWE$A5@ zZ=l$p&9mDOw7Nj6z;LHbwL_`=^O$Z>(D}J{zdWoVK%wdEaE^6hny)F%hdDD4(4J5L>VEz1ki(^^r za}1J=2g}x5-oXYT39Z{>kM;YC8_&D`IA)s#bFLjq^}3>9#ahF2=3njc(;btUH!HNl zag82YwR;w3`c6`>dU#d}cf0Amx zZH+&5z89{KfScuwxct<#;oe+2#{iu%UduB{Q3i_}+=*n@G3dO|nR9bK|IY-yvzqFf|5jcznS;zYw;3ePjTR3gnaSW+IiHlm}cNU25~ z2?_?)TyeV|Ip9L;*NH*m?AX*+tHC3de(BslU%`!h_|QsdJ!&+&ffm7z)|-AUW!=<=?K%!`HI$XQS$y?zQ4c&dL+Ty#1e%l;a1%B3+%eFU(>Xpv7VpSU8OAl=nXF|?L6{+?;AykIz7ZZeKu2!fI zH=~vw-L{#n_8uv!lRO_;?)T4PhI}u2oiC2cDeOoa9CC&-b}|k0Z|RYFiw3_Er}RlDV>|Og1!=6; zV0e7n&fwY7%Wy{by+A|!&a&$k)lZj=PEM^xR^|0CFO}sT=QJ&MQICA-TaIfT)dsV! z*!CWPPtukx6{Q^ZE{7G2 zFSo;%({C=$t-uWc)3>QGJ+v1Q{o`?#jOh?{5$=1CqXX_WVvH%gm${*2d_`|o4nPY; z!e<`G^{QOHILJ42naepdCI~13M}4EJ)I^?Uen0h%*Q%}3Uc|lhpysJKzYIB)L`DIv zUE1;qn))mdC>Wkg)sG0?I;^DH=>37BL`Wt##bLehnsAKbDyTGrXY zW|+e4cW<>OnHqLQ@mp>uX)HJQnBxb%oVtDMNZf`Cem^hE-MJGTtFIqw{GY6qdX|{M znML&Z8;q(tgLvP2P6vp=Y<#<*v}coO5weZ5~nbKz8EQ{*j0mVl!cq6nZd(zHzrstow5)F zsQfC8jZ+=(JIcY~y&hu+cck4cuzk=~9vzP)XmK&bXg??wymJmj;-Ub>)r9A@Ts zzl|Ahs8cvuj`pwT8E)Mrj~h3Aysb-X?t|?Ev-3<9>9jAs(|`+X`cfD}Hi0TQJ$kGc zMbSN6Q{^GjBwy9eZHSxqO1S7U4Pe!&BwcK^qG1dEAY_5k>1w&(vK6NAo!R5%^f3D7 zq8%zq*-OYh`X~O~iI2r+tH^sg=P95u(IgFb1o^wbn3Gn4u~_3u+q-5D(^M_OYUT&s zq+OduuJ*|V(D00-)mSiVE>WpGc6MF5Vt#g$9JR~jGpKtc_GHyn4|smNdeu|muoiK9S$!yMd*BszPJa1uxe-X<6mPT#mD$>VJ0EDAe}CYX$!R)Y zamu-=B|BB+&eZckWx#Rw$u%hXoo?J(vUZXmG zYPCMrx5F=7hb3&Bv{$;HzuR3g-eX+mFK#--p9g0HT*7bn>?)gf+MZUpD%c-xj1sc> z41}A{T@3n$I0>L>_E5%ng|+XyFLJ$kMXeseI}jFF>`z_FX%M+5%HMsydps*HE%QCh z(W~%ojC>98NIs#zvsLIYW9)Bgl_%9=0gz%gn$v*Qsg0?KFHrOt-%s^qy+o)u+JqiN zvg|qvLgH3c(MLe*k0zLGVsc;U2&iXYA~X(#TD4hOywu+nhWV%m4LyxCV8XtDO--`M zrkd)A=q|u8n{~flPa5DtjI;YddX1QQ%}QC>UXG~;DJOS(UiWm`hpowSW|(GAh_%i+ zL#Yqq78~s>QSm*^w^>x$8OMmu)>T^DZCWx~U6|Wpy)zso3RGzXb$tKQcWXerG8z@{ z8p+)T;Z;^yrW*7gp7hl(-@-!B>_xBA3Udcqp4dGkA07j|&8mFw)A}66EOc*JMKRx3 zu>Y<%SJ@nEbi40>{p z?E8DGdVSQ&kEj&wy@LbX-l_Br!KXLMSX>71EOy$Lq-KAoq0pUEX3C~qW?DwFN4*q zI%%g0OVs`dl2!(1z=D6LBBi4Rp7~;yn8K}IU}+{>O0kJx5YvO}egHtBg*N0XG~wiQ~qlBdgQ!6 zU-1DcH4{4Q%7petWhDcXK{L5%wypzJP1Agb1>9M%DHWX9$Ql#1`)}!G*lgSD|Ygg5VC-EbWVTxCnCera7 zz_wqaQR$Pc31$FZdC#>AMx7f^knj=57UvN}%7=H_Lb#;|NUe`h<12gJ=1`sr*|k`1 z6ERzK!3x~RHtMa&jR*)&Y1&z{U)8j^7 z`=LAp7FOmuSL?*r=w=b$y=fDaeIz7|ec@poR2uf=_Q>joYADrn#`U!NI4>JqM^8E@ z6v?yOWZ5MhQOq}S@7liL5U5uSxDDr4Yo(Q;01?#cr1s-iMuF^^50~ZFvBf}dwnEGHmmg>roaPHP;foB06gh){ zJM`>HXwY6ddP}4Yo%wsPl+}+_l1z`MiY=ibXsp%yQD1bE0hDAvUe9O6ficyfp@|Df zD}&3?^$pI9>6y%%fEmF)To(tYvBLuCPIe1pmwV^i04xG8zLRDfFhg@E_n&C&KAO6~Prk~?aOFd#UG2Mp2!Y3jBdP^mF^4dKM@ z_Jnp9FA~7(n3>GX*8XJN>vfn5$lrJlp9xJkNCIk48Ic}NxpH`#VzU~y*V}v}?dJuSTX5cr4=m54yfd4H%0}Zajj$Qq5Pa_ndl$I>S$dp5Wm`LbgzDK`Y=b7$8QyUVI{EdF% z@;V#fmd-X8lDNT`%V?;K99_7cBeaPH31xJzD32Y_Hs>33+VeDvnemb7nn3615e@Qc z6K+k^L&$gFFeas1d!zkcGc0-1{*sG5W}Xi^*+$3nI`sbOHev=RR0WRmY*4?UVbB10 zM@iLzCb=2=E(A1IIw{HmedFVyUc$sW9&(<+QNd9`J#K^oI({$M`4Qz1A)h;KILm9h zQY7096j;B&5$u<*Y8KcfA+nU?EO=T;x_@3Bi(N8htYC8_xNz~6zTUJG8KOtMyG#9Q zw;Ocycb2Fgn=&^&_}+x( z?3M*J5c3R{C45PCRVpdEjyW)gKD|7HvZ7zaE>)a&dDU5r^>4mv6&k1^X||3ZLREaJVH*S z9awrdbvyGrkEp<1;@4e+5D@O`mR}2N?r5kUM75aZH>S(KsckZZ|Dr1bK)4m2M2cdc z%$v^fWibe19M)^6#_DJb|aIAlu>1YIlIXkA+69xByTRTOfSHK!*Vn>-Y! zI0wl80zi9^KoED$8uLaC`^*=5@mP|}F#%J{O)TUqZNg+lT%r&V#mNLh#J98SW8{lp z27N6w8i$$>6LLk8Brjk>1%TBIz%d5Gu>Af(vxwk@1B@NmdxI|Nd&Mv1-k3kPdzBoW;=7?KqXwRy3sj{pH*aAu zXUp|M3Ez{xwK@a?!gUxQW)2fr(4ZQP-AuY-YmL%K|1M_l=a*+KWTzvLYr>A#756c8 zq~0BJ$>T%{*x_wID9uc{lFg#(XJ|8fd#Qp;eHqxDH$G3MSR=N1Bs<90QOsn>n2BIB zWjaiE@kYaRSB2sq^Y(g%=g7R1ce_rT;S*cb1Li8^m>Qqc)ST*L%4W#Qm&LazJ!u~N(k32);n^) zDi^}JiOa|&SZJ^&Ph!VYswtExmD54MV$_H+oMOX}l*RD0I{r}5%Xx0PYTh3?b~*O? zg@wq^)o2y3e|@dcp+{c-LEXf0cDC6n28^E|XDXDz=sTZkE=6%;Lhy&9iAXj)_YC3iS6VX#a{zg`kMO0U?LIoa5yhaq-HXYPl#aFqjTTd%5|6a30BP z;CM2p^WX$ZxG}lXXt89GUr$dj&o`l;36Bd0z}4_x7)O$4J8$Z_ubY28{#0G#^hkHS zQP|mRwBTtL?77eIVp0MGotiJJ3;j-X4EDQ$YRbPs5>*Ld)9e|Eqz84F{K2-VOW^6V zM!+2={h7tv5y<5Qe7Ui>5me{c0US( zSubMcZI8M$VB=>)3N?iJSRXDnsL%#INyzJD zpA%XMuXf=@fq?=;mwzRIfY-i@dx-eQ;m=ZHixq9UD(g3xDsKwU>teDrUfTN8dA7q$ zP6vfo{Kesq_SW!tC+SXHO^j54z?;Q_lv=fUb=(xi^2$k{e2KjYsr~6MyxPyJb#M+JK$3h-j^bLB28pKw0!TJ^i5(=UxUwz|pvahN_ zSoLSz^A!Mnv=q647N*gf*Nbi|AG%P{Yd!U>p1P~k&+koC1HA!mb06ZhmzX>&mGQ1b zse`T#s>iyUDp4?ev(Sx%0}#i1J$|+Ny?zpJYq@+gfD^iKAWWnBp8hBFYrMcCZyttK z9LLupMW6$Mg6*huI?JmBp_NwEu*CtZd%D)%`15zAq_#&;Rlr~v4wW(WJ*&IHMJ3-b zUnpiu!K?-pU(~VTgavikrp%kdrI>E>^MqSFtB)HkyAv>YV$baFS!(kL+zf*k)a_;H zNktldxsrt3|N%Ri7tX4nJs>vp>*r2G?_ zR*zWjkMZ%`TCJm@X`8GQ#r`tJ`+23gyJRN@nWLBQW8eszQ`qm`fQN{Ee^6>@ewgJ( zDC5MP2N3v`zvlJx!U30g?%HQDLwcp*VYki-e0=;!(qgHp_*{IT^!j9q$z=_TY3++g z*^!ySKOs_~{Hj2QZ+Zb$+U`pD-Rf49Nq_kKk_6yP-8-YT4E#MM@Tk zG84AninfztnyRHA;LhhV@(ljDag{c~A9=m(K+EenmA?aBn0EaqseR!J!tCHHdwo|kMD6OY<$Ih?Q}05e9WrLG9PB$~htt708*B*f zCcYWNg`^}^?6)B_&&gWsA|lTc07zBDDk0Wg(=`$Ji2>D~hC~NoOv$Qqdo|Sx;nVieVpwhXevyr^hXj}%Wpb?^rG^vUJTy!Ib~N30Mz`N4TLuvyybn}xF=_iy3vN;|ue z;+G$6#j~;yijbw1sEGX5;3JgoTsCQ4voonpYVS$ny{SYA9F1vriee;sn}Gqzxga1+qvBr=Bv+8=#nGklXz6RN+;9gy8)4ae7i-CujB=MOTV zAs9OOFaP7-+) zUbs?vH|$ZpwFaUU>2x+4ZCikI(${%-h@-;sg8Ydwb}%H#GqG3_3Y@OCd}XZ1YQ((7 zWa}yB&}~?3h|*;g{b$#bz*6$>RRsm7a>&2feAxv0J|M$WunI9kgYCu+z8Q`go;u=# zW4O5LPE7J0!S!#NZnMZqUUD`TZA!l=&>tZCUAjHu9;HY?A`(Rs^oQ$zA-nDn1 zb5A1lLAm{c@w^bLhQ zl!)J(9v>%#=2|CkXnBw^Mf_#dmd=O8FBm)|k&<}TK@=wrW&uqYi=axmYG)U#g9tQR z#)=&jPmNsE+kscgenU1&kj|6xZ z11ZgzEkREeCj8Z4lbl(M6@1{+3(a94c$J_HydY$yP7vPrE#4I|?A%9^cJF1Mg>o(3 zoUWchhi6#)inARD)v(H^HCdn?%JNJPQ_Kebt97=O0XydH$`pv!3E%$1Wl!=&TQ zd9&W)5{oSav+WO(rBGgi?mhNB_iDH-rMf@lJ zIi2(2DWwGg4L*(AM$mIn;09S4T&g$#+d$_}?kCgkRuo6A=TvpJ+yDaPUlm*+-OL@*RZEY7YYX}R0OxR_tzdU{vlFNV7}>LQB$sIyq#Hv$`Fejkf`&F zoKoB?zr6~k0B>viCuoqL62?ECC;;`hr|fDf(ZQqH!96g-*B=w;**ULYN@>$VFw7n~ z106hm0%D-=N6JQB7%Cw!cFfiF26PDprM-QzOnaWmJnr_hJCQwH=J>J13y^)-^c&s!T%*WP=bcq#j7!vE-72tiK1;)F!)3X#N*p9BNTxP zj-y2)V-#}yg@00i6FE^%+`(jxnn`4iA4*Dc?=n6Ty=WEU;pz&1SA#7H)0^K=zICO~b$l!F_$~EegXk|mE zV-XsG>S@d86Sw}l|5O;eHzaFE&Wo+*^q`iIBban19*<^fT&d(z^U-GnQi)={gZ^SSWE_B-4hYH8T zgHcRU5|P+Xc(nUu<1$|K?mQ->q1hE@M`{+q7zgb9$riyCN(}VvC~@>b;qWrnyu1^> zTlSwcGbm^@2mx!<^A+tRxD`ZCYQR&-la)!WBPG9*ix_%Q8=Jh*J{VD8L@MU*O_ZEaKAGqCg%Gi z?^_@Vupkx}3(HR}mkXQaCeL#2w>~>tf!I*NB-~gEpEb#?p`l5G&pvFU6s~j( zoezDGJl{Ct*(14<;iSB$=9OBX$OFDxjg1hAI< zh)r#gNd0ybk)L!4fr7~FrzHWeo|*kVp#Q#MmPR*t>5=*yF#9#u#ysLC{>SdEk2F^puYO(XNYR8=wm4l2)^XbQDGyX0l z%pTMiiPp#Ah7Tl|0c;YiOZlID;12#i#scuMN_R3jlX8zPkj%*$?4$vXqbS!~ztKP? z`N3v5ipPs{ib-^=?9IdOUbpe7w3hiUXJfxbjNZ!fk|=%)XENDZ{7-N+}n{sc*Rkm?}5f?@V9B&PSopVRB>#lFskSgi8E4_K)0jFHv#K2y>VXIN4riffkf)ezwS+u(frS9S&$C_mAVUi36j< zW>x29c^FkGyzZNo%C!_dHLDoeFft8De7>VBy}pTau$}_Yxz35_2vx12&`8My$~h#* z5Wf{B>C0f-VT!QN<1HFa8KaLHTg3bN3%-5lVpLE6|JZxWpg6j(Tl|**2_eYf?(Xg$ zAUFhf2<{NvA^70#?(VLGyK4vpcMb0FZ=UCUt8U$Y-B0(^t$M5GOIP(wpYGXx&faUU zwT=~0aL8}Mk`ueHunOOg#nO5H{FWSCB>cq*8t!#jqXX0d_F>|}j=eE05#Ka| zGY!BqZg2)B<)ZD#2yW|g4mFtUw&a8nX*B&#Ca|{pt1Ck$Z!Oi;=6OmM+kZRxieh$7$n3lt3bqN#=WOzDkxH!@F7p!1(Gm^5Hi0T_>9J zrJ?XAGUs8~j*=VBrofYEA>S&f_H z+qxdty{;~OSS$k8Q)0_i>2$Bw@YuiF9L}o5#-f-LySGvM9``z0JqJ;Iun*O<>j)v1 zyFwE^PUE6mI5S_3#1kOP&}5IjyW=VW=!i0pPQGX~%2>m9@MeZSe;$@@%;ODaoqswkgU>y!XRZv?uHKXu36o{JzXzmDMt*YkEvzjakABFz3$D~ zA5uUc$l{f)s(BWbLe(FN*~HO8=F2DkAFrS?o)t30j7WrcC<&VqFxm)u-6tlY=u3Aw^FQW9)}okHi*48GRa!hGSi_AV|TR| zr?Y%eF;}L&0=o&YA1I$~+UG^BRhx2ahP*PG%&wieiyX1_f?Kkn?fHH0)-Z<~iEWz` zF00|zBpIUy@(zt0ek+k*%lz^gtPeq7&9i_{{R#77ixhv%$Y0%zAtFK|;eAZ?$Bb^+ z95|9q%AflBOT|*PHLPJ$B$TN-uTijHI(aGSkX>q;E$Ah)wl#rNg4-oN!S`m(n179vE*Ng#l(rilrpPscd&7i!SbB%C|2YrHF)xlPE zvsYa+ZA!a9XnSPeKcoUl{-~y{QqX5J&lZOT*JMtJMO-<#CV>(sRCEe8xo8YpQgY&A z(whg+-0fafcmhAv<;;8x-w!Zm)=-`2^B4Gi49>`PCm5h45rSg|C|maH{qDmRfAR;X z>M*iH;wKn6QVO9cqeT|^GKmJ|9t5CBg4ZibX1!HS`a$MsN+O5LYM+0_UAB6Ee-$wI z5_WR1TF>sj7z;bKb<~v~`A*qh@9t<}z1qqI^75O|!ooe$O>BWY)48lnNl)cOFbg;< zj1svyaODZ~l_z#HfE5%JE@slsq|dyeo~bocxd419v`;`Z3_9sPqARg2D`snSA!XFh zEMqF^jEhw~M5%g0x2laOH>OS|!$Pq|179*CGR8>VjmG($Qf~Nyn|8Y^^4U~=o?RM5 z?8*FlUY!et6gy%x0xtK4@$ehGwMv2}J(urJO>$uQNc<1dS6?^qMw@^BC&OW+cM_R^Lm8JLV6Aem@QP)+;d}?{%8U- z3Wb*VyWDLwVlmNatkZL=AZOr8uj_I0MSZG)1s{lKCn#_?xu!x}UGX20;yj)Vyhek~`YBG@|^5FZ+ zfSpFVq7lJ(@*$(vd(}cx#jfG~OxIox5x5%evw4|0U1wy@<9Px6)pvsqqk9$>#|_HX zT|J;#Hb~v8-U&UOHsprNWqTf7($w4uw^c<{soSFMUdkREy-LS8eyGCo9N2lGRcn(Z zJrzwb(=T*C%({EWBgS;12|2|dKSw4EPpIU7ybC{aBO(DCxHzf~S1+0|H0#VXNr(E~AtERQJOnp2OG}Kw&8KKeKE!BP%#kOSn@C zu|G7*?Xz6lcp3ND0eg!uf7ue=PJhY6GO<$y(TmTk|IreHndc6xkJO(-{T|ZU_FQhL z{q^>zUotYWU{ukba$M#*v703ihli@KdeDN~3(q`}zyoMH$+ef>Wu&euygK%W*6C8m z?A7g(i(DGZD!fUc#{(7-OeU7aP5&NMQ9_K0hIiBr^9#@t9vH%h1DHb3K+)V|LyD;5ODc`-qmRl@|r?DuFMT5O~7&ePFegERHo1|-@9O{=2MlP2N zIPpX)B9uy}9HRH7q4rO05cZ>&r(B{3k>MyVY=pMIwLga65}STiz&tqq_W5pUK#V&GUpo=jd=_U!nBvk+4*Wc{2ZwA)ma4(Wod! zW=KUV9ZI08lqaJxC@CItR8=e(#*bxiiFe4MM%3pTqsdl+lsvhi*3@OV4Jjg~bbKIKA`nhGdGHIPNLt+SPyoUGhBu`&10C_|5D@!d3C zCi$GRWS%yaSgW6+jB)dYeEoE7y8>#mhNg&b(+ukxu(#VS*xLs#8(IIE9BQ>dw5p{f z4oQ`_&Lu12@7-d%N_m5&o)k?-rz-=<47)eJ5V?cI;Uj<8l+{IOM%figs#NfY#Qe6# zl@8=d*f!E`?>pnAm@WvFJ_mH}6A`@IYuv9=ewvws%CP!A1k;y_Z1iBdpQk-+M~)Z;3>gUY zT7LS=*1LPSeNKk6p8A<-Qi#qs4n6YV3GZ``k{kR=7Tuj} zEIV_3eINB+nHG7r7g_$jQ)!T%w=>xDW}|I4m06OTg4Ps3R)y9fO#*R$wlbhDUCbzR zOqHlb6&l8%x!Umttk`M72d|*I0z)wpY4+6OP>iJy9V9;P_EPT&rI+i~h#?Ykn|#>q z{lJ%VE^i4p(fuOlE9N&%(*!eLQkZ=jsuG55?W?x7Dr@7O33b^$XbGDT2p)TX{}iW# zR!0*w#LJrH)5F!9nelt55WzAg;6T3pEQT^)AzTLf?RJXk>Ha z0(gLUs^@)^!}r=JvO80C;uE*xeEZDP?T*iipLuPbF4WA#@M#<4eef<_Ec>g6PS{p- zMp1{0yfDRd71)-b2lYCcCciFAK}TPC$^dR(-J;?-NSYz{# zWuD84c(C`AnAx6lQ{~DD+^xn?XP#(GF(U-S&4?dFsDE<3Xog6joYNTi}s8xx*fB`Vw6Ngz*nuu(_|fMqN_Av9NIP*o%HFu{TWQsDwX7? zkl(@k=7gCoEGM_p(~KHqWerWN#43~*&hGx3pJL3?e-K53c!DSF{olQq_S)flZ#Y&6 z$5H#W5%qLa$aQFkl?1Bieh(k}#V3hx+1})yA$xs{19MInmR)YWd=xEQwNFXwH5Zs| zWFRei*5-L3TCPlgrps)l@TA$_ge>T88(W=8gEH*4Ho|=b;~?U-|lyQ zs=Wy;4BbfHgW(S zm?lhCMHHhKl?FMP;9g7d?}YAIaWu?`YM!^|6oQYoy5mech!Ij3hR2J^*1TVa;~q>| z<95n4vCM4K zBV;1#V^M-AtU;|Nc;AJul%O!NKcryxi>O|1C^4Qj)6*Bj^^jlJzomEPr(Y)hoEnvv z+Aui$V9RsR#6tCNRJC`%z9(B3^o?t~8E(=!n?L<&Bs@y}0G)A@n-C=O_?cAuIUK~! z%2^VeVfJZL5}j|>#gzg-|GjX)u$@d)M$h`^d8IKErD~yYPr+BO5^eV9Q~dmxS>keN zmj^z4uA5yRTp6W6X1vRwAYy+hIx4gr6Y`mbTG28eki^9ra>8Sj|fjs|WFlKyuLP;6W7-ap=uYfnKEt2T>oz zY2{LE(Zd$bwIz|D_Wjpp5sy^v8iGVWGv5KO{sW%^Xu5DvkBxQS_U6Nc3oR}G8^kI> z)P$ORJN8&>cW9-?j9MRp`W%d9W49h2xX)8e3z}52ILS#t_X96+D9u+Y)3bYpgtY2u zX+`KH=Zk;mH%K>t95E*8lR{n6H0-6J9_iDAF@DHgHvWU-=jy7qIdTM%K43VGxYZYX zJ2Y99z?LXbE8;AGqcIRj3S=a2n@DN#{~ZS-sG3e}2p<|L&Vg_yih|&0U@CpEIyS)q4!lnk>a5V!ANul=}!r!0c zvv#VI1QG*gCBFiSrdCY9{kc9i5L3*p-1QK*fqN=Z9*#-|)kJ6x&vY@=I6vbbVjY`y zmhpQx{f{urj4R}cF>kQ;7a=0=K>-aWd%yB$?@Gz%pYF@)jn_zDj;DOUjQU-?=pyu+ zKwr@|N90V}cs=@^q5zU>oI9=HjlzGq`~YtT>U$40t9W!&)8Uyj?<9Z94aP(GeJvS9 zW=HSgFZD~xMp>uzK_`Ydjfjhlab+K!6I(GCCNAp%o1_@gs z(-upu7GcLrjcSnud=$S3D>l{srf;I?w4~2jsf*wo7Nw`^c`FDx#C<4=&yf!F!{TX_ zN%@y6ii8YU1m&dl=l<)U5)kl4usei0SKs*4Cb*jdA1bEuO#|;ep6w)6$jD&x$L#2%z z%M;9}lF<6HNfGF}BY5#H)`vtTnZCH*Xio|@)rqHD@}0iyNeG-m`zZ((3VL+ipR3*G z>u4<;rCJ6L!bS1w?eSGNa|~0WdS3bW)$~uO*uh6oDS~w7Sxr@gywk}p)izPnGozSn z+N25Gj5wpPCrblik5&JA`Z=U|+Gl%<4xlM2&>7B;WHV5Mh5NBx4Ri=(B@FRDWWr4n z`L3fT+YNlFcZ?dX1Cr|_?4*gs`r~aP3vvu973w>5U8Q`YAn3B!5FBBd?Yy9<)ML;5 zJGHg;TVnUb+0vuT#|mo#7nEvOSB7EA9|F0AG?iAqpATc-kVaohjw@8Ql)~C><>?J( zYnY>&Zfi>4^!0b20TU&AT;HKzeke-uvV|=tozMk*f0?}2Pspwr8b;s6-grX0n+$H9 zqDTQxrB+u^+Y9`H9lx~ZJYb*UC8OTNyT%CQR<29YZmBb09DPE!hcNhL2cP5Vq!)`? zZz(l>{;HNVpLqT!Iyg=Ud<69f>iuS0Z=x|zqekDb#&j`O9rn#Fc{3{1Z{M^2FXz8; zkc9JO2g(*C)V}3-vADfsfGJ0mAI5~ z@D*8!Q7d)UqS0xyWnW_bGZ6zVO{Zl%7DL_8G2K{$zR5NFFJ!zNVX>9gx%s;Dus-sm z4d*?Ipj)eDvX3`bE`Q>4$tPkA$fcz>a{CK}x_eM65_9%DWEU2517<0Aw$JnI=}x2Z zq6Ck5_EzBbBm+wuw3oI2vHxoS`hAi(*i&GZIzWS-H{g7iK|wLcaTR@_8bwq+ke8#1 zT{f@zzF<^E(XuKOjY|1fRcrK*!+gyI-tDPQ9SVU|#j?3_dCO@=_kXzOX|QAIStMs( z8F%vs5i3*Mdm9l?MomCBtk1X#HkZ67fv zAKMZ>MJtzR@)w2ncmj(SufP$5i&HbxMe|>SP6i%6b##ycD0a%;(sW#Wvj4Z#=2Xg4(X78qo+;^-h*W_ z*d`MC|FR13+y|{W_Jj7K>}!LHoyYLl}sZDOA^;FeBChrYml@$#)_wnOMnoKAZn* zH&Pnxw;x3M7hz1O&f=VKx34uq>w&+X34~N2OrGTh#<_SOOLO(^1|UEAqgdd z&(zlww%c`7EgB%Tr#ex0z4?iFFF?+d|0?V6srwNLNKXPX|MTI`+M|iVKI;fk@GU{e zHMgrEKnD=OX78y_B&Q^o3=B=!8CNjeE)>uqr>0f_BsN{+`+sBnJ&Xqn+5LoX*$+8~ zsocLs+G@0|z^_&*miflhD6Lkp@xvff&I8UwozHHWeFGSOQ@`3^h+Yxj>~9}?c-~hi z%$RnK>sI;l0`XWIER?NVFi$Hgaj=Q~sCmqP9G&qI&s$H_UAKrfkuhO4gOS->XSyJ` z{b|9BS|K-|tynSEZ=Z9+kwkO60KIe}(ScT3lG5ZaBL1&BksGUJDqprVO+WQ!2?e*; z*>ii#SAxwSW*)CPx1*?&9fu7+a2Kl*${6`)gSp&->TUL{a_hx|w#H2fJ81!4f9$oT z+MAtK`dV=a&pKNS;6ot^v~Q26$6HMa4SEMKN0JN$(5^n`QrBCxT+Cc;CeECXRL;Cy zOqfp$Mgm`!UK~wdZR}mUmvGl{@n3XZkp#%c?(dWR>mLn2y}QQmbXF^Oyfys(oJ<(I z(-0!*tq1*p0`aN%x!5943|_o#|MJ$}@4}vh+sjguLP15{25e)D|BA?&@*k;FCEhn8 zP2*T7C}o(l@cu{e+j^pdERhHk0LGu~K40`GMGawQMRMpC{YW;SZ}dtvFd_r5$vl10 zb$#%$-@L0~+cOXcbSOq+eddaF&iqYV&cf+TCz$ugdAHkuq1?*mcPN6Is*cN=t7BH8 z@f!NHh0z3SMz+T_oa+=vKqMiHclx$^5WM%PkVx1QIM=KHR*F*%l1^^`F`A>1yEuj= zE~-4KT1h&g<6&$@KEG&zxz1aJnP+bN>gD{~Tuwk-vvUB+J3&B|3aDsUAT{p8Stdl@ z{$UI;`^m{;lxSTkW{hL5V(DAv=38SzwZk>$GgQQ@vTZcBjKjHsB{aDX{vBye1_S!c8Hm1A_L zBK9{~eup~}|wT0->7!j*>22K#Jq8!nqt>efRoU#kCVnI;U(WvbAN#2b33^;F<)6Wb2p{V& zMq1C5I2q1X`n=}J4|_crBAJz1uZ@|zbqbo~YTG%vJnB~hS*Q`IulTBDtk1QQoW`ea zw7!9d;bP9S+clvaB9onor3t4`2A|PItv5$Av;E8hxGep^wcda?;KlCfWU2w=c>~i1 zYGoEx)TgpeXO^ed^mc+xgzwnT_0KiusI+b5Md}LRRW`yXD3>(KqXTdw9tY?V%O@K# z7g!zzo;EEH0OKH=!In3XpBMB4l59MbT_l|`mW(i8lTm;S7RHf_8x`0)PfE~0*P5lF z63%95QO_ZePJ?aDRcrjoD`mm2CLLZYdzXYYt25c|OTB)x`f zV~1Z?1y6XB-zovIHkrTo8s>Qw`QB;0wzBcG}xA3ikIZA z&GtC(@b{+^ukTwR5tIJ7fBvK)$D8a2?srX1;ttUe zU`_ub_fxjemw2MdFL|-hMp_=U1(H};YPIuhiX;^kcW9t2Xw*FjD1M>wLX{4`9A*T&f8t%yb-LlO&N3@_Kbx*QseI zhUnv7))#KWamnYW*+M$+7iv=BK5P7&?cT~=i6f3>7`x$Iw;4$AY#A!l!_k8LBlGs6 zuB)bi_ba`FI~6ptA*D|Sy9gp7pV`1S3|ie48k(fH2|(s2)Fl*DW)%!FmHp#KzYc`4 zTc^*=VX{%9TAvHW>-+$t8J}Q^*{ws_&?WOAcrVE}Lo1WKZg`fgaPMW$AFMnynkXo8 z!TG~z2A`+JnrkiP-Ol39RTWwQz3Pz3`;?T{@j7t#70WfdQ<`b!0!OfpI+uJu-Hmta#quBkbgK(_h)vd$nRY0#IPG=x1ma))tpy zsg%|2)y|82q6d<=z-Kd_Kkd7OtW70KXwyxJ^GlX^ZwV`DkOB=Ckgrm~e8xm*j`xKl zVZq|RV0Sx8*ptx(1mhX|(tXvR)ngNxR7*5=h zLp>xMwGq0G#mBwHlYNj-c9svE3ia&cQ(P4vHMn!g$nG`7(5}|$S&B5YdY49}j5IK; zMLzY!7UQn8|Fi;kdoIM#gyam!zz;Clr5-%o8~gni4|XGt3bgM-D>ZCtNgcL5Ht+1J zvXVz4pHe=4dNYA_+komel}@X(yzfMsj>Jsdj2yR&h}IWummiI<>3!Ta_2_#Nd807Nse2>N%<@x9% z4!u$!`sl>Ghz6bdK5oTwBXer)`er~@p)QD7z$y0;LRl6k)pHPMe{rY4jo~5@IY`(j zHywqTMTuU@Ls{c|vJLkSiuC2Z2jYSFpq>=`zDRd>D?FdvARjs{x|C@{8jU*nMTVR@ z9LbL^O}=KABD__|GABNx_yo0W-%C>iwg z_F#`y$&ZB$N`%(t6eWSOUDE51E?h1n%bQR`=)L}z|M=gUjyb@Q7J6KAc98^toUKvG zuS<7d^wF_(FkzTUzwpWZ*NFzr|G#oK*+d1bH=K*CSR)fKSBgg*VId|J_94da`JNn* zsgGuCJG~*+z|t84%%IYDuK$H5dcTPg7+qo){{dvlqR9b}k8WdY7#I-nxeo+RhO9{H z0x|Y>7l{BOSQijQ`Co`2CUEkTJ*6A|zh`T_A(JQqnKEx*C5zU3)5rhcT=?VJ_5gkf z%V`msMlFL1O58V4a0Od3cjmIGZ?w4cLNN9u{tpw=*Pri7Nt-5BB`<~s9zet~%rNAw z-|RxdBl$g${Mx??!?S$ziCb>&B}R&riH9Z)c**Q{C5z^VHWBdXYLC>YBG%6I60CNN zmM$VNp$!JZhR{1#iUvraQG=H*JtgBtr=sGFUPjRVOo}5AvM)VIO!Fk!d9!Bnx>97S zIC;%00T>?<;n_9K-8HEceSflnae07$Yd+Bj^rF`gCpWh4ai02@^m4T3lc!4(Bud}o zN~CHKwgizH$~W2?p%N)#Y8)75GIdtD`cYDlXnV;cTxOKeq$}SkL(2A+9FgU9Zv_&w zp?@p_K86iL2X1Khc5a0Q%w);2?jQepF=2R=A)z?zhY*gGN{R6SIdl4)>+f}Nqt+LL z{v&XW4_yL%bv_Ij7z_@B9`Z)z94Q#aaV6KLX^e?KO5N5^MAKZ%ne=k*iqd#r94}A3 z{{9Izd%oAWPFR+EzrC?)fQmzaY=J+3#)!)zucQfHSaU$6BM#j%AsT1Ab0sd%tGK>;1P(R{trc7f~Xt-HG3a!E;s+h#p&Loy%D+oy@LLmQfHwl3-h0s zmh3x#g8$bf0ATT!zzb2``P}aM&j8+q{Rd{6yu2QeAM@1znMv!NURrB2zzWY%5{~z@+n#EL-)Cym6X%gZ{oXVunKjTUqNT*5} z$;eQJ#pjs^HxM!CrqRs4O2ypMDnYe=s=yVKYHC!lw|gG?Ibmo7tWSSQs%_FlOva>R zmZTN6H}@Fdf%OMX6lNM^7P(HPvmeM_rPUGfSqI@RBL2;UNZ-@rcSD z88T}maTR`+oY$k)EQV8SiW}*uibg@OeDt7pqtI1{+idJWymxfB@A|UurbZmzTF>`*ydGDFB&w2cJeHHG|Es1(w_+B|st9H&XXG|lR@uVBBR3? z!}>wPDavf%*uY7`b)bv-2#Yf2sADvrR0721{qz)ktX=)Zh74cpGaZw&j2710Rc=fm z5#J+d;X?>j4S)%Nq51v3eE?o|pPaVGfN?yurpfEsQkH@_cr8jiX52yo2iZvS-37}K z(VV&PcI{WDIaqg|`5Mg?B8}n#Z4$0s2@*}{Z*e}3tVtD`Fl~>Fxt$#?zy8wZc9#C+ z;>p`uq8oSpPswFKc%{-i-X|!mCNo8KA@yue46MvKWFO2ioUO>(6L2_fML`AoFr}dc zB)w55hql!>oO&l`S14wA0c_9xK1VX!FmUK6*|x9XwIxaYnk440gb|vUqZ5C^d^CPc zk*#rty?npdvJYV4o~aC)h`)SmFM9)Rc|$q@hg__0r6Y59@1FE|R|QH+s8Hq;awx@kKYmsWf$B7Sh>#cy_-WOkeiSb$8X^V>#n&MJz z&_q-_^vgQdyQ_2lL<~%#Q8W$QKmI|_!BY+$gj!A3jK9Bf+fZSGUV&YQUSGjl0Ym@2 z!_Y~_$DgS47(w!}^sprA3ZXDHVF(^)q2P}H&`=o&e-ly`0>$JKi76lpL(^u%(h$Lg zsw1OcQBxJGgP=uA=l;mL?PV=3WsJ$y4pXF!o4j6T=8vzm+_u$SPIBL_@MZ#A-F2&4 z!6)ih{c<^Y_VgXoQ5P88cQtNwY-brQ9?Pj{!c;k&8_+%Q&~l#MQ(xtK>=SY`_@-w# z`|xl-g`Bd*|IQE#h807PGQ>N|ud)nl=a3Ya{ zGE-4E*r0{%8!@zM#b?RoclV0xRnfiDjk?|gH)Ang&bI+7+240?G!|;>0^s1n&!BR$ zpZ1U>g@y6jE|y%7 zfvxe6dC}oTFQKL3?Jge z-lufQ`_^y6h}1TA<@u@8`5ZmJLl-z!Pz0&)8kfD8!KM$A>LRTkmAwS()L!vMc{hoq zMS8p|gKjry^H0m7-a|Oe&&t)xI?dQ=z!b;D{qy7U#QvV0erG5zDq&~zB|1tlo!b8+ zADK7$HUG_ubm8RvSLZdu$$c1#JIk-14cy#<<(NeYxq!W87^kVhd%CV6;qLe2$*s3- z_jvul34_t22K<3}xZt zzS-`ccSe#)Lm$vZUBhh}MfmHjeK)O%y+I;bFMHR}2*Q2d_oa~_m3d%e)xl4fUxb|6 z5^V(-JP4hl&oh<Mrx)f5d zw6i!Am#53{(8;%IR8G{%%Sj|JBV+SjFcwSTGEpznt<1=*Q96vy+_{vo(7O)$e2Nt3 zs9C6y?&(FVrObizVCH$F_|bNyT33$uL1=h#GOkRkK5-aTFVPGL<@QPAk)x_%MrrT( zHScGQo6@={yy-hL?!#YOJB5udQmW49zbJb!_}fw`uXJ=;hlh(Y&}$gBzVg#M2)Itd znge8Y=>caO;#m#W!V$}@uh@g)8Mn)?LM@xWRqam@IB~BdUH|jE5&TLYjVUfjD(K0n zr&{%-<-F{L#CInk0`67)m+r8y6MXiXwJ9Gc0*bqUJNE&~6wElJ!2p#)i} z4MX3TW|2SL)`#%BANga;`g=(0;m^t^2`c7#KkKm$pjE7$RAKQxt#_Eu?5~R$_5BLD z$?92kX>KSObHBwm|FsWFxxaVOhmb#t00EV)_I%O3ShLoV@PR{@S=0?PeLv2IGidOJ z6n~HbZ2kKWIe%+C=jLvf*P~^!1otiB<#8NK@tJ?^+PjZZrU=}QEp-uPL>Oq>qg&7J z!_t#cOatiYJL{Jvrs;WXP#!^=rTS>2#=LwXY$<7R)*_%E@3t|6KSa1osmtg&qkh@qvIld z8TU}1`Xtvc3H@eFWoq{OYI*tk@(|%~TQm2gNpYLNd>4wYfDi5Dxf__vJIi@##`T%A zwp`23PfEh8$>;NX8r_XSG0ky|4!$qHLJ_peii)O7=y9a}Y)oQSg%SiX75i*yslaZq zlZb}WHyw4RzL2nc_H#Zb5(O!nU9t!Kc30*!_naQ?52osEvt;0w?gVyoX~{NsaC2Tc zGNvNF(P2>qongf@LY_~W`$ICMe)$v);32(9S;Z$3NKGpozV-6 zY^dOekfL<`0J%v17qWY|bCUb@XY+wSq|P{3b7n1vt+>+1lZ+BXOVD5C&PTVSP$3(c z{N<_NUH2Y3?VA0OaU8Cf1X?_o%4(fA+r+fC57gHom8});i{{rXQ2UN8xD{XTNR5-A zZjd2^l->w+439P;PcK`9waisQ7RA&(MRkp%_u9n7)r%u}Cfr3H3)znll#ONWh; zaWW#j{U$SYK{u;uR4!}eX#hZG3SE6fZdVjN*@Ku}e z5WKO(n`iDzy0zA4a#mJV?IC~&VmeYTKhbGyQzwCXy4 zcQ=-NZa-b1rY?xByJx(YK?jQ+xOpAr6?;dl1m@ksn-m1=p8#^B(O@{_fuS$Jgf@Sc5tzX_(ihMikHn{<%S<2s2C z-E@n87^ZhgzGSXgyO(-DOfjX1dh?<($)F%zNOW5A$@3Xe-n&PG#Rb&iM0h`EGMC^0KL3`S^`~@)f*x zGYzP@o)>Oa0@%4a&!7REF%v6X^fad4}m2aX}^Eiy$E#oy0POvQXgvNdAt)L z&!#-sz7>qii!_goCVFWyk7MIDBFuB$8@}BQND60`ZK^(a#qgwG&6QTv=d{LxA1oo2G~FybXE!IMCY~N`pY+;B~}n zP&AdHNkFRMPmrh?PA-G^p}HQzH5}yi6iMT9Q0m=S!)b#;_VU~xK9PbgI+xfNmz{`T5Gg3|cIlpBA{*(U8 z-$#g;VFD##OIEqoW0itYS=zWDsLb>6=ngZBQ=pIpb=+IKvnmyO0z!GtEEo+$RBn3_ z#GKq4UC=e~wK%Csw@zOcnJz`SPDI5z3@+E4V5y;7pmwn)BLDYkgQHKC)mp9Wi&mXv z;t|$nkcwsa&tmq_eKgT>D=1rL=>*hSCZdSD@RNZ`*S5b{H65N0(;w}{(=6ecJFAy= zF0L-C`Wr0NtiUn%0} z%g1?|`jbORjQ#kk^g~|Bh*rRB@2ivXB2R;HZ)yY!fM^Uj^_HcP`hHNNWpX1-DRg_# z^F0lVC2GS`VuPx0wU$e4zcM{0*lb!Gi%Y9&n`^!wkiEIAlEa`AOQ9K67pAlREk>r` z2&IR?EXr-1;jI6OWTd*5FQz2~Uhdb}fvxnQb49*t#qWz2idl82@fc`iUHvjz2DbJu zurPdl@xkSDscmzKIu`RRu~tl~unwrAw7!D`9D(8?@n&S3V_H|H$sfb)kNx=&fw z>*UMsZj$E338nbyjOcY&d2-d+|p?7;N zXH9M9kuTEPmo*mZr^zPJs=3-Qy(V#z>Zd@LNfxjA?39W}oW^052*G%@8Dn0lT-`EP zOQ&eKDW|W~OQFB#>4fc-API1e>l~h8mqn;j5CiF}Ji(YOL)$fZIVYK7^l=2;U2YQY z1ko}u)gDC&9} z<-{Q~%1}LI0+kHOr+mxA1A4)mIN8r*kSvH(sc7~O^TwZWM5|i4U^U2#tjHWwX!6;3 zVlN}N3SbmS3>kmbXnbkX@k>>9m^%N6oioc=G%;I(bpO@l01^GyHBF-W&IgvXyj25s z^lmFM*?m*k+?Igm%5^6I+w`zM&?uBRY{?c8-Oz?mu?b6 z?HBC>@oOX&ELST==ztXDik59-0V_P*oN35(5=Pnn_pvSp&yLe0qACc_gnG~E*1h!p{ZjI|bw9Giq8k|V^**#5&-NvQelekm z{v9-Rd()S+yKp-Q0#Dce;$j3%c-u)`5}wN^*A+yfzYQT*gL< z?q?As)r9jX@}Kjpds}vSp;F7j5_wj+Iww7&dXA2YmU=g`2fjX^#V1mFWq9VS2k^ik z;1SVjDq0clr}QL007t?#(AwOTMnyprWURBYEDM69K9;Pw&i8*cL)+*&u$7OUofKG8 zU+VYn6h#rGJq|6H=+wS54S8oF%3{)18;v{S85p@ zR7r2MWt4$g%*eiFLXXrcMre7(rYQR-SRiWMM$onRR7)vHB$8TEj1h&X3xC)w)>lUF zxlZ-+4}@HbxE3o(Bxzh8G;a{Z7Q|g$&h=_H+Gkk(D#dO%MChp|>?wbD{b77V{L*7f z{Q2W&AGJm6QcEiI)h#bWkD(A*(kf;D;~U({cA@Gi&Rrx3k8$DLsuO2fb3DYPo@n6m zjVEv4+RpWfQe$&Si86ZrRF$(nlLUX`a{xh$^6e5s4%pK;V zN##Y@uBPU7uh3{c&z?U=@`=Q|?J##X!b$aA@w=c#oqGbY zS+R@%Ga?hgIg7_`8%wdCJSmxH&v4P`=%E-7zxtS1PdXXaE;k3{g6AD2*`KF}O9Si~ zNRlU?N8tv4=goqQFgF_tmHc~SjnTOZfngL;OM0cOO5=we4bBif%7v=2y2s#tadCoT zJpdyuDr2uR2@{xqpORyuKA&zCwXNi-dlviyBW%^V<6iUvK_)}0VRP;8C*2Lzj9_&o zNM(WLyzI+~lWh6$fIK-o=cYuq#^39t0bBLEy!t`jjn=^Qz>C^&3{j!5dFj4JkeIr8 z*&-IM*gd808Ayy!C`{6^31<6MO;->2RbNo+~bhOj>Vl(~{FBMrtSjGarP z*RrZ%!u@nryGHyDwk+sm6%Q`$y8m_iClnF`&Em@d1K72TazVR4gUD*}k8={j(RjCy z=YSG_G#fPI!gzHf?XHMskZ88&bKW2!I=m#C*GGPGdQEYpN%hCe1ZWg;(Ag{l3cqgs z^ND=hUBw!##>+x*Et~@*+_@n4gI1SBf{JNW{orZd=YxNOuqwK)v z&Dwcl^ILWAJ{8N{Zt786EH#2zQt_MRwmZ>~g7g_^yV2cOwu2oZk*>ec@N_08^%8z& z*1=QM16$R(VaDpXSKXcd`Q4o#MbndQt;5v7Sh2QDPEh`9wi9=KFAl#v+KA-Rd9>6T z1eJr1S^@Wax9(qrxFSQ*{~vo_{Z(byMX7|6a_MdagiANljieym4bmV;BS?35cgLk$ zxB4t^oEJNET@1L$MtUZySi`;3FAy;DdpYa*);;=JEpZ_CeWGfLQdBOC^D?Ur8Gs;vB*%S2YCyE1a-T|8h?|)Ig>kL)vlR1ic9jGO=2F?>JYiCJochBFYKJo{Vhh~=X7lb=HIWtnYkNW~t!KN};~ zLMSVxs=60wg5N{uYfR;_2Xb(pYD_J$hkxDO=w7TJb=DE`~h4MTPfA3<`n5Ygs&sQSy z9L#VZZ@45sM)S(wR=%ox);4hR(Ng7HQg6b*+C7yv`PH8NPAFr0Ube@#n>C4>uItM- zk#bgMSRVT7y`wQI=I(+>Zk}0c>6^HtqZq~(;#+8{HS`pgZ~ydOXm%Nn|C(K!P2+-$ z9>vKg=33v~5hvQ2y_E?$#gE=5HJr_IqAfAm`+#R6!uc&2!SM9hnCk=tNYh-()UbfZ z-w28{EU-#9s?`aKuuIhy<{9`aZihwO-c2zf7K%J6;{rN2G5OTSjW}dpu;F@N7uM|z z7U>mcYtd5gN@(CId}YPb8LL%@dPQu9RA6FnGadhmlIYfgIOF znO}teTD+Z8n0E>=VAU!-;j6VTdP1bxJ_ax)TT6v+Bw=rA!VB9>|@amYGL`?u;_H{#5@HhYNsAe_-ijT*7qbSPT)B$$ugX|p-sE$zxE;;>Z z;t!hrp>%Pxw0pOmr6BJq)6!2Mg%y-2K*Q6m$|G!oOecrBLSC(wk+#kacxA9f7Qb0~ z-@*Bl4K<48Tb1~~+G9TX{C~w+e-d%1>&5jwks{DkQHKnDxby%G4 z4cWPhxPSaEKW*{5zJ6rX>##YxPrJz_M~}ChVD2|L72#1V?_a?b)@Rm$4fzkfM3d#e zRJ>zv;8_XFKir)RjYb>yV?(FSh&Cd!-eHg`rY4{WhS+cktA1-JT6%*i7C?1%1R?^b9$WvFNCx36%IoF5_fc_xy5vq^R{d7rSJkL<~YxnT5+k1%QhUInM z=2KsMCsp5iVLDDz*#|g0Qu$&6CwFec0!3zN6x--VzvOSoiX0!W_NsCm>Xaeh-w#nb zn4`32lZcUZ9zW9~NCcr0n)x3P6>%yTHF(~HgM^%R&G-Pge~>CT-=}Y(>~T%yMsHnO z?PR(a;`q@!Gmn%tseJ9rzU^nY{}wU#XfVS(bc=N z>K}a4PNylbkiW&mo1>y_gGENgn{748uq!5o*GdbP*!@L1;_rAMnFNL5cHF1;l&CY5 zbfYeLMHUG9MH1)FO4h*744`==OfPi~03xmceIq9b;GihwIRDEyBJrvQm?hHtM|zt8 zJq7qF0PK+jnsJ_YFH8@0fXtHTa8+UVa;rjsup*6VM&$pGzCuz8kV_^ST~)bWNGe|d z0!dyFYxqBrOp1tSK8x8BZwbN6t%?B7ilS&z?{k_E(2LLflIkNO<*=7qDFKZO$p|+& z+vrjHX;~g1x`BK_xg-OA_y5YA6p_4kKgeR`>Z0Y)N_qd5P2wn;|A6yDfFmB}36cKn zZok`D_vX|I2!){4gf`l5?d*BZ4D&58MXyX)*J+XhK7-IR<9*y+!#_kc zApR6(HpMj4dUrDiBy{HSoVcytyn<4?IbNG2ZyCR0cfcKNrw-VB#g<0Ku$z>>OnL;9 zy2Z13xtb=#996}pWV2RHCyEOG7iPmH=;D1gZEgErVqHYbv13<$FXdy2A5=a;Sc@`sS-Ws zoe%dvzF!;Wr`Qd$8uhV`<0f_-dukEIs4S!O-M{zhuuvpeyrF6zUGpUSBS_>ZxpouL zzYPtM;yNVr&FT_<85&C=oB8zmx1vwJ<=KPng0X)exPNLoUsD^ z`0od(`2I2bH`ajbKK=0SoA@`DfD2<@!A9o4{&&eMc(WOC3im!Qc5Or*3oFVCUK zcz)3To_hJ;2mRM{{}zVlq}>14217!7zMz*51rA#O@W`qd#Ec?B2#R*v=g;QVebnZ; zM6#5df(eHlLimVqEC)c%b4HidyV0l(Zsuno(YXi3@GHN8P1j>{M4R&@E>E$oR-xzW zrkW~FTshYPc8F^@9-h2k*LNM-*l9b_Z>@%c%3oQf{%0+%RI!@di}>r&D)9KIqSZmI z?8y+$GfuB@xsd$5_A_Jbom_IQ&!6;*Exo-1N(FP1OYsKbaJwI>ciG$auxC?pg4sFt z$xfT?>_}}Q?drQ8StQDh^t5Vgqf_K=_pwlOaVC#%P)=T5z+J8Ml9NvL@+*PYn5-D? zThzn)9ykmK)p}i|uzIW&gmmY(U*kUd^;A!BYsJ4Gmb=RRQ_mCd(M$DiBRrNAmqkf9 zZx3hLQ7vxuO>`U=FuP-$8C1%U`{^Fe-|H?{e^NvaTy{{3JBYzwuCV+llIAhNK z%NAS~Pdj?Qr}l-%8?9Sm9I$=9^#1*QZ59M(&@tQ(i#Vv2TGuvX9z5HBXcr@#C@$S_ zI!PJShm+ATa?&@|cGmfUN+eE9o=Nk0p_+|?ttd8C2HYzSV<7G!;aIvGsd^o&yyZ7c zT9~#Uxrifoe0G5Hx6`E*1&5oQBe$mW@HOX7(C0E0X<#3 z1X{M@_+=6wHE0?r?I~H;zHf(l5sOdXygvWpN@D!oXl8hfid*s>Maft3V=gcv+7{gx zE}nc12YO%MtR`oaOq}U`+!wt)fo>j`?bXGbzUYfGBE`)y$fz(Mz36|x*U+fOJUHJh zV_4)eaO{Z-TBH#8Z9}@OF#!~1n9DbC(Voi{`(`AJi_Uj47{xCP`6l`sr?a#ya}RpY zWi!B!s9|^go_kpq`|HbsoF`J&DrVN%Ne;=!~y>mm_I1I#E%~= zCit3Mb3Q|d6MV1WSm)fd_Vmwr;*5UU#4{4eS-aEuDVF|F!Ai}k-v46SaI(TR?1tfdi^8s^mIpv>0*SgW?A9o>s!*OjL`)A2ub3^$S^AoqruEO z=Wi)I6b#Z=fSdUi)*X5wJ5HRQyPsAib%VCO8vJm2S|{ji=ErsE8XopQRIIs#B*}d| zf;<2w%zDKiK!)U*PDQX4J2-l>%eCIhP}}6L+p0T13EVb!K}HSoRjV%mhHmmvwdle3 z>~e96T%2$x@?%-wrvVwtFpa5DZ`JDa~?`m8&lC zT2P=zn#I>_XK4;1R8`DGpbH;v@A`K;qX}|hoLkR7I8N*+hc-8#PpEWuY#E7QmyUf8 zsXX!PRm0wAv3j&2-`zsxXyF(Ib!Fo@=U&mNi9HEmEFqBvH|lDr>jSGr;A!zmi|yOn z>*6in*Pb};)`M|9Z{rS8$P>K-B8=nn&j7vDA^!FGJy=4|0u_c@qPc1%!&aBK^$XqI zr*AGe8Ru}fCDRT}d@}JAakek(KGQiik_MF4qoeTJ-q()Amj>5Qy zQxiXRSM~jx9?(&)29EYZ!D?7B#~$!_>oDc$X)9eG4cyBG z@&rcvRfu2e*VUxk`8eJYd7@j6>g_RYZaEn?$Wo+VstK$CeWkD&t%mHS%351*4r){Xbm^lrp-vRhrv zTgGa$QO*WF0cBjTRznRs=_l;B)6Avps$oz&@i?(*`v0QmSI7?QS|q^R#fXO+iYB%sE@ zWyJwA%Rl{CVZHqqL~2+684~6jVx2-P+nL}wlaGM(xeIwp*K&brUaUzCAYPFKKuF--?Vw+T0T3Wna?op(i5(vSqq= zXi$?2LHDjpZpqeOpNN+3>vRY~+x9VX6ckC;R?hrsvSCb~e{BQ_gYUehZkx~&^0T^A zTUlZ%xZXNktDUp!Vd}o9sBNdEzg)GTV_lQRu}4@Jt`kX931%kwBC#mwDR+=;;FNv2 z(LGOmc?fXPFtb)mJKrtOkavFE79lWCEqXZpqUT9a&Y=ZO$f4yZc#v1TM)Gyl*dF^$ zX!6^8$4xc9T^k3<*NzL}D-D3F*=S$*ZG{Z%)9w*Mwf=5-*v;jz9kyT-R?SbIyG}BW zgzWz2%yml?9r_W6HqiKiHM0}%$qqrEc@Qseqm%`qS0goRwS+iI@lC5fLLXhcaX&I% zT-DG~+@dS0R%1%%;tNj3|T)&=39f z^lvY=vE$Lri1%IL6q7x+LeYAf{B}7FS*u*5XH4CXCtWm*u|*awehmg0GwiMO6dxyV zQ}pyOiCNXD-gUO7DuRgJ8#1Vo!fa)nYR8by{ZYro{uqw`IPu{G&{StImA*Ij<5Bs6 zRhSgHMYyfC`W$f39UP&jyXqo_>-o?+c8cy}T=LPv)riSzLgRP@RiQ=$0y9Q$0~gEP zDR^nH&fDWD*0#at2kZ|vOm9$};3wARL|c#W^{5SR+hu3ibnh0`-7>xWVdUW7gg1p6 zZ|D<%=CUf29y*c`1VyGzbGqI)0rB&5wL@}j0y*YK@WAjzj7iM+%?{wseaLo}K7VvT^Fa6y==94U6OL%;aQUc?yT-xK4 zehy(%H-;xetI|Fq+!UE2q;Fvu#X*h{_e9J zLO+jVa1H;#!W=AW|Ht7k&3g48T(T5Tkz*b>FR%KT#S$?6Y#4d82G>!$iobv&#ce7^ zINUEEPaM@YPubW3=w_DFXh`|G)9lXFi%A?odpM>ysFyzKeZWZ?-xLTF99J2`@y+|f zba=pri($H-1~DzLu&YdIfTx z1J81%p+Y1uP6J5vEh@q(?MR|A{DL1yxsOqalw?xRD$ixPcXeQK)%r$THb*#>yg5CT z1$y?noK?Zvgx5MQZ7y0g>=IZ>Cldd9&}khejR$r3VEfW`uRUAt0L$ESwhox?1Kz9a z_Z|2BGq)HsQyv6&uCDkgxLFt?9}6d2@=5Z-9Oen&waKEybQ2VQfY63K#;7gRaPy=W za||dMO=y~Uz1p3(%@0liOY6B%mniosL`FX!^Yzoi}1 zRrfV=WHKv6=So@IFZgDd+ZdMN?V!KRfr=YbFVi9RG%z$fe)Tc>hzIrWKp(+f zxg1y~XV5k^%hyAK&-2KYyaW0lzVEq7BrJS^c6C2p<_m3a0JUg=}lX&$3j(aJjDgUo;{n6Fs@mz-kkNC zOZ0QyEIHfwOqV(TZVp&SLH+r3c_5+LwKhj0a*;&I^y}P)r+gZ6I3HZZXxxWyIp;bAICJH9A)b6b*>b<0p>0Tw58HXsZo2%`Kb*UXV0fn$~+h2t{cap;W3lPAc_Mk zO)RO&-RoNw4AWM84WWFqcL=XD{K70Y{I6?@=>u?Z%{b!{9`eMY+Jb>o%LojSrVW#$ zsZ3rkQ%Z>9Ch7XDwL4k_YV%}hKD*?wbg|F93%y-DxTVi1@B==iG^Z~O}3TmdF z9LTf=C76C61QHPbRIA>R1Bc#4)8Yw{k{Z{@(%=%U{53yxMU@KqS3{Pcf$YhC%Bd#> zkfIDvf3L6vsv=ed7`hW3Z}owMAYe*~aps+r&#Mv{ zr)L(VE_D4(rN!x?)Uz*PBf#z?;e$Cm>vNgEdh+7}qKu0eL^l(TMP7rD(~}2Y(O{{M z4Aaw>{WODs{^N#lh)tx3@#-bdW=;vo$h6RaRi=UFZ(BWoL8QvK591qabY#)k8x9gg zmD9gPpip{H5B>5#>n`Kb&oWA{^NC{{_xci^k1>wm2DcCTe1{hHOwX6POf6W3Z>BW7 zC1VY%5ggM2@g+pt(!in~c7MU!k2C_=@zB9qikaeeT+}RAs1?JI3VBru8_LfQ(+8OB zqH{93{dlOHWuI>grbN@DQ(T-R`GN?I?lTa{cJN}!Ea|2SU_ESvQ0;j3?ySFt%Qh&` zE1T|DzsA21-I+4O5TS~kbju^j^RsUtg8iQ3-g^^F@03f3l!i>1B>u^@jtWvA>)TyM zJX7sVs|j#6DjB*!%kTl9_-y&lRNUfd_T5+EQkZ>^Iw=JlQw3`gBJI}*f`MB`w z@Wl4ebUp@AW#}4Vg-ms%gdE;)B>Lk>>4&rsO}kFsL{@ripejy(w<=ftn~~4gzDc10 z39L!g0-?G*2nk0x4XIKH6O--2We!PTNqNRl22kU3#0pc1c&G~mMQV@Cll&CRKE2IQeR2#i+nq12CW#r6X!?>aR z6!?|h)67$6!&+;LK*nQHBKA{Us2#lu>ESH{(r6yolF3i?mK+O^!a;6-6)G2`OB% zqtlux9eGfq8*dbJW3yHzSZ#RlT?b%UUgg(u;``PSO%Hq7e_u!Nn(c3RcK3 z_~ebu@~jT_M;inWv%8J&(gfl-r7qrbO8(fPOf-g9>unO)i>iAuMV6o*ovQX`wT@vJ zEMbPj*IicLrc>Air%nLwajL>;Le6VAJHLF$ruOhUl5K>cWvwvNQ`o_g&HBq?SpP9i z+AG+~^*fS{udlptO3sH@k*6nvU&ZYPebWQVUr%r_j=%~>A;e`sz==j`MrSo==mC@g zv26|(f}%i(OBv$^iJyK;y!D}wEAQuTY@tlqV~k8KigeWlQT1S^L?a{4OPUED1pV0E zy%_cw?*xTKrEOi+i@eml3=O$Fak!GtK(Mq3Hy5sn3?CiWSDBKMnS#lB&~k`6(MTzk zsP7<70mRbeNn7NA(G^6d0~>}oCcJ|Y{9T+y+Hxm%&S$L0B}z@Xy78oLKoIaWxo!&~ zQ&B*C)TJb93fsU(b?0uo&0CCpOXoI#%tsdAEKe)@R-3D!RXl9kFkOOneKt9H2y(D_ z=DtaO5?h9CPDcW0+JW>kA_cOZu@|&Ik1t^vT;T2rs7rlfFF_v)AhMG{EqL^jEgpdi zw8b3@wSajE@BR1E|C;Il%ORm!gI}pDDNi{J-`9@JW49ry78R{k<7}wDe~u`k?J;W2 zS`3gMQWmCxzE$PfwAT3q@XyJ0agc0RDnAn^76dF14Xg_j+el+T9p0Y7@chO9VDoo{5 zFzgwCutSeLqf;5O2OJto;nW%g&jKxIxE|@>ppxqXH5XV$;p{s;`o!ZDt1ah>m)n4f{+j1-2ce2#?0nCR z@f*X%CSxFJ1i$J}2f6`DjTntv)0U~lC}MvZ8!uFO6*GR1($f-7lsX$v6n^)v7}R(V z9cf`pl{jP|0MrW^kie`v!|Do6icnIVyGdwPPkcg(QUD&UzzB&@gTNe`wBq;J7yh+|~GU57w3u)IA5~@Ap=gE&4JN5rqgS znAn0iKAC#F;hG+Paw8v?RfMQ*m|9H|5{K;fK5I7|GJk)q(+s8#Z_^KAhiGbOu9k7? zJYmE{`Wj?@*G_y-MTokfbY0gbJnos|Om2IV$k!nBba#^c!|k>$;~ogE6qrmXx{cQu zIX!^#(r%pvmYDmYbaatVg?#-+wDV$kGQ5%lG)8+(Z71Mu4?YV=P@* zUiZA6ycj@5=CzyXR(pR7v*~q?s3=4ET|3v3m&Z|-Z6f*`Nb@+}3)%HCt!Jti}Aj4jbY@kZF& z>8r1|%L-so=Qhj}N6 ze3w;JUz&NTRUDTK4b52E5c<&3A9}8h`gMk_!%TN#J?e~NL2v}b7r#W$HkXg+XX|%8 zoGs(#@}QM;#U1Qd-USLufV`<&mKnqy7v9$*9e+l&#Ed!KVAsj)HmCtwJIy-QWtoJoy(a(ZT&Fb@chDRy&iEbmjdmSh5`*WHc`d%B z7YE8H2sPm80WT&T3&yb6WuadiyZqHFGV$jMLltXUkj((-PifX$<@X%u0BFimsX{B5 zT*63AIYW-L$DZeVTBPiLwz+~#ipdZj;@QR9j3)zHBV1EGVYd0~c|C2xr6rv1C|po_ zjt+pynF7@l6{f-G!MriY7eaFvW)tYn6%Ms2u5Q)|>yG7}07lDT*g zyIVsa!Nwb5dMI5gO}1r4P_Y<)z7{Q2(F{kPja%W$;hfz-8p6h*go_Ezxy+pGl-2`{GF07kNoL=XoKPjGSLHm<=J zE26`L8$suTO(=u*S3aKko~Vp**sc{a^}km2?|z$B@#gvl4U=O(0qH&ESwcHl8$YZr zLtSKe#gcltYARKT%;L2svF_EaF-&%C3HRR+#0bgF+E&ay#`RnTH$6e)5|KP;G={wUI72d1q#Ka*qj zWCV|X;&+izUx=t*iM=#JTj&0dtJiW!-T{`816 zoX;xS8L)lgOnz*hsN-=L7yDJLtlZ8`3ht$SP;`}7B+OV^^H2APKD1$*_G+Xwv}U-$ z2qWhW@;n=!Z&I}>4kf$1WQgY@K%mYrs%~+PI?|g}Yh-(cZ8ALjg6RjTz5tLIW=2f$k{|Wqqi_=ArmSJ>_oS1$RLiaNwW2on? zOKu<~XKF^^hsdqt++>n0WYu*PNd?DF*3j%~UUA|-W2Z*xlQ#Vdwbr9oiBf=@(%_za zNhkbuW92-m#kZ^vbn_19<2;EN#qHkJSlnJ05Xi?VW%4eG4rWYpAv5vYf;qu8!fS&hdLLgu5|GZV?nMlV- z$BIx-H6o8$7qj&KuWB5)9HU*D0Og0@auVN!&afVZu_}xb#Jo#1LT1K`-U0lksoni* ziw|2KODdeXndcX3b^vL1qYxIvrAmw`yv+)4B1{IK<&OMiNT&<-BWhJgJsf^(Aw0{R z8WH&&hBgKkLAk-;ZP$D;r^j*aTu%{g!WWd!o%NVPzfRSGm$f@}lc1n$Ul1hwoD*T( z>`-AHo*d_#6dL&cf&^S~?yv^a^lAYX6_G}_NSLDY?>p)9AKlzcE81}n1UANl^L4?0 zi8x>pl}>v1nY~om-ue~tsY(VaJ3P->S)F_%DO=J;!EL;AXtL;kTP9b z9mo4~n@v5Qr*n@Qgi;b>_kB%OtNIO)KXqW>Yk2yocQHLuQ5qR|d{C>&o0{$bi#7W> zw7D!i0fJ^+#xrO#i8_}*vrD#F_YvzuT@TWl(c%ovphUG`$M6Epz!-$@@S?IUTpV;r zdmghDso(DH9E?$`{*zmqON7NmukT3f-v0vv&T&XwU?5lt{PoA9tF`LsH#Bh24)?M-zSc)i%w!lM!l{xWmv5IibBDY4U7C2muVfyZ6i<-n;H$6^bgMjca$C z-h+yU*vQMZtHfu#0rx?*P(v@YArtj(ryE<2-=8a=4o9c)9$g0HIlVb~0v6STLlx?R z9kJx1*K9_ez8B|(E-~VIj9f&MB;#aNHfnbhaze%t7B(F}%nDp#e1MXqPbdj98bO0! z=pheKb(F19kh3glNN+W&4>Db6 zcG*c^F+`QeJKzkJS#$@(5AkD^(Fs^mI{ueI`RZ8a@bs|%!nmcQ9K1eUIAIz~v#7MN zS6{diX;su`MvnknktXB`*eR1CHePw3U)E+@EYmvOLhuPkUbbRRR{rKkLVD`66TI zoF>&YDgU_v&su^aBrVIM|x=%#5}|LfrB1T<_4VulAz3>BpvI z7l-%~`Nu-KA#h}SKEBY)*L@7>dx{@^O*1q0e1RXT>#TZv3P8Qk7!xw9T%#sk^1V3vpHOn|m+R zp@7C10$Zdnr1bH0pr;=00@$9FYk{PK*Fa+gl5@}tez_|LtS67|U3f1#nK?gz#;_62 za4+xp7oZ|YKk?}!zbIoW2mp2$C#J&nQCQmStwWR9m50+?UZ% z*Sefzn@3(}vBX~Dtyr(as%ULKL}0?$02AQbc84`BlNbK&pF#fp4eTy}GTLX=l@$TCn`Sc?J>zx>78?DJ2(%^+0Fkk3MRlJV2B4>OQeGRa zSr@^4-Ei5I(Dv%XuYx}79M8D_Ya)MkChGWEPz2Iv8E@3ze#ad%{J9q@Rfg%j_($`D znZV;M6_8J-DMMzdIzvlGf6{Lzo(P?0gxSTh4fAJ-;fv@bw`S`5K7~-@2|kp*nDF64 z>#5sxZ6`N#Vz|pD`=8AF`#(xF0S%_MsSP4xTt2QWy?z7fYZ8*G>ePxh#H;f? z(vR2@K3;8@ph>&| zmON%^NJuqV1X%EZ4(`MdM$wQ&s`_uUHI%jouDVfISmb%Uf`GF(`I{kUdwkef!7JvTkY6-7%<5!j$~b6*&9vy16?&0GwrJoYE(T zGp0z``<>Le@dA&^dNJ-dfZB%>uvcun?>U@E6L5wjqwH$~@*;YP4q^@7oeezRIU%8J zMITRUfHAmyE`XD@_}(F|N2Oo<#BRTL#bMajKd}Hu7mw_3XwZ@Od%-z~R!;W~U*dJ< zu2!rO(fT3u`Q}wD-uxHayNtggGT z@^({cY53K>y%YZ1$fu+mK-S#ZPFNL+4|{K1r`iKbzNKa9RqiRIZ^ow*n5!`&n| zyu-n!tH|EEqX1?g*D@x@GtH;wcC!BWzIyP52BMUub8hzJ0 zG{Yq3#Gc*cKU!x#!JzY~Jc{5Ku`}1(Fay7^n5#Xme1V~7geu~Lukm+;qlap#YYwcI zv+>(a4KkEM9B>mq?KaHd0XNWTP)+(32c2-4s~4_N{ccVt-vcWmpE7YBzp$(l&`bJ5 zgqP-*IzLMrUOo5@v0c5_N0py3>laRE_xBB#Es3ApYs>XDbUKn5V8GZ$nLX~~Nk85P zoPIg;Lv*(r%w6*~!S3R#GalR(Z$iWkvrqP;SzFpH!fO4P!-~nl$Mbb!yvP*>YVzuy-f&&27fp@nz9G#DBiA+mk zJf8~Bi;z|k6fwo{li!Ot-GaRjVsRfoP0~MQs)KvF8Wa_DHm%;J6FqC}xT3y+-$;7s zNi>@6%$$z9te|ODbE=73x|V1y(Kd0ZvPK4fu$gw8rVabK(f(#R))L@rwym*Y30Cu% z`e^5)jIdeJ92m{67`S0<wzF8&h%e0<3TF@NF_Ah+a6D}2E?IV?umAUChhdhy zc#>pv^QJiC@&fTYg-r3_O2us%QLwkuuDi2nKWlF3_n?XoXg0bDXH3m3u$9$(>&KPA z(X3}ANJAM73X?P-ynw_5s9H2JIao1>1EeDaZ*v4E2-_Lo5^Zt?qcI3dDV4oM6`2gjYz*9tpf>M7$0mBY2qm$CvpGuZ$e zH47a=egc4x$%-Zc=&|cVBp@l(q!F^-*GYUqUl+fz7`i+mtJ#f7u6eKd_~j(*yCizY z29S^;R!^Y&>M5qyeUFko{h@dEXm5QJN|7|fmY7#-z;qtml%TIEPSw#io&T*eu^{@S zSDIzPKZkt#9A64u66v zKmto}91cm5oza0jNiR(2%0z}#3ZQ)>nOnRgLt^q<;+5{q<@N_nFfr0~n$bvemlpqm( zKKDZncjkl%aKn>zy(RiRFGJdSj+>>3dq7(~TWB$l7xj^tfsu#RExmw*OmLfW7*CXN zwS{ix0|_~sCW4n+wrAP?z0h6t8|i6(Z1_rh7O;UoS1>idg7@GB%H|-q<;UhWT;V13 z=nCb%jq;wjz~CvjEjs32L;T6p0n*$O;(cXn4{@kS;3!2NxpoyB_xvIx>S=h(UN9vz9YOo+rdV2x{*AxwAq*oAW4hI*0sObG@*vnJeGwbyfA@Bh(PVTGq(b#Zcc~h;%8~oAzl|wT|DTXk}eLc|; z^}`^>=Bm*0QRVv7SH^Tyxmr%a-i5DwN!dF4pXhXo>U@81+%!^iG_$HQ!=TE|{E9L; zIa}>-|Ago}uM*boA;UW9>izgV#JEqNjS%d_ry}~y`?74`W47|+N|=T?O005ebXF(e z2jvjnVIcZQ1M+}t2@-MbNtGvgb=$rn7iv`ILcfbTxS}*0heO%hq=3XBPzs$A-tv7nQb3MDj2%Ob2zXg!d*y8*~>5Tc58P;Jd_ux(dV$Rx(iV=mKz0y4Z%R$9!ENS zKmh_s$_D-ac4>i)pk~7d>UMb^rLEc*15iY`L1EGd6h9#brUxb5rx^vl{NEP!xpCEd ziW`r{0NV>Z4$2ptfZGcJyQ@Y+7?KS*{eRPpy#BZ5i}kz|8fVo1XLFGNQjy3PiwZzt zN@jGxGL15v9mna4GOt#?KnM~7G@2mjB46__pwmx4<*a9X!z+kPe$6|;uY3V3>hK0B zS$R_O*TzdfNp!mg?7)PPpM7~jFA7Yd%+^S^-il1`xpnCVXzPongLwF!JN%0hlo@Hj zk2cwDa;t5(t|AvA$kOv0%df$Vi-B<2OHb^*F#kP`Mux-^hACrA!AA!1#P5H;?gz>U zcJBbkr#f=O`*{5~JTHn2fE0vyT;UXohfJAT9bJKT)&;W8e?EkS4Q6~mSR|UGIKE!; zDf>koAVPo!J|~q#zdPw-@4dbx2j0K2_$(+PFb_|L*IFuIm>ooxj-OIA@#BB0JV*(O z)LD#E=~`?VWIFl%2Zsp|m`5N(vtZv-B_k$E$zt*H|5rMeMwY}97WDzrSw8w{(zorw z4NVM_UuMqj*^bnnP-b)irjN?*2yeEi&Q9ewJ(*A7{@EZFKBt8w%f6xnUnEkJUFqhF z(ZcgrWVpe9K@fz23evwxg9E2N<2FUyUZ2PVcBli$nB{Q!O84^V7XESB`l;j#VNi#A z6UdaS^s;2mi+D~rl+gMj%wBZyAz;!senKRr<=B}jM-I+ zCu9VXQ5c2C`e$#YD1lr|k>a|Fp@nIlGWV~itF$kZ_8z90D6+Ap`Sf@P;!l;cb>{x5 zRVZqhols*jkBFR@Fc$3(58QK8LkzF4b3}95ent9dB|@-cMf@EFpzgyxHY^w#>GaaQ zlb4d`8Bw5unrM};Ta@__V0b7iX80~l8FZ27oaj`nr>GQva(gMOE};l@^3Gfdz5miE z!hffSTc@SR4KBOLu+=!=rZ0?8f{Medi8piHEnW95sZ|47zR z=+y1mCy$I*KBOGl6}s}T1{5W#02DF|qsmip9OkDa6H}%l3~y7Vxbl~IL?N#Y>{pwj zahoqa{)Gkr0X|J>m4II?;S8`SL@B=_GJ8X7^HlJWO7BT6X#spezKLj|P3(vPep!rBZ0 zYH+E;zKqM?-D@@7DS5@H@IC1Hfmc2=7>tt4_=L7|r{EQmURwN>qFp^T{(Z}WAyp;? zmLOCva1xCh3D5xgtV<$ezt7G2N=nO^CUE)yBOS>yJ-Q1`4FkUZUtZf<9bg(;G>JTu z9UfL*Q7TjqdX(oUWDGD%W(1-BO3)i+y4jrHdwpo9z@1m`Jcu>d=#YHSx=bMROTsPa?oq6qB& zMv5-Xtz^(wZM)GRVn0w6tCU9ykm$nMFEzRjN>Z^#qRVlPv^ob~k&B1Mu6R5tHZD$R z?@cY_?_5D9VLv|I?prf&JfIle1hoYZ%-e@AZDt{kPO-Dn-;UhmmGoA{pN}Sa8cm)v s;AI6JFVr>&UM|(Ox<}_UKk*X|{YffQ=)HLb{7H(+ij)cck0mq#05L|w?*IS* literal 0 HcmV?d00001 diff --git a/docusaurus/docs/React/assets/poll-comment-list.png b/docusaurus/docs/React/assets/poll-comment-list.png new file mode 100644 index 0000000000000000000000000000000000000000..415a9066f5004bcea0edc9c229ab3da08051cc5f GIT binary patch literal 139824 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 OKRGGocV!YEKK?&Gi;FA( literal 0 HcmV?d00001 diff --git a/docusaurus/docs/React/assets/poll-creation-dialog.png b/docusaurus/docs/React/assets/poll-creation-dialog.png new file mode 100644 index 0000000000000000000000000000000000000000..4c4abf320827ae5aa65c4773c4c1347db0d8e862 GIT binary patch literal 159885 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�uo%`gjHDs6HX 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

Mk;(NCc^IrN#h%)eDnvgIg_s!J&!Bn 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

    kL>Rep1&8qQ+=-@1D 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 z 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 literal 0 HcmV?d00001 diff --git a/docusaurus/docs/React/assets/poll-option-full-list.png b/docusaurus/docs/React/assets/poll-option-full-list.png new file mode 100644 index 0000000000000000000000000000000000000000..c20f0cf761a89b67dc40b47d3387f53db42a7abe GIT binary patch literal 75451 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%0A2aD5)avhvFt$JsA@uA&VBY`Zb*2A$2>iGA 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
    Qw+hN7q&eGq{@%TF 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