Skip to content

Commit 1004dc7

Browse files
committed
X
1 parent 67098e4 commit 1004dc7

File tree

1 file changed

+95
-102
lines changed

1 file changed

+95
-102
lines changed

extension-manifest-v3/src/pages/settings/components/custom-filters.js

+95-102
Original file line numberDiff line numberDiff line change
@@ -9,91 +9,97 @@
99
* file, You can obtain one at http://mozilla.org/MPL/2.0
1010
*/
1111

12-
import { html } from 'hybrids';
12+
import { html, store } from 'hybrids';
1313
import { detectFilterType } from '@cliqz/adblocker';
1414

15-
const filterTypes = {
16-
NOT_SUPPORTED: 0,
17-
NETWORK: 1,
18-
COSMETIC: 2,
19-
};
20-
21-
class ConversionResult {
22-
errors = [];
23-
isNetworkConversionReady = false;
24-
isCosmeticConversionReady = false;
25-
26-
get isReady() {
27-
return this.isNetworkConversionReady && this.isCosmeticConversionReady;
28-
}
29-
}
30-
31-
async function updateCustomFilters(host) {
32-
const filters = host.querySelector('textarea').value || '';
33-
host.conversion = filters;
34-
return;
35-
}
36-
3715
function onConvertedRules(host, event) {
38-
console.warn('XXXXXadsadas', event.data);
3916
if (!event.data.rules || !event.data.errors) {
4017
return;
4118
}
42-
host.conversionResult.isNetworkConversionReady = true;
43-
host.conversionResult.errors.push('asdsasadas');
19+
20+
console.log("DNR converstion", event.data)
4421
if (event.data.errors.length > 0) {
45-
host.conversionResult.errors.push(...event.data.errors);
22+
// host.conversionResult.errors.push(...event.data.errors);
4623
}
4724
}
4825

49-
function onTextareaUpdate(host) {
50-
host.isEditing = true;
26+
function updateCustomFilters(host) {
27+
store.submit(host.input);
5128
}
5229

30+
const CustomFiltersInput = {
31+
id: true,
32+
text: '',
33+
[store.connect]: {
34+
async get() {
35+
const storage = await chrome.storage.local.get(['custom-filters-input']);
36+
return {
37+
text: storage['custom-filters-input'] || '',
38+
id: 1,
39+
};
40+
},
41+
async set(_, { text }) {
42+
await chrome.storage.local.set({ 'custom-filters-input': text });
43+
return { text, id: 1, };
44+
},
45+
},
46+
};
47+
5348
export default {
54-
isEditing: false,
55-
conversion: {
56-
set(host, input = '') {
57-
if (!input) {
58-
return;
59-
}
60-
console.warn('XXXX', host, input);
61-
host.isEditing = false;
62-
host.conversionResult = new ConversionResult();
49+
input: store(CustomFiltersInput, { draft: true, id: () => 1 }),
50+
errors: { set: (_, values = []) => values },
51+
output: async (host) => {
52+
const { text } = await store.resolve(host.input);
53+
const filters = text.split('\n').map(f => f.trim()).filter(Boolean);
6354

64-
const networkFilters = [];
65-
const cosmeticFilters = [];
55+
const output = {
56+
networkFilters: [],
57+
cosmeticFilters: [],
58+
dnrRules: {},
59+
errors: [],
60+
};
6661

67-
for (const filter of input.split('\n')) {
68-
const filterType = detectFilterType(filter);
69-
switch (filterType) {
70-
case filterTypes.COSMETIC:
71-
cosmeticFilters.push(filter);
72-
break;
73-
case filterTypes.NETWORK:
74-
networkFilters.push(filter);
75-
break;
76-
default:
77-
host.conversionResult.errors.push(
78-
`Filter not supported: '${filter}'`,
79-
);
80-
}
62+
for (const filter of filters) {
63+
const filterType = detectFilterType(filter);
64+
switch (filterType) {
65+
case 1: // NETWORK
66+
output.networkFilters.push(filter);
67+
break;
68+
case 2: // COSMETIC
69+
output.cosmeticFilters.push(filter);
70+
break;
71+
default:
72+
output.errors.push(
73+
`Filter not supported: '${filter}'`,
74+
);
8175
}
82-
host.conversionResult.isCosmeticConversionReady = true;
83-
console.warn('XXXX20')
84-
host.converter.contentWindow.postMessage(
85-
{
86-
action: 'convert',
87-
converter: 'adguard',
88-
filters: networkFilters,
89-
},
90-
'*',
91-
);
92-
},
76+
}
77+
78+
const { convert } = await host.converter;
79+
for (const networkFilter of output.networkFilters) {
80+
convert(networkFilter);
81+
}
82+
83+
return output;
9384
},
9485
converter: {
95-
get(host) {
96-
return host.querySelector('iframe');
86+
async get(host) {
87+
return new Promise(resolve => {
88+
const iframe = host.querySelector('iframe');
89+
const convert = (filter) => {
90+
iframe.contentWindow.postMessage(
91+
{
92+
action: 'convert',
93+
converter: 'adguard',
94+
filters: [filter],
95+
},
96+
'*',
97+
);
98+
};
99+
iframe.addEventListener('load', () => {
100+
resolve({ convert });
101+
});
102+
})
97103
},
98104
connect(host) {
99105
const onMessage = onConvertedRules.bind(null, host);
@@ -105,25 +111,15 @@ export default {
105111
};
106112
},
107113
},
108-
filters: {
109-
get() {
110-
const filters = localStorage.getItem('filters') || '';
111-
return filters;
112-
},
113-
set(_, value) {
114-
if (value === undefined) {
115-
return;
116-
}
117-
localStorage.setItem('filters', value);
118-
},
119-
},
120-
content: ({ filters, conversionResult, isEditing, conversion }) => html`
114+
content: ({ input, output }) => html`
121115
<template layout="column gap:3">
122116
<iframe
123117
layout="hidden"
124118
src="https://ghostery.github.io/urlfilter2dnr/"
125119
></iframe>
126-
<textarea rows="10" oninput="${onTextareaUpdate}">${filters}</textarea>
120+
${store.ready(input) && html`
121+
<textarea rows="10" oninput="${html.set(input, 'text')}">${input.text}</textarea>
122+
`}
127123
<div layout="row gap items:center">
128124
<ui-button
129125
size="small"
@@ -133,27 +129,24 @@ export default {
133129
>
134130
<button>Update</button>
135131
</ui-button>
136-
<section layout="row gap items:center">
137-
${isEditing
138-
? html`<span>Changes not saved</span>`
139-
: conversion &&
140-
html.resolve(
141-
conversion
142-
.then((value) => html`<div>${value}</div>`)
143-
.catch(
144-
() => html`
145-
<ul>
146-
${conversionResult.errors.map(
147-
(error) =>
148-
html`<li>
149-
<ui-text color="danger-500">${error}</ui-text>
150-
</li>`,
151-
)}
152-
</ul>
153-
`,
154-
),
155-
)}
156-
</section>
132+
${html.resolve(
133+
output.then(({ networkFilters, cosmeticFilters, errors }) => html`
134+
<section layout="row gap items:center">
135+
<ul>
136+
${errors.map(
137+
(error) =>
138+
html`<li>
139+
<ui-text color="danger-500">${error}</ui-text>
140+
</li>`,
141+
)}
142+
</ul>
143+
</section>
144+
<section layout="row gap items:center">
145+
Network filters: ${networkFilters.length}
146+
Cosmetic filters: ${cosmeticFilters.length}
147+
</section>
148+
`)
149+
)}
157150
</div>
158151
</template>
159152
`,

0 commit comments

Comments
 (0)