mirror of
https://github.com/Ocelot-Social-Community/Ocelot-Social.git
synced 2025-12-13 07:46:06 +00:00
Merge branch 'master' into 6500-refactor-filter-menu
This commit is contained in:
commit
eb67ef0ec7
@ -9,10 +9,9 @@ function walkRecursive(data, fields, fieldName, callback, _key?) {
|
|||||||
if (!Array.isArray(fields)) {
|
if (!Array.isArray(fields)) {
|
||||||
throw new Error('please provide an fields array for the walkRecursive helper')
|
throw new Error('please provide an fields array for the walkRecursive helper')
|
||||||
}
|
}
|
||||||
if (data && typeof data === 'string' && fields.includes(_key)) {
|
const fieldDef = fields.find((f) => f.field === _key)
|
||||||
// well we found what we searched for, lets replace the value with our callback result
|
if (data && typeof data === 'string' && fieldDef) {
|
||||||
const key = _key.split('!')
|
if (!fieldDef.excludes?.includes(fieldName)) data = callback(data, _key)
|
||||||
if (key.length === 1 || key[1] !== fieldName) data = callback(data, key[0])
|
|
||||||
} else if (data && Array.isArray(data)) {
|
} else if (data && Array.isArray(data)) {
|
||||||
// go into the rabbit hole and dig through that array
|
// go into the rabbit hole and dig through that array
|
||||||
data.forEach((res, index) => {
|
data.forEach((res, index) => {
|
||||||
|
|||||||
@ -30,6 +30,7 @@ const standardSanitizeHtmlOptions = {
|
|||||||
'strike',
|
'strike',
|
||||||
'span',
|
'span',
|
||||||
'blockquote',
|
'blockquote',
|
||||||
|
'usertag',
|
||||||
],
|
],
|
||||||
allowedAttributes: {
|
allowedAttributes: {
|
||||||
a: ['href', 'class', 'target', 'data-*', 'contenteditable'],
|
a: ['href', 'class', 'target', 'data-*', 'contenteditable'],
|
||||||
|
|||||||
@ -3,11 +3,11 @@ import { cleanHtml } from '../middleware/helpers/cleanHtml'
|
|||||||
|
|
||||||
// exclamation mark separetes field names, that should not be sanitized
|
// exclamation mark separetes field names, that should not be sanitized
|
||||||
const fields = [
|
const fields = [
|
||||||
'content',
|
{ field: 'content', excludes: ['CreateMessage', 'Message'] },
|
||||||
'contentExcerpt',
|
{ field: 'contentExcerpt' },
|
||||||
'reasonDescription',
|
{ field: 'reasonDescription' },
|
||||||
'description!embed',
|
{ field: 'description', excludes: ['embed'] },
|
||||||
'descriptionExcerpt',
|
{ field: 'descriptionExcerpt' },
|
||||||
]
|
]
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
|
|||||||
@ -81,7 +81,7 @@ export default {
|
|||||||
createdAt: toString(datetime()),
|
createdAt: toString(datetime()),
|
||||||
id: apoc.create.uuid(),
|
id: apoc.create.uuid(),
|
||||||
indexId: CASE WHEN maxIndex IS NOT NULL THEN maxIndex + 1 ELSE 0 END,
|
indexId: CASE WHEN maxIndex IS NOT NULL THEN maxIndex + 1 ELSE 0 END,
|
||||||
content: $content,
|
content: LEFT($content,2000),
|
||||||
saved: true,
|
saved: true,
|
||||||
distributed: false,
|
distributed: false,
|
||||||
seen: false
|
seen: false
|
||||||
|
|||||||
@ -35,7 +35,7 @@
|
|||||||
|
|
||||||
<div slot="room-header-avatar">
|
<div slot="room-header-avatar">
|
||||||
<div
|
<div
|
||||||
v-if="selectedRoom && selectedRoom.avatar && selectedRoom.avatar !== 'default-avatar'"
|
v-if="selectedRoom && selectedRoom.avatar"
|
||||||
class="vac-avatar"
|
class="vac-avatar"
|
||||||
:style="{ 'background-image': `url('${selectedRoom.avatar}')` }"
|
:style="{ 'background-image': `url('${selectedRoom.avatar}')` }"
|
||||||
/>
|
/>
|
||||||
@ -46,7 +46,7 @@
|
|||||||
|
|
||||||
<div v-for="room in rooms" :slot="'room-list-avatar_' + room.id" :key="room.id">
|
<div v-for="room in rooms" :slot="'room-list-avatar_' + room.id" :key="room.id">
|
||||||
<div
|
<div
|
||||||
v-if="room.avatar && room.avatar !== 'default-avatar'"
|
v-if="room.avatar"
|
||||||
class="vac-avatar"
|
class="vac-avatar"
|
||||||
:style="{ 'background-image': `url('${room.avatar}')` }"
|
:style="{ 'background-image': `url('${room.avatar}')` }"
|
||||||
/>
|
/>
|
||||||
@ -222,9 +222,9 @@ export default {
|
|||||||
...mapMutations({
|
...mapMutations({
|
||||||
commitUnreadRoomCount: 'chat/UPDATE_ROOM_COUNT',
|
commitUnreadRoomCount: 'chat/UPDATE_ROOM_COUNT',
|
||||||
}),
|
}),
|
||||||
async fetchRooms({ room } = {}) {
|
async fetchRooms({ room, options = {} } = {}) {
|
||||||
this.roomsLoaded = false
|
this.roomsLoaded = options.refetch ? this.roomsLoaded : false
|
||||||
const offset = this.roomPage * this.roomPageSize
|
const offset = (options.refetch ? 0 : this.roomPage) * this.roomPageSize
|
||||||
try {
|
try {
|
||||||
const {
|
const {
|
||||||
data: { Room },
|
data: { Room },
|
||||||
@ -238,16 +238,25 @@ export default {
|
|||||||
fetchPolicy: 'no-cache',
|
fetchPolicy: 'no-cache',
|
||||||
})
|
})
|
||||||
|
|
||||||
const newRooms = Room.map((r) => {
|
const rms = []
|
||||||
return {
|
const rmsIds = []
|
||||||
|
;[...Room, ...this.rooms].forEach((r) => {
|
||||||
|
if (!rmsIds.find((v) => v === r.id)) {
|
||||||
|
rms.push({
|
||||||
...r,
|
...r,
|
||||||
|
index: r.lastMessage?.date,
|
||||||
|
lastMessage: {
|
||||||
|
...r.lastMessage,
|
||||||
|
content: r.lastMessage?.content.trim().substring(0, 30),
|
||||||
|
},
|
||||||
users: r.users.map((u) => {
|
users: r.users.map((u) => {
|
||||||
return { ...u, username: u.name, avatar: u.avatar?.url }
|
return { ...u, username: u.name, avatar: u.avatar?.url }
|
||||||
}),
|
}),
|
||||||
|
})
|
||||||
|
rmsIds.push(r.id)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
this.rooms = rms
|
||||||
this.rooms = [...this.rooms, ...newRooms]
|
|
||||||
|
|
||||||
if (Room.length < this.roomPageSize) {
|
if (Room.length < this.roomPageSize) {
|
||||||
this.roomsLoaded = true
|
this.roomsLoaded = true
|
||||||
@ -282,8 +291,14 @@ export default {
|
|||||||
fetchPolicy: 'no-cache',
|
fetchPolicy: 'no-cache',
|
||||||
})
|
})
|
||||||
|
|
||||||
const newMsgIds = Message.filter((m) => m.seen === false).map((m) => m.id)
|
const newMsgIds = Message.filter(
|
||||||
|
(m) => m.seen === false && m.senderId !== this.currentUser.id,
|
||||||
|
).map((m) => m.id)
|
||||||
if (newMsgIds.length) {
|
if (newMsgIds.length) {
|
||||||
|
const roomIndex = this.rooms.findIndex((r) => r.id === room.id)
|
||||||
|
const changedRoom = { ...this.rooms[roomIndex] }
|
||||||
|
changedRoom.unreadCount = changedRoom.unreadCount - newMsgIds.length
|
||||||
|
this.rooms[roomIndex] = changedRoom
|
||||||
this.$apollo
|
this.$apollo
|
||||||
.mutate({
|
.mutate({
|
||||||
mutation: markMessagesAsSeen(),
|
mutation: markMessagesAsSeen(),
|
||||||
@ -322,32 +337,36 @@ export default {
|
|||||||
},
|
},
|
||||||
|
|
||||||
async chatMessageAdded({ data }) {
|
async chatMessageAdded({ data }) {
|
||||||
|
const roomIndex = this.rooms.findIndex((r) => r.id === data.chatMessageAdded.room.id)
|
||||||
|
const changedRoom = { ...this.rooms[roomIndex] }
|
||||||
|
changedRoom.lastMessage = data.chatMessageAdded
|
||||||
|
changedRoom.lastMessage.content = changedRoom.lastMessage.content.trim().substring(0, 30)
|
||||||
|
changedRoom.lastMessageAt = data.chatMessageAdded.date
|
||||||
|
changedRoom.unreadCount++
|
||||||
|
this.rooms[roomIndex] = changedRoom
|
||||||
if (data.chatMessageAdded.room.id === this.selectedRoom?.id) {
|
if (data.chatMessageAdded.room.id === this.selectedRoom?.id) {
|
||||||
this.fetchMessages({ room: this.selectedRoom, options: { refetch: true } })
|
this.fetchMessages({ room: this.selectedRoom, options: { refetch: true } })
|
||||||
} else {
|
} else {
|
||||||
// TODO this might be optimized selectively (first page vs rest)
|
this.fetchRooms({ options: { refetch: true } })
|
||||||
this.rooms = []
|
|
||||||
this.roomPage = 0
|
|
||||||
this.roomsLoaded = false
|
|
||||||
this.fetchRooms()
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
async sendMessage(message) {
|
async sendMessage(message) {
|
||||||
// check for usersTag and change userid to username
|
|
||||||
message.usersTag.forEach((userTag) => {
|
|
||||||
const needle = `<usertag>${userTag.id}</usertag>`
|
|
||||||
const replacement = `<usertag>@${userTag.name.replaceAll(' ', '-').toLowerCase()}</usertag>`
|
|
||||||
message.content = message.content.replaceAll(needle, replacement)
|
|
||||||
})
|
|
||||||
try {
|
try {
|
||||||
await this.$apollo.mutate({
|
const {
|
||||||
|
data: { CreateMessage: createdMessage },
|
||||||
|
} = await this.$apollo.mutate({
|
||||||
mutation: createMessageMutation(),
|
mutation: createMessageMutation(),
|
||||||
variables: {
|
variables: {
|
||||||
roomId: message.roomId,
|
roomId: message.roomId,
|
||||||
content: message.content,
|
content: message.content,
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
const roomIndex = this.rooms.findIndex((r) => r.id === message.roomId)
|
||||||
|
const changedRoom = { ...this.rooms[roomIndex] }
|
||||||
|
changedRoom.lastMessage = createdMessage
|
||||||
|
changedRoom.lastMessage.content = changedRoom.lastMessage.content.trim().substring(0, 30)
|
||||||
|
this.rooms[roomIndex] = changedRoom
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
this.$toast.error(error.message)
|
this.$toast.error(error.message)
|
||||||
}
|
}
|
||||||
|
|||||||
@ -4,8 +4,23 @@ export const createMessageMutation = () => {
|
|||||||
return gql`
|
return gql`
|
||||||
mutation ($roomId: ID!, $content: String!) {
|
mutation ($roomId: ID!, $content: String!) {
|
||||||
CreateMessage(roomId: $roomId, content: $content) {
|
CreateMessage(roomId: $roomId, content: $content) {
|
||||||
|
#_id
|
||||||
id
|
id
|
||||||
|
indexId
|
||||||
content
|
content
|
||||||
|
senderId
|
||||||
|
author {
|
||||||
|
id
|
||||||
|
}
|
||||||
|
username
|
||||||
|
avatar
|
||||||
|
date
|
||||||
|
room {
|
||||||
|
id
|
||||||
|
}
|
||||||
|
saved
|
||||||
|
distributed
|
||||||
|
seen
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
`
|
`
|
||||||
@ -26,6 +41,9 @@ export const messageQuery = () => {
|
|||||||
username
|
username
|
||||||
avatar
|
avatar
|
||||||
date
|
date
|
||||||
|
room {
|
||||||
|
id
|
||||||
|
}
|
||||||
saved
|
saved
|
||||||
distributed
|
distributed
|
||||||
seen
|
seen
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user