links.ts 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. import { action, Action, thunk, Thunk } from "easy-peasy";
  2. import axios from "axios";
  3. import query from "query-string";
  4. import { getAxiosConfig } from "../utils";
  5. import { API } from "../consts";
  6. import { string } from "prop-types";
  7. export interface Link {
  8. id: number;
  9. address: string;
  10. banned: boolean;
  11. banned_by_id?: number;
  12. created_at: string;
  13. shortLink: string;
  14. domain?: string;
  15. domain_id?: number;
  16. password?: string;
  17. target: string;
  18. updated_at: string;
  19. user_id?: number;
  20. visit_count: number;
  21. }
  22. export interface NewLink {
  23. target: string;
  24. customurl?: string;
  25. password?: string;
  26. reuse?: boolean;
  27. reCaptchaToken?: string;
  28. }
  29. export interface LinksQuery {
  30. count?: string;
  31. page?: string;
  32. search?: string;
  33. }
  34. export interface LinksListRes {
  35. list: Link[];
  36. countAll: number;
  37. }
  38. export interface Links {
  39. link?: Link;
  40. items: Link[];
  41. total: number;
  42. loading: boolean;
  43. submit: Thunk<Links, NewLink>;
  44. get: Thunk<Links, LinksQuery>;
  45. add: Action<Links, Link>;
  46. set: Action<Links, LinksListRes>;
  47. deleteOne: Thunk<Links, { id: string; domain?: string }>;
  48. setLoading: Action<Links, boolean>;
  49. }
  50. export const links: Links = {
  51. link: null,
  52. items: [],
  53. total: 0,
  54. loading: true,
  55. submit: thunk(async (actions, payload) => {
  56. const res = await axios.post(API.SUBMIT, payload, getAxiosConfig());
  57. actions.add(res.data);
  58. return res.data;
  59. }),
  60. get: thunk(async (actions, payload) => {
  61. actions.setLoading(true);
  62. const res = await axios.get(
  63. `${API.GET_LINKS}?${query.stringify(payload)}`,
  64. getAxiosConfig()
  65. );
  66. actions.set(res.data);
  67. actions.setLoading(false);
  68. return res.data;
  69. }),
  70. deleteOne: thunk(async (actions, payload) => {
  71. await axios.post(API.DELETE_LINK, payload, getAxiosConfig());
  72. }),
  73. add: action((state, payload) => {
  74. state.items.pop();
  75. state.items.unshift(payload);
  76. }),
  77. set: action((state, payload) => {
  78. state.items = payload.list;
  79. state.total = payload.countAll;
  80. }),
  81. setLoading: action((state, payload) => {
  82. state.loading = payload;
  83. })
  84. };