Skip to content

Commit 92d5404

Browse files
erikalethemanh
authored andcommitted
feat: Implement highlight new items ✨
- New items are added to a list when a new upload is in progress. - cozy-ui check if the item rendered is part of the list Use UploadProvider : - Add the function addNewItem in parameters when using old redux thunk actions - Clear the newItems list when : - Dragging items - Selecting an item - Passing from a folder to another test: correct the tests because we're using a uploadProvider fix(AddMenuContent): wrap UploadItem with UploadProvider for context fix(AddFolder): integrate UploadContext to handle the highlight of new folders fix(UploadProvider): optimize functions with useCallback Prevents functions from changing on every render. This avoids infinite loops and crashes style: correct the lint resolve conflict chore: Upgrade cozy-ui to 130.5.0 ⬆️ fix: Resolve comments in PR 🎨 fix: Resolve incorrect mocking module :✅ feat: Apply highlight new items into grid view :spakles: feat: Add feature flag ✨ chore: Upgrade version of cozy-ui to 130.7.0 ⬆️ feat: Clear highlighted items when using long press ✨ style: Change the way apply feature flag 🎨 fix: Resolve failed test cases 🐛
1 parent 2c5a399 commit 92d5404

File tree

29 files changed

+344
-121
lines changed

29 files changed

+344
-121
lines changed

jestHelpers/setup.js

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,5 +19,21 @@ jest.mock('cozy-dataproxy-lib', () => ({
1919
DataProxyProvider: ({ children }) => children
2020
}))
2121

22+
// Mock cozy-flags with jest mock function that supports both flag checking and test mocking
23+
jest.mock('cozy-flags', () => {
24+
const mockFn = jest.fn(flagName => {
25+
if (flagName === 'drive.highlight-new-items.enabled') {
26+
return true
27+
}
28+
// Return false for all other flags to avoid issues
29+
return false
30+
})
31+
32+
// Add initialize method that some tests expect
33+
mockFn.initialize = jest.fn()
34+
35+
return mockFn
36+
})
37+
2238
// see https://github.com/jsdom/jsdom/issues/1695
2339
window.HTMLElement.prototype.scroll = function () {}

src/hooks/useDisplayedFolder.spec.jsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { useQuery } from 'cozy-client'
22

33
import useCurrentFolderId from './useCurrentFolderId'
44
import useDisplayedFolder from './useDisplayedFolder'
5+
56
import { ROOT_DIR_ID } from '@/constants/config'
67

78
jest.mock('cozy-client', () => ({

src/hooks/useDisplayedFolder.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import { useQuery } from 'cozy-client'
22
import { IOCozyFile } from 'cozy-client/types/types'
33

4+
import { ROOT_DIR_ID } from '@/constants/config'
45
import useCurrentFolderId from '@/hooks/useCurrentFolderId'
56
import { buildFileOrFolderByIdQuery } from '@/queries'
6-
import { ROOT_DIR_ID } from '@/constants/config'
77

88
interface DisplayedFolderResult {
99
isNotFound: boolean

src/hooks/useOnLongPress/helpers.js

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,16 @@ export const handleClick = ({
1414
setLastClickTime,
1515
setSelectedItems,
1616
setLastSelectedIndex,
17-
setFocusedIndex
17+
setFocusedIndex,
18+
clearHighlightedItems
1819
}) => {
1920
// if default behavior is opening a file, it blocks that to force other bahavior
2021
event.preventDefault()
2122

2223
if (disabled || isRenaming) return
2324

25+
clearHighlightedItems?.()
26+
2427
// simply remove this "if" the flag is not necessary anymore
2528
if (!flag('drive.doubleclick.enabled')) {
2629
if (selectionModeActive) {
@@ -60,7 +63,8 @@ export const makeDesktopHandlers = ({
6063
clearSelection,
6164
setSelectedItems,
6265
setLastSelectedIndex,
63-
setFocusedIndex
66+
setFocusedIndex,
67+
clearHighlightedItems
6468
}) => {
6569
return {
6670
// first event triggered on Desktop
@@ -82,7 +86,8 @@ export const makeDesktopHandlers = ({
8286
clearSelection,
8387
setSelectedItems,
8488
setLastSelectedIndex,
85-
setFocusedIndex
89+
setFocusedIndex,
90+
clearHighlightedItems
8691
})
8792
}
8893
}
@@ -94,7 +99,8 @@ export const handlePress = ({
9499
isLongPress,
95100
isRenaming,
96101
openLink,
97-
toggle
102+
toggle,
103+
clearHighlightedItems
98104
}) => {
99105
// if default behavior is opening a file, it blocks that to force other bahavior
100106
event.preventDefault()
@@ -108,6 +114,8 @@ export const handlePress = ({
108114
} else {
109115
openLink(event)
110116
}
117+
118+
clearHighlightedItems?.()
111119
}
112120

113121
export const makeMobileHandlers = ({
@@ -117,7 +125,8 @@ export const makeMobileHandlers = ({
117125
isRenaming,
118126
isLongPress,
119127
openLink,
120-
toggle
128+
toggle,
129+
clearHighlightedItems
121130
}) => {
122131
// used to determine if it's a longpress
123132
// i.e. delay onClick
@@ -148,7 +157,8 @@ export const makeMobileHandlers = ({
148157
isLongPress,
149158
isRenaming,
150159
openLink,
151-
toggle
160+
toggle,
161+
clearHighlightedItems
152162
})
153163
}
154164
}

src/hooks/useOnLongPress/index.js

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { useBreakpoints } from 'cozy-ui/transpiled/react/providers/Breakpoints'
55
import { makeDesktopHandlers, makeMobileHandlers } from './helpers'
66

77
import { useSelectionContext } from '@/modules/selection/SelectionProvider'
8+
import { useNewItemHighlightContext } from '@/modules/upload/NewItemHighlightProvider'
89

910
export const useLongPress = ({
1011
file,
@@ -24,6 +25,7 @@ export const useLongPress = ({
2425
clearSelection,
2526
isSelectionBarVisible: selectionModeActive
2627
} = useSelectionContext()
28+
const { clearItems: clearHighlightedItems } = useNewItemHighlightContext()
2729

2830
if (isDesktop) {
2931
return makeDesktopHandlers({
@@ -39,7 +41,8 @@ export const useLongPress = ({
3941
clearSelection,
4042
setSelectedItems,
4143
setLastSelectedIndex,
42-
setFocusedIndex
44+
setFocusedIndex,
45+
clearHighlightedItems
4346
})
4447
}
4548

@@ -50,6 +53,7 @@ export const useLongPress = ({
5053
isRenaming,
5154
isLongPress,
5255
openLink,
53-
toggle
56+
toggle,
57+
clearHighlightedItems
5458
})
5559
}

src/lib/flags.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,4 +29,5 @@ const flagsList = () => {
2929
flag('drive.hide-nextcloud-dev')
3030
flag('drive.keyboard-shortcuts.enabled', true)
3131
flag('drive.onlyoffice.editor-mode-by-access.enabled', true)
32+
flag('drive.highlight-new-items.enabled', true)
3233
}

src/modules/drive/AddMenu/AddMenuContent.jsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import CreateShortcut from '@/modules/drive/Toolbar/components/CreateShortcut'
1818
import { ScannerMenuItem } from '@/modules/drive/Toolbar/components/Scanner/ScannerMenuItem'
1919
import { useScannerContext } from '@/modules/drive/Toolbar/components/Scanner/ScannerProvider'
2020
import UploadItem from '@/modules/drive/Toolbar/components/UploadItem'
21+
import { NewItemHighlightProvider } from '@/modules/upload/NewItemHighlightProvider'
2122
import { isOfficeEditingEnabled } from '@/modules/views/OnlyOffice/helpers'
2223

2324
const AddMenuContent = forwardRef(
@@ -118,15 +119,15 @@ const AddMenuContent = forwardRef(
118119
/>
119120
)}
120121
{canUpload && !isUploadDisabled && (
121-
<>
122+
<NewItemHighlightProvider>
122123
<Divider className="u-mv-half" />
123124
<UploadItem
124125
onUploaded={refreshFolderContent}
125126
displayedFolder={displayedFolder}
126127
onClick={onClick}
127128
isReadOnly={isReadOnly}
128129
/>
129-
</>
130+
</NewItemHighlightProvider>
130131
)}
131132
{hasScanner && <ScannerMenuItem onClick={createActionOnClick} />}
132133
</>

src/modules/drive/Toolbar/components/Scanner/useScannerService.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,8 @@ export const useScannerService = (displayedFolder: {
7979
{ isScanned: true },
8080
() => logger('info', `File uploaded successfully`),
8181
{ client, vaultClient: {}, showAlert, t },
82-
displayedFolder.driveId
82+
displayedFolder.driveId,
83+
undefined
8384
)
8485

8586
dispatch(payload)

src/modules/drive/Toolbar/components/UploadItem.jsx

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
1515

1616
import { useDisplayedFolder } from '@/hooks'
1717
import { uploadFiles } from '@/modules/navigation/duck'
18+
import { useNewItemHighlightContext } from '@/modules/upload/NewItemHighlightProvider'
1819

1920
const UploadItem = ({
2021
onClick,
@@ -27,6 +28,7 @@ const UploadItem = ({
2728
const vaultClient = useVaultClient()
2829
const { showAlert } = useAlert()
2930
const { initialDirId } = useDisplayedFolder()
31+
const { addItems } = useNewItemHighlightContext()
3032
const { t } = useI18n()
3133
const dispatch = useDispatch()
3234

@@ -36,7 +38,8 @@ const UploadItem = ({
3638
files,
3739
initialDirId,
3840
showAlert,
39-
driveId
41+
driveId,
42+
addItems
4043
) => {
4144
dispatch(
4245
uploadFiles(
@@ -50,7 +53,8 @@ const UploadItem = ({
5053
showAlert,
5154
t
5255
},
53-
driveId
56+
driveId,
57+
addItems
5458
)
5559
)
5660
}
@@ -81,7 +85,8 @@ const UploadItem = ({
8185
files,
8286
initialDirId,
8387
showAlert,
84-
displayedFolder?.driveId
88+
displayedFolder?.driveId,
89+
addItems
8590
)
8691
onClick()
8792
}

src/modules/filelist/AddFolder.jsx

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import {
1717
} from '@/modules/filelist/duck'
1818
import AddFolderRowVz from '@/modules/filelist/virtualized/AddFolderRow'
1919
import { createFolder } from '@/modules/navigation/duck'
20+
import { useNewItemHighlightContext } from '@/modules/upload/NewItemHighlightProvider'
2021

2122
export const AddFolder = ({
2223
visible,
@@ -57,7 +58,8 @@ const AddFolderWithState = ({
5758
driveId,
5859
extraColumns,
5960
afterSubmit,
60-
afterAbort
61+
afterAbort,
62+
addItems
6163
}) => {
6264
const client = useClient()
6365
const dispatch = useDispatch()
@@ -77,7 +79,8 @@ const AddFolderWithState = ({
7779
showAlert,
7880
t
7981
},
80-
driveId
82+
driveId,
83+
addItems
8184
)
8285
).then(() => {
8386
afterSubmit?.() // eslint-disable-line promise/always-return
@@ -108,6 +111,7 @@ const AddFolderWithState = ({
108111

109112
const AddFolderWithAfter = ({ refreshFolderContent, ...props }) => {
110113
const dispatch = useDispatch()
114+
const { addItems } = useNewItemHighlightContext()
111115

112116
const handleAfterSubmit = () => {
113117
if (refreshFolderContent) {
@@ -124,6 +128,7 @@ const AddFolderWithAfter = ({ refreshFolderContent, ...props }) => {
124128
<AddFolderWithState
125129
afterSubmit={handleAfterSubmit}
126130
afterAbort={handleAfterAbort}
131+
addItems={addItems}
127132
{...props}
128133
/>
129134
)

0 commit comments

Comments
 (0)