import type {
ReadonlyPureSelectorToken,
RegularAtomToken,
TimelineToken,
} from "atom.io"
import { redo, undo } from "atom.io"
import { findInStore, type Timeline } from "atom.io/internal"
import { useI, useO } from "atom.io/react"
import { type FC, Fragment, useContext } from "react"
import { button } from "./Button.tsx"
import { DevtoolsContext } from "./store.ts"
import { article } from "./Updates.tsx"
export const YouAreHere: FC = () => {
return you are here
}
export const TimelineLog: FC<{
token: TimelineToken
isOpenState: RegularAtomToken
timelineState: ReadonlyPureSelectorToken>
}> = ({ token, isOpenState, timelineState }) => {
const timeline = useO(timelineState)
const isOpen = useO(isOpenState)
const setIsOpen = useI(isOpenState)
return (
{token.key}
({timeline.at}/{timeline.history.length})
{isOpen ? (
{timeline.history.map((update, index) =>
update.type !== `atom_creation` &&
update.type !== `atom_disposal` ? (
{index === timeline.at ? : null}
{index === timeline.history.length - 1 &&
timeline.at === timeline.history.length ? (
) : null}
) : null,
)}
) : null}
)
}
export const TimelineIndex: FC = () => {
const { timelineIndex, timelineSelectors, viewIsOpenAtoms, store } =
useContext(DevtoolsContext)
const tokenIds = useO(timelineIndex)
const visibleTokens = tokenIds.filter((token) => !token.key.startsWith(`👁🗨`))
const familyMembers = new Map[]>()
const standalone: TimelineToken[] = []
for (const token of visibleTokens) {
if (token.family) {
const members = familyMembers.get(token.family.key) ?? []
members.push(token)
familyMembers.set(token.family.key, members)
} else {
standalone.push(token)
}
}
const renderTimeline = (token: TimelineToken) => (
)
return (
{visibleTokens.length === 0 ? (
(no timelines)
) : (
<>
{standalone.map(renderTimeline)}
{[...familyMembers].map(([familyKey, members]) => (
{familyKey}
{members.map(renderTimeline)}
))}
>
)}
)
}