From df10208ed5dfbc823eb1979272903d74f02a898c Mon Sep 17 00:00:00 2001
From: Shin'ya Ueoka <ueokande@i-beam.org>
Date: Sat, 25 Nov 2017 14:59:03 +0900
Subject: blacklist form

---
 src/settings/components/form/blacklist-form.jsx  | 47 ++++++++++++++++++++++++
 src/settings/components/form/blacklist-form.scss |  9 +++++
 src/settings/components/index.jsx                | 29 +++++++++------
 src/shared/default-settings.js                   |  3 +-
 4 files changed, 75 insertions(+), 13 deletions(-)
 create mode 100644 src/settings/components/form/blacklist-form.jsx
 create mode 100644 src/settings/components/form/blacklist-form.scss

diff --git a/src/settings/components/form/blacklist-form.jsx b/src/settings/components/form/blacklist-form.jsx
new file mode 100644
index 0000000..83b54da
--- /dev/null
+++ b/src/settings/components/form/blacklist-form.jsx
@@ -0,0 +1,47 @@
+import './blacklist-form.scss';
+import DeleteButton from '../ui/delete-button';
+import { h, Component } from 'preact';
+
+class BlacklistForm extends Component {
+
+  render() {
+    let value = this.props.value;
+    if (!value) {
+      value = [];
+    }
+
+    return <div className='form-blacklist-form'>
+      {
+        value.map((url, index) => {
+          return <div key={index} className='form-blacklist-form-row'>
+            <input data-index={index} type='text' name='url'
+              className='column-url' value={url}
+              onChange={this.bindValue.bind(this)} />
+            <DeleteButton data-index={index} name='delete'
+              onClick={this.bindValue.bind(this)} />
+          </div>;
+        })
+      }
+    </div>;
+  }
+
+  bindValue(e) {
+    if (!this.props.onChange) {
+      return;
+    }
+
+    let name = e.target.name;
+    let index = e.target.getAttribute('data-index');
+    let next = this.props.value.slice();
+
+    if (name === 'url') {
+      next[index] = e.target.value;
+    } else if (name === 'delete') {
+      next.splice(index, 1);
+    }
+
+    this.props.onChange(next);
+  }
+}
+
+export default BlacklistForm;
diff --git a/src/settings/components/form/blacklist-form.scss b/src/settings/components/form/blacklist-form.scss
new file mode 100644
index 0000000..a230d0d
--- /dev/null
+++ b/src/settings/components/form/blacklist-form.scss
@@ -0,0 +1,9 @@
+.form-blacklist-form {
+  &-row {
+    display: flex;
+
+    .column-url {
+      flex: 1;
+    }
+  }
+}
diff --git a/src/settings/components/index.jsx b/src/settings/components/index.jsx
index e5b46ad..fb25df6 100644
--- a/src/settings/components/index.jsx
+++ b/src/settings/components/index.jsx
@@ -3,6 +3,7 @@ import { h, Component } from 'preact';
 import Input from './ui/input';
 import SearchEngineForm from './form/search-engine-form';
 import KeymapsForm from './form/keymaps-form';
+import BlacklistForm from './form/blacklist-form';
 import * as settingActions from 'settings/actions/setting';
 import * as validator from 'shared/validators/setting';
 
@@ -42,14 +43,21 @@ class SettingsComponent extends Component {
         <legend>Keybindings</legend>
         <KeymapsForm
           value={this.state.settings.form.keymaps}
-          onChange={this.bindKeymapsForm.bind(this)}
+          onChange={value => this.bindForm('keymaps', value)}
         />
       </fieldset>
       <fieldset>
         <legend>Search Engines</legend>
         <SearchEngineForm
           value={this.state.settings.form.search}
-          onChange={this.bindSearchForm.bind(this)}
+          onChange={value => this.bindForm('search', value)}
+        />
+      </fieldset>
+      <fieldset>
+        <legend>Blacklist</legend>
+        <BlacklistForm
+          value={this.state.settings.form.blacklist}
+          onChange={value => this.bindForm('blacklist', value)}
         />
       </fieldset>
     </div>;
@@ -110,16 +118,13 @@ class SettingsComponent extends Component {
     }
   }
 
-  bindSearchForm(value) {
-    let next = Object.assign({}, this.state);
-    next.settings.form.search = value;
-    this.setState(next);
-    this.context.store.dispatch(settingActions.save(next.settings));
-  }
-
-  bindKeymapsForm(value) {
-    let next = Object.assign({}, this.state);
-    next.settings.form.keymaps = value;
+  bindForm(name, value) {
+    let next = Object.assign({}, this.state, {
+      settings: Object.assign({}, this.state.settings, {
+        form: Object.assign({}, this.state.settings.form)
+      })
+    });
+    next.settings.form[name] = value;
     this.setState(next);
     this.context.store.dispatch(settingActions.save(next.settings));
   }
diff --git a/src/shared/default-settings.js b/src/shared/default-settings.js
index 6d2013b..218390b 100644
--- a/src/shared/default-settings.js
+++ b/src/shared/default-settings.js
@@ -125,6 +125,7 @@ export default {
         ['twitter', 'https,//twitter.com/search?q={}'],
         ['wikipedia', 'https,//en.wikipedia.org/w/index.php?search={}'],
       ]
-    }
+    },
+    'blacklist': [],
   }
 };
-- 
cgit v1.2.3