-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathEdit.tsx
More file actions
103 lines (84 loc) · 3.81 KB
/
Edit.tsx
File metadata and controls
103 lines (84 loc) · 3.81 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
import { useEffect } from 'react';
import { useParams } from 'react-router-dom';
import { EditSection } from '@components/EditSection';
import { BibframeEntities, PROFILE_BFIDS } from '@common/constants/bibframe.constants';
import { scrollEntity } from '@common/helpers/pageScrolling.helper';
import { useConfig } from '@common/hooks/useConfig.hook';
import { useRecordControls } from '@common/hooks/useRecordControls';
import { useResetRecordStatus } from '@common/hooks/useResetRecordStatus';
import { UserNotificationFactory } from '@common/services/userNotification';
import { StatusType } from '@common/constants/status.constants';
import { RecordStatus, ResourceType } from '@common/constants/record.constants';
import { EditPreview } from '@components/EditPreview';
import { QueryParams } from '@common/constants/routes.constants';
import { ViewMarcModal } from '@components/ViewMarcModal';
import { useLoadingState, useMarcPreviewState, useStatusState, useUIState } from '@src/store';
import './Edit.scss';
const ignoreLoadingStatuses = [RecordStatus.saveAndClose, RecordStatus.saveAndKeepEditing];
export const Edit = () => {
const { getProfiles } = useConfig();
const { fetchRecord, clearRecordState, fetchRecordAndSelectEntityValues } = useRecordControls();
const { resourceId } = useParams();
const { recordStatus, addStatusMessagesItem } = useStatusState();
const { basicValue: marcPreviewData, resetBasicValue: resetMarcPreviewData } = useMarcPreviewState();
const recordStatusType = recordStatus?.type;
const { setIsLoading } = useLoadingState();
const { setCurrentlyEditedEntityBfid, setCurrentlyPreviewedEntityBfid } = useUIState();
const queryParams = new URLSearchParams(window.location.search);
const cloneOfParam = queryParams.get(QueryParams.CloneOf);
const typeParam = queryParams.get(QueryParams.Type);
const refParam = queryParams.get(QueryParams.Ref);
useResetRecordStatus();
useEffect(() => {
resetMarcPreviewData();
scrollEntity({ top: 0, behavior: 'instant' });
}, []);
useEffect(() => {
async function loadRecord() {
if (!recordStatusType || ignoreLoadingStatuses.includes(recordStatusType)) return;
setIsLoading(true);
const fetchableId = resourceId ?? cloneOfParam;
try {
if (fetchableId) {
await fetchRecord(fetchableId);
return;
}
const resourceDecriptionType = (typeParam as ResourceType) || ResourceType.instance;
const resourceReference = refParam;
const isInstancePageType = resourceDecriptionType === ResourceType.instance;
const editedEntityBfId = isInstancePageType ? PROFILE_BFIDS.INSTANCE : PROFILE_BFIDS.WORK;
const previewedEntityBfId = isInstancePageType ? PROFILE_BFIDS.WORK : PROFILE_BFIDS.INSTANCE;
setCurrentlyEditedEntityBfid(new Set([editedEntityBfId]));
setCurrentlyPreviewedEntityBfid(new Set([previewedEntityBfId]));
clearRecordState();
let record: RecordEntry | null = null;
if (resourceReference) {
record = (await fetchRecordAndSelectEntityValues(
resourceReference,
resourceDecriptionType.toUpperCase() as BibframeEntities,
)) as RecordEntry;
}
const typedRecord = record as unknown as RecordEntry;
await getProfiles({
record: typedRecord,
});
} catch {
addStatusMessagesItem?.(UserNotificationFactory.createMessage(StatusType.error, 'ld.errorLoadingResource'));
} finally {
setIsLoading(false);
}
}
loadRecord();
}, [resourceId, recordStatusType, cloneOfParam, typeParam, refParam]);
return (
<div data-testid="edit-page" className="edit-page">
{!marcPreviewData && (
<>
<EditPreview />
<EditSection />
</>
)}
<ViewMarcModal />
</div>
);
};