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).sort((a, b) => a.value - b.value),
12 point: point.isDefault ? point : points[point.value],
15export const EMPTY_POINT = new Point({
17 details: toL1Details({}),
21export interface RollerStore {
23 nextBatchTime: number;
24 nextQuotaTime: number;
25 pendingTransactions: PendingTransaction[];
31 recentlyCompleted: number;
32 inviteGeneratingNum: number;
33 invitesLoading: boolean;
34 setLoading: (loading: boolean) => void;
35 removeInvite: (point: number, planet: number) => void;
36 setInvites: (points: number, invites: Invite[]) => void;
37 setInviteGeneratingNum: (numGenerating: number) => void;
38 setInvitesLoading: (invitesLoading: boolean) => void;
39 setModalText: (modalText: string) => void;
40 setNextBatchTime: (nextBatchTime: number) => void;
41 setNextQuotaTime: (nextQuotaTime: number) => void;
42 setPendingTransactions: (pendingTransactions: PendingTransaction[]) => void;
43 setPoint: (point: number) => void;
44 setPoints: (points: Points) => void;
45 updateInvite: (point: number, invite: Invite) => void;
46 updatePoint: (point: Point) => void;
49export const useRollerStore = create<RollerStore>(set => ({
51 nextBatchTime: new Date().getTime() + HOUR,
52 nextQuotaTime: new Date().getTime() + 24 * HOUR,
53 pendingTransactions: [],
59 inviteGeneratingNum: 0,
60 invitesLoading: false,
61 setLoading: (loading: boolean) => set(() => ({ loading })),
62 setNextBatchTime: (nextBatchTime: number) => set(() => ({ nextBatchTime })),
63 setNextQuotaTime: (nextQuotaTime: number) => set(() => ({ nextQuotaTime })),
64 setPendingTransactions: (pendingTransactions: PendingTransaction[]) =>
66 const oldPending = state.pendingTransactions.length;
67 if (oldPending > 0 && pendingTransactions.length === 0) {
71 recentlyCompleted: oldPending,
74 return { ...state, pendingTransactions };
76 setPoint: (point: number) =>
77 set(state => ({ point: state.points[point] || EMPTY_POINT })),
78 setPoints: (points: Points) =>
79 set(({ point }) => getPointsAndList(points, point)),
80 setInvites: (point: number, invites: Invite[]) =>
82 const newInvites: Invites = {};
83 newInvites[point] = invites;
84 return { invites: Object.assign(state.invites, newInvites) };
86 setInviteGeneratingNum: (inviteGeneratingNum: number) =>
87 set(() => ({ inviteGeneratingNum })),
88 updateInvite: (point: number, invite: Invite) =>
90 const newInvites: Invites = {};
91 newInvites[point] = state.invites[point]?.map(i =>
92 i.planet === invite.planet ? invite : i
94 return { invites: Object.assign(state.invites, newInvites) };
96 removeInvite: (point: number, planet: number) =>
98 const newInvites: Invites = {};
99 newInvites[point] = state.invites[point]?.filter(
100 i => i.planet !== planet
102 return { invites: Object.assign(state.invites, newInvites) };
104 setInvitesLoading: (invitesLoading: boolean) =>
105 set(() => ({ invitesLoading })),
106 updatePoint: (newPoint: Point) =>
107 set(({ point, points }) => {
108 const newPoints: Points = Object.assign({}, points);
109 newPoints[newPoint.value] = newPoint;
110 return getPointsAndList(newPoints, point);
112 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