Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 3 additions & 5 deletions packages/react-responsive/src/BreakpointsContext.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -19,13 +19,13 @@
additionalBreakpoints?: ExposedBreakpoints;
}

export const BreakpointsProvider: React.FunctionComponent<React.PropsWithChildren<BreakpointsProviderProps>> = ({
export function BreakpointsProvider({
breakpoints = defaultBreakpoints,
additionalBreakpoints,
children,
}) => {
}: React.PropsWithChildren<BreakpointsProviderProps>): React.ReactElement {
return (
<BreakpointsContext.Provider

Check warning on line 28 in packages/react-responsive/src/BreakpointsContext.tsx

View workflow job for this annotation

GitHub Actions / build (22.x)

In React 19, you can render '<Context>' as a provider instead of '<Context.Provider>'

Check warning on line 28 in packages/react-responsive/src/BreakpointsContext.tsx

View workflow job for this annotation

GitHub Actions / build (25.x)

In React 19, you can render '<Context>' as a provider instead of '<Context.Provider>'

Check warning on line 28 in packages/react-responsive/src/BreakpointsContext.tsx

View workflow job for this annotation

GitHub Actions / build (24.x)

In React 19, you can render '<Context>' as a provider instead of '<Context.Provider>'
value={sanitize({
...breakpoints,
...additionalBreakpoints,
Expand All @@ -34,6 +34,4 @@
{children}
</BreakpointsContext.Provider>
);
};

BreakpointsProvider.displayName = "BreakpointsProvider";
}
4 changes: 2 additions & 2 deletions packages/react-responsive/src/fromBreakpointToMedia.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { Breakpoint } from "./sanitize";

export const fromBreakpointToMedia = (breakpoint: Breakpoint): string => {
export function fromBreakpointToMedia(breakpoint: Breakpoint): string {
const mediaList: string[] = [];
const [minValue, maxValue, unit, direction] = breakpoint;
let str;
Expand All @@ -18,4 +18,4 @@ export const fromBreakpointToMedia = (breakpoint: Breakpoint): string => {
}

return " " + mediaList.join(" and ");
};
}
6 changes: 3 additions & 3 deletions packages/react-responsive/src/mediaQueryBuilder.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
import { Breakpoints } from "./sanitize";
import { fromBreakpointToMedia } from "./fromBreakpointToMedia";

export const mediaQueryBuilder =
(breakpoints: Breakpoints) =>
(on = ""): string => {
export function mediaQueryBuilder(breakpoints: Breakpoints) {
return function toMediaQuery(on = ""): string {
if (!on) {
return "";
}
Expand All @@ -23,3 +22,4 @@ export const mediaQueryBuilder =
}
return mediaQuery;
};
}
4 changes: 2 additions & 2 deletions packages/react-responsive/src/sanitize.ts
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ export interface Breakpoints {
[breakpoint: string]: Breakpoint;
}

export const sanitize = (inBreakpoints: ExposedBreakpoints): Breakpoints => {
export function sanitize(inBreakpoints: ExposedBreakpoints): Breakpoints {
return Object.keys(inBreakpoints).reduce<Breakpoints>((breakpoints, breakpointName) => {
const breakpoint = inBreakpoints[breakpointName];

Expand Down Expand Up @@ -91,4 +91,4 @@ export const sanitize = (inBreakpoints: ExposedBreakpoints): Breakpoints => {

return breakpoints;
}, {});
};
}
4 changes: 2 additions & 2 deletions packages/react-responsive/src/useBreakpoint.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,11 @@ import { mediaQueryBuilder } from "./mediaQueryBuilder";

import { useMediaQuery } from "./useMediaQuery";

export const useBreakpoint = (on?: string): boolean => {
export function useBreakpoint(on?: string): boolean {
const breakpoints = React.useContext(BreakpointsContext);
const toMediaQuery = React.useMemo(() => mediaQueryBuilder(breakpoints), [breakpoints]);

const mediaQuery = React.useMemo(() => toMediaQuery(on), [toMediaQuery, on]);

return useMediaQuery(mediaQuery || "-");
};
}
33 changes: 15 additions & 18 deletions packages/react-responsive/src/useMediaQuery.ts
Original file line number Diff line number Diff line change
@@ -1,22 +1,19 @@
import * as React from "react";

export const useMediaQuery = (mediaQuery: string): boolean => {
export function useMediaQuery(mediaQuery: string): boolean {
const mediaQueryList = React.useMemo(() => matchMedia(mediaQuery), [mediaQuery]);
const [isShown, setIsShown] = React.useState<boolean>(mediaQueryList.matches);

React.useLayoutEffect(() => {
setIsShown(mediaQueryList.matches);
const listener = (event: MediaQueryListEvent) => {
// Those are important updates, so we don't want to use transitions on them
setIsShown(event.matches);
};

// cannot use addEventListener for IE 11 and safari 13-
mediaQueryList.addListener(listener);
return () => {
mediaQueryList.removeListener(listener);
};
}, [mediaQueryList]);

return isShown;
};
// Those are important updates, so we don't want to use transitions on them
return React.useSyncExternalStore(
React.useCallback(
(callback) => {
// cannot use addEventListener for IE 11 and safari 13-
mediaQueryList.addListener(callback);
return () => mediaQueryList.removeListener(callback);
},
[mediaQueryList],
),
() => mediaQueryList.matches,
// Don't add `() => false`, so that node implementations can define their own behavior for server-side rendering via `mock-match-media`
);
}