mirror of
https://github.com/bitsocialnet/5chan.git
synced 2026-08-03 07:41:04 +02:00
Adds a review modal for settings upgrades, keeps the settings banner reviewable, and preserves explicit router settings during account import.
68 lines
3.1 KiB
TypeScript
68 lines
3.1 KiB
TypeScript
import { create } from 'zustand';
|
|
|
|
export const DISMISSED_SETTINGS_UPGRADES_KEY = '5chan:dismissed-settings-upgrades';
|
|
export const HIDDEN_SETTINGS_UPGRADE_REVIEWS_KEY = '5chan:hidden-settings-upgrade-reviews';
|
|
|
|
const uniqueUpgradeKeys = (upgradeKeys: string[]) => [...new Set(upgradeKeys)];
|
|
|
|
const readStoredUpgradeKeys = (storageKey: string) => {
|
|
try {
|
|
const parsedKeys = JSON.parse(localStorage.getItem(storageKey) ?? '[]');
|
|
return Array.isArray(parsedKeys) ? parsedKeys.filter((key): key is string => typeof key === 'string') : [];
|
|
} catch {
|
|
return [];
|
|
}
|
|
};
|
|
|
|
const writeStoredUpgradeKeys = (storageKey: string, upgradeKeys: string[]) => {
|
|
try {
|
|
localStorage.setItem(storageKey, JSON.stringify(uniqueUpgradeKeys(upgradeKeys)));
|
|
} catch {
|
|
return;
|
|
}
|
|
};
|
|
|
|
type SettingsUpgradeReviewState = {
|
|
hiddenReviewUpgradeKeys: string[];
|
|
persistentDismissedUpgradeKeys: string[];
|
|
reviewedUpgradeKeys: string[];
|
|
reviewRequestId: number;
|
|
dismissUpgradeKeys: (upgradeKeys: string[]) => void;
|
|
hideReviewUpgradeKeys: (upgradeKeys: string[]) => void;
|
|
reviewUpgradeKeys: (upgradeKeys: string[]) => void;
|
|
};
|
|
|
|
const useSettingsUpgradeReviewStore = create<SettingsUpgradeReviewState>((set, get) => ({
|
|
hiddenReviewUpgradeKeys: readStoredUpgradeKeys(HIDDEN_SETTINGS_UPGRADE_REVIEWS_KEY),
|
|
persistentDismissedUpgradeKeys: readStoredUpgradeKeys(DISMISSED_SETTINGS_UPGRADES_KEY),
|
|
reviewedUpgradeKeys: [],
|
|
reviewRequestId: 0,
|
|
dismissUpgradeKeys: (upgradeKeys) => {
|
|
const persistentDismissedUpgradeKeys = uniqueUpgradeKeys([...get().persistentDismissedUpgradeKeys, ...upgradeKeys]);
|
|
writeStoredUpgradeKeys(DISMISSED_SETTINGS_UPGRADES_KEY, persistentDismissedUpgradeKeys);
|
|
set({ persistentDismissedUpgradeKeys });
|
|
},
|
|
hideReviewUpgradeKeys: (upgradeKeys) => {
|
|
const persistentDismissedUpgradeKeys = uniqueUpgradeKeys([...get().persistentDismissedUpgradeKeys, ...upgradeKeys]);
|
|
const hiddenReviewUpgradeKeys = uniqueUpgradeKeys([...get().hiddenReviewUpgradeKeys, ...upgradeKeys]);
|
|
writeStoredUpgradeKeys(DISMISSED_SETTINGS_UPGRADES_KEY, persistentDismissedUpgradeKeys);
|
|
writeStoredUpgradeKeys(HIDDEN_SETTINGS_UPGRADE_REVIEWS_KEY, hiddenReviewUpgradeKeys);
|
|
set({ hiddenReviewUpgradeKeys, persistentDismissedUpgradeKeys });
|
|
},
|
|
reviewUpgradeKeys: (upgradeKeys) => {
|
|
const upgradeKeysToReview = new Set(upgradeKeys);
|
|
const persistentDismissedUpgradeKeys = get().persistentDismissedUpgradeKeys.filter((upgradeKey) => !upgradeKeysToReview.has(upgradeKey));
|
|
const hiddenReviewUpgradeKeys = get().hiddenReviewUpgradeKeys.filter((upgradeKey) => !upgradeKeysToReview.has(upgradeKey));
|
|
writeStoredUpgradeKeys(DISMISSED_SETTINGS_UPGRADES_KEY, persistentDismissedUpgradeKeys);
|
|
writeStoredUpgradeKeys(HIDDEN_SETTINGS_UPGRADE_REVIEWS_KEY, hiddenReviewUpgradeKeys);
|
|
set((state) => ({
|
|
hiddenReviewUpgradeKeys,
|
|
persistentDismissedUpgradeKeys,
|
|
reviewedUpgradeKeys: uniqueUpgradeKeys([...state.reviewedUpgradeKeys, ...upgradeKeys]),
|
|
reviewRequestId: state.reviewRequestId + 1,
|
|
}));
|
|
},
|
|
}));
|
|
|
|
export default useSettingsUpgradeReviewStore;
|