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