-
Notifications
You must be signed in to change notification settings - Fork 132
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
feat: Create monitor display name v2, resolves #992 #1234
Changes from all commits
4e2303b
ea4ddfc
9e45297
f50748e
2b24f19
5678771
fb13fb1
0adc8fd
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -18,6 +18,7 @@ import Checkbox from "../../../Components/Inputs/Checkbox"; | |
import Breadcrumbs from "../../../Components/Breadcrumbs"; | ||
import { getUptimeMonitorById } from "../../../Features/UptimeMonitors/uptimeMonitorsSlice"; | ||
import "./index.css"; | ||
import { parseDomainName } from "../../../Utils/monitorUtils"; | ||
|
||
const CreateMonitor = () => { | ||
const MS_PER_MINUTE = 60000; | ||
|
@@ -91,7 +92,7 @@ const CreateMonitor = () => { | |
} | ||
}; | ||
fetchMonitor(); | ||
}, [monitorId, authToken, monitors]); | ||
}, [monitorId, authToken, monitors, dispatch, navigate]); | ||
|
||
const handleChange = (event, name) => { | ||
const { value, id } = event.target; | ||
|
@@ -141,6 +142,14 @@ const CreateMonitor = () => { | |
} | ||
}; | ||
|
||
const onUrlBlur = (event) => { | ||
const { value } = event.target; | ||
setMonitor((prev) => ({ | ||
...prev, | ||
name: parseDomainName(value), | ||
})); | ||
}; | ||
Comment on lines
+145
to
+151
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion Yo dawg, we need some error handling in this function! The onUrlBlur function's looking clean, but it's raw-dogging the state update without any error handling. What if parseDomainName throws? Consider wrapping it in a try-catch like this: const onUrlBlur = (event) => {
const { value } = event.target;
+ try {
setMonitor((prev) => ({
...prev,
name: parseDomainName(value),
}));
+ } catch (error) {
+ createToast({
+ body: "Failed to generate display name from URL",
+ });
+ logger.error("Error parsing domain name:", error);
+ }
};
|
||
|
||
const handleCreateMonitor = async (event) => { | ||
event.preventDefault(); | ||
//obj to submit | ||
|
@@ -259,6 +268,7 @@ const CreateMonitor = () => { | |
placeholder={monitorTypeMaps[monitor.type].placeholder || ""} | ||
value={monitor.url} | ||
onChange={handleChange} | ||
onBlur={onUrlBlur} | ||
error={errors["url"] ? true : false} | ||
helperText={errors["url"]} | ||
/> | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -18,6 +18,7 @@ import { HttpAdornment } from "../../../Components/Inputs/TextInput/Adornments"; | |
import Select from "../../../Components/Inputs/Select"; | ||
import Checkbox from "../../../Components/Inputs/Checkbox"; | ||
import Breadcrumbs from "../../../Components/Breadcrumbs"; | ||
import { parseDomainName } from "../../../Utils/monitorUtils"; | ||
import "./index.css"; | ||
|
||
const CreatePageSpeed = () => { | ||
|
@@ -95,6 +96,16 @@ const CreatePageSpeed = () => { | |
} | ||
}; | ||
|
||
const onUrlBlur = (event) => { | ||
const { value } = event.target; | ||
if (monitor.name === "") { | ||
setMonitor((prev) => ({ | ||
...prev, | ||
name: parseDomainName(value), | ||
})); | ||
} | ||
}; | ||
Comment on lines
+99
to
+107
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Add error handling to the URL blur handler. The handler needs to catch potential errors from Here's the fix: const onUrlBlur = (event) => {
const { value } = event.target;
if (monitor.name === "") {
+ try {
setMonitor((prev) => ({
...prev,
name: parseDomainName(value),
}));
+ } catch (error) {
+ createToast({ body: "Failed to generate display name from URL" });
+ }
}
};
|
||
|
||
const handleCreateMonitor = async (event) => { | ||
event.preventDefault(); | ||
//obj to submit | ||
|
@@ -214,6 +225,7 @@ const CreatePageSpeed = () => { | |
placeholder="google.com" | ||
value={monitor.url} | ||
onChange={handleChange} | ||
onBlur={onUrlBlur} | ||
error={errors["url"] ? true : false} | ||
helperText={errors["url"]} | ||
/> | ||
|
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -1,3 +1,5 @@ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { capitalizeFirstLetter } from "./stringUtils"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
/** | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* Helper function to get duration since last check or the last date checked | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* @param {Array} checks Array of check objects. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -15,3 +17,22 @@ export const getLastChecked = (checks, duration = true) => { | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return new Date() - new Date(checks[0].createdAt); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
export const parseDomainName = (url) => { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
url = url.replace(/^https?:\/\//, ""); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// Remove leading/trailing dots | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
url = url.replace(/^\.+|\.+$/g, ""); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// Split by dots | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const parts = url.split("."); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// Remove common prefixes and empty parts and exclude the last element of the array (the last element should be the TLD) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const cleanParts = parts.filter((part) => part !== "www" && part !== "").slice(0, -1); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// If there's more than one part, append the two words and capitalize the first letters (e.g. ["api", "test"] -> "Api Test") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const domainPart = | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
cleanParts.length > 1 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
? cleanParts.map((part) => capitalizeFirstLetter(part)).join(" ") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
: capitalizeFirstLetter(cleanParts[0]); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (domainPart) return domainPart; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return url; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+21
to
+38
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion Add input validation and documentation for the parseDomainName function. Yo! The function's logic is solid, but it needs some defensive programming and documentation to make it bulletproof. Here's how we can improve it: +/**
+ * Parses a URL and generates a display name by extracting and formatting the domain parts.
+ * @param {string} url - The URL to parse (e.g., "www.api.test.com")
+ * @returns {string} - Formatted display name (e.g., "Api Test")
+ * @throws {Error} - If url is not a string or is empty
+ */
export const parseDomainName = (url) => {
+ if (typeof url !== 'string' || !url.trim()) {
+ throw new Error('URL must be a non-empty string');
+ }
+
url = url.replace(/^https?:\/\//, "");
// Remove leading/trailing dots
url = url.replace(/^\.+|\.+$/g, "");
// Split by dots
const parts = url.split(".");
// Remove common prefixes and empty parts and exclude the last element of the array
const cleanParts = parts.filter((part) => part !== "www" && part !== "").slice(0, -1);
// If there's more than one part, append the two words and capitalize
const domainPart =
cleanParts.length > 1
? cleanParts.map((part) => capitalizeFirstLetter(part)).join(" ")
: capitalizeFirstLetter(cleanParts[0]);
- if (domainPart) return domainPart;
-
- return url;
+ return domainPart || url;
}; 📝 Committable suggestion
Suggested change
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
Add error handling and consider extracting common URL blur logic.
Yo! The URL blur logic is duplicated across components and lacks error handling.
Consider these improvements: