123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178 |
- 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 }] }])
- }))
|