refactor: enforce strict linting rules, replace forEach with for...of loops, and remove console logging throughout the frontend.

This commit is contained in:
ramvignesh-b
2026-04-13 14:30:17 +05:30
parent 2776aac69a
commit 12763ab7ab
12 changed files with 38 additions and 37 deletions
+20 -1
View File
@@ -17,7 +17,26 @@
"linter": {
"enabled": true,
"rules": {
"recommended": true
"recommended": true,
"complexity": {
"noForEach": "error",
"useLiteralKeys": "error"
},
"style": {
"useConst": "error",
"noNonNullAssertion": "warn"
},
"a11y": {
"useAltText": "error",
"noAutofocus": "warn"
},
"suspicious": {
"noExplicitAny": "warn",
"noConsole": "warn"
},
"correctness": {
"noUnusedVariables": "error"
}
},
"includes": ["**", "!backend"]
},
-2
View File
@@ -48,8 +48,6 @@ api.interceptors.response.use(
originalRequest.headers.Authorization = `Bearer ${newAccessToken}`;
return api(originalRequest);
} catch (refreshError) {
// Refresh failed, perform logout to clear tokens
console.error("Session expired, logging out...");
useAuthStore.getState().clearAuth();
return Promise.reject(refreshError);
}
+6 -6
View File
@@ -67,10 +67,10 @@ export const ComposeCanvas = forwardRef<
if (initialData) {
await canvas.loadFromJSON(initialData);
if (readOnly) {
canvas.getObjects().forEach((obj) => {
for (const obj of canvas.getObjects()) {
obj.selectable = false;
obj.evented = false;
});
}
}
canvas.renderAll();
} else {
@@ -119,11 +119,11 @@ export const ComposeCanvas = forwardRef<
const hiddenTextareas = document.querySelectorAll(
'textarea[data-fabric="textarea"]',
);
hiddenTextareas.forEach((ta) => {
if (!ta.getAttribute("aria-label")) {
ta.setAttribute("aria-label", "Canvas text input");
for (const textArea of hiddenTextareas) {
if (!textArea.getAttribute("aria-label")) {
textArea.setAttribute("aria-label", "Canvas text input");
}
}
});
}, 100);
canvas.on("mouse:down", (opt) => {
+2 -2
View File
@@ -15,8 +15,8 @@ export const replacePathParams = (
params: Record<string, string>,
): string => {
let result = url;
Object.entries(params).forEach(([key, value]) => {
for (const [key, value] of Object.entries(params)) {
result = result.replace(`:${key}`, value);
});
}
return result;
};
+1 -2
View File
@@ -36,8 +36,7 @@ export const useAuth = () => {
const logout = async () => {
try {
await api.post(endpoints.LOGOUT);
} catch (error) {
console.error("Logout failed:", error);
} catch (_error) {
} finally {
clearAuth();
setMasterKey(null);
+2 -3
View File
@@ -43,8 +43,7 @@ async function decryptLetters(
)) as LetterMetadata;
return { ...letter, metadata };
} catch (err) {
console.warn("Decryption failed for letter:", letter.public_id, err);
} catch (_err) {
return {
...letter,
metadata: { recipient: "Encrypted Letter" },
@@ -67,7 +66,7 @@ export function useLetters() {
.get(endpoints.LETTERS)
.then((res) => decryptLetters(res.data, masterKey))
.then(setLetters)
.catch((err) => console.error("Drawer load failed:", err))
.catch((_err) => {})
.finally(() => setLoading(false));
}, [masterKey]);
+1 -2
View File
@@ -28,8 +28,7 @@ export default function Activate() {
});
await publicApi.get(url);
setStatus("success");
} catch (err) {
console.error("Activation error:", err);
} catch (_err) {
setStatus("error");
}
};
+3 -7
View File
@@ -79,8 +79,7 @@ export default function Editor() {
requestAnimationFrame(() => {
canvasRef.current?.loadData(canvasData);
});
} catch (err) {
console.error("Failed to load existing letter:", err);
} catch (_err) {
} finally {
setIsInitialLoading(false);
}
@@ -158,8 +157,7 @@ export default function Editor() {
}
setTimeout(() => setIsSaveSuccess(false), 5000);
} catch (error) {
console.error("Save failed:", error);
} catch (_error) {
} finally {
setIsSealing(false);
}
@@ -169,9 +167,7 @@ export default function Editor() {
if (!shareLink) return;
try {
await navigator.clipboard.writeText(shareLink);
} catch (err) {
console.error("Failed to copy:", err);
}
} catch (_err) {}
};
return (
-1
View File
@@ -46,7 +46,6 @@ export default function Login() {
navigate(ROUTES.DRAWER);
} catch (err) {
console.error("Login error:", err);
let message =
"Sorry, we're experiencing technical issues.\nPlease try again later.";
if (axios.isAxiosError(err) && err.response?.status !== 500) {
-1
View File
@@ -52,7 +52,6 @@ export default function Reader() {
setCanvasData(json);
setIsDecrypting(false);
} catch (err: any) {
console.error("Reader Error:", err);
setError(`Failed to load letter: ${err.message || "Unknown error"}`);
setIsDecrypting(false);
}
-1
View File
@@ -50,7 +50,6 @@ export default function Register() {
});
navigate(ROUTES.VERIFY_EMAIL);
} catch (err) {
console.error("Registration error:", err);
let message = "Registration failed. Please try again.";
if (axios.isAxiosError(err)) {
message = err.response?.data?.message || message;
+3 -9
View File
@@ -39,9 +39,7 @@ export async function decryptCanvasImages(
// We need the raw file in the editor so we can re-encrypt it if the user saves again.
obj._customRawFile = await blobUrlToFile(blobUrl, obj.src);
}
} catch (err) {
console.error("Error decrypting image in canvas:", obj.src, err);
}
} catch (_err) {}
}
}
}
@@ -66,9 +64,7 @@ export async function decryptCanvasImagesWithSharingKey(
try {
const res = await api.get(remoteUrl, { responseType: "blob" });
obj.src = await crypto.decryptImageWithSharingKey(res.data, sharingKey);
} catch (err) {
console.error("Guest decryption failed for canvas image:", err);
}
} catch (_err) {}
}
}
}
@@ -96,9 +92,7 @@ export async function encryptCanvasImages(
);
filenameMapping.set(img.src, filename);
encryptedFiles.set(filename, encryptedBlob);
} catch (err) {
console.error("Failed to encrypt new canvas image:", err);
}
} catch (_err) {}
}
// Update the canvas JSON to use the new encrypted filenames instead of blob URLs.