UNPKG

namillum

Version:
454 lines (404 loc) 14.1 kB
--- id: dev-rentonzilliqa-modals title: Modals keywords: - react - rentonzilliqa - modals - frontend description: Creating the Modals for the RentOnZilliqa frontend application --- --- In this section, we will create the Modals for the frontend application. We use the [`Modal`](dev-rentonzilliqa-components.md#modal) component that we created earlier. ## Create Account Modal We start with [Create Account Modal](dev-rentonzilliqa-frontend.mdx#account-creation-and-zilpay) that will be used to connect to the ZilPay wallet as well as access the smart contract. It uses [`Input`](dev-rentonzilliqa-components.md#input) and [`Button`](dev-rentonzilliqa-components.md#button) components. It uses [`CheckBox`](dev-rentonzilliqa-components.md#checkbox) for selecting the user role. A button is presented for connecting ZilPay when required. The [`createAccountTransition`](#createaccounttransition) function is used. ```tsx import React, { useEffect, useState } from "react"; import ContextContainer from "../functions/contextContainer"; import createUserTransition from "../functions/createUserTransition"; import Button from "./componentButton"; import Input from "./componentInput"; import Modal from "./componentModal"; import Tick from "./componentTick"; type props = { showSignUp: boolean; setShowSignUp(visible: boolean): void; }; const CreateAccountModal: React.FC<props> = (props) => { const { showSignUp, setShowSignUp } = props; const [name, setName] = useState<string | undefined>(undefined); const [userRole, setUserRole] = useState<string | undefined>("host"); const { zilPay, contract } = ContextContainer.useContainer(); const createUser = async () => { const role = userRole === "host" ? "1" : "0"; createUserTransition(contract, zilPay, name, role); }; const connectZilPay = async () => { await zilPay.wallet.connect(); window.location.reload(); }; useEffect(() => { setName(undefined); setUserRole("host"); }, [setShowSignUp]); return ( <Modal title="Create Account" visible={showSignUp} setVisible={setShowSignUp} buttonText={"Create Account"} onClick={createUser} > <> {!zilPay.wallet.isConnect && ( <> <h4 className="text-xs font-semibold text-gray-500 tracking-wide uppercase py-4"> ZilPay </h4> <Button text={"Connect ZilPay"} padding onClick={connectZilPay} modal /> </> )} <Input name="Your name" value={name} setValue={setName} /> <h4 className="text-xs font-semibold text-gray-500 tracking-wide uppercase py-4"> Please select one </h4> <div className="flex gap-12 mb-8"> <div className="flex justify-center items-center cursor-pointer" onClick={() => setUserRole("host")} > <p className="text-lg text-gray-800 pr-4">Host</p> <div className={`p-1 bg-gray-200 rounded-lg w-8 h-8 hover:scale-95 transform transition-all ${ userRole === "host" ? "" : "hover:bg-gray-300" }`} > <div className={`w-full h-full rounded transition-colors text-transparent ${ userRole === "host" ? "bg-gray-900 text-gray-200" : "" }`} > {userRole === "host" && <Tick />} </div> </div> </div> <div className="flex justify-center items-center cursor-pointer" onClick={() => setUserRole("renter")} > <p className="text-lg text-gray-800 pr-4">Rent</p> <div className={`p-1 bg-gray-200 rounded-lg w-8 h-8 hover:scale-95 transform transition-all ${ userRole !== "host" ? "" : "hover:bg-gray-300" }`} > <div className={`w-full h-full rounded transition-colors text-transparent ${ userRole !== "host" ? "bg-gray-900 text-gray-200" : "" }`} > {userRole !== "host" && <Tick />} </div> </div> </div> </div> </> </Modal> ); }; export default CreateAccountModal; ``` [`/src/components/componentCreateAccountModal.tsx`](https://github.com/Quinence/zilliqa-fullstack-app/blob/main/src/components/componentCreateAccountModal.tsx) <br/> ## Create Listing Modal We now get to the [Create Listing Modal](dev-rentonzilliqa-frontend.mdx) that will be used by host users to post new listings. It uses [`Input`](dev-rentonzilliqa-components.md#input) and [`Button`](dev-rentonzilliqa-components.md#button) components. It uses [`AmenitiesInput`](dev-rentonzilliqa-components.md#amenitiesinput) for selecting the available amenities. A button is presented for connecting ZilPay when required. The [`createListingTransition`](#createlistingtransition) function is used. ```tsx import React, { useEffect, useState } from "react"; import ContextContainer from "../functions/contextContainer"; import createListingTransition from "../functions/createListingTransition"; import AmenitiesInput from "./componentAmenitiesInput"; import Input from "./componentInput"; import Modal from "./componentModal"; type props = { showCreateListing: boolean; setShowCreateListing(visible: boolean): void; }; const CreateListingModal: React.FC<props> = (props) => { const { showCreateListing, setShowCreateListing } = props; const [name, setName] = useState<string | undefined>(undefined); const [description, setDescription] = useState<string | undefined>(undefined); const [price, setPrice] = useState<string | undefined>(undefined); const [rooms, setRooms] = useState<string | undefined>(undefined); const [bathrooms, setBathrooms] = useState<string | undefined>(undefined); const [location, setLocation] = useState<string | undefined>(undefined); const [image, setImage] = useState<string | undefined>(undefined); const [wifi, setWifi] = useState<boolean>(false); const [kitchen, setKitchen] = useState<boolean>(false); const [tv, setTv] = useState<boolean>(false); const [laundry, setLaundry] = useState<boolean>(false); const [hvac, setHvac] = useState<boolean>(false); const { contract, zilPay } = ContextContainer.useContainer(); const createListing = () => { if ( !name || !description || !price || !rooms || !bathrooms || !location || !image ) return; createListingTransition( contract, zilPay, name, description, price, rooms, bathrooms, image, location, wifi, kitchen, tv, laundry, hvac ); }; useEffect(() => { setName(undefined); setDescription(undefined); setPrice(undefined); setRooms(undefined); setBathrooms(undefined); setLocation(undefined); setImage(undefined); setWifi(false); setKitchen(false); setTv(false); setLaundry(false); setHvac(false); }, [showCreateListing]); return ( <Modal title="Create Listing" visible={showCreateListing} setVisible={setShowCreateListing} buttonText={"Create"} onClick={createListing} > <Input name="Name" value={name} setValue={setName} /> <Input name="Description" value={description} setValue={setDescription} /> <Input name="Rooms" value={rooms} type="number" setValue={setRooms} /> <Input name="Bathrooms" value={bathrooms} type="number" setValue={setBathrooms} /> <Input name="Price (ZIL)" unit="per night" value={price} type="number" setValue={setPrice} /> <Input name="Image URL" value={image} type="text" setValue={setImage} /> <Input name="Google Maps Plus Code" value={location} type="text" setValue={setLocation} /> <AmenitiesInput {...{ wifi, setWifi, kitchen, setKitchen, tv, setTv, laundry, setLaundry, hvac, setHvac, }} /> </Modal> ); }; export default CreateListingModal; ``` [`/src/components/componentCreateListingModal.tsx`](https://github.com/Quinence/zilliqa-fullstack-app/blob/main/src/components/componentCreateListingModal.tsx) <br/> ## Manage Listing Modal We now get to the [Create Listing Modal](dev-rentonzilliqa-frontend.mdx#creating-and-managing-listings) that will be used by host users to post new listings. It uses [`Input`](dev-rentonzilliqa-components.md#modal) and [`Button`](dev-rentonzilliqa-components.md#button) components. It uses [`AmenitiesInput`](dev-rentonzilliqa-components.md#amenitiesinput) for selecting the available amenities. A button is presented for connecting ZilPay when required. The [`deleteListingTransition`](#createlistingtransition), [`updateListingTransition`](#updatelistingtransition), and [`claimRentTransition`](#claimrenttransition) functions are called as required. ```tsx import React, { useEffect, useState } from "react"; import claimRentTransition from "../functions/claimRentTransition"; import ContextContainer from "../functions/contextContainer"; import deleteListingTransition from "../functions/deleteListingTransition"; import updateListingTransition from "../functions/updateListingTransition"; import AmenitiesInput from "./componentAmenitiesInput"; import Button from "./componentButton"; import Input from "./componentInput"; import Modal from "./componentModal"; type props = { modalListing: any; showManageListing: boolean; setShowManageListing(visible: boolean): void; }; const ManageListingModal: React.FC<props> = (props) => { const { showManageListing, setShowManageListing, modalListing } = props; const { id, accumulated_rent } = modalListing; const [name, setName] = useState<string | undefined>(undefined); const [description, setDescription] = useState<string | undefined>(undefined); const [price, setPrice] = useState<string | undefined>(undefined); const [rooms, setRooms] = useState<string | undefined>(undefined); const [bathrooms, setBathrooms] = useState<string | undefined>(undefined); const [location, setLocation] = useState<string | undefined>(undefined); const [image, setImage] = useState<string | undefined>(undefined); const [wifi, setWifi] = useState<boolean>(false); const [kitchen, setKitchen] = useState<boolean>(false); const [tv, setTv] = useState<boolean>(false); const [laundry, setLaundry] = useState<boolean>(false); const [hvac, setHvac] = useState<boolean>(false); const { contract, zilPay } = ContextContainer.useContainer(); const updateListing = () => { if ( !name || !description || !price || !rooms || !bathrooms || !location || !image ) return; updateListingTransition( contract, zilPay, id, name, description, price, rooms, bathrooms, image, location, wifi, kitchen, tv, laundry, hvac ); }; const claimRent = () => { claimRentTransition(contract, zilPay, id); setShowManageListing(false); }; const deleteListing = () => { deleteListingTransition(contract, zilPay, id); setShowManageListing(false); }; useEffect(() => { setName(modalListing.name); setDescription(modalListing.description); setPrice(modalListing.price); setRooms(modalListing.rooms); setBathrooms(modalListing.bathrooms); setLocation(modalListing.location); setImage(modalListing.image); setWifi(modalListing.amenities.wifi); setKitchen(modalListing.amenities.kitchen); setTv(modalListing.amenities.tv); setLaundry(modalListing.amenities.laundry); setHvac(modalListing.amenities.hvac); }, [showManageListing]); return ( <Modal title="Manage Listing" visible={showManageListing} setVisible={setShowManageListing} buttonText={"Update Listing"} onClick={updateListing} > <> <h4 className="text-sm font-semibold text-gray-500 tracking-wide uppercase py-4"> Accumulated Rent </h4> <div className="flex justify-between items-center pb-8"> <p className="text-2xl ">{accumulated_rent}</p> <Button text={"Claim Rent"} onClick={claimRent} /> </div> </> <> <h4 className="text-sm font-semibold text-gray-500 tracking-wide uppercase py-4"> Delete Listing </h4> <Button text={"Delete Listing"} onClick={deleteListing} alert padding modal /> </> <Input name="Name" value={name} setValue={setName} /> <Input name="Description" value={description} setValue={setDescription} /> <Input name="Rooms" value={rooms} type="number" setValue={setRooms} /> <Input name="Bathrooms" value={bathrooms} type="number" setValue={setBathrooms} /> <Input name="Price (ZIL)" unit="per night" value={price} type="number" setValue={setPrice} /> <Input name="Image URL" value={image} type="text" setValue={setImage} /> <Input name="Google Maps Plus Code" value={location} type="text" setValue={setLocation} /> <AmenitiesInput {...{ wifi, setWifi, kitchen, setKitchen, tv, setTv, laundry, setLaundry, hvac, setHvac, }} /> </Modal> ); }; export default ManageListingModal; ``` [`/src/components/componentManageListingModal.tsx`](https://github.com/Quinence/zilliqa-fullstack-app/blob/main/src/components/componentManageListingModal.tsx)