chat-api.ts 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426
  1. import { request } from '../../../utils';
  2. import { API } from '../../../types';
  3. import { ResponseType } from '../response-type';
  4. export interface PostSearchUsersReturn extends ResponseType {
  5. data: {
  6. user_id: number;
  7. first_name: string;
  8. last_name: string;
  9. avatar: string | null;
  10. }[];
  11. }
  12. // status: 1 -sent; 2 -received; 3 -read; 4 - deleted
  13. export interface PostGetChatsListReturn extends ResponseType {
  14. conversations: {
  15. uid: number | null;
  16. group_chat_token: string | null;
  17. name: string;
  18. avatar: string | null;
  19. short: string;
  20. sent_by: number;
  21. updated: Date;
  22. status: 1 | 2 | 3 | 4;
  23. unread_count: number;
  24. last_message_id: number;
  25. pin: 0 | 1;
  26. pin_order: number;
  27. archive: 0 | 1;
  28. archive_order: number;
  29. attachement_name: string;
  30. encrypted: 0 | 1;
  31. muted: 0 | 1;
  32. user_type: 'normal' | 'not_exist' | 'blocked';
  33. }[];
  34. }
  35. export interface PostGetGroupSettingsReturn extends ResponseType {
  36. settings: {
  37. members_can_add_new_members: 0 | 1;
  38. members_can_edit_settings: 0 | 1;
  39. members_can_send_messages: 0 | 1;
  40. members_can_see_members: 0 | 1;
  41. name: string;
  42. description: string | null;
  43. avatar: string | null;
  44. avatar_full: string | null;
  45. admin: 0 | 1;
  46. member_count: number;
  47. muted: 0 | 1;
  48. };
  49. }
  50. export interface PostGetGroupMembersReturn extends ResponseType {
  51. settings: {
  52. uid: number;
  53. name: string;
  54. avatar: string | null;
  55. admin: 0 | 1;
  56. added: string;
  57. }[];
  58. }
  59. interface Attachement {
  60. id: number;
  61. filename: string;
  62. filetype: string;
  63. attachment_small_url?: string;
  64. attachment_full_url?: string;
  65. lat?: number;
  66. lng?: number;
  67. attachment_link?: string;
  68. }
  69. interface Message {
  70. id: number;
  71. sender: number;
  72. recipient: number;
  73. text: string;
  74. status: 1 | 2 | 3 | 4;
  75. sent_datetime: Date;
  76. received_datetime: Date | null;
  77. read_datetime: Date | null;
  78. reply_to_id: number;
  79. reactions: string;
  80. edits: string;
  81. attachement: -1 | Attachement;
  82. encrypted: 0 | 1;
  83. }
  84. interface GroupMessage {
  85. id: number;
  86. sender: number;
  87. recipient: number;
  88. text: string;
  89. status: 1 | 2 | 3 | 4;
  90. sent_datetime: Date;
  91. received_datetime: Date | null;
  92. read_datetime: Date | null;
  93. reply_to_id: number;
  94. reactions: string;
  95. edits: string;
  96. attachement: -1 | Attachement;
  97. encrypted: 0 | 1;
  98. sender_avatar: string | null;
  99. sender_name: string;
  100. }
  101. export interface PostGetChatWithReturn extends ResponseType {
  102. messages: (Message & {
  103. reply_to: Message;
  104. })[];
  105. }
  106. export interface PostGetGroupChatWithReturn extends ResponseType {
  107. groupToken: string;
  108. groupAvatar: string | null;
  109. can_send_messages: boolean;
  110. messages: (GroupMessage & {
  111. reply_to: GroupMessage;
  112. sender_avatar: string | null;
  113. sender_name: string;
  114. })[];
  115. }
  116. export interface PostSendMessage {
  117. token: string;
  118. to_uid: number;
  119. text: string;
  120. reply_to_id?: number;
  121. attachment?: { uri: string; type: string; name?: string } | -1;
  122. }
  123. export interface PostSendGroupMessage {
  124. token: string;
  125. to_group_token: string;
  126. text: string;
  127. reply_to_id?: number;
  128. attachment?: { uri: string; type: string; name?: string } | -1;
  129. }
  130. export interface PostSendMessageReturn extends ResponseType {
  131. message_id: number;
  132. attachment?: any;
  133. }
  134. export interface PostMessagesReceivedOrRead {
  135. token: string;
  136. from_user: number;
  137. messages_id: number[];
  138. }
  139. export interface PostGroupMessagesReceivedOrRead {
  140. token: string;
  141. group_token: string;
  142. messages_id: number[];
  143. }
  144. export interface PostReactToMessage {
  145. token: string;
  146. message_id: number;
  147. reaction: string;
  148. conversation_with_user: number;
  149. }
  150. export interface PostUnreactToMessage {
  151. token: string;
  152. message_id: number;
  153. conversation_with_user: number;
  154. }
  155. export interface PostReactToGroupMessage {
  156. token: string;
  157. message_id: number;
  158. reaction: string;
  159. group_token: string;
  160. }
  161. export interface PostUnreactToGroupMessage {
  162. token: string;
  163. message_id: number;
  164. group_token: string;
  165. }
  166. export interface PostDeleteMessage {
  167. token: string;
  168. message_id: number;
  169. conversation_with_user: number;
  170. }
  171. export interface PostDeleteGroupMessage {
  172. token: string;
  173. message_id: number;
  174. group_token: string;
  175. }
  176. export interface PostDeleteChat {
  177. token: string;
  178. conversation_with_user: number;
  179. }
  180. export interface PostReportConversation {
  181. token: string;
  182. reported_user_id: number;
  183. }
  184. export interface PostSetSettings {
  185. token: string;
  186. value: 0 | 1;
  187. conversation_with_user: number;
  188. }
  189. export interface PostSetGroupSettings {
  190. token: string;
  191. value: 0 | 1;
  192. group_token: string;
  193. }
  194. export interface PostGetBlockedReturn extends ResponseType {
  195. blocked: {
  196. id: number;
  197. first_name: string;
  198. last_name: string;
  199. avatar: string | null;
  200. }[];
  201. }
  202. export interface PostGetUnreadCountReturn extends ResponseType {
  203. unread_conversations: number;
  204. }
  205. export interface PostCreateGroup {
  206. token: string;
  207. users: number[];
  208. name: string;
  209. admins: number[] | [];
  210. description?: string;
  211. group_avatar?: { uri: string; type: string; name?: string };
  212. members_can_edit_settings?: 0 | 1;
  213. members_can_add_new_members?: 0 | 1;
  214. members_can_send_messages?: 0 | 1;
  215. }
  216. export interface PostCreateGroupReturn extends ResponseType {
  217. groupToken: string;
  218. groupAvatar: string | null;
  219. can_send_messages: boolean;
  220. }
  221. export interface PostUpdateGroupSettings {
  222. token: string;
  223. group_token: string;
  224. members_can_edit_settings?: 0 | 1;
  225. members_can_add_new_members?: 0 | 1;
  226. members_can_send_messages?: 0 | 1;
  227. members_can_see_members?: 0 | 1;
  228. name?: string;
  229. description?: string;
  230. avatar?: { uri: string; type: string; name?: string };
  231. }
  232. export interface PostGetGroupMessageStatusReturn {
  233. result: string;
  234. status: {
  235. uid: number;
  236. name: string;
  237. avatar: string | null;
  238. status: 1 | 2 | 3 | 4;
  239. datetime: string | null;
  240. }[];
  241. }
  242. export const chatApi = {
  243. searchUsers: (token: string, search: string) =>
  244. request.postForm<PostSearchUsersReturn>(API.SEARCH_USERS, { token, search }),
  245. getChatsList: (token: string, archive: 0 | 1) =>
  246. request.postForm<PostGetChatsListReturn>(API.GET_CHATS_LIST, { token, archive }),
  247. getChatWith: (
  248. token: string,
  249. uid: number,
  250. no_of_messages: number,
  251. previous_than_message_id: number
  252. ) =>
  253. request.postForm<PostGetChatWithReturn>(API.GET_CHAT_WITH, {
  254. token,
  255. uid,
  256. no_of_messages,
  257. previous_than_message_id
  258. }),
  259. sendMessage: (data: PostSendMessage) => {
  260. const formData = new FormData();
  261. formData.append('token', data.token);
  262. formData.append('to_uid', data.to_uid.toString());
  263. formData.append('text', data.text);
  264. if (data.reply_to_id && data.reply_to_id !== undefined) {
  265. formData.append('reply_to_id', data.reply_to_id.toString());
  266. }
  267. if (data.attachment && data.attachment !== -1) {
  268. const { uri, type, name } = data.attachment;
  269. formData.append('attachment', {
  270. uri,
  271. type: type === 'image' ? type + '/' + uri.split('.').pop()! : type,
  272. name: name || 'file'
  273. } as unknown as Blob);
  274. }
  275. return request.postForm<PostSendMessageReturn>(API.SEND_MESSAGE, formData);
  276. },
  277. messagesReceived: (data: PostMessagesReceivedOrRead) =>
  278. request.postForm<ResponseType>(API.MESSAGES_RECEIVED, data),
  279. messagesRead: (data: PostMessagesReceivedOrRead) =>
  280. request.postForm<ResponseType>(API.MESSAGES_READ, data),
  281. reactToMessage: (data: PostReactToMessage) =>
  282. request.postForm<ResponseType>(API.REACT_TO_MESSAGE, data),
  283. deleteMessage: (data: PostDeleteMessage) =>
  284. request.postForm<ResponseType>(API.DELETE_MESSAGE, data),
  285. setPin: (data: PostSetSettings) => request.postForm<ResponseType>(API.SET_PIN, data),
  286. setArchive: (data: PostSetSettings) => request.postForm<ResponseType>(API.SET_ARCHIVE, data),
  287. setBlock: (data: PostSetSettings) => request.postForm<ResponseType>(API.SET_BLOCK, data),
  288. setMute: (data: PostSetSettings) => request.postForm<ResponseType>(API.SET_MUTE, data),
  289. deleteChat: (data: PostDeleteChat) => request.postForm<ResponseType>(API.DELETE_CHAT, data),
  290. unreactToMessage: (data: PostUnreactToMessage) =>
  291. request.postForm<ResponseType>(API.UNREACT_TO_MESSAGE, data),
  292. getBlocked: (token: string) => request.postForm<PostGetBlockedReturn>(API.GET_BLOCKED, { token }),
  293. getUnreadMessagesCount: (token: string) =>
  294. request.postForm<PostGetUnreadCountReturn>(API.GET_UNREAD_MESSAGES_PRESENT, {
  295. token
  296. }),
  297. reportConversation: (data: PostReportConversation) =>
  298. request.postForm<ResponseType>(API.REPORT_CONVERSATION, data),
  299. createGroup: (data: PostCreateGroup) => {
  300. const formData = new FormData();
  301. formData.append('token', data.token);
  302. formData.append('users', JSON.stringify(data.users));
  303. formData.append('name', data.name);
  304. if (data.description) {
  305. formData.append('description', data.description);
  306. }
  307. formData.append('admins', JSON.stringify(data.admins));
  308. if (data.group_avatar) {
  309. const { uri, type, name } = data.group_avatar;
  310. formData.append('attachment', {
  311. uri,
  312. type: type === 'image' ? type + '/' + uri.split('.').pop()! : type,
  313. name: name || 'file'
  314. } as unknown as Blob);
  315. }
  316. return request.postForm<PostCreateGroupReturn>(API.CREATE_GROUP, formData);
  317. },
  318. getGroupChat: (
  319. token: string,
  320. group_token: string,
  321. no_of_messages: number,
  322. previous_than_message_id: number
  323. ) =>
  324. request.postForm<PostGetGroupChatWithReturn>(API.GET_GROUP_CHAT, {
  325. token,
  326. group_token,
  327. no_of_messages,
  328. previous_than_message_id
  329. }),
  330. sendGroupMessage: (data: PostSendGroupMessage) => {
  331. const formData = new FormData();
  332. formData.append('token', data.token);
  333. formData.append('to_group_token', data.to_group_token);
  334. formData.append('text', data.text);
  335. if (data.reply_to_id && data.reply_to_id !== undefined) {
  336. formData.append('reply_to_id', data.reply_to_id.toString());
  337. }
  338. if (data.attachment && data.attachment !== -1) {
  339. const { uri, type, name } = data.attachment;
  340. formData.append('attachment', {
  341. uri,
  342. type: type === 'image' ? type + '/' + uri.split('.').pop()! : type,
  343. name: name || 'file'
  344. } as unknown as Blob);
  345. }
  346. return request.postForm<PostSendMessageReturn>(API.SEND_GROUP_MESSAGE, formData);
  347. },
  348. groupMessagesReceived: (data: PostGroupMessagesReceivedOrRead) =>
  349. request.postForm<ResponseType>(API.GROUP_MESSAGES_RECEIVED, data),
  350. groupMessagesRead: (data: PostGroupMessagesReceivedOrRead) =>
  351. request.postForm<ResponseType>(API.GROUP_MESSAGES_READ, data),
  352. reactToGroupMessage: (data: PostReactToGroupMessage) =>
  353. request.postForm<ResponseType>(API.REACT_TO_GROUP_MESSAGE, data),
  354. unreactToGroupMessage: (data: PostUnreactToGroupMessage) =>
  355. request.postForm<ResponseType>(API.UNREACT_TO_GROUP_MESSAGE, data),
  356. deleteGroupMessage: (data: PostDeleteGroupMessage) =>
  357. request.postForm<ResponseType>(API.DELETE_GROUP_MESSAGE, data),
  358. setPinForGroup: (data: PostSetGroupSettings) =>
  359. request.postForm<ResponseType>(API.SET_PIN_FOR_GROUP, data),
  360. setArchiveForGroup: (data: PostSetGroupSettings) =>
  361. request.postForm<ResponseType>(API.SET_ARCHIVE_FOR_GROUP, data),
  362. setMuteForGroup: (data: PostSetGroupSettings) =>
  363. request.postForm<ResponseType>(API.SET_MUTE_FOR_GROUP, data),
  364. leaveGroup: (token: string, group_token: string) =>
  365. request.postForm<ResponseType>(API.LEAVE_GROUP, { token, group_token }),
  366. addToGroup: (token: string, uid: number, group_token: string) =>
  367. request.postForm<ResponseType>(API.ADD_TO_GROUP, { token, uid, group_token }),
  368. addToGroupAsAdmin: (token: string, uid: number, group_token: string) =>
  369. request.postForm<ResponseType>(API.ADD_TO_GROUP_AS_ADMIN, { token, uid, group_token }),
  370. setGroupAdmin: (token: string, uid: number, group_token: string, value: 0 | 1) =>
  371. request.postForm<ResponseType>(API.SET_GROUP_ADMIN, { token, uid, group_token, value }),
  372. removeFromGroup: (token: string, uid: number, group_token: string) =>
  373. request.postForm<ResponseType>(API.REMOVE_FROM_GROUP, { token, uid, group_token }),
  374. getGroupSettings: (token: string, group_token: string) =>
  375. request.postForm<PostGetGroupSettingsReturn>(API.GET_GROUP_SETTINGS, { token, group_token }),
  376. getGroupMembers: (token: string, group_token: string) =>
  377. request.postForm<PostGetGroupMembersReturn>(API.GET_GROUP_MEMBERS, { token, group_token }),
  378. updateGroupSettings: (data: PostUpdateGroupSettings) =>
  379. request.postForm<ResponseType>(API.UPDATE_GROUP_SETTINGS, data),
  380. getGroupMessageStatus: (token: string, group_token: string, message_id: number) =>
  381. request.postForm<PostGetGroupMessageStatusReturn>(API.GET_GROUP_MESSAGE_STATUS, {
  382. token,
  383. group_token,
  384. message_id
  385. }),
  386. removeGroupFromList: (token: string, group_token: string) =>
  387. request.postForm<ResponseType>(API.REMOVE_GROUP_FROM_LIST, { token, group_token })
  388. };