links.ts 3.2 KB

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