stream-chat-react-native-core 9.3.1-beta.4 → 9.3.1-beta.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (144) hide show
  1. package/lib/commonjs/components/Message/MessageItemView/MessageContent.js +4 -0
  2. package/lib/commonjs/components/Message/MessageItemView/MessageContent.js.map +1 -1
  3. package/lib/commonjs/components/Poll/Poll.js +21 -1
  4. package/lib/commonjs/components/Poll/Poll.js.map +1 -1
  5. package/lib/commonjs/components/Poll/components/PollButtons.js +39 -55
  6. package/lib/commonjs/components/Poll/components/PollButtons.js.map +1 -1
  7. package/lib/commonjs/components/Poll/components/PollOption.js +6 -19
  8. package/lib/commonjs/components/Poll/components/PollOption.js.map +1 -1
  9. package/lib/commonjs/components/Poll/contexts/PollUIStateContext.js +147 -0
  10. package/lib/commonjs/components/Poll/contexts/PollUIStateContext.js.map +1 -0
  11. package/lib/commonjs/components/Poll/contexts/index.js +15 -0
  12. package/lib/commonjs/components/Poll/contexts/index.js.map +1 -0
  13. package/lib/commonjs/components/Poll/hooks/useEndVote.js +48 -0
  14. package/lib/commonjs/components/Poll/hooks/useEndVote.js.map +1 -0
  15. package/lib/commonjs/components/Poll/hooks/usePollAccessibilityActions.js +153 -0
  16. package/lib/commonjs/components/Poll/hooks/usePollAccessibilityActions.js.map +1 -0
  17. package/lib/commonjs/components/Poll/hooks/usePollAccessibilityLabel.js +64 -0
  18. package/lib/commonjs/components/Poll/hooks/usePollAccessibilityLabel.js.map +1 -0
  19. package/lib/commonjs/components/Poll/hooks/usePollState.js +2 -35
  20. package/lib/commonjs/components/Poll/hooks/usePollState.js.map +1 -1
  21. package/lib/commonjs/components/Poll/hooks/usePollVoteToggle.js +41 -0
  22. package/lib/commonjs/components/Poll/hooks/usePollVoteToggle.js.map +1 -0
  23. package/lib/commonjs/components/UIComponents/BottomSheetModal.js +40 -0
  24. package/lib/commonjs/components/UIComponents/BottomSheetModal.js.map +1 -1
  25. package/lib/commonjs/contexts/overlayContext/MessageOverlayHostLayer.js +15 -0
  26. package/lib/commonjs/contexts/overlayContext/MessageOverlayHostLayer.js.map +1 -1
  27. package/lib/commonjs/i18n/ar.json +9 -1
  28. package/lib/commonjs/i18n/en.json +8 -0
  29. package/lib/commonjs/i18n/es.json +9 -1
  30. package/lib/commonjs/i18n/fr.json +9 -1
  31. package/lib/commonjs/i18n/he.json +9 -1
  32. package/lib/commonjs/i18n/hi.json +9 -1
  33. package/lib/commonjs/i18n/it.json +9 -1
  34. package/lib/commonjs/i18n/ja.json +9 -1
  35. package/lib/commonjs/i18n/ko.json +9 -1
  36. package/lib/commonjs/i18n/nl.json +9 -1
  37. package/lib/commonjs/i18n/pt-br.json +9 -1
  38. package/lib/commonjs/i18n/ru.json +9 -1
  39. package/lib/commonjs/i18n/tr.json +9 -1
  40. package/lib/commonjs/version.json +1 -1
  41. package/lib/module/components/Message/MessageItemView/MessageContent.js +4 -0
  42. package/lib/module/components/Message/MessageItemView/MessageContent.js.map +1 -1
  43. package/lib/module/components/Poll/Poll.js +21 -1
  44. package/lib/module/components/Poll/Poll.js.map +1 -1
  45. package/lib/module/components/Poll/components/PollButtons.js +39 -55
  46. package/lib/module/components/Poll/components/PollButtons.js.map +1 -1
  47. package/lib/module/components/Poll/components/PollOption.js +6 -19
  48. package/lib/module/components/Poll/components/PollOption.js.map +1 -1
  49. package/lib/module/components/Poll/contexts/PollUIStateContext.js +147 -0
  50. package/lib/module/components/Poll/contexts/PollUIStateContext.js.map +1 -0
  51. package/lib/module/components/Poll/contexts/index.js +15 -0
  52. package/lib/module/components/Poll/contexts/index.js.map +1 -0
  53. package/lib/module/components/Poll/hooks/useEndVote.js +48 -0
  54. package/lib/module/components/Poll/hooks/useEndVote.js.map +1 -0
  55. package/lib/module/components/Poll/hooks/usePollAccessibilityActions.js +153 -0
  56. package/lib/module/components/Poll/hooks/usePollAccessibilityActions.js.map +1 -0
  57. package/lib/module/components/Poll/hooks/usePollAccessibilityLabel.js +64 -0
  58. package/lib/module/components/Poll/hooks/usePollAccessibilityLabel.js.map +1 -0
  59. package/lib/module/components/Poll/hooks/usePollState.js +2 -35
  60. package/lib/module/components/Poll/hooks/usePollState.js.map +1 -1
  61. package/lib/module/components/Poll/hooks/usePollVoteToggle.js +41 -0
  62. package/lib/module/components/Poll/hooks/usePollVoteToggle.js.map +1 -0
  63. package/lib/module/components/UIComponents/BottomSheetModal.js +40 -0
  64. package/lib/module/components/UIComponents/BottomSheetModal.js.map +1 -1
  65. package/lib/module/contexts/overlayContext/MessageOverlayHostLayer.js +15 -0
  66. package/lib/module/contexts/overlayContext/MessageOverlayHostLayer.js.map +1 -1
  67. package/lib/module/i18n/ar.json +9 -1
  68. package/lib/module/i18n/en.json +8 -0
  69. package/lib/module/i18n/es.json +9 -1
  70. package/lib/module/i18n/fr.json +9 -1
  71. package/lib/module/i18n/he.json +9 -1
  72. package/lib/module/i18n/hi.json +9 -1
  73. package/lib/module/i18n/it.json +9 -1
  74. package/lib/module/i18n/ja.json +9 -1
  75. package/lib/module/i18n/ko.json +9 -1
  76. package/lib/module/i18n/nl.json +9 -1
  77. package/lib/module/i18n/pt-br.json +9 -1
  78. package/lib/module/i18n/ru.json +9 -1
  79. package/lib/module/i18n/tr.json +9 -1
  80. package/lib/module/version.json +1 -1
  81. package/lib/typescript/components/Message/MessageItemView/MessageContent.d.ts.map +1 -1
  82. package/lib/typescript/components/Poll/Poll.d.ts.map +1 -1
  83. package/lib/typescript/components/Poll/components/PollButtons.d.ts.map +1 -1
  84. package/lib/typescript/components/Poll/components/PollOption.d.ts.map +1 -1
  85. package/lib/typescript/components/Poll/contexts/PollUIStateContext.d.ts +31 -0
  86. package/lib/typescript/components/Poll/contexts/PollUIStateContext.d.ts.map +1 -0
  87. package/lib/typescript/components/Poll/contexts/index.d.ts +2 -0
  88. package/lib/typescript/components/Poll/contexts/index.d.ts.map +1 -0
  89. package/lib/typescript/components/Poll/hooks/useEndVote.d.ts +7 -0
  90. package/lib/typescript/components/Poll/hooks/useEndVote.d.ts.map +1 -0
  91. package/lib/typescript/components/Poll/hooks/usePollAccessibilityActions.d.ts +25 -0
  92. package/lib/typescript/components/Poll/hooks/usePollAccessibilityActions.d.ts.map +1 -0
  93. package/lib/typescript/components/Poll/hooks/usePollAccessibilityLabel.d.ts +8 -0
  94. package/lib/typescript/components/Poll/hooks/usePollAccessibilityLabel.d.ts.map +1 -0
  95. package/lib/typescript/components/Poll/hooks/usePollState.d.ts.map +1 -1
  96. package/lib/typescript/components/Poll/hooks/usePollVoteToggle.d.ts +8 -0
  97. package/lib/typescript/components/Poll/hooks/usePollVoteToggle.d.ts.map +1 -0
  98. package/lib/typescript/components/UIComponents/BottomSheetModal.d.ts.map +1 -1
  99. package/lib/typescript/contexts/overlayContext/MessageOverlayHostLayer.d.ts.map +1 -1
  100. package/lib/typescript/i18n/ar.json +9 -1
  101. package/lib/typescript/i18n/en.json +8 -0
  102. package/lib/typescript/i18n/es.json +9 -1
  103. package/lib/typescript/i18n/fr.json +9 -1
  104. package/lib/typescript/i18n/he.json +9 -1
  105. package/lib/typescript/i18n/hi.json +9 -1
  106. package/lib/typescript/i18n/it.json +9 -1
  107. package/lib/typescript/i18n/ja.json +9 -1
  108. package/lib/typescript/i18n/ko.json +9 -1
  109. package/lib/typescript/i18n/nl.json +9 -1
  110. package/lib/typescript/i18n/pt-br.json +9 -1
  111. package/lib/typescript/i18n/ru.json +9 -1
  112. package/lib/typescript/i18n/tr.json +9 -1
  113. package/lib/typescript/utils/i18n/Streami18n.d.ts +8 -0
  114. package/lib/typescript/utils/i18n/Streami18n.d.ts.map +1 -1
  115. package/package.json +1 -1
  116. package/src/components/Message/MessageItemView/MessageContent.tsx +4 -0
  117. package/src/components/Poll/Poll.tsx +29 -2
  118. package/src/components/Poll/components/PollButtons.tsx +37 -44
  119. package/src/components/Poll/components/PollOption.tsx +4 -13
  120. package/src/components/Poll/contexts/PollUIStateContext.tsx +105 -0
  121. package/src/components/Poll/contexts/index.ts +1 -0
  122. package/src/components/Poll/hooks/__tests__/usePollAccessibilityActions.test.tsx +358 -0
  123. package/src/components/Poll/hooks/__tests__/usePollAccessibilityLabel.test.tsx +142 -0
  124. package/src/components/Poll/hooks/useEndVote.ts +37 -0
  125. package/src/components/Poll/hooks/usePollAccessibilityActions.ts +191 -0
  126. package/src/components/Poll/hooks/usePollAccessibilityLabel.ts +75 -0
  127. package/src/components/Poll/hooks/usePollState.ts +3 -26
  128. package/src/components/Poll/hooks/usePollVoteToggle.ts +34 -0
  129. package/src/components/UIComponents/BottomSheetModal.tsx +44 -1
  130. package/src/contexts/overlayContext/MessageOverlayHostLayer.tsx +17 -1
  131. package/src/i18n/ar.json +9 -1
  132. package/src/i18n/en.json +8 -0
  133. package/src/i18n/es.json +9 -1
  134. package/src/i18n/fr.json +9 -1
  135. package/src/i18n/he.json +9 -1
  136. package/src/i18n/hi.json +9 -1
  137. package/src/i18n/it.json +9 -1
  138. package/src/i18n/ja.json +9 -1
  139. package/src/i18n/ko.json +9 -1
  140. package/src/i18n/nl.json +9 -1
  141. package/src/i18n/pt-br.json +9 -1
  142. package/src/i18n/ru.json +9 -1
  143. package/src/i18n/tr.json +9 -1
  144. package/src/version.json +1 -1
@@ -1,4 +1,4 @@
1
- import React, { useCallback, useMemo, useState } from 'react';
1
+ import React, { useCallback, useMemo } from 'react';
2
2
  import { Modal, StyleSheet, View } from 'react-native';
3
3
  import { GestureHandlerRootView } from 'react-native-gesture-handler';
4
4
 
@@ -13,13 +13,22 @@ import { useChatContext, usePollContext, useTheme, useTranslationContext } from
13
13
  import { primitives } from '../../../theme';
14
14
  import { defaultPollOptionCount } from '../../../utils/constants';
15
15
  import { SafeAreaViewWrapper } from '../../UIComponents/SafeAreaViewWrapper';
16
+ import {
17
+ useAddCommentOpen,
18
+ useAllCommentsOpen,
19
+ useAllOptionsOpen,
20
+ usePollUIStateContext,
21
+ useSuggestOptionOpen,
22
+ useViewResultsOpen,
23
+ } from '../contexts/PollUIStateContext';
16
24
  import { useIsPollCreatedByCurrentUser } from '../hook/useIsPollCreatedByCurrentUser';
17
25
  import { usePollState } from '../hooks/usePollState';
18
26
 
19
27
  export const ViewResultsButton = (props: PollButtonProps) => {
20
28
  const { t } = useTranslationContext();
21
29
  const { message, poll } = usePollContext();
22
- const [showResults, setShowResults] = useState(false);
30
+ const { closeViewResults, openViewResults } = usePollUIStateContext();
31
+ const showResults = useViewResultsOpen();
23
32
  const { onPress } = props;
24
33
 
25
34
  const onPressHandler = useCallback(() => {
@@ -28,15 +37,11 @@ export const ViewResultsButton = (props: PollButtonProps) => {
28
37
  return;
29
38
  }
30
39
 
31
- setShowResults(true);
32
- }, [message, onPress, poll]);
40
+ openViewResults();
41
+ }, [message, onPress, openViewResults, poll]);
33
42
 
34
43
  const styles = useStyles();
35
44
 
36
- const onRequestClose = useCallback(() => {
37
- setShowResults(false);
38
- }, []);
39
-
40
45
  return (
41
46
  <>
42
47
  <GenericPollButton
@@ -46,10 +51,10 @@ export const ViewResultsButton = (props: PollButtonProps) => {
46
51
  type='outline'
47
52
  />
48
53
  {showResults ? (
49
- <Modal animationType='slide' onRequestClose={onRequestClose} visible={showResults}>
54
+ <Modal animationType='slide' onRequestClose={closeViewResults} visible={showResults}>
50
55
  <GestureHandlerRootView style={styles.modalRoot}>
51
56
  <SafeAreaViewWrapper style={styles.safeArea}>
52
- <PollModalHeader onPress={onRequestClose} title={t('Poll Results')} />
57
+ <PollModalHeader onPress={closeViewResults} title={t('Poll Results')} />
53
58
  <PollResults message={message} poll={poll} />
54
59
  </SafeAreaViewWrapper>
55
60
  </GestureHandlerRootView>
@@ -61,7 +66,8 @@ export const ViewResultsButton = (props: PollButtonProps) => {
61
66
 
62
67
  export const ShowAllOptionsButton = (props: PollButtonProps) => {
63
68
  const { t } = useTranslationContext();
64
- const [showAllOptions, setShowAllOptions] = useState(false);
69
+ const { closeAllOptions, openAllOptions } = usePollUIStateContext();
70
+ const showAllOptions = useAllOptionsOpen();
65
71
  const { message, poll } = usePollContext();
66
72
  const { options } = usePollState();
67
73
  const { onPress } = props;
@@ -72,12 +78,8 @@ export const ShowAllOptionsButton = (props: PollButtonProps) => {
72
78
  return;
73
79
  }
74
80
 
75
- setShowAllOptions(true);
76
- }, [message, onPress, poll]);
77
-
78
- const onRequestClose = useCallback(() => {
79
- setShowAllOptions(false);
80
- }, []);
81
+ openAllOptions();
82
+ }, [message, onPress, openAllOptions, poll]);
81
83
 
82
84
  const styles = useStyles();
83
85
 
@@ -90,10 +92,10 @@ export const ShowAllOptionsButton = (props: PollButtonProps) => {
90
92
  />
91
93
  ) : null}
92
94
  {showAllOptions ? (
93
- <Modal animationType='slide' onRequestClose={onRequestClose} visible={showAllOptions}>
95
+ <Modal animationType='slide' onRequestClose={closeAllOptions} visible={showAllOptions}>
94
96
  <GestureHandlerRootView style={styles.modalRoot}>
95
97
  <SafeAreaViewWrapper style={styles.safeArea}>
96
- <PollModalHeader onPress={onRequestClose} title={t('Poll Options')} />
98
+ <PollModalHeader onPress={closeAllOptions} title={t('Poll Options')} />
97
99
  <PollAllOptions message={message} poll={poll} />
98
100
  </SafeAreaViewWrapper>
99
101
  </GestureHandlerRootView>
@@ -107,7 +109,8 @@ export const ShowAllCommentsButton = (props: PollButtonProps) => {
107
109
  const { t } = useTranslationContext();
108
110
  const { message, poll } = usePollContext();
109
111
  const { answersCount } = usePollState();
110
- const [showAnswers, setShowAnswers] = useState(false);
112
+ const { closeAllComments, openAllComments } = usePollUIStateContext();
113
+ const showAnswers = useAllCommentsOpen();
111
114
  const { onPress } = props;
112
115
 
113
116
  const onPressHandler = useCallback(() => {
@@ -116,15 +119,11 @@ export const ShowAllCommentsButton = (props: PollButtonProps) => {
116
119
  return;
117
120
  }
118
121
 
119
- setShowAnswers(true);
120
- }, [message, onPress, poll]);
122
+ openAllComments();
123
+ }, [message, onPress, openAllComments, poll]);
121
124
 
122
125
  const styles = useStyles();
123
126
 
124
- const onRequestClose = useCallback(() => {
125
- setShowAnswers(false);
126
- }, []);
127
-
128
127
  return (
129
128
  <>
130
129
  {answersCount && answersCount > 0 ? (
@@ -134,10 +133,10 @@ export const ShowAllCommentsButton = (props: PollButtonProps) => {
134
133
  />
135
134
  ) : null}
136
135
  {showAnswers ? (
137
- <Modal animationType='slide' onRequestClose={onRequestClose} visible={showAnswers}>
136
+ <Modal animationType='slide' onRequestClose={closeAllComments} visible={showAnswers}>
138
137
  <GestureHandlerRootView style={styles.modalRoot}>
139
138
  <SafeAreaViewWrapper style={styles.safeArea}>
140
- <PollModalHeader onPress={onRequestClose} title={t('Poll Comments')} />
139
+ <PollModalHeader onPress={closeAllComments} title={t('Poll Comments')} />
141
140
  <PollAnswersList message={message} poll={poll} />
142
141
  </SafeAreaViewWrapper>
143
142
  </GestureHandlerRootView>
@@ -151,7 +150,8 @@ export const SuggestOptionButton = (props: PollButtonProps) => {
151
150
  const { t } = useTranslationContext();
152
151
  const { message, poll } = usePollContext();
153
152
  const { addOption, allowUserSuggestedOptions, isClosed } = usePollState();
154
- const [showAddOptionDialog, setShowAddOptionDialog] = useState(false);
153
+ const { closeSuggestOption, openSuggestOption } = usePollUIStateContext();
154
+ const showAddOptionDialog = useSuggestOptionOpen();
155
155
  const { onPress } = props;
156
156
 
157
157
  const onPressHandler = useCallback(() => {
@@ -160,12 +160,8 @@ export const SuggestOptionButton = (props: PollButtonProps) => {
160
160
  return;
161
161
  }
162
162
 
163
- setShowAddOptionDialog(true);
164
- }, [message, onPress, poll]);
165
-
166
- const onRequestClose = useCallback(() => {
167
- setShowAddOptionDialog(false);
168
- }, []);
163
+ openSuggestOption();
164
+ }, [message, onPress, openSuggestOption, poll]);
169
165
 
170
166
  return (
171
167
  <>
@@ -174,7 +170,7 @@ export const SuggestOptionButton = (props: PollButtonProps) => {
174
170
  ) : null}
175
171
  {showAddOptionDialog ? (
176
172
  <PollInputDialog
177
- closeDialog={onRequestClose}
173
+ closeDialog={closeSuggestOption}
178
174
  onSubmit={addOption}
179
175
  placeholder={t('Enter a new option')}
180
176
  title={t('Suggest an option')}
@@ -189,7 +185,8 @@ export const AddCommentButton = (props: PollButtonProps) => {
189
185
  const { t } = useTranslationContext();
190
186
  const { message, poll } = usePollContext();
191
187
  const { addComment, allowAnswers, isClosed, ownAnswer } = usePollState();
192
- const [showAddCommentDialog, setShowAddCommentDialog] = useState(false);
188
+ const { closeAddComment, openAddComment } = usePollUIStateContext();
189
+ const showAddCommentDialog = useAddCommentOpen();
193
190
  const { onPress } = props;
194
191
 
195
192
  const onPressHandler = useCallback(() => {
@@ -198,12 +195,8 @@ export const AddCommentButton = (props: PollButtonProps) => {
198
195
  return;
199
196
  }
200
197
 
201
- setShowAddCommentDialog(true);
202
- }, [message, onPress, poll]);
203
-
204
- const onRequestClose = useCallback(() => {
205
- setShowAddCommentDialog(false);
206
- }, []);
198
+ openAddComment();
199
+ }, [message, onPress, openAddComment, poll]);
207
200
 
208
201
  return (
209
202
  <>
@@ -212,7 +205,7 @@ export const AddCommentButton = (props: PollButtonProps) => {
212
205
  ) : null}
213
206
  {showAddCommentDialog ? (
214
207
  <PollInputDialog
215
- closeDialog={onRequestClose}
208
+ closeDialog={closeAddComment}
216
209
  initialValue={ownAnswer?.answer_text ?? ''}
217
210
  onSubmit={addComment}
218
211
  placeholder={t('Your comment')}
@@ -20,11 +20,11 @@ import { useComponentsContext } from '../../../contexts/componentsContext/Compon
20
20
 
21
21
  import { Check } from '../../../icons';
22
22
  import { primitives } from '../../../theme';
23
- import { useNotificationApi } from '../../Notifications';
24
23
  import { ProgressBar } from '../../ProgressControl/ProgressBar';
25
24
  import { UserAvatarStack } from '../../ui/Avatar/AvatarStack';
26
25
  import { useIsPollCreatedByCurrentUser } from '../hook/useIsPollCreatedByCurrentUser';
27
26
  import { usePollState } from '../hooks/usePollState';
27
+ import { usePollVoteToggle } from '../hooks/usePollVoteToggle';
28
28
 
29
29
  const pollVoteAccessibilityStates = {
30
30
  checked: { checked: true, selected: true },
@@ -161,7 +161,6 @@ export const PollOption = ({ option, showProgressBar = true, forceIncoming }: Po
161
161
  export const VoteButton = ({ onPress, option }: PollVoteButtonProps) => {
162
162
  const { message, poll } = usePollContext();
163
163
  const { isClosed, ownVotesByOptionId } = usePollState();
164
- const { runWithNotificationTarget } = useNotificationApi();
165
164
  const ownCapabilities = useOwnCapabilitiesContext();
166
165
  const {
167
166
  theme: { semantics },
@@ -179,15 +178,7 @@ export const VoteButton = ({ onPress, option }: PollVoteButtonProps) => {
179
178
  },
180
179
  } = useTheme();
181
180
 
182
- const toggleVote = useCallback(async () => {
183
- await runWithNotificationTarget(async () => {
184
- if (ownVotesByOptionId[option.id]) {
185
- await poll.removeVote(ownVotesByOptionId[option.id]?.id, message.id);
186
- } else {
187
- await poll.castVote(option.id, message.id);
188
- }
189
- });
190
- }, [message.id, option.id, ownVotesByOptionId, poll, runWithNotificationTarget]);
181
+ const toggleVote = usePollVoteToggle();
191
182
 
192
183
  const onPressHandler = useCallback(() => {
193
184
  if (onPress) {
@@ -195,8 +186,8 @@ export const VoteButton = ({ onPress, option }: PollVoteButtonProps) => {
195
186
  return;
196
187
  }
197
188
 
198
- toggleVote();
199
- }, [message, onPress, poll, toggleVote]);
189
+ toggleVote(option.id);
190
+ }, [message, onPress, option.id, poll, toggleVote]);
200
191
 
201
192
  const hasVote = !!ownVotesByOptionId[option.id];
202
193
  const accessibilityState = hasVote
@@ -0,0 +1,105 @@
1
+ import React, { PropsWithChildren, useContext, useState } from 'react';
2
+
3
+ import { StateStore } from 'stream-chat';
4
+
5
+ import { DEFAULT_BASE_CONTEXT_VALUE } from '../../../contexts/utils/defaultBaseContextValue';
6
+ import { isTestEnvironment } from '../../../contexts/utils/isTestEnvironment';
7
+ import { useStateStore } from '../../../hooks/useStateStore';
8
+
9
+ export type PollUIState = {
10
+ addCommentOpen: boolean;
11
+ allCommentsOpen: boolean;
12
+ allOptionsOpen: boolean;
13
+ suggestOptionOpen: boolean;
14
+ viewResultsOpen: boolean;
15
+ };
16
+
17
+ const INITIAL_POLL_UI_STATE: PollUIState = {
18
+ addCommentOpen: false,
19
+ allCommentsOpen: false,
20
+ allOptionsOpen: false,
21
+ suggestOptionOpen: false,
22
+ viewResultsOpen: false,
23
+ };
24
+
25
+ export type PollUIStateContextValue = {
26
+ closeAddComment: () => void;
27
+ closeAllComments: () => void;
28
+ closeAllOptions: () => void;
29
+ closeSuggestOption: () => void;
30
+ closeViewResults: () => void;
31
+ openAddComment: () => void;
32
+ openAllComments: () => void;
33
+ openAllOptions: () => void;
34
+ openSuggestOption: () => void;
35
+ openViewResults: () => void;
36
+ store: StateStore<PollUIState>;
37
+ };
38
+
39
+ export const PollUIStateContext = React.createContext(
40
+ DEFAULT_BASE_CONTEXT_VALUE as PollUIStateContextValue,
41
+ );
42
+
43
+ export const PollUIStateProvider = ({ children }: PropsWithChildren) => {
44
+ const value = useState<PollUIStateContextValue>(() => {
45
+ const store = new StateStore<PollUIState>(INITIAL_POLL_UI_STATE);
46
+ return {
47
+ closeAddComment: () => store.partialNext({ addCommentOpen: false }),
48
+ closeAllComments: () => store.partialNext({ allCommentsOpen: false }),
49
+ closeAllOptions: () => store.partialNext({ allOptionsOpen: false }),
50
+ closeSuggestOption: () => store.partialNext({ suggestOptionOpen: false }),
51
+ closeViewResults: () => store.partialNext({ viewResultsOpen: false }),
52
+ openAddComment: () => store.partialNext({ addCommentOpen: true }),
53
+ openAllComments: () => store.partialNext({ allCommentsOpen: true }),
54
+ openAllOptions: () => store.partialNext({ allOptionsOpen: true }),
55
+ openSuggestOption: () => store.partialNext({ suggestOptionOpen: true }),
56
+ openViewResults: () => store.partialNext({ viewResultsOpen: true }),
57
+ store,
58
+ };
59
+ })[0];
60
+
61
+ return <PollUIStateContext.Provider value={value}>{children}</PollUIStateContext.Provider>;
62
+ };
63
+
64
+ export const usePollUIStateContext = () => {
65
+ const contextValue = useContext(PollUIStateContext) as unknown as PollUIStateContextValue;
66
+
67
+ if (contextValue === DEFAULT_BASE_CONTEXT_VALUE && !isTestEnvironment()) {
68
+ throw new Error(
69
+ 'usePollUIStateContext must be used within a PollUIStateProvider. The provider is mounted by the Poll component automatically.',
70
+ );
71
+ }
72
+
73
+ return contextValue;
74
+ };
75
+
76
+ const selectAddCommentOpen = ({ addCommentOpen }: PollUIState) => ({ addCommentOpen });
77
+ const selectAllCommentsOpen = ({ allCommentsOpen }: PollUIState) => ({ allCommentsOpen });
78
+ const selectAllOptionsOpen = ({ allOptionsOpen }: PollUIState) => ({ allOptionsOpen });
79
+ const selectSuggestOptionOpen = ({ suggestOptionOpen }: PollUIState) => ({ suggestOptionOpen });
80
+ const selectViewResultsOpen = ({ viewResultsOpen }: PollUIState) => ({ viewResultsOpen });
81
+
82
+ export const useAddCommentOpen = () => {
83
+ const { store } = usePollUIStateContext();
84
+ return useStateStore(store, selectAddCommentOpen).addCommentOpen;
85
+ };
86
+
87
+ export const useAllCommentsOpen = () => {
88
+ const { store } = usePollUIStateContext();
89
+ return useStateStore(store, selectAllCommentsOpen).allCommentsOpen;
90
+ };
91
+
92
+ export const useAllOptionsOpen = () => {
93
+ const { store } = usePollUIStateContext();
94
+ return useStateStore(store, selectAllOptionsOpen).allOptionsOpen;
95
+ };
96
+
97
+ export const useSuggestOptionOpen = () => {
98
+ const { store } = usePollUIStateContext();
99
+ return useStateStore(store, selectSuggestOptionOpen).suggestOptionOpen;
100
+ };
101
+
102
+ export const useViewResultsOpen = () => {
103
+ const { store } = usePollUIStateContext();
104
+ return useStateStore(store, selectViewResultsOpen).viewResultsOpen;
105
+ };
@@ -0,0 +1 @@
1
+ export * from './PollUIStateContext';