PBL Ⅲ/Ethereum and Solidity

Section7 : Advanced Multi-Page Front-Ends (2)

myejinni 2022. 9. 23. 18:32

178. The Need for a layout

 

헤더-푸터 각 페이지마다 매번 다시 작성하기 번거로움

=> 레이아웃을 만들어 재사용하자

= Layout.js

 

Layout.js

 

 

180. The Layout Component

 

1. components folder 생성

2. Layout.js file 생성

 

181. Assembling a Header - 183.Two Column layout

 

184. Nested Routing

 

http://localhost:3000/campaigns/new

: url 접속

 

185. Final Css Fix

 

 

Layout.js

import React from "react";
import { Container } from "semantic-ui-react";
import Head from "next/head";
import Header from "./Header";

const Layout = (props) => {
  return (
    <div>
      <Container>
        <Head>
          <link
            rel="stylesheet"
            href="//cdnjs.cloudflare.com/ajax/libs/semantic-ui/2.2.12/semantic.min.css"
          ></link>
        </Head>
        <Header />
        {props.children}
      </Container>
    </div>
  );
};
export default Layout;

 

 

186. Form Creation

new.js

 

 

187. Input Change Handlers

 

-> Event Handler

 

1. set up  a new piece of state to hold that value that the user is entering

 

188. Form Submittal 

*new.js (update ver)

import React, { Component } from 'react';
import { Form, Button, Input } from 'semantic-ui-react';
import Layout from '../../components/Layout';
import factory from '../../ethereum/factory';
import web3 from '../../ethereum/web3';

class CampaignNew extends Component {
  state = {
    minimumContribution: '',
  };

  onSubmit = async (event) => {
    event.preventDefault();

    const accounts = await web3.eth.getAccounts();
    await factory.methods.createCampaign(this.state.minimumContribution).send({
      from: accounts[0],
    });
  };

  render() {
    return (
      <Layout>
        <h3>Create Campaign</h3>
        <Form onSubmit={this.onSubmit}>
          <Form.Field>
            <label>Minimum Contribution</label>
            <Input
              label="wei"
              labelPosition="right"
              value={this.state.minimumContribution}
              onChange={(event) =>
                this.setState({ minimumContribution: event.target.value })
              }
            />
          </Form.Field>
          <Button primary>Create!</Button>
        </Form>
      </Layout>
    );
  }
}

export default CampaignNew;

 

189. Testing Submittal196. Header navigation

 

190. Form Error handling

new.js

default 로 에러 메세지 띄워주지 않음

=> 에러 태그 추가 => 해결!

 

191. Button Spinners

-> 언제 이 스피너를 보여줄 것인가?

create 버튼 눌렀을 때

 

 

192. Important Note About Installing next-routes

 

installing the next-routes library

*If error like ERESOLVE unable to resolve dependency tree errors, you'll need to pass the --legacy-peer-deps flag:

 

npm install next-routes --legacy-peer-deps

 

193. Routing Issues

install

 

194. Next Routes Setup

automatically navigate our user from our campaign new component to somewhere else inside of our application

 

[routes.js]

[server.js]

const { createServer } = require("http");
const next = require("next");

const app = next({
  dev: process.env.NODE_ENV !== "production",
});

const routes = require("./routes");
const handler = routes.getRequestHandler(app);

app.prepare().then(() => {
  createServer(handler).listen(3000, (err) => {
    if (err) throw err;
    console.log("Ready on localhost:3000");
  });
});

 

$npm run dev

 

195. Automatic Navigation

 

196. Header navigation

 

[Header.js]

import React from "react";
import { Menu } from "semantic-ui-react";

const Header = () => {
  return (
    <Menu style={{ marginTop: "10px" }}>
      <Menu.Item>CrowdCoin</Menu.Item>

      <Menu.Menu position="right">
        <Menu.Item>Campaigns</Menu.Item>
        <Menu.Item>+</Menu.Item>
      </Menu.Menu>
    </Menu>
  );
};

export default Header;