links.ts 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  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 LinksQuery {
  37. limit: string;
  38. skip: string;
  39. search: string;
  40. all: boolean;
  41. }
  42. export interface LinksListRes {
  43. data: Link[];
  44. total: number;
  45. limit: number;
  46. skip: number;
  47. }
  48. export interface Links {
  49. link?: Link;
  50. items: Link[];
  51. total: number;
  52. loading: boolean;
  53. submit: Thunk<Links, NewLink>;
  54. get: Thunk<Links, LinksQuery>;
  55. add: Action<Links, Link>;
  56. set: Action<Links, LinksListRes>;
  57. update: Action<Links, Partial<Link>>;
  58. remove: Thunk<Links, string>;
  59. ban: Thunk<Links, BanLink>;
  60. setLoading: Action<Links, boolean>;
  61. }
  62. export const links: Links = {
  63. link: null,
  64. items: [],
  65. total: 0,
  66. loading: true,
  67. submit: thunk(async (actions, payload) => {
  68. const data = Object.fromEntries(
  69. Object.entries(payload).filter(([, value]) => value !== "")
  70. );
  71. const res = await axios.post(APIv2.Links, data, getAxiosConfig());
  72. actions.add(res.data);
  73. return res.data;
  74. }),
  75. get: thunk(async (actions, payload) => {
  76. actions.setLoading(true);
  77. const res = await axios.get(
  78. `${APIv2.Links}?${query.stringify(payload)}`,
  79. getAxiosConfig()
  80. );
  81. actions.set(res.data);
  82. actions.setLoading(false);
  83. return res.data;
  84. }),
  85. remove: thunk(async (actions, id) => {
  86. await axios.delete(`${APIv2.Links}/${id}`, getAxiosConfig());
  87. }),
  88. ban: thunk(async (actions, { id, ...payload }) => {
  89. const res = await axios.post(
  90. `${APIv2.Links}/admin/ban/${id}`,
  91. payload,
  92. getAxiosConfig()
  93. );
  94. actions.update({ id, banned: true });
  95. return res.data;
  96. }),
  97. add: action((state, payload) => {
  98. state.items.pop();
  99. state.items.unshift(payload);
  100. }),
  101. set: action((state, payload) => {
  102. state.items = payload.data;
  103. state.total = payload.total;
  104. }),
  105. update: action((state, payload) => {
  106. state.items = state.items.map(item =>
  107. item.id === payload.id ? { ...item, ...payload } : item
  108. );
  109. }),
  110. setLoading: action((state, payload) => {
  111. state.loading = payload;
  112. })
  113. };