use-logger.tsx 1005 B

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. "use client";
  2. import type { Logger } from "pino";
  3. import pino from "pino";
  4. import type { ComponentProps } from "react";
  5. import { createContext, useContext, useMemo } from "react";
  6. const LoggerContext = createContext<undefined | Logger<string>>(undefined);
  7. type LoggerContextProps = Omit<
  8. ComponentProps<typeof LoggerContext.Provider>,
  9. "config" | "value"
  10. > & {
  11. config?: Parameters<typeof pino>[0] | undefined;
  12. };
  13. export const LoggerProvider = ({ config, ...props }: LoggerContextProps) => {
  14. const logger = useMemo(
  15. () =>
  16. pino({
  17. ...config,
  18. browser: { ...config?.browser },
  19. }),
  20. [config],
  21. );
  22. return <LoggerContext.Provider value={logger} {...props} />;
  23. };
  24. export const useLogger = () => {
  25. const logger = useContext(LoggerContext);
  26. if (logger) {
  27. return logger;
  28. } else {
  29. throw new NotInitializedError();
  30. }
  31. };
  32. class NotInitializedError extends Error {
  33. override message =
  34. "This component must be contained within a `LoggerProvider`!";
  35. }