tracking + web vitals
This commit is contained in:
		
							
								
								
									
										15
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										15
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							@@ -17,6 +17,7 @@
 | 
				
			|||||||
        "clsx": "^2.1.1",
 | 
					        "clsx": "^2.1.1",
 | 
				
			||||||
        "lucide-react": "^0.503.0",
 | 
					        "lucide-react": "^0.503.0",
 | 
				
			||||||
        "next": "^15.2.3",
 | 
					        "next": "^15.2.3",
 | 
				
			||||||
 | 
					        "next-plausible": "^3.12.4",
 | 
				
			||||||
        "react": "^19.0.0",
 | 
					        "react": "^19.0.0",
 | 
				
			||||||
        "react-dom": "^19.0.0",
 | 
					        "react-dom": "^19.0.0",
 | 
				
			||||||
        "react-hook-form": "^7.56.1",
 | 
					        "react-hook-form": "^7.56.1",
 | 
				
			||||||
@@ -5089,6 +5090,20 @@
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/next-plausible": {
 | 
				
			||||||
 | 
					      "version": "3.12.4",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/next-plausible/-/next-plausible-3.12.4.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-cD3+ixJxf8yBYvsideTxqli3fvrB7R4BXcvsNJz8Sm2X1QN039WfiXjCyNWkub4h5++rRs6fHhchUMnOuJokcg==",
 | 
				
			||||||
 | 
					      "license": "MIT",
 | 
				
			||||||
 | 
					      "funding": {
 | 
				
			||||||
 | 
					        "url": "https://github.com/4lejandrito/next-plausible?sponsor=1"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "peerDependencies": {
 | 
				
			||||||
 | 
					        "next": "^11.1.0 || ^12.0.0 || ^13.0.0 || ^14.0.0 || ^15.0.0 ",
 | 
				
			||||||
 | 
					        "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
 | 
				
			||||||
 | 
					        "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "node_modules/next/node_modules/postcss": {
 | 
					    "node_modules/next/node_modules/postcss": {
 | 
				
			||||||
      "version": "8.4.31",
 | 
					      "version": "8.4.31",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz",
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -25,6 +25,7 @@
 | 
				
			|||||||
    "clsx": "^2.1.1",
 | 
					    "clsx": "^2.1.1",
 | 
				
			||||||
    "lucide-react": "^0.503.0",
 | 
					    "lucide-react": "^0.503.0",
 | 
				
			||||||
    "next": "^15.2.3",
 | 
					    "next": "^15.2.3",
 | 
				
			||||||
 | 
					    "next-plausible": "^3.12.4",
 | 
				
			||||||
    "react": "^19.0.0",
 | 
					    "react": "^19.0.0",
 | 
				
			||||||
    "react-dom": "^19.0.0",
 | 
					    "react-dom": "^19.0.0",
 | 
				
			||||||
    "react-hook-form": "^7.56.1",
 | 
					    "react-hook-form": "^7.56.1",
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										77
									
								
								src/app/components/web-vitals.tsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										77
									
								
								src/app/components/web-vitals.tsx
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,77 @@
 | 
				
			|||||||
 | 
					"use client";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import { usePlausible } from "next-plausible";
 | 
				
			||||||
 | 
					import { useReportWebVitals } from "next/web-vitals";
 | 
				
			||||||
 | 
					interface Metric {
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * The name of the metric (in acronym form).
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  name: "CLS" | "FCP" | "FID" | "INP" | "LCP" | "TTFB";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * The current value of the metric.
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  value: number;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * The rating as to whether the metric value is within the "good",
 | 
				
			||||||
 | 
					   * "needs improvement", or "poor" thresholds of the metric.
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  rating: "good" | "needs-improvement" | "poor";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * The delta between the current value and the last-reported value.
 | 
				
			||||||
 | 
					   * On the first report, `delta` and `value` will always be the same.
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  delta: number;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * A unique ID representing this particular metric instance. This ID can
 | 
				
			||||||
 | 
					   * be used by an analytics tool to dedupe multiple values sent for the same
 | 
				
			||||||
 | 
					   * metric instance, or to group multiple deltas together and calculate a
 | 
				
			||||||
 | 
					   * total. It can also be used to differentiate multiple different metric
 | 
				
			||||||
 | 
					   * instances sent from the same page, which can happen if the page is
 | 
				
			||||||
 | 
					   * restored from the back/forward cache (in that case new metrics object
 | 
				
			||||||
 | 
					   * get created).
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  id: string;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * Any performance entries relevant to the metric value calculation.
 | 
				
			||||||
 | 
					   * The array may also be empty if the metric value was not based on any
 | 
				
			||||||
 | 
					   * entries (e.g. a CLS value of 0 given no layout shifts).
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  entries: PerformanceEntry[];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * The type of navigation.
 | 
				
			||||||
 | 
					   *
 | 
				
			||||||
 | 
					   * This will be the value returned by the Navigation Timing API (or
 | 
				
			||||||
 | 
					   * `undefined` if the browser doesn't support that API), with the following
 | 
				
			||||||
 | 
					   * exceptions:
 | 
				
			||||||
 | 
					   * - 'back-forward-cache': for pages that are restored from the bfcache.
 | 
				
			||||||
 | 
					   * - 'back_forward' is renamed to 'back-forward' for consistency.
 | 
				
			||||||
 | 
					   * - 'prerender': for pages that were prerendered.
 | 
				
			||||||
 | 
					   * - 'restore': for pages that were discarded by the browser and then
 | 
				
			||||||
 | 
					   * restored by the user.
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  navigationType:
 | 
				
			||||||
 | 
					    | "navigate"
 | 
				
			||||||
 | 
					    | "reload"
 | 
				
			||||||
 | 
					    | "back-forward"
 | 
				
			||||||
 | 
					    | "back-forward-cache"
 | 
				
			||||||
 | 
					    | "prerender"
 | 
				
			||||||
 | 
					    | "restore";
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export function WebVitals() {
 | 
				
			||||||
 | 
					  const plausible = usePlausible();
 | 
				
			||||||
 | 
					  useReportWebVitals((metric: Metric) => {
 | 
				
			||||||
 | 
					    plausible("web-vitals", {
 | 
				
			||||||
 | 
					      props: {
 | 
				
			||||||
 | 
					        [metric.name]: metric.rating,
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					  return <></>;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -1,7 +1,8 @@
 | 
				
			|||||||
import "@/styles/globals.css";
 | 
					import "@/styles/globals.css";
 | 
				
			||||||
 | 
					import PlausibleProvider from "next-plausible";
 | 
				
			||||||
import { type Metadata } from "next";
 | 
					import { type Metadata } from "next";
 | 
				
			||||||
import { Geist } from "next/font/google";
 | 
					import { Geist } from "next/font/google";
 | 
				
			||||||
 | 
					import { WebVitals } from "./components/web-vitals";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const metadata: Metadata = {
 | 
					export const metadata: Metadata = {
 | 
				
			||||||
  title:
 | 
					  title:
 | 
				
			||||||
@@ -21,7 +22,16 @@ export default function RootLayout({
 | 
				
			|||||||
}: Readonly<{ children: React.ReactNode }>) {
 | 
					}: Readonly<{ children: React.ReactNode }>) {
 | 
				
			||||||
  return (
 | 
					  return (
 | 
				
			||||||
    <html lang="en" className={geist.variable}>
 | 
					    <html lang="en" className={geist.variable}>
 | 
				
			||||||
      <body>{children}</body>
 | 
					      <PlausibleProvider
 | 
				
			||||||
 | 
					        domain="investingfire.com"
 | 
				
			||||||
 | 
					        customDomain="https://analytics.schulze.network"
 | 
				
			||||||
 | 
					        selfHosted={true}
 | 
				
			||||||
 | 
					        enabled={true}
 | 
				
			||||||
 | 
					        trackOutboundLinks={true}
 | 
				
			||||||
 | 
					      >
 | 
				
			||||||
 | 
					        <WebVitals />
 | 
				
			||||||
 | 
					        <body>{children}</body>
 | 
				
			||||||
 | 
					      </PlausibleProvider>
 | 
				
			||||||
    </html>
 | 
					    </html>
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user