chat-api.ts 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475
  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. group_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. if (data.members_can_edit_settings) {
  308. formData.append('members_can_edit_settings', JSON.stringify(data.members_can_edit_settings));
  309. }
  310. if (data.members_can_send_messages) {
  311. formData.append('members_can_send_messages', JSON.stringify(data.members_can_send_messages));
  312. }
  313. if (data.members_can_add_new_members) {
  314. formData.append(
  315. 'members_can_add_new_members',
  316. JSON.stringify(data.members_can_add_new_members)
  317. );
  318. }
  319. formData.append('admins', JSON.stringify(data.admins));
  320. if (data.group_avatar) {
  321. const { uri, type, name } = data.group_avatar;
  322. formData.append('group_avatar', {
  323. uri,
  324. type: type === 'image' ? type + '/' + uri.split('.').pop()! : type,
  325. name: name || 'avatar'
  326. } as unknown as Blob);
  327. }
  328. return request.postForm<PostCreateGroupReturn>(API.CREATE_GROUP, formData);
  329. },
  330. getGroupChat: (
  331. token: string,
  332. group_token: string,
  333. no_of_messages: number,
  334. previous_than_message_id: number
  335. ) =>
  336. request.postForm<PostGetGroupChatWithReturn>(API.GET_GROUP_CHAT, {
  337. token,
  338. group_token,
  339. no_of_messages,
  340. previous_than_message_id
  341. }),
  342. sendGroupMessage: (data: PostSendGroupMessage) => {
  343. const formData = new FormData();
  344. formData.append('token', data.token);
  345. formData.append('to_group_token', data.to_group_token);
  346. formData.append('text', data.text);
  347. if (data.reply_to_id && data.reply_to_id !== undefined) {
  348. formData.append('reply_to_id', data.reply_to_id.toString());
  349. }
  350. if (data.attachment && data.attachment !== -1) {
  351. const { uri, type, name } = data.attachment;
  352. formData.append('attachment', {
  353. uri,
  354. type: type === 'image' ? type + '/' + uri.split('.').pop()! : type,
  355. name: name || 'file'
  356. } as unknown as Blob);
  357. }
  358. return request.postForm<PostSendMessageReturn>(API.SEND_GROUP_MESSAGE, formData);
  359. },
  360. groupMessagesReceived: (data: PostGroupMessagesReceivedOrRead) =>
  361. request.postForm<ResponseType>(API.GROUP_MESSAGES_RECEIVED, data),
  362. groupMessagesRead: (data: PostGroupMessagesReceivedOrRead) =>
  363. request.postForm<ResponseType>(API.GROUP_MESSAGES_READ, data),
  364. reactToGroupMessage: (data: PostReactToGroupMessage) =>
  365. request.postForm<ResponseType>(API.REACT_TO_GROUP_MESSAGE, data),
  366. unreactToGroupMessage: (data: PostUnreactToGroupMessage) =>
  367. request.postForm<ResponseType>(API.UNREACT_TO_GROUP_MESSAGE, data),
  368. deleteGroupMessage: (data: PostDeleteGroupMessage) =>
  369. request.postForm<ResponseType>(API.DELETE_GROUP_MESSAGE, data),
  370. setPinForGroup: (data: PostSetGroupSettings) =>
  371. request.postForm<ResponseType>(API.SET_PIN_FOR_GROUP, data),
  372. setArchiveForGroup: (data: PostSetGroupSettings) =>
  373. request.postForm<ResponseType>(API.SET_ARCHIVE_FOR_GROUP, data),
  374. setMuteForGroup: (data: PostSetGroupSettings) =>
  375. request.postForm<ResponseType>(API.SET_MUTE_FOR_GROUP, data),
  376. leaveGroup: (token: string, group_token: string) =>
  377. request.postForm<ResponseType>(API.LEAVE_GROUP, { token, group_token }),
  378. addToGroup: (token: string, uid: number, group_token: string) =>
  379. request.postForm<ResponseType>(API.ADD_TO_GROUP, { token, uid, group_token }),
  380. addToGroupAsAdmin: (token: string, uid: number, group_token: string) =>
  381. request.postForm<ResponseType>(API.ADD_TO_GROUP_AS_ADMIN, { token, uid, group_token }),
  382. setGroupAdmin: (token: string, uid: number, group_token: string, value: 0 | 1) =>
  383. request.postForm<ResponseType>(API.SET_GROUP_ADMIN, { token, uid, group_token, value }),
  384. removeFromGroup: (token: string, uid: number, group_token: string) =>
  385. request.postForm<ResponseType>(API.REMOVE_FROM_GROUP, { token, uid, group_token }),
  386. getGroupSettings: (token: string, group_token: string) =>
  387. request.postForm<PostGetGroupSettingsReturn>(API.GET_GROUP_SETTINGS, { token, group_token }),
  388. getGroupMembers: (token: string, group_token: string) =>
  389. request.postForm<PostGetGroupMembersReturn>(API.GET_GROUP_MEMBERS, { token, group_token }),
  390. updateGroupSettings: (data: PostUpdateGroupSettings) => {
  391. const formData = new FormData();
  392. formData.append('token', data.token);
  393. formData.append('group_token', data.group_token);
  394. if (data.members_can_edit_settings) {
  395. formData.append('members_can_edit_settings', JSON.stringify(data.members_can_edit_settings));
  396. }
  397. if (data.members_can_add_new_members) {
  398. formData.append(
  399. 'members_can_add_new_members',
  400. JSON.stringify(data.members_can_add_new_members)
  401. );
  402. }
  403. if (data.members_can_send_messages) {
  404. formData.append('members_can_send_messages', JSON.stringify(data.members_can_send_messages));
  405. }
  406. if (data.members_can_see_members) {
  407. formData.append('members_can_see_members', JSON.stringify(data.members_can_see_members));
  408. }
  409. if (data.name) {
  410. formData.append('name', data.name);
  411. }
  412. if (data.description) {
  413. formData.append('description', data.description);
  414. }
  415. if (data.group_avatar) {
  416. const { uri, type, name } = data.group_avatar;
  417. formData.append('group_avatar', {
  418. uri,
  419. type: type === 'image' ? type + '/' + uri.split('.').pop()! : type,
  420. name: name || 'avatar'
  421. } as unknown as Blob);
  422. }
  423. return request.postForm<ResponseType>(API.UPDATE_GROUP_SETTINGS, formData);
  424. },
  425. getGroupMessageStatus: (token: string, group_token: string, message_id: number) =>
  426. request.postForm<PostGetGroupMessageStatusReturn>(API.GET_GROUP_MESSAGE_STATUS, {
  427. token,
  428. group_token,
  429. message_id
  430. }),
  431. removeGroupFromList: (token: string, group_token: string) =>
  432. request.postForm<ResponseType>(API.REMOVE_GROUP_FROM_LIST, { token, group_token })
  433. };