[Glitch] Allow removing deleted quotes from composer

Port 84d1ba980b to glitch-soc

Signed-off-by: Claire <claire.github-309c@sitedethib.com>
This commit is contained in:
diondiondion
2025-09-11 16:44:20 +02:00
committed by Claire
parent d471514231
commit 268ede0391
3 changed files with 140 additions and 67 deletions

View File

@@ -8,58 +8,99 @@ import { getFilters } from './filters';
export { makeGetAccount } from "./accounts";
export { getStatusList } from "./statuses";
const getStatusInputSelectors = [
(state, { id }) => state.getIn(['statuses', id]),
(state, { id }) => state.getIn(['statuses', state.getIn(['statuses', id, 'reblog'])]),
(state, { id }) => state.getIn(['accounts', state.getIn(['statuses', id, 'account'])]),
(state, { id }) => state.getIn(['accounts', state.getIn(['statuses', state.getIn(['statuses', id, 'reblog']), 'account'])]),
getFilters,
(_, { contextType }) => ['detailed', 'bookmarks', 'favourites'].includes(contextType),
];
function getStatusResultFunction(
statusBase,
statusReblog,
accountBase,
accountReblog,
filters,
warnInsteadOfHide
) {
if (!statusBase) {
return {
status: null,
loadingState: 'not-found',
};
}
if (statusBase.get('isLoading')) {
return {
status: null,
loadingState: 'loading',
}
}
let filtered = false;
let mediaFiltered = false;
if ((accountReblog || accountBase).get('id') !== me && filters) {
let filterResults = statusReblog?.get('filtered') || statusBase.get('filtered') || ImmutableList();
if (!warnInsteadOfHide && filterResults.some((result) => filters.getIn([result.get('filter'), 'filter_action']) === 'hide')) {
return {
status: null,
loadingState: 'filtered',
}
}
let mediaFilters = filterResults.filter(result => filters.getIn([result.get('filter'), 'filter_action']) === 'blur');
if (!mediaFilters.isEmpty()) {
mediaFiltered = mediaFilters.map(result => filters.getIn([result.get('filter'), 'title']));
}
filterResults = filterResults.filter(result => filters.has(result.get('filter')) && filters.getIn([result.get('filter'), 'filter_action']) !== 'blur');
if (!filterResults.isEmpty()) {
filtered = filterResults.map(result => filters.getIn([result.get('filter'), 'title']));
}
}
if (statusReblog) {
statusReblog = statusReblog.set('account', accountReblog);
statusReblog = statusReblog.set('matched_filters', filtered);
} else {
statusReblog = null;
}
return {
status: statusBase.withMutations(map => {
map.set('reblog', statusReblog);
map.set('account', accountBase);
map.set('matched_filters', filtered);
map.set('matched_media_filters', mediaFiltered);
}),
loadingState: 'complete'
};
}
export const makeGetStatus = () => {
return createSelector(
[
(state, { id }) => state.getIn(['statuses', id]),
(state, { id }) => state.getIn(['statuses', state.getIn(['statuses', id, 'reblog'])]),
(state, { id }) => state.getIn(['accounts', state.getIn(['statuses', id, 'account'])]),
(state, { id }) => state.getIn(['accounts', state.getIn(['statuses', state.getIn(['statuses', id, 'reblog']), 'account'])]),
getFilters,
(_, { contextType }) => ['detailed', 'bookmarks', 'favourites'].includes(contextType),
],
(statusBase, statusReblog, accountBase, accountReblog, filters, warnInsteadOfHide) => {
if (!statusBase || statusBase.get('isLoading')) {
return null;
}
let filtered = false;
let mediaFiltered = false;
if ((accountReblog || accountBase).get('id') !== me && filters) {
let filterResults = statusReblog?.get('filtered') || statusBase.get('filtered') || ImmutableList();
if (!warnInsteadOfHide && filterResults.some((result) => filters.getIn([result.get('filter'), 'filter_action']) === 'hide')) {
return null;
}
let mediaFilters = filterResults.filter(result => filters.getIn([result.get('filter'), 'filter_action']) === 'blur');
if (!mediaFilters.isEmpty()) {
mediaFiltered = mediaFilters.map(result => filters.getIn([result.get('filter'), 'title']));
}
filterResults = filterResults.filter(result => filters.has(result.get('filter')) && filters.getIn([result.get('filter'), 'filter_action']) !== 'blur');
if (!filterResults.isEmpty()) {
filtered = filterResults.map(result => filters.getIn([result.get('filter'), 'title']));
}
}
if (statusReblog) {
statusReblog = statusReblog.set('account', accountReblog);
statusReblog = statusReblog.set('matched_filters', filtered);
} else {
statusReblog = null;
}
return statusBase.withMutations(map => {
map.set('reblog', statusReblog);
map.set('account', accountBase);
map.set('matched_filters', filtered);
map.set('matched_media_filters', mediaFiltered);
});
getStatusInputSelectors,
(...args) => {
const {status} = getStatusResultFunction(...args);
return status
},
);
};
/**
* This selector extends the `makeGetStatus` with a more detailed
* `loadingState`, which is useful to find out why `null` is returned
* for the `status` field
*/
export const makeGetStatusWithExtraInfo = () => {
return createSelector(
getStatusInputSelectors,
getStatusResultFunction,
);
};
export const makeGetPictureInPicture = () => {
return createSelector([
(state, { id }) => state.picture_in_picture.statusId === id,