jevstrudel.git / website / src / repl / components / useLogger.jsx
useLogger.jsx33 lines · 1.1 KB · raw
1import useEvent from '@src/useEvent.mjs';
2import { logger } from '@strudel/core';
3import { nanoid } from 'nanoid';
4import { atom } from 'nanostores';
5
6export const $strudel_log_history = atom([]);
7
8function useLoggerEvent(onTrigger) {
9  useEvent(logger.key, onTrigger);
10}
11
12function getUpdatedLog(log, event) {
13  const { message, type, data } = event.detail;
14  const lastLog = log.length ? log[log.length - 1] : undefined;
15  const id = nanoid(12);
16  if (type === 'loaded-sample') {
17    const loadIndex = log.findIndex(({ data: { url }, type }) => type === 'load-sample' && url === data.url);
18    log[loadIndex] = { message, type, id, data };
19  } else if (lastLog && lastLog.message === message) {
20    log = log.slice(0, -1).concat([{ message, type, count: (lastLog.count ?? 1) + 1, id, data }]);
21  } else {
22    log = log.concat([{ message, type, id, data }]);
23  }
24  return log.slice(-40);
25}
26
27export function useLogger() {
28  useLoggerEvent((event) => {
29    const log = $strudel_log_history.get();
30    const newLog = getUpdatedLog(log, event);
31    $strudel_log_history.set(newLog);
32  });
33}