on 368f024 help sign in
bridge/src/store/rollerStore.ts
73 lines 2.6 kB history raw
1import create from 'zustand';
2import { PendingTransaction } from '@urbit/roller-api';
4import { HOUR } from 'lib/utils/roller';
5import { Invite } from 'lib/types/Invite';
6import Point, { Points, Relationship } from 'lib/types/Point';
7import { toL1Details } from 'lib/utils/point';
9export const EMPTY_POINT = new Point(-1, Relationship.own, toL1Details({}), '');
11export interface RollerStore {
12 nextBatchTime: number;
13 pendingTransactions: PendingTransaction[];
14 point: Point;
15 points: Points;
16 pointList: Point[];
17 invitePoints: number[];
18 invites: Invite[];
19 recentlyCompleted: number;
20 inviteGeneratingNum: number;
21 removeInvite: (point: number) => void;
22 setNextBatchTime: (nextBatchTime: number) => void;
23 setPendingTransactions: (pendingTransactions: PendingTransaction[]) => void;
24 setPoint: (point: number) => void;
25 setPoints: (points: Points) => void;
26 setInvitePoints: (points: number[]) => void;
27 setInvites: (invites: Invite[]) => void;
28 setInviteGeneratingNum: (numGenerating: number) => void;
29 updateInvite: (invite: Invite) => void;
32export const useRollerStore = create<RollerStore>(set => ({
33 nextBatchTime: new Date().getTime() + HOUR,
34 pendingTransactions: [],
35 point: EMPTY_POINT,
36 pointList: [],
37 points: {},
38 invitePoints: [],
39 invites: [],
40 recentlyCompleted: 0,
41 inviteGeneratingNum: 0,
42 removeInvite: (point: number) =>
43 set(state => ({
44 invites: state.invites.filter(({ planet }) => point !== planet),
45 })),
46 setNextBatchTime: (nextBatchTime: number) => set(() => ({ nextBatchTime })),
47 setPendingTransactions: (pendingTransactions: PendingTransaction[]) =>
48 set(state => {
49 const oldPending = state.pendingTransactions.length;
50 if (oldPending > 0 && pendingTransactions.length === 0) {
51 return {
52 ...state,
53 pendingTransactions,
54 recentlyCompleted: oldPending,
55 };
56 }
57 return { ...state, pendingTransactions };
58 }),
59 setPoint: (point: number) =>
60 set(state => ({ point: state.points[point] || EMPTY_POINT })),
61 setPoints: (points: Points) =>
62 set(() => ({ points, pointList: Object.values(points) })),
63 setInvitePoints: (invitePoints: number[]) => set(() => ({ invitePoints })),
64 setInvites: (invites: Invite[]) => set(() => ({ invites })),
65 setInviteGeneratingNum: (inviteGeneratingNum: number) =>
66 set(() => ({ inviteGeneratingNum })),
67 updateInvite: (invite: Invite) =>
68 set(state => ({
69 invites: state.invites.map(i =>
70 i.planet === invite.planet ? invite : i
71 ),
72 })),
73}));