-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcontent.js
More file actions
127 lines (109 loc) · 4.1 KB
/
content.js
File metadata and controls
127 lines (109 loc) · 4.1 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
// Este script roda DENTRO da página do Facebook
console.log("Extensão Marketplace do André: Lógica Inteligente v4 (Deduplicada) carregada!");
// Função para aplicar o filtro visual
function applyCityFilter(filterText) {
if (!filterText) return "Digite uma cidade";
filterText = filterText.toLowerCase();
let countHidden = 0;
let countShown = 0;
// 1. Encontra todos os LINKS que levam para um item do marketplace.
// Isso é muito mais preciso do que buscar divs genéricas.
const productLinks = document.querySelectorAll('a[href*="/marketplace/item/"]');
// 2. Cria um Conjunto (Set) para armazenar os containers únicos.
// Isso evita que a gente pegue o mesmo produto 3 vezes (borda dentro de borda).
const uniqueContainers = new Set();
productLinks.forEach(link => {
// Sobe a partir do link até achar o container do card (aquele com max-width que você identificou)
const container = link.closest('div[style*="max-width"]');
if (container) {
uniqueContainers.add(container);
}
});
// 3. Aplica a lógica apenas nos containers únicos encontrados
uniqueContainers.forEach(container => {
let isMatch = false;
let locationFound = false;
// Busca o span que parece ser a localização (ex: ", PR")
const spans = container.querySelectorAll('span');
for (let span of spans) {
// Regex: Procura por vírgula, espaço e 2 letras maiúsculas (ex: ", PR")
if (/, [A-Z]{2}\b/.test(span.innerText)) {
locationFound = true;
const locationText = span.innerText.toLowerCase();
if (locationText.includes(filterText)) {
isMatch = true;
}
break;
}
}
// Fallback de segurança se não achar o padrão de estado
if (!locationFound) {
if (container.innerText.toLowerCase().includes(filterText)) {
isMatch = true;
}
}
// Aplica o visual
if (isMatch) {
container.style.display = "";
container.style.opacity = "1";
container.style.border = "2px solid #42b72a";
countShown++;
} else {
container.style.display = "none";
countHidden++;
}
});
console.log(`Filtro aplicado: ${countShown} visíveis, ${countHidden} ocultos.`);
return `Ocultados: ${countHidden} anúncios de fora.`;
}
// Função para limpar filtros
function clearFilters() {
// Limpa usando a mesma lógica de seleção para garantir que removemos tudo
const productLinks = document.querySelectorAll('a[href*="/marketplace/item/"]');
productLinks.forEach(link => {
const container = link.closest('div[style*="max-width"]');
if (container) {
container.style.display = "";
container.style.border = "";
container.style.opacity = "";
}
});
}
// Função para ordenar por recentes
function sortByRecent() {
const currentUrl = new URL(window.location.href);
if (currentUrl.searchParams.get('sortBy') === 'creation_time_desc') {
alert('Já estamos na aba de Mais Recentes!');
return;
}
currentUrl.searchParams.set('sortBy', 'creation_time_desc');
window.location.href = currentUrl.toString();
}
// Observador para lidar com rolagem infinita
let currentFilter = "";
const observer = new MutationObserver((mutations) => {
if (currentFilter) {
clearTimeout(window.filterTimeout);
window.filterTimeout = setTimeout(() => {
applyCityFilter(currentFilter);
}, 500);
}
});
observer.observe(document.body, { childList: true, subtree: true });
// Escuta as mensagens do popup
chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {
if (request.action === "filterCity") {
currentFilter = request.city;
const result = applyCityFilter(request.city);
sendResponse({ status: result });
}
else if (request.action === "sortByRecent") {
sortByRecent();
sendResponse({ status: "Redirecionando..." });
}
else if (request.action === "clearFilter") {
currentFilter = "";
clearFilters();
sendResponse({ status: "Filtros limpos" });
}
});