yearning
11 小时以前 3f96c9c6502243b06efd4bb34a189e72e3a5557c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
export type ScoreListQuery = {
  name?: string;
  id_card?: string;
  subject?: string;
  page?: number;
  page_size?: number;
};
 
export function readScoreListQuery(search: string | URLSearchParams): ScoreListQuery {
  const sp = typeof search === "string" ? new URLSearchParams(search) : search;
  const page = parseInt(sp.get("page") || "1", 10);
  const page_size = parseInt(sp.get("page_size") || "20", 10);
  return {
    name: sp.get("name") || undefined,
    id_card: sp.get("id_card") || undefined,
    subject: sp.get("subject") || undefined,
    page: Number.isFinite(page) && page > 0 ? page : 1,
    page_size: Number.isFinite(page_size) && page_size > 0 ? page_size : 20,
  };
}
 
export function writeScoreListQuery(q: ScoreListQuery): URLSearchParams {
  const sp = new URLSearchParams();
  if (q.name) sp.set("name", q.name);
  if (q.id_card) sp.set("id_card", q.id_card);
  if (q.subject) sp.set("subject", q.subject);
  if (q.page && q.page > 1) sp.set("page", String(q.page));
  if (q.page_size && q.page_size !== 20) sp.set("page_size", String(q.page_size));
  return sp;
}
 
export function scoresListPath(q: ScoreListQuery = {}): string {
  const s = writeScoreListQuery(q).toString();
  return s ? `/scores?${s}` : "/scores";
}
 
export function attemptDetailPath(attemptId: string, q: ScoreListQuery = {}): string {
  const s = writeScoreListQuery(q).toString();
  return s ? `/attempts/${attemptId}?${s}` : `/attempts/${attemptId}`;
}