fluxer/fluxer_app/src/stores/NagbarStore.tsx
2026-02-17 12:22:36 +00:00

385 lines
11 KiB
TypeScript

/*
* Copyright (C) 2026 Fluxer Contributors
*
* This file is part of Fluxer.
*
* Fluxer is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Fluxer is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with Fluxer. If not, see <https://www.gnu.org/licenses/>.
*/
import {makePersistent} from '@app/lib/MobXPersistence';
import {makeAutoObservable} from 'mobx';
export interface NagbarSettings {
iosInstallDismissed: boolean;
pwaInstallDismissed: boolean;
pushNotificationDismissed: boolean;
desktopNotificationDismissed: boolean;
premiumGracePeriodDismissed: boolean;
premiumExpiredDismissed: boolean;
premiumOnboardingDismissed: boolean;
giftInventoryDismissed: boolean;
desktopDownloadDismissed: boolean;
mobileDownloadDismissed: boolean;
pendingBulkDeletionDismissed: Record<string, boolean>;
invitesDisabledDismissed: Record<string, boolean>;
guildMembershipCtaDismissed: boolean;
visionaryMfaDismissed: boolean;
claimAccountModalShownThisSession: boolean;
forceOffline: boolean;
forceEmailVerification: boolean;
forceIOSInstall: boolean;
forcePWAInstall: boolean;
forcePushNotification: boolean;
forceUnclaimedAccount: boolean;
forceDesktopNotification: boolean;
forceInvitesDisabled: boolean;
forcePremiumGracePeriod: boolean;
forcePremiumExpired: boolean;
forcePremiumOnboarding: boolean;
forceGiftInventory: boolean;
forceUpdateAvailable: boolean;
forceDesktopDownload: boolean;
forceMobileDownload: boolean;
forceGuildMembershipCta: boolean;
forceVisionaryMfa: boolean;
forceHideOffline: boolean;
forceHideEmailVerification: boolean;
forceHideIOSInstall: boolean;
forceHidePWAInstall: boolean;
forceHidePushNotification: boolean;
forceHideUnclaimedAccount: boolean;
forceHideDesktopNotification: boolean;
forceHideInvitesDisabled: boolean;
forceHidePremiumGracePeriod: boolean;
forceHidePremiumExpired: boolean;
forceHidePremiumOnboarding: boolean;
forceHideGiftInventory: boolean;
forceHideUpdateAvailable: boolean;
forceHideDesktopDownload: boolean;
forceHideMobileDownload: boolean;
forceHideGuildMembershipCta: boolean;
forceHideVisionaryMfa: boolean;
}
export type NagbarToggleKey = Exclude<
keyof NagbarSettings,
'invitesDisabledDismissed' | 'claimAccountModalShownThisSession' | 'pendingBulkDeletionDismissed'
>;
export class NagbarStore implements NagbarSettings {
iosInstallDismissed = false;
pwaInstallDismissed = false;
pushNotificationDismissed = false;
desktopNotificationDismissed = false;
premiumGracePeriodDismissed = false;
premiumExpiredDismissed = false;
premiumOnboardingDismissed = false;
giftInventoryDismissed = false;
desktopDownloadDismissed = false;
mobileDownloadDismissed = false;
pendingBulkDeletionDismissed: Record<string, boolean> = {};
invitesDisabledDismissed: Record<string, boolean> = {};
guildMembershipCtaDismissed = false;
visionaryMfaDismissed = false;
claimAccountModalShownThisSession = false;
forceOffline = false;
forceEmailVerification = false;
forceIOSInstall = false;
forcePWAInstall = false;
forcePushNotification = false;
forceUnclaimedAccount = false;
forceDesktopNotification = false;
forceInvitesDisabled = false;
forcePremiumGracePeriod = false;
forcePremiumExpired = false;
forcePremiumOnboarding = false;
forceGiftInventory = false;
forceUpdateAvailable = false;
forceDesktopDownload = false;
forceMobileDownload = false;
forceGuildMembershipCta = false;
forceVisionaryMfa = false;
forceHideOffline = false;
forceHideEmailVerification = false;
forceHideIOSInstall = false;
forceHidePWAInstall = false;
forceHidePushNotification = false;
forceHideUnclaimedAccount = false;
forceHideDesktopNotification = false;
forceHideInvitesDisabled = false;
forceHidePremiumGracePeriod = false;
forceHidePremiumExpired = false;
forceHidePremiumOnboarding = false;
forceHideGiftInventory = false;
forceHideUpdateAvailable = false;
forceHideDesktopDownload = false;
forceHideMobileDownload = false;
forceHideGuildMembershipCta = false;
forceHideVisionaryMfa = false;
constructor() {
makeAutoObservable(this, {}, {autoBind: true});
this.initPersistence();
}
private async initPersistence(): Promise<void> {
await makePersistent(this, 'NagbarStore', [
'iosInstallDismissed',
'pwaInstallDismissed',
'pushNotificationDismissed',
'desktopNotificationDismissed',
'premiumGracePeriodDismissed',
'premiumExpiredDismissed',
'premiumOnboardingDismissed',
'giftInventoryDismissed',
'desktopDownloadDismissed',
'mobileDownloadDismissed',
'pendingBulkDeletionDismissed',
'invitesDisabledDismissed',
'guildMembershipCtaDismissed',
'visionaryMfaDismissed',
]);
}
getIosInstallDismissed(): boolean {
return this.iosInstallDismissed;
}
getPwaInstallDismissed(): boolean {
return this.pwaInstallDismissed;
}
getPushNotificationDismissed(): boolean {
return this.pushNotificationDismissed;
}
getForceOffline(): boolean {
return this.forceOffline;
}
getForceEmailVerification(): boolean {
return this.forceEmailVerification;
}
getForceIOSInstall(): boolean {
return this.forceIOSInstall;
}
getForcePWAInstall(): boolean {
return this.forcePWAInstall;
}
getForcePushNotification(): boolean {
return this.forcePushNotification;
}
getForceUnclaimedAccount(): boolean {
return this.forceUnclaimedAccount;
}
getInvitesDisabledDismissed(guildId: string): boolean {
return this.invitesDisabledDismissed[guildId] ?? false;
}
getForceInvitesDisabled(): boolean {
return this.forceInvitesDisabled;
}
getForceHideOffline(): boolean {
return this.forceHideOffline;
}
getForceHideEmailVerification(): boolean {
return this.forceHideEmailVerification;
}
getForceHideIOSInstall(): boolean {
return this.forceHideIOSInstall;
}
getForceHidePWAInstall(): boolean {
return this.forceHidePWAInstall;
}
getForceHidePushNotification(): boolean {
return this.forceHidePushNotification;
}
getForceHideUnclaimedAccount(): boolean {
return this.forceHideUnclaimedAccount;
}
getForceHideDesktopNotification(): boolean {
return this.forceHideDesktopNotification;
}
getForceHideInvitesDisabled(): boolean {
return this.forceHideInvitesDisabled;
}
getForceHidePremiumGracePeriod(): boolean {
return this.forceHidePremiumGracePeriod;
}
getForceHidePremiumExpired(): boolean {
return this.forceHidePremiumExpired;
}
getForceHidePremiumOnboarding(): boolean {
return this.forceHidePremiumOnboarding;
}
getForceHideGiftInventory(): boolean {
return this.forceHideGiftInventory;
}
getForceHideUpdateAvailable(): boolean {
return this.forceHideUpdateAvailable;
}
getForceGuildMembershipCta(): boolean {
return this.forceGuildMembershipCta;
}
getForceHideGuildMembershipCta(): boolean {
return this.forceHideGuildMembershipCta;
}
hasPendingBulkDeletionDismissed(scheduleKey: string | null): boolean {
if (!scheduleKey) {
return false;
}
return Boolean(this.pendingBulkDeletionDismissed[scheduleKey]);
}
markClaimAccountModalShown(): void {
this.claimAccountModalShownThisSession = true;
}
resetClaimAccountModalShown(): void {
this.claimAccountModalShownThisSession = false;
}
dismiss(nagbarType: NagbarToggleKey): void {
this[nagbarType] = true;
}
dismissPendingBulkDeletion(scheduleKey: string): void {
this.pendingBulkDeletionDismissed = {
...this.pendingBulkDeletionDismissed,
[scheduleKey]: true,
};
}
dismissInvitesDisabled(guildId: string): void {
this.invitesDisabledDismissed = {
...this.invitesDisabledDismissed,
[guildId]: true,
};
}
clearPendingBulkDeletionDismissed(scheduleKey: string): void {
const {[scheduleKey]: _, ...rest} = this.pendingBulkDeletionDismissed;
this.pendingBulkDeletionDismissed = rest;
}
reset(nagbarType: NagbarToggleKey): void {
this[nagbarType] = false;
}
setFlag(key: NagbarToggleKey, value: boolean): void {
this[key] = value;
}
resetInvitesDisabled(guildId: string): void {
const {[guildId]: _, ...rest} = this.invitesDisabledDismissed;
this.invitesDisabledDismissed = rest;
}
resetAll(): void {
this.iosInstallDismissed = false;
this.pwaInstallDismissed = false;
this.pushNotificationDismissed = false;
this.desktopNotificationDismissed = false;
this.premiumGracePeriodDismissed = false;
this.premiumExpiredDismissed = false;
this.premiumOnboardingDismissed = false;
this.giftInventoryDismissed = false;
this.desktopDownloadDismissed = false;
this.mobileDownloadDismissed = false;
this.pendingBulkDeletionDismissed = {};
this.invitesDisabledDismissed = {};
this.guildMembershipCtaDismissed = false;
this.visionaryMfaDismissed = false;
this.claimAccountModalShownThisSession = false;
this.forceOffline = false;
this.forceEmailVerification = false;
this.forceIOSInstall = false;
this.forcePWAInstall = false;
this.forcePushNotification = false;
this.forceUnclaimedAccount = false;
this.forceDesktopNotification = false;
this.forceInvitesDisabled = false;
this.forcePremiumGracePeriod = false;
this.forcePremiumExpired = false;
this.forcePremiumOnboarding = false;
this.forceGiftInventory = false;
this.forceUpdateAvailable = false;
this.forceDesktopDownload = false;
this.forceMobileDownload = false;
this.forceGuildMembershipCta = false;
this.forceVisionaryMfa = false;
this.forceHideOffline = false;
this.forceHideEmailVerification = false;
this.forceHideIOSInstall = false;
this.forceHidePWAInstall = false;
this.forceHidePushNotification = false;
this.forceHideUnclaimedAccount = false;
this.forceHideDesktopNotification = false;
this.forceHideInvitesDisabled = false;
this.forceHidePremiumGracePeriod = false;
this.forceHidePremiumExpired = false;
this.forceHidePremiumOnboarding = false;
this.forceHideGiftInventory = false;
this.forceHideUpdateAvailable = false;
this.forceHideDesktopDownload = false;
this.forceHideMobileDownload = false;
this.forceHideGuildMembershipCta = false;
this.forceHideVisionaryMfa = false;
}
handleGuildUpdate(action: {
guild: {
id: string;
features?: ReadonlyArray<string>;
properties?: {features: ReadonlyArray<string>};
};
}): void {
const guildId = action.guild.id;
const features: ReadonlyArray<string> = action.guild.features ?? action.guild.properties?.features ?? [];
const hasInvitesDisabled = features.includes('INVITES_DISABLED');
if (!hasInvitesDisabled && this.invitesDisabledDismissed[guildId]) {
const {[guildId]: _, ...rest} = this.invitesDisabledDismissed;
this.invitesDisabledDismissed = rest;
}
}
}
export default new NagbarStore();