import React, { useState, useEffect, useCallback, useMemo } from 'react'; import cn from 'classnames'; import { Grid, H4, HelpText, Flex } from 'indigo-react'; import { Just, Nothing } from 'folktale/maybe'; import * as ob from 'urbit-ob'; import View from 'components/View'; import Tabs from 'components/Tabs'; import Crumbs from 'components/Crumbs'; import Sigil from 'components/Sigil'; import Blinky from 'components/Blinky'; import NavHeader from 'components/NavHeader'; import { useLocalRouter } from 'lib/LocalRouter'; import useCurrentPointName from 'lib/useCurrentPointName'; import * as need from 'lib/need'; import { usePointCursor } from 'store/pointCursor'; import { usePointCache } from 'store/pointCache'; import Footer from 'components/Footer'; const NAMES = { REQUESTS: 'REQUESTS', ALL: 'ALL', }; const OPTIONS = [ { text: 'Requests', value: NAMES.REQUESTS }, { text: 'All', value: NAMES.ALL }, ]; const VIEWS = { [NAMES.REQUESTS]: Tab, [NAMES.ALL]: Tab, }; const PAGE_SIZE = 10; function Tab({ className, points, onAccept, onDecline, page, setPage }) { const start = page * PAGE_SIZE; const end = page * PAGE_SIZE + PAGE_SIZE; const pointsCount = points.map(ps => ps.length).getOrElse(0); const maxPage = Math.ceil(pointsCount / PAGE_SIZE) - 1; const hasNext = page < maxPage; const hasPrev = page > 0; const _points = points.map(ps => ps.slice(start, end)).getOrElse([]); const onNext = useCallback(() => { setPage(p => p + 1); }, [setPage]); const onPrev = useCallback(() => { setPage(p => p - 1); }, [setPage]); if (Nothing.hasInstance(points)) { return ; } return ( {_points.length === 0 && ( {Just.hasInstance(points) ? ( 'No points to display' ) : ( <> Loading... )} )} {_points.map(point => ( ))} {hasPrev && ( {'<-'} )} {maxPage > 0 && ( Page {page + 1} of {maxPage + 1} )} {hasNext && ( {'->'} )} ); } function Resident({ point, onAccept, onDecline }) { const patp = ob.patp(point); const sigilSize = 50; const isRequest = onAccept && onDecline; return ( <>
{patp}{' '} {isRequest && ( <> onAccept(point)}> Accept onDecline(point)}> Decline )} ); } export default function Residents() { const { pop, push, names } = useLocalRouter(); const name = useCurrentPointName(); const { pointCursor } = usePointCursor(); const point = need.point(pointCursor); const { getResidents, syncResidents } = usePointCache(); const goBack = useCallback(() => pop(), [pop]); useEffect(() => { syncResidents(point); }, [syncResidents, point]); const { residents, requests } = getResidents(point); const [currentTab, _setCurrentTab] = useState(NAMES.ALL); const [page, setPage] = useState(0); const setCurrentTab = useCallback( tab => { setPage(0); _setCurrentTab(tab); }, [setPage, _setCurrentTab] ); const isRequests = useMemo(() => currentTab === NAMES.REQUESTS, [currentTab]); const _onAccept = useCallback( adoptee => push(names.ADOPT, { adoptee, denied: false, }), [push, names] ); const onAccept = isRequests && _onAccept; const _onDecline = useCallback( adoptee => push(names.ADOPT, { adoptee, denied: true, }), [push, names] ); const onDecline = isRequests && _onDecline; const points = isRequests ? requests : residents; return ( Residents ); }