diff --git a/jsconfig.json b/jsconfig.json new file mode 100644 index 0000000..3a02644 --- /dev/null +++ b/jsconfig.json @@ -0,0 +1,8 @@ +{ + "compilerOptions": { + "baseUrl": ".", + "paths": { + "@/*": ["src/*"] + } + } +} \ No newline at end of file diff --git a/package.json b/package.json index 04f8a25..25b8c0a 100644 --- a/package.json +++ b/package.json @@ -52,7 +52,8 @@ "@vue/prettier" ], "rules": { - "no-console": 0 + "no-console": 0, + "no-unreachable": 0 }, "parserOptions": { "parser": "babel-eslint" diff --git a/src/components/app/MemberTemplate.vue b/src/components/app/MemberTemplate.vue index 27d9d51..7c768ce 100644 --- a/src/components/app/MemberTemplate.vue +++ b/src/components/app/MemberTemplate.vue @@ -14,7 +14,9 @@ :status="presense" />
-
{{ user.username }}
+
+ {{ user.username }} +
Owner
@@ -25,13 +27,16 @@ import ProfilePicture from "@/components/ProfilePictureTemplate"; import config from "@/config"; export default { components: { ProfilePicture }, - props: ["user", "avatar", "type"], + props: ["user", "avatar", "type", "member"], data() { return { hover: false }; }, computed: { + serverID() { + return this.$store.getters["servers/selectedServerID"]; + }, userAvatar() { return config.domain + "/avatars/" + this.avatar; }, @@ -43,6 +48,17 @@ export default { const presences = this.$store.getters["members/presences"]; const userPresense = presences[this.user.uniqueID]; return userPresense || 0; + }, + roleColor() { + if (!this.member || !this.member.roles) return undefined; + const roles = this.$store.getters["servers/roles"][this.serverID]; + if (!roles) return undefined; + + const filter = roles.filter(r => this.member.roles.includes(r.id)); + if (!filter.length) { + return null; + } + return filter[0].color; } }, methods: { @@ -53,7 +69,7 @@ export default { const x = event.clientX; const y = event.clientY; this.$store.dispatch("setServerMemberContext", { - serverID: this.$store.getters["servers/selectedServerID"], + serverID: this.serverID, uniqueID: this.user.uniqueID, x, y diff --git a/src/components/app/MembersList.vue b/src/components/app/MembersList.vue index 729c914..7dce5b6 100644 --- a/src/components/app/MembersList.vue +++ b/src/components/app/MembersList.vue @@ -13,6 +13,7 @@ :type="member.type" :avatar="member.member.avatar" :user="member.member" + :member="member" />
Offline ({{ offlineMembers.length }}) @@ -24,6 +25,7 @@ :type="member.type" :avatar="member.member.avatar" :user="member.member" + :member="member" />
diff --git a/src/components/app/MessageLogs.vue b/src/components/app/MessageLogs.vue index e326564..39b0b9b 100644 --- a/src/components/app/MessageLogs.vue +++ b/src/components/app/MessageLogs.vue @@ -35,6 +35,7 @@ :type="msg.type" :timeEdited="msg.timeEdited" :color="msg.color" + :isServer="isServer" /> @@ -287,6 +288,9 @@ export default { } }, computed: { + isServer() { + return this.$store.getters.currentTab === 2; + }, uploadQueue() { const allUploads = this.$store.getters.getAllUploads; const selectedChannelID = this.$store.getters.selectedChannelID; diff --git a/src/components/app/MessageTemplate.vue b/src/components/app/MessageTemplate.vue index cf0bc93..ef62857 100644 --- a/src/components/app/MessageTemplate.vue +++ b/src/components/app/MessageTemplate.vue @@ -25,7 +25,11 @@
- - - + + + +
@@ -36,6 +37,7 @@ import General from "./General.vue"; import DeleteServer from "./DeleteServer.vue"; import ManageChannels from "./ManageChannels.vue"; +import ManageRoles from "./ManageRoles.vue"; import ManageBans from "./ManageBans.vue"; import ServerVisibility from "./ServerVisibility.vue"; export default { @@ -44,14 +46,16 @@ export default { DeleteServer, ManageChannels, ServerVisibility, - ManageBans + ManageBans, + ManageRoles }, data() { return { index: 0, tabs: [ { title: "General", icon: "info" }, - { title: "Manage Channels", icon: "storage" }, + { title: "Channels", icon: "storage" }, + { title: "Roles", icon: "extension" }, // {title: "Manage Invites", icon: "local_post_office"}, { title: "Banned Members", icon: "lock" }, { title: "Server Visibility", icon: "visibility" }, diff --git a/src/services/ServerService.js b/src/services/ServerService.js index 2f87168..e0ccd08 100644 --- a/src/services/ServerService.js +++ b/src/services/ServerService.js @@ -68,5 +68,34 @@ export default { }, memberBans(serverID) { return wrapper(instance().get(`/servers/${serverID}/bans`)); + }, + + // roles + createRole(serverID, data) { + return wrapper(instance().post(`/servers/${serverID}/roles`, data)); + }, + // roles + deleteRole(serverID, roleID) { + return wrapper(instance().delete(`/servers/${serverID}/roles/${roleID}`)); + }, + // roles + updateRole(serverID, roleID, data) { + return wrapper( + instance().patch(`/servers/${serverID}/roles/${roleID}`, data) + ); + }, + applyRoleToMember(serverID, roleID, memberID) { + return wrapper( + instance().patch( + `/servers/${serverID}/members/${memberID}/roles/${roleID}` + ) + ); + }, + removeRoleFromMember(serverID, roleID, memberID) { + return wrapper( + instance().delete( + `/servers/${serverID}/members/${memberID}/roles/${roleID}` + ) + ); } }; diff --git a/src/store/modules/serversModule.js b/src/store/modules/serversModule.js index 021c62e..d6993ec 100644 --- a/src/store/modules/serversModule.js +++ b/src/store/modules/serversModule.js @@ -4,13 +4,17 @@ const state = { selectedServerID: null, servers: {}, channelsIDs: {}, - serverMembers: [] + serverMembers: [], + roles: {} }; const getters = { servers(state) { return state.servers; }, + roles(state) { + return state.roles; + }, channelsIDs(state) { return state.channelsIDs; }, @@ -45,6 +49,81 @@ const actions = { addServerMembers(context, serverMembersArr) { context.commit("ADD_SERVER_MEMBERS", serverMembersArr); }, + // Roles + addRole({ commit, state }, role) { + const serverRoles = [...state.roles[role.server_id]]; + serverRoles.push(role); + + commit("UPDATE_SERVER_ROLES", { + roles: serverRoles, + server_id: role.server_id + }); + }, + deleteRole({ commit, state }, { server_id, role_id }) { + const serverRoles = [...state.roles[server_id]].filter( + r => r.id !== role_id + ); + + commit("UPDATE_SERVER_ROLES", { + roles: serverRoles, + server_id: server_id + }); + }, + updateRole({ commit, state }, roleUpdates) { + const updatedRoles = state.roles[roleUpdates.server_id].map(r => { + if (r.id === roleUpdates.id) { + return Object.assign({}, r, roleUpdates); + } else { + return r; + } + }); + + commit("UPDATE_SERVER_ROLES", { + roles: updatedRoles, + server_id: roleUpdates.server_id + }); + }, + setAllRoles(context, rolesArr) { + context.commit("SET_ALL_ROLES", rolesArr); + }, + addMemberRole({ commit, state }, { role_id, uniqueID, server_id }) { + const serverMemberIndex = state.serverMembers.findIndex( + sm => sm.uniqueID === uniqueID && sm.server_id === server_id + ); + if (!serverMemberIndex) return; + + const serverMemberNew = { ...state.serverMembers[serverMemberIndex] }; + if (!serverMemberNew.roles) { + serverMemberNew.roles = [role_id]; + } else { + if (serverMemberNew.roles.includes(role_id)) { + return; + } + serverMemberNew.roles.push(role_id); + } + + commit("SET_MEMBER", { + serverMember: serverMemberNew, + index: serverMemberIndex + }); + }, + removeMemberRole({ commit, state }, { role_id, uniqueID, server_id }) { + const serverMemberIndex = state.serverMembers.findIndex( + sm => sm.uniqueID === uniqueID && sm.server_id === server_id + ); + if (!serverMemberIndex) return; + + let serverMemberNew = { ...state.serverMembers[serverMemberIndex] }; + if (!serverMemberNew.roles || !serverMemberNew.roles.includes(role_id)) + return; + + serverMemberNew.roles = serverMemberNew.roles.filter(r => r != role_id); + + commit("SET_MEMBER", { + serverMember: serverMemberNew, + index: serverMemberIndex + }); + }, removeServerMember(context, { uniqueID, server_id }) { context.commit("REMOVE_SERVER_MEMBER", { uniqueID, server_id }); }, @@ -99,6 +178,9 @@ const actions = { }; const mutations = { + SET_MEMBER(state, { serverMember, index }) { + Vue.set(state.serverMembers, index, serverMember); + }, SET_CHANNEL_IDs(state, { serverID, channelIDs }) { Vue.set(state.channelsIDs, serverID, channelIDs); }, @@ -142,6 +224,12 @@ const mutations = { if (exists) return; state.serverMembers.push(serverMember); }, + SET_ALL_ROLES(state, rolesArr) { + Vue.set(state, "roles", rolesArr); + }, + UPDATE_SERVER_ROLES(state, { roles, server_id }) { + Vue.set(state.roles, server_id, roles); + }, REMOVE_SERVER_MEMBER(state, { uniqueID, server_id }) { state.serverMembers = state.serverMembers.filter( m => m.uniqueID !== uniqueID || m.server_id !== server_id diff --git a/src/store/modules/socketIOModule.js b/src/store/modules/socketIOModule.js index 8b7d55a..f3a663e 100644 --- a/src/store/modules/socketIOModule.js +++ b/src/store/modules/socketIOModule.js @@ -26,6 +26,7 @@ const actions = { const { user, serverMembers, + serverRoles, dms, notifications, currentFriendStatus, @@ -55,26 +56,6 @@ const actions = { context.dispatch("members/addPresences", presence); context.dispatch("members/addMembers", memberObj); - - // const friendsArray = user.friends; - // const friendObject = {}; - - // // convert array into object and add online status. - // if(friendsArray !== undefined && friendsArray.length >=1) { - // for (let index = 0; index < friendsArray.length; index++) { - // const element = friendsArray[index]; - // if (element.recipient) { - // friendObject[element.recipient.uniqueID] = element; - // for (let currentFriendStatus of currentFriendStatus){ - // console.log(currentFriendStatus[0], currentFriendStatus[1]) - // if(currentFriendStatus[0] == element.recipient.uniqueID){ - // friendObject[element.recipient.uniqueID].recipient.status = currentFriendStatus[1] - // } - // } - // } - // } - // } - let servers = user.servers || []; if (settings.server_position) { @@ -158,6 +139,16 @@ const actions = { serverMembersArr.push(serverMember); membersObj[member.uniqueID] = member; } + const serverRolesSorted = {}; + for (let index = 0; index < serverRoles.length; index++) { + const role = serverRoles[index]; + if (!serverRolesSorted[role.server_id]) { + serverRolesSorted[role.server_id] = [role]; + } else { + serverRolesSorted[role.server_id].push(role); + } + } + context.dispatch("servers/setAllRoles", serverRolesSorted); context.dispatch("members/addMembers", membersObj); context.dispatch("servers/addServerMembers", serverMembersArr); @@ -490,6 +481,23 @@ const actions = { serverID, channelIDs: channel_position }); + }, + ["socket_server:createRole"](context, role) { + context.dispatch("servers/addRole", role); + }, + ["socket_server:updateRole"](context, updatedDetails) { + context.dispatch("servers/updateRole", updatedDetails); + }, + ["socket_server:deleteRole"](context, { role_id, server_id }) { + context.dispatch("servers/deleteRole", { role_id, server_id }); + }, + ["socket_serverMember:addRole"](context, { role_id, uniqueID, server_id }) { + context.dispatch("servers/addMemberRole", { role_id, uniqueID, server_id }); + }, + // eslint-disable-next-line prettier/prettier + ["socket_serverMember:removeRole"](context, { role_id, uniqueID, server_id }) { + // eslint-disable-next-line prettier/prettier + context.dispatch("servers/removeMemberRole", { role_id, uniqueID, server_id }); } }; diff --git a/src/utils/RolePermissions.js b/src/utils/RolePermissions.js new file mode 100644 index 0000000..8ec3d3e --- /dev/null +++ b/src/utils/RolePermissions.js @@ -0,0 +1,11 @@ +const permissions = { + ADMIN: { + name: "Admin", + value: 2 + }, + SEND_MESSAGE: { + name: "Send Message", + value: 2 + } +}; +export default permissions;