Group edit mode visibility dropdown

This commit is contained in:
Natsumi
2024-11-15 14:02:07 +13:00
parent cb3078e73b
commit 5540acce2d
4 changed files with 104 additions and 44 deletions
+6 -2
View File
@@ -16935,7 +16935,9 @@ speechSynthesis.getVoices();
API.currentUserGroups.clear(); API.currentUserGroups.clear();
args.json.forEach((group) => { args.json.forEach((group) => {
var ref = API.applyGroup(group); var ref = API.applyGroup(group);
API.currentUserGroups.set(group.id, ref); if (!API.currentUserGroups.has(group.id)) {
API.currentUserGroups.set(group.id, ref);
}
}); });
this.saveCurrentUserGroups(); this.saveCurrentUserGroups();
} }
@@ -16982,7 +16984,9 @@ speechSynthesis.getVoices();
API.currentUserGroups.clear(); API.currentUserGroups.clear();
for (var group of args.json) { for (var group of args.json) {
var ref = API.applyGroup(group); var ref = API.applyGroup(group);
API.currentUserGroups.set(group.id, ref); if (!API.currentUserGroups.has(group.id)) {
API.currentUserGroups.set(group.id, ref);
}
} }
await API.getGroupPermissions({ userId: API.currentUser.id }); await API.getGroupPermissions({ userId: API.currentUser.id });
this.saveCurrentUserGroups(); this.saveCurrentUserGroups();
+62 -25
View File
@@ -32,10 +32,6 @@ export default class extends baseClass {
API.$on('GROUP', function (args) { API.$on('GROUP', function (args) {
args.ref = this.applyGroup(args.json); args.ref = this.applyGroup(args.json);
this.cachedGroups.set(args.ref.id, args.ref);
if (this.currentUserGroups.has(args.ref.id)) {
this.currentUserGroups.set(args.ref.id, args.ref);
}
}); });
API.$on('GROUP', function (args) { API.$on('GROUP', function (args) {
@@ -245,12 +241,6 @@ export default class extends baseClass {
$app.groupDialog.ref.isRepresenting = $app.groupDialog.ref.isRepresenting =
args.params.isRepresenting; args.params.isRepresenting;
} }
if (
$app.userDialog.visible &&
$app.userDialog.id === this.currentUser.id
) {
$app.getCurrentUserRepresentedGroup();
}
}); });
/** /**
@@ -1408,10 +1398,36 @@ export default class extends baseClass {
} }
} }
} }
if (json.myMember) {
if (typeof json.myMember.roleIds === 'undefined') {
// keep roleIds
json.myMember.roleIds = ref.myMember.roleIds;
}
Object.assign(ref.myMember, json.myMember);
}
Object.assign(ref, json); Object.assign(ref, json);
} }
// update myMember without fetching member
if (typeof json.memberVisibility !== 'undefined') {
ref.myMember.visibility = json.memberVisibility;
}
if (typeof json.isRepresenting !== 'undefined') {
ref.myMember.isRepresenting = json.isRepresenting;
}
if (typeof json.membershipStatus !== 'undefined') {
ref.myMember.membershipStatus = json.membershipStatus;
}
if (typeof json.roleIds !== 'undefined') {
ref.myMember.roleIds = json.roleIds;
}
ref.$url = `https://vrc.group/${ref.shortCode}.${ref.discriminator}`; ref.$url = `https://vrc.group/${ref.shortCode}.${ref.discriminator}`;
this.applyGroupLanguage(ref); this.applyGroupLanguage(ref);
var currentUserGroupRef = this.currentUserGroups.get(ref.id);
if (currentUserGroupRef && currentUserGroupRef !== ref) {
this.currentUserGroups.set(ref.id, ref);
}
return ref; return ref;
}; };
@@ -1430,6 +1446,28 @@ export default class extends baseClass {
} }
} }
} }
// update myMember without fetching member
if (json.userId === this.currentUser.id) {
var ref = this.cachedGroups.get(json.groupId);
if (typeof ref !== 'undefined') {
this.$emit('GROUP', {
json: {
...ref,
memberVisibility: json.visibility,
isRepresenting: json.isRepresenting,
isSubscribedToAnnouncements:
json.isSubscribedToAnnouncements,
joinedAt: json.joinedAt,
roleIds: json.roleIds,
membershipStatus: json.membershipStatus
},
params: {
groupId: json.groupId
}
});
}
}
return json; return json;
}; };
@@ -1999,7 +2037,7 @@ export default class extends baseClass {
API.cachedGroups.clear(); API.cachedGroups.clear();
API.currentUserGroups.clear(); API.currentUserGroups.clear();
for (var group of savedGroups) { for (var group of savedGroups) {
var ref = { var json = {
id: group.id, id: group.id,
name: group.name, name: group.name,
iconUrl: group.iconUrl, iconUrl: group.iconUrl,
@@ -2009,7 +2047,7 @@ export default class extends baseClass {
roleIds: group.roleIds roleIds: group.roleIds
} }
}; };
API.cachedGroups.set(group.id, ref); var ref = API.applyGroup(json);
API.currentUserGroups.set(group.id, ref); API.currentUserGroups.set(group.id, ref);
} }
@@ -2358,8 +2396,7 @@ export default class extends baseClass {
iconUrl: '' iconUrl: ''
}); });
API.getGroup({ groupId, includeRoles: true }).then((args) => { API.getGroup({ groupId, includeRoles: true }).then((args) => {
var ref = API.applyGroup(args.json); API.applyGroup(args.json); // make sure this runs before saveCurrentUserGroups
API.currentUserGroups.set(groupId, ref);
this.saveCurrentUserGroups(); this.saveCurrentUserGroups();
return args; return args;
}); });
@@ -3496,19 +3533,19 @@ export default class extends baseClass {
async addGroupMemberToSelection(userId) { async addGroupMemberToSelection(userId) {
var D = this.groupMemberModeration; var D = this.groupMemberModeration;
// fetch memeber if there is one // fetch member if there is one
// banned members don't have a user object // banned members don't have a user object
var memeber = {}; var member = {};
var memeberArgs = await API.getGroupMember({ var memberArgs = await API.getGroupMember({
groupId: D.id, groupId: D.id,
userId userId
}); });
if (memeberArgs.json) { if (memberArgs.json) {
memeber = API.applyGroupMember(memeberArgs.json); member = API.applyGroupMember(memberArgs.json);
} }
if (memeber.user) { if (member.user) {
D.selectedUsers.set(memeber.userId, memeber); D.selectedUsers.set(member.userId, member);
D.selectedUsersArray = Array.from(D.selectedUsers.values()); D.selectedUsersArray = Array.from(D.selectedUsers.values());
this.groupMemberModerationTableForceUpdate++; this.groupMemberModerationTableForceUpdate++;
return; return;
@@ -3517,11 +3554,11 @@ export default class extends baseClass {
var userArgs = await API.getCachedUser({ var userArgs = await API.getCachedUser({
userId userId
}); });
memeber.userId = userArgs.json.id; member.userId = userArgs.json.id;
memeber.user = userArgs.json; member.user = userArgs.json;
memeber.displayName = userArgs.json.displayName; member.displayName = userArgs.json.displayName;
D.selectedUsers.set(memeber.userId, memeber); D.selectedUsers.set(member.userId, member);
D.selectedUsersArray = Array.from(D.selectedUsers.values()); D.selectedUsersArray = Array.from(D.selectedUsers.values());
this.groupMemberModerationTableForceUpdate++; this.groupMemberModerationTableForceUpdate++;
} }
+11 -15
View File
@@ -466,7 +466,15 @@ export default class extends baseClass {
break; break;
case 'group-member-updated': case 'group-member-updated':
var groupId = content.member.groupId; var member = content.member;
if (!member) {
console.error(
'group-member-updated missing member',
content
);
break;
}
var groupId = member.groupId;
if ( if (
$app.groupDialog.visible && $app.groupDialog.visible &&
$app.groupDialog.id === groupId $app.groupDialog.id === groupId
@@ -474,24 +482,12 @@ export default class extends baseClass {
$app.getGroupDialogGroup(groupId); $app.getGroupDialogGroup(groupId);
} }
this.$emit('GROUP:MEMBER', { this.$emit('GROUP:MEMBER', {
json: content.member, json: member,
params: { params: {
groupId groupId
} }
}); });
console.log('group-member-updated', content); console.log('group-member-updated', member);
// content {
// groupId: string,
// id: string,
// isRepresenting: boolean,
// isSubscribedToAnnouncements: boolean,
// joinedAt: string,
// membershipStatus: string,
// roleIds: string[],
// userId: string,
// visibility: string
// }
break; break;
case 'instance-queue-joined': case 'instance-queue-joined':
+25 -2
View File
@@ -325,11 +325,34 @@ mixin userDialog()
span.extra span.extra
el-tooltip(v-if="group.isRepresenting" placement="top" :content="$t('dialog.group.members.representing')") el-tooltip(v-if="group.isRepresenting" placement="top" :content="$t('dialog.group.members.representing')")
i.el-icon-collection-tag(style="margin-right:5px") i.el-icon-collection-tag(style="margin-right:5px")
el-tooltip(v-if="group.memberVisibility !== 'visible'" placement="top") el-tooltip(v-if="group.myMember.visibility !== 'visible'" placement="top")
template(#content) template(#content)
span {{ $t('dialog.group.members.visibility') }} {{ group.memberVisibility }} span {{ $t('dialog.group.members.visibility') }} {{ group.myMember.visibility }}
i.el-icon-view(style="margin-right:5px") i.el-icon-view(style="margin-right:5px")
span ({{ group.memberCount }}) span ({{ group.memberCount }})
el-dropdown(@click.native.stop :disabled="group.privacy !== 'default'" trigger="click" size="small" style="margin-right:5px")
el-button(size="mini")
span(v-if="group.myMember.visibility === 'visible'") {{ $t('dialog.group.tags.visible') }}
span(v-else-if="group.myMember.visibility === 'friends'") {{ $t('dialog.group.tags.friends') }}
span(v-else-if="group.myMember.visibility === 'hidden'") {{ $t('dialog.group.tags.hidden') }}
span(v-else) {{ group.myMember.visibility }}
i.el-icon-arrow-down.el-icon--right(style="margin-left:5px")
el-dropdown-menu
el-dropdown-item(@click.native="setGroupVisibility(group.id, 'visible')") #[i.el-icon-check(v-if="group.myMember.visibility === 'visible'")] {{ $t('dialog.group.actions.visibility_everyone') }}
el-dropdown-item(@click.native="setGroupVisibility(group.id, 'friends')") #[i.el-icon-check(v-if="group.myMember.visibility === 'friends'")] {{ $t('dialog.group.actions.visibility_friends') }}
el-dropdown-item(@click.native="setGroupVisibility(group.id, 'hidden')") #[i.el-icon-check(v-if="group.myMember.visibility === 'hidden'")] {{ $t('dialog.group.actions.visibility_hidden') }}
//- JSON is missing isSubscribedToAnnouncements, can't be implemented
//- el-dropdown(@click.native.stop trigger="click" size="small" style="margin-right:5px")
//- el-tooltip(placement="top" :disabled="hideTooltips")
//- template(#content)
//- span(v-if="group.myMember.isSubscribedToAnnouncements") {{ $t('dialog.group.actions.unsubscribe') }}
//- span(v-else) {{ $t('dialog.group.actions.subscribe') }}
//- el-button(v-if="group.myMember.isSubscribedToAnnouncements" @click.stop="setGroupSubscription(group.id, false)" circle size="mini")
//- i.el-icon-chat-line-square
//- el-button(v-else circle @click.stop="setGroupSubscription(group.id, true)" size="mini")
//- i.el-icon-chat-square(style="color:#f56c6c")
el-tooltip(placement="right" :content="$t('dialog.user.groups.leave_group_tooltip')" :disabled="hideTooltips") el-tooltip(placement="right" :content="$t('dialog.user.groups.leave_group_tooltip')" :disabled="hideTooltips")
el-button(v-if="shiftHeld" @click.stop="leaveGroupPrompt(group.id)" size="mini" icon="el-icon-close" circle style="color:#f56c6c;margin-left:5px") el-button(v-if="shiftHeld" @click.stop="leaveGroupPrompt(group.id)" size="mini" icon="el-icon-close" circle style="color:#f56c6c;margin-left:5px")
el-button(v-else @click.stop="leaveGroupPrompt(group.id)" size="mini" icon="el-icon-delete" circle style="margin-left:5px") el-button(v-else @click.stop="leaveGroupPrompt(group.id)" size="mini" icon="el-icon-delete" circle style="margin-left:5px")