mirror of
https://github.com/overleaf/overleaf.git
synced 2024-11-21 20:47:08 -05:00
Implement auto retry mechanism for deleted file restore in history react (#12866)
GitOrigin-RevId: b30895061ee6fdfb6488d27ce2f91d4e410735aa
This commit is contained in:
parent
1fb921de99
commit
9e5aabea33
2 changed files with 39 additions and 2 deletions
|
@ -4,6 +4,7 @@ import { useLayoutContext } from '../../../../shared/context/layout-context'
|
||||||
import useAsync from '../../../../shared/hooks/use-async'
|
import useAsync from '../../../../shared/hooks/use-async'
|
||||||
import { restoreFile } from '../../services/api'
|
import { restoreFile } from '../../services/api'
|
||||||
import { isFileRemoved } from '../../utils/file-diff'
|
import { isFileRemoved } from '../../utils/file-diff'
|
||||||
|
import { waitFor } from '../../utils/wait-for'
|
||||||
import { useHistoryContext } from '../history-context'
|
import { useHistoryContext } from '../history-context'
|
||||||
import type { HistoryContextValue } from '../types/history-context-value'
|
import type { HistoryContextValue } from '../types/history-context-value'
|
||||||
|
|
||||||
|
@ -22,10 +23,13 @@ export function useRestoreDeletedFile() {
|
||||||
|
|
||||||
await runAsync(
|
await runAsync(
|
||||||
restoreFile(projectId, selectedFile)
|
restoreFile(projectId, selectedFile)
|
||||||
.then(data => {
|
.then(async data => {
|
||||||
const { id, type } = data
|
const { id, type } = data
|
||||||
|
|
||||||
const entity = ide.fileTreeManager.findEntityById(id)
|
const entity = await waitFor(
|
||||||
|
() => ide.fileTreeManager.findEntityById(id),
|
||||||
|
3000
|
||||||
|
)
|
||||||
|
|
||||||
if (type === 'doc') {
|
if (type === 'doc') {
|
||||||
ide.editorManager.openDoc(entity)
|
ide.editorManager.openDoc(entity)
|
||||||
|
|
33
services/web/frontend/js/features/history/utils/wait-for.ts
Normal file
33
services/web/frontend/js/features/history/utils/wait-for.ts
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
export function waitFor<T>(
|
||||||
|
testFunction: () => T,
|
||||||
|
timeout: number,
|
||||||
|
pollInterval = 500
|
||||||
|
): Promise<T> {
|
||||||
|
const iterationLimit = Math.floor(timeout / pollInterval)
|
||||||
|
let iterations = 0
|
||||||
|
|
||||||
|
return new Promise<T>((resolve, reject) => {
|
||||||
|
const tryIteration = () => {
|
||||||
|
if (iterations > iterationLimit) {
|
||||||
|
reject(
|
||||||
|
console.error(
|
||||||
|
`waiting too long, ${JSON.stringify({ timeout, pollInterval })}`
|
||||||
|
)
|
||||||
|
)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
iterations += 1
|
||||||
|
const result = testFunction()
|
||||||
|
|
||||||
|
if (result) {
|
||||||
|
resolve(result)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
setTimeout(tryIteration, pollInterval)
|
||||||
|
}
|
||||||
|
|
||||||
|
tryIteration()
|
||||||
|
})
|
||||||
|
}
|
Loading…
Reference in a new issue