mirror of
https://github.com/overleaf/overleaf.git
synced 2024-11-29 12:53:39 -05:00
d6de6da781
* [web] Remove unnecessary divs around `fileInfo` * [web] Add file-view SCSS style * [web] Simplify `TPRFileViewInfo` * [web] Add div for action buttons * [web] Misc. simplifications * [web] Add Overleaf logo in bg when selecting multiple files * [web] Add message when multiple files are selected * [web] Add .full-size class * [web] Import styles from LESS file * [web] Update icons, use MaterialIcon * [web] Use OLButton * [web] Add missing space between icons and text * [web] Adjust margins * [web] Fix alert button * [web] Update Alerts * [web] Update `FileViewLoadingIndicator` * [web] Fix test "shows a loading indicator..." This was failing because `LoadingSpinner` is shown after a setTimeout. Maybe we can skip this setTimeout when delay==0 ? * [web] Remove Row/Col around error notifications * [web] Replace `!!` by `Boolean` Co-authored-by: ilkin-overleaf <100852799+ilkin-overleaf@users.noreply.github.com> * [web] Use `alert` class in BS3 only Co-authored-by: Ilkin Ismailov <ilkin.ismailov@overleaf.com> * [web] Update "Go to settings" to OLButton Co-authored-by: Ilkin Ismailov <ilkin.ismailov@overleaf.com> * [web] Use `BootstrapVersionSwitcher` instead of `isBootstrap5` Co-authored-by: Ilkin Ismailov <ilkin.ismailov@overleaf.com> * [web] Align Alert content to the left in BS5 * [web] Remove `leadingIcon` on Refresh buttons * [web] Make the download link be an OLButton * [web] Set `tpr-refresh-error` in BS3 only Co-authored-by: Rebeka Dekany <50901361+rebekadekany@users.noreply.github.com> * [web] Use `var(--white);` instead of `white` Co-authored-by: Rebeka <rebeka.dekany@overleaf.com> * [web] Update OLButton size (small -> sm) --------- Co-authored-by: ilkin-overleaf <100852799+ilkin-overleaf@users.noreply.github.com> Co-authored-by: Ilkin Ismailov <ilkin.ismailov@overleaf.com> Co-authored-by: Rebeka Dekany <50901361+rebekadekany@users.noreply.github.com> Co-authored-by: Rebeka <rebeka.dekany@overleaf.com> GitOrigin-RevId: 04f369c0f1a53d47619a1570648ee58de5050751
111 lines
2.9 KiB
TypeScript
111 lines
2.9 KiB
TypeScript
import {
|
|
type Dispatch,
|
|
type SetStateAction,
|
|
type ElementType,
|
|
useCallback,
|
|
useState,
|
|
} from 'react'
|
|
import { useTranslation } from 'react-i18next'
|
|
import Icon from '@/shared/components/icon'
|
|
import { postJSON } from '@/infrastructure/fetch-json'
|
|
import { useProjectContext } from '@/shared/context/project-context'
|
|
import useAbortController from '@/shared/hooks/use-abort-controller'
|
|
import type { BinaryFile } from '../types/binary-file'
|
|
import { Nullable } from '../../../../../types/utils'
|
|
import importOverleafModules from '../../../../macros/import-overleaf-module.macro'
|
|
import OLButton from '@/features/ui/components/ol/ol-button'
|
|
|
|
type FileViewRefreshButtonProps = {
|
|
setRefreshError: Dispatch<SetStateAction<Nullable<string>>>
|
|
file: BinaryFile
|
|
}
|
|
|
|
const tprFileViewRefreshButton = importOverleafModules(
|
|
'tprFileViewRefreshButton'
|
|
) as {
|
|
import: { TPRFileViewRefreshButton: ElementType }
|
|
path: string
|
|
}[]
|
|
|
|
export default function FileViewRefreshButton({
|
|
setRefreshError,
|
|
file,
|
|
}: FileViewRefreshButtonProps) {
|
|
const { _id: projectId } = useProjectContext()
|
|
const { signal } = useAbortController()
|
|
const [refreshing, setRefreshing] = useState(false)
|
|
|
|
const refreshFile = useCallback(
|
|
(isTPR: Nullable<boolean>) => {
|
|
setRefreshing(true)
|
|
// Replacement of the file handled by the file tree
|
|
window.expectingLinkedFileRefreshedSocketFor = file.name
|
|
const body = {
|
|
shouldReindexReferences: isTPR || /\.bib$/.test(file.name),
|
|
}
|
|
postJSON(`/project/${projectId}/linked_file/${file.id}/refresh`, {
|
|
signal,
|
|
body,
|
|
})
|
|
.then(() => {
|
|
setRefreshing(false)
|
|
})
|
|
.catch(err => {
|
|
setRefreshing(false)
|
|
setRefreshError(err.data?.message || err.message)
|
|
})
|
|
},
|
|
[file, projectId, signal, setRefreshError]
|
|
)
|
|
|
|
if (tprFileViewRefreshButton.length > 0) {
|
|
return tprFileViewRefreshButton.map(
|
|
({ import: { TPRFileViewRefreshButton }, path }) => (
|
|
<TPRFileViewRefreshButton
|
|
key={path}
|
|
file={file}
|
|
refreshFile={refreshFile}
|
|
refreshing={refreshing}
|
|
/>
|
|
)
|
|
)[0]
|
|
} else {
|
|
return (
|
|
<FileViewRefreshButtonDefault
|
|
refreshFile={refreshFile}
|
|
refreshing={refreshing}
|
|
/>
|
|
)
|
|
}
|
|
}
|
|
|
|
type FileViewRefreshButtonDefaultProps = {
|
|
refreshFile: (isTPR: Nullable<boolean>) => void
|
|
refreshing: boolean
|
|
}
|
|
|
|
function FileViewRefreshButtonDefault({
|
|
refreshFile,
|
|
refreshing,
|
|
}: FileViewRefreshButtonDefaultProps) {
|
|
const { t } = useTranslation()
|
|
|
|
return (
|
|
<OLButton
|
|
variant="primary"
|
|
onClick={() => refreshFile(null)}
|
|
disabled={refreshing}
|
|
isLoading={refreshing}
|
|
bs3Props={{
|
|
loading: (
|
|
<>
|
|
<Icon type="refresh" spin={refreshing} fw />{' '}
|
|
<span>{refreshing ? `${t('refreshing')}…` : t('refresh')}</span>
|
|
</>
|
|
),
|
|
}}
|
|
>
|
|
{t('refresh')}
|
|
</OLButton>
|
|
)
|
|
}
|