import * as React from "react"; import { Observable } from "rxjs"; import { IVoteQueryOptions as FilterOptions } from "@daostack/arc.js"; import { Arc as Protocol, ArcConfig as ProtocolConfig, InferredVote as Component, VoteEntity as Entity, VoteData as Data, DAO, DAOEntity, Member, MemberEntity, Proposal, ProposalEntity, CProps, ComponentList, ComponentListLogs, ComponentListProps, createFilterFromScope, } from "../"; import { CreateContextFeed } from "../runtime/ContextFeed"; type Scopes = "DAO" | "Member as voter" | "Proposal"; const scopeProps: Record = { DAO: "dao", "Member as voter": "voter", Proposal: "proposal", }; interface RequiredProps extends ComponentListProps { from?: Scopes; } interface InferredProps extends RequiredProps { config: ProtocolConfig; dao?: string; voter?: string; proposal?: string; } class InferredVotes extends ComponentList { createObservableEntities(): Observable { const { config, from, filter } = this.props; if (!config) { throw Error( "Arc Config Missing: Please provide this field as a prop, or use the inference component." ); } const f = createFilterFromScope(filter, from, scopeProps, this.props); return Entity.search(config.connection, f); } renderComponent( entity: Entity, children: any, index: number ): React.ComponentElement, any> { const { config } = this.props; if (!entity.id) { throw Error("Vote Entity ID undefined. This should never happen."); } return ( {children} ); } public static get Entities() { return CreateContextFeed( this.EntitiesContext.Consumer, this.LogsContext.Consumer, "Votes" ); } public static get Logs() { return CreateContextFeed( this.LogsContext.Consumer, this.LogsContext.Consumer, "Votes" ); } protected static EntitiesContext = React.createContext( undefined ); protected static LogsContext = React.createContext< ComponentListLogs | undefined >(undefined); } class Votes extends React.Component { render() { const { children, from, sort, filter } = this.props; return ( {(config: ProtocolConfig) => { switch (from) { case "DAO": return ( {(dao: DAOEntity) => ( {children} )} ); case "Member as voter": return ( {(voter: MemberEntity) => { if (!voter.id) { throw Error( "Member Entity ID undefined. This should never happen." ); } return ( {children} ); }} ); case "Proposal": return ( {(proposal: ProposalEntity) => ( {children} )} ); default: if (from) { throw Error(`Unsupported scope: ${from}`); } return ( {children} ); } }} ); } public static get Entities() { return InferredVotes.Entities; } public static get Logs() { return InferredVotes.Logs; } } export default Votes; export { Votes, InferredVotes };