signal-desktop/ts/state/smart/FunProvider.tsx

96 lines
3 KiB
TypeScript
Raw Normal View History

// Copyright 2025 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
import type { ReactNode } from 'react';
import React, { memo, useCallback, useMemo } from 'react';
import { useSelector } from 'react-redux';
import { FunProvider } from '../../components/fun/FunProvider';
import { getIntl } from '../selectors/user';
import { selectRecentEmojis } from '../selectors/emojis';
import type { GifType } from '../../components/fun/panels/FunPanelGifs';
import {
getInstalledStickerPacks,
getRecentStickers,
} from '../selectors/stickers';
import { strictAssert } from '../../util/assert';
import type { EmojiSkinTone } from '../../components/fun/data/emojis';
import {
getEmojiParentKeyByEnglishShortName,
isEmojiEnglishShortName,
} from '../../components/fun/data/emojis';
2025-03-26 12:35:32 -07:00
import {
getEmojiSkinToneDefault,
getShowStickerPickerHint,
} from '../selectors/items';
import { useItemsActions } from '../ducks/items';
2025-03-26 12:35:32 -07:00
import {
fetchGifsFeatured,
fetchGifsSearch,
} from '../../components/fun/data/gifs';
import { tenorDownload } from '../../components/fun/data/tenor';
export type SmartFunProviderProps = Readonly<{
children: ReactNode;
}>;
export const SmartFunProvider = memo(function SmartFunProvider(
props: SmartFunProviderProps
) {
const i18n = useSelector(getIntl);
// Redux
const installedStickerPacks = useSelector(getInstalledStickerPacks);
const recentEmojis = useSelector(selectRecentEmojis);
const recentStickers = useSelector(getRecentStickers);
2025-03-26 12:35:32 -07:00
const recentGifs: Array<GifType> = useMemo(() => [], []);
const emojiSkinToneDefault = useSelector(getEmojiSkinToneDefault);
const showStickerPickerHint = useSelector(getShowStickerPickerHint);
2025-03-26 12:35:32 -07:00
const { removeItem, setEmojiSkinToneDefault } = useItemsActions();
// Translate recent emojis to keys
const recentEmojisKeys = useMemo(() => {
return recentEmojis.map(emojiShortName => {
strictAssert(
isEmojiEnglishShortName(emojiShortName),
`Invalid short name: ${emojiShortName}`
);
return getEmojiParentKeyByEnglishShortName(emojiShortName);
});
}, [recentEmojis]);
2025-03-26 12:35:32 -07:00
const handleEmojiSkinToneDefaultChange = useCallback(
(emojiSkinTone: EmojiSkinTone) => {
setEmojiSkinToneDefault(emojiSkinTone);
},
2025-03-26 12:35:32 -07:00
[setEmojiSkinToneDefault]
);
// Stickers
const handleClearStickerPickerHint = useCallback(() => {
removeItem('showStickerPickerHint');
}, [removeItem]);
return (
<FunProvider
i18n={i18n}
// Recents
recentEmojis={recentEmojisKeys}
recentStickers={recentStickers}
recentGifs={recentGifs}
// Emojis
2025-03-26 12:35:32 -07:00
emojiSkinToneDefault={emojiSkinToneDefault}
onEmojiSkinToneDefaultChange={handleEmojiSkinToneDefaultChange}
// Stickers
installedStickerPacks={installedStickerPacks}
showStickerPickerHint={showStickerPickerHint}
onClearStickerPickerHint={handleClearStickerPickerHint}
2025-03-26 12:35:32 -07:00
// Gifs
fetchGifsSearch={fetchGifsSearch}
fetchGifsFeatured={fetchGifsFeatured}
fetchGif={tenorDownload}
>
{props.children}
</FunProvider>
);
});