diff --git templates/create-daml-app/daml/User.daml templates/create-daml-app/daml/User.daml --- templates/create-daml-app/daml/User.daml +++ templates/create-daml-app/daml/User.daml @@ -25,3 +25,22 @@ template User with archive self create this with following = userToFollow :: following -- FOLLOW_END + + -- SENDMESSAGE_BEGIN + nonconsuming choice SendMessage: ContractId Message with + sender: Party + content: Text + controller sender + do + assertMsg "Designated user must follow you back to send a message" (elem sender following) + create Message with sender, receiver = username, content + -- SENDMESSAGE_END + +-- MESSAGE_BEGIN +template Message with + sender: Party + receiver: Party + content: Text + where + signatory sender, receiver +-- MESSAGE_END diff --git templates/create-daml-app/ui/src/components/MainView.tsx templates/create-daml-app/ui/src/components/MainView.tsx --- templates/create-daml-app/ui/src/components/MainView.tsx +++ templates/create-daml-app/ui/src/components/MainView.tsx @@ -8,6 +8,10 @@ import { User } from '@daml.js/create-daml-app'; import { useParty, useLedger, useStreamFetchByKey, useStreamQuery } from '@daml/react'; import UserList from './UserList'; import PartyListEdit from './PartyListEdit'; +// IMPORTS_BEGIN +import MessageEdit from './MessageEdit'; +import MessageList from './MessageList'; +// IMPORTS_END // USERS_BEGIN const MainView: React.FC = () => { @@ -78,6 +82,22 @@ const MainView: React.FC = () => { /> {/* USERLIST_END */} + {/* MESSAGES_SEGMENT_BEGIN */} + +
+ + + Messages + Send a message to a follower + +
+ follower.username)} + /> + + +
+ {/* MESSAGES_SEGMENT_END */} diff --git templates/create-daml-app/ui/src/components/MessageEdit.tsx templates/create-daml-app/ui/src/components/MessageEdit.tsx --- /dev/null +++ templates/create-daml-app/ui/src/components/MessageEdit.tsx @@ -0,0 +1,70 @@ +// Copyright (c) 2020 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved. +// SPDX-License-Identifier: Apache-2.0 + +// MESSAGEEDIT_BEGIN +import React from 'react' +import { Form, Button } from 'semantic-ui-react'; +import { Party } from '@daml/types'; +import { User } from '@daml.js/create-daml-app'; +import { useParty, useLedger } from '@daml/react'; + +type Props = { + followers: Party[]; +} + +/** + * React component to edit a message to send to a follower. + */ +const MessageEdit: React.FC = ({followers}) => { + const sender = useParty(); + const [receiver, setReceiver] = React.useState(); + const [content, setContent] = React.useState(""); + const [isSubmitting, setIsSubmitting] = React.useState(false); + const ledger = useLedger(); + + const submitMessage = async (event: React.FormEvent) => { + try { + event.preventDefault(); + if (receiver === undefined) { + return; + } + setIsSubmitting(true); + await ledger.exerciseByKey(User.User.SendMessage, receiver, {sender, content}); + setContent(""); + } catch (error) { + alert(`Error sending message:\n${JSON.stringify(error)}`); + } finally { + setIsSubmitting(false); + } + }; + + return ( +
+ ({ key: follower, text: follower, value: follower }))} + value={receiver} + onChange={event => setReceiver(event.currentTarget.textContent ?? undefined)} + /> + setContent(event.currentTarget.value)} + /> +