-
Notifications
You must be signed in to change notification settings - Fork 28
Expand file tree
/
Copy pathContributionGeneric.tsx
More file actions
124 lines (112 loc) · 3.94 KB
/
ContributionGeneric.tsx
File metadata and controls
124 lines (112 loc) · 3.94 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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
"use client";
import React, { useRef, useState, useEffect } from "react";
import { useContributionTracking } from "./tracking";
import { isAgreementSupported, isAgreementValid } from "./contributionUtils";
import { ContributionGenericContent } from "./ContributionGenericContent";
import { Contribution } from "./type";
import {
useLocalStorageForAgreementOnPageLoad,
getAgreementFromLocalStorage,
} from "../utils/useLocalStorage";
import { useRouter } from "next/navigation";
import { ContributionGenericAgreementSearch } from "./ContributionGenericAgreementSearch";
type Props = {
contribution: Contribution;
};
export function ContributionGeneric({ contribution }: Props) {
const router = useRouter();
const [hash, setHash] = useState("");
const personalizeTitleRef = useRef<HTMLParagraphElement>(null);
const getTitle = () => `/contribution/${slug}`;
const { slug, isNoCDT, relatedItems } = contribution;
const [displayGeneric, setDisplayGeneric] = useState(false);
const [selectedAgreement, setSelectedAgreement] =
useLocalStorageForAgreementOnPageLoad();
const {
emitAgreementTreatedEvent,
emitAgreementUntreatedEvent,
emitDisplayAgreementContent,
emitDisplayGeneralContent,
} = useContributionTracking();
const genericTitleRef = useRef<HTMLDivElement>(null);
const scrollToTitle = () => {
setTimeout(() => {
genericTitleRef?.current?.scrollIntoView({ behavior: "smooth" });
genericTitleRef?.current?.focus();
}, 100);
};
useEffect(() => {
setHash(window.location.hash);
}, []);
useEffect(() => {
if (hash === "#retour") {
setTimeout(() => {
personalizeTitleRef?.current?.focus();
}, 100);
}
}, [hash]);
useEffect(() => {
if (window.location.hash === "#retour") return;
const storedAgreement = getAgreementFromLocalStorage();
if (storedAgreement && isAgreementValid(contribution, storedAgreement)) {
const targetUrl =
slug === "les-conges-pour-evenements-familiaux"
? `/contribution/${slug}/${storedAgreement.slug || storedAgreement.num}`
: `/contribution/${storedAgreement.num}-${slug}`;
router.replace(targetUrl);
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, []);
return (
<>
<ContributionGenericAgreementSearch
personalizeTitleRef={personalizeTitleRef}
contribution={contribution}
onAgreementSelect={(agreement) => {
setSelectedAgreement(agreement);
setDisplayGeneric(false);
if (!agreement) return;
if (isAgreementSupported(contribution, agreement)) {
emitAgreementTreatedEvent(agreement.num);
} else {
emitAgreementUntreatedEvent(agreement.num);
}
}}
onDisplayClick={(isAgreementSelected) => {
setDisplayGeneric(!displayGeneric);
if (!isAgreementSelected) {
setDisplayGeneric(true);
scrollToTitle();
if (selectedAgreement) {
emitDisplayGeneralContent(getTitle());
}
} else {
emitDisplayAgreementContent(getTitle());
}
}}
selectedAgreement={selectedAgreement}
trackingActionName={getTitle()}
/>
{!isNoCDT && !isAgreementValid(contribution, selectedAgreement) && (
<ContributionGenericContent
ref={genericTitleRef}
contribution={contribution}
relatedItems={relatedItems}
displayGeneric={displayGeneric}
alertText={
selectedAgreement &&
!isAgreementSupported(contribution, selectedAgreement) && (
<p>
<strong>
Cette réponse correspond à ce que prévoit le code du travail,
elle ne tient pas compte des spécificités de la{" "}
{selectedAgreement.shortTitle}
</strong>
</p>
)
}
/>
)}
</>
);
}