import * as React from "react"; import { Observable } from "rxjs"; import { CProps, ComponentList, ComponentListProps } from "../runtime"; import { Arc as Protocol, ArcConfig as ProtocolConfig } from "../protocol"; import { DAO as InferComponent, DAOEntity as InferEntity, DAOMember as Component, MemberEntity as Entity, MemberData as Data } from "./"; import { IMemberQueryOptions as FilterOptions } from "@daostack/client"; // TODO: find better way of handling inference... this gets complicated when there are multiple // points of inferrance such as votes (MemberVotes, DAOVotes, ProposalVotes). Maybe have a prop // that is { allDAOs?: boolean; } interface ArcInferredProps { arcConfig: ProtocolConfig | undefined; } interface DAOInferredProps { dao: InferEntity | undefined; } type ArcProps = RequiredProps & ArcInferredProps; type DAOProps = RequiredProps & DAOInferredProps; class ArcMembers extends ComponentList { createObservableEntities(): Observable { const { arcConfig, filter } = this.props; if (!arcConfig) { throw Error("Arc Config Missing: Please provide this field as a prop, or use the inference component."); } return Entity.search(arcConfig.connection, filter); } renderComponent(entity: Entity, children: any): React.ComponentElement, any> { // TODO: support creating Components with just an Entity, it makes no sense to recreate the Member entity here... return ( {children} ); } } class DAOMembers extends ComponentList { // TODO: remove this when filters are added // also rename all instances of "Arc" to protocol? createObservableEntities(): Observable { const { dao, filter } = this.props; if (!dao) { throw Error("DAO Entity Missing: Please provide this field as a prop, or use the inference component."); } const daoFilter: FilterOptions = filter ? filter : { where: { } }; if (!daoFilter.where) { daoFilter.where = { }; } daoFilter.where.dao = dao.id; return Entity.search(dao.context, daoFilter); } renderComponent(entity: Entity, children: any): React.ComponentElement, any> { const { dao } = this.props; return ( {children} ); } } class Members extends React.Component { render() { const { children, allDAOs, sort, filter } = this.props; if (allDAOs) { return ( {(arcConfig: ProtocolConfig) => ( {children} )} ); } else { return ( {(dao: InferEntity) => ( {children} )} ); } } } export default Members; export { ArcMembers, DAOMembers, Members };