@artsy/palette-mobile 13.1.3 → 13.1.4

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.
@@ -15,6 +15,8 @@ export interface ImageProps extends CustomFastImageProps {
15
15
  src: string;
16
16
  /** Gemini resize_to param */
17
17
  geminiResizeMode?: GeminiResizeMode;
18
+ /** Show loading state */
19
+ showLoadingState?: boolean;
18
20
  }
19
21
  export declare const Image: React.FC<ImageProps>;
20
22
  export {};
@@ -15,10 +15,13 @@ 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, geminiResizeMode, ...flexProps }) => {
18
+ const Image = ({ aspectRatio, width, height, performResize = true, src, style, resizeMode, geminiResizeMode, showLoadingState = false, ...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)();
22
+ if (showLoadingState) {
23
+ return ((0, jsx_runtime_1.jsx)(Skeleton_1.Skeleton, { children: (0, jsx_runtime_1.jsx)(Skeleton_1.SkeletonBox, { ...dimensions }) }));
24
+ }
22
25
  let uri = src;
23
26
  if (performResize) {
24
27
  uri = (0, createGeminiUrl_1.createGeminiUrl)({
@@ -0,0 +1,10 @@
1
+ import { ReactElement } from "react";
2
+ export declare function LazyFlatlist<T>(props: {
3
+ keyExtractor: (item: T) => string;
4
+ children: (props: {
5
+ viewedItems: Set<string>;
6
+ viewabilityConfig: any;
7
+ onViewableItemsChanged: any;
8
+ hasSeenItem: (item: T) => boolean;
9
+ }) => React.ReactNode | null | undefined;
10
+ }): ReactElement;
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.LazyFlatlist = void 0;
4
+ const useHasSeenItem_1 = require("./useHasSeenItem");
5
+ function LazyFlatlist(props) {
6
+ const { viewabilityConfig, onViewableItemsChanged, hasSeenItem, viewedItems } = (0, useHasSeenItem_1.useHasSeenItem)({
7
+ keyExtractor: props.keyExtractor,
8
+ });
9
+ if (!props.children || typeof props.children !== "function") {
10
+ throw new Error("LazyScrollContext requires children");
11
+ }
12
+ return props.children({
13
+ viewedItems,
14
+ viewabilityConfig,
15
+ onViewableItemsChanged,
16
+ hasSeenItem,
17
+ });
18
+ }
19
+ exports.LazyFlatlist = LazyFlatlist;
@@ -0,0 +1,2 @@
1
+ export * from "./LazyFlatlist";
2
+ export * from "./useHasSeenItem";
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./LazyFlatlist"), exports);
18
+ __exportStar(require("./useHasSeenItem"), exports);
@@ -0,0 +1,12 @@
1
+ import { ViewToken, ViewabilityConfig } from "react-native";
2
+ export declare const useHasSeenItem: <T>({ keyExtractor }: {
3
+ keyExtractor: (item: T) => string;
4
+ }) => {
5
+ onViewableItemsChanged: ({ viewableItems }: {
6
+ viewableItems: ViewToken[];
7
+ changed: ViewToken[];
8
+ }) => void;
9
+ viewabilityConfig: ViewabilityConfig;
10
+ hasSeenItem: (item: T) => boolean;
11
+ viewedItems: Set<string>;
12
+ };
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useHasSeenItem = void 0;
4
+ const react_1 = require("react");
5
+ // This is a custom hook that is used to determine if a user has seen an item in a list or not
6
+ const useHasSeenItem = ({ keyExtractor }) => {
7
+ const [viewedItems, setViewedItems] = (0, react_1.useState)(new Set());
8
+ const viewabilityConfig = (0, react_1.useRef)({
9
+ // Percent of of the item that is visible for a partially occluded item to count as "viewable"
10
+ itemVisiblePercentThreshold: 80,
11
+ minimumViewTime: 300,
12
+ waitForInteraction: false,
13
+ }).current;
14
+ const viewedItemsRef = (0, react_1.useRef)(new Set()).current;
15
+ const onViewableItemsChanged = (0, react_1.useRef)(({ viewableItems }) => {
16
+ viewableItems.forEach(({ item }) => {
17
+ viewedItemsRef.add(keyExtractor(item));
18
+ });
19
+ setViewedItems(new Set(viewedItemsRef));
20
+ }).current;
21
+ const hasSeenItem = (item) => {
22
+ return viewedItems.has(keyExtractor(item));
23
+ };
24
+ return {
25
+ onViewableItemsChanged,
26
+ viewabilityConfig,
27
+ hasSeenItem,
28
+ viewedItems,
29
+ };
30
+ };
31
+ exports.useHasSeenItem = useHasSeenItem;
@@ -26,6 +26,7 @@ export * from "./MeasuredView";
26
26
  export * from "./MenuItem";
27
27
  export * from "./Pill";
28
28
  export * from "./PopIn";
29
+ export * from "./LazyFlatlist";
29
30
  export * from "./Popover";
30
31
  export * from "./ProgressBar";
31
32
  export * from "./Radio";
@@ -42,6 +42,7 @@ __exportStar(require("./MeasuredView"), exports);
42
42
  __exportStar(require("./MenuItem"), exports);
43
43
  __exportStar(require("./Pill"), exports);
44
44
  __exportStar(require("./PopIn"), exports);
45
+ __exportStar(require("./LazyFlatlist"), exports);
45
46
  __exportStar(require("./Popover"), exports);
46
47
  __exportStar(require("./ProgressBar"), exports);
47
48
  __exportStar(require("./Radio"), exports);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@artsy/palette-mobile",
3
- "version": "13.1.3",
3
+ "version": "13.1.4",
4
4
  "description": "Artsy's design system for React Native",
5
5
  "scripts": {
6
6
  "android": "RCT_METRO_PORT=8082 react-native run-android --port 8082",