diff --git a/package-lock.json b/package-lock.json
index c37f33e3..a3f62045 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -7878,15 +7878,29 @@
}
},
"node_modules/nuqs": {
- "version": "1.20.0",
- "resolved": "https://registry.npmjs.org/nuqs/-/nuqs-1.20.0.tgz",
- "integrity": "sha512-nGVfv7eWMNxAzOJ9n8ARTo6ObqeEr1ETYZ+dIMCg/VfGUoZoPrqyTOndIvQIgUzK3pIC41mTXg10JJxh9ziEhw==",
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/nuqs/-/nuqs-2.2.1.tgz",
+ "integrity": "sha512-P0swZtg6k9LRXzlT9gQAFtQg25Edan2Evt5vwyGvh00Z+rHH19gb2ZajU/E/SfhwE858aM/jb+wJziWbbwSlcg==",
"license": "MIT",
"dependencies": {
"mitt": "^3.0.1"
},
"peerDependencies": {
- "next": ">=13.4 <14.0.2 || ^14.0.3"
+ "@remix-run/react": ">=2",
+ "next": ">=14.2.0",
+ "react": ">=18.2.0 || ^19.0.0-0",
+ "react-router-dom": ">=6"
+ },
+ "peerDependenciesMeta": {
+ "@remix-run/react": {
+ "optional": true
+ },
+ "next": {
+ "optional": true
+ },
+ "react-router-dom": {
+ "optional": true
+ }
}
},
"node_modules/object-assign": {
@@ -11271,7 +11285,7 @@
"jsonrepair": "^3.5.1",
"next": "^14.2.8",
"next-seo": "^6.6.0",
- "nuqs": "^1.19.1",
+ "nuqs": "^2.2.1",
"posthog-js": "^1.160.3",
"random-word-slugs": "^0.1.7",
"react": "^18.3.1",
diff --git a/packages/frontend/components/checks/ChecksInputs.tsx b/packages/frontend/components/checks/ChecksInputs.tsx
index 543f69bc..3632c2b2 100644
--- a/packages/frontend/components/checks/ChecksInputs.tsx
+++ b/packages/frontend/components/checks/ChecksInputs.tsx
@@ -73,8 +73,6 @@ const CheckInputs = {
}
}, []);
- console.log(value, defaultValue);
-
return (
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
>
);
diff --git a/packages/frontend/pages/logs/index.tsx b/packages/frontend/pages/logs/index.tsx
index 97187ed7..1254894c 100644
--- a/packages/frontend/pages/logs/index.tsx
+++ b/packages/frontend/pages/logs/index.tsx
@@ -1,5 +1,6 @@
import DataTable from "@/components/blocks/DataTable";
import {
+ createParser,
parseAsBoolean,
parseAsString,
parseAsStringEnum,
@@ -172,6 +173,11 @@ function editCheck(filters, id, params) {
const DEFAULT_CHECK = ["AND"];
+const parser = createParser({
+ parse: deserializeLogic,
+ serialize: serializeLogic,
+});
+
export default function Logs() {
const router = useRouter();
const { user } = useUser();
@@ -208,12 +214,11 @@ export default function Logs() {
),
);
- const [checks, setChecks] = useQueryState("filters", {
- parse: (value) => deserializeLogic(value, true),
- serialize: serializeLogic,
- defaultValue: DEFAULT_CHECK,
- clearOnDefault: true,
- });
+ const [checks, setChecks] = useQueryState(
+ "filters",
+ parser.withDefault(DEFAULT_CHECK).withOptions({ clearOnDefault: true }),
+ );
+ console.log(checks);
const { sortParams } = useSortParams();
diff --git a/packages/frontend/utils/analytics.ts b/packages/frontend/utils/analytics.ts
index 14151a30..e576e3b2 100644
--- a/packages/frontend/utils/analytics.ts
+++ b/packages/frontend/utils/analytics.ts
@@ -23,11 +23,11 @@ const w = {
},
};
-const handleRouteChange = async () => {
+async function handleRouteChange() {
posthog?.capture("$pageview");
-};
+}
-const track = (event: string, data?: any) => {
+function track(event: string, data?: any) {
try {
posthog?.capture(event, data);
@@ -35,10 +35,10 @@ const track = (event: string, data?: any) => {
} catch (e) {
console.error(e);
}
-};
+}
const alreadyTracked = new Set();
-const trackOnce = (event: string, data?: any) => {
+function trackOnce(event: string, data?: any) {
// Prevent sending too many events
if (alreadyTracked.has(event)) return;
@@ -47,9 +47,9 @@ const trackOnce = (event: string, data?: any) => {
} catch (e) {
console.error(e);
}
-};
+}
-const identify = (userId: string, traits: any) => {
+function identify(userId: string, traits: any) {
try {
posthog?.identify(userId, traits);
@@ -64,7 +64,7 @@ const identify = (userId: string, traits: any) => {
if (traits.email) w?.crisp?.push(["set", "user:email", traits.email]);
if (traits.name) w?.crisp?.push(["set", "user:nickname", traits.name]);
- w?.crisp.push([
+ w?.crisp?.push([
"set",
"session:data",
[
@@ -82,7 +82,7 @@ const identify = (userId: string, traits: any) => {
} catch (e) {
console.error(e);
}
-};
+}
const analytics = {
track,
diff --git a/packages/frontend/utils/dataHooks/views.ts b/packages/frontend/utils/dataHooks/views.ts
index cd0db48b..81b08c7c 100644
--- a/packages/frontend/utils/dataHooks/views.ts
+++ b/packages/frontend/utils/dataHooks/views.ts
@@ -1,4 +1,4 @@
-import { hasAccess } from "shared";
+import { deserializeLogic, hasAccess, serializeLogic } from "shared";
import { useProjectMutation, useProjectSWR, useUser } from ".";
import { fetcher } from "../fetcher";
@@ -33,6 +33,10 @@ export function useView(id: string | null, initialData?: any) {
fallbackData: initialData,
});
+ if (view) {
+ view.data = deserializeLogic(serializeLogic(view?.data || [])); // because the params values are serialized in the server json response, we serialize everything first, then deserialize it
+ }
+
const { trigger: update } = useProjectMutation(
id && `/views/${id}`,
fetcher.patch,
diff --git a/packages/frontend/utils/datatable.tsx b/packages/frontend/utils/datatable.tsx
index bb28c2e4..4406372c 100644
--- a/packages/frontend/utils/datatable.tsx
+++ b/packages/frontend/utils/datatable.tsx
@@ -22,7 +22,7 @@ export function timeColumn(timeColumn, label = "Time") {
new Date(b.getValue(timeColumn)).getTime(),
cell: (info) => {
const isToday =
- new Date(info.getValue()).toDateString() === new Date().toDateString();
+ new Date(info.getValue())?.toDateString() === new Date().toDateString();
if (isToday) {
return new Date(info.getValue()).toLocaleTimeString(
typeof window !== "undefined" ? window.navigator.language : "en-US",