@@ -9,8 +9,11 @@ import "./config.scss";
9
9
const sailStatus = document . getElementById ( "sail-status" ) ;
10
10
const sailAvailableStatus = document . getElementById ( "sail-available-status" ) ;
11
11
const approvedHostsEntries = document . getElementById ( "approved-hosts-entries" ) ;
12
+ const approvedHostsRemoveError = document . getElementById ( "approved-hosts-remove-error" ) ;
12
13
const approvedHostsAdd = document . getElementById ( "approved-hosts-add" ) ;
13
14
const approvedHostsAddInput = document . getElementById ( "approved-hosts-add-input" ) as HTMLInputElement ;
15
+ const approvedHostsBadInput = document . getElementById ( "approved-hosts-bad-input" ) ;
16
+ const approvedHostsError = document . getElementById ( "approved-hosts-error" ) ;
14
17
15
18
// Check if the native manifest is installed.
16
19
sailAvailable ( ) . then ( ( ) => {
@@ -30,29 +33,61 @@ sailAvailable().then(() => {
30
33
sailStatus . appendChild ( pre ) ;
31
34
} ) ;
32
35
33
- // Create event listener to add approved hosts.
36
+ // Create event listeners to add approved hosts.
34
37
approvedHostsAdd . addEventListener ( "click" , ( e : Event ) => {
35
38
e . preventDefault ( ) ;
36
- const host = approvedHostsAddInput . value . toLowerCase ( ) ;
37
- // TODO: validate here
39
+ submitApprovedHost ( ) ;
40
+ } ) ;
41
+ approvedHostsAddInput . addEventListener ( "keyup" , ( e : KeyboardEvent ) => {
42
+ if ( e . keyCode === 13 ) {
43
+ e . preventDefault ( ) ;
44
+ submitApprovedHost ( ) ;
45
+ }
46
+ } ) ;
47
+ let invalidInputTimeout : number = null ;
48
+ let errorTimeout : number = null ;
49
+ const submitApprovedHost = ( ) : Promise < void > => {
50
+ let host = approvedHostsAddInput . value . toLowerCase ( ) ;
38
51
if ( ! host ) {
39
52
return ;
40
53
}
41
- console . log ( host ) ;
42
54
43
- addApprovedHost ( host )
55
+ // Validation logic. Users can put in a full URL or a valid host and it
56
+ // should be parsed successfully.
57
+ const match = host . match ( / ^ \s * ( h t t p s ? : \/ \/ ) ? ( ( \. ? [ a - z \d _ - ] + ) + ) ( \/ .* ) ? \s * $ / ) ;
58
+ if ( ! match ) {
59
+ approvedHostsBadInput . style . display = "block" ;
60
+ clearTimeout ( invalidInputTimeout ) ;
61
+ invalidInputTimeout = setTimeout ( ( ) => {
62
+ approvedHostsBadInput . style . display = "none" ;
63
+ } , 5000 ) ;
64
+ return ;
65
+ }
66
+ host = match [ 2 ] ;
67
+
68
+ return addApprovedHost ( host )
44
69
. then ( ( ) => {
45
70
approvedHostsAddInput . value = "" ;
46
71
} )
47
72
. catch ( ( ex ) => {
48
- alert ( "Failed to add host to approved hosts list.\n\n" + ex . toString ( ) ) ;
73
+ console . error ( "Failed to add host to approved hosts list." , ex ) ;
74
+ approvedHostsRemoveError . style . display = "block" ;
75
+ clearTimeout ( errorTimeout ) ;
76
+ errorTimeout = setTimeout ( ( ) => {
77
+ approvedHostsError . style . display = "none" ;
78
+ } , 5000 ) ;
49
79
} )
50
80
. finally ( ( ) => {
51
- reloadApprovedHostsTable ( ) ;
81
+ reloadApprovedHostsTable ( )
82
+ . then ( ( hosts ) => console . log ( "Reloaded approved hosts." , hosts ) )
83
+ . catch ( ( ex ) => {
84
+ alert ( "Failed to reload approved hosts from extension storage.\n\n" + ex . toString ( ) ) ;
85
+ } ) ;
52
86
} ) ;
53
- } ) ;
87
+ } ;
54
88
55
89
// Handles click events for remove buttons in the approved hosts table.
90
+ let removeErrorTimeout : number = null ;
56
91
const removeBtnHandler = function ( e : Event ) {
57
92
e . preventDefault ( ) ;
58
93
const host = this . dataset . host ;
@@ -70,7 +105,12 @@ const removeBtnHandler = function (e: Event) {
70
105
return setApprovedHosts ( hosts ) ;
71
106
} )
72
107
. catch ( ( ex ) => {
73
- alert ( "Failed to remove host from approved hosts list.\n\n" + ex . toString ( ) ) ;
108
+ console . error ( "Failed to remove host from approved hosts list." , ex ) ;
109
+ approvedHostsRemoveError . style . display = "block" ;
110
+ clearTimeout ( removeErrorTimeout ) ;
111
+ removeErrorTimeout = setTimeout ( ( ) => {
112
+ approvedHostsRemoveError . style . display = "none" ;
113
+ } , 5000 ) ;
74
114
} )
75
115
. finally ( ( ) => {
76
116
reloadApprovedHostsTable ( )
0 commit comments