Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
3kh0
GitHub Repository: 3kh0/3kh0.github.io-replit
Path: blob/main/js/reviews.js
617 views
1
(async () => {
2
var reviewsElement = document.getElementById("my-keen-slider");
3
4
var reviewsData = await fetch('./assets/reviews.json');
5
var reviews = await reviewsData.json();
6
7
for (let i = reviews.length - 1; i > 0; i--) {
8
const j = Math.floor(Math.random() * (i + 1));
9
[reviews[i], reviews[j]] = [reviews[j], reviews[i]];
10
}
11
12
var reviewsGroups = reviews.reduce((r, e, i) => (i % 3 ? r[r.length - 1].push(e) : r.push([e])) && r, []);
13
14
var lastReviewGroup = reviewsGroups[reviewsGroups.length - 1];
15
16
if (lastReviewGroup) {
17
if (lastReviewGroup.length == 1) {
18
lastReviewGroup.push({
19
placeholder: true,
20
});
21
22
lastReviewGroup.push({
23
placeholder: true,
24
});
25
}
26
27
if (lastReviewGroup.length == 2) {
28
lastReviewGroup.push({
29
placeholder: true,
30
});
31
}
32
}
33
34
for (let reviewsGroup in reviewsGroups) {
35
var newSlide = document.createElement("div");
36
newSlide.className = "keen-slider__slide number-slide" + Number(Number(reviewsGroup) + 1);
37
38
var reviewContainer = document.createElement("div");
39
reviewContainer.className = "review-container";
40
41
for (let review in reviewsGroups[reviewsGroup]) {
42
if (!reviewsGroups[reviewsGroup][review].placeholder) {
43
var newReview = document.createElement("div");
44
newReview.className = "review";
45
46
var reviewImg = document.createElement("img");
47
reviewImg.className = "review-img";
48
reviewImg.src = reviewsGroups[reviewsGroup][review].img;
49
newReview.appendChild(reviewImg);
50
51
var reviewName = document.createElement("div");
52
reviewName.className = "review-name";
53
reviewName.innerText = reviewsGroups[reviewsGroup][review].name;
54
newReview.appendChild(reviewName);
55
56
var reviewContent = document.createElement("div");
57
reviewContent.className = "review-content";
58
reviewContent.innerText = reviewsGroups[reviewsGroup][review].review;
59
newReview.appendChild(reviewContent);
60
} else {
61
var newReview = document.createElement("div");
62
newReview.className = "review-placeholder";
63
}
64
65
reviewContainer.appendChild(newReview);
66
}
67
68
newSlide.appendChild(reviewContainer);
69
70
reviewsElement.appendChild(newSlide);
71
}
72
73
function navigation(slider) {
74
let wrapper, dots, arrowLeft, arrowRight;
75
76
function markup(remove) {
77
wrapperMarkup(remove);
78
dotMarkup(remove);
79
arrowMarkup(remove);
80
}
81
82
function removeElement(elment) {
83
elment.parentNode.removeChild(elment);
84
}
85
function createDiv(className) {
86
var div = document.createElement("div");
87
var classNames = className.split(" ");
88
classNames.forEach((name) => div.classList.add(name));
89
return div;
90
}
91
92
function arrowMarkup(remove) {
93
if (remove) {
94
removeElement(arrowLeft);
95
removeElement(arrowRight);
96
return;
97
}
98
arrowLeft = createDiv("arrow arrow--left");
99
arrowLeft.addEventListener("click", () => slider.prev());
100
arrowRight = createDiv("arrow arrow--right");
101
arrowRight.addEventListener("click", () => slider.next());
102
103
wrapper.appendChild(arrowLeft);
104
wrapper.appendChild(arrowRight);
105
}
106
107
function wrapperMarkup(remove) {
108
if (remove) {
109
var parent = wrapper.parentNode;
110
while (wrapper.firstChild) parent.insertBefore(wrapper.firstChild, wrapper);
111
removeElement(wrapper);
112
return;
113
}
114
wrapper = createDiv("navigation-wrapper");
115
document.getElementById("reviews").appendChild(wrapper);
116
wrapper.appendChild(slider.container);
117
}
118
119
function dotMarkup(remove) {
120
if (remove) {
121
removeElement(dots);
122
return;
123
}
124
dots = createDiv("dots");
125
slider.track.details.slides.forEach((_e, idx) => {
126
var dot = createDiv("dot");
127
dot.addEventListener("click", () => slider.moveToIdx(idx));
128
dots.appendChild(dot);
129
});
130
wrapper.appendChild(dots);
131
}
132
133
function updateClasses() {
134
var slide = slider.track.details.rel;
135
slide === 0 ? arrowLeft.classList.add("arrow--disabled") : arrowLeft.classList.remove("arrow--disabled");
136
slide === slider.track.details.slides.length - 1 ? arrowRight.classList.add("arrow--disabled") : arrowRight.classList.remove("arrow--disabled");
137
Array.from(dots.children).forEach(function (dot, idx) {
138
idx === slide ? dot.classList.add("dot--active") : dot.classList.remove("dot--active");
139
});
140
}
141
142
slider.on("created", () => {
143
markup();
144
updateClasses();
145
document.getElementById("reviews").style.visibility = "initial";
146
});
147
slider.on("optionsChanged", () => {
148
console.log(2);
149
markup(true);
150
markup();
151
updateClasses();
152
});
153
slider.on("slideChanged", () => {
154
updateClasses();
155
});
156
slider.on("destroyed", () => {
157
markup(true);
158
});
159
}
160
161
var slider = new KeenSlider("#my-keen-slider", {}, [navigation]);
162
})();
163
164