12
12
import { html , store } from 'hybrids' ;
13
13
import { detectFilterType } from '@cliqz/adblocker' ;
14
14
import convert from '../dnr-converter.js' ;
15
+ import { getDNRRules } from '/utils/custom-filters.js' ;
15
16
import CustomFiltersInput from '../store/custom-filters-input.js' ;
16
17
18
+ function parseFilters ( text = '' ) {
19
+ return text
20
+ . split ( '\n' )
21
+ . map ( ( f ) => f . trim ( ) )
22
+ . filter ( Boolean )
23
+ . reduce (
24
+ ( filters , filter ) => {
25
+ const filterType = detectFilterType ( filter ) ;
26
+ if ( filterType === 1 ) {
27
+ // NETWORK
28
+ filters . networkFilters . push ( filter ) ;
29
+ } else if ( filterType === 2 ) {
30
+ // COSMETIC
31
+ filters . cosmeticFilters . push ( filter ) ;
32
+ } else {
33
+ filters . errors . push ( `Filter not supported: '${ filter } '` ) ;
34
+ }
35
+ return filters ;
36
+ } ,
37
+ {
38
+ networkFilters : [ ] ,
39
+ cosmeticFilters : [ ] ,
40
+ errors : [ ] ,
41
+ } ,
42
+ ) ;
43
+ }
44
+
17
45
async function onSave ( host ) {
18
46
const { networkFilters, cosmeticFilters } = host . filters ;
19
- const output = {
20
- networkFilters,
21
- cosmeticFilters,
22
- dnrRules : [ ] ,
23
- } ;
47
+ const dnrRules = [ ] ;
24
48
const dnrErrors = [ ] ;
25
49
26
50
const results = await Promise . allSettled (
@@ -29,92 +53,34 @@ async function onSave(host) {
29
53
30
54
for ( const result of results ) {
31
55
dnrErrors . push ( ...result . value . errors ) ;
32
- output . dnrRules . push ( ...result . value . rules ) ;
56
+ dnrRules . push ( ...result . value . rules ) ;
33
57
}
34
58
35
59
host . dnrErrors = dnrErrors ;
36
60
37
61
if ( ! dnrErrors . length ) {
38
62
store . submit ( host . input ) ;
39
- host . output = output ;
63
+ host . dnrRules = await chrome . runtime . sendMessage ( {
64
+ action : 'custom-filters:update-dnr' ,
65
+ dnrRules,
66
+ } ) ;
40
67
}
41
68
}
42
69
43
70
export default {
44
71
input : store ( CustomFiltersInput , { draft : true } ) ,
45
- output : {
46
- get : async ( ) => {
47
- const {
48
- networkFilters = [ ] ,
49
- cosmeticFilters = [ ] ,
50
- dnrRules = [ ] ,
51
- } = ( await chrome . storage . local . get ( [ 'custom-filters-output' ] ) ) [
52
- 'custom-filters-output'
53
- ] || { } ;
54
-
55
- return {
56
- networkFilters,
57
- cosmeticFilters,
58
- dnrRules,
59
- } ;
72
+ dnrRules : {
73
+ value : undefined ,
74
+ connect : ( host , key ) => {
75
+ getDNRRules ( ) . then ( ( dnrRules ) => {
76
+ host [ key ] = dnrRules ;
77
+ } ) ;
60
78
} ,
61
- set : async (
62
- _ ,
63
- { networkFilters = [ ] , cosmeticFilters = [ ] , dnrRules = [ ] } = { } ,
64
- lastValue ,
65
- ) => {
66
- if ( lastValue ) {
67
- await chrome . storage . local . set ( {
68
- 'custom-filters-output' : {
69
- networkFilters,
70
- cosmeticFilters,
71
- dnrRules,
72
- } ,
73
- } ) ;
74
- }
75
- return {
76
- networkFilters,
77
- cosmeticFilters,
78
- dnrRules,
79
- } ;
80
- } ,
81
- } ,
82
- dnrErrors : { set : ( _ , values = [ ] ) => values } ,
83
- filters : ( host ) => {
84
- const networkFilters = [ ] ;
85
- const cosmeticFilters = [ ] ;
86
- const errors = [ ] ;
87
-
88
- let filters = [ ] ;
89
-
90
- if ( store . ready ( host . input ) ) {
91
- filters = host . input . text
92
- . split ( '\n' )
93
- . map ( ( f ) => f . trim ( ) )
94
- . filter ( Boolean ) ;
95
- }
96
-
97
- for ( const filter of filters ) {
98
- const filterType = detectFilterType ( filter ) ;
99
- switch ( filterType ) {
100
- case 1 : // NETWORK
101
- networkFilters . push ( filter ) ;
102
- break ;
103
- case 2 : // COSMETIC
104
- cosmeticFilters . push ( filter ) ;
105
- break ;
106
- default :
107
- errors . push ( `Filter not supported: '${ filter } '` ) ;
108
- }
109
- }
110
-
111
- return {
112
- networkFilters,
113
- cosmeticFilters,
114
- errors,
115
- } ;
116
79
} ,
117
- content : ( { input, filters, output, dnrErrors } ) => html `
80
+ filters : ( { input } ) => parseFilters ( store . ready ( input ) ? input . text : '' ) ,
81
+ dnrErrors : undefined ,
82
+ errors : ( { filters, dnrErrors = [ ] } ) => [ ...filters . errors , ...dnrErrors ] ,
83
+ content : ( { input, filters, dnrRules, errors } ) => html `
118
84
< template layout ="column gap:3 ">
119
85
${ store . ready ( input ) &&
120
86
html `
@@ -125,8 +91,8 @@ ${input.text}</textarea
125
91
< div layout ="row gap items:center ">
126
92
< ui-button
127
93
size ="small "
128
- type =${ filters . errors . length > 0 ? 'outline-error' : 'outline' }
129
- disabled =${ filters . errors . length > 0 || dnrErrors . length > 0 }
94
+ type =${ errors . length > 0 ? 'outline-error' : 'outline' }
95
+ disabled =${ errors . length > 0 }
130
96
onclick="${ onSave } "
131
97
layout="shrink:0"
132
98
>
@@ -136,7 +102,7 @@ ${input.text}</textarea
136
102
< section layout ="gap items:center ">
137
103
< h4 > Errors</ h4 >
138
104
< ul >
139
- ${ [ ... filters . errors , ... dnrErrors ] . map (
105
+ ${ errors . map (
140
106
( error ) =>
141
107
html `< li >
142
108
< ui-text color ="danger-500 "> ${ error } </ ui-text >
@@ -147,22 +113,16 @@ ${input.text}</textarea
147
113
< div > Network filters: ${ filters . networkFilters . length } </ div >
148
114
< div > Cosmetic filters: ${ filters . cosmeticFilters . length } </ div >
149
115
< div > Filter errors: ${ filters . errors . length } </ div >
150
- ${ html . resolve (
151
- output . then (
152
- ( { networkFilters, cosmeticFilters, dnrRules } ) =>
153
- html `
154
- < h4 > Output</ h4 >
155
- < div > Network filters: ${ networkFilters . length } </ div >
156
- < div > Cosmetic filters: ${ cosmeticFilters . length } </ div >
157
- < div > DNR rules: ${ dnrRules . length } </ div >
158
- < ul >
159
- ${ dnrRules . map (
160
- ( rule ) => html `< li > ${ JSON . stringify ( rule , null , 2 ) } </ li > ` ,
161
- ) }
162
- </ ul >
163
- ` ,
164
- ) ,
165
- ) }
116
+ ${ dnrRules &&
117
+ html `
118
+ < h4 > Output</ h4 >
119
+ < div > DNR rules: ${ dnrRules . length } </ div >
120
+ < ul >
121
+ ${ dnrRules . map (
122
+ ( rule ) => html `< li > ${ JSON . stringify ( rule , null , 2 ) } </ li > ` ,
123
+ ) }
124
+ </ ul >
125
+ ` } ,
166
126
</ section >
167
127
</ template >
168
128
` ,
0 commit comments