on bf97291 help sign in
bridge/src/store/rollerStore.ts
109 lines 3.9 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),
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 nextBatchTime: number;
23 nextQuotaTime: number;
24 pendingTransactions: PendingTransaction[];
25 point: Point;
26 points: Points;
27 pointList: Point[];
28 invites: Invites;
29 modalText?: string;
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: [],
51 point: EMPTY_POINT,
52 pointList: [],
53 points: {},
54 invites: {},
55 recentlyCompleted: 0,
56 inviteGeneratingNum: 0,
57 invitesLoading: false,
58 setNextBatchTime: (nextBatchTime: number) => set(() => ({ nextBatchTime })),
59 setNextQuotaTime: (nextQuotaTime: number) => set(() => ({ nextQuotaTime })),
60 setPendingTransactions: (pendingTransactions: PendingTransaction[]) =>
61 set(state => {
62 const oldPending = state.pendingTransactions.length;
63 if (oldPending > 0 && pendingTransactions.length === 0) {
64 return {
65 ...state,
66 pendingTransactions,
67 recentlyCompleted: oldPending,
68 };
69 }
70 return { ...state, pendingTransactions };
71 }),
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[]) =>
77 set(state => {
78 const newInvites: Invites = {};
79 newInvites[point] = invites;
80 return { invites: Object.assign(state.invites, newInvites) };
81 }),
82 setInviteGeneratingNum: (inviteGeneratingNum: number) =>
83 set(() => ({ inviteGeneratingNum })),
84 updateInvite: (point: number, invite: Invite) =>
85 set(state => {
86 const newInvites: Invites = {};
87 newInvites[point] = state.invites[point]?.map(i =>
88 i.planet === invite.planet ? invite : i
89 );
90 return { invites: Object.assign(state.invites, newInvites) };
91 }),
92 removeInvite: (point: number, planet: number) =>
93 set(state => {
94 const newInvites: Invites = {};
95 newInvites[point] = state.invites[point]?.filter(
96 i => i.planet !== planet
97 );
98 return { invites: Object.assign(state.invites, newInvites) };
99 }),
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);
107 }),
108 setModalText: (modalText?: string) => set(() => ({ modalText })),
109}));