From 7dfabd74287736d3d92db0606b8a0b496dc8cafb Mon Sep 17 00:00:00 2001 From: Khushal Agarwal Date: Wed, 11 Feb 2026 11:35:16 +0530 Subject: [PATCH 1/5] feat: poll ui in message view --- .../Message/MessageSimple/MessageContent.tsx | 5 +- package/src/components/Poll/Poll.tsx | 52 ++++-- .../Poll/components/PollButtons.tsx | 104 ++++++++--- .../components/Poll/components/PollOption.tsx | 166 +++++++++++------- .../Poll/hook/useIsPollCreatedByClient.ts | 13 ++ .../ProgressControl/ProgressBar.tsx | 52 ++++++ .../ProgressControl/ProgressControl.tsx | 4 +- .../src/components/ui/Avatar/AvatarStack.tsx | 2 +- package/src/components/ui/Button/Button.tsx | 18 +- .../src/contexts/themeContext/utils/theme.ts | 22 ++- 10 files changed, 319 insertions(+), 119 deletions(-) create mode 100644 package/src/components/Poll/hook/useIsPollCreatedByClient.ts create mode 100644 package/src/components/ProgressControl/ProgressBar.tsx diff --git a/package/src/components/Message/MessageSimple/MessageContent.tsx b/package/src/components/Message/MessageSimple/MessageContent.tsx index 86317a3700..9489e4953f 100644 --- a/package/src/components/Message/MessageSimple/MessageContent.tsx +++ b/package/src/components/Message/MessageSimple/MessageContent.tsx @@ -78,9 +78,8 @@ const styles = StyleSheet.create({ position: 'absolute', }, replyContainer: { - flexDirection: 'row', - paddingHorizontal: 8, - paddingTop: 8, + paddingHorizontal: primitives.spacingXs, + paddingTop: primitives.spacingXs, }, rightAlignContent: { justifyContent: 'flex-end', diff --git a/package/src/components/Poll/Poll.tsx b/package/src/components/Poll/Poll.tsx index dc64810994..6493d069c5 100644 --- a/package/src/components/Poll/Poll.tsx +++ b/package/src/components/Poll/Poll.tsx @@ -15,6 +15,8 @@ import { useTranslationContext, } from '../../contexts'; +import { primitives } from '../../theme'; + export type PollProps = Pick & Pick; @@ -24,8 +26,10 @@ export type PollContentProps = { }; export const PollHeader = () => { + const styles = useStyles(); const { t } = useTranslationContext(); const { enforceUniqueVote, isClosed, maxVotesAllowed, name } = usePollState(); + const subtitle = useMemo(() => { if (isClosed) { return t('Vote ended'); @@ -41,7 +45,6 @@ export const PollHeader = () => { const { theme: { - colors: { text_high_emphasis, text_low_emphasis }, poll: { message: { header }, }, @@ -49,12 +52,10 @@ export const PollHeader = () => { } = useTheme(); return ( - <> - {name} - - {subtitle} - - + + {name} + {subtitle} + ); }; @@ -63,6 +64,7 @@ export const PollContent = ({ PollHeader: PollHeaderOverride, }: PollContentProps) => { const { options } = usePollState(); + const styles = useStyles(); const { theme: { @@ -98,9 +100,33 @@ export const Poll = ({ message, poll, PollContent: PollContentOverride }: PollPr ); -const styles = StyleSheet.create({ - container: { padding: 15, width: 270 }, - headerSubtitle: { fontSize: 12, marginTop: 4 }, - headerTitle: { fontSize: 16, fontWeight: '500' }, - optionsWrapper: { marginTop: 12 }, -}); +const useStyles = () => { + const { + theme: { semantics }, + } = useTheme(); + return useMemo(() => { + return StyleSheet.create({ + container: { + width: 256, // TODO: Fix this + padding: primitives.spacingMd, + gap: primitives.spacingLg, + }, + headerContainer: { gap: primitives.spacingXxs }, + headerSubtitle: { + color: semantics.chatTextIncoming, + fontSize: primitives.typographyFontSizeSm, + fontWeight: primitives.typographyFontWeightRegular, + lineHeight: primitives.typographyLineHeightTight, + }, + headerTitle: { + color: semantics.chatTextIncoming, + fontSize: primitives.typographyFontSizeMd, + fontWeight: primitives.typographyFontWeightSemiBold, + lineHeight: primitives.typographyLineHeightNormal, + }, + optionsWrapper: { + gap: primitives.spacingMd, + }, + }); + }, [semantics]); +}; diff --git a/package/src/components/Poll/components/PollButtons.tsx b/package/src/components/Poll/components/PollButtons.tsx index be1903b966..c951f33197 100644 --- a/package/src/components/Poll/components/PollButtons.tsx +++ b/package/src/components/Poll/components/PollButtons.tsx @@ -1,7 +1,7 @@ -import React, { useCallback, useState } from 'react'; -import { Modal } from 'react-native'; +import React, { useCallback, useMemo, useState } from 'react'; +import { Modal, StyleSheet, View } from 'react-native'; -import { GenericPollButton, PollButtonProps } from './Button'; +import { PollButtonProps } from './Button'; import { PollAnswersList } from './PollAnswersList'; import { PollInputDialog } from './PollInputDialog'; import { PollModalHeader } from './PollModalHeader'; @@ -9,7 +9,10 @@ import { PollAllOptions } from './PollOption'; import { PollResults } from './PollResults'; import { useChatContext, usePollContext, useTheme, useTranslationContext } from '../../../contexts'; +import { primitives } from '../../../theme'; +import { Button } from '../../ui'; import { SafeAreaViewWrapper } from '../../UIComponents/SafeAreaViewWrapper'; +import { useIsPollCreatedByClient } from '../hook/useIsPollCreatedByClient'; import { usePollState } from '../hooks/usePollState'; export const ViewResultsButton = (props: PollButtonProps) => { @@ -32,6 +35,7 @@ export const ViewResultsButton = (props: PollButtonProps) => { colors: { white }, }, } = useTheme(); + const styles = useStyles(); const onRequestClose = useCallback(() => { setShowResults(false); @@ -39,7 +43,14 @@ export const ViewResultsButton = (props: PollButtonProps) => { return ( <> - +