-
Notifications
You must be signed in to change notification settings - Fork 1
/
basic-types.ts
138 lines (107 loc) · 2.95 KB
/
basic-types.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
export type IdType = string;
export type Disposable = () => void;
// ***************************************************
// Message
// ***************************************************
export type TextMessageSegment = {
type: 'text';
text: string;
};
export type ImageBehavior = 'can-browse' | 'like-text';
export type ImageMessageSegment = {
type: 'image';
behavior: ImageBehavior;
imageId: string;
width?: number;
height?: number;
displayName?: string;
};
export type AtMessageSegment = {
type: 'at';
targetId: IdType;
};
export type MessageSegment = TextMessageSegment | ImageMessageSegment | AtMessageSegment;
export type MessageContent = ReadonlyArray<MessageSegment>;
export type MessageBase = {
content: MessageContent;
};
type SentMessageFields = {
id: IdType;
senderId: IdType;
recipientId: IdType;
timestamp: number;
};
export type UnsentNormalMessage = MessageBase & {
type: 'normal';
};
export type UnsentQuoteMessage = MessageBase & {
type: 'quote';
prevId: IdType;
quote: MessageContent;
};
export type UnsentMessage = UnsentNormalMessage | UnsentQuoteMessage;
export type NormalMessage = SentMessageFields & UnsentNormalMessage;
export type QuoteMessage = SentMessageFields & UnsentQuoteMessage;
export type Message = NormalMessage | QuoteMessage;
// ***************************************************
// Other
// ***************************************************
export type FacePackage = {
id: IdType;
displayName: string;
displayFaceId?: IdType;
};
// ***************************************************
// Contact Info
// ***************************************************
export type GroupRole = 'owner' | 'admin' | 'member';
export type PersonInfo = {
id: IdType;
name: string;
avatar: string;
};
export type FriendInfo = PersonInfo & {
remark?: string;
category?: string;
};
export type StrangerInfo = PersonInfo & {
fromGroupId: IdType;
};
export type GroupInfo = PersonInfo & {
ownerId: IdType;
memberCount: number;
memberCapacity: number;
selfMuteExpire?: number;
allMuteExpire?: number;
description?: string;
};
export type GroupMemberInfo = PersonInfo & {
groupId: IdType;
joinTime: number;
role: GroupRole;
remark?: string;
};
export function isGroupInfo(info: FriendInfo | GroupInfo): info is GroupInfo {
const groupInfo = info as GroupInfo;
return groupInfo && groupInfo.memberCapacity !== undefined;
}
// ***************************************************
// Session
// ***************************************************
type SessionBase = {
unreadCount: number;
};
export type FriendSession = SessionBase & {
type: 'friend';
contact: FriendInfo;
};
export type StrangerSession = SessionBase & {
type: 'stranger';
contact: StrangerInfo;
};
export type GroupSession = SessionBase & {
type: 'group';
contact: GroupInfo;
};
export type SessionInfo = FriendSession | StrangerSession | GroupSession;
export type SessionType = 'friend' | 'stranger' | 'group';