Browse Source

Fix: notification init + safety checks

pull/142/head
Jose Olarte III 1 day ago
parent
commit
26e6b16e03
  1. 49
      src/components/GiftedDialog.vue

49
src/components/GiftedDialog.vue

@ -18,7 +18,7 @@
:to-project-id="toProjectId" :to-project-id="toProjectId"
:giver="giver" :giver="giver"
:receiver="receiver" :receiver="receiver"
:notify="notify" :notify="$notify"
@entity-selected="handleEntitySelected" @entity-selected="handleEntitySelected"
@cancel="cancel" @cancel="cancel"
/> />
@ -85,6 +85,16 @@ export default class GiftedDialog extends Vue {
$notify!: (notification: any, timeout?: number) => void; $notify!: (notification: any, timeout?: number) => void;
notify!: ReturnType<typeof createNotifyHelpers>; notify!: ReturnType<typeof createNotifyHelpers>;
/**
* Safe notification method that ensures notify helpers are available
*/
get safeNotify() {
if (!this.notify && this.$notify) {
this.notify = createNotifyHelpers(this.$notify);
}
return this.notify;
}
@Prop() fromProjectId = ""; @Prop() fromProjectId = "";
@Prop() toProjectId = ""; @Prop() toProjectId = "";
@Prop({ default: false }) showProjects = false; @Prop({ default: false }) showProjects = false;
@ -258,7 +268,7 @@ export default class GiftedDialog extends Vue {
} }
} catch (err: unknown) { } catch (err: unknown) {
logger.error("Error retrieving settings from database:", err); logger.error("Error retrieving settings from database:", err);
this.notify.error( this.safeNotify.error(
err instanceof Error err instanceof Error
? err.message ? err.message
: "There was an error retrieving your settings.", : "There was an error retrieving your settings.",
@ -307,18 +317,21 @@ export default class GiftedDialog extends Vue {
async confirm() { async confirm() {
if (!this.activeDid) { if (!this.activeDid) {
this.notify.error( this.safeNotify.error(
"You must select an identifier before you can record a give.", "You must select an identifier before you can record a give.",
TIMEOUTS.STANDARD, TIMEOUTS.STANDARD,
); );
return; return;
} }
if (parseFloat(this.amountInput) < 0) { if (parseFloat(this.amountInput) < 0) {
this.notify.error("You may not send a negative number.", TIMEOUTS.SHORT); this.safeNotify.error(
"You may not send a negative number.",
TIMEOUTS.SHORT,
);
return; return;
} }
if (!this.description && !parseFloat(this.amountInput)) { if (!this.description && !parseFloat(this.amountInput)) {
this.notify.error( this.safeNotify.error(
`You must enter a description or some number of ${ `You must enter a description or some number of ${
this.libsUtil.UNIT_LONG[this.unitCode] this.libsUtil.UNIT_LONG[this.unitCode]
}.`, }.`,
@ -329,7 +342,7 @@ export default class GiftedDialog extends Vue {
// Check for person conflict // Check for person conflict
if (this.hasPersonConflict) { if (this.hasPersonConflict) {
this.notify.error( this.safeNotify.error(
"You cannot select the same person as both giver and recipient.", "You cannot select the same person as both giver and recipient.",
TIMEOUTS.STANDARD, TIMEOUTS.STANDARD,
); );
@ -337,7 +350,7 @@ export default class GiftedDialog extends Vue {
} }
this.close(); this.close();
this.notify.toast("Recording the give...", undefined, TIMEOUTS.BRIEF); this.safeNotify.toast("Recording the give...", undefined, TIMEOUTS.BRIEF);
// this is asynchronous, but we don't need to wait for it to complete // this is asynchronous, but we don't need to wait for it to complete
await this.recordGive( await this.recordGive(
(this.giver?.did as string) || null, (this.giver?.did as string) || null,
@ -417,12 +430,12 @@ export default class GiftedDialog extends Vue {
if (!result.success) { if (!result.success) {
const errorMessage = this.getGiveCreationErrorMessage(result); const errorMessage = this.getGiveCreationErrorMessage(result);
logger.error("Error with give creation result:", result); logger.error("Error with give creation result:", result);
this.notify.error( this.safeNotify.error(
errorMessage || "There was an error creating the give.", errorMessage || "There was an error creating the give.",
TIMEOUTS.MODAL, TIMEOUTS.MODAL,
); );
} else { } else {
this.notify.success("That gift was recorded.", TIMEOUTS.VERY_LONG); this.safeNotify.success("That gift was recorded.", TIMEOUTS.VERY_LONG);
if (this.callbackOnSuccess) { if (this.callbackOnSuccess) {
this.callbackOnSuccess(amount); this.callbackOnSuccess(amount);
} }
@ -434,7 +447,7 @@ export default class GiftedDialog extends Vue {
error.userMessage || error.userMessage ||
serverMessageForUser(error) || serverMessageForUser(error) ||
"There was an error recording the give."; "There was an error recording the give.";
this.notify.error(errorMessage, TIMEOUTS.MODAL); this.safeNotify.error(errorMessage, TIMEOUTS.MODAL);
} }
} }
@ -454,7 +467,7 @@ export default class GiftedDialog extends Vue {
} }
explainData() { explainData() {
this.notify.info(libsUtil.PRIVACY_MESSAGE, TIMEOUTS.MODAL); this.safeNotify.info(libsUtil.PRIVACY_MESSAGE, TIMEOUTS.MODAL);
} }
selectGiver(contact?: Contact) { selectGiver(contact?: Contact) {
@ -494,7 +507,7 @@ export default class GiftedDialog extends Vue {
} }
} catch (error) { } catch (error) {
logger.error("Error loading projects:", error); logger.error("Error loading projects:", error);
this.notify.error("Failed to load projects", TIMEOUTS.STANDARD); this.safeNotify.error("Failed to load projects", TIMEOUTS.STANDARD);
} }
} }
@ -647,7 +660,17 @@ export default class GiftedDialog extends Vue {
} }
created() { created() {
this.notify = createNotifyHelpers(this.$notify); // Initialize notify helpers when component is created
if (this.$notify) {
this.notify = createNotifyHelpers(this.$notify);
}
}
mounted() {
// Ensure notify helpers are initialized if not already done
if (!this.notify && this.$notify) {
this.notify = createNotifyHelpers(this.$notify);
}
} }
} }
</script> </script>

Loading…
Cancel
Save