index.js 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. import {createStore, combineReducers, applyMiddleware} from 'redux';
  2. import thunk from 'redux-thunk';
  3. import createHistory from "history/createBrowserHistory";
  4. export const history = createHistory()
  5. const getGQL = url =>
  6. async (query, variables = {}) => {
  7. let obj = await fetch(url, {
  8. method: 'POST',
  9. headers: {
  10. "Content-Type": "application/json",
  11. Authorization: localStorage.authToken ? 'Bearer ' + localStorage.authToken : {},
  12. },
  13. body: JSON.stringify({ query, variables })
  14. })
  15. let a = await obj.json()
  16. if (!a.data && a.errors)
  17. throw new Error(JSON.stringify(a.errors))
  18. return a.data[Object.keys(a.data)[0]]
  19. }
  20. export const backURL = 'http://player.asmer.fs.a-level.com.ua'
  21. export const gql = getGQL(backURL + '/graphql');
  22. const jwtDecode = token => {
  23. try {
  24. let arrToken = token.split('.')
  25. let base64Token = atob(arrToken[1])
  26. return JSON.parse(base64Token)
  27. }
  28. catch (e) {
  29. console.log('Лажа, Бро ' + e);
  30. }
  31. }
  32. function authReducer(state, { type, token }) {
  33. if (!state) {
  34. if (localStorage.authToken) {
  35. type = 'AUTH_LOGIN'
  36. token = localStorage.authToken
  37. } else state = {}
  38. }
  39. if (type === 'AUTH_LOGIN') {
  40. localStorage.setItem('authToken', token)
  41. let payload = jwtDecode(token)
  42. if (typeof payload === 'object') {
  43. return {
  44. ...state,
  45. token,
  46. payload
  47. }
  48. } else return state
  49. }
  50. if (type === 'AUTH_LOGOUT') {
  51. localStorage.removeItem('authToken')
  52. return {}
  53. }
  54. return state
  55. }
  56. const actionLogin = (login, password) => {
  57. return actionPromise(
  58. "login",
  59. gql(
  60. `query log($login:String!, $password:String!) {
  61. login(login:$login, password:$password)
  62. }`,
  63. {login, password }
  64. )
  65. );
  66. };
  67. function promiseReducer(state = {}, { type, status, payload, error, name }) {
  68. if (type === 'PROMISE') {
  69. return {
  70. ...state,
  71. [name]: { status, payload, error }
  72. }
  73. }
  74. return state;
  75. }
  76. const actionAuthLogin = token => ({ type: 'AUTH_LOGIN', token })
  77. export const actionAuthLogout = () => ({ type: 'AUTH_LOGOUT' })
  78. export const actionFullLogin = (login, password) =>
  79. async function i(dispatch) {
  80. let token = await dispatch(actionLogin(login, password));
  81. if (token) {
  82. dispatch(actionAuthLogin(token));
  83. }
  84. }
  85. const actionPending = name => ({ type: 'PROMISE', status: 'PENDING', name })
  86. const actionResolved = (name, payload) => ({ type: 'PROMISE', status: 'RESOLVED', name, payload })
  87. const actionRejected = (name, error) => ({ type: 'PROMISE', status: 'REJECTED', name, error })
  88. export const actionPromise = (name, promise) =>
  89. async dispatch => {
  90. dispatch(actionPending(name))
  91. try {
  92. let data = await promise
  93. dispatch(actionResolved(name, data))
  94. return data
  95. }
  96. catch (error) {
  97. dispatch(actionRejected(name, error))
  98. }
  99. }
  100. export const actionFullReg = (login, password) =>
  101. async function a(dispatch) {
  102. try {
  103. await dispatch(actionReg(login, password));
  104. } catch (e) {
  105. return 0;
  106. }
  107. await dispatch(actionFullLogin(login, password));
  108. }
  109. const actionReg = (login, password) => {
  110. return actionPromise(
  111. "reg",
  112. gql(
  113. `mutation reg($l: String!, $p: String!){
  114. createUser(login: $l, password:$p){
  115. _id login
  116. }
  117. }`,
  118. { l: login, p: password }
  119. )
  120. );
  121. };
  122. const store = createStore(combineReducers({promise: promiseReducer,
  123. auth: authReducer,}),
  124. applyMiddleware(thunk))
  125. store.subscribe(() => console.log(store.getState()))
  126. export default store