@soul-refiner/design-system 0.0.14 → 0.0.15

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 (271) hide show
  1. package/.eslintrc.js +4 -0
  2. package/.turbo/turbo-build.log +12 -0
  3. package/.turbo/turbo-test.log +4417 -0
  4. package/CHANGELOG.md +7 -0
  5. package/babel.config.js +6 -0
  6. package/custom.d.ts +4 -0
  7. package/package.json +1 -7
  8. package/src/actions/Button/Button.module.scss +205 -0
  9. package/src/actions/Button/Button.spec.js +56 -0
  10. package/src/actions/Button/Button.tsx +143 -0
  11. package/src/actions/Button/index.ts +1 -0
  12. package/src/actions/Dropdown/Dropdown.module.scss +77 -0
  13. package/src/actions/Dropdown/Dropdown.spec.js +149 -0
  14. package/src/actions/Dropdown/Dropdown.tsx +224 -0
  15. package/src/actions/Dropdown/index.ts +6 -0
  16. package/src/actions/Dropzone/Dropzone.module.scss +48 -0
  17. package/src/actions/Dropzone/Dropzone.spec.js +60 -0
  18. package/src/actions/Dropzone/Dropzone.tsx +191 -0
  19. package/src/actions/Dropzone/index.ts +1 -0
  20. package/src/actions/Rate/Rate.module.scss +17 -0
  21. package/src/actions/Rate/Rate.tsx +53 -0
  22. package/src/actions/Rate/index.ts +1 -0
  23. package/src/actions/Switch/Switch.module.scss +35 -0
  24. package/src/actions/Switch/Switch.spec.js +31 -0
  25. package/src/actions/Switch/Switch.tsx +34 -0
  26. package/src/actions/Switch/index.ts +1 -0
  27. package/src/actions/index.ts +5 -0
  28. package/src/cards/CourseCard/CourseCard.module.scss +219 -0
  29. package/src/cards/CourseCard/CourseCard.spec.js +60 -0
  30. package/src/cards/CourseCard/CourseCard.tsx +145 -0
  31. package/src/cards/CourseCard/index.ts +1 -0
  32. package/src/cards/EpisodeCard/EpisodeCard.module.scss +69 -0
  33. package/src/cards/EpisodeCard/EpisodeCard.tsx +53 -0
  34. package/src/cards/EpisodeCard/index.ts +1 -0
  35. package/src/cards/FeatureCard/FeatureCard.module.scss +116 -0
  36. package/src/cards/FeatureCard/FeatureCard.spec.js +70 -0
  37. package/src/cards/FeatureCard/FeatureCard.tsx +123 -0
  38. package/src/cards/FeatureCard/index.ts +1 -0
  39. package/src/cards/index.ts +3 -0
  40. package/src/data/Bar/Bar.module.scss +105 -0
  41. package/src/data/Bar/Bar.tsx +161 -0
  42. package/src/data/Bar/index.ts +1 -0
  43. package/src/data/Line/Line.module.scss +102 -0
  44. package/src/data/Line/Line.tsx +162 -0
  45. package/src/data/Line/index.ts +1 -0
  46. package/src/data/Pie/Pie.module.scss +56 -0
  47. package/src/data/Pie/Pie.spec.js +72 -0
  48. package/src/data/Pie/Pie.tsx +111 -0
  49. package/src/data/Pie/index.ts +1 -0
  50. package/src/data/index.ts +3 -0
  51. package/src/editor/Editor.module.scss +125 -0
  52. package/src/editor/Editor.tsx +327 -0
  53. package/src/editor/common/elements.ts +50 -0
  54. package/src/editor/common/index.ts +2 -0
  55. package/src/editor/common/marks.ts +27 -0
  56. package/src/editor/components/MediaDrawer/MediaDrawer.module.scss +316 -0
  57. package/src/editor/components/MediaDrawer/MediaDrawer.tsx +457 -0
  58. package/src/editor/components/MediaDrawer/index.ts +1 -0
  59. package/src/editor/components/index.ts +1 -0
  60. package/src/editor/config/default.ts +213 -0
  61. package/src/editor/config/index.ts +2 -0
  62. package/src/editor/config/props.ts +9 -0
  63. package/src/editor/index.ts +2 -0
  64. package/src/editor/plateUI.ts +82 -0
  65. package/src/editor/plugins/blocks.tsx +71 -0
  66. package/src/editor/plugins/custom/assets/DefaultThumbnail.tsx +57 -0
  67. package/src/editor/plugins/custom/assets/index.ts +1 -0
  68. package/src/editor/plugins/custom/buttons.tsx +289 -0
  69. package/src/editor/plugins/custom/example.tsx +64 -0
  70. package/src/editor/plugins/custom/exitBreak.ts +41 -0
  71. package/src/editor/plugins/custom/footnote.tsx +185 -0
  72. package/src/editor/plugins/custom/index.ts +14 -0
  73. package/src/editor/plugins/custom/paywall.tsx +156 -0
  74. package/src/editor/plugins/custom/qa.tsx +390 -0
  75. package/src/editor/plugins/custom/resetBlockType.ts +29 -0
  76. package/src/editor/plugins/custom/selectOnBackspace.ts +7 -0
  77. package/src/editor/plugins/custom/softBreak.ts +20 -0
  78. package/src/editor/plugins/custom/styles/Button.module.scss +51 -0
  79. package/src/editor/plugins/custom/styles/Footnote.module.scss +58 -0
  80. package/src/editor/plugins/custom/styles/Paywall.module.scss +67 -0
  81. package/src/editor/plugins/custom/styles/QA.module.scss +140 -0
  82. package/src/editor/plugins/custom/styles/Video.module.scss +79 -0
  83. package/src/editor/plugins/custom/video.tsx +163 -0
  84. package/src/editor/plugins/index.ts +18 -0
  85. package/src/editor/plugins/inline.ts +46 -0
  86. package/src/editor/plugins/marks.ts +25 -0
  87. package/src/editor/plugins/utils.ts +22 -0
  88. package/src/feedback/Chip/Chip.module.scss +23 -0
  89. package/src/feedback/Chip/Chip.tsx +58 -0
  90. package/src/feedback/Chip/index.ts +1 -0
  91. package/src/feedback/Loader/Loader.module.scss +18 -0
  92. package/src/feedback/Loader/Loader.spec.js +18 -0
  93. package/src/feedback/Loader/Loader.tsx +53 -0
  94. package/src/feedback/Loader/index.ts +1 -0
  95. package/src/feedback/ProgressBar/ProgressBar.module.scss +13 -0
  96. package/src/feedback/ProgressBar/ProgressBar.tsx +32 -0
  97. package/src/feedback/ProgressBar/index.ts +1 -0
  98. package/src/feedback/Toast/Toast.module.scss +44 -0
  99. package/src/feedback/Toast/Toast.tsx +76 -0
  100. package/src/feedback/Toast/index.ts +1 -0
  101. package/src/feedback/Tooltip/Tooltip.module.scss +47 -0
  102. package/src/feedback/Tooltip/Tooltip.tsx +10 -0
  103. package/src/feedback/Tooltip/index.ts +1 -0
  104. package/src/feedback/index.ts +5 -0
  105. package/src/global.d.ts +6 -0
  106. package/src/iconography/Avatar/Avatar.module.scss +90 -0
  107. package/src/iconography/Avatar/Avatar.spec.js +75 -0
  108. package/src/iconography/Avatar/Avatar.tsx +96 -0
  109. package/src/iconography/Avatar/DefaultIcon.svg +4 -0
  110. package/src/iconography/Avatar/DefaultIcon.tsx +12 -0
  111. package/src/iconography/Avatar/iconHelpers.tsx +186 -0
  112. package/src/iconography/Avatar/index.ts +1 -0
  113. package/src/iconography/ColoredIcon/ColoredIcon.module.scss +40 -0
  114. package/src/iconography/ColoredIcon/ColoredIcon.tsx +30 -0
  115. package/src/iconography/ColoredIcon/index.ts +5 -0
  116. package/src/iconography/DevicePreview/DevicePreview.module.scss +143 -0
  117. package/src/iconography/DevicePreview/DevicePreview.tsx +592 -0
  118. package/src/iconography/DevicePreview/index.ts +1 -0
  119. package/src/iconography/IconHeader/IconHeader.module.scss +42 -0
  120. package/src/iconography/IconHeader/IconHeader.tsx +42 -0
  121. package/src/iconography/IconHeader/index.ts +1 -0
  122. package/src/iconography/StarRating/StarRating.tsx +99 -0
  123. package/src/iconography/StarRating/index.ts +1 -0
  124. package/src/iconography/index.ts +5 -0
  125. package/src/implementations/BodyContent/BodyContent.module.scss +38 -0
  126. package/src/implementations/BodyContent/BodyContent.tsx +78 -0
  127. package/src/implementations/BodyContent/index.ts +2 -0
  128. package/src/implementations/JoinGroupModal/JoinGroupModal.module.scss +83 -0
  129. package/src/implementations/JoinGroupModal/JoinGroupModal.tsx +176 -0
  130. package/src/implementations/JoinGroupModal/index.ts +1 -0
  131. package/src/implementations/index.ts +2 -0
  132. package/src/index.ts +149 -0
  133. package/src/inputs/CalendarInput/CalendarInput.module.scss +38 -0
  134. package/src/inputs/CalendarInput/CalendarInput.spec.js +19 -0
  135. package/src/inputs/CalendarInput/CalendarInput.tsx +29 -0
  136. package/src/inputs/CalendarInput/index.ts +1 -0
  137. package/src/inputs/CheckboxInput/CheckboxInput.module.scss +23 -0
  138. package/src/inputs/CheckboxInput/CheckboxInput.tsx +39 -0
  139. package/src/inputs/CheckboxInput/index.ts +1 -0
  140. package/src/inputs/FeedInput/FeedInput.module.scss +48 -0
  141. package/src/inputs/FeedInput/FeedInput.spec.js +16 -0
  142. package/src/inputs/FeedInput/FeedInput.tsx +197 -0
  143. package/src/inputs/FeedInput/index.ts +1 -0
  144. package/src/inputs/InboxInput/InboxInput.module.scss +48 -0
  145. package/src/inputs/InboxInput/InboxInput.spec.js +19 -0
  146. package/src/inputs/InboxInput/InboxInput.tsx +97 -0
  147. package/src/inputs/InboxInput/index.ts +1 -0
  148. package/src/inputs/PostInput/PostInput.module.scss +49 -0
  149. package/src/inputs/PostInput/PostInput.spec.js +19 -0
  150. package/src/inputs/PostInput/PostInput.tsx +54 -0
  151. package/src/inputs/PostInput/index.ts +1 -0
  152. package/src/inputs/RadioInput/RadioInput.module.scss +68 -0
  153. package/src/inputs/RadioInput/RadioInput.tsx +55 -0
  154. package/src/inputs/RadioInput/index.ts +1 -0
  155. package/src/inputs/SearchInput/SearchInput.module.scss +40 -0
  156. package/src/inputs/SearchInput/SearchInput.tsx +61 -0
  157. package/src/inputs/SearchInput/index.ts +1 -0
  158. package/src/inputs/SelectInput/SelectInput.module.scss +66 -0
  159. package/src/inputs/SelectInput/SelectInput.tsx +145 -0
  160. package/src/inputs/SelectInput/index.ts +1 -0
  161. package/src/inputs/TagInput/TagInput.module.scss +75 -0
  162. package/src/inputs/TagInput/TagInput.tsx +115 -0
  163. package/src/inputs/TagInput/index.ts +1 -0
  164. package/src/inputs/TextInput/TextInput.module.scss +35 -0
  165. package/src/inputs/TextInput/TextInput.tsx +46 -0
  166. package/src/inputs/TextInput/index.ts +1 -0
  167. package/src/inputs/index.ts +10 -0
  168. package/src/lists/ContactDetails/ContactDetails.module.scss +70 -0
  169. package/src/lists/ContactDetails/ContactDetails.spec.js +69 -0
  170. package/src/lists/ContactDetails/ContactDetails.tsx +185 -0
  171. package/src/lists/ContactDetails/index.ts +1 -0
  172. package/src/lists/index.ts +1 -0
  173. package/src/navigation/Breadcrumbs/Breadcrumbs.module.scss +18 -0
  174. package/src/navigation/Breadcrumbs/Breadcrumbs.spec.js +38 -0
  175. package/src/navigation/Breadcrumbs/Breadcrumbs.tsx +43 -0
  176. package/src/navigation/Breadcrumbs/index.ts +1 -0
  177. package/src/navigation/Drawer/Drawer.module.scss +104 -0
  178. package/src/navigation/Drawer/Drawer.tsx +177 -0
  179. package/src/navigation/Drawer/index.ts +1 -0
  180. package/src/navigation/EditorBar/EditorBar.module.scss +118 -0
  181. package/src/navigation/EditorBar/EditorBar.tsx +416 -0
  182. package/src/navigation/EditorBar/components/AlignmentDropdown/AlignmentDropdown.tsx +106 -0
  183. package/src/navigation/EditorBar/components/AlignmentDropdown/index.ts +1 -0
  184. package/src/navigation/EditorBar/components/ButtonModal/ButtonModal.module.scss +85 -0
  185. package/src/navigation/EditorBar/components/ButtonModal/ButtonModal.tsx +314 -0
  186. package/src/navigation/EditorBar/components/ButtonModal/assets/Comment.tsx +28 -0
  187. package/src/navigation/EditorBar/components/ButtonModal/assets/GiftSubscription.tsx +28 -0
  188. package/src/navigation/EditorBar/components/ButtonModal/assets/Link.tsx +28 -0
  189. package/src/navigation/EditorBar/components/ButtonModal/assets/Share.tsx +28 -0
  190. package/src/navigation/EditorBar/components/ButtonModal/assets/ShareCommunity.tsx +42 -0
  191. package/src/navigation/EditorBar/components/ButtonModal/assets/Signup.tsx +68 -0
  192. package/src/navigation/EditorBar/components/ButtonModal/assets/Special.tsx +24 -0
  193. package/src/navigation/EditorBar/components/ButtonModal/assets/Subscribe.tsx +28 -0
  194. package/src/navigation/EditorBar/components/ButtonModal/assets/index.ts +8 -0
  195. package/src/navigation/EditorBar/components/ButtonModal/index.ts +1 -0
  196. package/src/navigation/EditorBar/components/FontDropdown/FontDropdown.module.scss +16 -0
  197. package/src/navigation/EditorBar/components/FontDropdown/FontDropdown.tsx +137 -0
  198. package/src/navigation/EditorBar/components/FontDropdown/index.ts +1 -0
  199. package/src/navigation/EditorBar/components/MoreDropdown/MoreDropdown.module.scss +43 -0
  200. package/src/navigation/EditorBar/components/MoreDropdown/MoreDropdown.tsx +124 -0
  201. package/src/navigation/EditorBar/components/MoreDropdown/index.ts +1 -0
  202. package/src/navigation/EditorBar/components/OutlineDropdown/OutlineDropdown.module.scss +21 -0
  203. package/src/navigation/EditorBar/components/OutlineDropdown/OutlineDropdown.tsx +37 -0
  204. package/src/navigation/EditorBar/components/OutlineDropdown/index.ts +1 -0
  205. package/src/navigation/EditorBar/components/TextTypeDropdown/TextTypeDropdown.module.scss +51 -0
  206. package/src/navigation/EditorBar/components/TextTypeDropdown/TextTypeDropdown.tsx +80 -0
  207. package/src/navigation/EditorBar/components/TextTypeDropdown/index.ts +1 -0
  208. package/src/navigation/EditorBar/components/VideoModal/VideoModal.module.scss +150 -0
  209. package/src/navigation/EditorBar/components/VideoModal/VideoModal.tsx +163 -0
  210. package/src/navigation/EditorBar/components/VideoModal/index.ts +1 -0
  211. package/src/navigation/EditorBar/components/index.ts +7 -0
  212. package/src/navigation/EditorBar/index.ts +1 -0
  213. package/src/navigation/MenuTabs/MenuTabs.module.scss +34 -0
  214. package/src/navigation/MenuTabs/MenuTabs.spec.js +36 -0
  215. package/src/navigation/MenuTabs/MenuTabs.tsx +52 -0
  216. package/src/navigation/MenuTabs/index.ts +1 -0
  217. package/src/navigation/Navigation/Navigation.module.scss +92 -0
  218. package/src/navigation/Navigation/Navigation.spec.js +144 -0
  219. package/src/navigation/Navigation/Navigation.tsx +111 -0
  220. package/src/navigation/Navigation/SubNavigation.module.scss +255 -0
  221. package/src/navigation/Navigation/SubNavigation.spec.js +112 -0
  222. package/src/navigation/Navigation/SubNavigation.tsx +443 -0
  223. package/src/navigation/Navigation/index.ts +15 -0
  224. package/src/navigation/Pagination/Pagination.module.scss +49 -0
  225. package/src/navigation/Pagination/Pagination.tsx +115 -0
  226. package/src/navigation/Pagination/index.ts +1 -0
  227. package/src/navigation/index.ts +21 -0
  228. package/src/surfaces/Comment/Comment.module.scss +106 -0
  229. package/src/surfaces/Comment/Comment.spec.js +105 -0
  230. package/src/surfaces/Comment/Comment.tsx +157 -0
  231. package/src/surfaces/Comment/index.ts +1 -0
  232. package/src/surfaces/Faq/Faq.module.scss +91 -0
  233. package/src/surfaces/Faq/Faq.spec.js +38 -0
  234. package/src/surfaces/Faq/Faq.tsx +156 -0
  235. package/src/surfaces/Faq/index.ts +1 -0
  236. package/src/surfaces/Message/Message.module.scss +37 -0
  237. package/src/surfaces/Message/Message.spec.js +47 -0
  238. package/src/surfaces/Message/Message.tsx +54 -0
  239. package/src/surfaces/Message/index.ts +1 -0
  240. package/src/surfaces/Modal/Modal.module.scss +52 -0
  241. package/src/surfaces/Modal/Modal.spec.js +38 -0
  242. package/src/surfaces/Modal/Modal.tsx +131 -0
  243. package/src/surfaces/Modal/index.ts +5 -0
  244. package/src/surfaces/Plan/Plan.module.scss +79 -0
  245. package/src/surfaces/Plan/Plan.tsx +75 -0
  246. package/src/surfaces/Plan/index.ts +1 -0
  247. package/src/surfaces/Post/Post.module.scss +46 -0
  248. package/src/surfaces/Post/Post.spec.js +103 -0
  249. package/src/surfaces/Post/Post.tsx +185 -0
  250. package/src/surfaces/Post/index.ts +1 -0
  251. package/src/surfaces/Post/postHelpers.ts +20 -0
  252. package/src/surfaces/ProfileHeader/ProfileHeader.module.scss +202 -0
  253. package/src/surfaces/ProfileHeader/ProfileHeader.tsx +103 -0
  254. package/src/surfaces/ProfileHeader/index.ts +1 -0
  255. package/src/surfaces/RatingsOverview/RatingsOverview.module.scss +54 -0
  256. package/src/surfaces/RatingsOverview/RatingsOverview.tsx +69 -0
  257. package/src/surfaces/RatingsOverview/index.ts +1 -0
  258. package/src/surfaces/Review/Review.module.scss +73 -0
  259. package/src/surfaces/Review/Review.tsx +88 -0
  260. package/src/surfaces/Review/index.ts +1 -0
  261. package/src/surfaces/index.ts +9 -0
  262. package/src/tables/Filter/Filter.module.scss +34 -0
  263. package/src/tables/Filter/Filter.tsx +30 -0
  264. package/src/tables/Filter/index.ts +1 -0
  265. package/src/tables/Table/Table.module.scss +126 -0
  266. package/src/tables/Table/Table.spec.js +113 -0
  267. package/src/tables/Table/Table.tsx +251 -0
  268. package/src/tables/Table/index.ts +7 -0
  269. package/src/tables/index.ts +7 -0
  270. package/tsconfig.json +14 -0
  271. package/vite.config.ts +28 -0
@@ -0,0 +1,390 @@
1
+ import React from "react";
2
+ import { createPluginFactory, isEditorReadOnly } from "@udecode/plate";
3
+ import { Comment as IComment, User as IUser } from "@soul-refiner/models";
4
+ import {
5
+ Check,
6
+ ChevronDown,
7
+ ChevronUp,
8
+ CloseThin,
9
+ Details,
10
+ Globe,
11
+ GroupLarge,
12
+ Lock,
13
+ UserSelect,
14
+ } from "@soul-refiner/icons/src";
15
+ import { ELEMENT_QA, ELEMENT_PARAGRAPH } from "../../common";
16
+
17
+ import { Button, Dropdown } from "../../../actions";
18
+ import { EditorContext } from "../../Editor";
19
+ import { Avatar, IconHeader } from "../../../iconography";
20
+ import { CheckboxInput, PostInput, SearchInput } from "../../../inputs";
21
+ import { Comment, Modal } from "../../../surfaces";
22
+
23
+ import styles from "./styles/QA.module.scss";
24
+
25
+ type QAProps = any;
26
+
27
+ export const QA = ({ attributes, className, children, editor }: QAProps) => {
28
+ const {
29
+ id,
30
+ handleAddComment,
31
+ handleAddReaction,
32
+ handleGetComments,
33
+ handleGetFriends,
34
+ user,
35
+ } = React.useContext(EditorContext);
36
+ const [showAnswers, setShowAnswers] = React.useState(false);
37
+ const [showFriendsModal, setShowFriendsModal] = React.useState(false);
38
+ const [answer, setAnswer] = React.useState<Omit<IComment, "id" | "created">>({
39
+ parentId: id,
40
+ user,
41
+ privacy: "public",
42
+ reactions: [],
43
+ text: "",
44
+ });
45
+ const [comments, setComments] = React.useState<IComment[]>([]);
46
+ const [friendQuery, setFriendQuery] = React.useState("");
47
+ const [friends, setFriends] = React.useState<IUser[]>([]);
48
+ const { ref: DONT_USE, ...htmlAttributes } = attributes;
49
+
50
+ const toggleAnswers = () => setShowAnswers((prev) => !prev);
51
+
52
+ const handleAnswerChange = (event: React.FormEvent) => {
53
+ const value = (event.target as HTMLInputElement)?.value;
54
+ setAnswer((prev) => ({
55
+ ...prev,
56
+ text: value,
57
+ }));
58
+ };
59
+
60
+ const handleAnswerSubmit = (event: React.KeyboardEvent) => {
61
+ if (event.key === "Enter") {
62
+ handleAddComment({
63
+ parentId: id,
64
+ text: answer.text,
65
+ user,
66
+ });
67
+ }
68
+ };
69
+
70
+ const handlePrivacyChange = (event: React.MouseEvent) => {
71
+ const value = (event.target as HTMLElement)?.getAttribute("data-value");
72
+ if (!value) return;
73
+ switch (value) {
74
+ case "private":
75
+ setAnswer((prev) => ({
76
+ ...prev,
77
+ privacy: "private",
78
+ }));
79
+ return;
80
+ case "group":
81
+ setAnswer((prev) => ({
82
+ ...prev,
83
+ privacy: "group",
84
+ }));
85
+ return;
86
+ case "friends":
87
+ if (!Array.isArray(answer.privacy)) {
88
+ setAnswer((prev) => ({
89
+ ...prev,
90
+ privacy: [],
91
+ }));
92
+ }
93
+ setShowFriendsModal(true);
94
+ return;
95
+ case "public":
96
+ setAnswer((prev) => ({
97
+ ...prev,
98
+ privacy: "public",
99
+ }));
100
+ return;
101
+ }
102
+ };
103
+
104
+ const handleFriendQuery = (event: React.FormEvent) => {
105
+ const value = (event.target as HTMLInputElement)?.value;
106
+ setFriendQuery(value);
107
+ };
108
+
109
+ const handleAddFriend = (friendId: string) => {
110
+ if (Array.isArray(answer.privacy)) {
111
+ if (answer.privacy.includes(friendId)) {
112
+ setAnswer((prev) => ({
113
+ ...prev,
114
+ privacy: [...prev.privacy].filter((id) => id !== friendId),
115
+ }));
116
+ } else {
117
+ setAnswer((prev) => ({
118
+ ...prev,
119
+ privacy: [...prev.privacy, friendId],
120
+ }));
121
+ }
122
+ }
123
+ };
124
+
125
+ React.useEffect(() => {
126
+ /**
127
+ * TODO: DEBOUNCE
128
+ */
129
+ if (Array.isArray(answer.privacy)) {
130
+ handleGetFriends(friendQuery, answer.privacy).then((res) =>
131
+ setFriends(res)
132
+ );
133
+ } else {
134
+ handleGetFriends(friendQuery).then((res) => setFriends(res));
135
+ }
136
+ }, [friendQuery]);
137
+
138
+ React.useEffect(() => {
139
+ if (showAnswers) {
140
+ handleGetComments(id).then((res) => setComments(res));
141
+ }
142
+ }, [showAnswers]);
143
+
144
+ const editable = !isEditorReadOnly(editor);
145
+
146
+ const triggerProps = {
147
+ iconSize: 18,
148
+ size: 34,
149
+ fill: "var(--colorify-blue-3)",
150
+ style: {
151
+ borderRadius: "50%",
152
+ backgroundColor: "var(--colorify-blue-1)",
153
+ border: "1px solid var(--colorify-blue-2)",
154
+ cursor: "pointer",
155
+ },
156
+ };
157
+ const trigger =
158
+ answer.privacy === "group" ? (
159
+ <GroupLarge {...triggerProps} />
160
+ ) : answer.privacy === "public" ? (
161
+ <Globe {...triggerProps} />
162
+ ) : answer.privacy === "private" ? (
163
+ <Lock {...triggerProps} />
164
+ ) : (
165
+ <UserSelect {...triggerProps} />
166
+ );
167
+
168
+ return (
169
+ <div className={`${styles.wrapper} ${className ? className : ""}`}>
170
+ <div className={styles.childrenWrapper}>{children}</div>
171
+ <div className={styles.answersWrapper} contentEditable={false}>
172
+ <div
173
+ className={styles.showAnswers}
174
+ onClick={!editable ? toggleAnswers : undefined}
175
+ >
176
+ <p>Show answers</p>
177
+ {showAnswers ? (
178
+ <ChevronUp size={24} iconSize={12} fill="var(--color-grey-6)" />
179
+ ) : (
180
+ <ChevronDown size={24} iconSize={12} fill="var(--color-grey-6)" />
181
+ )}
182
+ </div>
183
+ {showAnswers && comments.length && (
184
+ <div className={styles.commentWrapper}>
185
+ {comments.map((comment) => (
186
+ <Comment
187
+ key={comment.id}
188
+ showReplies
189
+ onReact={() =>
190
+ handleAddReaction({
191
+ parentId: comment.id,
192
+ type: "like",
193
+ userId: user.id,
194
+ })
195
+ }
196
+ onReply={(text) =>
197
+ handleAddComment({
198
+ parentId: comment.id,
199
+ text: text,
200
+ user,
201
+ })
202
+ }
203
+ onShowReplies={() => undefined}
204
+ {...comment}
205
+ />
206
+ ))}
207
+ </div>
208
+ )}
209
+ <div className={styles.inputWrapper}>
210
+ <Avatar size={40} url={user.avatar} />
211
+ <PostInput
212
+ disabled={editable}
213
+ onChange={handleAnswerChange}
214
+ onKeyDown={handleAnswerSubmit}
215
+ placeholder="Write your answer"
216
+ value={answer.text}
217
+ />
218
+ <Dropdown
219
+ disabled={editable}
220
+ maintainState={false}
221
+ open="left"
222
+ trigger={trigger}
223
+ onChange={handlePrivacyChange}
224
+ >
225
+ <div className={styles.privacyOption} data-value="private">
226
+ <div
227
+ className={`${styles.radio} ${
228
+ answer.privacy === "private" ? "active" : ""
229
+ }`}
230
+ />
231
+ <div>
232
+ <div className={styles.privacyTitle}>
233
+ <Lock size={16} iconSize={13} />
234
+ <p>Private</p>
235
+ </div>
236
+ <p>Only you can see your answer</p>
237
+ </div>
238
+ </div>
239
+ <div className={styles.privacyOption} data-value="group">
240
+ <div
241
+ className={`${styles.radio} ${
242
+ answer.privacy === "group" ? "active" : ""
243
+ }`}
244
+ />
245
+ <div>
246
+ <div className={styles.privacyTitle}>
247
+ <GroupLarge size={16} iconSize={14} />
248
+ <p>Group</p>
249
+ </div>
250
+ <p>Only your group can see your answer</p>
251
+ </div>
252
+ </div>
253
+ <div className={styles.privacyOption} data-value="friends">
254
+ <div
255
+ className={`${styles.radio} ${
256
+ Array.isArray(answer.privacy) ? "active" : ""
257
+ }`}
258
+ />
259
+ <div>
260
+ <div className={styles.privacyTitle}>
261
+ <UserSelect size={16} iconSize={14} />
262
+ <p>Select Friends</p>
263
+ </div>
264
+ <p>Only selected friends can see your answer</p>
265
+ </div>
266
+ </div>
267
+ <div className={styles.privacyOption} data-value="public">
268
+ <div
269
+ className={`${styles.radio} ${
270
+ answer.privacy === "public" ? "active" : ""
271
+ }`}
272
+ />
273
+ <div>
274
+ <div className={styles.privacyTitle}>
275
+ <Globe size={16} iconSize={15} />
276
+ <p>Public</p>
277
+ </div>
278
+ <p>Anyone on your public feed can see your answer</p>
279
+ </div>
280
+ </div>
281
+ </Dropdown>
282
+ </div>
283
+ </div>
284
+ <Modal controlledOpen={showFriendsModal}>
285
+ <Modal.Content
286
+ header={
287
+ <IconHeader
288
+ className={styles.iconHeader}
289
+ color="purple"
290
+ icon={<Details fill="var(--colorify-purple-3)" />}
291
+ title={
292
+ <span
293
+ style={{
294
+ color: "var(--color-purple-3)",
295
+ fontSize: "20px",
296
+ fontWeight: 700,
297
+ }}
298
+ >
299
+ Select friends
300
+ </span>
301
+ }
302
+ />
303
+ }
304
+ footer={
305
+ <div className={styles.friendsModalFooter}>
306
+ <Modal.Dismiss>
307
+ <Button
308
+ buttonType="secondary"
309
+ icon={<CloseThin size={24} iconSize={13} />}
310
+ onClick={() => {
311
+ setShowFriendsModal(false);
312
+ setAnswer((prev) => ({
313
+ ...prev,
314
+ privacy: "public",
315
+ }));
316
+ }}
317
+ shape="rectangular"
318
+ uppercase={false}
319
+ >
320
+ Cancel
321
+ </Button>
322
+ </Modal.Dismiss>
323
+ <Modal.Dismiss>
324
+ <Button
325
+ buttonColor="var(--color-blue-3)"
326
+ color="var(--color-blue-10)"
327
+ icon={<Check size={24} iconSize={16} />}
328
+ onClick={() => setShowFriendsModal(false)}
329
+ shape="rectangular"
330
+ uppercase={false}
331
+ >
332
+ Confirm
333
+ </Button>
334
+ </Modal.Dismiss>
335
+ </div>
336
+ }
337
+ setClosed={() => setShowFriendsModal(false)}
338
+ >
339
+ <div className={styles.friendsModal} contentEditable={false}>
340
+ <SearchInput
341
+ as="div"
342
+ expanded={true}
343
+ expandable={false}
344
+ onChange={handleFriendQuery}
345
+ placeholder="Search..."
346
+ value={friendQuery}
347
+ />
348
+ <div className={styles.friendsWrapper}>
349
+ {friends.map((friend) => (
350
+ <div
351
+ className={styles.friend}
352
+ key={friend.id}
353
+ onClick={() => handleAddFriend(friend.id)}
354
+ >
355
+ <Avatar
356
+ presence={friend?.active ? "online" : undefined}
357
+ size={40}
358
+ title={`${friend.firstName} ${friend.lastName}`}
359
+ url={friend.avatar}
360
+ />
361
+ <CheckboxInput
362
+ selected={
363
+ Array.isArray(answer.privacy) &&
364
+ answer.privacy.includes(friend.id)
365
+ }
366
+ />
367
+ </div>
368
+ ))}
369
+ </div>
370
+ </div>
371
+ </Modal.Content>
372
+ </Modal>
373
+ </div>
374
+ );
375
+ };
376
+
377
+ export const createQAPlugin = createPluginFactory({
378
+ key: ELEMENT_QA,
379
+ type: ELEMENT_QA,
380
+ isElement: true,
381
+ component: QA,
382
+ then: (editor) => ({
383
+ inject: {
384
+ props: {
385
+ classNames: undefined,
386
+ validTypes: [ELEMENT_PARAGRAPH],
387
+ },
388
+ },
389
+ }),
390
+ });
@@ -0,0 +1,29 @@
1
+ import { isBlockAboveEmpty, isSelectionAtBlockStart } from "@udecode/plate";
2
+
3
+ import {
4
+ ELEMENT_BLOCKQUOTE,
5
+ ELEMENT_PARAGRAPH,
6
+ ELEMENT_TODO_LI,
7
+ } from "../../common";
8
+
9
+ const resetBlockTypesCommonRule = {
10
+ types: [ELEMENT_BLOCKQUOTE, ELEMENT_TODO_LI],
11
+ defaultType: ELEMENT_PARAGRAPH,
12
+ };
13
+
14
+ export const resetBlockTypePlugin = {
15
+ options: {
16
+ rules: [
17
+ {
18
+ ...resetBlockTypesCommonRule,
19
+ hotkey: "Enter",
20
+ predicate: isBlockAboveEmpty,
21
+ },
22
+ {
23
+ ...resetBlockTypesCommonRule,
24
+ hotkey: "Backspace",
25
+ predicate: isSelectionAtBlockStart,
26
+ },
27
+ ],
28
+ },
29
+ };
@@ -0,0 +1,7 @@
1
+ import { ELEMENT_HR, ELEMENT_IMAGE, ELEMENT_MEDIA_EMBED } from "../../common";
2
+
3
+ export const selectOnBackspace = {
4
+ options: {
5
+ query: { allow: [ELEMENT_HR, ELEMENT_IMAGE, ELEMENT_MEDIA_EMBED] },
6
+ },
7
+ };
@@ -0,0 +1,20 @@
1
+ import {
2
+ ELEMENT_BLOCKQUOTE,
3
+ ELEMENT_CODE_BLOCK,
4
+ ELEMENT_TD,
5
+ SoftBreakPlugin,
6
+ } from "@udecode/plate";
7
+
8
+ export const softBreakPlugin = {
9
+ options: {
10
+ rules: [
11
+ { hotkey: "shift+enter" },
12
+ {
13
+ hotkey: "enter",
14
+ query: {
15
+ allow: [ELEMENT_CODE_BLOCK, ELEMENT_BLOCKQUOTE, ELEMENT_TD],
16
+ },
17
+ },
18
+ ],
19
+ },
20
+ };
@@ -0,0 +1,51 @@
1
+ @use "@soul-refiner/styles/mixins";
2
+
3
+ .colorpicker {
4
+ @include mixins.flex($justify: center, $align: center, $gap: 16px);
5
+ z-index: 5;
6
+ position: absolute;
7
+ top: 48px;
8
+ left: calc(50% - 148px);
9
+ border-radius: 16px;
10
+ padding: 8px 16px;
11
+ box-shadow: 1px 1px 5px #666;
12
+ background-color: #ffffff;
13
+ }
14
+
15
+ .buttonWrapper {
16
+ @include mixins.flex($justify: center, $align: center);
17
+ position: relative;
18
+ }
19
+
20
+ .color {
21
+ width: 24px;
22
+ height: 24px;
23
+ border-radius: 50%;
24
+ background-color: var(--option-color);
25
+ cursor: pointer;
26
+ }
27
+
28
+ .captionWrapper {
29
+ max-width: 373px;
30
+ margin: 24px auto !important;
31
+
32
+ p {
33
+ text-align: center;
34
+ margin-bottom: 25px;
35
+ }
36
+
37
+ input {
38
+ height: 48px;
39
+ flex: 1;
40
+ background: #f2f7fd;
41
+ border: 0px;
42
+ border-radius: 4px 0px 0px 4px;
43
+ padding: 16px 19px;
44
+ outline: none;
45
+ }
46
+
47
+ input + button {
48
+ height: 48px;
49
+ border-radius: 0px 4px 4px 0px !important;
50
+ }
51
+ }
@@ -0,0 +1,58 @@
1
+ @use "@soul-refiner/styles/mixins";
2
+
3
+ .inline {
4
+ vertical-align: super;
5
+ font-size: smaller;
6
+ font-weight: 700;
7
+ text-decoration: underline;
8
+
9
+ &:hover {
10
+ cursor: pointer;
11
+ color: var(--color-blue-5);
12
+ }
13
+ }
14
+
15
+ .floating {
16
+ @include mixins.flex($align: center, $gap: 4px);
17
+ position: absolute;
18
+ left: 0px;
19
+ z-index: 20 !important;
20
+ width: auto;
21
+ background-color: #ffffff;
22
+ border-radius: 4px;
23
+ box-shadow: rgb(15 15 15 / 5%) 0 0 0 1px, rgb(15 15 15 / 10%) 0 3px 6px,
24
+ rgb(15 15 15 / 20%) 0 9px 24px;
25
+
26
+ p {
27
+ min-width: 16px;
28
+ max-width: 400px;
29
+ padding: 6px 0px;
30
+ width: max-content;
31
+ cursor: text;
32
+ line-height: 0px;
33
+ }
34
+ }
35
+
36
+ .footnotesWrapper {
37
+ p {
38
+ counter-increment: footnote_counter_end 1;
39
+ outline: none;
40
+
41
+ & > span:first-of-type {
42
+ position: relative;
43
+
44
+ &::before {
45
+ position: absolute;
46
+ content: counter(footnote_counter_end);
47
+ left: 0px;
48
+ top: -3px;
49
+ text-decoration: underline;
50
+ color: var(--color-blue-5);
51
+ }
52
+ }
53
+
54
+ & > span:last-of-type {
55
+ margin-left: 24px;
56
+ }
57
+ }
58
+ }
@@ -0,0 +1,67 @@
1
+ @use "@soul-refiner/styles/mixins";
2
+
3
+ .wrapper {
4
+ position: relative;
5
+
6
+ .below {
7
+ @include mixins.flex($align: center, $justify: center, $gap: 24px);
8
+
9
+ .line {
10
+ height: 1px;
11
+ width: 100%;
12
+ background-color: var(--color-grey-8);
13
+ }
14
+
15
+ button {
16
+ flex-shrink: 0;
17
+ }
18
+ }
19
+ }
20
+
21
+ .paywall {
22
+ @include mixins.flex(
23
+ $gap: 21px,
24
+ $dir: column,
25
+ $align: center,
26
+ $justify: center
27
+ );
28
+ padding: 37px;
29
+ margin-bottom: 72px !important;
30
+ background-color: var(--bg-color);
31
+ border-left: 10px solid var(--highlight-color);
32
+ border-radius: 12px;
33
+ color: #ffffff;
34
+ span {
35
+ color: #ffffff;
36
+ }
37
+
38
+ .switch {
39
+ @include mixins.font(400, 12px, 12px);
40
+ color: #ffffff;
41
+ a {
42
+ font-weight: 700;
43
+ color: #ffffff;
44
+ }
45
+ }
46
+ }
47
+
48
+ .colorpicker {
49
+ @include mixins.flex($justify: center, $align: center, $gap: 16px);
50
+ position: absolute;
51
+ bottom: 56px;
52
+ left: calc(50% - 148px);
53
+ border-radius: 16px;
54
+ padding: 8px 16px;
55
+ box-shadow: 1px 1px 5px #666;
56
+ background-color: #ffffff;
57
+ }
58
+
59
+ .color {
60
+ box-sizing: border-box;
61
+ width: 24px;
62
+ height: 24px;
63
+ border-radius: 50%;
64
+ border-left: 12px solid var(--option-color);
65
+ background-color: var(--option-color-dark);
66
+ cursor: pointer;
67
+ }