links.ts 3.1 KB

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