chat-api.ts 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298
  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. interface Attachement {
  36. id: number;
  37. filename: string;
  38. filetype: string;
  39. attachment_small_url?: string;
  40. attachment_full_url?: string;
  41. lat?: number;
  42. lng?: number;
  43. attachment_link?: string;
  44. }
  45. interface Message {
  46. id: number;
  47. sender: number;
  48. recipient: number;
  49. text: string;
  50. status: 1 | 2 | 3 | 4;
  51. sent_datetime: Date;
  52. received_datetime: Date | null;
  53. read_datetime: Date | null;
  54. reply_to_id: number;
  55. reactions: string;
  56. edits: string;
  57. attachement: -1 | Attachement;
  58. encrypted: 0 | 1;
  59. }
  60. export interface PostGetChatWithReturn extends ResponseType {
  61. messages: (Message & {
  62. reply_to: Message;
  63. })[];
  64. }
  65. export interface PostSendMessage {
  66. token: string;
  67. to_uid: number;
  68. text: string;
  69. reply_to_id?: number;
  70. attachment?: { uri: string; type: string; name?: string } | -1;
  71. }
  72. export interface PostSendGroupMessage {
  73. token: string;
  74. to_group_token: string;
  75. text: string;
  76. reply_to_id?: number;
  77. attachment?: { uri: string; type: string; name?: string } | -1;
  78. }
  79. export interface PostSendMessageReturn extends ResponseType {
  80. message_id: number;
  81. attachment?: any;
  82. }
  83. export interface PostMessagesReceivedOrRead {
  84. token: string;
  85. from_user: number;
  86. messages_id: number[];
  87. }
  88. export interface PostGroupMessagesReceivedOrRead {
  89. token: string;
  90. group_token: string;
  91. messages_id: number[];
  92. }
  93. export interface PostReactToMessage {
  94. token: string;
  95. message_id: number;
  96. reaction: string;
  97. conversation_with_user: number;
  98. }
  99. export interface PostUnreactToMessage {
  100. token: string;
  101. message_id: number;
  102. conversation_with_user: number;
  103. }
  104. export interface PostReactToGroupMessage {
  105. token: string;
  106. message_id: number;
  107. reaction: string;
  108. group_token: string;
  109. }
  110. export interface PostUnreactToGroupMessage {
  111. token: string;
  112. message_id: number;
  113. group_token: string;
  114. }
  115. export interface PostDeleteMessage {
  116. token: string;
  117. message_id: number;
  118. conversation_with_user: number;
  119. }
  120. export interface PostDeleteChat {
  121. token: string;
  122. conversation_with_user: number;
  123. }
  124. export interface PostReportConversation {
  125. token: string;
  126. reported_user_id: number;
  127. }
  128. export interface PostSetSettings {
  129. token: string;
  130. value: 0 | 1;
  131. conversation_with_user: number;
  132. }
  133. export interface PostGetBlockedReturn extends ResponseType {
  134. blocked: {
  135. id: number;
  136. first_name: string;
  137. last_name: string;
  138. avatar: string | null;
  139. }[];
  140. }
  141. export interface PostGetUnreadCountReturn extends ResponseType {
  142. unread_conversations: number;
  143. }
  144. export interface PostCreateGroup {
  145. token: string;
  146. users: number[];
  147. name: string;
  148. admins: number[] | [];
  149. description?: string;
  150. group_avatar?: { uri: string; type: string; name?: string };
  151. members_can_edit_settings?: 0 | 1;
  152. members_can_add_new_members?: 0 | 1;
  153. members_can_send_messages?: 0 | 1;
  154. }
  155. export const chatApi = {
  156. searchUsers: (token: string, search: string) =>
  157. request.postForm<PostSearchUsersReturn>(API.SEARCH_USERS, { token, search }),
  158. getChatsList: (token: string, archive: 0 | 1) =>
  159. request.postForm<PostGetChatsListReturn>(API.GET_CHATS_LIST, { token, archive }),
  160. getChatWith: (
  161. token: string,
  162. uid: number,
  163. no_of_messages: number,
  164. previous_than_message_id: number
  165. ) =>
  166. request.postForm<PostGetChatWithReturn>(API.GET_CHAT_WITH, {
  167. token,
  168. uid,
  169. no_of_messages,
  170. previous_than_message_id
  171. }),
  172. sendMessage: (data: PostSendMessage) => {
  173. const formData = new FormData();
  174. formData.append('token', data.token);
  175. formData.append('to_uid', data.to_uid.toString());
  176. formData.append('text', data.text);
  177. if (data.reply_to_id && data.reply_to_id !== undefined) {
  178. formData.append('reply_to_id', data.reply_to_id.toString());
  179. }
  180. if (data.attachment && data.attachment !== -1) {
  181. const { uri, type, name } = data.attachment;
  182. formData.append('attachment', {
  183. uri,
  184. type: type === 'image' ? type + '/' + uri.split('.').pop()! : type,
  185. name: name || 'file'
  186. } as unknown as Blob);
  187. }
  188. return request.postForm<PostSendMessageReturn>(API.SEND_MESSAGE, formData);
  189. },
  190. messagesReceived: (data: PostMessagesReceivedOrRead) =>
  191. request.postForm<ResponseType>(API.MESSAGES_RECEIVED, data),
  192. messagesRead: (data: PostMessagesReceivedOrRead) =>
  193. request.postForm<ResponseType>(API.MESSAGES_READ, data),
  194. reactToMessage: (data: PostReactToMessage) =>
  195. request.postForm<ResponseType>(API.REACT_TO_MESSAGE, data),
  196. deleteMessage: (data: PostDeleteMessage) =>
  197. request.postForm<ResponseType>(API.DELETE_MESSAGE, data),
  198. setPin: (data: PostSetSettings) => request.postForm<ResponseType>(API.SET_PIN, data),
  199. setArchive: (data: PostSetSettings) => request.postForm<ResponseType>(API.SET_ARCHIVE, data),
  200. setBlock: (data: PostSetSettings) => request.postForm<ResponseType>(API.SET_BLOCK, data),
  201. setMute: (data: PostSetSettings) => request.postForm<ResponseType>(API.SET_MUTE, data),
  202. deleteChat: (data: PostDeleteChat) => request.postForm<ResponseType>(API.DELETE_CHAT, data),
  203. unreactToMessage: (data: PostUnreactToMessage) =>
  204. request.postForm<ResponseType>(API.UNREACT_TO_MESSAGE, data),
  205. getBlocked: (token: string) => request.postForm<PostGetBlockedReturn>(API.GET_BLOCKED, { token }),
  206. getUnreadMessagesCount: (token: string) =>
  207. request.postForm<PostGetUnreadCountReturn>(API.GET_UNREAD_MESSAGES_PRESENT, {
  208. token
  209. }),
  210. reportConversation: (data: PostReportConversation) =>
  211. request.postForm<ResponseType>(API.REPORT_CONVERSATION, data),
  212. createGroup: (data: PostCreateGroup) => {
  213. const formData = new FormData();
  214. formData.append('token', data.token);
  215. formData.append('users', JSON.stringify(data.users));
  216. formData.append('name', data.name);
  217. if (data.description) {
  218. formData.append('description', data.description);
  219. }
  220. formData.append('admins', JSON.stringify(data.admins));
  221. if (data.group_avatar) {
  222. const { uri, type, name } = data.group_avatar;
  223. formData.append('attachment', {
  224. uri,
  225. type: type === 'image' ? type + '/' + uri.split('.').pop()! : type,
  226. name: name || 'file'
  227. } as unknown as Blob);
  228. }
  229. return request.postForm<ResponseType>(API.CREATE_GROUP, formData);
  230. },
  231. getGroupChat: (
  232. token: string,
  233. group_token: string,
  234. no_of_messages: number,
  235. previous_than_message_id: number
  236. ) =>
  237. request.postForm<PostGetChatWithReturn>(API.GET_GROUP_CHAT, {
  238. token,
  239. group_token,
  240. no_of_messages,
  241. previous_than_message_id
  242. }),
  243. sendGroupMessage: (data: PostSendGroupMessage) => {
  244. const formData = new FormData();
  245. formData.append('token', data.token);
  246. formData.append('to_group_token', data.to_group_token);
  247. formData.append('text', data.text);
  248. if (data.reply_to_id && data.reply_to_id !== undefined) {
  249. formData.append('reply_to_id', data.reply_to_id.toString());
  250. }
  251. if (data.attachment && data.attachment !== -1) {
  252. const { uri, type, name } = data.attachment;
  253. formData.append('attachment', {
  254. uri,
  255. type: type === 'image' ? type + '/' + uri.split('.').pop()! : type,
  256. name: name || 'file'
  257. } as unknown as Blob);
  258. }
  259. return request.postForm<PostSendMessageReturn>(API.SEND_GROUP_MESSAGE, formData);
  260. },
  261. groupMessagesReceived: (data: PostGroupMessagesReceivedOrRead) =>
  262. request.postForm<ResponseType>(API.GROUP_MESSAGES_RECEIVED, data),
  263. groupMessagesRead: (data: PostGroupMessagesReceivedOrRead) =>
  264. request.postForm<ResponseType>(API.GROUP_MESSAGES_READ, data),
  265. reactToGroupMessage: (data: PostReactToGroupMessage) =>
  266. request.postForm<ResponseType>(API.REACT_TO_GROUP_MESSAGE, data),
  267. unreactToGroupMessage: (data: PostUnreactToGroupMessage) =>
  268. request.postForm<ResponseType>(API.UNREACT_TO_GROUP_MESSAGE, data)
  269. };