const daoId = props.daoId; const proposalsPerPage = props.proposalsPerPage ?? 10; // Number of proposals to fetch at a time const apiUrl = `https://api.pikespeak.ai/daos/proposals`; const publicApiKey = "36f2b87a-7ee6-40d8-80b9-5e68e587a5b5"; const resPerPage = 10; State.init({ daoId, daos: [daoId], page: 0, }); const forgeUrl = (apiUrl, params) => apiUrl + Object.keys(params) .sort() .reduce((paramString, p) => paramString + `${p}=${params[p]}&`, "?"); const res = fetch( forgeUrl(apiUrl, { offset: state.page * resPerPage, limit: resPerPage, daos: state.daos, proposal_types: [], status: "", time_start: "", time_end: "", }), { mode: "cors", headers: { "x-api-key": publicApiKey, "no-cache": true, }, } ); if (res == null) { return "Loading..."; } if (!res.body) { return "something went wrong!"; } return ( <> {res.body.map(({ proposal, proposal_type, proposal_id }, i) => { proposal.kind = { [proposal_type]: { ...proposal.kind, }, }; proposal.id = proposal_id; if (proposal.status === "Removed") return null; return ( <Widget key={i} src={"sking.near/widget/DAO.Proposal"} props={{ daoId: state.daoId, proposal: proposal }} /> ); })} <div className="d-flex justify-content-center my-4"> <Widget src="nui.sking.near/widget/Navigation.PrevNext" props={{ hasPrev: state.page > 0, hasNext: res.body.length == resPerPage, onPrev: () => { State.update({ page: state.page - 1, }); }, onNext: () => { State.update({ page: state.page + 1, }); }, }} /> </div> </> );