Repository navigation
Expand file tree
/
Copy pathpullRequestListPreferences.ts
More file actions
120 lines (109 loc) · 4.04 KB
/
Copy pathpullRequestListPreferences.ts
File metadata and controls
120 lines (109 loc) · 4.04 KB
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
import * as Schema from "effect/Schema";
import {
EnvironmentId,
ProjectId,
PullRequestInvolvement,
PullRequestListFilters,
PullRequestListState,
} from "@t3tools/contracts";
export const PullRequestListSort = Schema.Literals([
"ready",
"blocked",
"updated",
"newest",
"oldest",
"largest",
"smallest",
]);
export type PullRequestListSort = typeof PullRequestListSort.Type;
export interface PullRequestListPreferences {
readonly involvement: PullRequestInvolvement;
readonly state: PullRequestListState;
readonly environmentId?: EnvironmentId;
readonly projectId?: ProjectId;
readonly host?: string;
readonly q?: string | undefined;
readonly draft?: "only" | "hide";
readonly review?: NonNullable<PullRequestListFilters["review"]>;
readonly checks?: NonNullable<PullRequestListFilters["checks"]>;
readonly author?: string;
readonly labels?: ReadonlyArray<string>;
readonly sort?: PullRequestListSort;
}
export type PullRequestListPreferencePatch = {
[Key in keyof PullRequestListPreferences]?: PullRequestListPreferences[Key] | undefined;
};
const DEFAULT_PULL_REQUEST_LIST_PREFERENCES = {
involvement: "all",
state: "open",
} as const satisfies PullRequestListPreferences;
const BoundedPreference = Schema.String.check(Schema.isMaxLength(200));
const PullRequestListPreferencesSchema = Schema.Struct({
involvement: PullRequestInvolvement,
state: PullRequestListState,
environmentId: Schema.optional(EnvironmentId),
projectId: Schema.optional(ProjectId),
host: Schema.optional(BoundedPreference),
q: Schema.optional(BoundedPreference),
draft: PullRequestListFilters.fields.draft,
review: PullRequestListFilters.fields.review,
checks: PullRequestListFilters.fields.checks,
author: Schema.optional(BoundedPreference),
labels: Schema.optional(Schema.Array(BoundedPreference).check(Schema.isMaxLength(10))),
sort: Schema.optional(PullRequestListSort),
});
const decodePullRequestListPreferences = Schema.decodeUnknownOption(
PullRequestListPreferencesSchema,
);
const PULL_REQUEST_LIST_PREFERENCES_STORAGE_KEY = "t3.pullRequests.preferences";
type PreferenceStorage = Pick<Storage, "getItem" | "setItem">;
function resolvePreferenceStorage(
storage: PreferenceStorage | undefined,
): PreferenceStorage | undefined {
return storage ?? (typeof window === "undefined" ? undefined : window.localStorage);
}
export function pullRequestListPreferences(
search: PullRequestListPreferences | Schema.Schema.Type<typeof PullRequestListPreferencesSchema>,
): PullRequestListPreferences {
return {
involvement: search.involvement,
state: search.state,
...(search.environmentId ? { environmentId: search.environmentId } : {}),
...(search.projectId ? { projectId: search.projectId } : {}),
...(search.host ? { host: search.host } : {}),
...(search.q ? { q: search.q } : {}),
...(search.draft ? { draft: search.draft } : {}),
...(search.review ? { review: search.review } : {}),
...(search.checks ? { checks: search.checks } : {}),
...(search.author ? { author: search.author } : {}),
...(search.labels && search.labels.length > 0 ? { labels: search.labels } : {}),
...(search.sort && search.sort !== "ready" ? { sort: search.sort } : {}),
};
}
export function readPullRequestListPreferences(
storage?: PreferenceStorage,
): PullRequestListPreferences {
try {
const raw = resolvePreferenceStorage(storage)?.getItem(
PULL_REQUEST_LIST_PREFERENCES_STORAGE_KEY,
);
if (!raw) return DEFAULT_PULL_REQUEST_LIST_PREFERENCES;
const decoded = decodePullRequestListPreferences(JSON.parse(raw));
return decoded._tag === "Some"
? pullRequestListPreferences(decoded.value)
: DEFAULT_PULL_REQUEST_LIST_PREFERENCES;
} catch {
return DEFAULT_PULL_REQUEST_LIST_PREFERENCES;
}
}
export function writePullRequestListPreferences(
preferences: PullRequestListPreferences,
storage?: PreferenceStorage,
): void {
try {
resolvePreferenceStorage(storage)?.setItem(
PULL_REQUEST_LIST_PREFERENCES_STORAGE_KEY,
JSON.stringify(preferences),
);
} catch {}
}