@amityco/ui-kit-open-source 3.8.0 → 3.9.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.
package/dist/index.d.mts CHANGED
@@ -1,48 +1,165 @@
1
- import React, { ReactNode } from 'react';
2
- import { PostContentType } from '@amityco/ts-sdk';
3
- import * as styled_components from 'styled-components';
1
+ import React, { ReactNode, RefObject } from 'react';
4
2
  import * as styled_components_dist_types from 'styled-components/dist/types';
3
+ import * as styled_components from 'styled-components';
5
4
 
6
- type CustomComponentName = 'Avatar' | 'CategoryHeader' | 'CategorySelector' | 'Chat' | 'ChatDetails' | 'ChatHeader' | 'ChatItem' | 'Comment' | 'CommentComposerBar' | 'CommentLikeButton' | 'CommunityCreatedModel' | 'CommunityCreationModal' | 'CommunityForm' | 'CommunityItem' | 'CommunityMembers' | 'CommunityName' | 'CommunityPermissions' | 'EmptyFeed' | 'EngagementBar' | 'Feed' | 'FeedHeaderTabs' | 'File' | 'Image' | 'ImageGallery' | 'Images' | 'Layout' | 'MediaGallery' | 'MenuTab' | 'Message' | 'MessageComposerBar' | 'MessageList' | 'Post' | 'PostLikeButton' | 'PostTargetSelector' | 'ProfileSettings' | 'ProfileSettingsTabs' | 'RecentChat' | 'SideNavBar' | 'SocialSearch' | 'Tabs' | 'UICategoryCard' | 'UICommunityCard' | 'UICommunityHeader' | 'UICommunityInfo' | 'UIEngagementBar' | 'UIPostHeader' | 'UITextContent' | 'UITrendingItem' | 'UIUserInfo' | 'UserChip' | 'UserHeader' | 'UserSelector';
7
- type CustomComponentType = Partial<Record<CustomComponentName, <TProps>(props: TProps) => React.ReactElement<TProps>>>;
5
+ type AmityReactionType = {
6
+ name: string;
7
+ image: string;
8
+ };
8
9
 
9
- type PostRendererProps = {
10
- childrenPosts?: Amity.Post[];
11
- className?: string;
12
- currentUserId?: string;
13
- handleDeletePost?: (postId: string) => void;
14
- handleReportPost?: () => void;
15
- handleUnreportPost?: () => void;
16
- handleApprovePost?: () => void;
17
- handleDeclinePost?: () => void;
18
- handleClosePoll?: () => void;
19
- poll?: Amity.Poll | null;
20
- isPollClosed?: boolean;
21
- hidePostTarget?: boolean;
22
- isFlaggedByMe?: boolean;
23
- readonly?: boolean;
24
- post?: Amity.Post;
25
- user?: Amity.User | null;
26
- userRoles?: string[];
27
- loading?: boolean;
28
- avatarFileUrl?: string;
10
+ type ThemeValue = {
11
+ primary_color: string;
12
+ secondary_color: string;
13
+ secondary_shade1_color: string;
14
+ secondary_shade2_color: string;
15
+ secondary_shade3_color: string;
16
+ secondary_shade4_color: string;
17
+ base_color: string;
18
+ base_shade1_color: string;
19
+ base_shade2_color: string;
20
+ base_shade3_color: string;
21
+ base_shade4_color: string;
22
+ base_shade5_color: string;
23
+ alert_color: string;
24
+ background_color: string;
25
+ base_inverse_color: string;
26
+ };
27
+ type Theme = {
28
+ light: ThemeValue;
29
+ dark: ThemeValue;
30
+ };
31
+ type ThemeConfiguration = {
32
+ preferred_theme?: 'light' | 'dark' | 'default';
33
+ theme?: {
34
+ light?: Partial<Theme['light']>;
35
+ dark?: Partial<Theme['dark']>;
36
+ };
37
+ };
38
+ interface Config {
39
+ preferred_theme?: 'light' | 'dark' | 'default';
40
+ theme?: {
41
+ light?: Theme['light'];
42
+ dark?: Theme['dark'];
43
+ };
44
+ excludes?: string[];
45
+ message_reactions?: AmityReactionType[];
46
+ customizations?: {
47
+ [key: string]: IconConfiguration & TextConfiguration & ThemeConfiguration & CustomConfiguration;
48
+ };
49
+ }
50
+ type IconConfiguration = {
51
+ icon?: string;
52
+ image?: string;
53
+ };
54
+ type TextConfiguration = {
55
+ text?: string;
29
56
  };
30
- type PostRendererConfigType = Record<ValueOf<typeof PostContentType> | string, (props: PostRendererProps) => ReactNode>;
57
+ type CustomConfiguration = {
58
+ [key: string]: string | undefined | boolean | Array<string> | number | Record<string, unknown>;
59
+ };
60
+
61
+ declare enum Mode {
62
+ CREATE = "create",
63
+ EDIT = "edit"
64
+ }
65
+ interface AmityPostComposerEditOptions {
66
+ mode: Mode.EDIT;
67
+ post: Amity.Post;
68
+ }
69
+ interface AmityPostComposerCreateOptions {
70
+ mode: Mode.CREATE;
71
+ targetId: string | null;
72
+ targetType: 'community' | 'user';
73
+ community?: Amity.Community;
74
+ }
75
+ type PostComposerPageProps = AmityPostComposerCreateOptions | AmityPostComposerEditOptions;
76
+ declare function PostComposerPage(props: PostComposerPageProps): React.JSX.Element;
77
+
78
+ interface PageBehavior {
79
+ AmityStoryViewPageBehavior?: {
80
+ onCloseAction?(): void;
81
+ hyperLinkAction?(context: Record<string, unknown>): void;
82
+ };
83
+ AmityDraftStoryPageBehavior?: {
84
+ onCloseAction?(): void;
85
+ };
86
+ onClickHyperLink?(): void;
87
+ AmitySocialHomePageBehavior?: Record<string, unknown>;
88
+ AmityGlobalFeedComponentBehavior?: {
89
+ goToPostDetailPage?: (context: {
90
+ postId: string;
91
+ }) => void;
92
+ goToViewStoryPage?: (context: {
93
+ targetId: string;
94
+ targetType: Amity.StoryTargetType;
95
+ storyType: 'communityFeed' | 'globalFeed';
96
+ targetIds?: string[];
97
+ }) => void;
98
+ };
99
+ AmityPostDetailPageBehavior?: Record<string, unknown>;
100
+ AmityPostContentComponentBehavior?: {
101
+ goToCommunityProfilePage?: (context: {
102
+ communityId: string;
103
+ }) => void;
104
+ goToUserProfilePage?: (context: {
105
+ userId: string;
106
+ }) => void;
107
+ goToPostComposerPage?: (context: {
108
+ mode: Mode.EDIT;
109
+ post: Amity.Post;
110
+ }) => void;
111
+ };
112
+ AmitySocialGlobalSearchPageBehavior?: Record<string, unknown>;
113
+ AmityCommunitySearchResultComponentBehavior?: {
114
+ goToCommunityProfilePage?: (context: {
115
+ communityId: string;
116
+ }) => void;
117
+ };
118
+ AmityCreatePostMenuComponentBehavior?: {
119
+ goToSelectPostTargetPage?(): void;
120
+ goToStoryTargetSelectionPage?(): void;
121
+ };
122
+ AmityPostTargetSelectionPage?: {
123
+ goToPostComposerPage?: (context: {
124
+ mode: Mode.CREATE;
125
+ targetId: string | null;
126
+ targetType: 'community' | 'user';
127
+ community?: Amity.Community;
128
+ }) => void;
129
+ };
130
+ AmityStoryTargetSelectionPage?: {
131
+ goToStoryCreationPage?(context: {
132
+ targetId: string | null;
133
+ targetType: Amity.StoryTargetType;
134
+ mediaType: {
135
+ type: 'image';
136
+ url: string;
137
+ } | {
138
+ type: 'video';
139
+ url: string;
140
+ };
141
+ storyType: 'communityFeed' | 'globalFeed';
142
+ }): void;
143
+ };
144
+ AmityPostComposerPageBehavior?: {
145
+ goToSocialHomePage?(): void;
146
+ };
147
+ }
31
148
 
32
- interface UiKitProviderProps {
149
+ type AmityUIKitConfig = Config;
150
+ interface AmityUIKitProviderProps {
33
151
  apiKey: string;
34
152
  apiRegion: string;
35
153
  apiEndpoint?: {
36
154
  http?: string;
37
155
  mqtt?: string;
38
156
  };
39
- authToken?: string;
40
157
  userId: string;
41
158
  displayName: string;
42
- customComponents?: CustomComponentType;
43
- postRendererConfig?: PostRendererConfigType;
159
+ postRendererConfig?: any;
44
160
  theme?: Record<string, unknown>;
45
161
  children?: React.ReactNode;
162
+ socialCommunityCreationButtonVisible?: boolean;
46
163
  actionHandlers?: {
47
164
  onChangePage?: (data: {
48
165
  type: string;
@@ -57,16 +174,15 @@ interface UiKitProviderProps {
57
174
  }) => void;
58
175
  onEditUser?: (userId: string) => void;
59
176
  onMessageUser?: (userId: string) => void;
60
- onBack?: () => void;
61
177
  };
62
- socialCommunityCreationButtonVisible?: boolean;
178
+ pageBehavior?: PageBehavior;
63
179
  onConnectionStatusChange?: (state: Amity.SessionStates) => void;
64
180
  onConnected?: () => void;
65
181
  onDisconnected?: () => void;
66
- pageBehavior?: Record<string, unknown>;
67
182
  getAuthToken?: () => Promise<string>;
183
+ configs?: AmityUIKitConfig;
68
184
  }
69
- declare const UiKitProvider: ({ apiKey, apiRegion, apiEndpoint, authToken, userId, displayName, customComponents, postRendererConfig, theme, children, socialCommunityCreationButtonVisible, actionHandlers, onConnectionStatusChange, onDisconnected, getAuthToken, }: UiKitProviderProps) => React.JSX.Element;
185
+ declare const AmityUIKitProvider: React.FC<AmityUIKitProviderProps>;
70
186
 
71
187
  interface FeedProps {
72
188
  className?: string;
@@ -201,10 +317,10 @@ interface AvatarProps {
201
317
  }
202
318
  declare const _default$1: (props: AvatarProps) => React.JSX.Element;
203
319
 
204
- declare const PostContainer: styled_components.IStyledComponent<"web", styled_components_dist_types.FastOmit<{
320
+ declare const PostContainer: styled_components_dist_types.IStyledComponentBase<"web", styled_components.FastOmit<{
205
321
  className?: string | undefined;
206
322
  children?: ReactNode;
207
- }, never>> & Omit<({ className, ...props }: {
323
+ }, never>> & string & Omit<({ className, ...props }: {
208
324
  className?: string | undefined;
209
325
  children?: ReactNode;
210
326
  }) => React.JSX.Element, keyof React.Component<any, {}, any>>;
@@ -280,11 +396,12 @@ declare class AmityUIKitManager {
280
396
  * @param userId - The user ID to be used for login.
281
397
  * @param displayName - The display name of the user.
282
398
  * @param sessionHandler - The session handler for access token renewal.
399
+ * @param authToken - The authentication token to be used for login.
283
400
  * @param onConnectionStatusChange - The callback function for connection status changes.
284
401
  * @param onConnected - The callback function to be called when connected.
285
402
  * @param onDisconnected - The callback function to be called when disconnected.
286
403
  */
287
- static registerDevice(userId: string, displayName: string, sessionHandler: SessionHandler, onConnectionStatusChange?: (state: Amity.SessionStates) => void, onConnected?: () => void, onDisconnected?: () => void): Promise<void>;
404
+ static registerDevice(userId: string, displayName: string, sessionHandler: SessionHandler, authToken?: string, onConnectionStatusChange?: (state: Amity.SessionStates) => void, onConnected?: () => void, onDisconnected?: () => void): Promise<void>;
288
405
  /**
289
406
  * Sets the AmityClient instance to be used by the AmityUIKitManager.
290
407
  * This method is useful when sharing the AmityClient instance between different parts of the application.
@@ -316,7 +433,7 @@ declare class AmityUIKitManager {
316
433
 
317
434
  interface CommentTrayProps {
318
435
  referenceType: Amity.CommentReferenceType;
319
- referenceId?: string;
436
+ referenceId: string;
320
437
  community: Amity.Community;
321
438
  shouldAllowInteraction: boolean;
322
439
  shouldAllowCreation?: boolean;
@@ -346,6 +463,89 @@ type StoryTabProps = ({
346
463
  };
347
464
  declare const StoryTab: React.FC<StoryTabProps>;
348
465
 
466
+ interface CreatePostMenuProps {
467
+ pageId: string;
468
+ }
469
+ declare function CreatePostMenu({ pageId }: CreatePostMenuProps): React.JSX.Element;
470
+
471
+ interface MediaAttachmentProps {
472
+ pageId: string;
473
+ uploadLoading?: boolean;
474
+ isVisibleCamera: boolean;
475
+ isVisibleImage: boolean;
476
+ isVisibleVideo: boolean;
477
+ onVideoFileChange?: (files: File[]) => void;
478
+ onImageFileChange?: (files: File[]) => void;
479
+ }
480
+ declare function MediaAttachment({ pageId, isVisibleCamera, isVisibleImage, isVisibleVideo, onVideoFileChange, onImageFileChange, }: MediaAttachmentProps): React.JSX.Element | null;
481
+
482
+ interface DetailedMediaAttachmentProps {
483
+ pageId: string;
484
+ isVisibleCamera: boolean;
485
+ isVisibleImage: boolean;
486
+ isVisibleVideo: boolean;
487
+ onVideoFileChange?: (files: File[]) => void;
488
+ onImageFileChange?: (files: File[]) => void;
489
+ }
490
+ declare function DetailedMediaAttachment({ pageId, isVisibleCamera, isVisibleImage, isVisibleVideo, onVideoFileChange, onImageFileChange, }: DetailedMediaAttachmentProps): React.JSX.Element | null;
491
+
492
+ interface UserSearchResultProps {
493
+ pageId?: string;
494
+ userCollection: Amity.User[];
495
+ isLoading: boolean;
496
+ onLoadMore: () => void;
497
+ }
498
+ declare const UserSearchResult: ({ pageId, userCollection, isLoading, onLoadMore, }: UserSearchResultProps) => React.JSX.Element;
499
+
500
+ interface CommunitySearchResultProps {
501
+ pageId?: string;
502
+ communityCollection: Amity.Community[];
503
+ isLoading: boolean;
504
+ onLoadMore: () => void;
505
+ }
506
+ declare const CommunitySearchResult: ({ pageId, communityCollection, isLoading, onLoadMore, }: CommunitySearchResultProps) => React.JSX.Element;
507
+
508
+ interface TopSearchBarProps {
509
+ pageId?: string;
510
+ search: (keyword: string) => void;
511
+ }
512
+ declare function TopSearchBar({ pageId, search }: TopSearchBarProps): React.JSX.Element | null;
513
+
514
+ interface PostContentProps {
515
+ pageId?: string;
516
+ post: Amity.Post;
517
+ type: 'feed' | 'detail';
518
+ drawerRef?: React.RefObject<HTMLDivElement>;
519
+ onClick?: () => void;
520
+ onPostDeleted?: (post: Amity.Post) => void;
521
+ }
522
+ declare const PostContent: ({ pageId, post: initialPost, type, drawerRef, onClick, onPostDeleted, }: PostContentProps) => React.JSX.Element;
523
+
524
+ interface MyCommunitiesProps {
525
+ pageId?: string;
526
+ }
527
+ declare const MyCommunities: ({ pageId }: MyCommunitiesProps) => React.JSX.Element;
528
+
529
+ interface GlobalFeedProps {
530
+ pageId?: string;
531
+ componentId?: string;
532
+ items: Array<Amity.Post | Amity.Ad>;
533
+ isLoading: boolean;
534
+ onFeedReachBottom: () => void;
535
+ onPostDeleted?: (post: Amity.Post) => void;
536
+ }
537
+ declare const GlobalFeed: ({ pageId, componentId, items, isLoading, onFeedReachBottom, onPostDeleted, }: GlobalFeedProps) => React.JSX.Element;
538
+
539
+ interface EmptyNewsfeedProps {
540
+ pageId?: string;
541
+ }
542
+ declare function EmptyNewsfeed({ pageId }: EmptyNewsfeedProps): React.JSX.Element | null;
543
+
544
+ interface NewsfeedProps {
545
+ pageId?: string;
546
+ }
547
+ declare const Newsfeed: ({ pageId }: NewsfeedProps) => React.JSX.Element;
548
+
349
549
  declare enum HomePageTab {
350
550
  Newsfeed = "Newsfeed",
351
551
  Explore = "Explore",
@@ -353,6 +553,69 @@ declare enum HomePageTab {
353
553
  }
354
554
  declare function SocialHomePage(): React.JSX.Element;
355
555
 
556
+ interface TopNavigationProps {
557
+ pageId?: string;
558
+ selectedTab?: HomePageTab;
559
+ onClickPostCreationButton?: () => void;
560
+ }
561
+ declare function TopNavigation({ pageId, selectedTab, onClickPostCreationButton, }: TopNavigationProps): React.JSX.Element | null;
562
+
563
+ interface ChatHeaderProps {
564
+ channel: Amity.Channel | null;
565
+ pageId?: string;
566
+ componentId?: string;
567
+ }
568
+ declare const ChatHeader: ({ channel, pageId }: ChatHeaderProps) => React.JSX.Element;
569
+
570
+ interface AmityLiveChatMessageListProps {
571
+ pageId?: string;
572
+ channel: Amity.Channel;
573
+ replyMessage: (message: Amity.Message<'text'>) => void;
574
+ }
575
+ declare const MessageList: ({ pageId, channel, replyMessage, }: AmityLiveChatMessageListProps) => React.JSX.Element;
576
+
577
+ type ComposeActionTypes = {
578
+ replyMessage?: Amity.Message;
579
+ mentionMessage?: Amity.Message;
580
+ clearReplyMessage?: () => void;
581
+ clearMention?: () => void;
582
+ };
583
+ interface MessageComposerProps {
584
+ channel: Amity.Channel;
585
+ composeAction: ComposeActionTypes;
586
+ suggestionRef?: RefObject<HTMLDivElement>;
587
+ disabled?: boolean;
588
+ pageId?: string;
589
+ }
590
+ declare const MessageComposer: ({ pageId, channel, composeAction: { replyMessage, mentionMessage, clearReplyMessage, clearMention }, }: MessageComposerProps) => React.JSX.Element;
591
+
592
+ declare const MessageReactionPreview: ({ message, onClick, }: {
593
+ message: Amity.Message;
594
+ onClick?: (() => void) | undefined;
595
+ }) => React.JSX.Element | null;
596
+
597
+ declare const MessageReactionPicker: ({ message, onSelectReaction, }: {
598
+ message: Amity.Message;
599
+ onSelectReaction: (reactionName: string) => void;
600
+ }) => React.JSX.Element | null;
601
+
602
+ interface MessageQuickReactionProps {
603
+ pageId?: string;
604
+ componentId?: string;
605
+ message: Amity.Message;
606
+ onSelectReaction?: () => void;
607
+ }
608
+ declare const MessageQuickReaction: ({ pageId, componentId, message, onSelectReaction, }: MessageQuickReactionProps) => React.JSX.Element;
609
+
610
+ type MessageActionType = {
611
+ onCopy?: () => void;
612
+ onFlag?: () => void;
613
+ onUnflag?: () => void;
614
+ onDelete?: () => void;
615
+ onReply?: () => void;
616
+ onMention?: () => void;
617
+ };
618
+
356
619
  type AmityStoryMediaType = {
357
620
  type: 'image';
358
621
  url: string;
@@ -408,23 +671,6 @@ declare const ViewStoryPage: React.FC<AmityViewStoryPageProps>;
408
671
 
409
672
  declare function StoryTargetSelectionPage(): React.JSX.Element;
410
673
 
411
- declare enum Mode {
412
- CREATE = "create",
413
- EDIT = "edit"
414
- }
415
- interface AmityPostComposerEditOptions {
416
- mode: Mode.EDIT;
417
- post?: Amity.Post;
418
- }
419
- interface AmityPostComposerCreateOptions {
420
- mode: Mode.CREATE;
421
- targetId: string | null;
422
- targetType: 'community' | 'user';
423
- community?: Amity.Community;
424
- }
425
- type PostComposerPageProps = AmityPostComposerCreateOptions | AmityPostComposerEditOptions;
426
- declare function PostComposerPage(props: PostComposerPageProps): React.JSX.Element | null;
427
-
428
674
  declare function SelectPostTargetPage(): React.JSX.Element;
429
675
 
430
676
  declare function MyCommunitiesSearchPage(): React.JSX.Element;
@@ -436,4 +682,4 @@ interface PostDetailPageProps {
436
682
  }
437
683
  declare function PostDetailPage({ id }: PostDetailPageProps): React.JSX.Element;
438
684
 
439
- export { _default$1 as AmityAvatar, CommentTray as AmityCommentTrayComponent, AmityDraftStoryPage, CommentText as AmityExpandableText, MyCommunitiesSearchPage as AmityMyCommunitiesSearchPage, PostComposerPage as AmityPostComposerPage, PostContainer as AmityPostContainer, PostDetailPage as AmityPostDetailPage, _default as AmityPostEngagementBar, SelectPostTargetPage as AmityPostTargetSelectionPage, ReactionList as AmityReactionList, type ReactionListProps as AmityReactionListProps, SocialGlobalSearchPage as AmitySocialGlobalSearchPage, SocialHomePage as AmitySocialHomePage, HomePageTab as AmitySocialHomePageTab, StoryPreview as AmityStoryPreview, StoryPreviewThumbnail as AmityStoryPreviewThumbnail, StoryTab as AmityStoryTabComponent, StoryTargetSelectionPage as AmityStoryTargetSelectionPage, AmityUIKitManager, ChatApplication as AmityUiKitChat, _default$2 as AmityUiKitFeed, UiKitProvider as AmityUiKitProvider, Community as AmityUiKitSocial, ViewStoryPage as AmityViewStoryPage, addChatMembers as amityAddChatMembers, removeChatMembers as amityRemoveChatMembers, useNavigation as useAmityNavigation, useSDK as useAmitySDK, useUser as useAmityUser };
685
+ export { _default$1 as AmityAvatar, CommentTray as AmityCommentTrayComponent, CommunitySearchResult as AmityCommunitySearchResultComponent, CreatePostMenu as AmityCreatePostMenuComponent, DetailedMediaAttachment as AmityDetailedMediaAttachmentComponent, AmityDraftStoryPage, EmptyNewsfeed as AmityEmptyNewsFeedComponent, CommentText as AmityExpandableText, GlobalFeed as AmityGlobalFeedComponent, ChatHeader as AmityLiveChatHeader, MessageComposer as AmityLiveChatMessageComposeBar, MessageList as AmityLiveChatMessageList, MessageQuickReaction as AmityLiveChatMessageQuickReaction, MessageReactionPicker as AmityLiveChatMessageReactionPicker, MessageReactionPreview as AmityLiveChatMessageReactionPreview, MediaAttachment as AmityMediaAttachmentComponent, type MessageActionType as AmityMessageActionType, MyCommunities as AmityMyCommunitiesComponent, MyCommunitiesSearchPage as AmityMyCommunitiesSearchPage, Newsfeed as AmityNewsFeedComponent, PostComposerPage as AmityPostComposerPage, PostContainer as AmityPostContainer, PostContent as AmityPostContentComponent, PostDetailPage as AmityPostDetailPage, _default as AmityPostEngagementBar, SelectPostTargetPage as AmityPostTargetSelectionPage, ReactionList as AmityReactionListComponent, type ReactionListProps as AmityReactionListProps, SocialGlobalSearchPage as AmitySocialGlobalSearchPage, SocialHomePage as AmitySocialHomePage, HomePageTab as AmitySocialHomePageTab, TopNavigation as AmitySocialHomeTopNavigationComponent, StoryPreview as AmityStoryPreview, StoryPreviewThumbnail as AmityStoryPreviewThumbnail, StoryTab as AmityStoryTabComponent, StoryTargetSelectionPage as AmityStoryTargetSelectionPage, TopSearchBar as AmityTopSearchBarComponent, AmityUIKitManager, ChatApplication as AmityUiKitChat, _default$2 as AmityUiKitFeed, AmityUIKitProvider as AmityUiKitProvider, Community as AmityUiKitSocial, UserSearchResult as AmityUserSearchResultComponent, ViewStoryPage as AmityViewStoryPage, addChatMembers as amityAddChatMembers, removeChatMembers as amityRemoveChatMembers, useNavigation as useAmityNavigation, useSDK as useAmitySDK, useUser as useAmityUser };