@chem-po/react-web 0.0.4 → 0.0.6

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 (127) hide show
  1. package/dist/index.cjs +2 -2
  2. package/dist/index.cjs.map +1 -1
  3. package/dist/index.d.cts +5 -5
  4. package/dist/index.d.ts +5 -5
  5. package/dist/index.js +2 -2
  6. package/dist/index.js.map +1 -1
  7. package/package.json +24 -22
  8. package/src/components/auth/SignIn.tsx +43 -0
  9. package/src/components/auth/index.ts +1 -0
  10. package/src/components/box/CollapseHorizontal.tsx +18 -0
  11. package/src/components/box/ContentBox.tsx +17 -0
  12. package/src/components/box/ExpandOnMount.tsx +48 -0
  13. package/src/components/box/Expandable.tsx +96 -0
  14. package/src/components/box/FullSizeContainer.tsx +50 -0
  15. package/src/components/box/MobileFrame/index.tsx +145 -0
  16. package/src/components/box/MobileFrame/styles.css +35 -0
  17. package/src/components/box/index.ts +6 -0
  18. package/src/components/button/DeleteButton.tsx +178 -0
  19. package/src/components/button/Toggle.tsx +88 -0
  20. package/src/components/button/ViewButton.tsx +30 -0
  21. package/src/components/button/index.ts +3 -0
  22. package/src/components/feed/FeedContentPane.tsx +111 -0
  23. package/src/components/feed/MediaFeed.tsx +200 -0
  24. package/src/components/feed/MediaFeedBackground.tsx +127 -0
  25. package/src/components/feed/MediaFeedRefresh.tsx +78 -0
  26. package/src/components/feed/MediaFeedSwipeUp.tsx +34 -0
  27. package/src/components/feed/constants.ts +11 -0
  28. package/src/components/feed/context.tsx +19 -0
  29. package/src/components/feed/hooks.ts +290 -0
  30. package/src/components/feed/index.ts +2 -0
  31. package/src/components/feed/types.ts +50 -0
  32. package/src/components/form/Condition.tsx +26 -0
  33. package/src/components/form/Field.tsx +39 -0
  34. package/src/components/form/Form.tsx +425 -0
  35. package/src/components/form/FormFooter.tsx +82 -0
  36. package/src/components/form/UploadProgress/index.tsx +38 -0
  37. package/src/components/form/UploadProgress/styles.css +23 -0
  38. package/src/components/form/index.ts +4 -0
  39. package/src/components/form/input/Editable.tsx +129 -0
  40. package/src/components/form/input/InputSlider.tsx +75 -0
  41. package/src/components/form/input/OptionalTag.tsx +33 -0
  42. package/src/components/form/input/StandaloneInput.tsx +41 -0
  43. package/src/components/form/input/boolean/index.tsx +53 -0
  44. package/src/components/form/input/color/index.tsx +126 -0
  45. package/src/components/form/input/date/index.tsx +122 -0
  46. package/src/components/form/input/datetime/index.tsx +93 -0
  47. package/src/components/form/input/file.tsx +379 -0
  48. package/src/components/form/input/hooks/index.ts +2 -0
  49. package/src/components/form/input/hooks/useInputImperativeHandle.ts +16 -0
  50. package/src/components/form/input/hooks/useInputStyle.ts +39 -0
  51. package/src/components/form/input/index.ts +2 -0
  52. package/src/components/form/input/input.css +44 -0
  53. package/src/components/form/input/input.tsx +130 -0
  54. package/src/components/form/input/multipleSelect/index.tsx +55 -0
  55. package/src/components/form/input/number/index.tsx +83 -0
  56. package/src/components/form/input/number/styles.css +8 -0
  57. package/src/components/form/input/select/index.tsx +80 -0
  58. package/src/components/form/input/socialMedia/index.tsx +158 -0
  59. package/src/components/form/input/text/index.tsx +72 -0
  60. package/src/components/form/input/text/textarea.tsx +44 -0
  61. package/src/components/form/input/time/index.tsx +33 -0
  62. package/src/components/form/input/type.ts +0 -0
  63. package/src/components/form/input/types.ts +4 -0
  64. package/src/components/form/view/file.tsx +45 -0
  65. package/src/components/form/view/index.tsx +61 -0
  66. package/src/components/form/view/multipleSelect.tsx +38 -0
  67. package/src/components/form/view/select.tsx +33 -0
  68. package/src/components/index.ts +14 -0
  69. package/src/components/list/Body/InfiniteScrollGridBody.tsx +177 -0
  70. package/src/components/list/Body/InfiniteScrollListBody.tsx +114 -0
  71. package/src/components/list/Body/ListBody.tsx +23 -0
  72. package/src/components/list/Body/PagedGridBody.tsx +104 -0
  73. package/src/components/list/Body/PagedListBody.tsx +92 -0
  74. package/src/components/list/Body/hooks.ts +84 -0
  75. package/src/components/list/DataList.tsx +32 -0
  76. package/src/components/list/ListContainer.tsx +20 -0
  77. package/src/components/list/ListContent.tsx +54 -0
  78. package/src/components/list/ListCreate.tsx +57 -0
  79. package/src/components/list/ListFilters.tsx +182 -0
  80. package/src/components/list/ListFooter.tsx +458 -0
  81. package/src/components/list/ListHeader.tsx +180 -0
  82. package/src/components/list/ListItem/ListCell.tsx +48 -0
  83. package/src/components/list/ListItem/ListRow.tsx +38 -0
  84. package/src/components/list/ListItemView.tsx +53 -0
  85. package/src/components/list/ListSort.tsx +84 -0
  86. package/src/components/list/NoItems.tsx +33 -0
  87. package/src/components/list/constants.ts +1 -0
  88. package/src/components/list/index.ts +4 -0
  89. package/src/components/list/types.ts +29 -0
  90. package/src/components/list/utils.ts +62 -0
  91. package/src/components/loading/CircularProgress.tsx +11 -0
  92. package/src/components/loading/Loading.tsx +160 -0
  93. package/src/components/loading/LoadingImage.tsx +123 -0
  94. package/src/components/loading/LoadingSwitch.tsx +78 -0
  95. package/src/components/loading/index.ts +4 -0
  96. package/src/components/media/PlayButton.tsx +94 -0
  97. package/src/components/media/index.ts +1 -0
  98. package/src/components/modal/DefaultModal.tsx +18 -0
  99. package/src/components/modal/DesktopModal.tsx +11 -0
  100. package/src/components/modal/ForceMobile.tsx +7 -0
  101. package/src/components/modal/MobileModal.tsx +89 -0
  102. package/src/components/modal/index.ts +3 -0
  103. package/src/components/modal/type.ts +7 -0
  104. package/src/components/nav/NavBar.tsx +101 -0
  105. package/src/components/nav/index.ts +1 -0
  106. package/src/components/overlay/ImageViewOverlay.tsx +88 -0
  107. package/src/components/overlay/MobileOverlay.tsx +22 -0
  108. package/src/components/overlay/index.ts +2 -0
  109. package/src/components/text/GradientText/index.tsx +16 -0
  110. package/src/components/text/GradientText/styles.css +5 -0
  111. package/src/components/text/NumberTicker.tsx +28 -0
  112. package/src/components/text/index.ts +1 -0
  113. package/src/components/theme/colorMode/DarkModeToggle.tsx +40 -0
  114. package/src/components/theme/colorMode/index.ts +1 -0
  115. package/src/components/theme/index.ts +1 -0
  116. package/src/components/view/ErrorView.tsx +13 -0
  117. package/src/components/view/RedirectView.tsx +42 -0
  118. package/src/components/view/index.ts +2 -0
  119. package/src/contexts/index.ts +1 -0
  120. package/src/contexts/theme.ts +316 -0
  121. package/src/custom.d.ts +4 -0
  122. package/src/hooks/index.ts +1 -0
  123. package/src/hooks/ui/index.ts +1 -0
  124. package/src/hooks/ui/useBorderColor.ts +4 -0
  125. package/src/store/index.ts +1 -0
  126. package/src/store/usePlayer.ts +75 -0
  127. package/src/store/useScreen.ts +22 -0
@@ -0,0 +1,54 @@
1
+ import { Box } from '@chakra-ui/react'
2
+ import { AnyObject } from '@chem-po/core'
3
+ import { useDataList, useFullSize, usePaginatedList } from '@chem-po/react'
4
+ import { useCallback, useMemo, useState } from 'react'
5
+ import { LoadingOverlay } from '../loading'
6
+ import { ListBody } from './Body/ListBody'
7
+ import { ListCreate } from './ListCreate'
8
+ import { ListFooter } from './ListFooter'
9
+ import { DataListHeader } from './ListHeader'
10
+ import { ListItemView } from './ListItemView'
11
+ import { ListContentProps } from './types'
12
+
13
+ export const ListContent = <T extends AnyObject>({
14
+ modals,
15
+ noFooter,
16
+ headerProps,
17
+ footerProps,
18
+ }: ListContentProps<T>) => {
19
+ const {
20
+ data: { isLoading, data },
21
+ } = usePaginatedList()
22
+ const { list } = useDataList<T>()
23
+ const { height } = useFullSize()
24
+
25
+ const [headerHeight, setHeaderHeight] = useState(0)
26
+ const [footerHeight, setFooterHeight] = useState(0)
27
+ const bodyHeight = useMemo(
28
+ () => height - headerHeight - footerHeight,
29
+ [height, headerHeight, footerHeight],
30
+ )
31
+ const handleHeaderResize = useCallback((updated: { height: number; width: number }) => {
32
+ setHeaderHeight(updated.height)
33
+ }, [])
34
+
35
+ const handleFooterResize = useCallback((size: { width: number; height: number }) => {
36
+ setFooterHeight(size.height)
37
+ }, [])
38
+
39
+ const { ItemView: ItemViewComponent, field: createField } = list
40
+
41
+ return (
42
+ <>
43
+ <DataListHeader boxProps={headerProps} onResize={handleHeaderResize} />
44
+ <Box h={`${bodyHeight}px`} position="relative" w="100%">
45
+ <ListBody height={bodyHeight} />
46
+ {noFooter ? <LoadingOverlay isLoading={!data.length && isLoading} /> : null}
47
+ </Box>
48
+ <ListFooter noFooter={noFooter} flexProps={footerProps} onResize={handleFooterResize} />
49
+ {modals ?? null}
50
+ {ItemViewComponent ? <ListItemView /> : null}
51
+ {createField ? <ListCreate field={createField} /> : null}
52
+ </>
53
+ )
54
+ }
@@ -0,0 +1,57 @@
1
+ import { CloseIcon } from '@chakra-ui/icons'
2
+ import { Flex, IconButton, Text } from '@chakra-ui/react'
3
+ import { FieldMap, useBackendBase, useDataList, usePaginatedList } from '@chem-po/react'
4
+ import { useCallback } from 'react'
5
+ import { Form } from '../form'
6
+ import { DesktopModal } from '../modal'
7
+
8
+ export const ListCreate = ({ field }: { field: FieldMap }) => {
9
+ const {
10
+ list: { baseQuery, itemName },
11
+ newItemOpen: isOpen,
12
+ setNewItemOpen: setIsOpen,
13
+ } = useDataList()
14
+ const {
15
+ adapter: { db },
16
+ } = useBackendBase()
17
+ const { refetch } = usePaginatedList()
18
+ // const collectionRef = useMemo(() => collection(db, collectionPath), [collectionPath, db])
19
+ // const newItemDoc = useMemo(() => (isOpen ? doc(collectionRef) : null), [collectionRef, isOpen])
20
+ // const newItemStoragePath = useMemo(
21
+ // () => (newItemDoc ? `${storagePath}/${newItemDoc.id}` : null),
22
+ // [storagePath, newItemDoc],
23
+ // )
24
+ const handleSubmit = useCallback(
25
+ async (data: object) => {
26
+ // if (!newItemDoc) return { [FORM_ERROR]: 'No document reference' }
27
+ // await setDoc(newItemDoc, data)
28
+ await db.createItem(baseQuery.collection, data)
29
+ setIsOpen(false)
30
+ if (refetch) refetch()
31
+ return undefined
32
+ },
33
+ [setIsOpen, refetch, db, baseQuery],
34
+ )
35
+
36
+ return (
37
+ <DesktopModal isOpen={isOpen} onClose={() => setIsOpen(false)}>
38
+ <Flex align="center" pt={3} px={3} w="100%">
39
+ <Text pl={1} opacity={0.7} fontWeight={600}>
40
+ NEW {itemName.toUpperCase()}
41
+ </Text>
42
+ <IconButton
43
+ size="sm"
44
+ borderRadius="full"
45
+ ml="auto"
46
+ h={7}
47
+ w={7}
48
+ minW={0}
49
+ onClick={() => setIsOpen(false)}
50
+ aria-label="Close"
51
+ icon={<CloseIcon opacity={0.8} w={3} h={3} />}
52
+ />
53
+ </Flex>
54
+ <Form field={field} onSubmit={handleSubmit} />
55
+ </DesktopModal>
56
+ )
57
+ }
@@ -0,0 +1,182 @@
1
+ import {
2
+ Box,
3
+ Button,
4
+ Flex,
5
+ HStack,
6
+ IconButton,
7
+ Image,
8
+ Popover,
9
+ PopoverArrow,
10
+ PopoverBody,
11
+ PopoverCloseButton,
12
+ PopoverContent,
13
+ PopoverTrigger,
14
+ Portal,
15
+ Text,
16
+ useColorMode,
17
+ useColorModeValue,
18
+ } from '@chakra-ui/react'
19
+
20
+ import { AnyObject, isFilterGroup, QueryFilter } from '@chem-po/core'
21
+ import { FilterPreset, FilterPresetGroup, useDataList, useScreen } from '@chem-po/react'
22
+ import { useMemo } from 'react'
23
+ import { useBorderColor } from '../../hooks'
24
+ import { filterMatchesPreset } from './utils'
25
+
26
+ const FilterButton = <T extends AnyObject>({
27
+ filter,
28
+ filters,
29
+ GroupRender,
30
+ toggleFilter,
31
+ }: {
32
+ filter: FilterPreset<T>
33
+ filters: QueryFilter<T>[]
34
+ GroupRender?: FilterPresetGroup<T>['RenderFilter']
35
+ toggleFilter: (toggled: FilterPreset<T>) => void
36
+ }) => {
37
+ const { label, Render } = filter
38
+ const isActive = useMemo(
39
+ () => filters.some(f => filterMatchesPreset(f, filter)),
40
+ [filters, filter],
41
+ )
42
+ const { colorMode } = useColorMode()
43
+ const borderColor = useBorderColor()
44
+ const textColor = useColorModeValue('gray.700', 'gray.100')
45
+ const CustomRender = Render ?? GroupRender
46
+ return (
47
+ <Box p={0.5}>
48
+ <Button
49
+ onClick={() => toggleFilter(filter)}
50
+ variant="unstyled"
51
+ color={isActive && !CustomRender ? 'white' : textColor}
52
+ bg={isActive && !CustomRender ? 'accent.400' : 'transparent'}
53
+ px={CustomRender ? 0 : 2}
54
+ py={CustomRender ? 0 : 1}
55
+ transition="all 300ms"
56
+ border="none"
57
+ boxShadow={`0px 0px 1px 1px ${isActive ? 'transparent' : '#00000033'}`}
58
+ w="auto"
59
+ _dark={{
60
+ boxShadow: `0px 0px 1px 1px ${isActive ? 'transparent' : '#ffffff66'}`,
61
+ }}
62
+ h="auto"
63
+ minW="0"
64
+ minH="0"
65
+ alignItems="center"
66
+ justifyContent="center"
67
+ borderColor={isActive ? 'transparent' : borderColor}
68
+ size="none">
69
+ {CustomRender ? (
70
+ <CustomRender active={isActive} colorMode={colorMode} preset={filter} />
71
+ ) : (
72
+ <Text textShadow={isActive ? '0 0 3px rgba(0,0,0,0.8)' : 'none'} fontSize="xs">
73
+ {label}
74
+ </Text>
75
+ )}
76
+ </Button>
77
+ </Box>
78
+ )
79
+ }
80
+
81
+ const FilterGroup = <T extends AnyObject>({
82
+ group,
83
+ filters,
84
+ toggleFilter,
85
+ }: {
86
+ group: FilterPresetGroup<T>
87
+ filters: QueryFilter<T>[]
88
+ toggleFilter: (toggled: FilterPreset<T>) => void
89
+ }) => {
90
+ const { label, filters: groupFilters } = group
91
+ return (
92
+ <Flex px={1} flexFlow="column" w="100%">
93
+ <Text px={1} opacity={0.8} fontSize="sm" fontWeight={600}>
94
+ {label}
95
+ </Text>
96
+ <Flex w="100%" flexFlow="row wrap">
97
+ {groupFilters.map(filter => (
98
+ <FilterButton
99
+ toggleFilter={toggleFilter}
100
+ GroupRender={group.RenderFilter}
101
+ filters={filters}
102
+ key={filter.label}
103
+ filter={filter}
104
+ />
105
+ ))}
106
+ </Flex>
107
+ </Flex>
108
+ )
109
+ }
110
+
111
+ export const PresetFilters = () => {
112
+ const { query, list, toggleFilter } = useDataList()
113
+ const isMobile = useScreen(s => s.isMobile)
114
+ const { filters: currentFilters = [] } = query || {}
115
+ const { filterPresets } = list
116
+ const borderColor = useBorderColor()
117
+ return filterPresets?.length ? (
118
+ <HStack spacing={1}>
119
+ <Popover
120
+ // closeOnBlur={false}
121
+ placement="right-start"
122
+ trigger={isMobile ? 'click' : 'hover'}
123
+ // trigger=
124
+ strategy="fixed">
125
+ <PopoverTrigger>
126
+ <IconButton
127
+ size="sm"
128
+ variant="ghost"
129
+ aria-label="Filters"
130
+ icon={
131
+ <Image
132
+ width="24px"
133
+ filter={`grayscale(${currentFilters.length ? 0 : 100}%)`}
134
+ src="/icons/tune.svg"
135
+ />
136
+ }
137
+ />
138
+ </PopoverTrigger>
139
+ <Portal>
140
+ <PopoverContent borderRadius={6} w="auto">
141
+ <PopoverBody w="240px" p={0}>
142
+ <Flex flexFlow="column" w="100%">
143
+ <HStack
144
+ py={1.5}
145
+ px={2}
146
+ w="100%"
147
+ spacing={1}
148
+ borderBottom={`1px solid ${borderColor}`}>
149
+ <Image width="18px" filter="grayscale(100%)" src="/icons/tune.svg" />
150
+ <Text opacity={0.8} fontSize="sm" fontWeight={600}>
151
+ FILTERS
152
+ </Text>
153
+ </HStack>
154
+ <Flex justify="center" w="100%" flexFlow="row wrap" py={1} px={2}>
155
+ {filterPresets.map(filter =>
156
+ isFilterGroup(filter) ? (
157
+ <FilterGroup
158
+ toggleFilter={toggleFilter}
159
+ filters={currentFilters}
160
+ key={filter.label}
161
+ group={filter}
162
+ />
163
+ ) : (
164
+ <FilterButton
165
+ toggleFilter={toggleFilter}
166
+ filters={currentFilters}
167
+ key={filter.label}
168
+ filter={filter}
169
+ />
170
+ ),
171
+ )}
172
+ </Flex>
173
+ </Flex>
174
+ </PopoverBody>
175
+ <PopoverArrow />
176
+ <PopoverCloseButton />
177
+ </PopoverContent>
178
+ </Portal>
179
+ </Popover>
180
+ </HStack>
181
+ ) : null
182
+ }