9
9
* file, You can obtain one at http://mozilla.org/MPL/2.0
10
10
*/
11
11
12
- import { html } from 'hybrids' ;
12
+ import { html , store } from 'hybrids' ;
13
13
import { detectFilterType } from '@cliqz/adblocker' ;
14
14
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
-
37
15
function onConvertedRules ( host , event ) {
38
- console . warn ( 'XXXXXadsadas' , event . data ) ;
39
16
if ( ! event . data . rules || ! event . data . errors ) {
40
17
return ;
41
18
}
42
- host . conversionResult . isNetworkConversionReady = true ;
43
- host . conversionResult . errors . push ( 'asdsasadas' ) ;
19
+
20
+ console . log ( "DNR converstion" , event . data )
44
21
if ( event . data . errors . length > 0 ) {
45
- host . conversionResult . errors . push ( ...event . data . errors ) ;
22
+ // host.conversionResult.errors.push(...event.data.errors);
46
23
}
47
24
}
48
25
49
- function onTextareaUpdate ( host ) {
50
- host . isEditing = true ;
26
+ function updateCustomFilters ( host ) {
27
+ store . submit ( host . input ) ;
51
28
}
52
29
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
+
53
48
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 ) ;
63
54
64
- const networkFilters = [ ] ;
65
- const cosmeticFilters = [ ] ;
55
+ const output = {
56
+ networkFilters : [ ] ,
57
+ cosmeticFilters : [ ] ,
58
+ dnrRules : { } ,
59
+ errors : [ ] ,
60
+ } ;
66
61
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
+ ) ;
81
75
}
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 ;
93
84
} ,
94
85
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
+ } )
97
103
} ,
98
104
connect ( host ) {
99
105
const onMessage = onConvertedRules . bind ( null , host ) ;
@@ -105,25 +111,15 @@ export default {
105
111
} ;
106
112
} ,
107
113
} ,
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 `
121
115
< template layout ="column gap:3 ">
122
116
< iframe
123
117
layout ="hidden "
124
118
src ="https://ghostery.github.io/urlfilter2dnr/ "
125
119
> </ 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
+ ` }
127
123
< div layout ="row gap items:center ">
128
124
< ui-button
129
125
size ="small "
@@ -133,27 +129,24 @@ export default {
133
129
>
134
130
< button > Update</ button >
135
131
</ 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
+ ) }
157
150
</ div >
158
151
</ template >
159
152
` ,
0 commit comments