- Activity page: "Delete all" empties the open tab (api/admin/logs/clear-logs, super admin only, logged under system) - Stop logging every WebSocket connect - Log unexpected API errors (safeErrorMessage -> logUnexpectedError), every failed bot job attempt and every job the queue lost - Drop the cron jobs' console output; a failed model sync goes to the logs Co-Authored-By: Claude Opus 5.5 <[email protected]>
124 lines
3.1 KiB
TypeScript
124 lines
3.1 KiB
TypeScript
import type { BUN_SQLITE_COBBLE_LOGS_JOIN } from "@/src/types/sql-joins";
|
|
import { useAdminCrudGet } from "@/src/hooks/use-admin-crud-get";
|
|
import { useEffect, useState } from "react";
|
|
import type { LogCategoryValue } from "../(data)/log-category-styles";
|
|
import getLogsQuery from "../(utils)/get-logs-query";
|
|
|
|
type Props = {};
|
|
|
|
export default function useLogsListInit(_props?: Props) {
|
|
const {
|
|
res: logs,
|
|
setRes,
|
|
count,
|
|
page,
|
|
setPage,
|
|
query,
|
|
setQuery,
|
|
limit,
|
|
setLimit,
|
|
ready,
|
|
setReady,
|
|
} = useAdminCrudGet<BUN_SQLITE_COBBLE_LOGS_JOIN>({
|
|
table: "logs",
|
|
count: true,
|
|
sql_query: getLogsQuery({}),
|
|
});
|
|
|
|
const [category, setCategory] = useState<LogCategoryValue | undefined>();
|
|
const [selected_ids, setSelectedIds] = useState<number[]>([]);
|
|
const [active_log, setActiveLog] = useState<BUN_SQLITE_COBBLE_LOGS_JOIN>();
|
|
const [log_modal_open, setLogModalOpen] = useState(false);
|
|
|
|
useEffect(() => {
|
|
if (logs) return;
|
|
setSelectedIds([]);
|
|
}, [logs]);
|
|
|
|
const selectCategory = ({ value }: { value?: LogCategoryValue }) => {
|
|
if (value == category) return;
|
|
setCategory(value);
|
|
setQuery(getLogsQuery({ category: value }));
|
|
};
|
|
|
|
const toggleSelected = ({ id, checked }: { id: number; checked: boolean }) => {
|
|
setSelectedIds((prev) => {
|
|
const without = prev.filter((prev_id) => prev_id != id);
|
|
return checked ? [...without, id] : without;
|
|
});
|
|
};
|
|
|
|
const openLog = ({ log }: { log: BUN_SQLITE_COBBLE_LOGS_JOIN }) => {
|
|
setActiveLog(log);
|
|
setLogModalOpen(true);
|
|
};
|
|
|
|
const toggleSelectAll = ({ checked }: { checked: boolean }) => {
|
|
setSelectedIds(
|
|
checked
|
|
? (logs || []).map((log) => Number(log.id)).filter(Boolean)
|
|
: [],
|
|
);
|
|
};
|
|
|
|
/**
|
|
* Reload the current page, stepping back a page when the delete
|
|
* emptied it.
|
|
*/
|
|
const afterDelete = ({ deleted_ids }: { deleted_ids: number[] }) => {
|
|
const remaining = (logs || []).filter(
|
|
(log) => !deleted_ids.includes(Number(log.id)),
|
|
);
|
|
|
|
if (!remaining[0] && page > 1) {
|
|
setPage(page - 1);
|
|
return;
|
|
}
|
|
|
|
setRes(undefined);
|
|
};
|
|
|
|
/**
|
|
* The tab was emptied: back to its first page, reloaded.
|
|
*/
|
|
const afterClear = () => {
|
|
setSelectedIds([]);
|
|
|
|
if (page > 1) {
|
|
setPage(1);
|
|
return;
|
|
}
|
|
|
|
setRes(undefined);
|
|
};
|
|
|
|
const all_selected =
|
|
Boolean(logs?.[0]) && selected_ids.length == logs?.length;
|
|
|
|
return {
|
|
logs,
|
|
setRes,
|
|
count,
|
|
page,
|
|
setPage,
|
|
query,
|
|
setQuery,
|
|
limit,
|
|
setLimit,
|
|
ready,
|
|
setReady,
|
|
category,
|
|
selectCategory,
|
|
selected_ids,
|
|
toggleSelected,
|
|
toggleSelectAll,
|
|
all_selected,
|
|
afterDelete,
|
|
afterClear,
|
|
active_log,
|
|
openLog,
|
|
log_modal_open,
|
|
setLogModalOpen,
|
|
};
|
|
}
|