|
| 1 | +import { Deltas, partitionEntries } from "@/util/watchEntries" |
1 | 2 | import { blake2b } from "@noble/hashes/blake2b"
|
| 3 | +import { combineKeys, toKeySet } from "@react-rxjs/utils" |
2 | 4 | import { Binary, TxEvent } from "polkadot-api"
|
| 5 | +import { map, scan } from "rxjs" |
3 | 6 | import { getPreimageResolver } from "../preimages"
|
4 | 7 | import { originToTrack, polkadotSpenderOrigin } from "./chainConfig"
|
5 | 8 | import {
|
@@ -133,6 +136,70 @@ export function createReferendaSdk(
|
133 | 136 | })
|
134 | 137 | .filter((v) => !!v)
|
135 | 138 | }
|
| 139 | + async function getOngoingReferendum(id: number) { |
| 140 | + const referendum = |
| 141 | + await typedApi.query.Referenda.ReferendumInfoFor.getValue(id) |
| 142 | + if (referendum?.type === "Ongoing") { |
| 143 | + return enhanceOngoingReferendum(id, referendum.value) |
| 144 | + } |
| 145 | + return null |
| 146 | + } |
| 147 | + |
| 148 | + const [rawReferendumById$, referendaKeyChange$] = partitionEntries( |
| 149 | + typedApi.query.Referenda.ReferendumInfoFor.watchEntries().pipe( |
| 150 | + scan( |
| 151 | + (acc, v) => { |
| 152 | + if (!v.deltas) return { ...acc, deltas: null } |
| 153 | + const deleted = v.deltas.deleted.map((v) => ({ |
| 154 | + ...v, |
| 155 | + value: v.value.value as RawOngoingReferendum, |
| 156 | + })) |
| 157 | + const upserted = v.deltas.upserted |
| 158 | + .map((v) => { |
| 159 | + if (v.value.type === "Ongoing") { |
| 160 | + acc.referendums[v.args[0]] = v.value.value |
| 161 | + return { |
| 162 | + args: v.args, |
| 163 | + value: v.value.value, |
| 164 | + } |
| 165 | + } |
| 166 | + if (v.args[0] in acc.referendums) { |
| 167 | + // An Ongoing has become closed, remove from list |
| 168 | + deleted.push({ |
| 169 | + args: v.args, |
| 170 | + value: acc.referendums[v.args[0]], |
| 171 | + }) |
| 172 | + delete acc.referendums[v.args[0]] |
| 173 | + } |
| 174 | + return null! |
| 175 | + }) |
| 176 | + .filter(Boolean) |
| 177 | + |
| 178 | + return { |
| 179 | + referendums: acc.referendums, |
| 180 | + deltas: { deleted, upserted }, |
| 181 | + } |
| 182 | + }, |
| 183 | + { |
| 184 | + referendums: {} as Record<number, RawOngoingReferendum>, |
| 185 | + deltas: null as Deltas<RawOngoingReferendum> | null, |
| 186 | + }, |
| 187 | + ), |
| 188 | + ), |
| 189 | + ) |
| 190 | + |
| 191 | + const getOngoingReferendumById$ = (id: number) => |
| 192 | + rawReferendumById$(id).pipe( |
| 193 | + map((entry) => enhanceOngoingReferendum(id, entry)), |
| 194 | + ) |
| 195 | + const ongoingReferenda$ = combineKeys( |
| 196 | + referendaKeyChange$, |
| 197 | + getOngoingReferendumById$, |
| 198 | + ) |
| 199 | + const ongoingReferendaIds$ = referendaKeyChange$.pipe( |
| 200 | + toKeySet(), |
| 201 | + map((set) => [...set]), |
| 202 | + ) |
136 | 203 |
|
137 | 204 | const getSpenderTrack: ReferendaSdk["getSpenderTrack"] = (value) => {
|
138 | 205 | const spenderOriginType = spenderOrigin(value)
|
@@ -223,7 +290,13 @@ export function createReferendaSdk(
|
223 | 290 | : null
|
224 | 291 |
|
225 | 292 | return {
|
| 293 | + watch: { |
| 294 | + ongoingReferenda$, |
| 295 | + getOngoingReferendumById$, |
| 296 | + ongoingReferendaIds$, |
| 297 | + }, |
226 | 298 | getOngoingReferenda,
|
| 299 | + getOngoingReferendum, |
227 | 300 | getSpenderTrack,
|
228 | 301 | getTrack,
|
229 | 302 | createReferenda,
|
|
0 commit comments