Signed-off-by: marcin mikołajczak <git@mkljczk.pl>environments/review-main-yi2y9f/deployments/4540^2
parent
f06ec3469b
commit
771c9643dc
@ -0,0 +1,42 @@
|
|||||||
|
import { useInfiniteQuery } from '@tanstack/react-query';
|
||||||
|
|
||||||
|
import { useApi } from 'soapbox/hooks';
|
||||||
|
import { moderationLogEntrySchema, type ModerationLogEntry } from 'soapbox/schemas';
|
||||||
|
|
||||||
|
interface ModerationLogResult {
|
||||||
|
items: ModerationLogEntry[];
|
||||||
|
total: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
const flattenPages = (pages?: ModerationLogResult[]): ModerationLogEntry[] => (pages || []).map(({ items }) => items).flat();
|
||||||
|
|
||||||
|
const useModerationLog = () => {
|
||||||
|
const api = useApi();
|
||||||
|
|
||||||
|
const getModerationLog = async (page: number): Promise<ModerationLogResult> => {
|
||||||
|
const { data } = await api.get<ModerationLogResult>('/api/v1/pleroma/admin/moderation_log', { params: { page } });
|
||||||
|
|
||||||
|
const normalizedData = data.items.map((domain) => moderationLogEntrySchema.parse(domain));
|
||||||
|
|
||||||
|
return {
|
||||||
|
items: normalizedData,
|
||||||
|
total: data.total,
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
const queryInfo = useInfiniteQuery({
|
||||||
|
queryKey: ['moderation_log'],
|
||||||
|
queryFn: ({ pageParam }) => getModerationLog(pageParam),
|
||||||
|
initialPageParam: 1,
|
||||||
|
getNextPageParam: (page, allPages) => flattenPages(allPages)!.length >= page.total ? undefined : allPages.length + 1,
|
||||||
|
});
|
||||||
|
|
||||||
|
const data = flattenPages(queryInfo.data?.pages);
|
||||||
|
|
||||||
|
return {
|
||||||
|
...queryInfo,
|
||||||
|
data,
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export { useModerationLog };
|
@ -1,58 +0,0 @@
|
|||||||
import {
|
|
||||||
Map as ImmutableMap,
|
|
||||||
Record as ImmutableRecord,
|
|
||||||
OrderedSet as ImmutableOrderedSet,
|
|
||||||
} from 'immutable';
|
|
||||||
|
|
||||||
import { ADMIN_LOG_FETCH_SUCCESS } from 'soapbox/actions/admin';
|
|
||||||
|
|
||||||
import type { AnyAction } from 'redux';
|
|
||||||
import type { APIEntity } from 'soapbox/types/entities';
|
|
||||||
|
|
||||||
export const LogEntryRecord = ImmutableRecord({
|
|
||||||
data: ImmutableMap<string, any>(),
|
|
||||||
id: 0,
|
|
||||||
message: '',
|
|
||||||
time: 0,
|
|
||||||
});
|
|
||||||
|
|
||||||
const ReducerRecord = ImmutableRecord({
|
|
||||||
items: ImmutableMap<string, LogEntry>(),
|
|
||||||
index: ImmutableOrderedSet<number>(),
|
|
||||||
total: 0,
|
|
||||||
});
|
|
||||||
|
|
||||||
type LogEntry = ReturnType<typeof LogEntryRecord>;
|
|
||||||
type State = ReturnType<typeof ReducerRecord>;
|
|
||||||
type APIEntities = Array<APIEntity>;
|
|
||||||
|
|
||||||
const parseItems = (items: APIEntities) => {
|
|
||||||
const ids: Array<number> = [];
|
|
||||||
const map: Record<string, LogEntry> = {};
|
|
||||||
|
|
||||||
items.forEach(item => {
|
|
||||||
ids.push(item.id);
|
|
||||||
map[item.id] = LogEntryRecord(item);
|
|
||||||
});
|
|
||||||
|
|
||||||
return { ids: ids, map: map };
|
|
||||||
};
|
|
||||||
|
|
||||||
const importItems = (state: State, items: APIEntities, total: number) => {
|
|
||||||
const { ids, map } = parseItems(items);
|
|
||||||
|
|
||||||
return state.withMutations(state => {
|
|
||||||
state.update('index', v => v.union(ids));
|
|
||||||
state.update('items', v => v.merge(map));
|
|
||||||
state.set('total', total);
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
export default function admin_log(state = ReducerRecord(), action: AnyAction) {
|
|
||||||
switch (action.type) {
|
|
||||||
case ADMIN_LOG_FETCH_SUCCESS:
|
|
||||||
return importItems(state, action.items, action.total);
|
|
||||||
default:
|
|
||||||
return state;
|
|
||||||
}
|
|
||||||
}
|
|
@ -0,0 +1,12 @@
|
|||||||
|
import z from 'zod';
|
||||||
|
|
||||||
|
const moderationLogEntrySchema = z.object({
|
||||||
|
id: z.coerce.string(),
|
||||||
|
data: z.record(z.string(), z.any()).catch({}),
|
||||||
|
time: z.number().catch(0),
|
||||||
|
message: z.string().catch(''),
|
||||||
|
});
|
||||||
|
|
||||||
|
type ModerationLogEntry = z.infer<typeof moderationLogEntrySchema>
|
||||||
|
|
||||||
|
export { moderationLogEntrySchema, type ModerationLogEntry };
|
Loading…
Reference in new issue