| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121 |
- import { action, Action, thunk, Thunk } from "easy-peasy";
- import axios from "axios";
- import query from "query-string";
- import { getAxiosConfig } from "../utils";
- import { API, APIv2 } from "../consts";
- export interface Link {
- id: string;
- address: string;
- banned: boolean;
- banned_by_id?: number;
- created_at: string;
- link: string;
- domain?: string;
- domain_id?: number;
- password?: string;
- target: string;
- updated_at: string;
- user_id?: number;
- visit_count: number;
- }
- export interface NewLink {
- target: string;
- customurl?: string;
- password?: string;
- domain?: string;
- reuse?: boolean;
- reCaptchaToken?: string;
- }
- export interface BanLink {
- id: string;
- host?: boolean;
- domain?: boolean;
- user?: boolean;
- userLinks?: boolean;
- }
- export interface LinksQuery {
- limit: string;
- skip: string;
- search: string;
- all: boolean;
- }
- export interface LinksListRes {
- data: Link[];
- total: number;
- limit: number;
- skip: number;
- }
- export interface Links {
- link?: Link;
- items: Link[];
- total: number;
- loading: boolean;
- submit: Thunk<Links, NewLink>;
- get: Thunk<Links, LinksQuery>;
- add: Action<Links, Link>;
- set: Action<Links, LinksListRes>;
- update: Action<Links, Partial<Link>>;
- remove: Thunk<Links, string>;
- ban: Thunk<Links, BanLink>;
- setLoading: Action<Links, boolean>;
- }
- export const links: Links = {
- link: null,
- items: [],
- total: 0,
- loading: true,
- submit: thunk(async (actions, payload) => {
- const data = Object.fromEntries(
- Object.entries(payload).filter(([, value]) => value !== "")
- );
- const res = await axios.post(APIv2.Links, data, getAxiosConfig());
- actions.add(res.data);
- return res.data;
- }),
- get: thunk(async (actions, payload) => {
- actions.setLoading(true);
- const res = await axios.get(
- `${APIv2.Links}?${query.stringify(payload)}`,
- getAxiosConfig()
- );
- actions.set(res.data);
- actions.setLoading(false);
- return res.data;
- }),
- remove: thunk(async (actions, id) => {
- await axios.delete(`${APIv2.Links}/${id}`, getAxiosConfig());
- }),
- ban: thunk(async (actions, { id, ...payload }) => {
- const res = await axios.post(
- `${APIv2.Links}/admin/ban/${id}`,
- payload,
- getAxiosConfig()
- );
- actions.update({ id, banned: true });
- return res.data;
- }),
- add: action((state, payload) => {
- state.items.pop();
- state.items.unshift(payload);
- }),
- set: action((state, payload) => {
- state.items = payload.data;
- state.total = payload.total;
- }),
- update: action((state, payload) => {
- state.items = state.items.map(item =>
- item.id === payload.id ? { ...item, ...payload } : item
- );
- }),
- setLoading: action((state, payload) => {
- state.loading = payload;
- })
- };
|