@fountain-ui/lab 2.0.0-beta.34 → 2.0.0-beta.36

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.
Files changed (41) hide show
  1. package/build/commonjs/ComicViewer/ComicViewer.js +196 -143
  2. package/build/commonjs/ComicViewer/ComicViewer.js.map +1 -1
  3. package/build/commonjs/ComicViewer/ComicViewerProps.js +0 -12
  4. package/build/commonjs/ComicViewer/ComicViewerProps.js.map +1 -1
  5. package/build/commonjs/ComicViewer/EncodedTile.js +10 -0
  6. package/build/commonjs/ComicViewer/EncodedTile.js.map +1 -0
  7. package/build/commonjs/ComicViewer/ReloadButton.js +48 -0
  8. package/build/commonjs/ComicViewer/ReloadButton.js.map +1 -0
  9. package/build/commonjs/ComicViewer/ViewerItem.js +41 -173
  10. package/build/commonjs/ComicViewer/ViewerItem.js.map +1 -1
  11. package/build/commonjs/ComicViewer/index.js.map +1 -1
  12. package/build/module/ComicViewer/ComicViewer.js +195 -143
  13. package/build/module/ComicViewer/ComicViewer.js.map +1 -1
  14. package/build/module/ComicViewer/ComicViewerProps.js +1 -6
  15. package/build/module/ComicViewer/ComicViewerProps.js.map +1 -1
  16. package/build/module/ComicViewer/EncodedTile.js +3 -0
  17. package/build/module/ComicViewer/EncodedTile.js.map +1 -0
  18. package/build/module/ComicViewer/ReloadButton.js +33 -0
  19. package/build/module/ComicViewer/ReloadButton.js.map +1 -0
  20. package/build/module/ComicViewer/ViewerItem.js +42 -173
  21. package/build/module/ComicViewer/ViewerItem.js.map +1 -1
  22. package/build/module/ComicViewer/index.js.map +1 -1
  23. package/build/typescript/ComicViewer/ComicViewer.d.ts +1 -1
  24. package/build/typescript/ComicViewer/ComicViewerProps.d.ts +15 -90
  25. package/build/typescript/ComicViewer/EncodedTile.d.ts +2 -0
  26. package/build/typescript/ComicViewer/ReloadButton.d.ts +6 -0
  27. package/build/typescript/ComicViewer/ViewerItem.d.ts +37 -7
  28. package/build/typescript/ComicViewer/index.d.ts +2 -2
  29. package/package.json +2 -2
  30. package/src/ComicViewer/ComicViewer.tsx +210 -157
  31. package/src/ComicViewer/ComicViewerProps.ts +15 -107
  32. package/src/ComicViewer/EncodedTile.ts +3 -0
  33. package/src/ComicViewer/ReloadButton.tsx +36 -0
  34. package/src/ComicViewer/ViewerItem.tsx +82 -184
  35. package/src/ComicViewer/index.ts +2 -2
  36. package/build/commonjs/ComicViewer/ComicViewerItemProps.js +0 -6
  37. package/build/commonjs/ComicViewer/ComicViewerItemProps.js.map +0 -1
  38. package/build/module/ComicViewer/ComicViewerItemProps.js +0 -2
  39. package/build/module/ComicViewer/ComicViewerItemProps.js.map +0 -1
  40. package/build/typescript/ComicViewer/ComicViewerItemProps.d.ts +0 -34
  41. package/src/ComicViewer/ComicViewerItemProps.ts +0 -42
@@ -1,191 +1,60 @@
1
- import React, { useCallback, useEffect, useRef, useState } from 'react';
2
- import { ImageBackground, Platform, TouchableOpacity, View } from 'react-native';
3
- import * as R from 'ramda';
4
- import { IconButton, Image, Spacer } from '@fountain-ui/core';
5
- import { Restart } from '@fountain-ui/icons';
6
- import { STATE } from './ComicViewerProps';
7
-
8
- const useStyles = function () {
9
- return {
10
- root: {
11
- display: 'flex',
12
- flexDirection: 'row',
13
- justifyContent: 'center'
14
- },
15
- reload: {
16
- display: 'flex',
17
- alignItems: 'center'
18
- }
19
- };
20
- };
21
-
22
- function ViewerItem(_ref) {
23
- var _itemState$error;
24
-
25
- let {
26
- props
27
- } = _ref;
1
+ import React from 'react';
2
+ import { Image, TouchableWithoutFeedback, View } from 'react-native';
3
+ import { css, Image as FuiImage } from '@fountain-ui/core';
4
+ import ReloadButton from './ReloadButton';
5
+ import EncodedTile from './EncodedTile';
6
+ export default function ViewerItem(props) {
28
7
  const {
29
- expiresAt,
30
- errorRetryCount = 3,
31
8
  height,
32
- itemState,
33
- isViewable,
34
- sortKey,
35
- responseTimestamp,
36
9
  url,
37
10
  width,
38
- getNextPage,
39
11
  onError,
40
- onLoaded,
41
- onItemPress
12
+ onLoad,
13
+ onPress,
14
+ onReloadPress,
15
+ reloadButtonVisible = false
42
16
  } = props;
43
- const [isLoaded, setIsLoaded] = useState(false);
44
- const styles = useStyles();
45
- const errorCount = useRef(R.defaultTo(0)(itemState === null || itemState === void 0 ? void 0 : (_itemState$error = itemState.error) === null || _itemState$error === void 0 ? void 0 : _itemState$error.count));
46
- const onLoad = useCallback(() => {
47
- errorCount.current = 0;
48
- setIsLoaded(true);
49
- onLoaded && onLoaded(sortKey);
50
- }, [sortKey, onLoaded]);
51
- const handleError = useCallback(() => {
52
- errorCount.current = errorCount.current + 1;
53
- const now = new Date();
54
- const utcNow = now.getTime() + now.getTimezoneOffset() * 60 * 1000;
55
- const expired = new Date(expiresAt).getTime() <= utcNow;
56
- onError && onError({
57
- sortKey,
58
- count: errorCount.current,
59
- expired
60
- });
61
- }, [errorCount.current, onError]);
62
- const onReloadPress = useCallback(() => {
63
- errorCount.current = 1;
64
- onError && onError({
65
- sortKey,
66
- count: errorCount.current,
67
- expired: false
68
- });
69
- }, [sortKey, onError]);
70
- const viewStyle = {
71
- width: '100%',
72
- height,
73
- ...Platform.select({
74
- web: {
75
- 'cursor': 'default'
76
- }
77
- })
78
- };
79
- const imageStyle = {
80
- width,
81
- height
82
- };
83
- const Placeholder = useCallback(props => {
84
- const {
85
- children,
86
- failed
87
- } = props;
88
-
89
- if (!(isViewable || isLoaded || failed) || (itemState === null || itemState === void 0 ? void 0 : itemState.state) === STATE.FAIL || (itemState === null || itemState === void 0 ? void 0 : itemState.state) === STATE.INIT) {
90
- return /*#__PURE__*/React.createElement(ImageBackground, {
91
- source: {
92
- uri: 'https://ssl.pstatic.net/static/m/comic/im/2012/bg_viewbody.jpg'
93
- },
94
- resizeMode: "repeat",
95
- style: viewStyle
96
- });
97
- }
98
-
99
- if (errorCount.current >= errorRetryCount) {
100
- return /*#__PURE__*/React.createElement(ImageBackground, {
101
- source: {
102
- uri: 'https://ssl.pstatic.net/static/m/comic/im/2012/bg_viewbody.jpg'
103
- },
104
- resizeMode: "repeat",
105
- style: [viewStyle, styles.reload]
106
- }, /*#__PURE__*/React.createElement(Spacer, {
107
- size: 20
108
- }), /*#__PURE__*/React.createElement(IconButton, {
109
- children: /*#__PURE__*/React.createElement(Restart, {
110
- fill: '#ffffff'
111
- }),
112
- style: {
113
- width: 48,
114
- height: 48,
115
- borderRadius: 24,
116
- color: '#ffffff',
117
- backgroundColor: '#767676'
118
- },
119
- onPress: onReloadPress
120
- }));
121
- }
122
-
123
- return /*#__PURE__*/React.createElement(ImageBackground, {
124
- source: {
125
- uri: 'https://ssl.pstatic.net/static/m/comic/im/2012/bg_viewbody.jpg'
126
- },
127
- resizeMode: "repeat",
128
- style: viewStyle
129
- }, children);
130
- }, [isViewable, isLoaded, errorCount.current, itemState === null || itemState === void 0 ? void 0 : itemState.state, responseTimestamp]);
131
- useEffect(() => {
132
- if ((itemState === null || itemState === void 0 ? void 0 : itemState.state) === STATE.INIT) {
133
- getNextPage === null || getNextPage === void 0 ? void 0 : getNextPage(sortKey);
17
+ const styles = {
18
+ view: {
19
+ height,
20
+ width: '100%'
21
+ },
22
+ image: {
23
+ height,
24
+ width
134
25
  }
135
- }, []);
136
- return /*#__PURE__*/React.createElement(TouchableOpacity, {
137
- activeOpacity: 1,
138
- onPress: onItemPress
26
+ };
27
+ const error = reloadButtonVisible ? /*#__PURE__*/React.createElement(ReloadButton, {
28
+ onPress: onReloadPress
29
+ }) : null;
30
+ const placeholder = /*#__PURE__*/React.createElement(Image, {
31
+ source: {
32
+ uri: EncodedTile
33
+ },
34
+ resizeMode: 'cover',
35
+ style: styles.image
36
+ });
37
+ return /*#__PURE__*/React.createElement(TouchableWithoutFeedback, {
38
+ onPress: onPress
139
39
  }, /*#__PURE__*/React.createElement(View, {
140
- style: [styles.root, viewStyle]
141
- }, /*#__PURE__*/React.createElement(Image, {
142
- failDependency: [url, expiresAt, responseTimestamp],
143
- disableOutline: true,
144
- key: sortKey,
145
- disableLongClick: true,
40
+ style: styles.view
41
+ }, /*#__PURE__*/React.createElement(FuiImage, {
146
42
  disableDrag: true,
43
+ disableLongClick: true,
44
+ disableOutline: true,
45
+ error: error,
46
+ onError: onError,
147
47
  onLoad: onLoad,
148
- onError: handleError,
149
48
  loading: 'eager',
49
+ placeholder: placeholder,
150
50
  source: {
151
51
  uri: url
152
52
  },
153
- style: imageStyle,
154
53
  square: true,
155
- Placeholder: Placeholder,
156
- disablePlaceholder: true
54
+ style: css([{
55
+ alignSelf: 'center'
56
+ }, styles.image])
157
57
  })));
158
58
  }
159
-
160
- export default /*#__PURE__*/React.memo(ViewerItem, (prevProps, nextProps) => {
161
- var _prevProps$props$item, _nextProps$props$item, _prevProps$props$item2;
162
-
163
- if (prevProps.props.isViewable !== nextProps.props.isViewable) {
164
- return false;
165
- } // NO NEED ?
166
-
167
-
168
- if (prevProps.props.url !== nextProps.props.url) {
169
- return false;
170
- } // NO NEED ?
171
-
172
-
173
- if (prevProps.props.expiresAt !== nextProps.props.expiresAt) {
174
- return false;
175
- }
176
-
177
- if (prevProps.props.width !== nextProps.props.width) {
178
- return false;
179
- }
180
-
181
- if (((_prevProps$props$item = prevProps.props.itemState) === null || _prevProps$props$item === void 0 ? void 0 : _prevProps$props$item.state) !== ((_nextProps$props$item = nextProps.props.itemState) === null || _nextProps$props$item === void 0 ? void 0 : _nextProps$props$item.state)) {
182
- return false;
183
- }
184
-
185
- if (((_prevProps$props$item2 = prevProps.props.itemState) === null || _prevProps$props$item2 === void 0 ? void 0 : _prevProps$props$item2.state) !== STATE.LOADED && prevProps.props.responseTimestamp !== nextProps.props.responseTimestamp) {
186
- return false;
187
- }
188
-
189
- return true;
190
- });
59
+ ;
191
60
  //# sourceMappingURL=ViewerItem.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["React","useCallback","useEffect","useRef","useState","ImageBackground","Platform","TouchableOpacity","View","R","IconButton","Image","Spacer","Restart","STATE","useStyles","root","display","flexDirection","justifyContent","reload","alignItems","ViewerItem","props","expiresAt","errorRetryCount","height","itemState","isViewable","sortKey","responseTimestamp","url","width","getNextPage","onError","onLoaded","onItemPress","isLoaded","setIsLoaded","styles","errorCount","defaultTo","error","count","onLoad","current","handleError","now","Date","utcNow","getTime","getTimezoneOffset","expired","onReloadPress","viewStyle","select","web","imageStyle","Placeholder","children","failed","state","FAIL","INIT","uri","borderRadius","color","backgroundColor","memo","prevProps","nextProps","LOADED"],"sources":["ViewerItem.tsx"],"sourcesContent":["import React, { useCallback, useEffect, useRef, useState } from 'react';\nimport { ImageBackground, Platform, TouchableOpacity, View } from 'react-native';\nimport * as R from 'ramda';\nimport type { PlaceholderProps } from '@fountain-ui/core';\nimport { IconButton, Image, Spacer } from '@fountain-ui/core';\nimport { NamedStylesStringUnion, UseStyles } from '@fountain-ui/styles';\nimport { Restart } from '@fountain-ui/icons';\nimport ComicViewerItemProps from './ComicViewerItemProps';\nimport { STATE } from './ComicViewerProps';\n\ntype PlaceholderStyles = NamedStylesStringUnion<'reload' | 'root'>;\n\nconst useStyles: UseStyles<PlaceholderStyles> = function (): PlaceholderStyles {\n return {\n root: {\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'center',\n },\n reload: {\n display: 'flex',\n alignItems: 'center',\n },\n };\n};\n\nfunction ViewerItem<T>({ props }: { props: ComicViewerItemProps<T> }) {\n const {\n expiresAt,\n errorRetryCount = 3,\n height,\n itemState,\n isViewable,\n sortKey,\n responseTimestamp,\n url,\n width,\n getNextPage,\n onError,\n onLoaded,\n onItemPress,\n } = props;\n\n const [isLoaded, setIsLoaded] = useState(false);\n\n const styles = useStyles();\n\n const errorCount = useRef<number>(R.defaultTo(0)(itemState?.error?.count));\n\n const onLoad = useCallback(() => {\n errorCount.current = 0;\n\n setIsLoaded(true);\n\n onLoaded && onLoaded(sortKey);\n }, [sortKey, onLoaded]);\n\n const handleError = useCallback(() => {\n errorCount.current = errorCount.current + 1;\n\n const now = new Date();\n const utcNow = now.getTime() + (now.getTimezoneOffset() * 60 * 1000);\n const expired = new Date(expiresAt).getTime() <= utcNow;\n\n onError && onError({\n sortKey,\n count: errorCount.current,\n expired,\n });\n }, [errorCount.current, onError]);\n\n const onReloadPress = useCallback(() => {\n errorCount.current = 1;\n\n onError && onError({\n sortKey,\n count: errorCount.current,\n expired: false,\n });\n }, [sortKey, onError]);\n\n const viewStyle = {\n width: '100%',\n height,\n ...Platform.select({\n web: { 'cursor': 'default' },\n }),\n };\n\n const imageStyle = { width, height };\n\n const Placeholder = useCallback((props: PlaceholderProps) => {\n const { children, failed } = props;\n\n if (!(isViewable || isLoaded || failed)\n || (itemState?.state === STATE.FAIL)\n || itemState?.state === STATE.INIT\n ) {\n return <ImageBackground\n source={{ uri: 'https://ssl.pstatic.net/static/m/comic/im/2012/bg_viewbody.jpg' }}\n resizeMode=\"repeat\"\n style={viewStyle}\n />;\n }\n\n if (errorCount.current >= errorRetryCount) {\n return <ImageBackground\n source={{ uri: 'https://ssl.pstatic.net/static/m/comic/im/2012/bg_viewbody.jpg' }}\n resizeMode=\"repeat\"\n style={[\n viewStyle,\n styles.reload,\n ]}\n >\n <Spacer size={20}/>\n\n <IconButton\n children={<Restart fill={'#ffffff'}/>}\n style={{\n width: 48,\n height: 48,\n borderRadius: 24,\n color: '#ffffff',\n backgroundColor: '#767676',\n }}\n onPress={onReloadPress}\n />\n </ImageBackground>;\n }\n\n return <ImageBackground\n source={{ uri: 'https://ssl.pstatic.net/static/m/comic/im/2012/bg_viewbody.jpg' }}\n resizeMode=\"repeat\"\n style={viewStyle}\n >\n {children}\n </ImageBackground>;\n }, [isViewable, isLoaded, errorCount.current, itemState?.state, responseTimestamp]);\n\n useEffect(() => {\n if (itemState?.state === STATE.INIT) {\n getNextPage?.(sortKey);\n }\n }, []);\n\n return (\n <TouchableOpacity\n activeOpacity={1}\n onPress={onItemPress}\n >\n <View\n style={[\n styles.root,\n viewStyle,\n ]}\n >\n <Image\n failDependency={[url, expiresAt, responseTimestamp]}\n disableOutline={true}\n key={sortKey}\n disableLongClick={true}\n disableDrag={true}\n onLoad={onLoad}\n onError={handleError}\n loading={'eager'}\n source={{ uri: url }}\n style={imageStyle}\n square={true}\n Placeholder={Placeholder}\n disablePlaceholder={true}\n />\n </View>\n </TouchableOpacity>\n );\n}\n\nexport default React.memo(ViewerItem, (prevProps, nextProps) => {\n if (prevProps.props.isViewable !== nextProps.props.isViewable) {\n return false;\n }\n\n // NO NEED ?\n if (prevProps.props.url !== nextProps.props.url) {\n return false;\n }\n\n // NO NEED ?\n if (prevProps.props.expiresAt !== nextProps.props.expiresAt) {\n return false;\n }\n\n if (prevProps.props.width !== nextProps.props.width) {\n return false;\n }\n\n if (prevProps.props.itemState?.state !== nextProps.props.itemState?.state) {\n return false;\n }\n\n if (prevProps.props.itemState?.state !== STATE.LOADED && prevProps.props.responseTimestamp !== nextProps.props.responseTimestamp) {\n return false;\n }\n\n return true;\n});"],"mappings":"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"}
1
+ {"version":3,"names":["React","Image","TouchableWithoutFeedback","View","css","FuiImage","ReloadButton","EncodedTile","ViewerItem","props","height","url","width","onError","onLoad","onPress","onReloadPress","reloadButtonVisible","styles","view","image","error","placeholder","uri","alignSelf"],"sources":["ViewerItem.tsx"],"sourcesContent":["import React from 'react';\nimport { Image, TouchableWithoutFeedback, View } from 'react-native';\nimport { css, Image as FuiImage, ImageProps } from '@fountain-ui/core';\nimport ReloadButton from './ReloadButton';\nimport EncodedTile from './EncodedTile';\n\nexport interface ViewerItemProps {\n /**\n * Image width.\n */\n width: number;\n\n /**\n * Image height.\n */\n height: number;\n\n /**\n * Image sourceUrl for displaying.\n */\n url?: string;\n\n /**\n * Error handler.\n */\n onError?: ImageProps['onError'];\n\n /**\n * Load handler.\n */\n onLoad?: ImageProps['onLoad'];\n\n /**\n * Handle Reload button press event.\n */\n onReloadPress?: ImageProps['onError'];\n\n /**\n * Handle item press event.\n */\n onPress?: () => void;\n\n /**\n * If true, reload button visible.\n * @default false\n */\n reloadButtonVisible?: boolean;\n}\n\nexport default function ViewerItem(props: ViewerItemProps) {\n const {\n height,\n url,\n width,\n onError,\n onLoad,\n onPress,\n onReloadPress,\n reloadButtonVisible = false,\n } = props;\n\n const styles = {\n view: {\n height,\n width: '100%',\n },\n image: {\n height,\n width,\n },\n };\n\n const error = reloadButtonVisible ? <ReloadButton onPress={onReloadPress}/> : null;\n\n const placeholder = <Image\n source={{ uri: EncodedTile }}\n resizeMode={'cover'}\n style={styles.image}\n />;\n\n return (\n <TouchableWithoutFeedback onPress={onPress}>\n <View style={styles.view}>\n <FuiImage\n disableDrag={true}\n disableLongClick={true}\n disableOutline={true}\n error={error}\n onError={onError}\n onLoad={onLoad}\n loading={'eager'}\n placeholder={placeholder}\n source={{ uri: url }}\n square={true}\n style={css([\n { alignSelf: 'center' },\n styles.image,\n ])}\n />\n </View>\n </TouchableWithoutFeedback>\n );\n};\n"],"mappings":"AAAA,OAAOA,KAAP,MAAkB,OAAlB;AACA,SAASC,KAAT,EAAgBC,wBAAhB,EAA0CC,IAA1C,QAAsD,cAAtD;AACA,SAASC,GAAT,EAAcH,KAAK,IAAII,QAAvB,QAAmD,mBAAnD;AACA,OAAOC,YAAP,MAAyB,gBAAzB;AACA,OAAOC,WAAP,MAAwB,eAAxB;AA6CA,eAAe,SAASC,UAAT,CAAoBC,KAApB,EAA4C;EACvD,MAAM;IACFC,MADE;IAEFC,GAFE;IAGFC,KAHE;IAIFC,OAJE;IAKFC,MALE;IAMFC,OANE;IAOFC,aAPE;IAQFC,mBAAmB,GAAG;EARpB,IASFR,KATJ;EAWA,MAAMS,MAAM,GAAG;IACXC,IAAI,EAAE;MACFT,MADE;MAEFE,KAAK,EAAE;IAFL,CADK;IAKXQ,KAAK,EAAE;MACHV,MADG;MAEHE;IAFG;EALI,CAAf;EAWA,MAAMS,KAAK,GAAGJ,mBAAmB,gBAAG,oBAAC,YAAD;IAAc,OAAO,EAAED;EAAvB,EAAH,GAA6C,IAA9E;EAEA,MAAMM,WAAW,gBAAG,oBAAC,KAAD;IAChB,MAAM,EAAE;MAAEC,GAAG,EAAEhB;IAAP,CADQ;IAEhB,UAAU,EAAE,OAFI;IAGhB,KAAK,EAAEW,MAAM,CAACE;EAHE,EAApB;EAMA,oBACI,oBAAC,wBAAD;IAA0B,OAAO,EAAEL;EAAnC,gBACI,oBAAC,IAAD;IAAM,KAAK,EAAEG,MAAM,CAACC;EAApB,gBACI,oBAAC,QAAD;IACI,WAAW,EAAE,IADjB;IAEI,gBAAgB,EAAE,IAFtB;IAGI,cAAc,EAAE,IAHpB;IAII,KAAK,EAAEE,KAJX;IAKI,OAAO,EAAER,OALb;IAMI,MAAM,EAAEC,MANZ;IAOI,OAAO,EAAE,OAPb;IAQI,WAAW,EAAEQ,WARjB;IASI,MAAM,EAAE;MAAEC,GAAG,EAAEZ;IAAP,CATZ;IAUI,MAAM,EAAE,IAVZ;IAWI,KAAK,EAAEP,GAAG,CAAC,CACP;MAAEoB,SAAS,EAAE;IAAb,CADO,EAEPN,MAAM,CAACE,KAFA,CAAD;EAXd,EADJ,CADJ,CADJ;AAsBH;AAAA"}
@@ -1 +1 @@
1
- {"version":3,"names":["default"],"sources":["index.ts"],"sourcesContent":["export { default } from './ComicViewer';\nexport type { ComicViewerItemData, default as ComicViewerProps, ErrorInfo } from './ComicViewerProps';\nexport type { default as ComicViewerItemProps } from './ComicViewerItemProps';"],"mappings":"AAAA,SAASA,OAAT,QAAwB,eAAxB"}
1
+ {"version":3,"names":["default"],"sources":["index.ts"],"sourcesContent":["export { default } from './ComicViewer';\nexport type { Dimension, default as ComicViewerProps } from './ComicViewerProps';\nexport type { ViewerItemProps } from './ViewerItem';\n"],"mappings":"AAAA,SAASA,OAAT,QAAwB,eAAxB"}
@@ -1,2 +1,2 @@
1
1
  import { default as ComicViewerProps } from './ComicViewerProps';
2
- export default function ComicViewer<T>(props: ComicViewerProps<T>): JSX.Element;
2
+ export default function ComicViewer(props: ComicViewerProps): JSX.Element;
@@ -1,86 +1,21 @@
1
1
  import React from 'react';
2
2
  import { ComponentProps } from '@fountain-ui/core';
3
3
  import { NativeScrollEvent, NativeSyntheticEvent } from 'react-native';
4
- export declare const STATE: {
5
- readonly INIT: "init";
6
- readonly URL_LOADED: "url_loaded";
7
- readonly LOADED: "loaded";
8
- readonly FAIL: "fail";
9
- };
10
- export declare type LoadingState = typeof STATE[keyof typeof STATE];
11
- export interface ComicViewerItemState {
12
- /**
13
- * Comic viewer item sortKey.
14
- */
15
- sortKey: number;
16
- /**
17
- * Content's loading state.
18
- */
19
- state: LoadingState;
20
- /***
21
- * Content's error Info.
22
- */
23
- error?: ErrorInfo;
24
- }
25
- export interface ErrorInfo {
26
- /**
27
- * ComicViewerItemData.sortKey.
28
- */
29
- sortKey: number;
30
- /**
31
- * Number of times an error occurred.
32
- */
33
- count: number;
34
- /**
35
- * Content is Expired: true
36
- */
37
- expired: boolean;
38
- }
39
- export declare type ComicViewerItemData<T = {}> = T & {
40
- /**
41
- * Image height.
42
- */
43
- height: number;
44
- /**
45
- * Unique value for identifying.
46
- */
47
- id: number | undefined;
48
- /**
49
- * Image sourceUrl for displaying.
50
- */
51
- url: string;
52
- /**
53
- * Image width.
54
- */
4
+ export interface Dimension {
55
5
  width: number;
56
- /**
57
- * SortKey
58
- */
59
- sortKey: number;
60
- /**
61
- * Image expire date.
62
- */
63
- expiresAt: string;
64
- /***
65
- * Timestamp when get content response
66
- */
67
- responseTimestamp: number;
68
- };
69
- export default interface ComicViewerProps<T> extends ComponentProps<{
70
- /**
71
- * Data for render.
72
- */
73
- data: ComicViewerItemData<T>[];
6
+ height: number;
7
+ }
8
+ export default interface ComicViewerProps extends ComponentProps<{
74
9
  /**
75
10
  * Delay Time to call the error handler.
76
- * @default 500
11
+ * @default 100
77
12
  */
78
- errorDebounceMillis?: number;
13
+ debounceMillis?: number;
79
14
  /**
80
- * How many times retry onError when same item error occur
15
+ * How many times handle onError directly when item error occur
81
16
  * @default 3
82
17
  */
83
- errorRetryCount?: number;
18
+ autoHandleErrorCount?: number;
84
19
  /**
85
20
  * How many items to render in the initial batch.
86
21
  * @default 1
@@ -97,33 +32,23 @@ export default interface ComicViewerProps<T> extends ComponentProps<{
97
32
  * @default 0
98
33
  */
99
34
  itemVisiblePercentThreshold?: number;
100
- /***
101
- * Timestamp when get content response
35
+ /**
36
+ * Dimensions of each Image considering viewport.
102
37
  */
103
- responseTimestamp: number;
38
+ intrinsicDimensions: Array<Dimension>;
104
39
  /**
105
- * Comic viewer width.
40
+ * Width of viewport.
106
41
  */
107
- viewerWidth: number;
42
+ viewportWidth: number;
108
43
  /**
109
44
  * The value for FlatList windowSize.
110
45
  * @default 3
111
46
  */
112
47
  windowSize?: number;
113
48
  /**
114
- * How many images in one page.
115
- */
116
- pageUnit: number;
117
- /**
118
- * Method for getting next page contents.
119
- * @param sortKey
120
- */
121
- getNextPage?: (sortKey: number) => void;
122
- /**
123
- * Handling all viewerItem errors at once.
124
- * @param errors Array of ViewerItems errorInfo.
49
+ * Get contents urls by indexes.
125
50
  */
126
- onError?: (errors: ErrorInfo[]) => void;
51
+ getUrlByIndex: (indexes: Array<number>) => Promise<Map<number, string> | undefined>;
127
52
  /**
128
53
  * Handle scroll event.
129
54
  * @param event Scroll event.