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}