forked from jsnbuchanan/crowd-funder-for-time-pwa
feat: add a notification for changes to starred projects
This commit is contained in:
@@ -201,6 +201,22 @@ Raymer * @version 1.0.0 */
|
||||
projects
|
||||
</p>
|
||||
</div>
|
||||
<div
|
||||
v-if="numNewStarredProjectChanges"
|
||||
class="bg-gradient-to-b from-yellow-400 to-yellow-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] m-1 px-4 py-4 rounded-md text-white"
|
||||
>
|
||||
<span
|
||||
class="block text-center text-6xl"
|
||||
data-testId="newStarredProjectChangesActivityNumber"
|
||||
>
|
||||
{{ numNewStarredProjectChanges
|
||||
}}{{ newStarredProjectChangesHitLimit ? "+" : "" }}
|
||||
</span>
|
||||
<p class="text-center">
|
||||
starred project{{ numNewStarredProjectChanges === 1 ? "" : "s" }}
|
||||
with changes
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex justify-end mt-2">
|
||||
<button class="text-blue-500">View All New Activity For You</button>
|
||||
@@ -268,6 +284,7 @@ import {
|
||||
getHeaders,
|
||||
getNewOffersToUser,
|
||||
getNewOffersToUserProjects,
|
||||
getStarredProjectsWithChanges,
|
||||
getPlanFromCache,
|
||||
} from "../libs/endorserServer";
|
||||
import {
|
||||
@@ -283,6 +300,7 @@ import { createNotifyHelpers, TIMEOUTS } from "@/utils/notify";
|
||||
import { NOTIFY_CONTACT_LOADING_ISSUE } from "@/constants/notifications";
|
||||
import * as Package from "../../package.json";
|
||||
import { UNNAMED_ENTITY_NAME } from "@/constants/entities";
|
||||
import * as databaseUtil from "../db/databaseUtil";
|
||||
|
||||
// consolidate this with GiveActionClaim in src/interfaces/claims.ts
|
||||
interface Claim {
|
||||
@@ -395,10 +413,14 @@ export default class HomeView extends Vue {
|
||||
isRegistered = false;
|
||||
lastAckedOfferToUserJwtId?: string; // the last JWT ID for offer-to-user that they've acknowledged seeing
|
||||
lastAckedOfferToUserProjectsJwtId?: string; // the last JWT ID for offers-to-user's-projects that they've acknowledged seeing
|
||||
lastAckedStarredProjectChangesJwtId?: string; // the last JWT ID for starred project changes that they've acknowledged seeing
|
||||
newOffersToUserHitLimit: boolean = false;
|
||||
newOffersToUserProjectsHitLimit: boolean = false;
|
||||
newStarredProjectChangesHitLimit: boolean = false;
|
||||
numNewOffersToUser: number = 0; // number of new offers-to-user
|
||||
numNewOffersToUserProjects: number = 0; // number of new offers-to-user's-projects
|
||||
numNewStarredProjectChanges: number = 0; // number of new starred project changes
|
||||
starredProjectIds: Array<string> = []; // list of starred project IDs
|
||||
searchBoxes: Array<{
|
||||
name: string;
|
||||
bbox: BoundingBox;
|
||||
@@ -438,6 +460,7 @@ export default class HomeView extends Vue {
|
||||
// Registration check already handled in initializeIdentity()
|
||||
await this.loadFeedData();
|
||||
await this.loadNewOffers();
|
||||
await this.loadNewStarredProjectChanges();
|
||||
await this.checkOnboarding();
|
||||
} catch (err: unknown) {
|
||||
this.handleError(err);
|
||||
@@ -542,8 +565,14 @@ export default class HomeView extends Vue {
|
||||
this.lastAckedOfferToUserJwtId = settings.lastAckedOfferToUserJwtId;
|
||||
this.lastAckedOfferToUserProjectsJwtId =
|
||||
settings.lastAckedOfferToUserProjectsJwtId;
|
||||
this.lastAckedStarredProjectChangesJwtId =
|
||||
settings.lastAckedStarredProjectChangesJwtId;
|
||||
this.searchBoxes = settings.searchBoxes || [];
|
||||
this.showShortcutBvc = !!settings.showShortcutBvc;
|
||||
this.starredProjectIds = databaseUtil.parseJsonField(
|
||||
settings.starredProjectIds,
|
||||
[],
|
||||
);
|
||||
this.isAnyFeedFilterOn = checkIsAnyFeedFilterOn(settings);
|
||||
|
||||
// Check onboarding status
|
||||
@@ -675,6 +704,43 @@ export default class HomeView extends Vue {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads new changes for starred projects
|
||||
* Updates:
|
||||
* - Number of new starred project changes
|
||||
* - Rate limit status for starred project changes
|
||||
*
|
||||
* @internal
|
||||
* Called by mounted() and initializeIdentity()
|
||||
* @requires Active DID
|
||||
*/
|
||||
private async loadNewStarredProjectChanges() {
|
||||
if (this.activeDid && this.starredProjectIds.length > 0) {
|
||||
try {
|
||||
const starredProjectChanges = await getStarredProjectsWithChanges(
|
||||
this.axios,
|
||||
this.apiServer,
|
||||
this.activeDid,
|
||||
this.starredProjectIds,
|
||||
this.lastAckedStarredProjectChangesJwtId,
|
||||
);
|
||||
this.numNewStarredProjectChanges = starredProjectChanges.data.length;
|
||||
this.newStarredProjectChangesHitLimit = starredProjectChanges.hitLimit;
|
||||
} catch (error) {
|
||||
// Don't show errors for starred project changes as it's a secondary feature
|
||||
logger.warn(
|
||||
"[HomeView] Failed to load starred project changes:",
|
||||
error,
|
||||
);
|
||||
this.numNewStarredProjectChanges = 0;
|
||||
this.newStarredProjectChangesHitLimit = false;
|
||||
}
|
||||
} else {
|
||||
this.numNewStarredProjectChanges = 0;
|
||||
this.newStarredProjectChangesHitLimit = false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if user needs onboarding using ultra-concise mixin utilities
|
||||
* Opens onboarding dialog if not completed
|
||||
|
||||
Reference in New Issue
Block a user