links.ts 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  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, APIv2 } from "../consts";
  6. export interface Link {
  7. id: string;
  8. address: string;
  9. banned: boolean;
  10. banned_by_id?: number;
  11. created_at: string;
  12. link: string;
  13. domain?: string;
  14. domain_id?: number;
  15. password?: string;
  16. target: string;
  17. updated_at: string;
  18. user_id?: number;
  19. visit_count: number;
  20. }
  21. export interface NewLink {
  22. target: string;
  23. customurl?: string;
  24. password?: string;
  25. domain?: string;
  26. reuse?: boolean;
  27. reCaptchaToken?: string;
  28. }
  29. export interface BanLink {
  30. id: string;
  31. host?: boolean;
  32. domain?: boolean;
  33. user?: boolean;
  34. userLinks?: boolean;
  35. }
  36. export interface EditLink {
  37. id: string;
  38. target: string;
  39. address: string;
  40. }
  41. export interface LinksQuery {
  42. limit: string;
  43. skip: string;
  44. search: string;
  45. all: boolean;
  46. }
  47. export interface LinksListRes {
  48. data: Link[];
  49. total: number;
  50. limit: number;
  51. skip: number;
  52. }
  53. export interface Links {
  54. link?: Link;
  55. items: Link[];
  56. total: number;
  57. loading: boolean;
  58. submit: Thunk<Links, NewLink>;
  59. get: Thunk<Links, LinksQuery>;
  60. add: Action<Links, Link>;
  61. set: Action<Links, LinksListRes>;
  62. update: Action<Links, Partial<Link>>;
  63. remove: Thunk<Links, string>;
  64. edit: Thunk<Links, EditLink>;
  65. ban: Thunk<Links, BanLink>;
  66. setLoading: Action<Links, boolean>;
  67. }
  68. export const links: Links = {
  69. link: null,
  70. items: [],
  71. total: 0,
  72. loading: true,
  73. submit: thunk(async (actions, payload) => {
  74. const data = Object.fromEntries(
  75. Object.entries(payload).filter(([, value]) => value !== "")
  76. );
  77. const res = await axios.post(APIv2.Links, data, getAxiosConfig());
  78. actions.add(res.data);
  79. return res.data;
  80. }),
  81. get: thunk(async (actions, payload) => {
  82. actions.setLoading(true);
  83. const res = await axios.get(
  84. `${APIv2.Links}?${query.stringify(payload)}`,
  85. getAxiosConfig()
  86. );
  87. actions.set(res.data);
  88. actions.setLoading(false);
  89. return res.data;
  90. }),
  91. remove: thunk(async (actions, id) => {
  92. await axios.delete(`${APIv2.Links}/${id}`, getAxiosConfig());
  93. }),
  94. ban: thunk(async (actions, { id, ...payload }) => {
  95. const res = await axios.post(
  96. `${APIv2.Links}/admin/ban/${id}`,
  97. payload,
  98. getAxiosConfig()
  99. );
  100. actions.update({ id, banned: true });
  101. return res.data;
  102. }),
  103. edit: thunk(async (actions, { id, ...payload }) => {
  104. const res = await axios.patch(
  105. `${APIv2.Links}/${id}`,
  106. payload,
  107. getAxiosConfig()
  108. );
  109. actions.update(res.data);
  110. }),
  111. add: action((state, payload) => {
  112. state.items.pop();
  113. state.items.unshift(payload);
  114. }),
  115. set: action((state, payload) => {
  116. state.items = payload.data;
  117. state.total = payload.total;
  118. }),
  119. update: action((state, payload) => {
  120. state.items = state.items.map(item =>
  121. item.id === payload.id ? { ...item, ...payload } : item
  122. );
  123. }),
  124. setLoading: action((state, payload) => {
  125. state.loading = payload;
  126. })
  127. };