Skip to content
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

[No QA] introducing useResponsiveLayout hook #33425

Merged
Merged
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
24 changes: 24 additions & 0 deletions src/hooks/useResponsiveLayout.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import {ParamListBase, RouteProp, useRoute} from '@react-navigation/native';
import useWindowDimensions from './useWindowDimensions';

type RouteParams = ParamListBase & {
params: {isInRHP?: boolean};
};
type ResponsiveLayoutResult = {
shouldUseNarrowLayout: boolean;
};
/**
* Hook to determine if we are on mobile devices or in the RHP
*/
export default function useResponsiveLayout(): ResponsiveLayoutResult {
const {isSmallScreenWidth} = useWindowDimensions();
try {
// eslint-disable-next-line react-hooks/rules-of-hooks
const {params} = useRoute<RouteProp<RouteParams, 'params'>>();
return {shouldUseNarrowLayout: isSmallScreenWidth || (params?.isInRHP ?? false)};
Comment on lines +16 to +18
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This still feels like a bad practice, should we instead pass the params as a prop and use it?
What do you think @roryabraham

Copy link
Contributor

@roryabraham roryabraham Dec 29, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This looks ok to me. It's a bit weird but better than the alternative of having to use useRoute and pass a prop every time useResponsiveLayout needs to be used. Plus if we gave isInRHP a default value, then it would be easy to forget to pass it when it might be different than the default.

So I think this implementation looks good

Comment on lines +17 to +18
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
const {params} = useRoute<RouteProp<RouteParams, 'params'>>();
return {shouldUseNarrowLayout: isSmallScreenWidth || (params?.isInRHP ?? false)};
// eslint-disable-next-line react-hooks/rules-of-hooks
const {params} = useRoute<RouteProp<RouteParams, 'params'>>();
const isInRHP = params?.isInRHP ?? false;
const shouldUseNarrowLayout = isSmallScreenWidth || isInRHP;
return {shouldUseNarrowLayout};

} catch (error) {
return {
shouldUseNarrowLayout: isSmallScreenWidth,
};
Comment on lines +20 to +22
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

NAB

Suggested change
return {
shouldUseNarrowLayout: isSmallScreenWidth,
};
return {shouldUseNarrowLayout: isSmallScreenWidth};

}
}
Loading