import XMarkIcon from '@heroicons/react/20/solid/XMarkIcon'; import { logger } from '@strudel/core'; import useEvent from '@src/useEvent.mjs'; import cx from '@src/cx.mjs'; import { nanoid } from 'nanoid'; import { useCallback, useLayoutEffect, useEffect, useRef, useState } from 'react'; import { setActiveFooter, useSettings } from '../../../settings.mjs'; import { ConsoleTab } from './ConsoleTab'; import { FilesTab } from './FilesTab'; import { Reference } from './Reference'; import { SettingsTab } from './SettingsTab'; import { SoundsTab } from './SoundsTab'; import { WelcomeTab } from './WelcomeTab'; import { PatternsTab } from './PatternsTab'; import useClient from '@src/useClient.mjs'; // https://gist.github.com/gaearon/e7d97cdf38a2907924ea12e4ebdf3c85 export const useIsomorphicLayoutEffect = typeof window !== 'undefined' ? useLayoutEffect : useEffect; const TAURI = typeof window !== 'undefined' && window.__TAURI__; export function Panel({ context }) { const footerContent = useRef(); const [log, setLog] = useState([]); const { activeFooter, isZen, panelPosition } = useSettings(); useIsomorphicLayoutEffect(() => { if (footerContent.current && activeFooter === 'console') { // scroll log box to bottom when log changes footerContent.current.scrollTop = footerContent.current?.scrollHeight; } }, [log, activeFooter]); useIsomorphicLayoutEffect(() => { if (!footerContent.current) { } else if (activeFooter === 'console') { footerContent.current.scrollTop = footerContent.current?.scrollHeight; } else { footerContent.current.scrollTop = 0; } }, [activeFooter]); useLogger( useCallback((e) => { const { message, type, data } = e.detail; setLog((l) => { const lastLog = l.length ? l[l.length - 1] : undefined; const id = nanoid(12); // if (type === 'loaded-sample' && lastLog.type === 'load-sample' && lastLog.url === data.url) { if (type === 'loaded-sample') { // const loadIndex = l.length - 1; const loadIndex = l.findIndex(({ data: { url }, type }) => type === 'load-sample' && url === data.url); l[loadIndex] = { message, type, id, data }; } else if (lastLog && lastLog.message === message) { l = l.slice(0, -1).concat([{ message, type, count: (lastLog.count ?? 1) + 1, id, data }]); } else { l = l.concat([{ message, type, id, data }]); } return l.slice(-20); }); }, []), ); const PanelTab = ({ children, name, label }) => ( <>