diff --git a/frontend/src/components/BuyOfferDetailItem/BuyOfferDetailItem.js b/frontend/src/components/BuyOfferDetailItem/BuyOfferDetailItem.js index a5f9bc5e..ff875638 100644 --- a/frontend/src/components/BuyOfferDetailItem/BuyOfferDetailItem.js +++ b/frontend/src/components/BuyOfferDetailItem/BuyOfferDetailItem.js @@ -95,7 +95,7 @@ export default function BuyOfferDetailItem({ - Expires: {moment(expireTime*1000).fromNow()} ({expireTime}) + Expires: {moment(expireTime*1000).fromNow()} ) @@ -114,9 +114,7 @@ export default function BuyOfferDetailItem({ Node Pubkey: - { - console.info("I'm a button."); + >Node Pubkey: { goToLightningNodePage( offer.getNodePubkey(), offer.getNodeHost(), @@ -126,11 +124,6 @@ export default function BuyOfferDetailItem({ {offer.getNodePubkey()} - - - {PayOfferButton()} - - ) } diff --git a/frontend/src/components/BuySqueakDialog/BuySqueakDialog.js b/frontend/src/components/BuySqueakDialog/BuySqueakDialog.js new file mode 100644 index 00000000..38a296bf --- /dev/null +++ b/frontend/src/components/BuySqueakDialog/BuySqueakDialog.js @@ -0,0 +1,205 @@ +import React, {useState, useEffect} from 'react'; +import { + Paper, + IconButton, + Menu, + MenuItem, + Typography, + Grid, + Box, + Link, + Dialog, + DialogTitle, + DialogContent, + DialogContentText, + TextField, + DialogActions, + Button, + FormControl, + InputLabel, + Select, +} from "@material-ui/core"; + +import { MoreVert as MoreIcon } from "@material-ui/icons"; +import {useHistory} from "react-router-dom"; +import classnames from "classnames"; + +// styles +import useStyles from "./styles"; + +import Widget from "../../components/Widget"; +import SqueakThreadItem from "../../components/SqueakThreadItem"; +import BuyOfferItem from "../../components/BuyOfferItem"; +import BuyOfferDetailItem from "../../components/BuyOfferDetailItem"; + +import { + makeSqueakRequest, + getSigningProfilesRequest, +} from "../../squeakclient/requests" +import { + getBuyOffersRequest, + syncSqueakRequest, +} from "../../squeakclient/requests" +import { + payOfferRequest, +} from "../../squeakclient/requests" + + +export default function BuySqueakDialog({ + open, + handleClose, + hash, + ...props +}) { + var classes = useStyles(); + const history = useHistory(); + + var [selectedOfferId, setSelectedOfferId] = useState(-1); + const [offers, setOffers] = useState([]); + + const resetFields = () => { + setSelectedOfferId(-1); + }; + + const handleChange = (event) => { + setSelectedOfferId(event.target.value); + }; + + const handleResponse = (response) => { + // Open pay confirmation dialog + }; + + const handleErr = (err) => { + alert('Error paying offer: ' + err); + }; + + // const payOffer = (offerID) => { + // alert('Pay offer ID here: ' + offerID); + // pay(offer.getOfferId()); + // }; + + const loadOffers = () => { + getBuyOffersRequest(hash, setOffers); + }; + + const handlePayResponse = (response) => { + // goToSqueakPage(offer.getSqueakHash()); + reloadRoute(); + }; + + const handlePayErr = (err) => { + alert('Payment failure: ' + err); + }; + + const pay = (offerId) => { + payOfferRequest(offerId, handlePayResponse, handlePayErr); + }; + + const reloadRoute = () => { + history.go(0); + }; + + const getSelectedOffer = () => { + var offer; + for (offer of offers) { + if (offer.getOfferId() == selectedOfferId) { + return offer; + } + } + return null; + }; + + useEffect(() => { + loadOffers() + }, []); + + function handleSubmit(event) { + event.preventDefault(); + console.log( 'selectedOfferId:', selectedOfferId); + if (selectedOfferId == -1) { + alert('Selected Offer Id must be selected.'); + return; + } + pay(selectedOfferId); + handleClose(); + } + + function MakeSelectSigningProfile() { + return ( + + Offer + + + ) + } + + function MakeSqueakContentInput() { + var selectedOffer = getSelectedOffer(); + if (selectedOffer == null) { + return <> + } + return ( + + + + + ) + } + + function MakeCancelButton() { + return ( + + ) + } + + function MakeSqueakButton() { + return ( + + ) + } + + return ( + + Buy Squeak +
+ + {MakeSelectSigningProfile()} + {MakeSqueakContentInput()} + + + {MakeCancelButton()} + {MakeSqueakButton()} + +
+
+ ) +} diff --git a/frontend/src/components/BuySqueakDialog/package.json b/frontend/src/components/BuySqueakDialog/package.json new file mode 100644 index 00000000..6e75516f --- /dev/null +++ b/frontend/src/components/BuySqueakDialog/package.json @@ -0,0 +1,6 @@ +{ + "name": "BuySqueakDialog", + "version": "0.0.0", + "private": true, + "main": "BuySqueakDialog.js" +} diff --git a/frontend/src/components/BuySqueakDialog/styles.js b/frontend/src/components/BuySqueakDialog/styles.js new file mode 100644 index 00000000..f2d64da1 --- /dev/null +++ b/frontend/src/components/BuySqueakDialog/styles.js @@ -0,0 +1,43 @@ +import { makeStyles } from "@material-ui/styles"; + +export default makeStyles(theme => ({ + widgetWrapper: { + display: "flex", + minHeight: "100%", + }, + widgetHeader: { + padding: theme.spacing(3), + paddingBottom: theme.spacing(1), + display: "flex", + justifyContent: "space-between", + alignItems: "center", + }, + widgetRoot: { + boxShadow: theme.customShadows.widget, + }, + widgetBody: { + paddingBottom: theme.spacing(3), + paddingRight: theme.spacing(3), + paddingLeft: theme.spacing(3), + }, + noPadding: { + padding: 0, + }, + paper: { + display: "flex", + flexDirection: "column", + flexGrow: 1, + overflow: "hidden", + }, + moreButton: { + margin: -theme.spacing(1), + padding: 0, + width: 40, + height: 40, + color: theme.palette.text.hint, + "&:hover": { + backgroundColor: theme.palette.primary.main, + color: "rgba(255, 255, 255, 0.35)", + }, + }, +})); diff --git a/frontend/src/components/SqueakDetailItem/SqueakDetailItem.js b/frontend/src/components/SqueakDetailItem/SqueakDetailItem.js index 2d6d247c..4d388ef6 100644 --- a/frontend/src/components/SqueakDetailItem/SqueakDetailItem.js +++ b/frontend/src/components/SqueakDetailItem/SqueakDetailItem.js @@ -30,6 +30,8 @@ import useStyles from "./styles"; import Widget from "../../components/Widget"; import MakeSqueakDialog from "../../components/MakeSqueakDialog"; import DeleteSqueakDialog from "../../components/DeleteSqueakDialog"; +import BuySqueakDialog from "../../components/BuySqueakDialog"; + import { syncSqueakRequest, @@ -54,6 +56,7 @@ export default function SqueakDetailItem({ const history = useHistory(); const [replyDialogOpen, setReplyDialogOpen] = useState(false); const [deleteDialogOpen, setDeleteDialogOpen] = useState(false); + const [buyDialogOpen, setBuyDialogOpen] = useState(false); const handleClickOpen = () => { setReplyDialogOpen(true); @@ -72,6 +75,14 @@ export default function SqueakDetailItem({ setDeleteDialogOpen(false); }; + const handleClickOpenBuyDialog = () => { + setBuyDialogOpen(true); + }; + + const handleCloseBuyDialog = () => { + setBuyDialogOpen(false); + }; + const goToSqueakAddressPage = () => { history.push("/app/squeakaddress/" + squeak.getAuthorAddress()); }; @@ -137,7 +148,8 @@ export default function SqueakDetailItem({ if (!squeak) { return; } - goToBuyPage(squeak.getSqueakHash()); + // goToBuyPage(squeak.getSqueakHash()); + handleClickOpenBuyDialog(); } const onDownloadClick = (event) => { @@ -283,6 +295,18 @@ export default function SqueakDetailItem({ ) } + function BuyDialogContent() { + return ( + <> + + + ) + } + return ( <> {MakeSqueakDialogContent()} {DeleteSqueakDialogContent()} + {BuyDialogContent()} ) }