diff --git a/packages/frontend/src/data/models/message/model.ts b/packages/frontend/src/data/models/message/model.ts index cc7ddcb0cd..4831f153c7 100644 --- a/packages/frontend/src/data/models/message/model.ts +++ b/packages/frontend/src/data/models/message/model.ts @@ -116,6 +116,13 @@ export default class Message extends Model { @attr() sendError?: string; + /** + * When a user comes online, they dispatch a bunch of pings to their contacts. + * If any of those contacts have queue messages (designated by this boolean) + * the messages will automatically be sent to the user who jest came online + * */ + @attr() queueForResend?: boolean; + @belongsTo('identity', { async: false }) sender?: Identity; // @belongsTo('message', { async: false, inverse: 'deliveryConfirmations' }) confirmationFor?: Message; diff --git a/packages/frontend/src/services/messages/auto-responder.ts b/packages/frontend/src/services/messages/auto-responder.ts index d4afd0902c..f3d4328113 100644 --- a/packages/frontend/src/services/messages/auto-responder.ts +++ b/packages/frontend/src/services/messages/auto-responder.ts @@ -1,9 +1,11 @@ import Service from '@ember/service'; import { service } from '@ember-decorators/service'; +import StoreService from 'ember-data/store'; import MessageDispatcher from 'emberclear/src/services/messages/dispatcher'; import MessageFactory from 'emberclear/src/services/messages/factory'; import Message from 'emberclear/src/data/models/message/model'; +import Identity from 'emberclear/src/data/models/identity/model'; /** * Nothing here should be blocking, as these responses should not matter @@ -14,6 +16,7 @@ import Message from 'emberclear/src/data/models/message/model'; export default class MessageAutoResponder extends Service { @service('messages/dispatcher') dispatcher!: MessageDispatcher; @service('messages/factory') factory!: MessageFactory; + @service store!: StoreService; async messageReceived(respondToMessage: Message) { const sender = await respondToMessage.sender; @@ -21,6 +24,17 @@ export default class MessageAutoResponder extends Service { this.dispatcher.sendToUser.perform(response, sender); } + + async cameOnline(identity: Identity) { + const pendingMessages = await this.store.query('message', { + queueForResend: true, + to: identity.uid, + }); + + pendingMessages.forEach((message: Message) => { + this.dispatcher.sendToUser.perform(message, identity); + }); + } } // DO NOT DELETE: this is how TypeScript knows how to look up your services. diff --git a/packages/frontend/src/services/messages/dispatcher.ts b/packages/frontend/src/services/messages/dispatcher.ts index 0604cb5b15..e9d3639391 100644 --- a/packages/frontend/src/services/messages/dispatcher.ts +++ b/packages/frontend/src/services/messages/dispatcher.ts @@ -33,7 +33,14 @@ export default class MessageDispatcher extends Service { this.sendTo(message, to); } + // there needs to be a polymorphic relationship in order for this to work + // sendMessage(message: Message) { + // return sendTo(message, message.to); + // } + async sendTo(message: Message, to: Identity | Channel) { + message.set('queueForResend', false); + if (to instanceof Identity) { if (to.id === 'me') return; diff --git a/packages/frontend/src/services/messages/handler/service.ts b/packages/frontend/src/services/messages/handler/service.ts index dc3f379b1d..b7183d8f19 100644 --- a/packages/frontend/src/services/messages/handler/service.ts +++ b/packages/frontend/src/services/messages/handler/service.ts @@ -110,6 +110,7 @@ export default class ReceivedMessageHandler extends Service { const sender = await this.findOrCreateSender(senderInfo); this.statusManager.markOnline(sender); + this.autoResponder.cameOnline(sender); const message = this.store.createRecord('message', { id, diff --git a/packages/frontend/src/services/toast.ts b/packages/frontend/src/services/toast.ts index a5b8d8950a..e079214b3b 100644 --- a/packages/frontend/src/services/toast.ts +++ b/packages/frontend/src/services/toast.ts @@ -32,7 +32,7 @@ export default class Toast extends Service { ...options, message: message || 'status', type: status, - cssClasses: `notification ${status} p-xs has-shadow height-tall`, + cssClasses: `notification ${status} is-${status} p-xs has-shadow height-tall`, }); } } diff --git a/packages/frontend/src/ui/components/chat-history/message/delivery-confirmations/component.ts b/packages/frontend/src/ui/components/chat-history/message/delivery-confirmations/component.ts index 5fee9f5983..40c5ab6e9d 100644 --- a/packages/frontend/src/ui/components/chat-history/message/delivery-confirmations/component.ts +++ b/packages/frontend/src/ui/components/chat-history/message/delivery-confirmations/component.ts @@ -77,4 +77,13 @@ export default class DeliveryConfirmation extends Component { yield message.destroyRecord(); } + + @dropTask + *resendAutomatically(this: DeliveryConfirmation) { + const { message } = this.args; + + message.set('queueForResend', true); + + yield message.save(); + } } diff --git a/packages/frontend/src/ui/components/chat-history/message/delivery-confirmations/template.hbs b/packages/frontend/src/ui/components/chat-history/message/delivery-confirmations/template.hbs index 5a82dade9f..0b3d15dd07 100644 --- a/packages/frontend/src/ui/components/chat-history/message/delivery-confirmations/template.hbs +++ b/packages/frontend/src/ui/components/chat-history/message/delivery-confirmations/template.hbs @@ -15,6 +15,14 @@ {{#if this.resend.isIdle}} {{t 'buttons.resend'}} {{/if}} + | + {{#if this.resendAutomatically.isIdle}} + {{#if @message.queueForResend}} + {{t 'models.message.autosendPending'}} + {{else}} + {{t 'buttons.resendAutomatically'}} + {{/if}} + {{/if}} {{fa-icon 'exclamation-circle'}} diff --git a/packages/frontend/translations/en-us.yaml b/packages/frontend/translations/en-us.yaml index 9e86eefb85..d185c5ab1f 100644 --- a/packages/frontend/translations/en-us.yaml +++ b/packages/frontend/translations/en-us.yaml @@ -27,6 +27,7 @@ connection: buttons: delete: delete resend: resend + resendAutomatically: resend automatically save: Save next: Next back: Back @@ -89,6 +90,7 @@ models: publicKey: Public Key message: + autosendPending: autosend pending errors: timeout: 'Sending timed out.'