import { useCallback } from 'react'; import { useFilePicker } from './useFilePicker'; import { useSetting } from '../state/hooks/settings'; import { settingsAtom } from '../state/settings'; import { stripImageMetadata } from '../utils/stripImageMetadata'; /** * [Gitea #332] `useFilePicker` for images that get published (emoji / sticker * packs, pack avatars, power-level badges): applies "Remove Photo Metadata" * like message attachments and avatars, so a phone photo's GPS location and * timestamp don't go to every member of the room or space. */ export const useStrippedFilePicker = ( onSelect: (file: M extends true ? File[] : File) => void, multiple?: M, ) => { const [strip] = useSetting(settingsAtom, 'stripImageMetadata'); const handle = useCallback( (picked: File | File[]) => { if (!strip) { onSelect(picked as M extends true ? File[] : File); return; } const clean = (f: File) => stripImageMetadata(f).then((r) => r.file); if (Array.isArray(picked)) { Promise.all(picked.map(clean)).then((files) => onSelect(files as M extends true ? File[] : File), ); } else { clean(picked).then((file) => onSelect(file as M extends true ? File[] : File)); } }, [strip, onSelect], ); return useFilePicker(handle as (file: M extends true ? File[] : File) => void, multiple); };