feat: redesign routed ZarinPal merchant dashboard

This commit is contained in:
2026-08-20 21:41:18 +03:30
parent d8eeff57cd
commit 9ce2e6ec83
183 changed files with 7991 additions and 1569 deletions

View File

@@ -4,6 +4,10 @@ export type AuthSession = components['schemas']['AuthSession'];
export type ReportingPeriod = components['schemas']['ReportingPeriod'];
export type AnalyticsRun = components['schemas']['AnalyticsRun'];
export type SessionDetailPage = components['schemas']['SessionDetailPage'];
export type SessionDetail = components['schemas']['SessionDetail'];
export type Terminal = components['schemas']['Terminal'];
export type TerminalList = components['schemas']['TerminalList'];
export type SessionStatus = components['schemas']['SessionStatus'];
export type DetailView = components['schemas']['DetailView'];
export type FailureStage = components['schemas']['FailureStage'];
export type Problem = components['schemas']['Problem'];
@@ -61,14 +65,17 @@ export const api = {
periods() {
return request<components['schemas']['PeriodList']>('/analytics/periods');
},
startRun(periodId: string, csrfToken: string) {
terminals() {
return request<TerminalList>('/analytics/terminals');
},
startRun(periodId: string, csrfToken: string, terminalId?: string) {
return request<AnalyticsRun>('/analytics/runs', {
method: 'POST',
headers: {
'X-CSRF-Token': csrfToken,
'Idempotency-Key': crypto.randomUUID(),
},
body: JSON.stringify({ periodId }),
body: JSON.stringify({ periodId, ...(terminalId ? { terminalId } : {}) }),
});
},
run(runId: string) {
@@ -86,15 +93,49 @@ export const api = {
},
);
},
details(periodId: string, view: DetailView, cursor?: string, failureStage?: FailureStage) {
details(
periodId: string,
view: DetailView,
options: {
cursor?: string;
failureStage?: FailureStage;
terminalId?: string;
status?: SessionStatus;
minAmountRial?: number;
maxAmountRial?: number;
limit?: number;
} = {},
) {
const query = new URLSearchParams({ periodId, view, limit: '25' });
if (cursor) query.set('cursor', cursor);
if (failureStage) query.set('failureStage', failureStage);
if (options.cursor) query.set('cursor', options.cursor);
if (options.failureStage) query.set('failureStage', options.failureStage);
if (options.terminalId) query.set('terminalId', options.terminalId);
if (options.status) query.set('status', options.status);
if (options.minAmountRial !== undefined) query.set('minAmountRial', String(options.minAmountRial));
if (options.maxAmountRial !== undefined) query.set('maxAmountRial', String(options.maxAmountRial));
if (options.limit) query.set('limit', String(options.limit));
return request<SessionDetailPage>(`/analytics/session-details?${query}`);
},
exportUrl(periodId: string, view: DetailView, failureStage?: FailureStage) {
sessionDetail(sessionId: string) {
return request<SessionDetail>(`/analytics/sessions/${encodeURIComponent(sessionId)}`);
},
exportUrl(
periodId: string,
view: DetailView,
options: {
failureStage?: FailureStage;
terminalId?: string;
status?: SessionStatus;
minAmountRial?: number;
maxAmountRial?: number;
} = {},
) {
const query = new URLSearchParams({ periodId, view });
if (failureStage) query.set('failureStage', failureStage);
if (options.failureStage) query.set('failureStage', options.failureStage);
if (options.terminalId) query.set('terminalId', options.terminalId);
if (options.status) query.set('status', options.status);
if (options.minAmountRial !== undefined) query.set('minAmountRial', String(options.minAmountRial));
if (options.maxAmountRial !== undefined) query.set('maxAmountRial', String(options.maxAmountRial));
return `${apiBase}/analytics/session-details.csv?${query}`;
},
};

2699
src/lib/api/schema.d.ts vendored

File diff suppressed because it is too large Load Diff