mirror of
https://github.com/MHSanaei/3x-ui.git
synced 2026-07-16 01:26:07 +00:00
bc309ed9f8
Drop the axios (and qs) dependencies in favor of a native fetch wrapper.
axios only ever handled same-origin JSON/form calls, a CSRF header, a 401
redirect, and a 403-retry, all of which the platform now provides directly.
- New src/api/http-init.ts (replaces axios-init.ts) reimplements the
request/response interceptors on fetch: base-path prefixing,
X-Requested-With, same-origin credentials, the CSRF token on unsafe
methods, a single 403 retry with token refresh, and the 401
redirect-and-latch. A small encodeForm() reproduces qs's
arrayFormat:'repeat' encoding, so the request wire format is unchanged.
- HttpUtil (src/utils/index.ts) keeps its public signatures and the Msg
envelope, so the ~49 API call sites are untouched. HttpOptions is now
hand-rolled instead of extending AxiosRequestConfig.
- PanelUpdateModal drops its lone direct axios.get in favor of HttpUtil.get
with { silent, timeout }.
- Add tests for the fetch core (CSRF header, form/JSON/FormData bodies,
base-path prefix, 403 retry, 401 redirect, tolerant body parse) and for
HttpUtil's envelope unwrap / toast / error mapping; this logic was
previously untested.
- Remove the vendor-axios manualChunks branch and the qs type shim, and
reword stale "axios" mentions in docs and route comments.
69 lines
2.0 KiB
TypeScript
69 lines
2.0 KiB
TypeScript
/// <reference types="vite/client" />
|
|
|
|
interface SubPageData {
|
|
sId?: string;
|
|
enabled?: boolean;
|
|
download?: string;
|
|
upload?: string;
|
|
total?: string;
|
|
used?: string;
|
|
remained?: string;
|
|
totalByte?: string | number;
|
|
expire?: string | number;
|
|
lastOnline?: string | number;
|
|
subUrl?: string;
|
|
subJsonUrl?: string;
|
|
subClashUrl?: string;
|
|
subTitle?: string;
|
|
links?: string[];
|
|
emails?: string[];
|
|
datepicker?: 'gregorian' | 'jalalian';
|
|
announce?: string;
|
|
downloadByte?: string | number;
|
|
uploadByte?: string | number;
|
|
usedByte?: string | number;
|
|
}
|
|
|
|
interface Window {
|
|
X_UI_BASE_PATH?: string;
|
|
X_UI_CUR_VER?: string;
|
|
X_UI_DB_TYPE?: string;
|
|
__SUB_PAGE_DATA__?: SubPageData;
|
|
}
|
|
|
|
declare module 'persian-calendar-suite' {
|
|
import type { ComponentType, ReactNode } from 'react';
|
|
|
|
type DateInput = string | number | null;
|
|
type OutputFormat = 'iso' | 'shamsi' | 'gregorian' | 'hijri' | 'timestamp';
|
|
|
|
interface PersianDateTimePickerProps {
|
|
value?: DateInput;
|
|
onChange?: (value: number | string | null) => void;
|
|
defaultValue?: string | number | 'now' | null;
|
|
showTime?: boolean;
|
|
minuteStep?: number;
|
|
outputFormat?: OutputFormat;
|
|
showFooter?: boolean;
|
|
theme?: Record<string, unknown>;
|
|
disabledHours?: number[];
|
|
minDate?: string | Date | null;
|
|
maxDate?: string | Date | null;
|
|
enabledDates?: string[] | null;
|
|
disabledDates?: string[] | null;
|
|
disabledWeekDays?: number[];
|
|
persianNumbers?: boolean;
|
|
rtlCalendar?: boolean;
|
|
placeholder?: string;
|
|
disabled?: boolean;
|
|
className?: string;
|
|
children?: ReactNode;
|
|
}
|
|
|
|
export const PersianDateTimePicker: ComponentType<PersianDateTimePickerProps>;
|
|
export const PersianCalendar: ComponentType<Record<string, unknown>>;
|
|
export const PersianDateRangePicker: ComponentType<Record<string, unknown>>;
|
|
export const PersianTimePicker: ComponentType<Record<string, unknown>>;
|
|
export const PersianTimeline: ComponentType<Record<string, unknown>>;
|
|
}
|