on afdb680 help sign in
bridge/src/store/rollerStore.ts
85 lines 3.1 kB history raw
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, 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 invites: Invites;
18 recentlyCompleted: number;
19 inviteGeneratingNum: number;
20 invitesLoading: boolean;
21 setNextBatchTime: (nextBatchTime: number) => void;
22 setPendingTransactions: (pendingTransactions: PendingTransaction[]) => void;
23 setPoint: (point: number) => void;
24 setPoints: (points: Points) => void;
25 setInvites: (points: number, invites: Invite[]) => void;
26 setInviteGeneratingNum: (numGenerating: number) => void;
27 updateInvite: (point: number, invite: Invite) => void;
28 removeInvite: (point: number, planet: number) => void;
29 setInvitesLoading: (invitesLoading: boolean) => void;
32export const useRollerStore = create<RollerStore>(set => ({
33 nextBatchTime: new Date().getTime() + HOUR,
34 pendingTransactions: [],
35 point: EMPTY_POINT,
36 pointList: [],
37 points: {},
38 invites: {},
39 recentlyCompleted: 0,
40 inviteGeneratingNum: 0,
41 invitesLoading: false,
42 setNextBatchTime: (nextBatchTime: number) => set(() => ({ nextBatchTime })),
43 setPendingTransactions: (pendingTransactions: PendingTransaction[]) =>
44 set(state => {
45 const oldPending = state.pendingTransactions.length;
46 if (oldPending > 0 && pendingTransactions.length === 0) {
47 return {
48 ...state,
49 pendingTransactions,
50 recentlyCompleted: oldPending,
51 };
52 }
53 return { ...state, pendingTransactions };
54 }),
55 setPoint: (point: number) =>
56 set(state => ({ point: state.points[point] || EMPTY_POINT })),
57 setPoints: (points: Points) =>
58 set(() => ({ points, pointList: Object.values(points) })),
59 setInvites: (point: number, invites: Invite[]) =>
60 set(state => {
61 const newInvites: Invites = {};
62 newInvites[point] = invites;
63 return { invites: Object.assign(state.invites, newInvites) };
64 }),
65 setInviteGeneratingNum: (inviteGeneratingNum: number) =>
66 set(() => ({ inviteGeneratingNum })),
67 updateInvite: (point: number, invite: Invite) =>
68 set(state => {
69 const newInvites: Invites = {};
70 newInvites[point] = state.invites[point]?.map(i =>
71 i.planet === invite.planet ? invite : i
72 );
73 return { invites: Object.assign(state.invites, newInvites) };
74 }),
75 removeInvite: (point: number, planet: number) =>
76 set(state => {
77 const newInvites: Invites = {};
78 newInvites[point] = state.invites[point]?.filter(
79 i => i.planet !== planet
80 );
81 return { invites: Object.assign(state.invites, newInvites) };
82 }),
83 setInvitesLoading: (invitesLoading: boolean) =>
84 set(() => ({ invitesLoading })),
85}));