Compare commits
1
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4486f02bc6 |
@@ -16,7 +16,7 @@ import { SettingTile } from '../setting-tile';
|
|||||||
import { UsageSwitcher } from './UsageSwitcher';
|
import { UsageSwitcher } from './UsageSwitcher';
|
||||||
import { ImagePackProfile, ImagePackProfileEdit } from './PackMeta';
|
import { ImagePackProfile, ImagePackProfileEdit } from './PackMeta';
|
||||||
import * as css from './style.css';
|
import * as css from './style.css';
|
||||||
import { useFilePicker } from '../../hooks/useFilePicker';
|
import { useStrippedFilePicker } from '../../hooks/useStrippedFilePicker';
|
||||||
import { CompactUploadCardRenderer } from '../upload-card';
|
import { CompactUploadCardRenderer } from '../upload-card';
|
||||||
import { UploadSuccess } from '../../state/upload';
|
import { UploadSuccess } from '../../state/upload';
|
||||||
import { getImageInfo, TUploadContent } from '../../utils/matrix';
|
import { getImageInfo, TUploadContent } from '../../utils/matrix';
|
||||||
@@ -60,7 +60,7 @@ export const ImagePackContent = as<'div', ImagePackContentProps>(
|
|||||||
[imagePack, savedImages, uploadedImages],
|
[imagePack, savedImages, uploadedImages],
|
||||||
);
|
);
|
||||||
|
|
||||||
const pickFiles = useFilePicker(
|
const pickFiles = useStrippedFilePicker(
|
||||||
useCallback(
|
useCallback(
|
||||||
(pickedFiles: File[]) => {
|
(pickedFiles: File[]) => {
|
||||||
const uniqueFiles = pickedFiles.map((file) => {
|
const uniqueFiles = pickedFiles.map((file) => {
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ import { nameInitials } from '../../utils/common';
|
|||||||
import { BreakWord } from '../../styles/Text.css';
|
import { BreakWord } from '../../styles/Text.css';
|
||||||
import { LINKIFY_OPTS } from '../../plugins/react-custom-html-parser';
|
import { LINKIFY_OPTS } from '../../plugins/react-custom-html-parser';
|
||||||
import { ContainerColor } from '../../styles/ContainerColor.css';
|
import { ContainerColor } from '../../styles/ContainerColor.css';
|
||||||
import { useFilePicker } from '../../hooks/useFilePicker';
|
import { useStrippedFilePicker } from '../../hooks/useStrippedFilePicker';
|
||||||
import { useObjectURL } from '../../hooks/useObjectURL';
|
import { useObjectURL } from '../../hooks/useObjectURL';
|
||||||
import { createUploadAtom, UploadSuccess } from '../../state/upload';
|
import { createUploadAtom, UploadSuccess } from '../../state/upload';
|
||||||
import { CompactUploadCardRenderer } from '../upload-card';
|
import { CompactUploadCardRenderer } from '../upload-card';
|
||||||
@@ -111,7 +111,7 @@ export function ImagePackProfileEdit({ meta, onCancel, onSave }: ImagePackProfil
|
|||||||
return undefined;
|
return undefined;
|
||||||
}, [imageFile]);
|
}, [imageFile]);
|
||||||
|
|
||||||
const pickFile = useFilePicker(setImageFile, false);
|
const pickFile = useStrippedFilePicker(setImageFile, false);
|
||||||
|
|
||||||
const handleRemoveUpload = useCallback(() => {
|
const handleRemoveUpload = useCallback(() => {
|
||||||
setImageFile(undefined);
|
setImageFile(undefined);
|
||||||
|
|||||||
@@ -40,7 +40,7 @@ import { useImagePackRooms } from '../../../hooks/useImagePackRooms';
|
|||||||
import { roomToParentsAtom } from '../../../state/room/roomToParents';
|
import { roomToParentsAtom } from '../../../state/room/roomToParents';
|
||||||
import { useMediaAuthentication } from '../../../hooks/useMediaAuthentication';
|
import { useMediaAuthentication } from '../../../hooks/useMediaAuthentication';
|
||||||
import { useMatrixClient } from '../../../hooks/useMatrixClient';
|
import { useMatrixClient } from '../../../hooks/useMatrixClient';
|
||||||
import { useFilePicker } from '../../../hooks/useFilePicker';
|
import { useStrippedFilePicker } from '../../../hooks/useStrippedFilePicker';
|
||||||
import { CompactUploadCardRenderer } from '../../../components/upload-card';
|
import { CompactUploadCardRenderer } from '../../../components/upload-card';
|
||||||
import { createUploadAtom, UploadSuccess } from '../../../state/upload';
|
import { createUploadAtom, UploadSuccess } from '../../../state/upload';
|
||||||
import { AsyncStatus, useAsyncCallback } from '../../../hooks/useAsyncCallback';
|
import { AsyncStatus, useAsyncCallback } from '../../../hooks/useAsyncCallback';
|
||||||
@@ -68,7 +68,7 @@ function EditPower({ maxPower, power, tag, onSave, onClose }: EditPowerProps) {
|
|||||||
const imagePackRooms = useImagePackRooms(room.roomId, roomToParents);
|
const imagePackRooms = useImagePackRooms(room.roomId, roomToParents);
|
||||||
|
|
||||||
const [iconFile, setIconFile] = useState<File>();
|
const [iconFile, setIconFile] = useState<File>();
|
||||||
const pickFile = useFilePicker(setIconFile, false);
|
const pickFile = useStrippedFilePicker(setIconFile, false);
|
||||||
|
|
||||||
const [tagColor, setTagColor] = useState<string | undefined>(tag?.color);
|
const [tagColor, setTagColor] = useState<string | undefined>(tag?.color);
|
||||||
const [tagIcon, setTagIcon] = useState<MemberPowerTagIcon | undefined>(tag?.icon);
|
const [tagIcon, setTagIcon] = useState<MemberPowerTagIcon | undefined>(tag?.icon);
|
||||||
|
|||||||
@@ -0,0 +1,36 @@
|
|||||||
|
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 = <M extends boolean | undefined = undefined>(
|
||||||
|
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);
|
||||||
|
};
|
||||||
Reference in New Issue
Block a user