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
);
}