Skip to content

Commit

Permalink
fix: Keep user-actions parameters as observables (#6284)
Browse files Browse the repository at this point in the history
  • Loading branch information
AndyLnd committed Apr 3, 2019
1 parent 59a5202 commit db69df0
Show file tree
Hide file tree
Showing 4 changed files with 38 additions and 37 deletions.
2 changes: 1 addition & 1 deletion src/page/template/modal/user-modal.htm
Expand Up @@ -9,7 +9,7 @@
<panel-user-details params="participant: user"></panel-user-details>
<enriched-fields params="userId: user().id"></enriched-fields>
<user-actions
params="user: user(), actionsViewModel: actionsViewModel, onAction: onUserAction, isSelfActivated: userRepository.isActivatedAccount()"
params="user: user, actionsViewModel: actionsViewModel, onAction: onUserAction, isSelfActivated: userRepository.isActivatedAccount()"
></user-actions>
<!-- /ko -->
<!-- ko if: !user() && !userNotFound() -->
Expand Down
2 changes: 1 addition & 1 deletion src/page/template/panel/group-participant-user.htm
Expand Up @@ -16,7 +16,7 @@
</div>
<!-- /ko -->
<enriched-fields params="userId: selectedParticipant().id"></enriched-fields>
<user-actions params="user: selectedParticipant(), conversation: activeConversation(), actionsViewModel: actionsViewModel, onAction: onUserAction, isSelfActivated: userRepository.isActivatedAccount()"></user-actions>
<user-actions params="user: selectedParticipant, conversation: activeConversation, actionsViewModel: actionsViewModel, onAction: onUserAction, isSelfActivated: userRepository.isActivatedAccount()"></user-actions>
</div>
<!-- /ko -->
</div>
65 changes: 33 additions & 32 deletions src/script/components/panel/userActions.js
Expand Up @@ -37,17 +37,15 @@ export const Actions = {

ko.components.register('user-actions', {
template: '<panel-actions params="items: items()"></panel-actions>',
viewModel: function({user, conversation, actionsViewModel, onAction = () => {}, isSelfActivated}) {
user = ko.unwrap(user);
conversation = ko.unwrap(conversation);
viewModel: function({user, conversation = () => false, actionsViewModel, onAction = () => {}, isSelfActivated}) {
isSelfActivated = ko.unwrap(isSelfActivated);
const isMe = user.is_me;
const isNotMe = !isMe && isSelfActivated;
const isMe = ko.computed(() => user().is_me);
const isNotMe = ko.computed(() => !isMe() && isSelfActivated);

const allItems = [
{
// open self profile
condition: () => isMe,
condition: () => isMe(),
item: {
click: () => {
amplify.publish(z.event.WebApp.PREFERENCES.MANAGE_ACCOUNT);
Expand All @@ -62,33 +60,33 @@ ko.components.register('user-actions', {
// self leave conversation
condition: () => {
return (
isMe &&
isMe() &&
isSelfActivated &&
conversation &&
conversation.isGroup() &&
!conversation.removed_from_conversation()
conversation() &&
conversation().isGroup() &&
!conversation().removed_from_conversation()
);
},
item: {
click: () => actionsViewModel.leaveConversation(conversation).then(() => onAction(Actions.LEAVE)),
click: () => actionsViewModel.leaveConversation(conversation()).then(() => onAction(Actions.LEAVE)),
icon: 'leave-icon',
identifier: 'do-leave',
label: t('groupParticipantActionLeave'),
},
},
{
// open conversation
condition: () => isNotMe && (user.isConnected() || user.isTeamMember()),
condition: () => isNotMe() && (user().isConnected() || user().isTeamMember()),
item: {
click: () => actionsViewModel.open1to1Conversation(user).then(() => onAction(Actions.OPEN_CONVERSATION)),
click: () => actionsViewModel.open1to1Conversation(user()).then(() => onAction(Actions.OPEN_CONVERSATION)),
icon: 'message-icon',
identifier: 'go-conversation',
label: t('groupParticipantActionOpenConversation'),
},
},
{
// accept request
condition: () => isNotMe && user.isIncomingRequest(),
condition: () => isNotMe() && user().isIncomingRequest(),
item: {
click: () =>
actionsViewModel.acceptConnectionRequest(user, true).then(() => onAction(Actions.ACCEPT_REQUEST)),
Expand All @@ -99,19 +97,19 @@ ko.components.register('user-actions', {
},
{
//ignore request
condition: () => isNotMe && user.isIncomingRequest(),
condition: () => isNotMe() && user().isIncomingRequest(),
item: {
click: () => actionsViewModel.ignoreConnectionRequest(user).then(() => onAction(Actions.IGNORE_REQUEST)),
click: () => actionsViewModel.ignoreConnectionRequest(user()).then(() => onAction(Actions.IGNORE_REQUEST)),
icon: 'close-icon',
identifier: 'do-ignore-request',
label: t('groupParticipantActionIgnoreRequest'),
},
},
{
// cancel request
condition: () => isNotMe && user.isOutgoingRequest(),
condition: () => isNotMe() && user().isOutgoingRequest(),
item: {
click: () => actionsViewModel.cancelConnectionRequest(user).then(() => onAction(Actions.CANCEL_REQUEST)),
click: () => actionsViewModel.cancelConnectionRequest(user()).then(() => onAction(Actions.CANCEL_REQUEST)),
icon: 'undo-icon',
identifier: 'do-cancel-request',
label: t('groupParticipantActionCancelRequest'),
Expand All @@ -120,32 +118,32 @@ ko.components.register('user-actions', {
{
// send request
condition: () => {
const isNotConnectedUser = user.isCanceled() || user.isUnknown();
const canConnect = !user.isTeamMember() && !user.isTemporaryGuest();
return isNotMe && isNotConnectedUser && canConnect;
const isNotConnectedUser = user().isCanceled() || user().isUnknown();
const canConnect = !user().isTeamMember() && !user().isTemporaryGuest();
return isNotMe() && isNotConnectedUser && canConnect;
},
item: {
click: () => actionsViewModel.sendConnectionRequest(user).then(() => onAction(Actions.SEND_REQUEST)),
click: () => actionsViewModel.sendConnectionRequest(user()).then(() => onAction(Actions.SEND_REQUEST)),
icon: 'plus-icon',
identifier: 'do-send-request',
label: t('groupParticipantActionSendRequest'),
},
},
{
// block user
condition: () => isNotMe && (user.isConnected() || user.isRequest()),
condition: () => isNotMe() && (user().isConnected() || user().isRequest()),
item: {
click: () => actionsViewModel.blockUser(user).then(() => onAction(Actions.BLOCK)),
click: () => actionsViewModel.blockUser(user()).then(() => onAction(Actions.BLOCK)),
icon: 'block-icon',
identifier: 'do-block',
label: t('groupParticipantActionBlock'),
},
},
{
// unblock user
condition: () => isNotMe && user.isBlocked(),
condition: () => isNotMe() && user().isBlocked(),
item: {
click: () => actionsViewModel.unblockUser(user).then(() => onAction(Actions.UNBLOCK)),
click: () => actionsViewModel.unblockUser(user()).then(() => onAction(Actions.UNBLOCK)),
icon: 'block-icon',
identifier: 'do-unblock',
label: t('groupParticipantActionUnblock'),
Expand All @@ -155,22 +153,25 @@ ko.components.register('user-actions', {
// remove user from conversation
condition: () => {
return (
isNotMe &&
conversation &&
conversation.isActiveParticipant() &&
conversation.participating_user_ids().some(id => user.id === id) &&
isNotMe() &&
conversation() &&
conversation().isActiveParticipant() &&
conversation()
.participating_user_ids()
.some(id => user().id === id) &&
z.userPermission().canUpdateGroupParticipants()
);
},
item: {
click: () => actionsViewModel.removeFromConversation(conversation, user).then(() => onAction(Actions.REMOVE)),
click: () =>
actionsViewModel.removeFromConversation(conversation(), user()).then(() => onAction(Actions.REMOVE)),
icon: 'minus-icon',
identifier: 'do-remove',
label: t('groupParticipantActionRemove'),
},
},
];

this.items = ko.computed(() => (user ? allItems.filter(({condition}) => condition()).map(({item}) => item) : []));
this.items = ko.computed(() => (user() ? allItems.filter(({condition}) => condition()).map(({item}) => item) : []));
},
});
6 changes: 3 additions & 3 deletions test/unit_tests/components/panel/userActionsSpec.js
Expand Up @@ -36,7 +36,7 @@ describe('user-actions', () => {

const conversation = new Conversation();
spyOn(conversation, 'isGroup').and.returnValue(true);
return {conversation, isSelfActivated: true, user};
return {conversation: () => conversation, isSelfActivated: true, user: () => user};
},
testName: 'generates actions for self user profile',
},
Expand All @@ -46,7 +46,7 @@ describe('user-actions', () => {
const user = new User();
user.is_me = true;
const conversation = new Conversation();
return {conversation: conversation, isSelfActivated: false, user};
return {conversation: () => conversation, isSelfActivated: false, user: () => user};
},
testName: 'generates actions for self user profile when user is not activated',
},
Expand All @@ -57,7 +57,7 @@ describe('user-actions', () => {
const conversation = new Conversation();
user.connection().status(z.connection.ConnectionStatus.ACCEPTED);
spyOn(conversation, 'isGroup').and.returnValue(true);
return {conversation, isSelfActivated: true, user};
return {conversation: () => conversation, isSelfActivated: true, user: () => user};
},
testName: 'generates actions for another user profile to which I am connected',
},
Expand Down

0 comments on commit db69df0

Please sign in to comment.