@chem-po/react-native 0.0.52 → 0.0.53

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 (98) hide show
  1. package/package.json +5 -20
  2. package/src/components/box/Center.tsx +0 -19
  3. package/src/components/box/CollapseHorizontal.tsx +0 -44
  4. package/src/components/box/ContentBox.tsx +0 -24
  5. package/src/components/box/DropShadow.tsx +0 -28
  6. package/src/components/box/ExpandOnMount.tsx +0 -74
  7. package/src/components/box/Expandable.tsx +0 -143
  8. package/src/components/box/FullSizeContainer.tsx +0 -64
  9. package/src/components/box/index.ts +0 -7
  10. package/src/components/button/ActionButton.tsx +0 -196
  11. package/src/components/button/ButtonText.tsx +0 -60
  12. package/src/components/button/DeleteButton.tsx +0 -288
  13. package/src/components/button/LoadingButton.tsx +0 -41
  14. package/src/components/button/Toggle.tsx +0 -109
  15. package/src/components/button/hooks.ts +0 -66
  16. package/src/components/button/index.ts +0 -5
  17. package/src/components/feed/FeedContentPane.tsx +0 -97
  18. package/src/components/feed/MediaFeed.tsx +0 -199
  19. package/src/components/feed/MediaFeedBackground.tsx +0 -136
  20. package/src/components/feed/MediaFeedRefresh.tsx +0 -113
  21. package/src/components/feed/constants.ts +0 -2
  22. package/src/components/feed/context.tsx +0 -19
  23. package/src/components/feed/hooks.ts +0 -279
  24. package/src/components/feed/index.ts +0 -2
  25. package/src/components/form/Condition.tsx +0 -27
  26. package/src/components/form/Field.tsx +0 -44
  27. package/src/components/form/Form.tsx +0 -452
  28. package/src/components/form/FormFooter.tsx +0 -164
  29. package/src/components/form/UploadProgress/index.tsx +0 -50
  30. package/src/components/form/index.ts +0 -3
  31. package/src/components/form/input/Editable.tsx +0 -206
  32. package/src/components/form/input/InputSlider.tsx +0 -71
  33. package/src/components/form/input/OptionalTag.tsx +0 -43
  34. package/src/components/form/input/StandaloneInput.tsx +0 -49
  35. package/src/components/form/input/boolean/index.tsx +0 -53
  36. package/src/components/form/input/color/index.tsx +0 -145
  37. package/src/components/form/input/common/InputClearButton.tsx +0 -57
  38. package/src/components/form/input/date/index.tsx +0 -125
  39. package/src/components/form/input/datetime/index.tsx +0 -176
  40. package/src/components/form/input/file/index.tsx +0 -310
  41. package/src/components/form/input/hooks/index.ts +0 -2
  42. package/src/components/form/input/hooks/useInputColor.ts +0 -7
  43. package/src/components/form/input/hooks/useInputImperativeHandle.ts +0 -22
  44. package/src/components/form/input/hooks/useInputStyles.ts +0 -114
  45. package/src/components/form/input/index.ts +0 -4
  46. package/src/components/form/input/input.tsx +0 -218
  47. package/src/components/form/input/multipleSelect/index.tsx +0 -221
  48. package/src/components/form/input/number/index.tsx +0 -108
  49. package/src/components/form/input/select/index.tsx +0 -152
  50. package/src/components/form/input/socialMedia/index.tsx +0 -235
  51. package/src/components/form/input/text/AutoResizeTextarea.tsx +0 -41
  52. package/src/components/form/input/text/index.tsx +0 -99
  53. package/src/components/form/input/text/textarea.tsx +0 -32
  54. package/src/components/form/input/text/useWebAutoResize.tsx +0 -73
  55. package/src/components/form/input/time/index.tsx +0 -125
  56. package/src/components/form/types.ts +0 -8
  57. package/src/components/form/view/file.tsx +0 -80
  58. package/src/components/form/view/index.tsx +0 -125
  59. package/src/components/form/view/multipleSelect.tsx +0 -85
  60. package/src/components/form/view/select.tsx +0 -83
  61. package/src/components/form/view/styles.ts +0 -12
  62. package/src/components/icons/index.tsx +0 -28
  63. package/src/components/image/ImageViewModal.tsx +0 -319
  64. package/src/components/image/index.ts +0 -1
  65. package/src/components/index.ts +0 -8
  66. package/src/components/layout/CollapseHorizontal.tsx +0 -92
  67. package/src/components/loading/CircularProgress.tsx +0 -56
  68. package/src/components/loading/Loading.tsx +0 -146
  69. package/src/components/loading/LoadingImage.tsx +0 -163
  70. package/src/components/loading/LoadingOverlay.tsx +0 -74
  71. package/src/components/loading/LoadingSwitch.tsx +0 -110
  72. package/src/components/loading/ProgressBar.tsx +0 -75
  73. package/src/components/loading/index.ts +0 -6
  74. package/src/components/text/AnimatedText.tsx +0 -68
  75. package/src/components/text/Txt.tsx +0 -12
  76. package/src/components/text/index.ts +0 -1
  77. package/src/components/theme/colorMode/DarkModeToggle.tsx +0 -47
  78. package/src/components/theme/colorMode/index.ts +0 -1
  79. package/src/components/theme/index.ts +0 -1
  80. package/src/constants/index.ts +0 -1
  81. package/src/constants/toast.ts +0 -24
  82. package/src/contexts/fonts.tsx +0 -23
  83. package/src/contexts/index.ts +0 -1
  84. package/src/contexts/root.tsx +0 -190
  85. package/src/hooks/index.ts +0 -3
  86. package/src/hooks/useFadeIn.ts +0 -48
  87. package/src/hooks/useFont.ts +0 -25
  88. package/src/hooks/useRefreshFontScale.ts +0 -39
  89. package/src/hooks/useThemeState.ts +0 -43
  90. package/src/index.ts +0 -6
  91. package/src/store/index.ts +0 -2
  92. package/src/store/useFontScale.ts +0 -8
  93. package/src/store/useScreen.ts +0 -25
  94. package/src/styles/fill.ts +0 -19
  95. package/src/types/forms.ts +0 -14
  96. package/src/types/index.ts +0 -1
  97. package/src/utils/downloadFile.ts +0 -61
  98. package/src/utils/downloadFileLegacy.ts +0 -66
@@ -1,199 +0,0 @@
1
- import { AnyObject, WithId } from '@chem-po/core'
2
- import {
3
- MediaBackgroundRef,
4
- MediaFeedProps,
5
- PanelData,
6
- UpdatePanelsArgs,
7
- useScreen,
8
- useTheme,
9
- } from '@chem-po/react'
10
- import React, { Dispatch, PropsWithChildren, useCallback, useMemo, useRef, useState } from 'react'
11
- import { Animated, StyleSheet, View, ViewStyle } from 'react-native'
12
- import {
13
- Gesture,
14
- GestureDetector,
15
- GestureStateChangeEvent,
16
- GestureUpdateEvent,
17
- PanGestureHandlerEventPayload,
18
- } from 'react-native-gesture-handler'
19
- import { fill } from '../../styles/fill'
20
- import { Center } from '../box/Center'
21
- import { LoadingOverlay } from '../loading/LoadingOverlay'
22
- import { REFRESH_THRESHOLD, SWIPE_THRESHOLD } from './constants'
23
- import { MediaFeedProvider } from './context'
24
- import { FeedContentPane } from './FeedContentPane'
25
- import { useMediaFeed } from './hooks'
26
- import { MediaFeedBackground } from './MediaFeedBackground'
27
- import { MediaFeedRefresh } from './MediaFeedRefresh'
28
-
29
- const useUpdatePanels = (setItems: Dispatch<React.SetStateAction<Array<PanelData>>>) =>
30
- useCallback(
31
- (data: UpdatePanelsArgs) => {
32
- const updated: PanelData[] = []
33
- if (data.prev) updated.push({ status: 'prev', id: data.prev })
34
- if (data.curr) {
35
- updated.push({
36
- status: 'current',
37
- id: data.curr,
38
- })
39
- }
40
- if (data.next) updated.push({ status: 'next', id: data.next })
41
- setItems(updated)
42
- },
43
- [setItems],
44
- )
45
-
46
- export const MediaFeed = <T extends AnyObject = AnyObject>({
47
- fetch,
48
- collection: collectionPath,
49
- RenderItem,
50
- authRequired,
51
- getBackgroundUrl,
52
- getBackgroundValue,
53
- limit,
54
- defaultBackground,
55
- swipeDisabled,
56
- children,
57
- }: PropsWithChildren<MediaFeedProps<T>>) => {
58
- const { width, height } = useScreen()
59
- const { theme } = useTheme()
60
-
61
- const contentRef = useRef<View>(null)
62
- const containerRef = useRef<View>(null)
63
- // const panels = useRef<Array<FeedContentPaneRef>>([])
64
- const [direction, setDirection] = useState<'next' | 'prev' | null>(null)
65
- const [panels, setPanels] = useState<Array<PanelData>>([])
66
-
67
- const offsetY = useRef(new Animated.Value(0)).current
68
- const onNewData = useUpdatePanels(setPanels)
69
-
70
- const backgroundRef = useRef<MediaBackgroundRef<T>>(null)
71
-
72
- const { goNext, goPrev, loading, canGoNext, canGoPrev, refresh, refreshing } = useMediaFeed(
73
- fetch,
74
- onNewData,
75
- limit,
76
- authRequired,
77
- )
78
-
79
- const pointerDown = useRef(false)
80
- const dragStart = useRef({ x: 0, y: 0 })
81
-
82
- const onDragStart = useCallback(
83
- (e: GestureStateChangeEvent<PanGestureHandlerEventPayload>) => {
84
- if (swipeDisabled) return
85
- pointerDown.current = true
86
- dragStart.current = { x: e.x, y: e.y }
87
- },
88
- [swipeDisabled],
89
- )
90
-
91
- const onDragEnd = useCallback(
92
- (e: GestureStateChangeEvent<PanGestureHandlerEventPayload>) => {
93
- if (!pointerDown.current) return
94
-
95
- const maxY = canGoPrev ? SWIPE_THRESHOLD : REFRESH_THRESHOLD
96
- const minY = canGoNext ? -SWIPE_THRESHOLD : -REFRESH_THRESHOLD
97
- const oY = Math.max(minY, Math.min(maxY, e.y - dragStart.current.y))
98
-
99
- if (canGoNext && oY < -(SWIPE_THRESHOLD - 10)) {
100
- setDirection('next')
101
- goNext()
102
- } else if (canGoPrev && oY > SWIPE_THRESHOLD - 10) {
103
- setDirection('prev')
104
- goPrev()
105
- } else if (oY > REFRESH_THRESHOLD - 10 || oY < -(REFRESH_THRESHOLD - 10)) {
106
- refresh()
107
- if (backgroundRef.current) backgroundRef.current.onNewData(null)
108
- }
109
-
110
- offsetY.setValue(0)
111
- pointerDown.current = false
112
- },
113
- [offsetY, goNext, goPrev, canGoNext, canGoPrev, refresh],
114
- )
115
-
116
- const onDragMove = useCallback(
117
- (e: GestureUpdateEvent<PanGestureHandlerEventPayload>) => {
118
- if (!pointerDown.current) return
119
-
120
- const oX = Math.max(-10, Math.min(10, e.x - dragStart.current.x))
121
- const maxY = canGoPrev ? SWIPE_THRESHOLD : REFRESH_THRESHOLD
122
- const minY = canGoNext ? -SWIPE_THRESHOLD : -REFRESH_THRESHOLD
123
- const oY = Math.max(minY, Math.min(maxY, e.y - dragStart.current.y))
124
-
125
- const dist = Math.sqrt(oX ** 2 + oY ** 2)
126
- if (dist > 10 && contentRef.current) {
127
- // contentRef.current.style.setProperty('pointer-events', 'none')
128
- }
129
- offsetY.setValue(oY)
130
- },
131
- [offsetY, canGoNext, canGoPrev],
132
- )
133
-
134
- const panGesture = Gesture.Pan().onStart(onDragStart).onUpdate(onDragMove).onEnd(onDragEnd)
135
-
136
- const containerStyle = useMemo<ViewStyle>(
137
- () => ({
138
- height,
139
- width,
140
- overflow: 'hidden',
141
- pointerEvents: swipeDisabled ? 'none' : 'auto',
142
- }),
143
- [width, height, swipeDisabled],
144
- )
145
- const [curr, setCurr] = useState<WithId<T> | null>(null)
146
-
147
- const handleItemLoad = useCallback(
148
- (data: WithId<T> | null) => {
149
- const isCurr = panels.find(p => p.status === 'current')?.id === data?.id
150
- if (isCurr) setCurr(data)
151
- },
152
- [panels],
153
- )
154
-
155
- return (
156
- <MediaFeedProvider curr={curr}>
157
- <GestureDetector gesture={panGesture}>
158
- <Center
159
- style={[
160
- styles.container,
161
- { backgroundColor: defaultBackground ?? theme.colors.background[100] },
162
- ]}>
163
- <MediaFeedBackground
164
- item={curr}
165
- getBackgroundValue={getBackgroundValue}
166
- getBackgroundUrl={getBackgroundUrl}
167
- />
168
- <View style={containerStyle} ref={containerRef}>
169
- <Center style={fill.relative} ref={contentRef}>
170
- {panels.map(panel => (
171
- <FeedContentPane<T>
172
- key={panel.id}
173
- id={panel.id}
174
- collectionPath={collectionPath}
175
- RenderItem={RenderItem}
176
- onItemLoad={handleItemLoad}
177
- status={panel.status}
178
- enterStatus={direction}
179
- offsetY={offsetY}
180
- />
181
- ))}
182
- </Center>
183
- </View>
184
- <MediaFeedRefresh canRefresh={!canGoPrev} refreshing={refreshing} offsetY={offsetY} />
185
- {/* {onSwipeUp ? <MediaFeedSwipeUp offsetY={offsetY} /> : null} */}
186
- <LoadingOverlay loading={loading} />
187
- {children ? <Center style={[fill.absolute, { zIndex: 3 }]}>{children}</Center> : null}
188
- </Center>
189
- </GestureDetector>
190
- </MediaFeedProvider>
191
- )
192
- }
193
-
194
- const styles = StyleSheet.create({
195
- container: {
196
- ...fill.relative,
197
- overflow: 'hidden',
198
- },
199
- })
@@ -1,136 +0,0 @@
1
- import { AnyObject, WithId } from '@chem-po/core'
2
- import { GetBackgroundUrl, GetBackgroundValue, useObjectUrl } from '@chem-po/react'
3
- import React, { useEffect, useMemo, useRef, useState } from 'react'
4
- import { ImageBackground, StyleSheet, View, ViewProps } from 'react-native'
5
- import { fill } from '../../styles/fill'
6
- import { Center } from '../box/Center'
7
- import { LoadingLogo } from '../loading'
8
-
9
- const emptyPng =
10
- 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkAAIAAAoAAv/lxKUAAAAASUVORK5CYII='
11
- export const backgroundStyle = StyleSheet.create({
12
- imageBackground: {
13
- flex: 1,
14
- transform: [{ scale: 1.075 }],
15
- },
16
- })
17
-
18
- interface FillBackgroundProps extends ViewProps {
19
- background: string | null
20
- opacity?: number
21
- }
22
-
23
- const FillBackground: React.FC<FillBackgroundProps> = ({
24
- background,
25
- opacity = 0.7,
26
- style,
27
- ...props
28
- }) => (
29
- <View style={[fill.absolute, style]} {...props}>
30
- <ImageBackground
31
- source={{ uri: background ?? emptyPng }}
32
- style={[backgroundStyle.imageBackground, { opacity }]}
33
- resizeMode="cover"></ImageBackground>
34
- </View>
35
- )
36
-
37
- interface FileValueBackgroundProps<T extends AnyObject = AnyObject> {
38
- getBackgroundValue: GetBackgroundValue<T>
39
- item: WithId<T> | null
40
- filter?: string
41
- }
42
- const FileValueBackground = <T extends AnyObject = AnyObject>({
43
- getBackgroundValue,
44
- item,
45
- }: FileValueBackgroundProps<T>) => {
46
- const background = useMemo(
47
- () => (item ? getBackgroundValue(item) : null),
48
- [getBackgroundValue, item],
49
- )
50
- const { loading, url } = useObjectUrl(background)
51
- const usedIndex = useRef(0)
52
- const [index, setIndex] = useState(0)
53
- const [url1, setUrl1] = useState<string | null>(null)
54
- const [url2, setUrl2] = useState<string | null>(null)
55
-
56
- useEffect(() => {
57
- const usedIdx = usedIndex.current
58
- if (usedIdx === 0) {
59
- setUrl1(url)
60
- usedIndex.current = 1
61
- setIndex(0)
62
- } else {
63
- setUrl2(url)
64
- usedIndex.current = 0
65
- setIndex(1)
66
- }
67
- }, [url])
68
-
69
- return (
70
- <Center style={fill.absolute}>
71
- <FillBackground opacity={index === 0 ? 1 : 0} background={url1} />
72
- <FillBackground opacity={index === 1 ? 1 : 0} background={url2} />
73
- <LoadingLogo isLoading={loading} />
74
- </Center>
75
- )
76
- }
77
-
78
- const UrlBackground = <T extends AnyObject = AnyObject>({
79
- getBackgroundUrl,
80
- item,
81
- }: {
82
- getBackgroundUrl: GetBackgroundUrl<T>
83
- item: T | null
84
- }) => {
85
- const background = useMemo(() => (item ? getBackgroundUrl(item) : null), [getBackgroundUrl, item])
86
- const usedIndex = useRef(0)
87
- const [index, setIndex] = useState(0)
88
- const [url1, setUrl1] = useState<string | null>(null)
89
- const [url2, setUrl2] = useState<string | null>(null)
90
-
91
- useEffect(() => {
92
- if (!background) return
93
- if (usedIndex.current === 0) {
94
- setUrl1(background)
95
- usedIndex.current = 1
96
- setIndex(0)
97
- } else {
98
- setUrl2(background)
99
- usedIndex.current = 0
100
- setIndex(1)
101
- }
102
- }, [background])
103
-
104
- return (
105
- <Center style={fill.absolute}>
106
- <FillBackground
107
- //filter={filter}
108
- opacity={index === 0 ? 1 : 0}
109
- background={url1}
110
- />
111
- <FillBackground
112
- //filter={filter}
113
- opacity={index === 1 ? 1 : 0}
114
- background={url2}
115
- />
116
- </Center>
117
- )
118
- }
119
-
120
- interface MediaFeedBackgroundProps<T extends AnyObject = AnyObject> {
121
- getBackgroundValue?: GetBackgroundValue<T>
122
- getBackgroundUrl?: GetBackgroundUrl<T>
123
- filter?: string
124
- item: WithId<T> | null
125
- }
126
-
127
- export const MediaFeedBackground = <T extends AnyObject = AnyObject>({
128
- getBackgroundValue,
129
- getBackgroundUrl,
130
- ...props
131
- }: MediaFeedBackgroundProps<T>) => {
132
- if (getBackgroundValue)
133
- return <FileValueBackground getBackgroundValue={getBackgroundValue} {...props} />
134
- if (getBackgroundUrl) return <UrlBackground getBackgroundUrl={getBackgroundUrl} {...props} />
135
- return null
136
- }
@@ -1,113 +0,0 @@
1
- import Icon from '@expo/vector-icons/MaterialCommunityIcons' // or your preferred icon set
2
- import React, { useEffect, useRef } from 'react'
3
- import { Animated, StyleSheet, View } from 'react-native'
4
- import { DropShadow } from '../box/DropShadow'
5
- import { CircularProgress } from '../loading'
6
- import { REFRESH_THRESHOLD, SWIPE_THRESHOLD } from './constants'
7
-
8
- const WINDOW = REFRESH_THRESHOLD - SWIPE_THRESHOLD
9
-
10
- export const MediaFeedRefresh = ({
11
- offsetY,
12
- refreshing,
13
- canRefresh,
14
- }: {
15
- offsetY: Animated.Value
16
- refreshing: boolean
17
- canRefresh: boolean
18
- }) => {
19
- // Create animated values
20
- const baseY = useRef(new Animated.Value(0)).current
21
- const isIn = useRef(new Animated.Value(0)).current
22
-
23
- const dist = Animated.subtract(offsetY, SWIPE_THRESHOLD)
24
- const baseProgress = Animated.divide(dist, WINDOW)
25
- const progress = Animated.diffClamp(baseProgress, 0, 1)
26
-
27
- // Handle refreshing state
28
- useEffect(() => {
29
- Animated.spring(baseY, {
30
- toValue: refreshing ? 50 : 0,
31
- useNativeDriver: true,
32
- }).start()
33
- }, [refreshing, baseY])
34
-
35
- // Handle canRefresh state
36
- useEffect(() => {
37
- Animated.spring(isIn, {
38
- toValue: canRefresh ? 1 : 0,
39
- useNativeDriver: true,
40
- }).start()
41
- }, [canRefresh, isIn])
42
-
43
- // Create complex animations
44
- const progressRoot = progress.interpolate({
45
- inputRange: [0, 1],
46
- outputRange: [0, Math.sqrt(1) * 20],
47
- })
48
-
49
- const yBase = Animated.add(baseY, progressRoot)
50
- const yConstrained = yBase.interpolate({
51
- inputRange: [0, 20],
52
- outputRange: [0, 20],
53
- extrapolate: 'clamp',
54
- })
55
-
56
- const y = Animated.multiply(isIn, yConstrained)
57
-
58
- const scale = y.interpolate({
59
- inputRange: [0, 30],
60
- outputRange: [0, 1],
61
- extrapolate: 'clamp',
62
- })
63
- const finalScale = Animated.multiply(isIn, scale)
64
-
65
- const rotate = progress.interpolate({
66
- inputRange: [0, 1],
67
- outputRange: ['0deg', '180deg'],
68
- })
69
-
70
- return (
71
- <Animated.View
72
- style={[
73
- styles.container,
74
- {
75
- opacity: finalScale,
76
- transform: [{ translateY: y }, { scale: finalScale }, { rotate }],
77
- },
78
- ]}>
79
- <View style={styles.centerContainer}>
80
- <DropShadow
81
- style={[
82
- {
83
- opacity: refreshing ? 0 : 1,
84
- },
85
- ]}>
86
- <Icon name="refresh" size={32} color="white" />
87
- </DropShadow>
88
-
89
- <DropShadow
90
- style={{
91
- opacity: refreshing ? 1 : 0,
92
- }}>
93
- <CircularProgress animating size="large" color="white" />
94
- </DropShadow>
95
- </View>
96
- </Animated.View>
97
- )
98
- }
99
-
100
- const styles = StyleSheet.create({
101
- container: {
102
- position: 'absolute',
103
- top: 0,
104
- left: 0,
105
- right: 0,
106
- pointerEvents: 'none',
107
- },
108
- centerContainer: {
109
- alignItems: 'center',
110
- justifyContent: 'center',
111
- width: '100%',
112
- },
113
- })
@@ -1,2 +0,0 @@
1
- export const SWIPE_THRESHOLD = 75
2
- export const REFRESH_THRESHOLD = 100
@@ -1,19 +0,0 @@
1
- import { AnyObject, WithId } from '@chem-po/core'
2
- import React, { createContext, PropsWithChildren, useContext, useMemo } from 'react'
3
-
4
- interface MediaFeedContextValue<T extends AnyObject = AnyObject> {
5
- curr: WithId<T> | null
6
- }
7
- export const MediaFeedContext = createContext<MediaFeedContextValue<any>>(
8
- {} as MediaFeedContextValue<any>,
9
- )
10
-
11
- export const MediaFeedProvider = <T extends AnyObject = AnyObject>({
12
- curr,
13
- children,
14
- }: PropsWithChildren<{ curr: WithId<T> | null }>) => {
15
- const contextData = useMemo(() => ({ curr }), [curr])
16
- return <MediaFeedContext.Provider value={contextData}>{children}</MediaFeedContext.Provider>
17
- }
18
- export const useMediaFeed = <T extends AnyObject = AnyObject>() =>
19
- useContext(MediaFeedContext) as MediaFeedContextValue<T>