Skip to content

Commit 34d78a4

Browse files
committed
feat: update createFilterPreset to return status code and simplify error handling
1 parent 05d370d commit 34d78a4

File tree

2 files changed

+34
-80
lines changed

2 files changed

+34
-80
lines changed

frontend/src/ts/elements/account/result-filters.ts

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,9 @@ function addFilterPresetToSnapshot(filter: ResultFilters): void {
179179
}
180180

181181
// callback function called by popup once user inputs name
182-
export async function createFilterPreset(name: string): Promise<void> {
182+
export async function createFilterPreset(
183+
name: string
184+
): Promise<number | undefined> {
183185
name = name.replace(/ /g, "_");
184186
Loader.show();
185187
const result = await Ape.users.addResultFilterPreset({
@@ -189,13 +191,10 @@ export async function createFilterPreset(name: string): Promise<void> {
189191
if (result.status === 200) {
190192
addFilterPresetToSnapshot({ ...filters, name, _id: result.body.data });
191193
void updateFilterPresets();
192-
Notifications.add("Filter preset created", 1);
194+
return 1;
193195
} else {
194-
Notifications.add(
195-
"Error creating filter preset: " + result.body.message,
196-
-1
197-
);
198196
console.log("error creating filter preset: " + result.body.message);
197+
return 0;
199198
}
200199
}
201200

Lines changed: 29 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -1,80 +1,35 @@
1-
import { createFilterPreset } from "../elements/account/result-filters";
2-
import AnimatedModal, { ShowOptions } from "../utils/animated-modal";
3-
import * as Notifications from "../elements/notifications";
4-
import { InputIndicator } from "../elements/input-indicator";
51
import { ResultFiltersSchema } from "@monkeytype/schemas/users";
2+
import { createFilterPreset } from "../elements/account/result-filters";
3+
import { SimpleModal } from "../utils/simple-modal";
64

7-
export function show(showOptions?: ShowOptions): void {
8-
void modal.show({
9-
...showOptions,
10-
focusFirstInput: true,
11-
beforeAnimation: async (modalEl) => {
12-
(modalEl.querySelector("input") as HTMLInputElement).value = "";
13-
14-
const indicator = $(modalEl).data("indicator") as
15-
| InputIndicator
16-
| undefined;
17-
if (indicator) {
18-
indicator.hide();
19-
}
20-
},
21-
});
22-
}
23-
24-
function hide(clearChain = false): void {
25-
void modal.hide({
26-
clearModalChain: clearChain,
27-
});
28-
}
29-
30-
function apply(): void {
31-
const name = $("#newFilterPresetModal input").val() as string;
32-
if (name === "") {
33-
Notifications.add("Name cannot be empty", 0);
34-
return;
35-
}
36-
void createFilterPreset(name);
37-
hide(true);
5+
export function show(): void {
6+
newFilterPresetModal.show(undefined, {});
387
}
398

40-
function addValidation(element: JQuery, schema: Zod.Schema): InputIndicator {
41-
const indicator = new InputIndicator(element, {
42-
valid: { icon: "fa-check", level: 1 },
43-
invalid: { icon: "fa-times", level: -1 },
44-
});
45-
46-
element.on("input", (event) => {
47-
const value = (event.target as HTMLInputElement).value;
48-
if (value === undefined || value === "") {
49-
indicator.hide();
50-
return;
51-
}
52-
const validationResult = schema.safeParse(value);
53-
if (!validationResult.success) {
54-
indicator.show(
55-
"invalid",
56-
validationResult.error.errors.map((err) => err.message).join(", ")
57-
);
58-
return;
9+
const newFilterPresetModal = new SimpleModal({
10+
id: "newFilterPresetModal",
11+
title: "New Filter Preset",
12+
inputs: [
13+
{
14+
placeholder: "Preset Name",
15+
type: "text",
16+
initVal: "",
17+
validation: {
18+
schema: ResultFiltersSchema.shape.name,
19+
},
20+
},
21+
],
22+
buttonText: "add",
23+
onlineOnly: true,
24+
execFn: async (_thisPopup, name) => {
25+
const status = await createFilterPreset(name);
26+
27+
if (status === 1) {
28+
return { status: 1, message: "Filter preset created" };
29+
} else {
30+
let status: -1 | 0 | 1 = -1;
31+
let message: string = "Error creating filter preset";
32+
return { status, message, alwaysHide: true };
5933
}
60-
indicator.show("valid");
61-
});
62-
return indicator;
63-
}
64-
65-
async function setup(modalEl: HTMLElement): Promise<void> {
66-
modalEl.addEventListener("submit", (e) => {
67-
e.preventDefault();
68-
apply();
69-
});
70-
71-
const inputElement = $(modalEl).find("input");
72-
73-
const indicator = addValidation(inputElement, ResultFiltersSchema.shape.name);
74-
$(modalEl).data("indicator", indicator);
75-
}
76-
77-
const modal = new AnimatedModal({
78-
dialogId: "newFilterPresetModal",
79-
setup,
34+
},
8035
});

0 commit comments

Comments
 (0)