@weavy/uikit-react 11.0.1 → 12.1.0

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 (242) hide show
  1. package/.github/workflows/publish.yml +1 -1
  2. package/README.md +3 -4
  3. package/changelog.md +30 -0
  4. package/dist/cjs/index.js +6 -6
  5. package/dist/cjs/index.js.map +1 -1
  6. package/dist/cjs/types/client/WeavyClient.d.ts +1 -1
  7. package/dist/cjs/types/components/Image.d.ts +2 -0
  8. package/dist/cjs/types/components/PdfViewer.d.ts +6 -0
  9. package/dist/cjs/types/components/Preview.d.ts +58 -0
  10. package/dist/cjs/types/contexts/MessengerContext.d.ts +1 -2
  11. package/dist/cjs/types/hooks/useUser.d.ts +2 -1
  12. package/dist/cjs/types/types/Messenger.d.ts +0 -1
  13. package/dist/cjs/types/types/types.d.ts +11 -6
  14. package/dist/cjs/types/utils/fileUtilities.d.ts +16 -1
  15. package/dist/css/weavy-chat.css +2684 -0
  16. package/dist/css/weavy-messenger.css +3039 -0
  17. package/dist/css/weavy.css +3039 -0
  18. package/dist/esm/index.js +6 -6
  19. package/dist/esm/index.js.map +1 -1
  20. package/dist/esm/types/client/WeavyClient.d.ts +1 -1
  21. package/dist/esm/types/components/Image.d.ts +2 -0
  22. package/dist/esm/types/components/PdfViewer.d.ts +6 -0
  23. package/dist/esm/types/components/Preview.d.ts +58 -0
  24. package/dist/esm/types/contexts/MessengerContext.d.ts +1 -2
  25. package/dist/esm/types/hooks/useUser.d.ts +2 -1
  26. package/dist/esm/types/types/Messenger.d.ts +0 -1
  27. package/dist/esm/types/types/types.d.ts +11 -6
  28. package/dist/esm/types/utils/fileUtilities.d.ts +16 -1
  29. package/dist/index.d.ts +2 -3
  30. package/package.json +14 -4
  31. package/rollup.config.js +0 -2
  32. package/src/client/WeavyClient.ts +3 -3
  33. package/src/components/Attachment.tsx +5 -6
  34. package/src/components/Avatar.tsx +2 -3
  35. package/src/components/Chat.tsx +10 -14
  36. package/src/components/Conversation.tsx +21 -30
  37. package/src/components/ConversationBadge.tsx +1 -2
  38. package/src/components/ConversationForm.tsx +11 -18
  39. package/src/components/ConversationList.tsx +4 -5
  40. package/src/components/ConversationListItem.tsx +13 -15
  41. package/src/components/FileBrowser.tsx +2 -3
  42. package/src/components/Image.tsx +39 -7
  43. package/src/components/MeetingCard.tsx +7 -8
  44. package/src/components/Message.tsx +12 -13
  45. package/src/components/Messages.tsx +19 -19
  46. package/src/components/Messenger.tsx +5 -6
  47. package/src/components/NewConversation.tsx +5 -7
  48. package/src/components/PdfViewer.tsx +271 -0
  49. package/src/components/Presence.tsx +2 -2
  50. package/src/components/Preview.tsx +294 -0
  51. package/src/components/Reactions.tsx +8 -8
  52. package/src/components/SearchUsers.tsx +18 -17
  53. package/src/components/SeenBy.tsx +1 -2
  54. package/src/components/Typing.tsx +4 -4
  55. package/src/contexts/MessengerContext.tsx +4 -12
  56. package/src/contexts/PreviewContext.tsx +4 -6
  57. package/src/contexts/WeavyContext.tsx +8 -1
  58. package/src/hooks/useBadge.ts +1 -1
  59. package/src/hooks/useChat.ts +1 -1
  60. package/src/hooks/useConversation.ts +1 -2
  61. package/src/hooks/useConversations.ts +1 -1
  62. package/src/hooks/useFileUploader.ts +5 -1
  63. package/src/hooks/useMembers.ts +1 -1
  64. package/src/hooks/useMessages.ts +1 -1
  65. package/src/hooks/useMutateChat.ts +1 -1
  66. package/src/hooks/useMutateConversation.ts +1 -1
  67. package/src/hooks/useMutateConversationName.ts +1 -1
  68. package/src/hooks/useMutateDeleteReaction.ts +1 -1
  69. package/src/hooks/useMutateExternalBlobs.ts +1 -1
  70. package/src/hooks/useMutateMeeting.ts +1 -1
  71. package/src/hooks/useMutateMembers.ts +1 -1
  72. package/src/hooks/useMutateMessage.ts +2 -1
  73. package/src/hooks/useMutatePinned.ts +1 -1
  74. package/src/hooks/useMutateReaction.ts +1 -1
  75. package/src/hooks/useMutateRead.ts +1 -1
  76. package/src/hooks/useMutateRemoveMembers.ts +1 -1
  77. package/src/hooks/useMutateTyping.ts +1 -1
  78. package/src/hooks/usePresence.ts +8 -5
  79. package/src/hooks/useReactions.ts +0 -1
  80. package/src/hooks/useSearchUsers.ts +1 -1
  81. package/src/hooks/useUser.ts +4 -3
  82. package/src/index.ts +2 -2
  83. package/src/scss/theme/_alert.scss +73 -0
  84. package/src/scss/theme/_appbar.scss +112 -0
  85. package/src/scss/theme/_attachments.scss +74 -0
  86. package/src/scss/theme/_avatar.scss +54 -0
  87. package/src/scss/theme/_badge.scss +47 -0
  88. package/src/scss/theme/_buttons.scss +96 -0
  89. package/src/scss/theme/_card.scss +7 -0
  90. package/src/scss/theme/_checkbox.scss +56 -0
  91. package/src/scss/theme/_cm-editor.scss +42 -0
  92. package/src/scss/theme/_code.scss +115 -0
  93. package/src/scss/theme/_colors.scss +520 -0
  94. package/src/scss/theme/_config.scss +6 -0
  95. package/src/scss/theme/_content.scss +15 -0
  96. package/src/scss/theme/_conversations.scss +91 -0
  97. package/src/scss/theme/_dropdown.scss +86 -0
  98. package/src/scss/theme/_emoji.scss +5 -0
  99. package/src/scss/theme/_filebrowser.scss +26 -0
  100. package/src/scss/theme/_files.scss +140 -0
  101. package/src/scss/theme/_icons.scss +62 -0
  102. package/src/scss/theme/_image-grid.scss +63 -0
  103. package/src/scss/theme/_inputs.scss +28 -0
  104. package/src/scss/theme/_message-editor.scss +90 -0
  105. package/src/scss/theme/_messages.scss +238 -0
  106. package/src/scss/theme/_nav.scss +52 -0
  107. package/src/scss/theme/_overlays.scss +157 -0
  108. package/src/scss/theme/_pager.scss +19 -0
  109. package/src/scss/theme/_palette.scss +165 -0
  110. package/src/scss/theme/_pane.scss +16 -0
  111. package/src/scss/theme/_panels.scss +137 -0
  112. package/src/scss/theme/_picker-list.scss +37 -0
  113. package/src/scss/theme/_preview-embed.scss +38 -0
  114. package/src/scss/theme/_preview-html.scss +7 -0
  115. package/src/scss/theme/_preview-icon.scss +41 -0
  116. package/src/scss/theme/_preview-image.scss +86 -0
  117. package/src/scss/theme/_preview-media.scss +28 -0
  118. package/src/scss/theme/_preview-pdf.scss +838 -0
  119. package/src/scss/theme/_preview-text.scss +5 -0
  120. package/src/scss/theme/_preview.scss +105 -0
  121. package/src/scss/theme/_reactions.scss +58 -0
  122. package/src/scss/theme/_reboot.scss +41 -0
  123. package/src/scss/theme/_root.scss +2 -0
  124. package/src/scss/theme/_scroll.scss +55 -0
  125. package/src/scss/theme/_search.scss +68 -0
  126. package/src/scss/theme/_spinner.scss +63 -0
  127. package/src/scss/theme/_tables.scss +53 -0
  128. package/src/scss/theme/_toasts.scss +47 -0
  129. package/src/scss/theme/_turbo.scss +17 -0
  130. package/src/scss/theme/_typing.scss +26 -0
  131. package/src/scss/theme/_variables.scss +139 -0
  132. package/src/scss/theme/bootstrap/_accordion.scss +146 -0
  133. package/src/scss/theme/bootstrap/_alert.scss +71 -0
  134. package/src/scss/theme/bootstrap/_badge.scss +38 -0
  135. package/src/scss/theme/bootstrap/_breadcrumb.scss +40 -0
  136. package/src/scss/theme/bootstrap/_button-group.scss +142 -0
  137. package/src/scss/theme/bootstrap/_buttons.scss +186 -0
  138. package/src/scss/theme/bootstrap/_card.scss +234 -0
  139. package/src/scss/theme/bootstrap/_carousel.scss +229 -0
  140. package/src/scss/theme/bootstrap/_close.scss +40 -0
  141. package/src/scss/theme/bootstrap/_containers.scss +41 -0
  142. package/src/scss/theme/bootstrap/_dropdown.scss +248 -0
  143. package/src/scss/theme/bootstrap/_forms.scss +9 -0
  144. package/src/scss/theme/bootstrap/_functions.scss +302 -0
  145. package/src/scss/theme/bootstrap/_grid.scss +33 -0
  146. package/src/scss/theme/bootstrap/_helpers.scss +10 -0
  147. package/src/scss/theme/bootstrap/_images.scss +42 -0
  148. package/src/scss/theme/bootstrap/_list-group.scss +191 -0
  149. package/src/scss/theme/bootstrap/_maps.scss +54 -0
  150. package/src/scss/theme/bootstrap/_mixins.scss +43 -0
  151. package/src/scss/theme/bootstrap/_modal.scss +237 -0
  152. package/src/scss/theme/bootstrap/_nav.scss +172 -0
  153. package/src/scss/theme/bootstrap/_navbar.scss +276 -0
  154. package/src/scss/theme/bootstrap/_offcanvas.scss +143 -0
  155. package/src/scss/theme/bootstrap/_pagination.scss +109 -0
  156. package/src/scss/theme/bootstrap/_placeholders.scss +51 -0
  157. package/src/scss/theme/bootstrap/_popover.scss +196 -0
  158. package/src/scss/theme/bootstrap/_progress.scss +59 -0
  159. package/src/scss/theme/bootstrap/_reboot.scss +610 -0
  160. package/src/scss/theme/bootstrap/_root.scss +73 -0
  161. package/src/scss/theme/bootstrap/_spinners.scss +85 -0
  162. package/src/scss/theme/bootstrap/_tables.scss +164 -0
  163. package/src/scss/theme/bootstrap/_toasts.scss +70 -0
  164. package/src/scss/theme/bootstrap/_tooltip.scss +120 -0
  165. package/src/scss/theme/bootstrap/_transitions.scss +27 -0
  166. package/src/scss/theme/bootstrap/_type.scss +106 -0
  167. package/src/scss/theme/bootstrap/_utilities.scss +647 -0
  168. package/src/scss/theme/bootstrap/_variables.scss +1633 -0
  169. package/src/scss/theme/bootstrap/forms/_floating-labels.scss +74 -0
  170. package/src/scss/theme/bootstrap/forms/_form-check.scss +175 -0
  171. package/src/scss/theme/bootstrap/forms/_form-control.scss +194 -0
  172. package/src/scss/theme/bootstrap/forms/_form-range.scss +91 -0
  173. package/src/scss/theme/bootstrap/forms/_form-select.scss +71 -0
  174. package/src/scss/theme/bootstrap/forms/_form-text.scss +11 -0
  175. package/src/scss/theme/bootstrap/forms/_input-group.scss +129 -0
  176. package/src/scss/theme/bootstrap/forms/_labels.scss +36 -0
  177. package/src/scss/theme/bootstrap/forms/_validation.scss +12 -0
  178. package/src/scss/theme/bootstrap/helpers/_clearfix.scss +3 -0
  179. package/src/scss/theme/bootstrap/helpers/_color-bg.scss +10 -0
  180. package/src/scss/theme/bootstrap/helpers/_colored-links.scss +12 -0
  181. package/src/scss/theme/bootstrap/helpers/_position.scss +36 -0
  182. package/src/scss/theme/bootstrap/helpers/_ratio.scss +26 -0
  183. package/src/scss/theme/bootstrap/helpers/_stacks.scss +15 -0
  184. package/src/scss/theme/bootstrap/helpers/_stretched-link.scss +15 -0
  185. package/src/scss/theme/bootstrap/helpers/_text-truncation.scss +7 -0
  186. package/src/scss/theme/bootstrap/helpers/_visually-hidden.scss +8 -0
  187. package/src/scss/theme/bootstrap/helpers/_vr.scss +8 -0
  188. package/src/scss/theme/bootstrap/mixins/_alert.scss +15 -0
  189. package/src/scss/theme/bootstrap/mixins/_backdrop.scss +14 -0
  190. package/src/scss/theme/bootstrap/mixins/_banner.scss +9 -0
  191. package/src/scss/theme/bootstrap/mixins/_border-radius.scss +78 -0
  192. package/src/scss/theme/bootstrap/mixins/_box-shadow.scss +18 -0
  193. package/src/scss/theme/bootstrap/mixins/_breakpoints.scss +127 -0
  194. package/src/scss/theme/bootstrap/mixins/_buttons.scss +70 -0
  195. package/src/scss/theme/bootstrap/mixins/_caret.scss +64 -0
  196. package/src/scss/theme/bootstrap/mixins/_clearfix.scss +9 -0
  197. package/src/scss/theme/bootstrap/mixins/_color-scheme.scss +7 -0
  198. package/src/scss/theme/bootstrap/mixins/_container.scss +11 -0
  199. package/src/scss/theme/bootstrap/mixins/_deprecate.scss +10 -0
  200. package/src/scss/theme/bootstrap/mixins/_forms.scss +152 -0
  201. package/src/scss/theme/bootstrap/mixins/_gradients.scss +47 -0
  202. package/src/scss/theme/bootstrap/mixins/_grid.scss +151 -0
  203. package/src/scss/theme/bootstrap/mixins/_image.scss +16 -0
  204. package/src/scss/theme/bootstrap/mixins/_list-group.scss +24 -0
  205. package/src/scss/theme/bootstrap/mixins/_lists.scss +7 -0
  206. package/src/scss/theme/bootstrap/mixins/_pagination.scss +10 -0
  207. package/src/scss/theme/bootstrap/mixins/_reset-text.scss +17 -0
  208. package/src/scss/theme/bootstrap/mixins/_resize.scss +6 -0
  209. package/src/scss/theme/bootstrap/mixins/_table-variants.scss +24 -0
  210. package/src/scss/theme/bootstrap/mixins/_text-truncate.scss +8 -0
  211. package/src/scss/theme/bootstrap/mixins/_transition.scss +26 -0
  212. package/src/scss/theme/bootstrap/mixins/_utilities.scss +97 -0
  213. package/src/scss/theme/bootstrap/mixins/_visually-hidden.scss +29 -0
  214. package/src/scss/theme/bootstrap/utilities/_api.scss +47 -0
  215. package/src/scss/theme/bootstrap/vendor/_rfs.scss +354 -0
  216. package/src/scss/theme/bs/_badge.scss +20 -0
  217. package/src/scss/theme/bs/_buttons.scss +185 -0
  218. package/src/scss/theme/bs/_dropdown.scss +86 -0
  219. package/src/scss/theme/bs/_forms.scss +161 -0
  220. package/src/scss/theme/bs/_list-group.scss +73 -0
  221. package/src/scss/theme/bs/_tables.scss +46 -0
  222. package/src/scss/theme/fonts/_fontmapping-roboto.scss +129 -0
  223. package/src/scss/theme/fonts/_fontmapping-segoe-ui.scss +127 -0
  224. package/src/scss/theme/fonts/_index.scss +2 -0
  225. package/src/scss/theme/mixins/_backdrop.scss +13 -0
  226. package/src/scss/theme/mixins/_palette.scss +165 -0
  227. package/src/scss/theme/mixins/_position.scss +33 -0
  228. package/src/scss/theme/mixins/_scrollbar.scss +110 -0
  229. package/src/scss/weavy-chat.scss +31 -0
  230. package/src/scss/weavy-messenger.scss +60 -0
  231. package/src/scss/weavy.scss +2 -0
  232. package/src/types/Messenger.ts +1 -1
  233. package/src/types/types.ts +14 -9
  234. package/src/ui/Button.tsx +3 -4
  235. package/src/ui/Dropdown.tsx +4 -5
  236. package/src/ui/Icon.tsx +75 -39
  237. package/src/ui/Overlay.tsx +2 -3
  238. package/src/utils/fileUtilities.ts +280 -72
  239. package/src/utils/scrollbarDetection.js +48 -0
  240. package/dist/cjs/types/utils/styles.d.ts +0 -17
  241. package/dist/esm/types/utils/styles.d.ts +0 -17
  242. package/src/utils/styles.ts +0 -42
@@ -1,5 +1,5 @@
1
1
  export default class WeavyClient {
2
- uri: string;
2
+ url: string;
3
3
  tokenFactory: () => string | Promise<string>;
4
4
  connection: import("@microsoft/signalr").HubConnection;
5
5
  groups: string[];
@@ -7,6 +7,8 @@ declare type ImageProps = {
7
7
  more?: number;
8
8
  onClick: (e: any) => void;
9
9
  };
10
+ export declare function checkImageLoad(img: HTMLImageElement): void;
11
+ export declare function imageLoaded(event: any): void;
10
12
  export declare const Image: ({ src, previewSrc, width, height, more, onClick }: ImageProps) => JSX.Element;
11
13
  declare type ImageGridProps = {
12
14
  children: React.ReactNode;
@@ -0,0 +1,6 @@
1
+ /// <reference types="react" />
2
+ declare type Props = {
3
+ src: string;
4
+ };
5
+ declare const PdfViewer: ({ src }: Props) => JSX.Element;
6
+ export default PdfViewer;
@@ -0,0 +1,58 @@
1
+ import React from "react";
2
+ declare type ImageProps = {
3
+ src: string;
4
+ width?: number;
5
+ height?: number;
6
+ };
7
+ export declare const PreviewImage: ({ src, width, height }: ImageProps) => JSX.Element;
8
+ declare type DocumentProps = {
9
+ src: string;
10
+ };
11
+ export declare const PreviewDocument: ({ src }: DocumentProps) => JSX.Element;
12
+ declare type VideoProps = {
13
+ src: string;
14
+ name: string;
15
+ mediaType?: string;
16
+ };
17
+ export declare const PreviewVideo: ({ src, name, mediaType }: VideoProps) => JSX.Element;
18
+ declare type AudioProps = {
19
+ src: string;
20
+ name: string;
21
+ mediaType?: string;
22
+ };
23
+ export declare const PreviewAudio: ({ src, name, mediaType }: AudioProps) => JSX.Element;
24
+ declare type TextProps = {
25
+ src: string;
26
+ html?: boolean;
27
+ code?: boolean;
28
+ };
29
+ export declare const PreviewText: ({ src, html, code }: TextProps) => JSX.Element;
30
+ declare type EmbedProps = {
31
+ src: string;
32
+ name: string;
33
+ icon: string;
34
+ provider?: string;
35
+ };
36
+ export declare const PreviewEmbed: ({ src, name, icon, provider }: EmbedProps) => JSX.Element;
37
+ declare type IconProps = {
38
+ children?: React.ReactNode;
39
+ src: string;
40
+ icon: string;
41
+ name: string;
42
+ provider?: string;
43
+ download?: boolean;
44
+ className?: string;
45
+ };
46
+ export declare const PreviewIcon: ({ children, src, icon, name, provider, download, className }: IconProps) => JSX.Element;
47
+ declare type PreviewProps = {
48
+ src: string;
49
+ format: PreviewFormatType;
50
+ name: string;
51
+ icon: string;
52
+ width?: number;
53
+ height?: number;
54
+ mediaType?: string;
55
+ provider?: string;
56
+ };
57
+ export declare const Preview: ({ src, format, name, icon, width, height, mediaType, provider }: PreviewProps) => JSX.Element;
58
+ export default Preview;
@@ -2,7 +2,6 @@ import React from "react";
2
2
  export declare const MessengerContext: React.Context<MessengerContextProps>;
3
3
  declare type Props = {
4
4
  children: React.ReactNode;
5
- options?: MessengerContextOptions;
6
5
  };
7
- declare const MessengerProvider: ({ children, options }: Props) => JSX.Element;
6
+ declare const MessengerProvider: ({ children }: Props) => JSX.Element;
8
7
  export default MessengerProvider;
@@ -1 +1,2 @@
1
- export default function useUser(client: any): import("react-query").UseQueryResult<UserType, unknown>;
1
+ import WeavyClient from "../client/WeavyClient";
2
+ export default function useUser(client: WeavyClient): import("react-query").UseQueryResult<UserType, unknown>;
@@ -1,3 +1,2 @@
1
1
  export interface Messenger {
2
- options?: MessengerContextOptions;
3
2
  }
@@ -1,29 +1,33 @@
1
1
  /// <reference types="react" />
2
+ interface WeavyClient {
3
+ url: string;
4
+ tokenFactory: (() => string | Promise<string>);
5
+ subscribe: Function;
6
+ unsubscribe: Function;
7
+ }
2
8
  declare type WeavyClientOptions = {
3
- uri: string;
9
+ url: string;
4
10
  tokenFactory: (() => string | Promise<string>);
5
11
  };
6
12
  declare type WeavyContextProps = {
7
- client: any;
13
+ client: WeavyClient | null;
8
14
  options?: WeavyContextOptions;
9
15
  };
10
16
  declare type WeavyContextOptions = {
11
17
  zoomAuthenticationUrl?: string;
12
18
  teamsAuthenticationUrl?: string;
13
19
  enableCloudFiles?: boolean;
20
+ enableScrollbarDetection?: boolean;
14
21
  filebrowserUrl?: string;
22
+ reactions?: string[];
15
23
  };
16
24
  declare type MessengerContextProps = {
17
- options?: MessengerContextOptions;
18
25
  selectedConversationId: null | number;
19
26
  setSelectedConversationId: Function;
20
27
  };
21
28
  declare type UserContextProps = {
22
29
  user: UserType;
23
30
  };
24
- declare type MessengerContextOptions = {
25
- reactions?: string[];
26
- };
27
31
  declare type PreviewContextProps = {
28
32
  openPreview: Function;
29
33
  closePreview: Function;
@@ -114,6 +118,7 @@ declare type AttachmentType = {
114
118
  thumbnail_url: string;
115
119
  external_url: string;
116
120
  };
121
+ declare type PreviewFormatType = "text" | "code" | "markup" | "image" | "video" | "audio" | "document" | "embed" | "link" | "download" | "none";
117
122
  declare type ReactionType = {
118
123
  id: number;
119
124
  parent: MessageType;
@@ -1,5 +1,20 @@
1
1
  export declare const fileSizeAsString: (size: number) => string;
2
- export declare const getIcon: (name: string, mediaType?: string) => {
2
+ export declare function getExtension(name: string): string;
3
+ export declare function isAudio(ext: string): boolean;
4
+ export declare function isImage(ext: string): boolean;
5
+ export declare function isWebImage(path: string): boolean;
6
+ export declare function isBitmap(path: string): boolean;
7
+ export declare function isMetaFile(path: string): boolean;
8
+ export declare function isVideo(ext: string): boolean;
9
+ export declare function isMarkup(ext: string): boolean;
10
+ export declare function isCode(ext: string): boolean;
11
+ export declare function isText(ext: string): boolean;
12
+ export declare function isOfficeDocument(path: string): boolean;
13
+ export declare function canResize(path: string): boolean;
14
+ export declare function canConvertToImage(filename: string): boolean;
15
+ export declare function canConvertToPdf(filename: string): boolean;
16
+ export declare function getIcon(name: string, mediaType?: string): {
3
17
  icon: string;
4
18
  color?: string;
5
19
  };
20
+ export declare function getPreviewFormat(filename: string): PreviewFormatType;
package/dist/index.d.ts CHANGED
@@ -4,7 +4,7 @@ import React, { FC } from 'react';
4
4
  import { Styles } from 'react-modal';
5
5
 
6
6
  declare class WeavyClient {
7
- uri: string;
7
+ url: string;
8
8
  tokenFactory: () => string | Promise<string>;
9
9
  connection: _microsoft_signalr.HubConnection;
10
10
  groups: string[];
@@ -31,9 +31,8 @@ declare const WeavyProvider: ({ children, client, options }: Props$2) => JSX.Ele
31
31
  declare const MessengerContext: React.Context<MessengerContextProps>;
32
32
  declare type Props$1 = {
33
33
  children: React.ReactNode;
34
- options?: MessengerContextOptions;
35
34
  };
36
- declare const MessengerProvider: ({ children, options }: Props$1) => JSX.Element;
35
+ declare const MessengerProvider: ({ children }: Props$1) => JSX.Element;
37
36
 
38
37
  declare const Messenger: FC<Messenger>;
39
38
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@weavy/uikit-react",
3
- "version": "11.0.1",
3
+ "version": "12.1.0",
4
4
  "author": "Weavy",
5
5
  "description": "React UI-kit for Weavy",
6
6
  "homepage": "https://github.com/weavy/weavy-uikit-react",
@@ -8,6 +8,7 @@
8
8
  "main": "dist/cjs/index.js",
9
9
  "module": "dist/esm/index.js",
10
10
  "types": "./dist/cjs/types/index.d.ts",
11
+ "style": "dist/css/weavy-react.css",
11
12
  "devDependencies": {
12
13
  "@rollup/plugin-commonjs": "^22.0.0",
13
14
  "@rollup/plugin-node-resolve": "^13.1.3",
@@ -17,11 +18,13 @@
17
18
  "@types/react": "^18.0.8",
18
19
  "@types/react-dom": "^18.0.3",
19
20
  "@types/react-modal": "^3.13.1",
21
+ "npm-run-all": "^4.1.5",
22
+ "rimraf": "^3.0.2",
20
23
  "rollup": "^2.72.0",
21
- "rollup-plugin-delete": "^2.0.0",
22
24
  "rollup-plugin-dts": "^4.2.1",
23
25
  "rollup-plugin-peer-deps-external": "^2.2.4",
24
26
  "rollup-plugin-terser": "^7.0.2",
27
+ "sass": "^1.53.0",
25
28
  "tslib": "^2.4.0",
26
29
  "typescript": "^4.6.4"
27
30
  },
@@ -30,10 +33,16 @@
30
33
  "react-dom": "^18.1.0"
31
34
  },
32
35
  "scripts": {
33
- "build": "rollup -c",
34
- "watch": "rollup -c --watch"
36
+ "clean": "rimraf dist/*",
37
+ "build": "npm-run-all clean --parallel css js",
38
+ "css": "sass src/scss:dist/css --no-source-map",
39
+ "js": "rollup -c",
40
+ "watch": "npm-run-all clean --parallel watch-css watch-js",
41
+ "watch-css": "sass src/scss:dist/css --watch",
42
+ "watch-js": "rollup -c --watch"
35
43
  },
36
44
  "dependencies": {
45
+ "@mdi/js": "^6.9.96",
37
46
  "@mdi/react": "^1.6.0",
38
47
  "@microsoft/signalr": "^6.0.3",
39
48
  "classnames": "^2.3.1",
@@ -41,6 +50,7 @@
41
50
  "emoji-toolkit": "^6.6.0",
42
51
  "lodash.debounce": "^4.0.8",
43
52
  "lodash.throttle": "^4.1.1",
53
+ "pdfjs-dist": "^2.14.305",
44
54
  "react-modal": "^3.14.4",
45
55
  "react-query": "^3.34.16"
46
56
  }
package/rollup.config.js CHANGED
@@ -4,7 +4,6 @@ import typescript from "@rollup/plugin-typescript";
4
4
  import dts from "rollup-plugin-dts";
5
5
  import { terser } from "rollup-plugin-terser";
6
6
  import peerDepsExternal from 'rollup-plugin-peer-deps-external';
7
- import del from 'rollup-plugin-delete';
8
7
 
9
8
  const packageJson = require("./package.json");
10
9
 
@@ -24,7 +23,6 @@ export default [
24
23
  },
25
24
  ],
26
25
  plugins: [
27
- del({ targets: 'dist/*' }),
28
26
  peerDepsExternal(),
29
27
  resolve(),
30
28
  commonjs(),
@@ -1,7 +1,7 @@
1
1
  import { HubConnectionBuilder, LogLevel } from '@microsoft/signalr';
2
2
 
3
3
  export default class WeavyClient {
4
- uri;
4
+ url;
5
5
  tokenFactory;
6
6
  connection;
7
7
  groups: string[];
@@ -14,14 +14,14 @@ export default class WeavyClient {
14
14
  EVENT_RECONNECTED = "reconnected";
15
15
 
16
16
  constructor(options: WeavyClientOptions) {
17
- this.uri = options.uri;
17
+ this.url = options.url;
18
18
  this.tokenFactory = options.tokenFactory
19
19
  this.groups = [];
20
20
  this.connectionEvents = [];
21
21
 
22
22
  this.connection = new HubConnectionBuilder()
23
23
  .configureLogging(LogLevel.None)
24
- .withUrl(this.uri + "/hubs/rtm", {
24
+ .withUrl(this.url + "/hubs/rtm", {
25
25
  accessTokenFactory: this.tokenFactory
26
26
  })
27
27
  .withAutomaticReconnect()
@@ -1,7 +1,6 @@
1
1
  import React from "react";
2
2
  import Icon from "../ui/Icon";
3
3
  import { fileSizeAsString, getIcon } from "../utils/fileUtilities";
4
- import { prefix as wy } from "../utils/styles";
5
4
 
6
5
  type Props = {
7
6
  previewFormat: string,
@@ -18,12 +17,12 @@ const Attachment = ({ previewFormat, url, previewUrl, mediaType, name, kind, siz
18
17
  let fileSize = size > 0 ? fileSizeAsString(size) : null;
19
18
  let { icon, color } = getIcon(name, mediaType)
20
19
  return (
21
- <a href={previewUrl || url} className={wy('attachment')} target={"_blank"} title={name}>
22
- <div className={wy('attachment-icon')} title={kind}><Icon.UI name={icon} color={color} size={2} /></div>
23
- <div className={wy('attachment-content')}>
24
- <div className={wy('attachment-title')}>{name}</div>
20
+ <a href={previewUrl || url} className={'wy-attachment'} target={"_blank"} title={name}>
21
+ <div className={'wy-attachment-icon'} title={kind}><Icon.UI name={icon} color={color} size={2} /></div>
22
+ <div className={'wy-attachment-content'}>
23
+ <div className={'wy-attachment-title'}>{name}</div>
25
24
  {fileSize &&
26
- <div className={wy('attachment-meta')} title={fileSize}>{fileSize}</div>
25
+ <div className={'wy-attachment-meta'} title={fileSize}>{fileSize}</div>
27
26
  }
28
27
  </div>
29
28
  </a>
@@ -1,7 +1,6 @@
1
1
  import React from "react";
2
2
  import classNames from 'classnames';
3
3
  import Presence from "./Presence";
4
- import { prefix as wy } from "../utils/styles";
5
4
 
6
5
  type Props = {
7
6
  id?: number,
@@ -14,8 +13,8 @@ type Props = {
14
13
 
15
14
  const Avatar = ({ id, src, name, presence, size = 48, className }: Props) => {
16
15
  return (
17
- <div className={classNames(wy('avatar-presence'), className)}>
18
- <img alt="" title={name} className={wy('avatar')} height={size} width={size} src={src} />
16
+ <div className={classNames('wy-avatar-presence', className)}>
17
+ <img alt="" title={name} className="wy-avatar" height={size} width={size} src={src} />
19
18
  {presence && id &&
20
19
  <Presence id={id} status={presence} />
21
20
  }
@@ -6,7 +6,6 @@ import Messages from './Messages';
6
6
  import useMembers from '../hooks/useMembers';
7
7
  import Typing from './Typing';
8
8
  import useConversation from '../hooks/useConversation';
9
- import { prefix as wy } from "../utils/styles";
10
9
 
11
10
  const Chat = ({ id }: ChatProps) => {
12
11
  const { client } = useContext(WeavyContext);
@@ -37,19 +36,16 @@ const Chat = ({ id }: ChatProps) => {
37
36
  }, [dataChat]);
38
37
 
39
38
  return (
40
- <>
41
- <header className={wy('appbars')}>
42
- <nav className={wy('appbar')}>
43
-
39
+ <div className="wy-messenger-conversation wy-scroll-y">
40
+ <header className="wy-appbars">
41
+ <nav className="wy-appbar">
42
+ <div></div>
44
43
  {selectedId && dataConversation &&
45
-
46
- <>
47
- <div>
48
- <Typing id={selectedId} context="conversation">
49
- {dataConversation.display_name}
50
- </Typing>
51
- </div>
52
- </>
44
+ <div className="wy-appbar-text">
45
+ <Typing id={selectedId} context="conversation">
46
+ {dataConversation.display_name}
47
+ </Typing>
48
+ </div>
53
49
  }
54
50
  </nav>
55
51
  </header>
@@ -61,7 +57,7 @@ const Chat = ({ id }: ChatProps) => {
61
57
  {selectedId && dataMembers &&
62
58
  <Messages id={selectedId} members={dataMembers} />
63
59
  }
64
- </>
60
+ </div>
65
61
  )
66
62
  }
67
63
 
@@ -13,7 +13,6 @@ import SearchUsers from './SearchUsers';
13
13
  import useMutateMembers from '../hooks/useMutateMembers';
14
14
  import useConversation from '../hooks/useConversation';
15
15
  import useMutateConversationName from '../hooks/useMutateConversationName';
16
- import { prefix as wy } from "../utils/styles";
17
16
  import useMutateRemoveMembers from '../hooks/useMutateRemoveMembers';
18
17
  import Avatar from './Avatar';
19
18
  import { UserContext } from '../contexts/UserContext';
@@ -21,7 +20,6 @@ import Messages from './Messages';
21
20
 
22
21
  const Conversation = ({ id, showBackButton }: ConversationProps) => {
23
22
 
24
-
25
23
  const queryClient = useQueryClient();
26
24
  const { client } = useContext(WeavyContext);
27
25
  const { selectedConversationId, setSelectedConversationId } = useContext(MessengerContext);
@@ -85,10 +83,6 @@ const Conversation = ({ id, showBackButton }: ConversationProps) => {
85
83
  setSelectedConversationId(null);
86
84
  }
87
85
 
88
-
89
-
90
-
91
-
92
86
  // set selected conversation id if id is supplied to component
93
87
  useEffect(() => {
94
88
  if (id) {
@@ -117,13 +111,10 @@ const Conversation = ({ id, showBackButton }: ConversationProps) => {
117
111
  }
118
112
  }, [dataConversation]);
119
113
 
120
-
121
-
122
-
123
114
  return (
124
115
  <>
125
- <header className={wy('appbars')}>
126
- <nav className={wy('appbar')}>
116
+ <header className="wy-appbars">
117
+ <nav className="wy-appbar">
127
118
  <div>
128
119
  {showBackButton &&
129
120
  <Button.UI onClick={handleBack}><Icon.UI name="back" /></Button.UI>
@@ -131,7 +122,7 @@ const Conversation = ({ id, showBackButton }: ConversationProps) => {
131
122
  {selectedConversationId && dataConversation &&
132
123
 
133
124
  <>
134
- <div>
125
+ <div className="wy-appbar-text">
135
126
  <Typing id={selectedConversationId} context="conversation">
136
127
  {dataConversation.display_name}
137
128
  </Typing>
@@ -154,51 +145,51 @@ const Conversation = ({ id, showBackButton }: ConversationProps) => {
154
145
  </header>
155
146
 
156
147
  {!selectedConversationId &&
157
- <div className={wy('avatar-header')}>
148
+ <div className="wy-avatar-header">
158
149
  <Avatar src={user.avatar_url} name={user.title} presence={user.presence} id={user.id} size={256} />
159
150
  <h2>Welcome {user.name}!</h2>
160
- Select a conversation to get started
151
+ Create or select a conversation to get started
161
152
  </div>
162
153
  }
163
154
  {selectedConversationId && dataMembers &&
164
155
  <Messages id={selectedConversationId} members={dataMembers} displayName={dataConversation?.display_name} avatarUrl={dataConversation?.avatar_url} />
165
156
  }
166
157
 
167
- <Overlay.UI isOpen={modalAddOpen} className={wy('modal')}>
168
- <header className={wy('appbars')}>
169
- <nav className={wy('appbar')}>
158
+ <Overlay.UI isOpen={modalAddOpen} className="wy-modal">
159
+ <header className="wy-appbars">
160
+ <nav className="wy-appbar">
170
161
  <Button.UI onClick={() => toggleAddModal(false)}><Icon.UI name='close' /></Button.UI>
171
- <div className={wy('appbar-text')}>Add people</div>
162
+ <div className="wy-appbar-text">Add people</div>
172
163
  </nav>
173
164
  </header>
174
165
  <SearchUsers handleSubmit={handleAdd} buttonTitle="Add selected" />
175
166
  </Overlay.UI>
176
167
 
177
- <Overlay.UI isOpen={modalDetailsOpen} className={wy('modal')}>
178
- <header className={wy('appbars')}>
179
- <nav className={wy('appbar')}>
168
+ <Overlay.UI isOpen={modalDetailsOpen} className="wy-modal">
169
+ <header className="wy-appbars">
170
+ <nav className="wy-appbar">
180
171
  <Button.UI onClick={() => toggleDetailsModal(false)}><Icon.UI name='close' /></Button.UI>
181
- <div className={wy('appbar-text')}>Conversation details</div>
172
+ <div className="wy-appbar-text">Conversation details</div>
182
173
  </nav>
183
174
  </header>
184
175
  <div>
185
- {dataConversation && <div className={wy('avatar-header')}><Avatar src={dataConversation?.avatar_url} name={title} size={128} /></div>}
176
+ {dataConversation && <div className="wy-avatar-header"><Avatar src={dataConversation?.avatar_url} name={title} size={128} /></div>}
186
177
  {dataConversation?.type !== ChatRoom &&
187
- <h4 className={wy('avatar-display-name')}>{dataConversation?.display_name}</h4>
178
+ <h4 className="wy-avatar-display-name">{dataConversation?.display_name}</h4>
188
179
  }
189
180
 
190
181
  {dataConversation?.type === ChatRoom && (
191
182
  <>
192
- <div className={wy('pane-group')}>
193
- <input className={wy('input')} value={title} onChange={(e) => handleUpdateTitle(e)} />
183
+ <div className="wy-pane-group">
184
+ <input className="wy-input" value={title} onChange={(e) => handleUpdateTitle(e)} />
194
185
  </div>
195
- <div className={wy('pane-group')}>
196
- <table className={wy('search-result-table')}>
186
+ <div className="wy-pane-group">
187
+ <table className="wy-search-result-table">
197
188
  <tbody>
198
189
  {dataMembers?.data.map((m: MemberType) => {
199
190
  return (
200
- <tr key={m.id} className={wy('search-result-table-checkbox')}>
201
- <td className={wy('search-result-table-icon')}><Avatar src={m.avatar_url} name={m.display_name} id={m.id} size={24} presence={m.presence} /></td>
191
+ <tr key={m.id} className="wy-search-result-table-checkbox">
192
+ <td className="wy-search-result-table-icon"><Avatar src={m.avatar_url} name={m.display_name} id={m.id} size={24} presence={m.presence} /></td>
202
193
  <td>{m.display_name}</td>
203
194
  <td></td>
204
195
  </tr>
@@ -1,7 +1,6 @@
1
1
  import React, { useContext, useEffect, useState } from "react";
2
2
  import { WeavyContext } from "../contexts/WeavyContext";
3
3
  import useBadge from "../hooks/useBadge";
4
- import { prefix as wy } from "../utils/styles";
5
4
 
6
5
  const ConversationBadge = () => {
7
6
  const { client } = useContext(WeavyContext);
@@ -34,7 +33,7 @@ const ConversationBadge = () => {
34
33
  return (
35
34
  <>
36
35
  {!isLoading && badge > 0 &&
37
- <span className={wy('badge badge-danger')}>{badge}</span>
36
+ <span className="wy-badge wy-badge-danger">{badge}</span>
38
37
  }
39
38
  </>
40
39
 
@@ -11,8 +11,6 @@ import Meetings from './Meetings';
11
11
  import Meeting from './Meeting';
12
12
  import FileBrowser from './FileBrowser';
13
13
  import { getIcon } from '../utils/fileUtilities';
14
- import { prefix as wy } from "../utils/styles";
15
-
16
14
 
17
15
  type Props = {
18
16
  conversationId: number,
@@ -46,13 +44,10 @@ const ConversationForm = ({ conversationId, handleInsert }: Props) => {
46
44
  setAttachments([...attachments, attachment[0]]);
47
45
  }
48
46
  })
49
-
50
-
51
47
  }
52
48
 
53
49
  const { mutateAsync: uploadFile, isSuccess: uploadSuccess } = useFileUploader(handleUploaded);
54
50
 
55
-
56
51
  useEffect(() => {
57
52
  // set stored text and attachments if available
58
53
  let textValue: any = queryClient.getQueryData(["form-text", conversationId]) || "";
@@ -71,8 +66,6 @@ const ConversationForm = ({ conversationId, handleInsert }: Props) => {
71
66
  handleAutoGrow();
72
67
  }, [text])
73
68
 
74
-
75
-
76
69
  const handleInsertMessage = (e: React.KeyboardEvent<EventTarget>) => {
77
70
 
78
71
  if(e.type === 'keydown' && !(e.key === "Enter" && e.ctrlKey )) return;
@@ -159,7 +152,7 @@ const ConversationForm = ({ conversationId, handleInsert }: Props) => {
159
152
 
160
153
 
161
154
  return (
162
- <form className={wy('message-form')}>
155
+ <form className="wy-message-form">
163
156
  {uploadError &&
164
157
  <div>{uploadError}</div>
165
158
  }
@@ -169,12 +162,12 @@ const ConversationForm = ({ conversationId, handleInsert }: Props) => {
169
162
  {working &&
170
163
  <div>Now uploading ({currentUploadCount} of {fileCount}) selected files</div>
171
164
  }
172
- <div className={wy('picker-list')}>
165
+ <div className="wy-picker-list">
173
166
  {attachments.map((a: FileType) => {
174
167
  let { icon } = getIcon(a.name);
175
168
  return (
176
- <div key={a.id} className={wy('picker-list-item')}>
177
- <File id={a.id} name={a.name} className={wy('picker-list-item-title')} icon={ icon } />
169
+ <div key={a.id} className="wy-picker-list-item">
170
+ <File id={a.id} name={a.name} className="wy-picker-list-item-title" icon={ icon } />
178
171
  <Button.UI onClick={handleRemoveFile.bind(ConversationForm, a.id)}><Icon.UI name='close-circle' /></Button.UI>
179
172
  </div>
180
173
 
@@ -183,8 +176,8 @@ const ConversationForm = ({ conversationId, handleInsert }: Props) => {
183
176
 
184
177
  {meetings.map((m: MeetingType) => {
185
178
  return (
186
- <div key={m.id} className={wy('picker-list-item')}>
187
- <Meeting id={m.id} title={m.provider} className={wy('picker-list-item-title')} />
179
+ <div key={m.id} className="wy-picker-list-item">
180
+ <Meeting id={m.id} title={m.provider} className="wy-picker-list-item-title" />
188
181
  <Button.UI onClick={handleRemoveMeeting.bind(ConversationForm, m.id)}><Icon.UI name='close-circle' /></Button.UI>
189
182
  </div>
190
183
 
@@ -193,19 +186,19 @@ const ConversationForm = ({ conversationId, handleInsert }: Props) => {
193
186
  </div>
194
187
  </div>
195
188
  }
196
- <div className={wy('message-editor-inputs')}>
189
+ <div className="wy-message-editor-inputs">
197
190
 
198
- <div className={wy('message-editor-buttons')}>
191
+ <div className="wy-message-editor-buttons">
199
192
  <input type="file" ref={input => fileInput = input} value={files} onChange={handleFileUpload} multiple hidden tabIndex={-1} />
200
193
  <Button.UI title="Upload attachment" onClick={openFileInput}><Icon.UI name="attachment" /></Button.UI>
201
194
  <Meetings onMeetingAdded={handleAddMeeting} />
202
195
  <FileBrowser onFileAdded={handleExternalFileAdded} />
203
196
  </div>
204
197
 
205
- <div className={wy('message-editor-text message-editor-grow')}>
206
- <textarea rows={1} ref={textInput} className={wy('message-editor-textfield message-editor-textcontent')} value={text} onChange={handleChange} onKeyDown={handleInsertMessage} onKeyPress={useThrottle(handleKeyPress, 4000)}></textarea>
198
+ <div className="wy-message-editor-text wy-message-editor-grow">
199
+ <textarea rows={1} ref={textInput} className="wy-message-editor-textfield wy-message-editor-textcontent" value={text} onChange={handleChange} onKeyDown={handleInsertMessage} onKeyPress={useThrottle(handleKeyPress, 4000)}></textarea>
207
200
  </div>
208
- <div className={wy('message-editor-buttons')}>
201
+ <div className="wy-message-editor-buttons">
209
202
  <Button.UI type="button" onClick={handleInsertMessage} ><Icon.UI name="send"/></Button.UI>
210
203
  </div>
211
204
  </div>