1import create from 'zustand';
2import { PendingTransaction } from '@urbit/roller-api';
4import { HOUR } from 'lib/utils/roller';
5import { Invite, Invites } from 'lib/types/Invite';
6import Point, { Points } from 'lib/types/Point';
7import { toL1Details } from 'lib/utils/point';
9const getPointsAndList = (points: Points, point: Point) => ({
11 pointList: Object.values(points),
12 point: point.isDefault ? point : points[point.value],
15export const EMPTY_POINT = new Point({
17 details: toL1Details({}),
21export interface RollerStore {
22 nextBatchTime: number;
23 nextQuotaTime: number;
24 pendingTransactions: PendingTransaction[];
30 recentlyCompleted: number;
31 inviteGeneratingNum: number;
32 invitesLoading: boolean;
33 removeInvite: (point: number, planet: number) => void;
34 setInvites: (points: number, invites: Invite[]) => void;
35 setInviteGeneratingNum: (numGenerating: number) => void;
36 setInvitesLoading: (invitesLoading: boolean) => void;
37 setModalText: (modalText: string) => void;
38 setNextBatchTime: (nextBatchTime: number) => void;
39 setNextQuotaTime: (nextQuotaTime: number) => void;
40 setPendingTransactions: (pendingTransactions: PendingTransaction[]) => void;
41 setPoint: (point: number) => void;
42 setPoints: (points: Points) => void;
43 updateInvite: (point: number, invite: Invite) => void;
44 updatePoint: (point: Point) => void;
47export const useRollerStore = create<RollerStore>(set => ({
48 nextBatchTime: new Date().getTime() + HOUR,
49 nextQuotaTime: new Date().getTime() + 24 * HOUR,
50 pendingTransactions: [],
56 inviteGeneratingNum: 0,
57 invitesLoading: false,
58 setNextBatchTime: (nextBatchTime: number) => set(() => ({ nextBatchTime })),
59 setNextQuotaTime: (nextQuotaTime: number) => set(() => ({ nextQuotaTime })),
60 setPendingTransactions: (pendingTransactions: PendingTransaction[]) =>
62 const oldPending = state.pendingTransactions.length;
63 if (oldPending > 0 && pendingTransactions.length === 0) {
67 recentlyCompleted: oldPending,
70 return { ...state, pendingTransactions };
72 setPoint: (point: number) =>
73 set(state => ({ point: state.points[point] || EMPTY_POINT })),
74 setPoints: (points: Points) =>
75 set(({ point }) => getPointsAndList(points, point)),
76 setInvites: (point: number, invites: Invite[]) =>
78 const newInvites: Invites = {};
79 newInvites[point] = invites;
80 return { invites: Object.assign(state.invites, newInvites) };
82 setInviteGeneratingNum: (inviteGeneratingNum: number) =>
83 set(() => ({ inviteGeneratingNum })),
84 updateInvite: (point: number, invite: Invite) =>
86 const newInvites: Invites = {};
87 newInvites[point] = state.invites[point]?.map(i =>
88 i.planet === invite.planet ? invite : i
90 return { invites: Object.assign(state.invites, newInvites) };
92 removeInvite: (point: number, planet: number) =>
94 const newInvites: Invites = {};
95 newInvites[point] = state.invites[point]?.filter(
96 i => i.planet !== planet
98 return { invites: Object.assign(state.invites, newInvites) };
100 setInvitesLoading: (invitesLoading: boolean) =>
101 set(() => ({ invitesLoading })),
102 updatePoint: (newPoint: Point) =>
103 set(({ point, points }) => {
104 const newPoints: Points = Object.assign({}, points);
105 newPoints[newPoint.value] = newPoint;
106 return getPointsAndList(newPoints, point);
108 setModalText: (modalText?: string) => set(() => ({ modalText })),
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list