@fabriktor/fx 0.0.45 → 0.0.46

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.
@@ -1,5 +1,5 @@
1
- import type { ChatOperator, WSCloseHandler, WSConnection, WSErrorHandler, WSMessageHandler } from "@fabriktor/client";
2
- import type { Chat, ChatRoom, ChatRoomMember } from "@fabriktor/schema";
1
+ import type { ChatOperator, UsersOperator, WSCloseHandler, WSConnection, WSErrorHandler, WSMessageHandler } from "@fabriktor/client";
2
+ import type { Chat, ChatRoom, ChatRoomMember, User } from "@fabriktor/schema";
3
3
  import { type SearchPage } from "../core/search.js";
4
4
  type ChatInsertOptions = Parameters<ChatOperator["insertOneChat"]>[0];
5
5
  type ChatReplaceOptions = Parameters<ChatOperator["replaceOneChat"]>[0];
@@ -10,6 +10,7 @@ export type MarkChatObjectsUploadedOptions = {
10
10
  export type ReactChatOptions = Parameters<ChatOperator["reactChat"]>[0];
11
11
  export type ChatFXOptions = {
12
12
  chat: ChatOperator;
13
+ users: UsersOperator;
13
14
  };
14
15
  type SearchChatsScope = {
15
16
  chat_room_id: string;
@@ -60,6 +61,13 @@ export type ChatRoomMembersOptions = {
60
61
  export type MyChatRoomMembersOptions = {
61
62
  owner_id: string;
62
63
  };
64
+ export type ChatRoomParticipantsOptions = {
65
+ chat_room_ids: string[];
66
+ };
67
+ export type ChatRoomParticipants = {
68
+ members: ChatRoomMember[];
69
+ users: User[];
70
+ };
63
71
  export type OpenChatRoomOptions = {
64
72
  owner_id: string;
65
73
  chat_room_id: string;
@@ -102,12 +110,14 @@ export interface ChatFXOperator {
102
110
  searchChatRoomMembers(opts: SearchChatRoomMembersOptions): Promise<SearchChatRoomMembersPage>;
103
111
  chatRoomMembers(opts: ChatRoomMembersOptions): Promise<ChatRoomMember[]>;
104
112
  myChatRoomMembers(opts: MyChatRoomMembersOptions): Promise<ChatRoomMember[]>;
113
+ chatRoomParticipants(opts: ChatRoomParticipantsOptions): Promise<ChatRoomParticipants>;
105
114
  openChatRoom(opts: OpenChatRoomOptions): Promise<ChatRoomSession>;
106
115
  openGlobalChatRooms(opts: OpenGlobalChatRoomsOptions): Promise<GlobalChatRoomsSession>;
107
116
  reactUploadedChat(opts: ReactUploadedChatOptions): Promise<void>;
108
117
  }
109
118
  export declare class ChatFX implements ChatFXOperator {
110
119
  private chat;
120
+ private users;
111
121
  constructor(opts: ChatFXOptions);
112
122
  createChat(opts: CreateChatOptions): Promise<Chat>;
113
123
  markChatObjectsUploaded(opts: MarkChatObjectsUploadedOptions): Promise<Chat>;
@@ -118,6 +128,7 @@ export declare class ChatFX implements ChatFXOperator {
118
128
  searchChatRoomMembers(opts: SearchChatRoomMembersOptions): Promise<SearchChatRoomMembersPage>;
119
129
  chatRoomMembers(opts: ChatRoomMembersOptions): Promise<ChatRoomMember[]>;
120
130
  myChatRoomMembers(opts: MyChatRoomMembersOptions): Promise<ChatRoomMember[]>;
131
+ chatRoomParticipants(opts: ChatRoomParticipantsOptions): Promise<ChatRoomParticipants>;
121
132
  openChatRoom(opts: OpenChatRoomOptions): Promise<ChatRoomSession>;
122
133
  openGlobalChatRooms(opts: OpenGlobalChatRoomsOptions): Promise<GlobalChatRoomsSession>;
123
134
  reactUploadedChat(opts: ReactUploadedChatOptions): Promise<void>;
@@ -16,8 +16,10 @@ const msgSearchQueryRequired = "Search query is required.";
16
16
  const msgChatObjectsUploading = "Cannot react to a chat while objects are still uploading.";
17
17
  export class ChatFX {
18
18
  chat;
19
+ users;
19
20
  constructor(opts) {
20
21
  this.chat = opts.chat;
22
+ this.users = opts.users;
21
23
  }
22
24
  async createChat(opts) {
23
25
  const out = await this.chat.insertOneChat(opts);
@@ -111,6 +113,29 @@ export class ChatFX {
111
113
  });
112
114
  return out.value ?? [];
113
115
  }
116
+ async chatRoomParticipants(opts) {
117
+ const chat_room_ids = normalizeIDs(opts.chat_room_ids);
118
+ if (chat_room_ids.length === 0) {
119
+ return { members: [], users: [] };
120
+ }
121
+ const memberGroups = await Promise.all(chat_room_ids.map((chat_room_id) => this.chatRoomMembers({
122
+ chat_room_id,
123
+ })));
124
+ const members = uniqueChatRoomMembers(memberGroups.flat());
125
+ const owner_ids = normalizeIDs(members.map((member) => member.owner_id));
126
+ if (owner_ids.length === 0) {
127
+ return { members, users: [] };
128
+ }
129
+ const out = await this.users.queryUsers({
130
+ query: {
131
+ id: owner_ids,
132
+ },
133
+ });
134
+ return {
135
+ members,
136
+ users: out.value ?? [],
137
+ };
138
+ }
114
139
  async openChatRoom(opts) {
115
140
  const latest = await this.latestChats({
116
141
  chat_room_id: opts.chat_room_id,
@@ -389,6 +414,12 @@ export class ChatFX {
389
414
  export function newChatFX(opts) {
390
415
  return new ChatFX(opts);
391
416
  }
417
+ function normalizeIDs(ids) {
418
+ return [...new Set(ids.map((id) => id.trim()).filter((id) => id !== ""))];
419
+ }
420
+ function uniqueChatRoomMembers(members) {
421
+ return [...new Map(members.map((member) => [member.id, member])).values()];
422
+ }
392
423
  function latestChatsPage(opts) {
393
424
  return {
394
425
  chats: opts.raw.results,
package/dist/src/fx.js CHANGED
@@ -53,6 +53,7 @@ export class FX {
53
53
  });
54
54
  this.chat = newChatFX({
55
55
  chat: opts.chat,
56
+ users: opts.users,
56
57
  });
57
58
  this.contacts = newContactsFX({
58
59
  contacts: opts.contacts,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fabriktor/fx",
3
- "version": "0.0.45",
3
+ "version": "0.0.46",
4
4
  "description": "![Fabriktor Logo](./img/fabriktor-character.gif)",
5
5
  "type": "module",
6
6
  "exports": {