Skip to content

Commit c2647dd

Browse files
committed
refactor/Extract custom event creation to mixin
1 parent 93d1188 commit c2647dd

File tree

7 files changed

+43
-52
lines changed

7 files changed

+43
-52
lines changed

app/javascript/controllers/alert_controller.js

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,22 +8,15 @@ export default class extends Controller {
88
present(event) {
99
event.preventDefault();
1010
event.stopPropagation();
11-
console.log(this.urlValue)
11+
1212
axios.get(this.urlValue)
1313
.then(res => {
14-
console.log(res)
1514
document.body.insertAdjacentHTML('afterbegin', res.data);
1615
})
1716
.catch(console.error)
1817
}
1918

20-
close() {
21-
this.alertTarget.classList.add('hidden')
22-
this.bodyTarget.innerHTML = ''
23-
}
24-
2519
deleteSuccess(event) {
26-
console.log('e', event.currentTarget)
2720
const resourceId = event.currentTarget.dataset.resourceId
2821
const listItem = document.getElementById(resourceId)
2922

@@ -41,6 +34,10 @@ export default class extends Controller {
4134
this.close()
4235
}
4336

37+
close() {
38+
if (this.hasAlertTarget) { this.alertTarget.remove(); };
39+
}
40+
4441
get toast() {
4542
return document.getElementById('toast').toast
4643
}

app/javascript/controllers/cropper_controller.js

Lines changed: 10 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { Controller } from 'stimulus'
2+
import { events } from '../mixins/events'
23
import axios from 'axios';
34

45
export default class extends Controller {
@@ -11,11 +12,12 @@ export default class extends Controller {
1112
}
1213

1314
connect() {
15+
events(this)
16+
1417
this.populateCropper()
1518
}
1619

1720
populateCropper() {
18-
console.log(this.upload)
1921
this.imageTarget.setAttribute('src', this.upload.uploadedFile)
2022

2123
this.cropper = new Cropper(this.imageTarget, {
@@ -30,8 +32,6 @@ export default class extends Controller {
3032
});
3133

3234
canvas.toBlob(blob => {
33-
console.log('b', blob)
34-
3535
let formData = new FormData();
3636

3737
formData.append('user[avatar]', blob);
@@ -44,25 +44,20 @@ export default class extends Controller {
4444
data: formData
4545
})
4646
.then(function (response) {
47-
const event = new CustomEvent('update-image', { detail: { src: response.data.avatar_url } })
48-
window.dispatchEvent(event)
49-
50-
self.upload.avatarTarget.setAttribute('src', canvas.toDataURL())
51-
self.modal.close()
47+
self.upload.avatarTarget.setAttribute('src', canvas.toDataURL())
48+
49+
self.emitEvent('update-image', { src: response.data.avatar_url })
50+
self.emitEvent('close-modal')
5251
})
5352
.catch(function (response) {
54-
//handle error
55-
console.log(response);
56-
self.modal.close()
53+
//handle error
54+
console.log(response);
55+
self.emitEvent('close-modal')
5756
});
5857
})
5958
}
6059

6160
get upload() {
6261
return document.getElementById('upload').upload
6362
}
64-
65-
get modal() {
66-
return document.getElementById('modal').modal
67-
}
6863
}

app/javascript/controllers/modal_controller.js

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,11 @@ export default class extends Controller {
55
static targets = ["modal", "header", "body"];
66
static values = { url: String }
77

8-
initialize() {
8+
present(event) {
99
const csrfToken = document.querySelector("meta[name=csrf-token]").content
1010
axios.defaults.headers.common['X-CSRF-Token'] = csrfToken
11-
}
11+
axios.defaults.headers.common['Accept'] = 'application/xhtml+xml'
1212

13-
present(event) {
1413
event.preventDefault();
1514
event.stopPropagation();
1615

@@ -24,6 +23,6 @@ export default class extends Controller {
2423
}
2524

2625
close() {
27-
if (this.hasModalTarget) { this.modalTarget.remove() }
26+
if (this.hasModalTarget) { this.modalTarget.remove(); };
2827
}
2928
}

app/javascript/controllers/snippets_controller.js

Lines changed: 9 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { Controller } from 'stimulus';
2+
import { events } from "../mixins/events";
23
import axios from 'axios';
34

45
export default class extends Controller {
@@ -11,6 +12,8 @@ export default class extends Controller {
1112
}
1213

1314
connect() {
15+
events(this)
16+
1417
if (this.hasMoveButtonTarget) {
1518
this.moveButtonTarget.disabled = true
1619
}
@@ -24,11 +27,11 @@ export default class extends Controller {
2427

2528
onCreateSuccess(event) {
2629
const [data, status, xhr] = event.detail;
27-
const createEvent = new CustomEvent('snippet-created', { detail: data })
28-
window.dispatchEvent(createEvent)
30+
31+
this.emitEvent('snippet-created', data)
32+
this.emitEvent('close-modal');
2933

3034
this.toast.display('Your snippet was created!')
31-
this.emitModalClose();
3235
}
3336

3437
onCreateError(event) {
@@ -38,11 +41,10 @@ export default class extends Controller {
3841

3942
onUpdateSuccess(event) {
4043
const [data, status, xhr] = event.detail;
41-
const updateEvent = new CustomEvent('snippet-updated', { detail: data })
42-
window.dispatchEvent(updateEvent)
4344

45+
this.emitEvent('snippet-updated', data)
46+
this.emitEvent('close-modal');
4447
this.toast.display('Your snippet was updated!')
45-
this.emitModalClose();
4648
}
4749

4850
onUpdateError(event) {
@@ -112,19 +114,14 @@ export default class extends Controller {
112114
axios.post(this.confirmPath, { folder_id: this.selectedFolderId }, { headers: { 'accept': 'application/json' } })
113115
.then(res => {
114116
this.toast.display(res.data.message)
115-
this.emitModalClose();
117+
this.emitEvent('close-modal');
116118
})
117119
.catch(error => {
118120
console.error(error)
119121
this.toast.display('Unable to file snippet')
120122
})
121123
}
122124

123-
emitModalClose() {
124-
const event = new CustomEvent('close-modal')
125-
window.dispatchEvent(event)
126-
}
127-
128125
get url() {
129126
return this.data.get('url')
130127
}
@@ -137,10 +134,6 @@ export default class extends Controller {
137134
return this.data.get('originalFolderId')
138135
}
139136

140-
get modal() {
141-
return document.getElementById('modal').modal
142-
}
143-
144137
get toast() {
145138
return document.getElementById('toast').toast
146139
}
@@ -156,8 +149,4 @@ export default class extends Controller {
156149
set selectedFolderId(folderId) {
157150
return this.data.set('selectedFolderId', folderId)
158151
}
159-
160-
get modal() {
161-
return document.getElementById('modal').modal
162-
}
163152
}

app/javascript/controllers/upload_controller.js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
import { Controller } from 'stimulus'
2+
import { events } from '../mixins/events'
23

34
export default class extends Controller {
45
static targets = ['fileInput', 'avatar']
56

67
connect() {
8+
events(this)
9+
710
this.element[this.identifier] = this
811
}
912

@@ -22,9 +25,7 @@ export default class extends Controller {
2225

2326
reader.onload = function(e) {
2427
self.uploadedFile = e.target.result
25-
26-
const event = new CustomEvent('open-avatar-modal')
27-
window.dispatchEvent(event)
28+
self.emitEvent('open-avatar-modal')
2829
}
2930

3031
reader.readAsDataURL(input.files[0]);

app/javascript/event-bus.js

Lines changed: 0 additions & 2 deletions
This file was deleted.

app/javascript/mixins/events.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
export const events = controller => {
2+
3+
Object.assign(controller, {
4+
5+
emitEvent(name, data = undefined) {
6+
const event = new CustomEvent(name, { detail: data })
7+
window.dispatchEvent(event)
8+
}
9+
10+
});
11+
12+
}

0 commit comments

Comments
 (0)