-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathfeature.js
More file actions
2464 lines (2014 loc) · 79.7 KB
/
feature.js
File metadata and controls
2464 lines (2014 loc) · 79.7 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
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
const cl = console.log.bind(console);
let userStatus = document.querySelectorAll('.statusUser');
let statusUsers = userStatus[1];
let statusDeveloper = userStatus[0];
const signinBTN = document.querySelector('.signin-box');
const sureBtn = document.querySelector('.AllowBtn');
const signoutBTN = document.querySelector('#signout-btn');
const closeCards = document.querySelector('#close-cards');
const notSureBtn = document.querySelector('.NotnowBtn');
let containerHome = document.querySelector('.container-home');
let backgroundHome = document.querySelector('#background-home');
let forwardIcon = document.querySelector('.forward-box ion-icon');
let identityUser = document.querySelectorAll('.items-info-user .article-text');
let btnBackPersonlity = document.querySelector('.container-personality-box .wrapper-header-menu .headerMenu .arrow-button .arrow-menu')
let nemBots = document.querySelector('.nameBot');
let botStat = document.querySelector('.botStatus');
let firstDescTxt = document.querySelector('.descriptionText:first-child');
let arrowButon = document.querySelector('.arrow-button');
let footer = document.querySelector('.footer');
let input = document.querySelectorAll('#jawaban');
let bgColor = document.querySelectorAll('#bgColor');
let myButton = document.querySelectorAll('#myButton');
let bio = document.querySelectorAll('.infoTxt');
let containerAction = document.querySelector('.container-cards');
let cardsUser = document.querySelector('.container-cards-user');
let cardsAction = document.querySelector('.container-cards-notif');
let containerInput = document.getElementById('container_input')
let about = document.querySelector('.about');
let favItem = document.querySelectorAll('.favorite-items');
let chatUser = document.querySelector('.chatJawaban');
let chatBot = document.querySelector('.chatPertanyaans');
let imgBox = document.querySelector('#imgBox');
let imgProfile = document.querySelectorAll('.imgProfile');
let fablue = document.querySelector('.nameBot');
let mail = document.getElementById('mail');
let footers = document.querySelectorAll('#footers');
let myKoleksi = document.querySelectorAll('#myKoleksi');
let pjsDefault = document.querySelector('#particles-js');
let pjsGame = document.querySelector('#particles-game');
let footerWeb = document.getElementById('footer-web').cloneNode(true);
(function() {
let index = 0;
const lengthQuote = ['Setiap baris kode adalah kesempatan untuk belajar sesuatu yang baru.','belajar memahami bahasa pemrograman lebih menyenangkan dari pada memahami rumus matematika', 'Semangatmu menentukan seberapa jauh kemampuanmu berkembang.', 'Setiap program memiliki cerita, dan kamu adalah penulisnya.', 'Coding adalah tempat di mana logika bertemu dengan imajinasi.', 'Tidak ada yang lebih menyenangkan daripada menulis dan memahami sebuah program.'];
const quoteText = document.querySelector('#quote-text');
function tampilkanQuoteBerikutnya() {
index = (index + 1) % lengthQuote.length;
quoteText.textContent = lengthQuote[index];
}
const intervalId = setInterval(tampilkanQuoteBerikutnya, 5000);
})();
const contentCardsSkils = document.querySelectorAll('.content-cards-skils');
const container_cards_excess = document.getElementById('cards-excess');
const container_cards_lack = document.getElementById('cards-lack');
const itemsCardsSkils = document.querySelector('.items-cards-skils');
const textExcess = [
{
icon: 'people',
body: 'mampu beradaptasi dengan lingkungan baru dan mampu berkomunikasi secara jelas dan efektif dengan anggota tim, manajemen, dan memiliki kepekaan interpersonal yang baik, mampu berkomunikasi secara baik dengan berbagai anggota tim.',
titleCards: 'Beradaptasi'
},
{
icon: 'library',
body: 'memiliki semangat belajar yang tinggi, terbuka terhadap umpan balik dan kritik untuk terus meningkatkan diri menjadi lebih baik, siap untuk mengikuti perkembangan teknologi dan berkomitmen untuk terus meningkatkan kemampuan diri.',
titleCards: 'Belajar'
},
{
icon: 'time',
body: 'baik dalam mengelola waktu secara efektif, memprioritaskan tugas dengan bijak untuk mencapai produktivitas maksimal dan sistematis dalam penjadwalan waktu untuk memastikan pencapaian target secara konsisten.',
titleCards: 'Waktu'
},
{
icon: 'person',
body: 'saya mungkin kadang-kadang merasa kurang percaya diri dalam menghadapi tugas tertentu atau sebaliknya, atau terlalu percaya diri tanpa menyadari batas kemampuan saya bisa atau tidaknya menyelesaikan tugas tersebut.',
titleCards: 'Percaya diri'
},
{
icon: 'code-working',
body: 'belum menguasai bagaimana agar menulis kode yang baik dan menerapkan prinsip-prinsip pengembangan software seperti clean code (kode yang bersih), DRY (Dont Repeat Yourself), dan solid principles (kode yang mudah di mengerti dan flexsibel).',
titleCards: 'Kode'
},
{
icon: 'image',
body: 'dalam mengembangkan sebuah design website (UI) dan pengalaman pengguna (UX) yang saya kembangkan saat masih kurang baik. untuk itu saya terus berusaha untuk belajar memahami UI / UX agar design web dan pengalaman pengguna yang saya kembangkan menjadi lebih baik.',
titleCards: 'UI / UX'
}
];
for (let i = 1; i < 4; i++) {
const clonItemCardSkils = itemsCardsSkils.cloneNode(true);
const contentCardsSkils = clonItemCardSkils.querySelectorAll('.content-cards-skils');
if (i < 3) {
container_cards_excess.appendChild(clonItemCardSkils.cloneNode(true));
container_cards_lack.appendChild(clonItemCardSkils.cloneNode(true));
} else {
container_cards_lack.appendChild(clonItemCardSkils.cloneNode(true));
}
}
const cardsSkils = document.querySelectorAll('.cards-skils');
cardsSkils.forEach((cards, index) => {
const bodyTexts = document.querySelectorAll('.body-cards-skils');
const iconCards = document.querySelectorAll('.cards-icon');
const headerTexts = document.querySelectorAll('.header-text-cards');
bodyTexts[index].textContent = textExcess[index].body;
headerTexts[index].textContent = textExcess[index].titleCards;
iconCards.forEach((items, index) => {
items.setAttribute('name', textExcess[index].icon);
});
});
const hints = document.querySelectorAll('.hint');
function scrollHints() {
hints.forEach((hint) => {
const hintsPosition = hint.getBoundingClientRect().top;
const textPosition = hint.getBoundingClientRect().top;
const shouldShowHints = [hintsPosition, textPosition].every((items) => items < window.innerHeight / 1.5);
const boxHints = document.querySelectorAll('#show-elem');
const hintsText = document.querySelectorAll('.hint-text');
hintsText.forEach((text) => {
text.classList.toggle('showHint', shouldShowHints);
});
boxHints.forEach(function(box) {
box.classList.toggle('showHint', shouldShowHints);
hint.classList.toggle('showHint', shouldShowHints);
});
});
}
window.addEventListener('scroll', scrollHints);
function reductionMonth(lastMonth, monthNow) {
const now = new Date(monthNow);
const last = new Date(lastMonth);
const selisihTahun = last.getFullYear() - now.getFullYear();
const selisihBulan = (selisihTahun * 12) + (last.getMonth() - now.getMonth());
return selisihBulan;
}
const bulanNow = `${y}` + '-' + `${monthIndex + 1}` + '-' + `${d}`;
const MonthAgo = reductionMonth('2024-06-01', `${bulanNow}`);
const FYIMonth = document.getElementById('txt-hint');
FYIMonth.innerHTML = `This website was first developed and created on 1 June 2023. FYI this it was 1 year ${MonthAgo} months ago !<br><br>Developer : Farid Fathoni N`
const personality_page = document.querySelector('.container-personality-box');
const containerPopup = document.querySelector('.container-my-popup');
const myPopup = document.querySelector('.my-popup');
const clonedMyPopup = myPopup.cloneNode(true);
const iconPopup = clonedMyPopup.querySelector('.my-popup #ico-koleksi');
const textPopup = clonedMyPopup.querySelector('#text-popup');
const iconAttributes = () => {
return {
alert: {
src: 'https://cdn.lordicon.com/krenhavm.json',
trigger: 'in',
delay: '500',
stroke: 'bold',
state: 'in-reveal'
},
info: {
src: 'https://cdn.lordicon.com/gqjpawbc.json',
trigger: 'in',
delay: '500',
stroke: 'bold',
state: 'in-reveal'
},
love: {
src: 'https://cdn.lordicon.com/jjoolpwc.json',
trigger: 'in',
delay: '500',
stroke: 'bold',
state: 'morph-glitter'
},
unlove: {
src: 'https://cdn.lordicon.com/jjoolpwc.json',
trigger: 'in',
delay: '400',
stroke: 'bold',
state: 'morph-heart-broken'
}
}
}
function notificationPopup(params) {
const { text, icon } = params;
const attributes = iconAttributes();
const getAttributes = attributes[icon];
Object.keys(getAttributes).forEach(key => iconPopup.setAttribute(key, getAttributes[key]));
textPopup.innerHTML = text;
clonedMyPopup.style.display = 'flex';
containerPopup.appendChild(clonedMyPopup.cloneNode(true));
}
const notificationParam = document.querySelector('.notificationPara');
const notificationIcon = document.querySelector('.notificationCard #ico-koleksi');
function notificationCards(params) {
const { text, icon } = params;
const attributes = iconAttributes();
const getAttributes = attributes[icon];
notificationParam.textContent = text;
Object.keys(getAttributes).forEach(key => notificationIcon.setAttribute(key, getAttributes[key]));
}
function handleAction(params) {
const { action, event, removePage } = params;
loadingAnimation({
active: defaultElem,
remove: cardsAction,
isRemove: defaultElem,
conditional: defaultElem,
action: 'active'
});
switch(action) {
case 'sure':
const actionsMap = {
'signout': () => {
notificationPopup({ icon: 'alert', text: 'Selamat sign out telah berhasil!' });
localStorage.clear();
},
'reload': () => {
location.reload();
},
'delete': () => {
alert('deleting...');
}
};
let result = actionsMap[event] || "maaf gagal melakukan tindakan!";
if (typeof result === 'function') {
result();
} else {
alert(result);
}
break;
default:
console.log('default');
}
}
function handlingAction(params) {
const { action, event } = params;
switch(event) {
case 'clear-message':
const containerChat = document.querySelector("#wrapper-item-chat #contentPertanyaan");
firstContentPertanyaan.style.display = "none";
notificationPopup({ icon: 'alert', text: 'Berhasil membersihkan chat!' });
while (containerChat.childElementCount > 1) {
containerChat.removeChild(containerChat.firstChild);
}
break;
case 'options':
loadingAnimation({
active: personality_page,
remove: pageChat,
conditional: defaultElem,
isRemove: defaultElem,
action: 'active'
});
btnBackPersonlity.onclick = () => { handlingAction({ action: null, event: 'options' }) };
break;
case 'switch-notif':
console.log('switch notif')
break;
default:
}
}
function handleSelectChange(event) {
const userJSON = JSON.parse(localStorage.getItem('userJSON'));
const setType = event.target.id;
const getSelect = event.target.value;
userJSON.user.notification = event.target.value;
switch(setType) {
case 'notif':
const audio = document.getElementById('audio-player');
const source = audio.querySelector('source');
source.src = `assets/sounds/${getSelect}.mp3`;
notificationPopup({ icon: 'love', text: `mengubah suara notifikasi ke ${getSelect}`});
audio.load();
setTimeout(500, audio.play());
break;
default:
}
localStorage.setItem('userJSON', JSON.stringify(userJSON));
}
let targetPopup = document.querySelector('.container-my-popup');
const observe = new MutationObserver((mutationsList, observe) => {
for (let mutation of mutationsList) {
if (mutation.type === 'childList' && mutation.addedNodes.length > 0) {
const lastClonedMyPopup = containerPopup.lastElementChild;
setTimeout(() => {
lastClonedMyPopup.style.opacity = '0';
setTimeout(() => containerPopup.removeChild(lastClonedMyPopup), 500);
}, 3800);
}
}
});
const configs = { childList: true, subtree: true };
observe.observe(targetPopup, configs);
let input_namaPanggilan = personalInput[0];
let input_namaLengkap = personalInput[1];
let input_favsongs = personalInput[7];
let input_birthday = personalInput[2];
let input_hobby3 = personalInput[10];
let input_planet = personalInput[5];
let input_dreams = personalInput[6];
let input_gender = personalInput[4];
let input_hobby1 = personalInput[8];
let input_hobby2 = personalInput[9];
let input_class = personalInput[3];
let input_bio = document.getElementById('textarea-personality');
let inputPersonal = [input_namaPanggilan, input_namaLengkap, input_birthday, input_class, input_favsongs, input_gender, input_dreams, input_planet, input_hobby1, input_hobby2, input_hobby3, input_bio];
(() => {
const personality = JSON.parse(localStorage.getItem('userJSON'));
if (!personality) return;
const { personal } = personality.user;
const { hobby } = personal;
input_bio.value = personal.bioUser;
for (const subject in personal) {
const inputValue = personalInput[Object.keys(personal).indexOf(subject)];
inputValue.value = personal[subject];
}
const hobbyKeys = Object.keys(hobby);
const hobbyInput = [...personalInput].slice(8, 11);
for (const index in hobbyKeys) {
const setHobby = hobbyInput[index];
const getHobby = hobbyKeys[index];
setHobby.value = hobby[getHobby];
}
})();
function togglePersonality() {
personality_page.classList.toggle('active');
if (localStorage.getItem('full_login') === 'true') {
containerUserPage.classList.toggle('active');
} else {
container.classList.toggle('active');
}
window.scrollTo({ top: 0, behavior: 'smooth' });
}
const userJSON = () => {
return {
user: {
namaUser: null,
emailUser: null,
passwordUser: null,
dateLogin: null,
notification: 'watersplash',
personal: {
panggilan: null,
fullName: null,
birth: null,
status: null,
gender: null,
planet: null,
dreams: null,
songs: null,
bioUser: null,
hobby: {
hobbyFir: null,
hobbySec: null,
hobbyThi: null
}
}
},
flagLogin: {
isLogin: false,
isStart: false,
isFullLogin: false
}
}
}
const handlePersonality = (params) => {
let newUserJSON = JSON.parse(localStorage.getItem('userJSON'));
if (newUserJSON) {
const { personal } = newUserJSON.user;
const { hobby } = personal;
const { hobbyFir, hobbySec, hobbyThi, ...userData } = params;
Object.assign(personal, userData);
Object.assign(hobby, { hobbyFir, hobbySec, hobbyThi });
newUserJSON.flagLogin.isFullLogin = true;
localStorage.setItem('userJSON', JSON.stringify(newUserJSON));
}
};
function savePersonality() {
let birthday = input_birthday.value.toLowerCase();
const submit = document.querySelector('.form-email');
const monthNames = ["Januari", "Februari", "Maret", "April", "Mei", "Juni", "Juli", "Agustus", "September", "Oktober", "November", "Desember"];
const lowerMonth = monthNames.map((month) => month.toLowerCase());
if (inputPersonal.every((input) => input.value.length >= 4)) {
const birthdayDate = birthday.split(' ');
const moon = birthdayDate[1];
const date = parseInt(birthdayDate[0]);
const year = parseInt(birthdayDate[2]);
//(birthday.length >= 2) ? cl(moon) : cl(false) ;
const birthdayValidation = [!isNaN(date), lowerMonth.some((month) => moon?.includes(month)), !isNaN(year), year < 2013, year > 1995];
if (birthdayValidation.every((items) => items === true)) {
tsConfetti(0);
let getPanggilan = input_namaPanggilan.value.toLowerCase();
let getFullName = input_namaLengkap.value.toLowerCase();
let getBirthday = input_birthday.value;
let getClass = input_class.value;
let getFavsong = input_favsongs.value;
let getGender = input_gender.value.toLowerCase();
let getDreams = input_dreams.value;
let getPlanet = input_planet.value;
let getBioUser = input_bio.value;
let getHobby1 = input_hobby1.value;
let getHobby2 = input_hobby2.value;
let getHobby3 = input_hobby3.value;
loadingAnimation({
active: cardsAction,
remove: defaultElem,
conditional: defaultElem,
isRemove: defaultElem,
action: 'active'
});
handlePersonality({
panggilan: getPanggilan,
fullName: getFullName,
birth: getBirthday,
status: getClass,
gender: getGender,
planet: getPlanet,
dreams: getDreams,
bioUser: getBioUser,
songs: getFavsong,
hobbyFir: getHobby1,
hobbySec: getHobby2,
hobbyThi: getHobby3
});
sureBtn.onclick = () => {handleAction({ action: 'sure', event: 'reload', removePage: cardsAction }) }
notSureBtn.onclick = () => { handleAction({ action: 'null', event: null, removePage: cardsAction })};
notificationCards({ text: "apakah kamu yakin ingin menyimpan perubahan? tindakan ini akan mereload browser.", icon: "alert" });
notificationPopup({ icon: 'info', text: 'PERUBAHAN TELAH DI SIMPAN ✓' });
} else {
setTimeout(() => notificationPopup({ icon: 'alert', text: 'tolong isi tanggal lahir dengan benar. dengan format seperti ini 29 Oktober 2006'}), 300);
}
} else {
setTimeout(() => notificationPopup({ icon: 'alert', text: 'Kamu harus mengisi setiap input agar bisa menyimpan perubahan.'}), 300);
}
if (localStorage.getItem('full_login') === 'true') {
setTimeout(() => {
userValidation();
genderValidation();
}, 500);
}
}
const words = document.querySelectorAll('.word');
// Animasi rotasi teks
function rotateWords() {
let counter = 0;
let hiddenLoader;
const intervalLoader = setInterval(() => {
if (counter === 0 && !hiddenLoader) {
hiddenLoader = true;
words[0].style.transform = `translateY(40px)`;
setTimeout(() => {
words.forEach(e => e.style.opacity = '1');
}, 300);
}
words.forEach(word => {
const height = word.clientHeight;
word.style.transform = `translateY(-${height * counter}px)`;
});
counter++;
if (counter === words.length) {
counter = 0;
setTimeout(() => {
words.forEach(e => e.style.opacity = '0');
}, 600);
hiddenLoader = false;
}
}, 1000);
// clearInterval(interval);
}
document.addEventListener('DOMContentLoaded', rotateWords);
function goFullscreen() {
if (document.documentElement.requestFullscreen) {
document.documentElement.requestFullscreen();
} else if (document.documentElement.mozRequestFullScreen) { // Firefox
document.documentElement.mozRequestFullScreen();
} else if (document.documentElement.webkitRequestFullscreen) { // Chrome, Safari and Opera
document.documentElement.webkitRequestFullscreen();
} else if (document.documentElement.msRequestFullscreen) { // IE/Edge
document.documentElement.msRequestFullscreen();
}
}
function simulateClick(element) {
const event = new MouseEvent('click', {
view: window,
bubbles: true,
cancelable: true
});
element.dispatchEvent(event);
}
document.getElementById('open-chat').addEventListener('click', goFullscreen);
window.addEventListener('load', () => {
const getUser = JSON.parse(localStorage.getItem('userJSON'));
const isLogin = (getUser && getUser.flagLogin.isLogin === true);
const loaderTime = (getUser && isLogin) ? 7000 : 24000 ;
const button = document.getElementById('open-chat');
simulateClick(button);
setTimeout(() => {
loadingAnimation({
active: containerHome,
remove: defaultElem,
conditional: defaultElem,
isRemove: defaultElem,
action: 'active'
});
isCustomParticle ? pjsDefault.style.display = 'none' : pjsDefault.style.display = 'block';
linearCustom.style.display = isCustomParticle ? "none" : "none";
pjsGame.style.visibility = isCustomParticle ? "visibility" : "hidden";
isCustomParticle ? particlesGame({ mode: null, direction: null, image: 'assets/sticker/hearts.png', speed: null, key: false }) : console.log('user belum memenangkan game apapun');
document.querySelector('#signup-text').innerHTML = isLogin ? `<button class="btn-login"><span><ion-icon name="person"></ion-icon>${namaDepan}</span></button>` : `<button class="btn-login"><span><ion-icon name="person"></ion-icon>SIGN UP</span></button>`;
const savedNotif = JSON.parse(localStorage.getItem('userJSON'));
const useNotif = document.getElementById('notif');
savedNotif ? useNotif.value = savedNotif.user.notification : 'bubble';
const audio = document.getElementById('audio-player');
const source = audio.querySelector('source');
audio.load();
firstInitializationChat();
source.src = `assets/sounds/${savedNotif?.user.notification}.mp3`;
loaders.style.display = "none";
//notificationPopup({ icon: 'love', text: `selamat ${sayTime(isLogin)} ${fullName}` });
}, loaderTime);
});
const containerGuide = document.querySelector('.container-guide');
const btnGuide = document.querySelector('.box-guide .cta-koleksi #myButton');
const bubbleChat = document.querySelectorAll('.content-guide .box-guide .wrapper-chat-guide .padding-overflow .containerChat');
const wrapper_chat = document.querySelector('.container-chat-guide');
const title_page_guide = document.querySelector('.introduction_guide .description_text');
function toggleGuide() {
arrowMenu.style.display = 'block';
container.classList.toggle('active');
containerGuide.classList.toggle('active');
if (containerSidebar.classList.contains('active')) {
blurLayer.style.display = "none";
menuSidebar.classList.toggle('active');
containerSidebar.classList.toggle('active');
}
}
let initGuide = 0;
const sayGuide = namaDepan || 'user';
const objectGuide = [
{
chatUser: 'gatau coba aja tebak',
chatBot: `Umur kamu berapa ${sayGuide}?`,
note: ['saat kamu mengirimkan pesan tersebut bot akan menanyakan kembali pertanyaan nya. jika kamu tidak menjawab dan hanya mengirimkan pesan seperti diatas maka bot akan baper dan diam karna kamu tidak memberitahu apa yang dia tanyakan.', 'saat bot sudah seperti itu mau kamu men spam bot hingga 100x pesan chat. bot akan tetap diam jika kamu tidak menjawab apa yang dia tanyakan sebelumnya. solusinya adalah kamu harus menjawab apa yang bot tanyakan ketika bot sudah diam / tidak membalas chat kamu, walaupun terkadang dalam momen tertentu bot akan tetap diam.']
},
{
chatUser: 'hllo jg fabot siapa yg buat km?',
chatBot: `hallo ${sayGuide} ${genderSay} senang berkenalan dengan kamu 😎`,
note: ['tolong disaat kamu melakukan chat dengan bot di wajibkan menggunakan kata kata yang baik dan benar, karna jika kamu mengirimkan pesan chat seperti diatas dengan mengetikan kata yang ringkas dan tidak benar bot tidak akan memahami apa yang kamu ketikan dalam chat yang kamu kirimkan.', `jadi di sarankan agar kamu mengetikan kata kata yang baik dan benar seperti contoh pesan chat diatas mengetik kata 'hllo / jg / yg / km' seharusnya diketikan dengan 'hallo / juga / yang / kamu' dan seterusnya harus di ketikan secara jelas, dan tolong diingat jangan berkata kata kasar saat mengirimkan pesan.`]
},
{
chatUser: 'sok asik lo bngst!!',
chatBot: 'asik juga ya chatan sama kamu',
note: [`saat kamu mengetikan kata kata kasar seperti diatas bot automatis akan menyudahi chat dengan kamu dan dia akan merebrowser secara paksa dan kedepan nya kamu '${sayGuide}' akan di cap sebagai pengguna yang tidak ramah`, 'tolong di ingat ketika kamu mengetikan dan mengirim pesan di wajibkan menggunakan kata kata yang baik dan benar karna attitude diutamakan di website ini.']
}
];
window.addEventListener('scroll', function() {
let scrollHeight = window.pageYOffset;
const batasHeight = 50;
if (scrollHeight >= batasHeight) {
wrapper_chat.style.opacity = '0';
title_page_guide.style.opacity = '1';
} else {
title_page_guide.style.opacity = '0';
setTimeout(() => wrapper_chat.style.opacity = '1', 700);
}
});
function nextGuide() {
initGuide++;
const selectedGuide = objectGuide[initGuide -1];
if (selectedGuide) {
const chatUser_guide = document.querySelector('.content-guide .box-guide .wrapper-chat-guide .padding-overflow .containerChat #chatJawaban #textJawaban');
const chatBot_guide = document.querySelector('.content-guide .box-guide .wrapper-chat-guide .padding-overflow .containerChat #chatPertanyaan #textPertanyaan');
initGuide = (initGuide === objectGuide.length) ? initGuide = 0 : initGuide;
bubbleChat.forEach(function(items) {
items.style.opacity = '0';
const note_description = document.querySelectorAll('.wrapper-note-guide #description_guide');
note_description.forEach(function(items, index) {
items.style.opacity = '0';
setTimeout(() => {
bubbleGuideEff(0);
chatBot_guide.innerHTML = selectedGuide.chatBot;
chatUser_guide.innerHTML = selectedGuide.chatUser;
items.innerHTML = selectedGuide.note[index];
}, 500);
});
});
}
}
nextGuide();
const bubbleGuideEff = (index) => {
if (index < bubbleChat.length) {
bubbleChat[index].style.opacity = '1';
setTimeout(() => {
bubbleGuideEff(index + 1);
}, 500);
} else {
const note_description = document.querySelectorAll('.wrapper-note-guide #description_guide');
note_description.forEach(function(items) {
setTimeout(() => {
items.style.opacity = '1';
}, 300);
});
}
};
const objectVersion = [
{ deskripsi : 'ini adalah versi pertama saat saya mengembangkan chat bot ini sekaligus memahami bagaimana caranya membuat user dan bot bisa saling membalas pesan, chat bot ini dibuat dari chatbot sederhana yang saya buat, berikut link nya <a target="_blank" href="https://fabot-v1.vercel.app">https://fabot-v1.vercel.app</a>, website chat bot sederhana tersebut di buat pada 25 Mei 2023', info: ['1 Juni 2023',
'Kirim pesan, bot bisa menjawab pesan', 'V 0.25.23', 'fiturr']
},
{ deskripsi : 'ini adalah versi kedua chat bot ini di kembangkan. di versi ini saya sangat bingung / pusing memikirkan bagaimana caranya agar pesan chat bisa seperti balas membalas antara bot dan user, tapi setidak nya saya sudah berhasil memunculkan pesan dari bot. PR nya saya hanya harus memikirkan bagaimana caranya agar chat bisa tersusun dan sedikit menambahkan background animasi agar tampilan chat lebih bagus dan menarik. berikut link nya <a target="_blank" href="https://chatbot-v2-phi.vercel.app">https://fabot-v2.vercel.app</a>', info: ['3 Juni 2023 ', 'background animation', 'V 0.30.23',
'fiturr']
},
{ deskripsi : 'ini adalah versi ketiga chat bot ini di kembangkan. di versi ini saya sudah memahami bagaimana caranya agar pesan chat bisa balas membalas tidak menumpuk seperti versi sebelumnya, menambahkan sedikit validasi ketika bot sedang mengetik maka status bot yang sebelumnya online menjadi mengetik saat bot sedang mengetikan pesan, merubah foto profil bot yang yang sebelumnya menjadi icon fabot dan menambahkan sedikit pesan informasi di bawah input tentang tanggal berapa v bot itu di update. berikut link nya <a target="_blank" href="https://chatbot-v3-orpin.vercel.app">https://fabot-v3.vercel.app</a>', info: ['9 Juni 2023', 'menambahkan footer, validasi mengetik, change photo profile bot', 'V 0.90.23', 'fiturr']
},
{ deskripsi : 'ini adalah versi keempat chat bot ini di kembangkan. di versi ini saya menambahkan halaman mengenai developer / pembuat website chat bot ini walaupun saat itu saya belum menyelesaikan seluruhnya karna waktu itu ada pekerjaan lain yang harus saya selsaikan. dan di versi ini saya membuat fitur untuk mengubah tema website menjadi gelap / terang. meskipun fitur ini belum terlalu sempurna dikarnakan ketika user mengubah tema chat yang sebelumnya dark menjadi light warna dari pesan chat akan tetap di tema dark dan tidak berubah menjadi warna tema light. begitupun sebaliknya, sekaligus di waktu inilah saya mulai mengenal pusing dan bingung nya belajar tentang javascript dasar. berikut link nya <a target="_blank" href="https://chatbot-v4-eight.vercel.app">https://fabot-v4.vercel.app</a>',
info:
['22 Juni 2023', 'Developer Page, switch theme', 'V 1.0.22', 'fiturr']
},
{ deskripsi : 'ini adalah versi kelima chat bot ini di kembangkan. di versi ini saya telah membuat konsep halaman mengenai developer walaupun halaman tersebut belum selesai sepenuhnya karna saya masih bingung apa yang harus ditambahkan pada halaman tersebut. tetapi disisi lain saya telah membuat 3 fitur yaitu fitur pesan email, ekspresi bot dan opsi untuk pengaturan. untuk fitur pesan email saya buat secara real time ketika user mengklik tombol send maka akan automatis mengirimkan apa yang user ketikan dalam form email tersebut, untuk fitur ekspresi bot ketika kamu meng klik foto profil bot maka ekspresi bot akan berubah dan yang terakhir adalah membuat validasi apa yang user ketikan di input adalah kata kata yang baik dan bukan lah kata kata kasar. berikut link nya <a target="_blank" href="https://chatbot-v5-six.vercel.app">https://fabot-v5.vercel.app</a>', info: ['3 Juli 2023', 'send email, options, bot ekspresi', 'V 1.03.23', 'fiturr']
},
{ deskripsi : 'ini adalah versi keenam chat bot ini di kembangkan. di versi ini saya telah menyelesaikan halaman mengenai developer didalam halaman tersebut saya menambahkan fitur Explore properties dan footer, saya juga menambahkan notifikasi pop up pemberitahuan untuk memberikan informasi dan menambahkan fitur ketika user mengklik tombol [ LAUNCH ] maka user bisa melihat website website yang saya pernah buat sebelumnya, tidak banyak fitur yang saya selesaikan pada saat ini karna saat itu saya terlalu sibuk dengan dunia rl saya. berikut link nya <a target="_blank" href="https://chatbot-v6.vercel.app">https://fabot-v6.vercel.app</a>', info: ['17 Juli 2023', 'explore properties footer, added popup, website colection', 'V 1.17.23', 'fiturr']
},
{ deskripsi : 'ini adalah versi ketujuh chat bot ini di kembangkan dan sekaligus update terlama untuk versi terbaru yang akan datang, yaitu versi saat ini, di versi ini saya membuat fitur sidebar yang bertujuan untuk menampilkan informasi pengguna yang menggunakan website chat bot ini, dan di dalam sidebar ini mempunyai fitur fitur seperti Home, My Profile, Message History, About Developer, Social Media developer dan fitur tombol untuk login / logout walaupun saat itu fitur fitur tersebut belum dikembangkan untuk validasinya. berikut link nya <a target="_blank" href="https://chatbot-v7.vercel.app">https://fabot-v7.vercel.app</a>', info: ['2 Agustus 2023', 'sidebar feature, login/logout feature', 'V 2.02.23', 'fiturr']
}
];
const wrapperVersion = document.querySelector('.wrapper-box-ver');
const item_version = document.querySelector('.box-ver');
for (let version = 0; version < objectVersion.length - 1; version++) {
const clone_version = item_version.cloneNode(true);
wrapperVersion.appendChild(clone_version);
const boxVersion = document.querySelectorAll('.ver_box_bot');
boxVersion.forEach((version, index) => {
version.textContent = objectVersion[index].info[2];
});
boxVersion.forEach(function(items, index) {
items.onclick = function() {
const selectedVersion = objectVersion[index];
boxVersion.forEach(item => item.classList.remove('active-ver'));
items.classList.add('active-ver');
if (selectedVersion) {
const infoVersionBot = document.querySelectorAll('#infoVer');
infoVersionBot.forEach(function(items, index) {
items.style.opacity = '0';
setTimeout(() => {
items.style.opacity = '1';
items.innerHTML = selectedVersion.info[index];
}, 300);
});
const descVersionBot = document.querySelector('#descVer');
descVersionBot.style.opacity = '0';
setTimeout(() => {
descVersionBot.style.opacity = '1';
descVersionBot.innerHTML = selectedVersion.deskripsi;
}, 300);
}
};
});
setTimeout(() => boxVersion[0].onclick(), 3000)
};
function functionList(cases) {
startStored = true;
const getObject = dataAPI();
const getChat = getObject.list[cases].chat;
const getCommand = getObject.list[cases].command;
clonedTextJawaban.innerHTML = `/${getCommand}`;
document.getElementById('contentPertanyaan').appendChild(clonedElementJawaban.cloneNode(true));
setTimeout(() => {
clonedTextPertanyaan.innerHTML = cases;
document.getElementById('contentPertanyaan').appendChild(clonedElementPertanyaan.cloneNode(true));
}, 1000);
}
const dataAPI = () => {
return {
list: {
number_api: {
apiToken: null,
command: 'numberapi',
apiInfo: 'memberikan fakta menarik tentang angka',
chat: 'kamu sekarang menggunakan number_api berikut adalah contoh command nya :<br><br>1. "trivia" untuk hal-hal atau hal-hal yang sangat tidak penting<br>2. "matematika" untuk fakta menarik tentang matematika<br>3. "tahun" untuk fakta menarik tentang tahun<br>4. "tanggal" untuk fakta menarik tentang tanggal 1 - 30<br><br>untuk menggunakan cukup ketikan contoh seperti ini "77 trivia"<br><br>NOTE : perintah fakta menarik ini terkadang mengalami masalah jika terjadi ke gagalan coba ulang kembali',
keyLength: 2,
typeResponse: 'text',
apiUrl: 'http://numbersapi.com',
keyForUse: ["trivia", "matematika", "tahun", "tanggal"],
apiParams: {
trivia: 'trivia',
matematika: 'math',
tahun: 'year',
tanggal: 'date'
},
configFunction: {
isConfigUrl: false,
translate: false,
getDestruction: 'null, null',
bracketConfig: '["data"]',
useAnotherFunction: true
},
useCommand: functionList
},
cats_api: {
apiToken: 'live_Dxk8ET9b6eWXZU310i8mCO58h0YkXmQtWcmHTJZIFGvdfWbRuNemX9IBkocnDPyp',
command: 'catsapi',
apiInfo: 'memberikan foto random menarik tentang kucing',
chat: 'kamu sekarang menggunakan cats_api untuk memberikan foto kucing random berikut adalah contoh command nya :<br><br>1. "breeds" memberikan informasi lengkap tentang jenis kucing tersebut<br>2. "bengal" memberikan hanya foto kucing ber jenis bengal<br>3. "random" memberikan foto random kucing tidak termasuk informasi lengkap<br><br><br>untuk menggunakan cukup ketikan contoh kata diatas seperti ini " breeds "',
keyForUse: ["breeds", "bengal", "random"],
keyLength: 1,
typeResponse: 'json',
apiUrl: 'https://api.thecatapi.com/v1/images/',
apiParams: {
breeds: 'search?has_breeds=1',
bengal: 'search?breed_ids=beng',
random: 'search?'
},
configFunction: {
isConfigUrl: true,
translate: true,
bracketConfig: '["data"][0]["breeds"][0]',
getDestruction: 'origin, name, description, life_span, alt_names, temperament',
useAnotherFunction: false
},
useCommand: functionList
},
gender_api: {
apiToken: null,
command: 'genderapi',
apiInfo: 'menebak berapa persen laki laki / perempuan nama kamu',
chat: 'kamu sekarang menggunakan gender_api untuk menebak berapa persen nama kamu laki laki / perempuan berikut adalah contoh command nya :<br><br>1. "gender"<br>2. cewo<br>3. cewe<br><br>untuk menggunakan cukup ketikan contoh kata diatas dan nama panggilan / nama panjang seperti ini " gender burhan "',
keyForUse: ["gender", "cewe", "cowo"],
keyLength: 2,
typeResponse: 'json',
apiUrl: 'https://api.genderize.io?name',
apiParams: {
gender: '["data"]',
cewe: '["data"]',
cowo: '["data"]'
},
configFunction: {
isConfigUrl: true,
bracketConfig: '["data"]',
getDestruction: 'gender, name, probability',
useAnotherFunction: false
},
useCommand: functionList
},
translate_api: {
apiToken: null,
command: 'translateapi',
apiInfo: 'menerjemahkan text ke dalam bahasa tertentu',
chat: 'kamu sekarang menggunakan translate_api untuk menerjemahkan bahasa berikut adalah contoh command nya :<br><br>1. indonesia : untuk menerjemahkan inggris - indonesia<br>2. inggris : untuk menerjemahkan indonesia - inggris<br>3. sundajawa : untuk menerjemahkan sunda - jawa<br>4. jawasunda : untuk menerjemahkan jawa - sunda<br>5. indojawa : untuk menerjemahkan indonesia - jawa<br>6. indosunda : untuk menerjemahkan indonesia - sunda<br>7. sundaindo : sunda - indonesia<br>8. jawaindo : jawa - indonesia<br><br>untuk menggunakan cukup ketikan contoh command diatas dan kalimat yang ingin di translate seperti ini "indonesia i love you in every universe"',
keyForUse: ["indonesia", "inggris", "sundajawa", "jawasunda", "indojawa", "indosunda", "sundaindo", "jawaindo"],
keyLength: 2,
typeResponse: 'json',
apiUrl: 'https://translate.googleapis.com/translate_a/single?client=gtx&sl',
apiParams: {
indonesia: 'en - id',
jawasunda: 'jv - sun',
sundajawa: 'sun - jv',
inggris: 'id - en',
indojawa: 'id - jv',
indosunda: 'jv - id',
sundaindo: 'sun - id',
jawaindo: 'jv - id'
},
configFunction: {
translate: false,
isConfigUrl: true,
getDestruction: 'translate',
bracketConfig: '["data"][0][0][0]',
useAnotherFunction: false
},
useCommand: functionList
},
guess_name_api: {
apiToken: null,
command: 'nameapi',
apiInfo: 'menebak nama kamu banyak di gunakan negara apa',
chat: 'kamu sekarang menggunakan guess_name_api untuk mengetahui dari mana / seberapa banyak nama kamu di gunakan di negara tersebut berikut adalah contoh command nya :<br><br>1. "country"<br><br>untuk menggunakan cukup ketikan contoh command diatas dan nama seperti ini " burhan negara "',
keyForUse: ["negara", "country"],
keyLength: 2,
typeResponse: 'json',
apiUrl: 'https://api.nationalize.io/?name',
apiParams: {
negara: '["data"]',