action.js 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. import { url } from "../../App"
  2. // функция getGql
  3. function getGql(endpoint) {
  4. return async function gql(query, variables = {}) {
  5. let headers = {
  6. 'Content-Type': 'application/json;charset=utf-8',
  7. 'Accept': 'application/json',
  8. }
  9. if (('authToken' in localStorage)) {
  10. headers.Authorization = 'Bearer ' + localStorage.authToken
  11. }
  12. let result = await fetch(endpoint, {
  13. method: 'POST',
  14. headers,
  15. body: JSON.stringify({
  16. query,
  17. variables
  18. })
  19. }).then(res => res.json())
  20. if (('errors' in result) && !('data' in result)) {
  21. throw new Error(JSON.stringify(result.errors))
  22. }
  23. result = Object.values(result.data)[0]
  24. return result
  25. }
  26. }
  27. const gql = getGql('http://hipstagram.node.ed.asmer.org.ua/graphql')
  28. // акшоны для promiseReducer
  29. export const actionPending = nameOfPromise => ({ nameOfPromise, type: 'PROMISE', status: 'PENDING' })
  30. export const actionFulfilled = (nameOfPromise, payload) => ({ nameOfPromise, type: 'PROMISE', status: 'FULFILLED', payload })
  31. export const actionRejected = (nameOfPromise, error) => ({ nameOfPromise, type: 'PROMISE', status: 'REJECTED', error })
  32. export const actionPromise = (nameOfPromise, promise) =>
  33. async dispatch => {
  34. dispatch(actionPending(nameOfPromise)) //сигнализируем redux, что промис начался
  35. try {
  36. const payload = await promise //ожидаем промиса
  37. dispatch(actionFulfilled(nameOfPromise, payload)) //сигнализируем redux, что промис успешно выполнен
  38. return payload //в месте запуска store.dispatch с этим thunk можно так же получить результат промиса
  39. }
  40. catch (error) {
  41. dispatch(actionRejected(nameOfPromise, error)) //в случае ошибки - сигнализируем redux, что промис несложился
  42. }
  43. }
  44. // =============================================================
  45. // запрос на поиск конкретного поста
  46. export const actionFindPostOne = _id => actionPromise('PostFindOne', gql(`query OnePostFind ($postOne: String){
  47. PostFindOne (query: $postOne) {
  48. _id createdAt title text likesCount
  49. images {
  50. url
  51. }
  52. comments {
  53. _id createdAt text answers {
  54. _id createdAt text likes {
  55. _id
  56. }
  57. likesCount owner {
  58. _id login nick avatar {
  59. _id url
  60. }
  61. }
  62. }
  63. likesCount
  64. }
  65. owner {
  66. _id login nick avatar {
  67. _id url
  68. }
  69. }
  70. }
  71. }`, {
  72. postOne: JSON.stringify([{ _id }])
  73. }))
  74. // запрос на поиск конкретного юзера
  75. export const actionFindUserOne = _id => actionPromise('UserFindOne', gql(`query OneUserFind ($userOne: String) {
  76. UserFindOne(query: $userOne) {
  77. _id createdAt login nick
  78. avatar {
  79. _id url
  80. }
  81. followers {
  82. _id login nick avatar {_id url}
  83. }
  84. following {
  85. _id login nick avatar {_id url}
  86. }
  87. }
  88. }`, {
  89. userOne: JSON.stringify([{ _id }])
  90. }))
  91. // запрос на поиск всех постов
  92. export const actionfindPosts = () => actionPromise('PostsFind', gql(`query AllPostsFind ($allPosts: String){
  93. PostFind(query: $allPosts){
  94. _id createdAt title text likesCount
  95. images {
  96. url
  97. }
  98. owner {
  99. _id login nick
  100. }
  101. }
  102. }`, {
  103. allPosts: JSON.stringify([{}])
  104. }))
  105. // =================
  106. // акшон для логинизации
  107. const actionAuthLogin = token => ({ type: 'AUTH_LOGIN', token })
  108. // акшон для раззлогинивания
  109. const actionAuthLogout = () => ({ type: 'AUTH_LOGOUT' })
  110. // Запрос на логин
  111. export const actionLogin = (login, password) => actionPromise('login', gql(`query Login($login: String!, $password: String!) {
  112. login(login: $login, password: $password)
  113. }`, {
  114. login,
  115. password
  116. }))
  117. // Запрос на логин и последующую логинизацию в authReduser (thunk)
  118. export const actionFullLogin = (login, password) =>
  119. async dispatch => {
  120. const token = await dispatch(actionLogin(login, password))
  121. try {
  122. if (token != null) {
  123. if (typeof (token) === 'string') {
  124. dispatch(actionAuthLogin(token))
  125. localStorage.authToken = token
  126. }
  127. }
  128. }
  129. catch (error) {
  130. console.log(error)
  131. }
  132. }
  133. // Запрос на поиск ленты
  134. export const actionFeedFindOne = (arr, sortOne) => actionPromise('feed', gql(`query FeedFindOne ($feedOne: String){
  135. PostFind(query: $feedOne){
  136. _id createdAt title text likesCount owner{
  137. _id login avatar{
  138. url
  139. }
  140. }
  141. comments {
  142. _id
  143. }
  144. images{
  145. url
  146. }
  147. }
  148. }`, {
  149. feedOne: JSON.stringify([{ ___owner: { $in: arr } }, { sort: [{ _id: sortOne }] }])
  150. }))