mirror of
https://github.com/glitch-soc/mastodon.git
synced 2025-12-29 07:03:16 +01:00
[Glitch] Wrapstodon: Allow dismissing banner
Port 10f232ca08 to glitch-soc
Signed-off-by: Claire <claire.github-309c@sitedethib.com>
This commit is contained in:
42
app/javascript/flavours/glitch/hooks/useDismissible.ts
Normal file
42
app/javascript/flavours/glitch/hooks/useDismissible.ts
Normal file
@@ -0,0 +1,42 @@
|
||||
import { useCallback, useEffect } from 'react';
|
||||
|
||||
import type { Map as ImmutableMap } from 'immutable';
|
||||
|
||||
import { changeSetting } from '@/flavours/glitch/actions/settings';
|
||||
import { bannerSettings } from '@/flavours/glitch/settings';
|
||||
import { useAppSelector, useAppDispatch } from '@/flavours/glitch/store';
|
||||
|
||||
export function useDismissible(id: string) {
|
||||
// We use "dismissed_banners" as that was what this was previously called,
|
||||
// but we can use this to track any dismissible state.
|
||||
const dismissed = useAppSelector(
|
||||
(state) =>
|
||||
!!(
|
||||
state.settings as ImmutableMap<
|
||||
'dismissed_banners',
|
||||
ImmutableMap<string, boolean>
|
||||
>
|
||||
).getIn(['dismissed_banners', id], false),
|
||||
);
|
||||
|
||||
const wasDismissed = !!bannerSettings.get(id) || dismissed;
|
||||
|
||||
const dispatch = useAppDispatch();
|
||||
|
||||
const dismiss = useCallback(() => {
|
||||
bannerSettings.set(id, true);
|
||||
dispatch(changeSetting(['dismissed_banners', id], true));
|
||||
}, [id, dispatch]);
|
||||
|
||||
useEffect(() => {
|
||||
// Store legacy localStorage setting on server
|
||||
if (wasDismissed && !dismissed) {
|
||||
dispatch(changeSetting(['dismissed_banners', id], true));
|
||||
}
|
||||
}, [id, dispatch, wasDismissed, dismissed]);
|
||||
|
||||
return {
|
||||
wasDismissed,
|
||||
dismiss,
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user