-
-
Notifications
You must be signed in to change notification settings - Fork 44
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Proposal to update distribution date #1643
Proposal to update distribution date #1643
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@taoeffect, seems ready for your review.
My apologies. I accidentally deleted the source branch of this PR, thinking it's an old working branch of mine while I was organising local branches in my laptop..! just restored it. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Looks good to me @Silver-IT, Great work!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Nicely done @Silver-IT, I haven't finished reviewing everything yet, but I left another preliminary review and did some testing.
I noticed a few issues during testing:
Issue 1: disabled menus
When u2
joins the group this is what his menu looks like for creating proposals:
It should look the same as on master
:
Issue 2: Can't change the distribution date again
I created a group today (Aug 29) and the distribution was set to Sept 1 initially (if I remember correctly). As u1
I changed it to be Aug 30th. Now I can no longer change it again:
I should be able to change it as many times as I want until the first period starts.
frontend/model/contracts/group.js
Outdated
if ('distributionDate' in data) { | ||
const period = dateToPeriodStamp(addTimeToDate(data.distributionDate, -getters.groupSettings.distributionPeriodLength)) | ||
Vue.set(state, 'paymentsByPeriod', { [period]: Object.values(getters.groupPeriodPayments)[0] }) | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm not sure about this code. Why is this here and what is it doing?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
If the distributionDate is changed by proposal, paymentsByPeriod
should be changed too because the keys of paymentsByPeriod
are the distribution dates.
Also we shouldn't initialize the paymentPeriod by calling initPaymentPeriod
function, because there could be users who have already entered their income details.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
OK, that doesn't make much sense because if the user entered their income details, that will not modify or affect the values in state.paymentsByPeriod
, instead it will affect their group profile.
What we should do instead is the following:
- First we need to make sure that we are only updating the distribution date if it is safe to update it. It is only safe to update the distribution date if
meta.createdDate
is before the current distribution date. So you need to first create anif
condition here to check for that. - Next, we can verify that there is only 1 group period currently in the
state.paymentsByPeriod
. - If so, we delete it / reset
state.paymentsByPeriod
to an empty object. - Next, we update the distribution date to the new distribution date. So
state.settings.distributionDate
is updated to the new date. - Finally, we call
initFetchPeriodPayments
exactly in the same way that it is called in theprocess
function for'gi.contracts/group'
This will ensure the exact same steps as happened in the group constructor are followed for resetting the distribution date, and that it is done safely only at the appropriate time.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@taoeffect, Please correct me, if I am wrong.
I think we should set haveNeedsSnapshot
using getters.haveNeedsForThisPeriod(period)
after calling initFetPeriodPayments
.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
if the user entered their income details, that will not modify or affect the values in state.paymentsByPeriod
I'm not 100% sure but I think the haveNeedSnapshot
field of the payment period object gets updated when users update their income details
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm not 100% sure but I think the
haveNeedSnapshot
field of the payment period object gets updated when users update their income details
That's true, but AFAICT that code is not affected by this code.
disabled () { | ||
return !this.groupShouldPropose && this.ourUsername !== this.groupSettings.groupCreator | ||
}, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why was this added?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
So we don't allow a group member to update voting rules when group has less than 3 members and he is not group creator.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
OK but this should be disabled at the menu item on the dashboard for bringing up the modal, not here, right?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Users can open the modal even though we disable the menu item.
They can copy the URL (e.g, http://localhost:8000/app/dashboard?rule=percentage&modal=ChangeVotingRules) and open it directly in the browser. So I thought we should check the permission inside the modal and should do one of the following two things.
- Close the modal
- Disable the submission
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Review ready!
frontend/model/contracts/group.js
Outdated
if ('distributionDate' in data) { | ||
const period = dateToPeriodStamp(addTimeToDate(data.distributionDate, -getters.groupSettings.distributionPeriodLength)) | ||
Vue.set(state, 'paymentsByPeriod', { [period]: Object.values(getters.groupPeriodPayments)[0] }) | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
OK, that doesn't make much sense because if the user entered their income details, that will not modify or affect the values in state.paymentsByPeriod
, instead it will affect their group profile.
What we should do instead is the following:
- First we need to make sure that we are only updating the distribution date if it is safe to update it. It is only safe to update the distribution date if
meta.createdDate
is before the current distribution date. So you need to first create anif
condition here to check for that. - Next, we can verify that there is only 1 group period currently in the
state.paymentsByPeriod
. - If so, we delete it / reset
state.paymentsByPeriod
to an empty object. - Next, we update the distribution date to the new distribution date. So
state.settings.distributionDate
is updated to the new date. - Finally, we call
initFetchPeriodPayments
exactly in the same way that it is called in theprocess
function for'gi.contracts/group'
This will ensure the exact same steps as happened in the group constructor are followed for resetting the distribution date, and that it is done safely only at the appropriate time.
disabled () { | ||
return !this.groupShouldPropose && this.ourUsername !== this.groupSettings.groupCreator | ||
}, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
OK but this should be disabled at the menu item on the dashboard for bringing up the modal, not here, right?
shouldPropose () { | ||
return this.groupShouldPropose && !this.skipToPropose | ||
}, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
What is this skipToPropose
thing?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
In the solution of the issue #1543, it describes that the group creator should not make propose to update distribution date before the first distribution started.
So an additional field is needed to make decision to propose or not for some proposals (Only DistributionDate for now, but not sure for later).
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Should we change the name then?
shouldImmediateUpdate
shouldNotPropose
- ...
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Oh, ok, yes, the name skipToPropose
is very confusing in English (skipProposal
would make more sense).
I would name this: applyChangesWithoutProposal
, EDIT: but it seems you've renamed it to shouldImmediateChange
which works too 👍
skipToProposeDistributionDate () { | ||
return !this.distributionStarted && this.ourUsername === this.groupSettings.groupCreator | ||
}, | ||
disabled () { | ||
return this.distributionStarted || (!this.groupShouldPropose && this.ourUsername !== this.groupSettings.groupCreator) | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is causing a DRY violation. We should disable bringing up the modal from the dropdown menu, not here.
disabled () { | ||
return !this.groupShouldPropose && this.ourUsername !== this.groupSettings.groupCreator | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Same issue here. Please revert related changes
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@Silver-IT ready!
frontend/model/contracts/group.js
Outdated
if ('distributionDate' in data) { | ||
Vue.set(state, 'paymentsByPeriod', {}) | ||
const curPeriodPayments = initFetchPeriodPayments({ contractID, meta, state, getters }) | ||
const period = Object.keys(getters.groupPeriodPayments)[0] | ||
curPeriodPayments.haveNeedsSnapshot = getters.haveNeedsForThisPeriod(period) | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@Silver-IT This is better, nice. 👍
A few things are missing here from the review though:
It is only safe to update the distribution date if
meta.createdDate
is before the current distribution date. So you need to first create anif
condition here to check for that.
And:
Next, we update the distribution date to the new distribution date. So
state.settings.distributionDate
is updated to the new date.
However, in the code above, the distribution date is always being updated. This is dangerous because as written this contract does not prevent the distribution date from being updated at any point in time. It must be updated only when conditions are correct (as mention the previous review). To fix this, I would move the entire if
condition before the loop on line 1091 and do something like this:
if ('distributionDate' in data) {
if (meta.createdDate < state.settings.distributionDate) {
// ...
} else {
delete data.distributionDate
}
}
Finally, sorry for not answering your question earlier about haveNeedsSnapshot
. As far as I can tell, that does not need to be updated because it is entirely unrelated to the distribution date. So lines 1098 and 1099 above should be deleted, and similarly, line 1097 can be rewritten so that initFetchPeriodPayments
is called without capturing its return value.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It is only safe to update the distribution date if meta.createdDate is before the current distribution date. So you need to first create an if condition here to check for that.
I think I did it in the validate
function.
else if ('distributionDate' in data &&
(getters.groupDistributionStarted(meta.createdDate) || Object.keys(getters.groupPeriodPayments).length > 1)) {
throw new TypeError(L('Can\'t change distribution date because distribution period has already started.'))
}
frontend/model/state.js
Outdated
const distributionDateInSettings = store.getters.groupSettings.distributionDate | ||
if (oldPeriod && newPeriod && (newPeriod !== distributionDateInSettings)) { | ||
const distributionStarted = reactiveDate.date > dateFromPeriodStamp(distributionDateInSettings) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm not convinced this is needed. What happens if this change is removed?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It's possible to update distributionDate before the distribution is started by calling gi.contracts/group/updateSettings
function. Once the distributionDate is updated before the distribution is started, this currentPaymentPeriod
watch also calls the gi.actions/group/updateDistributionDate
function again and sets a wrong distributionDate.
reactiveDate and this watch should be allowed to update distributionDate
only after the distribution is started.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Hmm, OK. One thing though, I think the comment is wrong. You could use store.getters.groupDistributionStarted(reactiveDate.date)
, it would be the same result. Can you make that change to DRY things?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Final review ready!
frontend/model/state.js
Outdated
const distributionDateInSettings = store.getters.groupSettings.distributionDate | ||
if (oldPeriod && newPeriod && (newPeriod !== distributionDateInSettings)) { | ||
const distributionStarted = reactiveDate.date > dateFromPeriodStamp(distributionDateInSettings) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Hmm, OK. One thing though, I think the comment is wrong. You could use store.getters.groupDistributionStarted(reactiveDate.date)
, it would be the same result. Can you make that change to DRY things?
{ | ||
type: 'item', | ||
id: 'change-to-percentage-base', | ||
name: 'Change to percentage base', |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
While we're boy-scoutting, three change requests:
- We forgot to wrap all of these in
L
functions, please update this line and the lines below for eachname
entry to wrap the string in anL
function and re-runstrings
- Also, can you change this specific string from
'Change to percentage base'
to:'Change voting threshold'
? - Also wrap using
L
function thename
for theheader
(e.g.'Voting Systems'
=>L('Voting Systems')
--- all user-facing strings must be localized
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Approved!! Great job @Silver-IT!! 😄 🎉
* Fix issues with chatroom, move some key logic into selectors * Rename selector to isWaitingForKeyShare * fix: update description for group channels * WIP - Fix manifest not found error upon contract file change (#1703) * Fix manifest not found error on contract file change * Mark the gruntfile as WIP * Remove WIP tag and code duplication * Fix Chat UI bugs (#1712) * fix: error of scrolling outside of the ChatMain section * feat: jump to the latest when resize window * feat: jump to the latest message without any delay when resize window * fix: auto scroll 25 times a second * File attachment to chat - 1st chunk (#1694) * add file attachment button to the chat input-area el * dnd mixin skeleton * remove trailing space * create the image preview vue component. * task 1-2. create a preview file component for a non-image attachment * build 'File too large' modal and pop it out when size is too large * add a compressed svg image for attachment / make sure it can be colored via css * add links for the drag&drop references * display overlay image when chat-area is dragged over * hook up DnD behavior with file-attachements method * resolving some of Greg's CR * another chunk of work for Greg's CR * work on Greg's CR / multiple file attachments * fix the test failure * make it possible to append attachments when drag&drop is performed * resolve the linter error * work on Greg's CR / fix the bug where dot is displayed * Add signedData, change message format * Re-add validation * Fix flow errors * Fix OP_ATOMIC handling * Harmonise types for signedData and encryptedData * Proposal to update distribution date (#1643) * feat: created a DistributionDate modal * chore: improve translation * feat: updated translation and added isInFirstDistributionPeriod * feat: completed the change distribution date workfloww * feat: restrict group members to change group settings * feat: improve updateSettings group action * feat: exception handler when open proposal modal directly * fix: error to close General Proposal modal * feat: improve DistributionDate proposal workflow * feat: proposal Item for distribution date * feat: simplified interactive message templates * feat: proposal to change distribution date * fix: cypress error with distribution updates * feat: resolved feedback from @sebin * feat: test case for changing distribution date * fix: travis error regarding distribution date * fix: disable submit button instead of close proposal modal * fix: groupDistributionStarted using Date * feat: simplified * fix: init scrollDistance when switch channel * fix: simplified payment periods config * fix: updated translation * chore: remove DRY issue and update translation * feat: localized texts for proposals * Implement inner signatures for OP_KEY_REQUEST * Inner signatures for actions * Add wrapper to encryptedData result * Fix flow errors * Fix rotate keys error when content is undefined * Fix JSON serialization issues for incoming encrypted data * Reintroduce toJSON, fix issue with () * Use additional data for encryption * Start adding user keys to group & chatrooms * Add direction attribute to GIMessage * Add comment * Simplified some of the code relating to GIMessage and signedData * Fixed reference to headJSON * Rudimentary support for inner signatures (missing permissions) * Various changes: * Light refactoring of `encryptedAction` to make it clearer - Actions to own own identity do not use inner signatures * Permission checking and enforcement for inner signatures - Now, permissions are checked in a uniform way in a central location * Add new `ourContactProfilesById` and `ourContactsById` getters * Changes for optinally encrypting OP_KEY_* * Fix key re-selection issue * Should not display archived proposals from other group (#1723) * feat: destructure archPropData * chore: reverted style changes * chore: changed variable name * chore: added comments * Create ci.yml * Rethrow uncaught Vue errors in dev mode or CI (#1708) * Rethrow uncaught Vue errors in dev mode or CI * Apply review * WIP: Use encrypted OP_KEY_* and new OP_KEY_REQUEST * Bugfixes * Merge PrivateDM and GroupDM (#1709) * feat: direct messages in identity contract * feat: add/remove getters * feat: simplified getters * wip: merging privateDMs and groupDMs * fix: coding issues * feat: UI updates for the DMs with more than 3 * fix: add member to dm * feat: changed base branch from e2e-protocol-ricardo to e2e-protocol * fix: error in get dm by usernames * chore: added comments * fix: error in function parameters declaration * fix: inconsistent naming of members when create a new DM * fix: redundant message rendering issue * feat: grun tpin * chore: removed wrong version of contracts * feat: grunt pin:0.1.8 * feat: added comments * chore: removed changes in chelonia * chore: added comments * chore: fix typo * feat: error handling * chore: removed unnecessary comment * feat: improved chatroom types and added comments * feat: simplified getter * chore: simplified * chore: added comments, error handling * feat: merged DMs from inside and outside of the group * feat: remove workflow regarding the dm visibility * Bugfixes for new OP_KEY_SHARE * feat: remove notifications when leave group (#1722) * Bugfixes * Improvements & bugfixes chelonia.js: Use regular signedOutgoingData when possible group.js: Fix name of selector * Bugfixes * Bugfixes for UI error handling. Move encryptedOutgoingData into /keyDel and /keyUpdate * Implement some PR feedback * Make KRS+KR atomic; disable deleting state when logging out * Fix flow issues * Mark contract as dirty until keys are received * Bugfix: call group join upon login * Add comments * Encrypted storage * chore: resolved conflicts * feat: giCreateGroup waits until the user joins the group * chore: fixed some errors * fix: error egarding Awesome button disability * Mark contract as dirty until keys are received * Bugfix: call group join upon login * Add comments * feat: group-chat-direct-message.spec.js test passed * Remove event listener when logging out * Use settings for key storage instead of SessionStorage * Refactoring: state encryption logic * Simplify check * Update references to session storage with app settings * Support variable distribution period length (#1691) * Fix Vue error in groupProposalSettings * Remove unused paymentTotalFromUserToUser getter * Add groupSortedPeriodKeys getter in group.js * Update getters to support variable period length * Add isIsoString in time.js and use it * Support variable period length in MonthOverview.vue * Apply review * Add periodStampsForDate in time.js * Add getHistoricalPaymentPeriods in PaymentMixin.js * Rename getSortedPeriodKeys to getAllSortedPeriodKeys * Add a few comments * Export new helpers from time.js * Improve validation in periodStampsForDate * Remove occurences of 'undefined' * Fix missing break statement * Fix wrong getter name in SupportHistory.vue * fixup! Improve validation in periodStampsForDate * Restore logging in Cypress * Fix reactivity issue in MonthOverview.vue * Fix data() in PaymentRowReceived/Sent.vue * Use groupDistributionStarted i/o inWaitingPeriod * Revert change in updateDistributionDate * Use humanStart/DueDate in MonthOverview.vue * Simplify PaymentDetail.vue/initializeDetails * Use mounted i/o watch in PaymentRowReceived/Sent.vue * Fix pedantic Flow error * Pin contracts to 0.1.8 * Move mounted() near the top * Revert humanDate to plain import in MonthOverview.vue * Use payment.period to fix Invalid Date errors * Add .start field in initPaymentPeriod * Add .end field in in-memory payment periods * Rename getPeriodPayment to getPaymentPeriod * Fix issue 1739 * Pin contracts * Add test for payment in 2nd period * Fix conditions for omitting empty key ops * EncryptedValue: ensure that it's a string * Refactor: logout handler * Convert password to passwordFn to prevent logging * Fix issue (key rotation / private channel not working after rejoin) * Update Style-Guide.md Added `User-facing Strings Guide` * Update Style-Guide.md typo * Update Style-Guide.md Improved translation section * Update Style-Guide.md * Update Style-Guide.md * Update Style-Guide.md * Fix: leaving private chat without being member * Update Style-Guide.md fix typos * Documentation * feat: updated test cases according to the updated invitation workflow * Update Style-Guide.md Consistent use of colons * #1742 Use 'submit-button' component for asynchronous actions (#1750) * add a todo comment for future <submit-button /> replacement * add submit-button component to various places * work on Greg's CR * #1704 - Add 'Export to CSV' feature to payments table (#1724) * add export CSV button to the table * create ExportPaymentsModal.vue and register it * make sure all the UI side of work are ready * complete CSV Extraction logic * complete the download CSV file logic * fix the linter error * work on Greg's feedback on the button position * make sure 'Export CSV' button is not overlapped regardless of the screen width * fix the linter error * put all-period option into the dropdown * remove the unecessary extra padding * DRY PaymentsMixin.js * update for Greg's CR on the PR * fix the broken translation o the modal title * restore package.json wtf... * Bugfixes * Add UI prompt to login and re-order buttons * Rename button names * Bugfix: null inner signing key when leaving chatroom * Add comments explaining the innerSigning attributes * Bugfix: race condition when joining due to skipActionProcessing * Change bad previous head log level to warn * Remove skipActionProcessing from respondToKeyRequests * wip: second half * feat: added profile-card in payments table * [e2e-protocol] Fix the welcome screen bug in /pending-approval page (#1748) * render welcome screen as position:fixed in /pending-approval page * make the selector higher priority * Fixed error to save scroll position (#1730) * feat: direct messages in identity contract * feat: add/remove getters * feat: simplified getters * wip: merging privateDMs and groupDMs * fix: coding issues * feat: UI updates for the DMs with more than 3 * fix: add member to dm * feat: changed base branch from e2e-protocol-ricardo to e2e-protocol * fix: error in get dm by usernames * chore: added comments * fix: error in function parameters declaration * fix: inconsistent naming of members when create a new DM * fix: redundant message rendering issue * feat: grun tpin * chore: removed wrong version of contracts * feat: grunt pin:0.1.8 * feat: added comments * chore: removed changes in chelonia * chore: added comments * chore: fix typo * feat: error handling * chore: removed unnecessary comment * feat: improved chatroom types and added comments * feat: simplified getter * chore: simplified * chore: added comments, error handling * fix: error to save scroll position * chore: removed allowDMInvite * Bugfix: key rotation on watched contracts * Fix message format for OP_KEY_SHARE * Rotate PEK when a group member leaves * Generic definition for the various DB stores * Revert changes to frontend/model/database.js and use the identity contract ID as key * Remove withEnv * fix: error regarding passwordFn * bug-fix for closing modal reacting too slowly * Handle encrypted and unencrypted invites (accounting) * fear: remove archived data when leave the group (#1747) * Add return * Improvements to respondToKeyRequests * fix: errors in cypress test * Make sync no-op for existing contracts * fix: cypress issues * fix: error after login * Listen for login event before calling postSubmit * Await in the login form, documentation * Updates to postSyncOps * Split up syncContractAndWatchKeys * Add chelonia/private/enqueuePostSyncOps to blacklist * Closure for storeSecretKeys to prevent logging secrets * Remove promiseAllSettled. Bugfixes. * Update okturtles.eventqueue * Side-effects without await * Fix invocation * Make sure we sync any identity contracts we haven't synced upon login (#1763) * feat: sync missing identity contracts after joining group * chore: remove IIFE * chore: resolved feedback * Remove await on /out in internals.js * Remove queueInvocation for /out events * Make cannot leave if not a member error into a warning * Show login error prompt only for errors related to the identity contract itself * Fix issue of removing two members (error on second removal) * Update identity.js login logic, remove spurious sideEffect check * pin contracts * Implement a way to set default groupId (#1773) * feat: set default group ID which is successfully joined * fix: recovered package.json * Fix inability to join after sharer signs out * Updated login error message (#1731) * feat: make login error message more informative * chore: added a line to log error * fix: error of Member Removal (#1764) * Fix infinite re-subscription due to foreign keys * Revert "Updated login error message (#1731)" This reverts commit cf4b7f4. * Updated login error message (#1731) * feat: make login error message more informative * chore: added a line to log error * Fix undefined in vmInvites * preSendCheck for outgoing messages; move hooks to publishEvent * Remove preSendCheckContract * Remove await from call to leaveAllChatRoomsUponLeaving --------- Co-authored-by: Ricardo Iván Vieitez Parra <[email protected]> Co-authored-by: Greg Slepak <[email protected]> Co-authored-by: snowteamer <[email protected]> Co-authored-by: Sebin Song <[email protected]>
Summary of Changes
Jump to latest message
button should be invisible #1710