index.js 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. import { combineReducers } from 'redux';
  2. import * as types from '../actions/actionTypes';
  3. const initialState = {
  4. list: [],
  5. isShortened: false,
  6. count: 10,
  7. countAll: 0,
  8. page: 1,
  9. search: '',
  10. };
  11. const url = (state = initialState, action) => {
  12. const { count, page, search } = action.payload || {};
  13. const isSearch = typeof search !== 'undefined';
  14. switch (action.type) {
  15. case types.ADD_URL:
  16. return { ...state, isShortened: true, list: [action.payload, ...state.list] };
  17. case types.UPDATE_URL_LIST:
  18. return Object.assign({}, state, count && { count }, page && { page }, isSearch && { search });
  19. case types.LIST_URLS:
  20. return {
  21. ...state,
  22. list: action.payload.list,
  23. countAll: action.payload.countAll,
  24. isShortened: false,
  25. };
  26. case types.DELETE_URL:
  27. return { ...state, list: state.list.filter(item => item.id !== action.payload) };
  28. case types.UNAUTH_USER:
  29. return initialState;
  30. default:
  31. return state;
  32. }
  33. };
  34. /* All errors */
  35. const errorInitialState = {
  36. auth: '',
  37. domain: '',
  38. shortener: '',
  39. };
  40. const error = (state = errorInitialState, action) => {
  41. switch (action.type) {
  42. case types.SHORTENER_ERROR:
  43. return { ...state, shortener: action.payload };
  44. case types.DOMAIN_ERROR:
  45. return { ...state, domain: action.payload };
  46. case types.SET_DOMAIN:
  47. return { ...state, domain: '' };
  48. case types.SHOW_DOMAIN_INPUT:
  49. return { ...state, domain: '' };
  50. case types.ADD_URL:
  51. return { ...state, shortener: '' };
  52. case types.UPDATE_URL:
  53. return { ...state, urlOptions: '' };
  54. case types.AUTH_ERROR:
  55. return { ...state, auth: action.payload };
  56. case types.AUTH_USER:
  57. return { ...state, auth: '' };
  58. case types.HIDE_PAGE_LOADING:
  59. return {
  60. ...state,
  61. auth: '',
  62. shortener: '',
  63. urlOptions: '',
  64. };
  65. default:
  66. return state;
  67. }
  68. };
  69. /* All loadings */
  70. const loadingInitialState = {
  71. api: false,
  72. domain: false,
  73. shortener: false,
  74. login: false,
  75. page: false,
  76. table: false,
  77. signup: false,
  78. };
  79. const loading = (state = loadingInitialState, action) => {
  80. switch (action.type) {
  81. case types.SHOW_PAGE_LOADING:
  82. return { ...state, page: true };
  83. case types.HIDE_PAGE_LOADING:
  84. return {
  85. shortener: false,
  86. login: false,
  87. page: false,
  88. signup: false,
  89. };
  90. case types.TABLE_LOADING:
  91. return { ...state, table: true };
  92. case types.LOGIN_LOADING:
  93. return { ...state, login: true };
  94. case types.SIGNUP_LOADING:
  95. return { ...state, signup: true };
  96. case types.SHORTENER_LOADING:
  97. return { ...state, shortener: true };
  98. case types.ADD_URL:
  99. return { ...state, shortener: false };
  100. case types.SHORTENER_ERROR:
  101. return { ...state, shortener: false };
  102. case types.LIST_URLS:
  103. return { ...state, table: false };
  104. case types.DELETE_URL:
  105. return { ...state, table: false };
  106. case types.AUTH_ERROR:
  107. return { ...state, login: false, signup: false };
  108. case types.AUTH_USER:
  109. return { ...state, login: false, signup: false };
  110. case types.DOMAIN_LOADING:
  111. return { ...state, domain: true };
  112. case types.SET_DOMAIN:
  113. return { ...state, domain: false };
  114. case types.DOMAIN_ERROR:
  115. return { ...state, domain: false };
  116. case types.API_LOADING:
  117. return { ...state, api: true };
  118. case types.SET_APIKEY:
  119. return { ...state, api: false };
  120. default:
  121. return state;
  122. }
  123. };
  124. /* User authentication */
  125. const authInitialState = {
  126. isAuthenticated: false,
  127. sentVerification: false,
  128. user: '',
  129. renew: false,
  130. };
  131. const auth = (state = authInitialState, action) => {
  132. switch (action.type) {
  133. case types.AUTH_USER:
  134. return {
  135. ...state,
  136. isAuthenticated: true,
  137. user: action.payload,
  138. sentVerification: false,
  139. };
  140. case types.AUTH_RENEW:
  141. return { ...state, renew: true };
  142. case types.UNAUTH_USER:
  143. return authInitialState;
  144. case types.SENT_VERIFICATION:
  145. return { ...state, sentVerification: true, user: action.payload };
  146. default:
  147. return state;
  148. }
  149. };
  150. /* Settings */
  151. const settingsInitialState = {
  152. apikey: '',
  153. customDomain: '',
  154. domainInput: true,
  155. };
  156. const settings = (state = settingsInitialState, action) => {
  157. switch (action.type) {
  158. case types.SET_DOMAIN:
  159. return { ...state, customDomain: action.payload, domainInput: false };
  160. case types.SET_APIKEY:
  161. return { ...state, apikey: action.payload };
  162. case types.DELETE_DOMAIN:
  163. return { ...state, customDomain: '', domainInput: true };
  164. case types.SHOW_DOMAIN_INPUT:
  165. return { ...state, domainInput: true };
  166. case types.UNAUTH_USER:
  167. return settingsInitialState;
  168. default:
  169. return state;
  170. }
  171. };
  172. const rootReducer = combineReducers({
  173. auth,
  174. error,
  175. loading,
  176. settings,
  177. url,
  178. });
  179. export default rootReducer;