import { url } from "../../App" // функция getGql function getGql(endpoint) { return async function gql(query, variables = {}) { let headers = { 'Content-Type': 'application/json;charset=utf-8', 'Accept': 'application/json', } if (('authToken' in localStorage)) { headers.Authorization = 'Bearer ' + localStorage.authToken } let result = await fetch(endpoint, { method: 'POST', headers, body: JSON.stringify({ query, variables }) }).then(res => res.json()) if (('errors' in result) && !('data' in result)) { throw new Error(JSON.stringify(result.errors)) } result = Object.values(result.data)[0] return result } } const gql = getGql('http://hipstagram.node.ed.asmer.org.ua/graphql') // акшоны для promiseReducer export const actionPending = nameOfPromise => ({ nameOfPromise, type: 'PROMISE', status: 'PENDING' }) export const actionFulfilled = (nameOfPromise, payload) => ({ nameOfPromise, type: 'PROMISE', status: 'FULFILLED', payload }) export const actionRejected = (nameOfPromise, error) => ({ nameOfPromise, type: 'PROMISE', status: 'REJECTED', error }) export const actionPromise = (nameOfPromise, promise) => async dispatch => { dispatch(actionPending(nameOfPromise)) //сигнализируем redux, что промис начался try { const payload = await promise //ожидаем промиса dispatch(actionFulfilled(nameOfPromise, payload)) //сигнализируем redux, что промис успешно выполнен return payload //в месте запуска store.dispatch с этим thunk можно так же получить результат промиса } catch (error) { dispatch(actionRejected(nameOfPromise, error)) //в случае ошибки - сигнализируем redux, что промис несложился } } // ============================================================= // запрос на поиск конкретного поста export const actionFindPostOne = _id => actionPromise('PostFindOne', gql(`query OnePostFind ($postOne: String){ PostFindOne (query: $postOne) { _id createdAt title text likesCount images { url } comments { _id createdAt text answers { _id createdAt text likes { _id } likesCount owner { _id login nick avatar { _id url } } } likesCount } owner { _id login nick avatar { _id url } } } }`, { postOne: JSON.stringify([{ _id }]) })) // запрос на поиск конкретного юзера export const actionFindUserOne = _id => actionPromise('UserFindOne', gql(`query OneUserFind ($userOne: String) { UserFindOne(query: $userOne) { _id createdAt login nick avatar { _id url } followers { _id login nick avatar {_id url} } following { _id login nick avatar {_id url} } } }`, { userOne: JSON.stringify([{ _id }]) })) // запрос на поиск всех постов export const actionfindPosts = () => actionPromise('PostsFind', gql(`query AllPostsFind ($allPosts: String){ PostFind(query: $allPosts){ _id createdAt title text likesCount images { url } owner { _id login nick } } }`, { allPosts: JSON.stringify([{}]) })) // ================= // акшон для логинизации const actionAuthLogin = token => ({ type: 'AUTH_LOGIN', token }) // акшон для раззлогинивания const actionAuthLogout = () => ({ type: 'AUTH_LOGOUT' }) // Запрос на логин export const actionLogin = (login, password) => actionPromise('login', gql(`query Login($login: String!, $password: String!) { login(login: $login, password: $password) }`, { login, password })) // Запрос на логин и последующую логинизацию в authReduser (thunk) export const actionFullLogin = (login, password) => async dispatch => { const token = await dispatch(actionLogin(login, password)) try { if (token != null) { if (typeof (token) === 'string') { dispatch(actionAuthLogin(token)) localStorage.authToken = token } } } catch (error) { console.log(error) } } // Запрос на поиск ленты export const actionFeedFindOne = (arr, sortOne) => actionPromise('feed', gql(`query FeedFindOne ($feedOne: String){ PostFind(query: $feedOne){ _id createdAt title text likesCount owner{ _id login avatar{ url } } comments { _id } images{ url } } }`, { feedOne: JSON.stringify([{ ___owner: { $in: arr } }, { sort: [{ _id: sortOne }] }]) }))