Files
crowd-funder-from-jason/src/components/UsageLimitsSection.vue
Matthew Raymer 216e245d60 Fix registration status reactivity in HomeView
Resolved issue where registration banner persisted despite successful API registration.
Root cause was loadSettings() being called after initializeIdentity(), overwriting
updated isRegistered value with stale database data.

Changes:
- Remove redundant loadSettings() call from mounted() lifecycle
- Add $nextTick() to force template re-render after registration updates
- Create isUserRegistered computed property for template reactivity
- Clean up debugging console.log statements for production readiness
- Simplify template logic to use standard v-if/v-else pattern

Registration banner now properly disappears when users are registered, and
"Record something given by:" section appears correctly. Fix maintains existing
functionality while ensuring proper Vue reactivity.
2025-07-18 05:10:28 +00:00

132 lines
4.1 KiB
Vue

<template>
<section
id="sectionUsageLimits"
class="bg-slate-100 rounded-md overflow-hidden px-4 py-4 mt-8 mb-8"
aria-labelledby="usageLimitsHeading"
>
<h2 id="usageLimitsHeading" class="mb-2 font-bold">Usage Limits</h2>
<!-- show spinner if loading limits -->
<div
v-if="loadingLimits"
class="text-center"
role="status"
aria-live="polite"
>
Checking&hellip;
<font-awesome
icon="spinner"
class="fa-spin"
aria-hidden="true"
></font-awesome>
</div>
<div class="mb-4 text-center">
{{ limitsMessage }}
</div>
<div v-if="endorserLimits">
<p class="text-sm">
You have done
<b
>{{ endorserLimits?.doneClaimsThisWeek ?? "?" }} claim{{
Number(endorserLimits?.doneClaimsThisWeek || 0) === 1 ? "" : "s"
}}</b
>
out of <b>{{ endorserLimits?.maxClaimsPerWeek ?? "?" }}</b> for this
week. Your claims counter resets at
<b class="whitespace-nowrap">{{
readableDate(endorserLimits?.nextWeekBeginDateTime)
}}</b>
</p>
<p class="mt-3 text-sm">
You have done
<b
>{{
endorserLimits?.doneRegistrationsThisMonth ?? "?"
}}
registration{{
Number(endorserLimits?.doneRegistrationsThisMonth || 0) === 1
? ""
: "s"
}}</b
>
out of
<b>{{ endorserLimits?.maxRegistrationsPerMonth ?? "?" }}</b> for this
this month.
<i>(You cannot register anyone on your first day.)</i>
Your registration counter resets at
<b class="whitespace-nowrap">
{{ readableDate(endorserLimits?.nextMonthBeginDateTime) }}
</b>
</p>
<p class="mt-3 text-sm">
You have uploaded
<b
>{{ imageLimits?.doneImagesThisWeek ?? "?" }} image{{
Number(imageLimits?.doneImagesThisWeek || 0) === 1 ? "" : "s"
}}</b
>
out of <b>{{ imageLimits?.maxImagesPerWeek ?? "?" }}</b> for this
week. Your image counter resets at
<b class="whitespace-nowrap">{{
readableDate(imageLimits?.nextWeekBeginDateTime || "")
}}</b>
</p>
</div>
<button
class="block w-full text-center text-md bg-gradient-to-b from-slate-400 to-slate-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white px-4 py-2 rounded-md mt-4"
@click="recheckLimits"
>
Recheck Limits
</button>
</section>
</template>
<script lang="ts">
import { Component, Vue, Prop, Emit } from "vue-facing-decorator";
import { FontAwesomeIcon } from '@fortawesome/vue-fontawesome';
@Component({
name: "UsageLimitsSection",
components: {
FontAwesome: FontAwesomeIcon
}
})
export default class UsageLimitsSection extends Vue {
@Prop({ required: true }) loadingLimits!: boolean;
@Prop({ required: true }) limitsMessage!: string;
@Prop({ required: false }) activeDid?: string;
@Prop({ required: false }) endorserLimits?: any;
@Prop({ required: false }) imageLimits?: any;
mounted() {
console.log('[DEBUG] UsageLimitsSection mounted');
console.log('[DEBUG] loadingLimits prop:', this.loadingLimits);
console.log('[DEBUG] limitsMessage prop:', this.limitsMessage);
console.log('[DEBUG] activeDid prop:', this.activeDid);
console.log('[DEBUG] endorserLimits prop:', this.endorserLimits);
console.log('[DEBUG] imageLimits prop:', this.imageLimits);
}
updated() {
console.log('[DEBUG] UsageLimitsSection updated');
console.log('[DEBUG] loadingLimits prop:', this.loadingLimits);
console.log('[DEBUG] limitsMessage prop:', this.limitsMessage);
console.log('[DEBUG] endorserLimits prop:', this.endorserLimits);
console.log('[DEBUG] imageLimits prop:', this.imageLimits);
}
readableDate(dateString: string | undefined): string {
if (!dateString) return "unknown";
try {
return new Date(dateString).toLocaleDateString();
} catch {
return "unknown";
}
}
@Emit("recheck-limits")
recheckLimits() {
console.log('[DEBUG] recheckLimits called');
}
}
</script>