@artsy/palette-mobile 13.0.5 → 13.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,3 +1,27 @@
1
+ # v13.0.7 (Tue Sep 12 2023)
2
+
3
+ #### 🐛 Bug Fix
4
+
5
+ - feat(Image): expose gemini resize mode from Image [#148](https://github.com/artsy/palette-mobile/pull/148) ([@araujobarret](https://github.com/araujobarret))
6
+
7
+ #### Authors: 1
8
+
9
+ - Carlos Alberto de Araujo Barreto ([@araujobarret](https://github.com/araujobarret))
10
+
11
+ ---
12
+
13
+ # v13.0.6 (Mon Sep 11 2023)
14
+
15
+ #### 🐛 Bug Fix
16
+
17
+ - feat(tabs): adds scroll offsets to the tabs when checking scroll position [#147](https://github.com/artsy/palette-mobile/pull/147) ([@araujobarret](https://github.com/araujobarret))
18
+
19
+ #### Authors: 1
20
+
21
+ - Carlos Alberto de Araujo Barreto ([@araujobarret](https://github.com/araujobarret))
22
+
23
+ ---
24
+
1
25
  # v13.0.5 (Mon Sep 11 2023)
2
26
 
3
27
  #### 🐛 Bug Fix
@@ -1,5 +1,6 @@
1
1
  /// <reference types="react" />
2
2
  import { FastImageProps } from "react-native-fast-image";
3
+ import { GeminiResizeMode } from "../../utils/createGeminiUrl";
3
4
  type CustomFastImageProps = Omit<FastImageProps, "onLoadStart" | "onLoadEnd" | "source">;
4
5
  export interface ImageProps extends CustomFastImageProps {
5
6
  /** Supplied aspect ratio of image. If none provided, defaults to 1 */
@@ -12,6 +13,8 @@ export interface ImageProps extends CustomFastImageProps {
12
13
  performResize?: boolean;
13
14
  /** Source url to the image */
14
15
  src: string;
16
+ /** Gemini resize_to param */
17
+ geminiResizeMode?: GeminiResizeMode;
15
18
  }
16
19
  export declare const Image: React.FC<ImageProps>;
17
20
  export {};
@@ -15,7 +15,7 @@ const hooks_1 = require("../../utils/hooks");
15
15
  const useScreenDimensions_1 = require("../../utils/hooks/useScreenDimensions");
16
16
  const Flex_1 = require("../Flex");
17
17
  const Skeleton_1 = require("../Skeleton");
18
- const Image = ({ aspectRatio, width, height, performResize = true, src, style, resizeMode, ...flexProps }) => {
18
+ const Image = ({ aspectRatio, width, height, performResize = true, src, style, resizeMode, geminiResizeMode, ...flexProps }) => {
19
19
  const [loading, setLoading] = (0, react_1.useState)(true);
20
20
  const dimensions = useImageDimensions({ aspectRatio, width, height });
21
21
  const color = (0, hooks_1.useColor)();
@@ -25,6 +25,7 @@ const Image = ({ aspectRatio, width, height, performResize = true, src, style, r
25
25
  imageURL: src,
26
26
  width: react_native_1.PixelRatio.getPixelSizeForLayoutSize(dimensions.width),
27
27
  height: react_native_1.PixelRatio.getPixelSizeForLayoutSize(dimensions.height),
28
+ resizeMode: geminiResizeMode,
28
29
  });
29
30
  }
30
31
  return ((0, jsx_runtime_1.jsxs)(Flex_1.Flex, { position: "relative", ...flexProps, children: [!!loading && ((0, jsx_runtime_1.jsx)(Flex_1.Flex, { position: "absolute", zIndex: 1, children: (0, jsx_runtime_1.jsx)(Skeleton_1.Skeleton, { children: (0, jsx_runtime_1.jsx)(Skeleton_1.SkeletonBox, { ...dimensions }) }) })), (0, jsx_runtime_1.jsx)(moti_1.MotiView, { animate: { opacity: loading ? 0 : 1 }, transition: { type: "timing", duration: 400, easing: react_native_reanimated_1.Easing.sin }, children: (0, jsx_runtime_1.jsx)(react_native_fast_image_1.default, { style: [dimensions, style, { backgroundColor: color("black30") }], resizeMode: resizeMode, onLoadStart: () => setLoading(true), onLoadEnd: () => setLoading(false), source: {
@@ -9,6 +9,7 @@ export interface HeaderProps {
9
9
  onBack?: () => void;
10
10
  rightElements?: React.ReactNode;
11
11
  scrollY?: number;
12
+ scrollYOffset?: number;
12
13
  title?: string;
13
14
  titleProps?: FlexProps;
14
15
  titleShown?: boolean;
@@ -35,11 +35,11 @@ const Spacer_1 = require("../Spacer");
35
35
  const Text_1 = require("../Text");
36
36
  const Touchable_1 = require("../Touchable");
37
37
  const AnimatedHeader = (props) => {
38
- const { currentScrollY } = (0, ScreenScrollContext_1.useScreenScrollContext)();
39
- return (0, jsx_runtime_1.jsx)(exports.Header, { scrollY: currentScrollY, animated: true, ...props });
38
+ const { currentScrollY, scrollYOffset } = (0, ScreenScrollContext_1.useScreenScrollContext)();
39
+ return ((0, jsx_runtime_1.jsx)(exports.Header, { scrollY: currentScrollY, scrollYOffset: scrollYOffset, animated: true, ...props }));
40
40
  };
41
41
  exports.AnimatedHeader = AnimatedHeader;
42
- const Header = ({ animated = false, hideLeftElements, hideRightElements, hideTitle, leftElements, onBack, rightElements, scrollY = 0, title, titleProps = {}, }) => {
42
+ const Header = ({ animated = false, hideLeftElements, hideRightElements, hideTitle, leftElements, onBack, rightElements, scrollY = 0, scrollYOffset = 0, title, titleProps = {}, }) => {
43
43
  const Left = () => {
44
44
  if (hideLeftElements) {
45
45
  return null;
@@ -56,7 +56,7 @@ const Header = ({ animated = false, hideLeftElements, hideRightElements, hideTit
56
56
  return ((0, jsx_runtime_1.jsx)(Flex_1.Flex, { flex: 1, flexDirection: "row", children: (0, jsx_runtime_1.jsx)(Flex_1.Flex, { alignItems: "center", width: "100%", ...titleProps, children: (0, jsx_runtime_1.jsx)(Text_1.Text, { variant: "sm-display", numberOfLines: 1, children: title }) }) }));
57
57
  }
58
58
  // Show / hide the title to avoid rerenders, which retrigger the animation
59
- const display = scrollY < constants_1.NAVBAR_HEIGHT ? "none" : "flex";
59
+ const display = scrollY < constants_1.NAVBAR_HEIGHT + scrollYOffset ? "none" : "flex";
60
60
  return ((0, jsx_runtime_1.jsx)(Flex_1.Flex, { flex: 1, flexDirection: "row", children: (0, jsx_runtime_1.jsx)(react_native_reanimated_1.default.View, { entering: react_native_reanimated_1.FadeIn.duration(400).easing(react_native_reanimated_1.Easing.out(react_native_reanimated_1.Easing.exp)), exiting: react_native_reanimated_1.FadeOut.duration(400).easing(react_native_reanimated_1.Easing.out(react_native_reanimated_1.Easing.exp)), style: {
61
61
  display,
62
62
  flex: 1,
@@ -2,6 +2,8 @@
2
2
  export interface ScreenScrollContextProps {
3
3
  currentScrollY: number;
4
4
  updateCurrentScrollY: (scrollY: number) => void;
5
+ scrollYOffset?: number;
6
+ updateScrollYOffset: (offset: number) => void;
5
7
  }
6
8
  export declare const ScreenScrollContextProvider: React.FC<React.PropsWithChildren>;
7
9
  export declare const useScreenScrollContext: () => ScreenScrollContextProps;
@@ -6,14 +6,21 @@ const react_1 = require("react");
6
6
  const ScreenScrollContext = (0, react_1.createContext)({
7
7
  currentScrollY: 0,
8
8
  updateCurrentScrollY: () => { },
9
+ scrollYOffset: undefined,
10
+ updateScrollYOffset: () => { },
9
11
  });
10
12
  const ScreenScrollContextProvider = ({ children }) => {
11
13
  const [currentScrollY, setCurrentScrollY] = (0, react_1.useState)(0);
14
+ const [scrollYOffset, setScrollYOffset] = (0, react_1.useState)(undefined);
12
15
  const providerValue = {
13
16
  currentScrollY,
17
+ scrollYOffset,
14
18
  updateCurrentScrollY: (scrollY) => {
15
19
  setCurrentScrollY(scrollY);
16
20
  },
21
+ updateScrollYOffset: (yOffset) => {
22
+ setScrollYOffset(yOffset);
23
+ },
17
24
  };
18
25
  return ((0, jsx_runtime_1.jsx)(ScreenScrollContext.Provider, { value: providerValue, children: children }));
19
26
  };
@@ -1,2 +1,2 @@
1
1
  import { SharedValue } from "react-native-reanimated";
2
- export declare const useAnimatedHeaderScrolling: (scrollY: SharedValue<number>) => number;
2
+ export declare const useAnimatedHeaderScrolling: (scrollY: SharedValue<number>, scrollYOffset?: number) => number;
@@ -4,9 +4,10 @@ exports.useAnimatedHeaderScrolling = void 0;
4
4
  const react_1 = require("react");
5
5
  const react_native_reanimated_1 = require("react-native-reanimated");
6
6
  const constants_1 = require("../constants");
7
- const useAnimatedHeaderScrolling = (scrollY) => {
7
+ const useAnimatedHeaderScrolling = (scrollY, scrollYOffset = 0) => {
8
8
  const listenForScroll = (0, react_native_reanimated_1.useSharedValue)(true);
9
9
  const [currScrollY, setCurrScrollY] = (0, react_1.useState)(scrollY.value);
10
+ const HEADER_HEIGHT = (0, react_1.useMemo)(() => constants_1.NAVBAR_HEIGHT + scrollYOffset, [scrollYOffset]);
10
11
  // Needed to run on JS thread
11
12
  const update = (y) => {
12
13
  setCurrScrollY(y);
@@ -25,17 +26,17 @@ const useAnimatedHeaderScrolling = (scrollY) => {
25
26
  const [prevScrollY] = previousScroll ?? [0, false];
26
27
  // Hacky way to avoid some weird header behavior.
27
28
  // look at HACKS.md for more info.
28
- const suddenlyScrolled = Math.abs(animatedScrollY - prevScrollY) > constants_1.NAVBAR_HEIGHT;
29
+ const suddenlyScrolled = Math.abs(animatedScrollY - prevScrollY) > HEADER_HEIGHT;
29
30
  if (isListeningForScroll && suddenlyScrolled) {
30
31
  return;
31
32
  }
32
- const prevTitleShown = prevScrollY >= constants_1.NAVBAR_HEIGHT;
33
- const currTitleShown = animatedScrollY >= constants_1.NAVBAR_HEIGHT;
33
+ const prevTitleShown = prevScrollY >= HEADER_HEIGHT;
34
+ const currTitleShown = animatedScrollY >= HEADER_HEIGHT;
34
35
  if (prevTitleShown === currTitleShown) {
35
36
  return;
36
37
  }
37
38
  (0, react_native_reanimated_1.runOnJS)(update)(Math.floor(animatedScrollY));
38
- }, [scrollY]);
39
+ }, [scrollY, HEADER_HEIGHT]);
39
40
  return currScrollY;
40
41
  };
41
42
  exports.useAnimatedHeaderScrolling = useAnimatedHeaderScrolling;
@@ -6,9 +6,9 @@ const react_native_reanimated_1 = require("react-native-reanimated");
6
6
  const useAnimatedHeaderScrolling_1 = require("./useAnimatedHeaderScrolling");
7
7
  const ScreenScrollContext_1 = require("../ScreenScrollContext");
8
8
  const useListenForScreenScroll = () => {
9
- const { updateCurrentScrollY } = (0, ScreenScrollContext_1.useScreenScrollContext)();
9
+ const { updateCurrentScrollY, scrollYOffset } = (0, ScreenScrollContext_1.useScreenScrollContext)();
10
10
  const animatedScrollY = (0, react_native_reanimated_1.useSharedValue)(0);
11
- const scrollY = (0, useAnimatedHeaderScrolling_1.useAnimatedHeaderScrolling)(animatedScrollY);
11
+ const scrollY = (0, useAnimatedHeaderScrolling_1.useAnimatedHeaderScrolling)(animatedScrollY, scrollYOffset);
12
12
  const scrollHandler = (0, react_native_reanimated_1.useAnimatedScrollHandler)({
13
13
  onScroll: (event) => {
14
14
  animatedScrollY.value = event.contentOffset.y;
@@ -6,8 +6,8 @@ const react_native_collapsible_tab_view_1 = require("react-native-collapsible-ta
6
6
  const ScreenScrollContext_1 = require("../../Screen/ScreenScrollContext");
7
7
  const useAnimatedHeaderScrolling_1 = require("../../Screen/hooks/useAnimatedHeaderScrolling");
8
8
  const useListenForTabContentScroll = () => {
9
- const scrollY = (0, useAnimatedHeaderScrolling_1.useAnimatedHeaderScrolling)((0, react_native_collapsible_tab_view_1.useCurrentTabScrollY)());
10
- const { updateCurrentScrollY } = (0, ScreenScrollContext_1.useScreenScrollContext)();
9
+ const { updateCurrentScrollY, scrollYOffset } = (0, ScreenScrollContext_1.useScreenScrollContext)();
10
+ const scrollY = (0, useAnimatedHeaderScrolling_1.useAnimatedHeaderScrolling)((0, react_native_collapsible_tab_view_1.useCurrentTabScrollY)(), scrollYOffset);
11
11
  (0, react_1.useEffect)(() => {
12
12
  updateCurrentScrollY(scrollY);
13
13
  }, [scrollY, updateCurrentScrollY]);
@@ -1,8 +1,9 @@
1
+ export type GeminiResizeMode = "fit" | "fill";
1
2
  export declare function createGeminiUrl({ imageURL, width, height, geminiHost, imageQuality, resizeMode, }: {
2
3
  imageURL: string;
3
4
  width: number;
4
5
  height: number;
5
6
  geminiHost?: string;
6
7
  imageQuality?: number;
7
- resizeMode?: "fit" | "fill";
8
+ resizeMode?: GeminiResizeMode;
8
9
  }): string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@artsy/palette-mobile",
3
- "version": "13.0.5",
3
+ "version": "13.0.7",
4
4
  "description": "Artsy's design system for React Native",
5
5
  "scripts": {
6
6
  "android": "react-native run-android",