-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathscript.js
More file actions
137 lines (113 loc) · 4.13 KB
/
script.js
File metadata and controls
137 lines (113 loc) · 4.13 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
const modal = document.getElementById('modal');
const modalShow = document.getElementById('show-modal');
const modalClose = document.getElementById('close-modal');
const bookmarkForm = document.getElementById('bookmark-form');
const websiteNameEl = document.getElementById('website-name');
const websiteUrlEl = document.getElementById('website-url');
const bookmarksContainer = document.getElementById('bookmarks-container');
let bookmarks = [];
// Show Modal, focus on input
const showModal = () => {
modal.classList.add('show-modal');
websiteNameEl.focus();
}
// Modal Event Listeners
window.addEventListener('click', (e) => (e.target === modal && modal.classList.remove('show-modal'))); //close modal if click outside
modalShow.addEventListener('click', showModal);
modalClose.addEventListener('click', () => modal.classList.remove('show-modal'));
const validate = (nameValue, urlValue) => {
const expression = /https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&//=]*)/g;
const regex = new RegExp(expression);
if(!nameValue || !urlValue) {
alert('Please submit values for both fields!')
return false;
}
if(!urlValue.match(regex)){
alert('Invalid URL! Falied to save bookmark.');
return false;
}
return true;
}
// Build DOM elements from loacl storage
const buildBookmarks = () => {
//First remove all elements in bookmarks container
bookmarksContainer.textContent = '';
bookmarks.forEach((bookmark) => {
const {name, url} = bookmark;
// Create item
const item = document.createElement('div');
item.classList.add('item');
// Close icon
const closeIcon = document.createElement('i');
closeIcon.classList.add('fa-solid', 'fa-xmark');
closeIcon.setAttribute('title', 'Delete Bookmark');
closeIcon.setAttribute('onclick', `deleteBookmark('${url}')`);
// Favicon / link container
const linkInfo = document.createElement('div');
linkInfo.classList.add('name');
// Favicon
const favicon = document.createElement('img');
favicon.setAttribute('src', `https://s2.googleusercontent.com/s2/favicons?domain=${url}`)
favicon.setAttribute('alt', 'Favicon');
// link
const link = document.createElement('a');
link.setAttribute('href', `${url}`);
link.setAttribute('target', '_blank');
link.textContent = name;
// Append bookmarks to container
linkInfo.append(favicon, link);
item.append(closeIcon, linkInfo);
bookmarksContainer.appendChild(item);
});
};
// Fetch bookmarks from localStorage
const fetchBookmarks = () => {
if(localStorage.getItem('bookmarks')) {
bookmarks = JSON.parse(localStorage.getItem('bookmarks'));
} else {
// Create new bookmarks array in localStorage
bookmarks = [
{
name: 'My Site',
url: 'http://www.mattruetz.com'
}
];
localStorage.setItem('bookmarks', JSON.stringify(bookmarks));
}
buildBookmarks();
}
const deleteBookmark = (url) => {
bookmarks.forEach((bookmark, i) => {
if(bookmark.url === url) {
bookmarks.splice(i, 1);
}
});
// Update bookmarks in localStorage
localStorage.setItem('bookmarks', JSON.stringify(bookmarks));
fetchBookmarks();
}
const storeBookmark = (e) => {
e.preventDefault();
const nameValue = websiteNameEl.value;
let urlValue = websiteUrlEl.value;
//Validating & formatting entered URL using regex
if (!urlValue.includes('https://') && !urlValue.includes('http://')) {
urlValue = `https://${urlValue}`;
}
if (!validate(nameValue, urlValue)) {
return false;
}
const bookmark = {
name: nameValue,
url: urlValue
};
bookmarks.push(bookmark);
localStorage.setItem('bookmarks', JSON.stringify(bookmarks));
fetchBookmarks();
bookmarkForm.reset();
websiteNameEl.focus();
}
//Event Listeners
bookmarkForm.addEventListener('submit', storeBookmark);
//On load, fetch bookmarks
fetchBookmarks();