summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorClaire <claire.github-309c@sitedethib.com>2023-11-30 12:45:54 +0100
committerClaire <claire.github-309c@sitedethib.com>2023-12-04 15:28:15 +0100
commit7b9496322fd726a70c6fec1eee77c8cd04f0fd9e (patch)
tree46b3b1468d65e6dbad122bbf4ca00b4b1823dfcd
parent09115731d617c556135ac465421645ed54e92ca9 (diff)
Change dismissed banners to be stored server-side (#27055)
-rw-r--r--app/javascript/mastodon/components/dismissable_banner.tsx25
-rw-r--r--app/javascript/mastodon/reducers/settings.js9
2 files changed, 31 insertions, 3 deletions
diff --git a/app/javascript/mastodon/components/dismissable_banner.tsx b/app/javascript/mastodon/components/dismissable_banner.tsx
index 04a28e3cbe7..6984691409a 100644
--- a/app/javascript/mastodon/components/dismissable_banner.tsx
+++ b/app/javascript/mastodon/components/dismissable_banner.tsx
@@ -1,9 +1,16 @@
+/* eslint-disable @typescript-eslint/no-unsafe-call,
+ @typescript-eslint/no-unsafe-return,
+ @typescript-eslint/no-unsafe-assignment,
+ @typescript-eslint/no-unsafe-member-access
+ -- the settings store is not yet typed */
import type { PropsWithChildren } from 'react';
-import { useCallback, useState } from 'react';
+import { useCallback, useState, useEffect } from 'react';
import { defineMessages, useIntl } from 'react-intl';
+import { changeSetting } from 'mastodon/actions/settings';
import { bannerSettings } from 'mastodon/settings';
+import { useAppSelector, useAppDispatch } from 'mastodon/store';
import { IconButton } from './icon_button';
@@ -19,13 +26,25 @@ export const DismissableBanner: React.FC<PropsWithChildren<Props>> = ({
id,
children,
}) => {
- const [visible, setVisible] = useState(!bannerSettings.get(id));
+ const dismissed = useAppSelector((state) =>
+ state.settings.getIn(['dismissed_banners', id], false),
+ );
+ const dispatch = useAppDispatch();
+
+ const [visible, setVisible] = useState(!bannerSettings.get(id) && !dismissed);
const intl = useIntl();
const handleDismiss = useCallback(() => {
setVisible(false);
bannerSettings.set(id, true);
- }, [id]);
+ dispatch(changeSetting(['dismissed_banners', id], true));
+ }, [id, dispatch]);
+
+ useEffect(() => {
+ if (!visible && !dismissed) {
+ dispatch(changeSetting(['dismissed_banners', id], true));
+ }
+ }, [id, dispatch, visible, dismissed]);
if (!visible) {
return null;
diff --git a/app/javascript/mastodon/reducers/settings.js b/app/javascript/mastodon/reducers/settings.js
index 07d1bda0f4d..a605ecbb8bd 100644
--- a/app/javascript/mastodon/reducers/settings.js
+++ b/app/javascript/mastodon/reducers/settings.js
@@ -100,6 +100,15 @@ const initialState = ImmutableMap({
body: '',
}),
}),
+
+ dismissed_banners: ImmutableMap({
+ 'public_timeline': false,
+ 'community_timeline': false,
+ 'home.explore_prompt': false,
+ 'explore/links': false,
+ 'explore/statuses': false,
+ 'explore/tags': false,
+ }),
});
const defaultColumns = fromJS([