Skip to content

Commit 7bfd335

Browse files
Dave Connisbegedin
authored andcommitted
Add conversation-part-closed component (#1638)
Add conversation-part-closed component Rewrite existing conversation-part as conversation-part-comment
1 parent d542935 commit 7bfd335

File tree

8 files changed

+135
-16
lines changed

8 files changed

+135
-16
lines changed
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import Component from '@ember/component';
2+
import { inject as service } from '@ember/service';
3+
import { computed, get } from '@ember/object';
4+
import { alias } from '@ember/object/computed';
5+
6+
export default Component.extend({
7+
classNames: ['conversation-part', 'conversation-part--closed'],
8+
classNameBindings: ['isSelf:conversation-part--is-self'],
9+
10+
currentUser: service(),
11+
12+
author: null,
13+
closedAt: null,
14+
15+
user: alias('currentUser.user'),
16+
17+
isSelf: computed('author', 'user', function() {
18+
return get(this, 'author.id') === get(this, 'user.id');
19+
})
20+
});

app/components/conversations/conversation-part.js renamed to app/components/conversations/conversation-part-comment.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { alias } from '@ember/object/computed';
44
import { inject as service } from '@ember/service';
55

66
export default Component.extend({
7-
classNames: ['conversation-part'],
7+
classNames: ['conversation-part', 'conversation-part--comment'],
88
classNameBindings: ['isSelf:conversation-part--is-self'],
99

1010
author: null,
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<div class="coversation-part__message-wrapper">
2+
<div class="conversation-part__timestamps-wrapper">
3+
<div class="conversation-part__timestamps">
4+
<span data-test-closed-at>
5+
{{#if isSelf}}
6+
You closed this {{moment-from-now closedAt interval=60000}}
7+
{{else}}
8+
{{author.username}} closed this {{moment-from-now closedAt interval=60000}}
9+
{{/if}}
10+
</span>
11+
</div>
12+
</div>
13+
</div>

app/templates/components/conversations/conversation-part.hbs renamed to app/templates/components/conversations/conversation-part-comment.hbs

File renamed without changes.

app/templates/components/conversations/conversation-thread.hbs

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<div class="conversation-thread-inner">
22
<div class="conversation-thread__messages">
33
{{#if conversation.message.isLoaded}}
4-
{{conversations/conversation-part
4+
{{conversations/conversation-part-comment
55
author=conversation.message.author
66
body=conversation.message.body
77
readAt=conversation.message.readAt
@@ -10,12 +10,19 @@
1010
{{/if}}
1111
{{#each sortedConversationParts as |conversationPart|}}
1212
{{#if conversationPart.isLoaded}}
13-
{{conversations/conversation-part
14-
author=conversationPart.author
15-
body=conversationPart.body
16-
readAt=conversationPart.readAt
17-
sentAt=conversationPart.insertedAt
18-
}}
13+
{{#if (eq conversationPart.partType 'isClosed')}}
14+
{{conversation/conversation-part-closed
15+
author=conversationPart.author
16+
closedAt=conversationPart.insertedAt
17+
}}
18+
{{else}}
19+
{{conversations/conversation-part-comment
20+
author=conversationPart.author
21+
body=conversationPart.body
22+
readAt=conversationPart.readAt
23+
sentAt=conversationPart.insertedAt
24+
}}
25+
{{/if}}
1926
{{/if}}
2027
{{/each}}
2128
</div>
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
import { moduleForComponent, test } from 'ember-qunit';
2+
import hbs from 'htmlbars-inline-precompile';
3+
import { set } from '@ember/object';
4+
import PageObject from 'ember-cli-page-object';
5+
import component from 'code-corps-ember/tests/pages/components/conversations/conversation-part';
6+
import stubService from 'code-corps-ember/tests/helpers/stub-service';
7+
import moment from 'moment';
8+
9+
let page = PageObject.create(component);
10+
11+
function renderPage() {
12+
page.render(hbs`
13+
{{conversations/conversation-part-closed
14+
author=author
15+
closedAt=closedAt
16+
}}
17+
`);
18+
}
19+
20+
moduleForComponent('conversations/conversation-part-closed', 'Integration | Component | conversations/conversation part closed', {
21+
integration: true,
22+
beforeEach() {
23+
page.setContext(this);
24+
},
25+
afterEach() {
26+
page.removeContext();
27+
}
28+
});
29+
30+
test('if current user closes message, "You closed this" is rendered', function(assert) {
31+
assert.expect(1);
32+
33+
let user = {
34+
id: 1,
35+
username: 'testuser'
36+
};
37+
set(this, 'author', user);
38+
stubService(this, 'current-user', { user });
39+
40+
let twoMinutesAgo = moment().subtract(2, 'minutes');
41+
let twoMinutesAgoFriendly = twoMinutesAgo.from();
42+
set(this, 'closedAt', twoMinutesAgo);
43+
44+
renderPage();
45+
46+
let expectedText = `You closed this ${twoMinutesAgoFriendly}`;
47+
assert.equal(page.closedAt.text, expectedText, 'The closed at timestamp is rendered');
48+
});
49+
50+
test('if someone other than the current user closes the message, "Author.username closed this at" is rendered', function(assert) {
51+
assert.expect(1);
52+
53+
let user = {
54+
id: 1,
55+
username: 'currentuser'
56+
};
57+
stubService(this, 'current-user', { user });
58+
59+
let author = {
60+
id: 2,
61+
username: 'authoruser'
62+
};
63+
set(this, 'author', author);
64+
65+
let twoMinutesAgo = moment().subtract(2, 'minutes');
66+
let twoMinutesAgoFriendly = twoMinutesAgo.from();
67+
set(this, 'closedAt', twoMinutesAgo);
68+
69+
renderPage();
70+
71+
let expectedText = `${author.username} closed this ${twoMinutesAgoFriendly}`;
72+
assert.equal(page.closedAt.text, expectedText, 'The closed at timestamp is rendered');
73+
});

tests/integration/components/conversations/conversation-part-test.js renamed to tests/integration/components/conversations/conversation-part-comment-test.js

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,15 @@ let page = PageObject.create(component);
1616

1717
function renderPage() {
1818
page.render(hbs`
19-
{{conversations/conversation-part
19+
{{conversations/conversation-part-comment
2020
author=author
2121
body=body
2222
sentAt=sentAt
2323
}}
2424
`);
2525
}
2626

27-
moduleForComponent('conversations/conversation-part', 'Integration | Component | conversations/conversation part', {
27+
moduleForComponent('conversations/conversation-part-comment', 'Integration | Component | conversations/conversation part comment', {
2828
integration: true,
2929
beforeEach() {
3030
page.setContext(this);
@@ -53,7 +53,7 @@ test('it renders all the details', function(assert) {
5353

5454
assert.equal(page.body.text, body, 'The body renders in the chat bubble');
5555
assert.equal(page.sentAt.text, '2 days ago', 'The sent at timestamp renders');
56-
assert.notOk(page.sentByCurrentUser, 'Does not have the current user styles');
56+
assert.notOk(page.isByCurrentUser, 'Does not have the current user styles');
5757
assert.equal(page.photo.url, user.photoThumbUrl, 'The user photo renders');
5858
assertTooltipNotRendered(assert);
5959

@@ -82,7 +82,7 @@ test('when the current user did not send the message', function(assert) {
8282

8383
renderPage();
8484

85-
assert.notOk(page.sentByCurrentUser, 'Does not have the current user styles');
85+
assert.notOk(page.isByCurrentUser, 'Does not have the current user styles');
8686
});
8787

8888
test('when the current user sent the message', function(assert) {
@@ -93,5 +93,5 @@ test('when the current user sent the message', function(assert) {
9393

9494
renderPage();
9595

96-
assert.ok(page.sentByCurrentUser, 'Has the current user styles');
96+
assert.ok(page.isByCurrentUser, 'Has the current user styles');
9797
});

tests/pages/components/conversations/conversation-part.js

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,14 @@ export default {
1111
scope: '[data-test-body]'
1212
},
1313

14+
closedAt: {
15+
scope: '[data-test-closed-at]'
16+
},
17+
18+
isComment: hasClass('conversation-part--comment'),
19+
isClosed: hasClass('conversation-part--closed'),
20+
isByCurrentUser: hasClass('conversation-part--is-self'),
21+
1422
photo: {
1523
scope: '[data-test-target-photo]',
1624
url: attribute('src')
@@ -23,7 +31,5 @@ export default {
2331

2432
sentAt: {
2533
scope: '[data-test-sent-at]'
26-
},
27-
28-
sentByCurrentUser: hasClass('conversation-part--is-self')
34+
}
2935
};

0 commit comments

Comments
 (0)