@sidebandchat/client 0.0.0-stage → 0.2.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/COPYRIGHT +8 -0
- package/LICENSE +674 -0
- package/README.md +121 -2
- package/dist/activity/activity-sharing-controller.d.ts +131 -0
- package/dist/activity/activity-sharing-controller.d.ts.map +1 -0
- package/dist/activity/activity-sharing-controller.js +351 -0
- package/dist/activity/activity-sharing-controller.js.map +1 -0
- package/dist/activity/index.d.ts +2 -0
- package/dist/activity/index.d.ts.map +1 -0
- package/dist/activity/index.js +2 -0
- package/dist/activity/index.js.map +1 -0
- package/dist/attachments/attachment-client.d.ts +36 -0
- package/dist/attachments/attachment-client.d.ts.map +1 -0
- package/dist/attachments/attachment-client.js +98 -0
- package/dist/attachments/attachment-client.js.map +1 -0
- package/dist/attachments/draft-attachment.d.ts +17 -0
- package/dist/attachments/draft-attachment.d.ts.map +1 -0
- package/dist/attachments/draft-attachment.js +2 -0
- package/dist/attachments/draft-attachment.js.map +1 -0
- package/dist/auth/identity-client.d.ts +64 -0
- package/dist/auth/identity-client.d.ts.map +1 -0
- package/dist/auth/identity-client.js +65 -0
- package/dist/auth/identity-client.js.map +1 -0
- package/dist/auth/index.d.ts +2 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +2 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/badges/badge-verifier.d.ts +11 -0
- package/dist/badges/badge-verifier.d.ts.map +1 -0
- package/dist/badges/badge-verifier.js +128 -0
- package/dist/badges/badge-verifier.js.map +1 -0
- package/dist/calls/calls-client.d.ts +16 -0
- package/dist/calls/calls-client.d.ts.map +1 -0
- package/dist/calls/calls-client.js +55 -0
- package/dist/calls/calls-client.js.map +1 -0
- package/dist/calls/index.d.ts +3 -0
- package/dist/calls/index.d.ts.map +1 -0
- package/dist/calls/index.js +2 -0
- package/dist/calls/index.js.map +1 -0
- package/dist/calls/media-controls.d.ts +38 -0
- package/dist/calls/media-controls.d.ts.map +1 -0
- package/dist/calls/media-controls.js +134 -0
- package/dist/calls/media-controls.js.map +1 -0
- package/dist/calls/media-presentation-controller.d.ts +39 -0
- package/dist/calls/media-presentation-controller.d.ts.map +1 -0
- package/dist/calls/media-presentation-controller.js +106 -0
- package/dist/calls/media-presentation-controller.js.map +1 -0
- package/dist/calls/media-types.d.ts +37 -0
- package/dist/calls/media-types.d.ts.map +1 -0
- package/dist/calls/media-types.js +2 -0
- package/dist/calls/media-types.js.map +1 -0
- package/dist/calls/media.d.ts +39 -0
- package/dist/calls/media.d.ts.map +1 -0
- package/dist/calls/media.js +501 -0
- package/dist/calls/media.js.map +1 -0
- package/dist/client/ephemeral-state.d.ts +52 -0
- package/dist/client/ephemeral-state.d.ts.map +1 -0
- package/dist/client/ephemeral-state.js +371 -0
- package/dist/client/ephemeral-state.js.map +1 -0
- package/dist/client/index.d.ts +7 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +4 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/live-event-controller.d.ts +14 -0
- package/dist/client/live-event-controller.d.ts.map +1 -0
- package/dist/client/live-event-controller.js +28 -0
- package/dist/client/live-event-controller.js.map +1 -0
- package/dist/client/platform-adapters.d.ts +122 -0
- package/dist/client/platform-adapters.d.ts.map +1 -0
- package/dist/client/platform-adapters.js +2 -0
- package/dist/client/platform-adapters.js.map +1 -0
- package/dist/client/session-runtime.d.ts +115 -0
- package/dist/client/session-runtime.d.ts.map +1 -0
- package/dist/client/session-runtime.js +607 -0
- package/dist/client/session-runtime.js.map +1 -0
- package/dist/client/sideband-client.d.ts +141 -0
- package/dist/client/sideband-client.d.ts.map +1 -0
- package/dist/client/sideband-client.js +575 -0
- package/dist/client/sideband-client.js.map +1 -0
- package/dist/client/snapshot-client.d.ts +9 -0
- package/dist/client/snapshot-client.d.ts.map +1 -0
- package/dist/client/snapshot-client.js +18 -0
- package/dist/client/snapshot-client.js.map +1 -0
- package/dist/client/state.d.ts +112 -0
- package/dist/client/state.d.ts.map +1 -0
- package/dist/client/state.js +992 -0
- package/dist/client/state.js.map +1 -0
- package/dist/communities/community-client.d.ts +40 -0
- package/dist/communities/community-client.d.ts.map +1 -0
- package/dist/communities/community-client.js +166 -0
- package/dist/communities/community-client.js.map +1 -0
- package/dist/conversations/index.d.ts +2 -0
- package/dist/conversations/index.d.ts.map +1 -0
- package/dist/conversations/index.js +2 -0
- package/dist/conversations/index.js.map +1 -0
- package/dist/conversations/mentions.d.ts +18 -0
- package/dist/conversations/mentions.d.ts.map +1 -0
- package/dist/conversations/mentions.js +108 -0
- package/dist/conversations/mentions.js.map +1 -0
- package/dist/conversations/messaging-client.d.ts +56 -0
- package/dist/conversations/messaging-client.d.ts.map +1 -0
- package/dist/conversations/messaging-client.js +333 -0
- package/dist/conversations/messaging-client.js.map +1 -0
- package/dist/conversations/replies-controller.d.ts +50 -0
- package/dist/conversations/replies-controller.d.ts.map +1 -0
- package/dist/conversations/replies-controller.js +206 -0
- package/dist/conversations/replies-controller.js.map +1 -0
- package/dist/devices/device-client.d.ts +11 -0
- package/dist/devices/device-client.d.ts.map +1 -0
- package/dist/devices/device-client.js +27 -0
- package/dist/devices/device-client.js.map +1 -0
- package/dist/domain.d.ts +528 -0
- package/dist/domain.d.ts.map +1 -0
- package/dist/domain.js +13 -0
- package/dist/domain.js.map +1 -0
- package/dist/entity-id.d.ts +32 -0
- package/dist/entity-id.d.ts.map +1 -0
- package/dist/entity-id.js +17 -0
- package/dist/entity-id.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/instance/index.d.ts +5 -0
- package/dist/instance/index.d.ts.map +1 -0
- package/dist/instance/index.js +3 -0
- package/dist/instance/index.js.map +1 -0
- package/dist/instance/instance-policy.d.ts +13 -0
- package/dist/instance/instance-policy.d.ts.map +1 -0
- package/dist/instance/instance-policy.js +2 -0
- package/dist/instance/instance-policy.js.map +1 -0
- package/dist/instance-access.d.ts +66 -0
- package/dist/instance-access.d.ts.map +1 -0
- package/dist/instance-access.js +84 -0
- package/dist/instance-access.js.map +1 -0
- package/dist/instance-capabilities.d.ts +12 -0
- package/dist/instance-capabilities.d.ts.map +1 -0
- package/dist/instance-capabilities.js +2 -0
- package/dist/instance-capabilities.js.map +1 -0
- package/dist/instance-endpoint.d.ts +32 -0
- package/dist/instance-endpoint.d.ts.map +1 -0
- package/dist/instance-endpoint.js +147 -0
- package/dist/instance-endpoint.js.map +1 -0
- package/dist/model/index.d.ts +3 -0
- package/dist/model/index.d.ts.map +1 -0
- package/dist/model/index.js +3 -0
- package/dist/model/index.js.map +1 -0
- package/dist/model/selectors.d.ts +22 -0
- package/dist/model/selectors.d.ts.map +1 -0
- package/dist/model/selectors.js +73 -0
- package/dist/model/selectors.js.map +1 -0
- package/dist/private-conversation/file-hash.d.ts +2 -0
- package/dist/private-conversation/file-hash.d.ts.map +1 -0
- package/dist/private-conversation/file-hash.js +13 -0
- package/dist/private-conversation/file-hash.js.map +1 -0
- package/dist/private-conversation/private-conversation-crypto.d.ts +48 -0
- package/dist/private-conversation/private-conversation-crypto.d.ts.map +1 -0
- package/dist/private-conversation/private-conversation-crypto.js +169 -0
- package/dist/private-conversation/private-conversation-crypto.js.map +1 -0
- package/dist/private-conversation/private-conversations-client.d.ts +23 -0
- package/dist/private-conversation/private-conversations-client.d.ts.map +1 -0
- package/dist/private-conversation/private-conversations-client.js +77 -0
- package/dist/private-conversation/private-conversations-client.js.map +1 -0
- package/dist/private-conversation/private-transfer-limits.d.ts +9 -0
- package/dist/private-conversation/private-transfer-limits.d.ts.map +1 -0
- package/dist/private-conversation/private-transfer-limits.js +9 -0
- package/dist/private-conversation/private-transfer-limits.js.map +1 -0
- package/dist/private-conversation/private-transfer-protocol.d.ts +53 -0
- package/dist/private-conversation/private-transfer-protocol.d.ts.map +1 -0
- package/dist/private-conversation/private-transfer-protocol.js +184 -0
- package/dist/private-conversation/private-transfer-protocol.js.map +1 -0
- package/dist/private-conversation/private-transfer-transport.d.ts +22 -0
- package/dist/private-conversation/private-transfer-transport.d.ts.map +1 -0
- package/dist/private-conversation/private-transfer-transport.js +94 -0
- package/dist/private-conversation/private-transfer-transport.js.map +1 -0
- package/dist/realtime/realtime-client.d.ts +31 -0
- package/dist/realtime/realtime-client.d.ts.map +1 -0
- package/dist/realtime/realtime-client.js +103 -0
- package/dist/realtime/realtime-client.js.map +1 -0
- package/dist/sbp/codec.d.ts +33 -0
- package/dist/sbp/codec.d.ts.map +1 -0
- package/dist/sbp/codec.js +93 -0
- package/dist/sbp/codec.js.map +1 -0
- package/dist/sbp/command-transport.d.ts +9 -0
- package/dist/sbp/command-transport.d.ts.map +1 -0
- package/dist/sbp/command-transport.js +2 -0
- package/dist/sbp/command-transport.js.map +1 -0
- package/dist/sbp/frame.d.ts +34 -0
- package/dist/sbp/frame.d.ts.map +1 -0
- package/dist/sbp/frame.js +95 -0
- package/dist/sbp/frame.js.map +1 -0
- package/dist/sbp/records.d.ts +32 -0
- package/dist/sbp/records.d.ts.map +1 -0
- package/dist/sbp/records.js +527 -0
- package/dist/sbp/records.js.map +1 -0
- package/dist/sbp/session.d.ts +110 -0
- package/dist/sbp/session.d.ts.map +1 -0
- package/dist/sbp/session.js +349 -0
- package/dist/sbp/session.js.map +1 -0
- package/dist/sbp/value.d.ts +13 -0
- package/dist/sbp/value.d.ts.map +1 -0
- package/dist/sbp/value.js +58 -0
- package/dist/sbp/value.js.map +1 -0
- package/dist/social/social-client.d.ts +38 -0
- package/dist/social/social-client.d.ts.map +1 -0
- package/dist/social/social-client.js +110 -0
- package/dist/social/social-client.js.map +1 -0
- package/dist/transports/media-server-identity.d.ts +8 -0
- package/dist/transports/media-server-identity.d.ts.map +1 -0
- package/dist/transports/media-server-identity.js +22 -0
- package/dist/transports/media-server-identity.js.map +1 -0
- package/dist/workspace/index.d.ts +2 -0
- package/dist/workspace/index.d.ts.map +1 -0
- package/dist/workspace/index.js +2 -0
- package/dist/workspace/index.js.map +1 -0
- package/dist/workspace/workspace-controller.d.ts +39 -0
- package/dist/workspace/workspace-controller.d.ts.map +1 -0
- package/dist/workspace/workspace-controller.js +188 -0
- package/dist/workspace/workspace-controller.js.map +1 -0
- package/dist/workspace/workspace-selectors.d.ts +49 -0
- package/dist/workspace/workspace-selectors.d.ts.map +1 -0
- package/dist/workspace/workspace-selectors.js +110 -0
- package/dist/workspace/workspace-selectors.js.map +1 -0
- package/package.json +88 -4
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { decodeEntityRef, entityRef, wireMap } from "../sbp/codec.js";
|
|
2
|
+
import { decodeBlock, decodeFriendship, decodeInboxEntry, decodeNotificationSettings, decodeUserProfile, decodeUserSummary, } from "../sbp/records.js";
|
|
3
|
+
import { arrayValue, booleanValue, mapValue, orderedValue, required, } from "../sbp/value.js";
|
|
4
|
+
export class SbpSocialClient {
|
|
5
|
+
transport;
|
|
6
|
+
verifyProfile;
|
|
7
|
+
onOwnProfile;
|
|
8
|
+
constructor(transport, verifyProfile = async (profile) => profile, onOwnProfile = () => undefined) {
|
|
9
|
+
this.transport = transport;
|
|
10
|
+
this.verifyProfile = verifyProfile;
|
|
11
|
+
this.onOwnProfile = onOwnProfile;
|
|
12
|
+
}
|
|
13
|
+
async profile(userId) {
|
|
14
|
+
return this.verifyProfile(decodeUserProfile(await this.transport.command(20, wireMap([[0, entityRef("user", userId)]]))));
|
|
15
|
+
}
|
|
16
|
+
async updateProfile(input) {
|
|
17
|
+
const avatar = input.avatarId === null
|
|
18
|
+
? null
|
|
19
|
+
: input.avatarId
|
|
20
|
+
? entityRef("attachment", input.avatarId)
|
|
21
|
+
: undefined;
|
|
22
|
+
const profile = await this.verifyProfile(decodeUserProfile(await this.transport.command(21, wireMap([
|
|
23
|
+
...optionalEntry(0, input.displayName),
|
|
24
|
+
...optionalEntry(1, input.bio),
|
|
25
|
+
...optionalEntry(2, avatar),
|
|
26
|
+
[3, input.revision],
|
|
27
|
+
]))));
|
|
28
|
+
this.onOwnProfile(profile);
|
|
29
|
+
return profile;
|
|
30
|
+
}
|
|
31
|
+
async resolveHandle(handle) {
|
|
32
|
+
return decodeUserSummary(await this.transport.command(22, wireMap([[0, handle]])));
|
|
33
|
+
}
|
|
34
|
+
async summaries(userIds) {
|
|
35
|
+
if (!userIds.length)
|
|
36
|
+
return [];
|
|
37
|
+
const response = mapValue(await this.transport.command(23, wireMap([[0, userIds.map((id) => entityRef("user", id))]])));
|
|
38
|
+
return arrayValue(required(response, 0)).map(decodeUserSummary);
|
|
39
|
+
}
|
|
40
|
+
async requestFriend(userId) {
|
|
41
|
+
return decodeFriendship(await this.transport.command(24, wireMap([[0, entityRef("user", userId)]])));
|
|
42
|
+
}
|
|
43
|
+
acceptFriend(friendshipId, revision) {
|
|
44
|
+
return this.friendshipMutation(25, friendshipId, revision);
|
|
45
|
+
}
|
|
46
|
+
declineFriend(friendshipId, revision) {
|
|
47
|
+
return this.friendshipMutation(26, friendshipId, revision);
|
|
48
|
+
}
|
|
49
|
+
cancelFriend(friendshipId, revision) {
|
|
50
|
+
return this.friendshipMutation(27, friendshipId, revision);
|
|
51
|
+
}
|
|
52
|
+
removeFriend(friendshipId, revision) {
|
|
53
|
+
return this.friendshipMutation(28, friendshipId, revision);
|
|
54
|
+
}
|
|
55
|
+
async inbox(options = {}) {
|
|
56
|
+
const response = mapValue(await this.transport.command(30, wireMap([
|
|
57
|
+
...optionalEntry(0, options.kind === undefined
|
|
58
|
+
? undefined
|
|
59
|
+
: options.kind === "unread"
|
|
60
|
+
? 0
|
|
61
|
+
: 1),
|
|
62
|
+
...optionalEntry(1, options.limit),
|
|
63
|
+
])));
|
|
64
|
+
return arrayValue(required(response, 0)).map(decodeInboxEntry);
|
|
65
|
+
}
|
|
66
|
+
async markInboxRead(notificationId) {
|
|
67
|
+
const response = mapValue(await this.transport.command(31, wireMap([[0, notificationId]])));
|
|
68
|
+
return {
|
|
69
|
+
id: orderedValue(required(response, 0)),
|
|
70
|
+
read: booleanValue(required(response, 1)),
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
async block(userId) {
|
|
74
|
+
return decodeBlock(await this.transport.command(32, wireMap([[0, entityRef("user", userId)]])));
|
|
75
|
+
}
|
|
76
|
+
async unblock(blockId, revision) {
|
|
77
|
+
const response = mapValue(await this.transport.command(33, wireMap([
|
|
78
|
+
[0, entityRef("block", blockId)],
|
|
79
|
+
[1, revision],
|
|
80
|
+
])));
|
|
81
|
+
return decodeEntityRef(required(response, 0), "block");
|
|
82
|
+
}
|
|
83
|
+
async setNotificationSettings(settings) {
|
|
84
|
+
return decodeNotificationSettings(await this.transport.command(34, wireMap([[0, encodeNotificationSettings(settings)]])));
|
|
85
|
+
}
|
|
86
|
+
async friendshipMutation(opcode, friendshipId, revision) {
|
|
87
|
+
return decodeFriendship(await this.transport.command(opcode, wireMap([
|
|
88
|
+
[0, entityRef("friendship", friendshipId)],
|
|
89
|
+
[1, revision],
|
|
90
|
+
])));
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
function encodeNotificationSettings(settings) {
|
|
94
|
+
const scope = settings.scope.kind === "account"
|
|
95
|
+
? [0]
|
|
96
|
+
: settings.scope.kind === "conversation"
|
|
97
|
+
? [1, entityRef("conversation", settings.scope.conversationId)]
|
|
98
|
+
: [2, entityRef("community", settings.scope.communityId)];
|
|
99
|
+
const level = { all: 0, mentions: 1, none: 2 }[settings.level];
|
|
100
|
+
return wireMap([
|
|
101
|
+
[0, scope],
|
|
102
|
+
[1, level],
|
|
103
|
+
[2, settings.suppressMassMentions],
|
|
104
|
+
[3, settings.revision],
|
|
105
|
+
]);
|
|
106
|
+
}
|
|
107
|
+
function optionalEntry(key, value) {
|
|
108
|
+
return value === undefined ? [] : [[key, value]];
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=social-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"social-client.js","sourceRoot":"","sources":["../../src/social/social-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type UserId } from "../entity-id.js";
|
|
2
|
+
export type MediaServerIdentity = {
|
|
3
|
+
endpointId: string;
|
|
4
|
+
userId: UserId;
|
|
5
|
+
};
|
|
6
|
+
/** Translate authenticated media-server metadata at the wire boundary. */
|
|
7
|
+
export declare function parseMediaServerIdentity(value: unknown): MediaServerIdentity | undefined;
|
|
8
|
+
//# sourceMappingURL=media-server-identity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media-server-identity.d.ts","sourceRoot":"","sources":["../../src/transports/media-server-identity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAExD,MAAM,MAAM,mBAAmB,GAAG;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,0EAA0E;AAC1E,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,OAAO,GACb,mBAAmB,GAAG,SAAS,CAkBjC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { entityId } from "../entity-id.js";
|
|
2
|
+
/** Translate authenticated media-server metadata at the wire boundary. */
|
|
3
|
+
export function parseMediaServerIdentity(value) {
|
|
4
|
+
if (!value || typeof value !== "object")
|
|
5
|
+
return undefined;
|
|
6
|
+
const record = value;
|
|
7
|
+
if (typeof record.endpointId !== "string")
|
|
8
|
+
return undefined;
|
|
9
|
+
if (typeof record.userId === "string") {
|
|
10
|
+
try {
|
|
11
|
+
return {
|
|
12
|
+
endpointId: record.endpointId,
|
|
13
|
+
userId: entityId(record.userId),
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
return undefined;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
return undefined;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=media-server-identity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media-server-identity.js","sourceRoot":"","sources":["../../src/transports/media-server-identity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAe,MAAM,iBAAiB,CAAC;AAOxD,0EAA0E;AAC1E,MAAM,UAAU,wBAAwB,CACtC,KAAc;IAEd,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAC1D,MAAM,MAAM,GAAG,KAGd,CAAC;IACF,IAAI,OAAO,MAAM,CAAC,UAAU,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAC5D,IAAI,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QACtC,IAAI,CAAC;YACH,OAAO;gBACL,UAAU,EAAE,MAAM,CAAC,UAAU;gBAC7B,MAAM,EAAE,QAAQ,CAAS,MAAM,CAAC,MAAM,CAAC;aACxC,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export { userDisplayName, conversationDisplayName, createWorkspaceDirectory, createMentionCandidates, uniqueMentionCandidates, typingDisplayNames, conversationRelationship, communityForChannel, type ConversationDestination, type WorkspaceDirectory, type MentionCandidate, } from "./workspace-selectors.js";
|
|
2
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/workspace/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,uBAAuB,EACvB,wBAAwB,EACxB,uBAAuB,EACvB,uBAAuB,EACvB,kBAAkB,EAClB,wBAAwB,EACxB,mBAAmB,EACnB,KAAK,uBAAuB,EAC5B,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,GACtB,MAAM,0BAA0B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/workspace/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,uBAAuB,EACvB,wBAAwB,EACxB,uBAAuB,EACvB,uBAAuB,EACvB,kBAAkB,EAClB,wBAAwB,EACxB,mBAAmB,GAIpB,MAAM,0BAA0B,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { Community, CommunityChannel, ConversationSummary } from "../domain.js";
|
|
2
|
+
import type { ChannelId, CommunityId, ConversationId } from "../entity-id.js";
|
|
3
|
+
import type { AccountState } from "../client/state.js";
|
|
4
|
+
export type WorkspaceState = {
|
|
5
|
+
view: "friends" | "conversation" | "voice-channel";
|
|
6
|
+
selectedConversationId?: ConversationId;
|
|
7
|
+
selectedCommunityId?: CommunityId;
|
|
8
|
+
selectedChannelId?: ChannelId;
|
|
9
|
+
};
|
|
10
|
+
/** Owns transport-neutral workspace selection using stable native IDs. */
|
|
11
|
+
export declare class WorkspaceController {
|
|
12
|
+
private readonly account;
|
|
13
|
+
private current;
|
|
14
|
+
private directMessagesView;
|
|
15
|
+
private lastDirectConversationId?;
|
|
16
|
+
private selectedChannelByCommunity;
|
|
17
|
+
private listeners;
|
|
18
|
+
constructor(account: () => AccountState | undefined);
|
|
19
|
+
get state(): WorkspaceState;
|
|
20
|
+
get selectedConversation(): ConversationSummary | undefined;
|
|
21
|
+
get selectedCommunity(): Community | undefined;
|
|
22
|
+
get selectedChannel(): CommunityChannel | undefined;
|
|
23
|
+
subscribe: (listener: () => void) => () => boolean;
|
|
24
|
+
openConversation(conversationId: ConversationId): void;
|
|
25
|
+
selectCommunity(communityId: CommunityId): void;
|
|
26
|
+
selectChannel(channelId: ChannelId): void;
|
|
27
|
+
showFriends(): void;
|
|
28
|
+
showDirectMessages(): void;
|
|
29
|
+
reset(): void;
|
|
30
|
+
/** Reconciles selection after snapshots, membership changes, or deletion. */
|
|
31
|
+
reconcile(): void;
|
|
32
|
+
private requireConversation;
|
|
33
|
+
private requireCommunity;
|
|
34
|
+
private findChannel;
|
|
35
|
+
private findChannelByConversation;
|
|
36
|
+
private set;
|
|
37
|
+
private emit;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=workspace-controller.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-controller.d.ts","sourceRoot":"","sources":["../../src/workspace/workspace-controller.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EACT,gBAAgB,EAChB,mBAAmB,EACpB,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAC9E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,EAAE,SAAS,GAAG,cAAc,GAAG,eAAe,CAAC;IACnD,sBAAsB,CAAC,EAAE,cAAc,CAAC;IACxC,mBAAmB,CAAC,EAAE,WAAW,CAAC;IAClC,iBAAiB,CAAC,EAAE,SAAS,CAAC;CAC/B,CAAC;AAEF,0EAA0E;AAC1E,qBAAa,mBAAmB;IAOlB,OAAO,CAAC,QAAQ,CAAC,OAAO;IANpC,OAAO,CAAC,OAAO,CAAuC;IACtD,OAAO,CAAC,kBAAkB,CAAyC;IACnE,OAAO,CAAC,wBAAwB,CAAC,CAAiB;IAClD,OAAO,CAAC,0BAA0B,CAAqC;IACvE,OAAO,CAAC,SAAS,CAAyB;gBAEb,OAAO,EAAE,MAAM,YAAY,GAAG,SAAS;IAEpE,IAAI,KAAK,mBAER;IAED,IAAI,oBAAoB,IAAI,mBAAmB,GAAG,SAAS,CAG1D;IAED,IAAI,iBAAiB,IAAI,SAAS,GAAG,SAAS,CAG7C;IAED,IAAI,eAAe,IAAI,gBAAgB,GAAG,SAAS,CAKlD;IAED,SAAS,GAAI,UAAU,MAAM,IAAI,mBAG/B;IAEF,gBAAgB,CAAC,cAAc,EAAE,cAAc;IA6B/C,eAAe,CAAC,WAAW,EAAE,WAAW;IAqBxC,aAAa,CAAC,SAAS,EAAE,SAAS;IAYlC,WAAW;IAQX,kBAAkB;IAuBlB,KAAK;IAOL,6EAA6E;IAC7E,SAAS;IAmCT,OAAO,CAAC,mBAAmB;IAM3B,OAAO,CAAC,gBAAgB;IAMxB,OAAO,CAAC,WAAW;IAUnB,OAAO,CAAC,yBAAyB;IAUjC,OAAO,CAAC,GAAG;IAKX,OAAO,CAAC,IAAI;CAGb"}
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
/** Owns transport-neutral workspace selection using stable native IDs. */
|
|
2
|
+
export class WorkspaceController {
|
|
3
|
+
account;
|
|
4
|
+
current = { view: "friends" };
|
|
5
|
+
directMessagesView = "friends";
|
|
6
|
+
lastDirectConversationId;
|
|
7
|
+
selectedChannelByCommunity = new Map();
|
|
8
|
+
listeners = new Set();
|
|
9
|
+
constructor(account) {
|
|
10
|
+
this.account = account;
|
|
11
|
+
}
|
|
12
|
+
get state() {
|
|
13
|
+
return this.current;
|
|
14
|
+
}
|
|
15
|
+
get selectedConversation() {
|
|
16
|
+
const id = this.current.selectedConversationId;
|
|
17
|
+
return id ? this.account()?.conversations.get(id) : undefined;
|
|
18
|
+
}
|
|
19
|
+
get selectedCommunity() {
|
|
20
|
+
const id = this.current.selectedCommunityId;
|
|
21
|
+
return id ? this.account()?.communities.get(id) : undefined;
|
|
22
|
+
}
|
|
23
|
+
get selectedChannel() {
|
|
24
|
+
const id = this.current.selectedChannelId;
|
|
25
|
+
return id
|
|
26
|
+
? this.selectedCommunity?.channels.find((channel) => channel.id === id)
|
|
27
|
+
: undefined;
|
|
28
|
+
}
|
|
29
|
+
subscribe = (listener) => {
|
|
30
|
+
this.listeners.add(listener);
|
|
31
|
+
return () => this.listeners.delete(listener);
|
|
32
|
+
};
|
|
33
|
+
openConversation(conversationId) {
|
|
34
|
+
const conversation = this.requireConversation(conversationId);
|
|
35
|
+
const channel = (conversation.channelId
|
|
36
|
+
? this.findChannel(conversation.channelId)
|
|
37
|
+
: undefined) ?? this.findChannelByConversation(conversation.id);
|
|
38
|
+
if (channel) {
|
|
39
|
+
this.selectedChannelByCommunity.set(channel.community.id, channel.channel.id);
|
|
40
|
+
this.set({
|
|
41
|
+
view: channelView(channel.channel),
|
|
42
|
+
selectedConversationId: conversation.id,
|
|
43
|
+
selectedCommunityId: channel.community.id,
|
|
44
|
+
selectedChannelId: channel.channel.id,
|
|
45
|
+
});
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
if (conversation.kind === "community-channel")
|
|
49
|
+
throw new Error("Community channel not found");
|
|
50
|
+
this.directMessagesView = "conversation";
|
|
51
|
+
this.lastDirectConversationId = conversation.id;
|
|
52
|
+
this.set({
|
|
53
|
+
view: "conversation",
|
|
54
|
+
selectedConversationId: conversation.id,
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
selectCommunity(communityId) {
|
|
58
|
+
const community = this.requireCommunity(communityId);
|
|
59
|
+
const channels = [...community.channels].sort((left, right) => left.position - right.position);
|
|
60
|
+
const rememberedChannelId = this.selectedChannelByCommunity.get(community.id);
|
|
61
|
+
const channel = channels.find((candidate) => candidate.id === rememberedChannelId) ??
|
|
62
|
+
channels.find((candidate) => candidate.kind === "text") ??
|
|
63
|
+
channels[0];
|
|
64
|
+
if (channel)
|
|
65
|
+
this.selectedChannelByCommunity.set(community.id, channel.id);
|
|
66
|
+
this.set({
|
|
67
|
+
view: channel ? channelView(channel) : "friends",
|
|
68
|
+
selectedCommunityId: community.id,
|
|
69
|
+
selectedChannelId: channel?.id,
|
|
70
|
+
selectedConversationId: channel?.conversationId,
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
selectChannel(channelId) {
|
|
74
|
+
const found = this.findChannel(channelId);
|
|
75
|
+
if (!found)
|
|
76
|
+
throw new Error("Community channel not found");
|
|
77
|
+
this.selectedChannelByCommunity.set(found.community.id, found.channel.id);
|
|
78
|
+
this.set({
|
|
79
|
+
view: channelView(found.channel),
|
|
80
|
+
selectedCommunityId: found.community.id,
|
|
81
|
+
selectedChannelId: found.channel.id,
|
|
82
|
+
selectedConversationId: found.channel.conversationId,
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
showFriends() {
|
|
86
|
+
this.directMessagesView = "friends";
|
|
87
|
+
this.set({
|
|
88
|
+
view: "friends",
|
|
89
|
+
selectedConversationId: this.lastDirectConversationId,
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
showDirectMessages() {
|
|
93
|
+
if (this.directMessagesView === "friends") {
|
|
94
|
+
this.set({
|
|
95
|
+
view: "friends",
|
|
96
|
+
selectedConversationId: this.lastDirectConversationId,
|
|
97
|
+
});
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
const selected = this.current.selectedConversationId
|
|
101
|
+
? this.account()?.conversations.get(this.current.selectedConversationId)
|
|
102
|
+
: undefined;
|
|
103
|
+
const conversation = selected && selected.kind !== "community-channel"
|
|
104
|
+
? selected
|
|
105
|
+
: this.lastDirectConversationId
|
|
106
|
+
? this.account()?.conversations.get(this.lastDirectConversationId)
|
|
107
|
+
: undefined;
|
|
108
|
+
this.set({
|
|
109
|
+
view: conversation ? "conversation" : "friends",
|
|
110
|
+
selectedConversationId: conversation?.id,
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
reset() {
|
|
114
|
+
this.directMessagesView = "friends";
|
|
115
|
+
this.lastDirectConversationId = undefined;
|
|
116
|
+
this.selectedChannelByCommunity.clear();
|
|
117
|
+
this.set({ view: "friends" });
|
|
118
|
+
}
|
|
119
|
+
/** Reconciles selection after snapshots, membership changes, or deletion. */
|
|
120
|
+
reconcile() {
|
|
121
|
+
const account = this.account();
|
|
122
|
+
if (!account)
|
|
123
|
+
return this.reset();
|
|
124
|
+
if (this.lastDirectConversationId &&
|
|
125
|
+
!account.conversations.has(this.lastDirectConversationId))
|
|
126
|
+
this.lastDirectConversationId = undefined;
|
|
127
|
+
const conversationId = this.current.selectedConversationId;
|
|
128
|
+
const communityId = this.current.selectedCommunityId;
|
|
129
|
+
const channelId = this.current.selectedChannelId;
|
|
130
|
+
if (communityId && !account.communities.has(communityId))
|
|
131
|
+
return this.reset();
|
|
132
|
+
if (channelId && !this.findChannel(channelId)) {
|
|
133
|
+
if (communityId) {
|
|
134
|
+
this.selectedChannelByCommunity.delete(communityId);
|
|
135
|
+
return this.selectCommunity(communityId);
|
|
136
|
+
}
|
|
137
|
+
return this.reset();
|
|
138
|
+
}
|
|
139
|
+
if (conversationId && !account.conversations.has(conversationId))
|
|
140
|
+
return this.reset();
|
|
141
|
+
for (const [rememberedCommunityId, rememberedChannelId] of this
|
|
142
|
+
.selectedChannelByCommunity) {
|
|
143
|
+
const community = account.communities.get(rememberedCommunityId);
|
|
144
|
+
if (!community?.channels.some((channel) => channel.id === rememberedChannelId))
|
|
145
|
+
this.selectedChannelByCommunity.delete(rememberedCommunityId);
|
|
146
|
+
}
|
|
147
|
+
this.emit();
|
|
148
|
+
}
|
|
149
|
+
requireConversation(id) {
|
|
150
|
+
const conversation = this.account()?.conversations.get(id);
|
|
151
|
+
if (!conversation)
|
|
152
|
+
throw new Error("Conversation not found");
|
|
153
|
+
return conversation;
|
|
154
|
+
}
|
|
155
|
+
requireCommunity(id) {
|
|
156
|
+
const community = this.account()?.communities.get(id);
|
|
157
|
+
if (!community)
|
|
158
|
+
throw new Error("Community not found");
|
|
159
|
+
return community;
|
|
160
|
+
}
|
|
161
|
+
findChannel(channelId) {
|
|
162
|
+
for (const community of this.account()?.communities.values() ?? []) {
|
|
163
|
+
const channel = community.channels.find((candidate) => candidate.id === channelId);
|
|
164
|
+
if (channel)
|
|
165
|
+
return { community, channel };
|
|
166
|
+
}
|
|
167
|
+
return undefined;
|
|
168
|
+
}
|
|
169
|
+
findChannelByConversation(conversationId) {
|
|
170
|
+
for (const community of this.account()?.communities.values() ?? []) {
|
|
171
|
+
const channel = community.channels.find((candidate) => candidate.conversationId === conversationId);
|
|
172
|
+
if (channel)
|
|
173
|
+
return { community, channel };
|
|
174
|
+
}
|
|
175
|
+
return undefined;
|
|
176
|
+
}
|
|
177
|
+
set(state) {
|
|
178
|
+
this.current = state;
|
|
179
|
+
this.emit();
|
|
180
|
+
}
|
|
181
|
+
emit() {
|
|
182
|
+
this.listeners.forEach((listener) => listener());
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
function channelView(channel) {
|
|
186
|
+
return channel.kind === "voice" ? "voice-channel" : "conversation";
|
|
187
|
+
}
|
|
188
|
+
//# sourceMappingURL=workspace-controller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-controller.js","sourceRoot":"","sources":["../../src/workspace/workspace-controller.ts"],"names":[],"mappings":"AAeA,0EAA0E;AAC1E,MAAM,OAAO,mBAAmB;IAOD;IANrB,OAAO,GAAmB,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;IAC9C,kBAAkB,GAA+B,SAAS,CAAC;IAC3D,wBAAwB,CAAkB;IAC1C,0BAA0B,GAAG,IAAI,GAAG,EAA0B,CAAC;IAC/D,SAAS,GAAG,IAAI,GAAG,EAAc,CAAC;IAE1C,YAA6B,OAAuC;QAAvC,YAAO,GAAP,OAAO,CAAgC;IAAG,CAAC;IAExE,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED,IAAI,oBAAoB;QACtB,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,sBAAsB,CAAC;QAC/C,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAChE,CAAC;IAED,IAAI,iBAAiB;QACnB,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC;QAC5C,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC9D,CAAC;IAED,IAAI,eAAe;QACjB,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC;QAC1C,OAAO,EAAE;YACP,CAAC,CAAC,IAAI,CAAC,iBAAiB,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,CAAC;YACvE,CAAC,CAAC,SAAS,CAAC;IAChB,CAAC;IAED,SAAS,GAAG,CAAC,QAAoB,EAAE,EAAE;QACnC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC7B,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC/C,CAAC,CAAC;IAEF,gBAAgB,CAAC,cAA8B;QAC7C,MAAM,YAAY,GAAG,IAAI,CAAC,mBAAmB,CAAC,cAAc,CAAC,CAAC;QAC9D,MAAM,OAAO,GACX,CAAC,YAAY,CAAC,SAAS;YACrB,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,SAAS,CAAC;YAC1C,CAAC,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,yBAAyB,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;QACpE,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,CAAC,0BAA0B,CAAC,GAAG,CACjC,OAAO,CAAC,SAAS,CAAC,EAAE,EACpB,OAAO,CAAC,OAAO,CAAC,EAAE,CACnB,CAAC;YACF,IAAI,CAAC,GAAG,CAAC;gBACP,IAAI,EAAE,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC;gBAClC,sBAAsB,EAAE,YAAY,CAAC,EAAE;gBACvC,mBAAmB,EAAE,OAAO,CAAC,SAAS,CAAC,EAAE;gBACzC,iBAAiB,EAAE,OAAO,CAAC,OAAO,CAAC,EAAE;aACtC,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QACD,IAAI,YAAY,CAAC,IAAI,KAAK,mBAAmB;YAC3C,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;QACjD,IAAI,CAAC,kBAAkB,GAAG,cAAc,CAAC;QACzC,IAAI,CAAC,wBAAwB,GAAG,YAAY,CAAC,EAAE,CAAC;QAChD,IAAI,CAAC,GAAG,CAAC;YACP,IAAI,EAAE,cAAc;YACpB,sBAAsB,EAAE,YAAY,CAAC,EAAE;SACxC,CAAC,CAAC;IACL,CAAC;IAED,eAAe,CAAC,WAAwB;QACtC,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC;QACrD,MAAM,QAAQ,GAAG,CAAC,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC,IAAI,CAC3C,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAChD,CAAC;QACF,MAAM,mBAAmB,GAAG,IAAI,CAAC,0BAA0B,CAAC,GAAG,CAC7D,SAAS,CAAC,EAAE,CACb,CAAC;QACF,MAAM,OAAO,GACX,QAAQ,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,KAAK,mBAAmB,CAAC;YAClE,QAAQ,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,KAAK,MAAM,CAAC;YACvD,QAAQ,CAAC,CAAC,CAAC,CAAC;QACd,IAAI,OAAO;YAAE,IAAI,CAAC,0BAA0B,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;QAC3E,IAAI,CAAC,GAAG,CAAC;YACP,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS;YAChD,mBAAmB,EAAE,SAAS,CAAC,EAAE;YACjC,iBAAiB,EAAE,OAAO,EAAE,EAAE;YAC9B,sBAAsB,EAAE,OAAO,EAAE,cAAc;SAChD,CAAC,CAAC;IACL,CAAC;IAED,aAAa,CAAC,SAAoB;QAChC,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;QAC1C,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;QAC3D,IAAI,CAAC,0BAA0B,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC1E,IAAI,CAAC,GAAG,CAAC;YACP,IAAI,EAAE,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC;YAChC,mBAAmB,EAAE,KAAK,CAAC,SAAS,CAAC,EAAE;YACvC,iBAAiB,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE;YACnC,sBAAsB,EAAE,KAAK,CAAC,OAAO,CAAC,cAAc;SACrD,CAAC,CAAC;IACL,CAAC;IAED,WAAW;QACT,IAAI,CAAC,kBAAkB,GAAG,SAAS,CAAC;QACpC,IAAI,CAAC,GAAG,CAAC;YACP,IAAI,EAAE,SAAS;YACf,sBAAsB,EAAE,IAAI,CAAC,wBAAwB;SACtD,CAAC,CAAC;IACL,CAAC;IAED,kBAAkB;QAChB,IAAI,IAAI,CAAC,kBAAkB,KAAK,SAAS,EAAE,CAAC;YAC1C,IAAI,CAAC,GAAG,CAAC;gBACP,IAAI,EAAE,SAAS;gBACf,sBAAsB,EAAE,IAAI,CAAC,wBAAwB;aACtD,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QACD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,sBAAsB;YAClD,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,sBAAsB,CAAC;YACxE,CAAC,CAAC,SAAS,CAAC;QACd,MAAM,YAAY,GAChB,QAAQ,IAAI,QAAQ,CAAC,IAAI,KAAK,mBAAmB;YAC/C,CAAC,CAAC,QAAQ;YACV,CAAC,CAAC,IAAI,CAAC,wBAAwB;gBAC7B,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,wBAAwB,CAAC;gBAClE,CAAC,CAAC,SAAS,CAAC;QAClB,IAAI,CAAC,GAAG,CAAC;YACP,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS;YAC/C,sBAAsB,EAAE,YAAY,EAAE,EAAE;SACzC,CAAC,CAAC;IACL,CAAC;IAED,KAAK;QACH,IAAI,CAAC,kBAAkB,GAAG,SAAS,CAAC;QACpC,IAAI,CAAC,wBAAwB,GAAG,SAAS,CAAC;QAC1C,IAAI,CAAC,0BAA0B,CAAC,KAAK,EAAE,CAAC;QACxC,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;IAChC,CAAC;IAED,6EAA6E;IAC7E,SAAS;QACP,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QAC/B,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC,KAAK,EAAE,CAAC;QAClC,IACE,IAAI,CAAC,wBAAwB;YAC7B,CAAC,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,wBAAwB,CAAC;YAEzD,IAAI,CAAC,wBAAwB,GAAG,SAAS,CAAC;QAC5C,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,sBAAsB,CAAC;QAC3D,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC;QACrD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC;QACjD,IAAI,WAAW,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,WAAW,CAAC;YACtD,OAAO,IAAI,CAAC,KAAK,EAAE,CAAC;QACtB,IAAI,SAAS,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,CAAC;YAC9C,IAAI,WAAW,EAAE,CAAC;gBAChB,IAAI,CAAC,0BAA0B,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;gBACpD,OAAO,IAAI,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC;YAC3C,CAAC;YACD,OAAO,IAAI,CAAC,KAAK,EAAE,CAAC;QACtB,CAAC;QACD,IAAI,cAAc,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,cAAc,CAAC;YAC9D,OAAO,IAAI,CAAC,KAAK,EAAE,CAAC;QACtB,KAAK,MAAM,CAAC,qBAAqB,EAAE,mBAAmB,CAAC,IAAI,IAAI;aAC5D,0BAA0B,EAAE,CAAC;YAC9B,MAAM,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;YACjE,IACE,CAAC,SAAS,EAAE,QAAQ,CAAC,IAAI,CACvB,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,KAAK,mBAAmB,CAChD;gBAED,IAAI,CAAC,0BAA0B,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC;QAClE,CAAC;QACD,IAAI,CAAC,IAAI,EAAE,CAAC;IACd,CAAC;IAEO,mBAAmB,CAAC,EAAkB;QAC5C,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC3D,IAAI,CAAC,YAAY;YAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;QAC7D,OAAO,YAAY,CAAC;IACtB,CAAC;IAEO,gBAAgB,CAAC,EAAe;QACtC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACtD,IAAI,CAAC,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;QACvD,OAAO,SAAS,CAAC;IACnB,CAAC;IAEO,WAAW,CAAC,SAAoB;QACtC,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,WAAW,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC;YACnE,MAAM,OAAO,GAAG,SAAS,CAAC,QAAQ,CAAC,IAAI,CACrC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,KAAK,SAAS,CAC1C,CAAC;YACF,IAAI,OAAO;gBAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;QAC7C,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAEO,yBAAyB,CAAC,cAA8B;QAC9D,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,WAAW,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC;YACnE,MAAM,OAAO,GAAG,SAAS,CAAC,QAAQ,CAAC,IAAI,CACrC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,cAAc,KAAK,cAAc,CAC3D,CAAC;YACF,IAAI,OAAO;gBAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;QAC7C,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAEO,GAAG,CAAC,KAAqB;QAC/B,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QACrB,IAAI,CAAC,IAAI,EAAE,CAAC;IACd,CAAC;IAEO,IAAI;QACV,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC;IACnD,CAAC;CACF;AAED,SAAS,WAAW,CAAC,OAAyB;IAC5C,OAAO,OAAO,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,cAAc,CAAC;AACrE,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import type { Community, CommunityChannel, CommunityParticipant, ContactPresence, ConversationSummary, PresenceView, UserSummary } from "../domain.js";
|
|
2
|
+
import type { AttachmentId, ChannelId, CommunityId, ConversationId, UserId } from "../entity-id.js";
|
|
3
|
+
import type { FriendshipLists } from "../model/selectors.js";
|
|
4
|
+
import type { AccountState } from "../client/state.js";
|
|
5
|
+
export type ConversationDestination = {
|
|
6
|
+
id: string;
|
|
7
|
+
label: string;
|
|
8
|
+
detail: string;
|
|
9
|
+
kind: "dm" | "group_dm" | "channel";
|
|
10
|
+
conversationId?: ConversationId;
|
|
11
|
+
communityId?: CommunityId;
|
|
12
|
+
channelId?: ChannelId;
|
|
13
|
+
userId?: UserId;
|
|
14
|
+
avatarId?: AttachmentId;
|
|
15
|
+
channelKind?: CommunityChannel["kind"];
|
|
16
|
+
};
|
|
17
|
+
export type WorkspaceDirectory = {
|
|
18
|
+
conversations: ConversationSummary[];
|
|
19
|
+
destinations: ConversationDestination[];
|
|
20
|
+
};
|
|
21
|
+
export type MentionCandidate = {
|
|
22
|
+
userId: UserId;
|
|
23
|
+
username: string;
|
|
24
|
+
label: string;
|
|
25
|
+
};
|
|
26
|
+
export declare function userDisplayName(userId: UserId, profiles: ReadonlyMap<UserId, UserSummary>): string;
|
|
27
|
+
export declare function conversationDisplayName(conversation: ConversationSummary, ownUserId: UserId, profiles: ReadonlyMap<UserId, UserSummary>): string;
|
|
28
|
+
export declare function createWorkspaceDirectory(state: Pick<AccountState, "ownUserId" | "users" | "conversations" | "communities">): WorkspaceDirectory;
|
|
29
|
+
export declare function createMentionCandidates(options: {
|
|
30
|
+
ownUserId: UserId;
|
|
31
|
+
selectedConversation?: ConversationSummary;
|
|
32
|
+
participants: CommunityParticipant[];
|
|
33
|
+
profiles: ReadonlyMap<UserId, UserSummary>;
|
|
34
|
+
}): MentionCandidate[];
|
|
35
|
+
export declare function uniqueMentionCandidates(candidates: MentionCandidate[]): MentionCandidate[];
|
|
36
|
+
export declare function typingDisplayNames(userIds: Iterable<UserId>, participants: CommunityParticipant[], profiles: ReadonlyMap<UserId, UserSummary>): string[];
|
|
37
|
+
export declare function conversationRelationship(options: {
|
|
38
|
+
userId: UserId;
|
|
39
|
+
friendships: FriendshipLists;
|
|
40
|
+
presence: ReadonlyMap<UserId, PresenceView>;
|
|
41
|
+
}): {
|
|
42
|
+
friend: boolean;
|
|
43
|
+
requestIncoming: boolean;
|
|
44
|
+
requestSent: boolean;
|
|
45
|
+
presence: ContactPresence;
|
|
46
|
+
status: string | undefined;
|
|
47
|
+
};
|
|
48
|
+
export declare function communityForChannel(communities: Iterable<Community>, channelId: ChannelId): Community | undefined;
|
|
49
|
+
//# sourceMappingURL=workspace-selectors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-selectors.d.ts","sourceRoot":"","sources":["../../src/workspace/workspace-selectors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EACT,gBAAgB,EAChB,oBAAoB,EACpB,eAAe,EACf,mBAAmB,EACnB,YAAY,EAEZ,WAAW,EACZ,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EACV,YAAY,EACZ,SAAS,EACT,WAAW,EACX,cAAc,EACd,MAAM,EACP,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD,MAAM,MAAM,uBAAuB,GAAG;IACpC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,IAAI,GAAG,UAAU,GAAG,SAAS,CAAC;IACpC,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,WAAW,CAAC,EAAE,gBAAgB,CAAC,MAAM,CAAC,CAAC;CACxC,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,aAAa,EAAE,mBAAmB,EAAE,CAAC;IACrC,YAAY,EAAE,uBAAuB,EAAE,CAAC;CACzC,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,wBAAgB,eAAe,CAC7B,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,WAAW,CAAC,UAI3C;AAED,wBAAgB,uBAAuB,CACrC,YAAY,EAAE,mBAAmB,EACjC,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,WAAW,CAAC,UAY3C;AAED,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,IAAI,CACT,YAAY,EACZ,WAAW,GAAG,OAAO,GAAG,eAAe,GAAG,aAAa,CACxD,GACA,kBAAkB,CAiDpB;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE;IAC/C,SAAS,EAAE,MAAM,CAAC;IAClB,oBAAoB,CAAC,EAAE,mBAAmB,CAAC;IAC3C,YAAY,EAAE,oBAAoB,EAAE,CAAC;IACrC,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;CAC5C,sBAmBA;AAED,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,gBAAgB,EAAE,sBAcrE;AAED,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,EACzB,YAAY,EAAE,oBAAoB,EAAE,EACpC,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,WAAW,CAAC,YAU3C;AAED,wBAAgB,wBAAwB,CAAC,OAAO,EAAE;IAChD,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,eAAe,CAAC;IAC7B,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;CAC7C;;;;cAQ6D,eAAe;;EAG5E;AAWD,wBAAgB,mBAAmB,CACjC,WAAW,EAAE,QAAQ,CAAC,SAAS,CAAC,EAChC,SAAS,EAAE,SAAS,yBAKrB"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
export function userDisplayName(userId, profiles) {
|
|
2
|
+
const profile = profiles.get(userId);
|
|
3
|
+
return profile?.displayName.trim() || profile?.username || "Unknown user";
|
|
4
|
+
}
|
|
5
|
+
export function conversationDisplayName(conversation, ownUserId, profiles) {
|
|
6
|
+
if (conversation.name?.trim())
|
|
7
|
+
return conversation.name.trim();
|
|
8
|
+
const others = conversation.participantIds.filter((userId) => userId !== ownUserId);
|
|
9
|
+
const participants = others.length ? others : conversation.participantIds;
|
|
10
|
+
return (participants
|
|
11
|
+
.map((userId) => userDisplayName(userId, profiles))
|
|
12
|
+
.join(", ") || "Conversation");
|
|
13
|
+
}
|
|
14
|
+
export function createWorkspaceDirectory(state) {
|
|
15
|
+
if (!state.ownUserId)
|
|
16
|
+
return { conversations: [], destinations: [] };
|
|
17
|
+
const conversations = [...state.conversations.values()]
|
|
18
|
+
.filter((conversation) => conversation.kind !== "community-channel")
|
|
19
|
+
.sort(compareConversations);
|
|
20
|
+
const conversationDestinations = conversations.map((conversation) => {
|
|
21
|
+
const userId = conversation.kind === "direct"
|
|
22
|
+
? conversation.participantIds.find((candidate) => candidate !== state.ownUserId)
|
|
23
|
+
: undefined;
|
|
24
|
+
const profile = userId ? state.users.get(userId) : undefined;
|
|
25
|
+
return {
|
|
26
|
+
id: `conversation:${conversation.id}`,
|
|
27
|
+
label: conversationDisplayName(conversation, state.ownUserId, state.users),
|
|
28
|
+
detail: conversation.kind === "group"
|
|
29
|
+
? "Group DM"
|
|
30
|
+
: profile?.username || "Direct message",
|
|
31
|
+
kind: conversation.kind === "group" ? "group_dm" : "dm",
|
|
32
|
+
conversationId: conversation.id,
|
|
33
|
+
userId,
|
|
34
|
+
avatarId: conversation.avatarId ?? profile?.avatarId,
|
|
35
|
+
};
|
|
36
|
+
});
|
|
37
|
+
const channelDestinations = [...state.communities.values()].flatMap((community) => community.channels.map((channel) => ({
|
|
38
|
+
id: `channel:${channel.id}`,
|
|
39
|
+
label: channel.name,
|
|
40
|
+
detail: community.name,
|
|
41
|
+
kind: "channel",
|
|
42
|
+
conversationId: channel.conversationId,
|
|
43
|
+
communityId: community.id,
|
|
44
|
+
channelId: channel.id,
|
|
45
|
+
channelKind: channel.kind,
|
|
46
|
+
})));
|
|
47
|
+
return {
|
|
48
|
+
conversations,
|
|
49
|
+
destinations: [...conversationDestinations, ...channelDestinations],
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
export function createMentionCandidates(options) {
|
|
53
|
+
const participantIds = options.participants.length
|
|
54
|
+
? options.participants.map((participant) => participant.userId)
|
|
55
|
+
: (options.selectedConversation?.participantIds ?? [options.ownUserId]);
|
|
56
|
+
return uniqueMentionCandidates(participantIds
|
|
57
|
+
.filter((userId) => userId !== options.ownUserId)
|
|
58
|
+
.map((userId) => {
|
|
59
|
+
const profile = options.profiles.get(userId);
|
|
60
|
+
const nick = options.participants.find((participant) => participant.userId === userId)?.nick;
|
|
61
|
+
return {
|
|
62
|
+
userId,
|
|
63
|
+
username: profile?.username || nick || "user",
|
|
64
|
+
label: profile?.displayName || nick || profile?.username || "User",
|
|
65
|
+
};
|
|
66
|
+
}));
|
|
67
|
+
}
|
|
68
|
+
export function uniqueMentionCandidates(candidates) {
|
|
69
|
+
const unique = new Map();
|
|
70
|
+
for (const candidate of candidates) {
|
|
71
|
+
const label = candidate.label.trim();
|
|
72
|
+
if (!label)
|
|
73
|
+
continue;
|
|
74
|
+
const current = { ...candidate, label };
|
|
75
|
+
const existing = unique.get(candidate.userId);
|
|
76
|
+
if (!existing ||
|
|
77
|
+
(existing.label === existing.username && label !== candidate.username))
|
|
78
|
+
unique.set(candidate.userId, current);
|
|
79
|
+
}
|
|
80
|
+
return [...unique.values()];
|
|
81
|
+
}
|
|
82
|
+
export function typingDisplayNames(userIds, participants, profiles) {
|
|
83
|
+
return [...userIds].flatMap((userId) => {
|
|
84
|
+
const profile = profiles.get(userId);
|
|
85
|
+
const name = profile?.displayName ||
|
|
86
|
+
participants.find((participant) => participant.userId === userId)?.nick ||
|
|
87
|
+
profile?.username;
|
|
88
|
+
return name ? [name] : [];
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
export function conversationRelationship(options) {
|
|
92
|
+
const find = (items) => items.find((friendship) => friendship.userId === options.userId);
|
|
93
|
+
const currentPresence = options.presence.get(options.userId);
|
|
94
|
+
return {
|
|
95
|
+
friend: Boolean(find(options.friendships.accepted)),
|
|
96
|
+
requestIncoming: Boolean(find(options.friendships.received)),
|
|
97
|
+
requestSent: Boolean(find(options.friendships.sent)),
|
|
98
|
+
presence: (currentPresence?.availability ?? "offline"),
|
|
99
|
+
status: currentPresence?.customStatus?.text,
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
function compareConversations(left, right) {
|
|
103
|
+
const leftId = left.newestEventId ?? 0n;
|
|
104
|
+
const rightId = right.newestEventId ?? 0n;
|
|
105
|
+
return leftId < rightId ? 1 : leftId > rightId ? -1 : 0;
|
|
106
|
+
}
|
|
107
|
+
export function communityForChannel(communities, channelId) {
|
|
108
|
+
return [...communities].find((community) => community.channels.some((channel) => channel.id === channelId));
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=workspace-selectors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-selectors.js","sourceRoot":"","sources":["../../src/workspace/workspace-selectors.ts"],"names":[],"mappings":"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"}
|