@linktr.ee/messaging-react 1.6.0 → 1.6.1
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/.tsbuildinfo +1 -0
- package/dist/assets/index.css +1 -1
- package/dist/components/ActionButton/ActionButton.test.d.ts +2 -0
- package/dist/components/ActionButton/ActionButton.test.d.ts.map +1 -0
- package/dist/components/ActionButton/index.d.ts +7 -0
- package/dist/components/ActionButton/index.d.ts.map +1 -0
- package/dist/components/Avatar/avatarColors.d.ts +8 -0
- package/dist/components/Avatar/avatarColors.d.ts.map +1 -0
- package/dist/components/Avatar/index.d.ts +13 -0
- package/dist/components/Avatar/index.d.ts.map +1 -0
- package/dist/components/ChannelList/CustomChannelPreview.d.ts +13 -0
- package/dist/components/ChannelList/CustomChannelPreview.d.ts.map +1 -0
- package/dist/components/ChannelList/index.d.ts +7 -0
- package/dist/components/ChannelList/index.d.ts.map +1 -0
- package/dist/components/ChannelView.d.ts +7 -0
- package/dist/components/ChannelView.d.ts.map +1 -0
- package/dist/components/CloseButton/index.d.ts +6 -0
- package/dist/components/CloseButton/index.d.ts.map +1 -0
- package/dist/components/FaqList/FaqListItem.d.ts +9 -0
- package/dist/components/FaqList/FaqListItem.d.ts.map +1 -0
- package/dist/components/FaqList/index.d.ts +19 -0
- package/dist/components/FaqList/index.d.ts.map +1 -0
- package/dist/components/IconButton/index.d.ts +9 -0
- package/dist/components/IconButton/index.d.ts.map +1 -0
- package/dist/components/Loading/index.d.ts +7 -0
- package/dist/components/Loading/index.d.ts.map +1 -0
- package/dist/components/MessagingShell/EmptyState.d.ts +10 -0
- package/dist/components/MessagingShell/EmptyState.d.ts.map +1 -0
- package/dist/components/MessagingShell/ErrorState.d.ts +9 -0
- package/dist/components/MessagingShell/ErrorState.d.ts.map +1 -0
- package/dist/components/MessagingShell/LoadingState.d.ts +5 -0
- package/dist/components/MessagingShell/LoadingState.d.ts.map +1 -0
- package/dist/components/MessagingShell/index.d.ts +7 -0
- package/dist/components/MessagingShell/index.d.ts.map +1 -0
- package/dist/components/ParticipantPicker/ParticipantItem.d.ts +13 -0
- package/dist/components/ParticipantPicker/ParticipantItem.d.ts.map +1 -0
- package/dist/components/ParticipantPicker/ParticipantPicker.d.ts +7 -0
- package/dist/components/ParticipantPicker/ParticipantPicker.d.ts.map +1 -0
- package/dist/components/ParticipantPicker/index.d.ts +7 -0
- package/dist/components/ParticipantPicker/index.d.ts.map +1 -0
- package/dist/components/SearchInput/SearchInput.test.d.ts +2 -0
- package/dist/components/SearchInput/SearchInput.test.d.ts.map +1 -0
- package/dist/components/SearchInput/index.d.ts +8 -0
- package/dist/components/SearchInput/index.d.ts.map +1 -0
- package/dist/hooks/useMessaging.d.ts +6 -0
- package/dist/hooks/useMessaging.d.ts.map +1 -0
- package/dist/hooks/useParticipants.d.ts +19 -0
- package/dist/hooks/useParticipants.d.ts.map +1 -0
- package/dist/index.d.ts +16 -253
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +418 -418
- package/dist/index.js.map +1 -1
- package/dist/providers/MessagingProvider.d.ts +27 -0
- package/dist/providers/MessagingProvider.d.ts.map +1 -0
- package/dist/stories/mocks.d.ts +29 -0
- package/dist/stories/mocks.d.ts.map +1 -0
- package/dist/test/setup.d.ts +2 -0
- package/dist/test/setup.d.ts.map +1 -0
- package/dist/test/utils.d.ts +12 -0
- package/dist/test/utils.d.ts.map +1 -0
- package/dist/types.d.ts +134 -0
- package/dist/types.d.ts.map +1 -0
- package/package.json +1 -1
- package/src/components/ChannelList/CustomChannelPreview.tsx +6 -6
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { StreamChatService } from '@linktr.ee/messaging-core';
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import type { StreamChat } from 'stream-chat';
|
|
4
|
+
import type { MessagingProviderProps, MessagingCapabilities, MessagingCustomization } from '../types';
|
|
5
|
+
/**
|
|
6
|
+
* Context value for messaging state and service
|
|
7
|
+
*/
|
|
8
|
+
export interface MessagingContextValue {
|
|
9
|
+
service: StreamChatService | null;
|
|
10
|
+
client: StreamChat | null;
|
|
11
|
+
isConnected: boolean;
|
|
12
|
+
isLoading: boolean;
|
|
13
|
+
error: string | null;
|
|
14
|
+
capabilities: MessagingCapabilities;
|
|
15
|
+
customization: MessagingCustomization;
|
|
16
|
+
refreshConnection: () => Promise<void>;
|
|
17
|
+
debug: boolean;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Hook to access messaging context
|
|
21
|
+
*/
|
|
22
|
+
export declare const useMessagingContext: () => MessagingContextValue;
|
|
23
|
+
/**
|
|
24
|
+
* Provider component that wraps messaging-core with React state management
|
|
25
|
+
*/
|
|
26
|
+
export declare const MessagingProvider: React.FC<MessagingProviderProps>;
|
|
27
|
+
//# sourceMappingURL=MessagingProvider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MessagingProvider.d.ts","sourceRoot":"","sources":["../../src/providers/MessagingProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAA;AAC7D,OAAO,KAON,MAAM,OAAO,CAAA;AACd,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAG7C,OAAO,KAAK,EACV,sBAAsB,EACtB,qBAAqB,EACrB,sBAAsB,EACvB,MAAM,UAAU,CAAA;AAEjB;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,iBAAiB,GAAG,IAAI,CAAA;IACjC,MAAM,EAAE,UAAU,GAAG,IAAI,CAAA;IACzB,WAAW,EAAE,OAAO,CAAA;IACpB,SAAS,EAAE,OAAO,CAAA;IAClB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,YAAY,EAAE,qBAAqB,CAAA;IACnC,aAAa,EAAE,sBAAsB,CAAA;IACrC,iBAAiB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IACtC,KAAK,EAAE,OAAO,CAAA;CACf;AAcD;;GAEG;AACH,eAAO,MAAM,mBAAmB,6BAAqC,CAAA;AAErE;;GAEG;AACH,eAAO,MAAM,iBAAiB,EAAE,KAAK,CAAC,EAAE,CAAC,sBAAsB,CAkT9D,CAAA"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export declare const MockChatProvider: React.FC<{
|
|
3
|
+
children: React.ReactNode;
|
|
4
|
+
}>;
|
|
5
|
+
export declare const MockChatProviderWithChannels: React.FC<{
|
|
6
|
+
children: React.ReactNode;
|
|
7
|
+
channelCount?: number;
|
|
8
|
+
}>;
|
|
9
|
+
export declare const mockParticipants: {
|
|
10
|
+
id: string;
|
|
11
|
+
name: string;
|
|
12
|
+
email: string;
|
|
13
|
+
image: string;
|
|
14
|
+
}[];
|
|
15
|
+
export declare const mockParticipantSource: {
|
|
16
|
+
loadParticipants: (options?: {
|
|
17
|
+
search?: string;
|
|
18
|
+
limit?: number;
|
|
19
|
+
}) => Promise<{
|
|
20
|
+
participants: {
|
|
21
|
+
id: string;
|
|
22
|
+
name: string;
|
|
23
|
+
email: string;
|
|
24
|
+
image: string;
|
|
25
|
+
}[];
|
|
26
|
+
hasMore: boolean;
|
|
27
|
+
}>;
|
|
28
|
+
};
|
|
29
|
+
//# sourceMappingURL=mocks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mocks.d.ts","sourceRoot":"","sources":["../../src/stories/mocks.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AA+BzB,eAAO,MAAM,gBAAgB,EAAE,KAAK,CAAC,EAAE,CAAC;IAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAAE,CAYpE,CAAA;AAGD,eAAO,MAAM,4BAA4B,EAAE,KAAK,CAAC,EAAE,CAAC;IAClD,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;IACzB,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB,CAwDA,CAAA;AAGD,eAAO,MAAM,gBAAgB;;;;;GA+B5B,CAAA;AAGD,eAAO,MAAM,qBAAqB;iCACG;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE;;;;;;;;;CAYvE,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/test/setup.ts"],"names":[],"mappings":"AAAA,OAAO,kCAAkC,CAAA"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { RenderOptions, RenderResult } from '@testing-library/react';
|
|
2
|
+
import { ReactElement } from 'react';
|
|
3
|
+
/**
|
|
4
|
+
* Custom render function that wraps components with common providers
|
|
5
|
+
*/
|
|
6
|
+
export declare function renderWithProviders(ui: ReactElement, options?: Omit<RenderOptions, 'wrapper'>): RenderResult;
|
|
7
|
+
/**
|
|
8
|
+
* Re-export everything from React Testing Library
|
|
9
|
+
*/
|
|
10
|
+
export * from '@testing-library/react';
|
|
11
|
+
export { default as userEvent } from '@testing-library/user-event';
|
|
12
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/test/utils.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAU,aAAa,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAA;AAC5E,OAAO,EAAE,YAAY,EAAa,MAAM,OAAO,CAAA;AAE/C;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,EAAE,EAAE,YAAY,EAChB,OAAO,CAAC,EAAE,IAAI,CAAC,aAAa,EAAE,SAAS,CAAC,GACvC,YAAY,CAMd;AAED;;GAEG;AACH,cAAc,wBAAwB,CAAA;AACtC,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,6BAA6B,CAAA"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import type { MessagingUser, StreamChatServiceConfig } from '@linktr.ee/messaging-core';
|
|
2
|
+
import type { Channel } from 'stream-chat';
|
|
3
|
+
/**
|
|
4
|
+
* Generic participant interface for different host environments
|
|
5
|
+
*/
|
|
6
|
+
export interface Participant {
|
|
7
|
+
id: string;
|
|
8
|
+
name: string;
|
|
9
|
+
email?: string;
|
|
10
|
+
image?: string;
|
|
11
|
+
username?: string;
|
|
12
|
+
phone?: string;
|
|
13
|
+
metadata?: Record<string, unknown>;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Source for loading participants (followers, team members, etc.)
|
|
17
|
+
*/
|
|
18
|
+
export interface ParticipantSource {
|
|
19
|
+
loadParticipants: (options?: {
|
|
20
|
+
search?: string;
|
|
21
|
+
limit?: number;
|
|
22
|
+
cursor?: string;
|
|
23
|
+
}) => Promise<{
|
|
24
|
+
participants: Participant[];
|
|
25
|
+
hasMore: boolean;
|
|
26
|
+
nextCursor?: string;
|
|
27
|
+
}>;
|
|
28
|
+
totalCount?: number;
|
|
29
|
+
loading?: boolean;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Messaging capabilities configuration
|
|
33
|
+
*/
|
|
34
|
+
export interface MessagingCapabilities {
|
|
35
|
+
showStartConversation?: boolean;
|
|
36
|
+
participantSource?: ParticipantSource;
|
|
37
|
+
participantLabel?: string;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Customization options
|
|
41
|
+
*/
|
|
42
|
+
export interface MessagingCustomization {
|
|
43
|
+
theme?: 'light' | 'dark' | 'auto';
|
|
44
|
+
accentColor?: string;
|
|
45
|
+
showParticipantStatus?: boolean;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Main MessagingShell component props
|
|
49
|
+
*/
|
|
50
|
+
export interface MessagingShellProps {
|
|
51
|
+
capabilities?: MessagingCapabilities;
|
|
52
|
+
customization?: MessagingCustomization;
|
|
53
|
+
className?: string;
|
|
54
|
+
renderMessageInputActions?: (channel: Channel) => React.ReactNode;
|
|
55
|
+
onChannelSelect?: (channel: Channel) => void;
|
|
56
|
+
onParticipantSelect?: (participant: Participant) => void;
|
|
57
|
+
/**
|
|
58
|
+
* Auto-select a conversation with this participant on mount.
|
|
59
|
+
* Useful for deep-linking to a specific conversation (e.g., /messages/[accountUuid])
|
|
60
|
+
*
|
|
61
|
+
* If a channel with this participant exists, it will be auto-selected.
|
|
62
|
+
* If no channel exists, you can provide initialParticipantData to automatically
|
|
63
|
+
* create the channel using the existing ChannelCreator.
|
|
64
|
+
*/
|
|
65
|
+
initialParticipantFilter?: string;
|
|
66
|
+
/**
|
|
67
|
+
* Participant data for auto-creating a channel when initialParticipantFilter
|
|
68
|
+
* is provided but no channel exists. If this is provided, MessagingShell will
|
|
69
|
+
* automatically call service.startChannelWithParticipant() to create the channel.
|
|
70
|
+
*
|
|
71
|
+
* This reuses the existing ChannelCreator from StreamChatServiceConfig.
|
|
72
|
+
*/
|
|
73
|
+
initialParticipantData?: Participant;
|
|
74
|
+
/**
|
|
75
|
+
* Custom empty state component to render when a channel has no messages.
|
|
76
|
+
* Useful for showing FAQs or other contextual information in empty channels.
|
|
77
|
+
*/
|
|
78
|
+
CustomChannelEmptyState?: React.ComponentType;
|
|
79
|
+
/**
|
|
80
|
+
* Controls whether the channel list is shown. When false, the channel list
|
|
81
|
+
* is immediately hidden. Useful for direct conversation mode where you want
|
|
82
|
+
* to show only the channel view without the list.
|
|
83
|
+
*/
|
|
84
|
+
showChannelList?: boolean;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* ChannelList component props
|
|
88
|
+
*/
|
|
89
|
+
export interface ChannelListProps {
|
|
90
|
+
onChannelSelect: (channel: Channel) => void;
|
|
91
|
+
selectedChannel?: Channel;
|
|
92
|
+
showStartConversation?: boolean;
|
|
93
|
+
onStartConversation?: () => void;
|
|
94
|
+
participantLabel?: string;
|
|
95
|
+
className?: string;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* ChannelView component props
|
|
99
|
+
*/
|
|
100
|
+
export interface ChannelViewProps {
|
|
101
|
+
channel: Channel;
|
|
102
|
+
onBack?: () => void;
|
|
103
|
+
showBackButton?: boolean;
|
|
104
|
+
renderMessageInputActions?: (channel: Channel) => React.ReactNode;
|
|
105
|
+
onLeaveConversation?: (channel: Channel) => void;
|
|
106
|
+
onBlockParticipant?: (participantId?: string) => void;
|
|
107
|
+
className?: string;
|
|
108
|
+
CustomChannelEmptyState?: React.ComponentType;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* ParticipantPicker component props
|
|
112
|
+
*/
|
|
113
|
+
export interface ParticipantPickerProps {
|
|
114
|
+
participantSource: ParticipantSource;
|
|
115
|
+
onSelectParticipant: (participant: Participant) => void;
|
|
116
|
+
onClose: () => void;
|
|
117
|
+
existingParticipantIds?: Set<string>;
|
|
118
|
+
participantLabel?: string;
|
|
119
|
+
searchPlaceholder?: string;
|
|
120
|
+
className?: string;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* MessagingProvider component props
|
|
124
|
+
*/
|
|
125
|
+
export interface MessagingProviderProps {
|
|
126
|
+
children: React.ReactNode;
|
|
127
|
+
user: MessagingUser | null;
|
|
128
|
+
serviceConfig: Omit<StreamChatServiceConfig, 'apiKey'>;
|
|
129
|
+
apiKey: string;
|
|
130
|
+
capabilities?: MessagingCapabilities;
|
|
131
|
+
customization?: MessagingCustomization;
|
|
132
|
+
debug?: boolean;
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -14,7 +14,7 @@ const CustomChannelPreview: React.FC<
|
|
|
14
14
|
onChannelSelect: (channel: Channel) => void
|
|
15
15
|
debug?: boolean
|
|
16
16
|
}
|
|
17
|
-
> = ({ channel, selectedChannel, onChannelSelect, debug = false }) => {
|
|
17
|
+
> = ({ channel, selectedChannel, onChannelSelect, debug = false, unread }) => {
|
|
18
18
|
const isSelected = selectedChannel?.id === channel?.id
|
|
19
19
|
|
|
20
20
|
const handleClick = () => {
|
|
@@ -42,15 +42,15 @@ const CustomChannelPreview: React.FC<
|
|
|
42
42
|
})
|
|
43
43
|
: ''
|
|
44
44
|
|
|
45
|
-
//
|
|
46
|
-
const
|
|
45
|
+
// Use the unread prop passed by Stream Chat (reactive and updates automatically)
|
|
46
|
+
const unreadCount = unread ?? 0
|
|
47
47
|
|
|
48
48
|
if (debug) {
|
|
49
49
|
console.log('📺 [ChannelList] 📋 CHANNEL PREVIEW RENDER', {
|
|
50
50
|
channelId: channel?.id,
|
|
51
51
|
isSelected,
|
|
52
52
|
participantName,
|
|
53
|
-
|
|
53
|
+
unreadCount,
|
|
54
54
|
hasTimestamp: !!lastMessageTime,
|
|
55
55
|
})
|
|
56
56
|
}
|
|
@@ -100,9 +100,9 @@ const CustomChannelPreview: React.FC<
|
|
|
100
100
|
<p className="text-xs text-stone mr-2 flex-1 line-clamp-2">
|
|
101
101
|
{lastMessageText}
|
|
102
102
|
</p>
|
|
103
|
-
{
|
|
103
|
+
{unreadCount > 0 && (
|
|
104
104
|
<span className="bg-primary text-white text-xs px-2 py-0.5 rounded-full min-w-[20px] text-center flex-shrink-0">
|
|
105
|
-
{
|
|
105
|
+
{unreadCount > 99 ? '99+' : unreadCount}
|
|
106
106
|
</span>
|
|
107
107
|
)}
|
|
108
108
|
</div>
|