import { AppNavigator, AppStatusBar, AppViewProps, createApp, getEditor, NavigatorProps, useBit, useSearchState } from '@o/kit' import { Breadcrumb, Breadcrumbs, Dock, DockButton, ProvideTreeList, randomAdjective, randomNoun, Stack, StatusBarText, TreeList, useCreateTreeList, useDebounce, useTreeList, View } from '@o/ui' import { capitalize } from 'lodash' import pluralize from 'pluralize' import React, { memo, useCallback, useRef } from 'react' import ListsApi from './api.node' const Editor = getEditor() export default createApp({ id: 'lists', name: 'Lists', icon: 'list', iconColors: ['rgb(57, 204, 204)', 'rgb(61, 153, 112)'], api: ListsApi, app: () => { const treeList = useCreateTreeList(id) return ( ) }, }) const id = 'lists' export function ListsAppIndex(props: NavigatorProps) { const treeList = useTreeList() useSearchState({ onChange(search) { if (search.query.length) { treeList.addFolder(search.query) } }, onEvent: 'enter', }) return ( <> { treeList.addItem({ name: `${capitalize(randomAdjective())} ${capitalize(randomNoun())}`, }) }, [])} /> ) } function ListsAppMain(props: AppViewProps) { const treeList = useTreeList() const [bit, updateBit] = useBit(`main-content-${props.id}`, { defaultValue: { title: props.title, }, }) const ignoreFirst = useRef(true) const handleChange = useDebounce(getVal => { if (ignoreFirst.current) { ignoreFirst.current = false return } const val = getVal() updateBit(next => { next.body = val const title = val.split('\n')[0].slice(2, Infinity) next.title = title treeList.updateSelectedItem({ name: title }) }) }, 300) if (props.subType === 'folder') { return } return ( {/* TODO put this in a modal when you click a plus here */} {/* */} ) } function ListsAppMainFolder(props: AppViewProps) { const treeList = useCreateTreeList(id, { rootItemID: props.subId ? +props.subId : 0, persist: 'tree', }) return ( { console.log('dropped an item', items) treeList.addItemsFromDrop(items) }, [])} /> ) } const ListAppStatusBar = memo(() => { const treeList = useCreateTreeList(id) const numItems = treeList.state.currentItem.children ? treeList.state.currentItem.children.length : 0 return ( {treeList.state.history.map(item => ( {item.name} ))} {numItems} {pluralize('item', numItems)} ) })