links.ts 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  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: number;
  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 LinksQuery {
  30. limit: string;
  31. skip: string;
  32. search: string;
  33. all: boolean;
  34. }
  35. export interface LinksListRes {
  36. data: Link[];
  37. total: number;
  38. limit: number;
  39. skip: number;
  40. }
  41. export interface Links {
  42. link?: Link;
  43. items: Link[];
  44. total: number;
  45. loading: boolean;
  46. submit: Thunk<Links, NewLink>;
  47. get: Thunk<Links, LinksQuery>;
  48. add: Action<Links, Link>;
  49. set: Action<Links, LinksListRes>;
  50. deleteOne: Thunk<Links, { id: string; domain?: string }>;
  51. setLoading: Action<Links, boolean>;
  52. }
  53. export const links: Links = {
  54. link: null,
  55. items: [],
  56. total: 0,
  57. loading: true,
  58. submit: thunk(async (actions, payload) => {
  59. const data = Object.fromEntries(
  60. Object.entries(payload).filter(([, value]) => value !== "")
  61. );
  62. const res = await axios.post(APIv2.Links, data, getAxiosConfig());
  63. actions.add(res.data);
  64. return res.data;
  65. }),
  66. get: thunk(async (actions, payload) => {
  67. actions.setLoading(true);
  68. const res = await axios.get(
  69. `${APIv2.Links}?${query.stringify(payload)}`,
  70. getAxiosConfig()
  71. );
  72. actions.set(res.data);
  73. actions.setLoading(false);
  74. return res.data;
  75. }),
  76. deleteOne: thunk(async (actions, payload) => {
  77. await axios.post(API.DELETE_LINK, payload, getAxiosConfig());
  78. }),
  79. add: action((state, payload) => {
  80. state.items.pop();
  81. state.items.unshift(payload);
  82. }),
  83. set: action((state, payload) => {
  84. state.items = payload.data;
  85. state.total = payload.total;
  86. }),
  87. setLoading: action((state, payload) => {
  88. state.loading = payload;
  89. })
  90. };