docbrown/app/javascript/chat/util.js
Sarthak Sharma 90d60bf73f
[deploy] 🚀 Feature: Ability to search discoverable channels and send request to join (#7385)
* Feature 🚀 : Ability to delete messages in chat channels

- Sending message ID to frontend
- Deleting Message
- Use pusher to delete message realtime

* Minor Bug 🐞: Show message action only for current user

- User can delete or edit their own messages

* Test cases added

* Bug 🐞: Update message id for receiver

Message id was not sent to receiver by pusher

* Refactoring🛠: Message controller refactoring

* Test Cases📝 : Specs for Delete message added

* Feature 🚀 : Ability to edit messages

* Test Cases📝 : Specs for Edit message added

* added new column discoverable for public channel and changes in elasticsearch

* fix corrections

* changes in serializer file, added channel_discoverable

* added checkbox with discoverable policy

* changes in code for discoverable channels

* accept and reject member invitation by mod

* add joining request to closed groups

* fixed merge error

* changes in joining member to closed groups

* join to closed group

* changes in message action of joining

* changes in chat upopened json

* 🚀Feature : Ability to search Global Channels

* touch updated_at in after commit update

* 🚀Feature : Ability to send request to discoverable channel

* 🚀Feature : Ability to send request to discoverable channel

* created new route for joining closed channel

* 🚀 Success handle on joining request sent

* removed redundant code

* join_channel improvement, removed authorization for join channel

* list of joining requests

* added joining_request status channels on search list

* changes in mailer and query builder optimized

* 🛠 Adding filter for new Query

* added rspec for add membership method in controller

* rspec for sending join channel request

* invite join request channel list rspec

* test case for query builder discoverable

* viewable and discoverable channel list

* refactored logic for search channels

* 🚀 Check if Request already sent

* 🛠 Optimizing code and making channelButton Component

* 🛠 Optimizing codefor SVG problem

* 🛠 Optimized action.js

* changes in search controller query

* hot fix

* removed unwanted code

* 🛠  Fix the Channel Name problem

* 🛠  Optimizing code further for CodeClimate

* added new column discoverable for public channel and changes in elasticsearch

* fix corrections

* changes in serializer file, added channel_discoverable

* added checkbox with discoverable policy

* changes in code for discoverable channels

* accept and reject member invitation by mod

* add joining request to closed groups

* fixed merge error

* changes in joining member to closed groups

* join to closed group

* changes in message action of joining

* changes in chat upopened json

* touch updated_at in after commit update

* 🚀Feature : Ability to search Global Channels

* 🚀Feature : Ability to send request to discoverable channel

* 🚀Feature : Ability to send request to discoverable channel

* created new route for joining closed channel

* 🚀 Success handle on joining request sent

* removed redundant code

* join_channel improvement, removed authorization for join channel

* list of joining requests

* added joining_request status channels on search list

* changes in mailer and query builder optimized

* added rspec for add membership method in controller

* rspec for sending join channel request

* invite join request channel list rspec

* 🛠 Adding filter for new Query

* test case for query builder discoverable

* viewable and discoverable channel list

* refactored logic for search channels

* 🚀 Check if Request already sent

* 🛠 Optimizing code and making channelButton Component

* 🛠 Optimizing codefor SVG problem

* 🛠 Optimized action.js

* changes in search controller query

* hot fix

* 🛠  Fix the Channel Name problem

* 🛠  Fixing merge problem

* 🛠  Optimizing code further for CodeClimate

* updated UI for membership edit

* fixed test casses and fixed UI for chat_channel_edit

* 🛠napshots added

* test cases fixed

* 🛠 Test cases added for new component

* channel settings accesible only by mod

* 🛠 More Test cases added

* 🛠 Svg code optimized

* 🛠 Svg code optimized in videocontent

* optimized code for search query

* fix test case for query builder

* changes in joining closed channel logic

* refactored join channel

* redirect to edit channel after joining request

* changes in test case for redirect

* optimized code

* 🛠 Eslint bugs fixed

* test case fixed

* optimization

* olving channel repetition problem

* optimization of code for query builder

* changes in query builder

* test cases fixed

* 🛠 Handling reduntant data on frontend

* 🛠  Don't show data if no filter query

* 🛠 Optimized code for fixing bugs and code coverage

* 🛠  Optimizing code further for CodeClimate

Co-authored-by: Parasgr-code <paras.gaur@skynox.tech>
2020-05-11 09:29:15 -04:00

109 lines
3.1 KiB
JavaScript

import 'intersection-observer';
export function getCsrfToken() {
const element = document.querySelector(`meta[name='csrf-token']`);
return element !== null ? element.content : undefined;
}
const getWaitOnUserDataHandler = ({ resolve, reject, waitTime = 20 }) => {
let totalTimeWaiting = 0;
return function waitingOnUserData() {
if (totalTimeWaiting === 3000) {
reject(new Error("Couldn't find user data on page."));
return;
}
const csrfToken = getCsrfToken(document);
const { user } = document.body.dataset;
if (user && csrfToken !== undefined) {
const currentUser = JSON.parse(user);
resolve({ currentUser, csrfToken });
return;
}
totalTimeWaiting += waitTime;
setTimeout(waitingOnUserData, waitTime);
};
};
export const getCurrentUser = () => {
const { user } = document.body.dataset;
return JSON.parse(user);
};
export function getUserDataAndCsrfToken() {
return new Promise((resolve, reject) => {
getWaitOnUserDataHandler({ resolve, reject })();
});
}
export function scrollToBottom() {
const element = document.getElementById('messagelist');
element.scrollTop = element.scrollHeight;
}
export function setupObserver(callback) {
const sentinel = document.querySelector('#messagelist__sentinel');
const somethingObserver = new IntersectionObserver(callback, {
threshold: [0, 1],
});
somethingObserver.observe(sentinel);
}
export function hideMessages(messages, userId) {
const cleanedMessages = Object.keys(messages).reduce(
(accumulator, channelId) => {
const newMessages = messages[channelId].map((message) => {
if (message.user_id === userId) {
const messageClone = Object.assign({ type: 'hidden' }, message);
messageClone.message = '<message removed>';
messageClone.messageColor = 'lightgray';
return messageClone;
}
return message;
});
return { ...accumulator, [channelId]: newMessages };
},
{},
);
return cleanedMessages;
}
export function adjustTimestamp(timestamp) {
let time = new Date(timestamp);
const options = {
month: 'long',
day: 'numeric',
hour: 'numeric',
minute: 'numeric',
};
time = new Intl.DateTimeFormat('en-US', options).format(time);
return time;
}
export const channelSorter = (channels, currentUserId, filterQuery) => {
const activeChannels = channels.filter(
(channel) =>
channel.viewable_by === currentUserId && channel.status === 'active',
);
const joiningChannels = channels.filter(
(channel) => channel.status === 'joining_request',
);
const ChannelIds = [
[...new Set(activeChannels.map((x) => x.chat_channel_id))],
[...new Set(joiningChannels.map((x) => x.chat_channel_id))],
];
const discoverableChannels = channels
.filter(
(channel) =>
(channel.status === 'joining_request' && filterQuery) ||
(!ChannelIds[1].includes(channel.chat_channel_id) &&
channel.viewable_by !== currentUserId),
)
.filter((channel) => !ChannelIds[0].includes(channel.chat_channel_id));
return { activeChannels, discoverableChannels };
};