on bb22285 help sign in
bridge/src/store/rollerStore.ts
113 lines 4.0 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 } from 'lib/types/Point';
7import { toL1Details } from 'lib/utils/point';
9const getPointsAndList = (points: Points, point: Point) => ({
10 points,
11 pointList: Object.values(points).sort((a, b) => a.value - b.value),
12 point: point.isDefault ? point : points[point.value],
13});
15export const EMPTY_POINT = new Point({
16 value: -1,
17 details: toL1Details({}),
18 address: '',
19});
21export interface RollerStore {
22 loading: boolean;
23 nextBatchTime: number;
24 nextQuotaTime: number;
25 pendingTransactions: PendingTransaction[];
26 point: Point;
27 points: Points;
28 pointList: Point[];
29 invites: Invites;
30 modalText?: string;
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 => ({
50 loading: false,
51 nextBatchTime: new Date().getTime() + HOUR,
52 nextQuotaTime: new Date().getTime() + 24 * HOUR,
53 pendingTransactions: [],
54 point: EMPTY_POINT,
55 pointList: [],
56 points: {},
57 invites: {},
58 recentlyCompleted: 0,
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[]) =>
65 set(state => {
66 const oldPending = state.pendingTransactions.length;
67 if (oldPending > 0 && pendingTransactions.length === 0) {
68 return {
69 ...state,
70 pendingTransactions,
71 recentlyCompleted: oldPending,
72 };
73 }
74 return { ...state, pendingTransactions };
75 }),
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[]) =>
81 set(state => {
82 const newInvites: Invites = {};
83 newInvites[point] = invites;
84 return { invites: Object.assign(state.invites, newInvites) };
85 }),
86 setInviteGeneratingNum: (inviteGeneratingNum: number) =>
87 set(() => ({ inviteGeneratingNum })),
88 updateInvite: (point: number, invite: Invite) =>
89 set(state => {
90 const newInvites: Invites = {};
91 newInvites[point] = state.invites[point]?.map(i =>
92 i.planet === invite.planet ? invite : i
93 );
94 return { invites: Object.assign(state.invites, newInvites) };
95 }),
96 removeInvite: (point: number, planet: number) =>
97 set(state => {
98 const newInvites: Invites = {};
99 newInvites[point] = state.invites[point]?.filter(
100 i => i.planet !== planet
101 );
102 return { invites: Object.assign(state.invites, newInvites) };
103 }),
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);
111 }),
112 setModalText: (modalText?: string) => set(() => ({ modalText })),
113}));