@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.
- package/build/commonjs/ComicViewer/ComicViewer.js +196 -143
- package/build/commonjs/ComicViewer/ComicViewer.js.map +1 -1
- package/build/commonjs/ComicViewer/ComicViewerProps.js +0 -12
- package/build/commonjs/ComicViewer/ComicViewerProps.js.map +1 -1
- package/build/commonjs/ComicViewer/EncodedTile.js +10 -0
- package/build/commonjs/ComicViewer/EncodedTile.js.map +1 -0
- package/build/commonjs/ComicViewer/ReloadButton.js +48 -0
- package/build/commonjs/ComicViewer/ReloadButton.js.map +1 -0
- package/build/commonjs/ComicViewer/ViewerItem.js +41 -173
- package/build/commonjs/ComicViewer/ViewerItem.js.map +1 -1
- package/build/commonjs/ComicViewer/index.js.map +1 -1
- package/build/module/ComicViewer/ComicViewer.js +195 -143
- package/build/module/ComicViewer/ComicViewer.js.map +1 -1
- package/build/module/ComicViewer/ComicViewerProps.js +1 -6
- package/build/module/ComicViewer/ComicViewerProps.js.map +1 -1
- package/build/module/ComicViewer/EncodedTile.js +3 -0
- package/build/module/ComicViewer/EncodedTile.js.map +1 -0
- package/build/module/ComicViewer/ReloadButton.js +33 -0
- package/build/module/ComicViewer/ReloadButton.js.map +1 -0
- package/build/module/ComicViewer/ViewerItem.js +42 -173
- package/build/module/ComicViewer/ViewerItem.js.map +1 -1
- package/build/module/ComicViewer/index.js.map +1 -1
- package/build/typescript/ComicViewer/ComicViewer.d.ts +1 -1
- package/build/typescript/ComicViewer/ComicViewerProps.d.ts +15 -90
- package/build/typescript/ComicViewer/EncodedTile.d.ts +2 -0
- package/build/typescript/ComicViewer/ReloadButton.d.ts +6 -0
- package/build/typescript/ComicViewer/ViewerItem.d.ts +37 -7
- package/build/typescript/ComicViewer/index.d.ts +2 -2
- package/package.json +2 -2
- package/src/ComicViewer/ComicViewer.tsx +210 -157
- package/src/ComicViewer/ComicViewerProps.ts +15 -107
- package/src/ComicViewer/EncodedTile.ts +3 -0
- package/src/ComicViewer/ReloadButton.tsx +36 -0
- package/src/ComicViewer/ViewerItem.tsx +82 -184
- package/src/ComicViewer/index.ts +2 -2
- package/build/commonjs/ComicViewer/ComicViewerItemProps.js +0 -6
- package/build/commonjs/ComicViewer/ComicViewerItemProps.js.map +0 -1
- package/build/module/ComicViewer/ComicViewerItemProps.js +0 -2
- package/build/module/ComicViewer/ComicViewerItemProps.js.map +0 -1
- package/build/typescript/ComicViewer/ComicViewerItemProps.d.ts +0 -34
- package/src/ComicViewer/ComicViewerItemProps.ts +0 -42
|
@@ -1,191 +1,60 @@
|
|
|
1
|
-
import React
|
|
2
|
-
import {
|
|
3
|
-
import
|
|
4
|
-
import
|
|
5
|
-
import
|
|
6
|
-
|
|
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
|
-
|
|
41
|
-
|
|
12
|
+
onLoad,
|
|
13
|
+
onPress,
|
|
14
|
+
onReloadPress,
|
|
15
|
+
reloadButtonVisible = false
|
|
42
16
|
} = props;
|
|
43
|
-
const
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
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
|
-
|
|
137
|
-
|
|
138
|
-
|
|
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:
|
|
141
|
-
}, /*#__PURE__*/React.createElement(
|
|
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
|
-
|
|
156
|
-
|
|
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 {
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
|
11
|
+
* @default 100
|
|
77
12
|
*/
|
|
78
|
-
|
|
13
|
+
debounceMillis?: number;
|
|
79
14
|
/**
|
|
80
|
-
* How many times
|
|
15
|
+
* How many times handle onError directly when item error occur
|
|
81
16
|
* @default 3
|
|
82
17
|
*/
|
|
83
|
-
|
|
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
|
-
*
|
|
35
|
+
/**
|
|
36
|
+
* Dimensions of each Image considering viewport.
|
|
102
37
|
*/
|
|
103
|
-
|
|
38
|
+
intrinsicDimensions: Array<Dimension>;
|
|
104
39
|
/**
|
|
105
|
-
*
|
|
40
|
+
* Width of viewport.
|
|
106
41
|
*/
|
|
107
|
-
|
|
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
|
-
*
|
|
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
|
-
|
|
51
|
+
getUrlByIndex: (indexes: Array<number>) => Promise<Map<number, string> | undefined>;
|
|
127
52
|
/**
|
|
128
53
|
* Handle scroll event.
|
|
129
54
|
* @param event Scroll event.
|