Search.js 10 KB
Newer Older
Lee SeoYeon's avatar
merge    
Lee SeoYeon committed
1
2
3
4
5
6
7
8
import React, { useState, useEffect } from 'react';
import { Link, Redirect } from 'react-router-dom';
import ohuh from '../ohuh-sm.PNG';
import Place from '../Components/Place';
import { Container, Form, Row, Col, Card, Image, InputGroup, FormControl, Button } from 'react-bootstrap';
import Paginations from '../Components/Paginations';
import axios from 'axios';
import queryString from 'query-string'
Lee SeoYeon's avatar
..    
Lee SeoYeon committed
9
import * as Icon from 'react-bootstrap-icons';
Lee SeoYeon's avatar
.    
Lee SeoYeon committed
10
import { isAuthenticated } from '../utils/auth';
Lee SeoYeon's avatar
merge    
Lee SeoYeon committed
11
12

function Search(props) {
baesangjune's avatar
baesangjune committed
13

Lee SeoYeon's avatar
merge    
Lee SeoYeon committed
14
15
16
17
    const [state, setState] = useState(false);
    const [index, setIndex] = useState(1);
    const [showSet, setShowSet] = useState([false, false, false, false]);
    const [search, setSearch] = useState(queryString.parse(props.location.search).keyword);
Lee SeoYeon's avatar
..    
Lee SeoYeon committed
18
    const [bookmark, setBookmark] = useState([false, false, false, false])
Lee SeoYeon's avatar
.    
Lee SeoYeon committed
19
    const user = isAuthenticated()
20
    const [mobile, setMobile] = useState();
baesangjune's avatar
baesangjune committed
21
22
23
    const [association, setAssociation] = useState([{ name: " ", address: " ", img: " " }])
    const [pagePlace, setPagePlace] = useState([{ name: " ", address: " ", img: " " }, { name: " ", address: " ", img: " " }])
    const [endPage, setEndPage] = useState(1)
baesangjune's avatar
baesangjune committed
24

Lee SeoYeon's avatar
merge    
Lee SeoYeon committed
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43


    const getAssociation = () => {
        axios.get(`/api/search/association?keyword=${search}`)
            .then(res => {
                console.log("Associations = ", res.data)
                setAssociation(res.data)
            })
            .catch(err => {
                console.log("search.associations 에러 발생", err)
            })
    }



    useEffect(() => {
        getAssociation()
    }, []);

Lee SeoYeon's avatar
.    
Lee SeoYeon committed
44
    useEffect(() => {
baesangjune's avatar
baesangjune committed
45
46
47
48
49
50
51
52
53
        if (association.length < 3) {
            setPagePlace(paginate(association, index, association.length))
        }
        else {
            setPagePlace(paginate(association, index, 4))
        }
        console.log("뿌릴 data1", pagePlace)
        setEndPage(Math.floor((association.length / 4)))
        console.log("7489309484839",endPage)
Lee SeoYeon's avatar
.    
Lee SeoYeon committed
54

baesangjune's avatar
baesangjune committed
55
    }, [association, index])
Lee SeoYeon's avatar
merge    
Lee SeoYeon committed
56
57
58
59

    useEffect(() => {
        getAssociation()
        if (state) {
Kim, Chaerin's avatar
.    
Kim, Chaerin committed
60
61
62
63
64
            // window.location.reload()
            // return <Redirect to={{
            //         pathname: `/search?keyword=${search}`,
            //         state: { id: search },
            //     }} />;
Lee SeoYeon's avatar
merge    
Lee SeoYeon committed
65
            props.history.push('/search?keyword=' + search)
Lee SeoYeon's avatar
.    
Lee SeoYeon committed
66
            setState(false)
Kim, Chaerin's avatar
.    
Kim, Chaerin committed
67
            // console.log("search야", search)
68
69
        } window.addEventListener("scroll", infiniteScroll);
        return () => { window.removeEventListener("scroll", infiniteScroll); }
Lee SeoYeon's avatar
.    
Lee SeoYeon committed
70
    }, [state]);
Lee SeoYeon's avatar
merge    
Lee SeoYeon committed
71

72
73
74
75
76
77
78
79
    const infiniteScroll = () => {
        const { documentElement, body } = document;
        const scrollHeight = Math.max(documentElement.scrollHeight, body.scrollHeight);
        const scrollTop = Math.max(documentElement.scrollTop, body.scrollTop);
        const clientHeight = documentElement.clientHeight;
        if (scrollTop + clientHeight >= scrollHeight) {
            // getReview();
            console.log("더불러")
Kim, Chaerin's avatar
.    
Kim, Chaerin committed
80
        }
81
82
        console.log(scrollHeight, scrollTop, clientHeight)
    }
Lee SeoYeon's avatar
merge    
Lee SeoYeon committed
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119


    const places = [{
        name: "한라산",
        address: "제주 서귀포시 토평동 산15-1",
        img: "https://upload.wikimedia.org/wikipedia/commons/thumb/e/eb/KOCIS_Halla_Mountain_in_Jeju-do_%286387785543%29.jpg/269px-KOCIS_Halla_Mountain_in_Jeju-do_%286387785543%29.jpg?size=200x200",
    }, {
        name: "성산일출봉(sungsan)",
        address: "제주 서귀포시 성산읍 성산리 1",
        img: "https://www.jeju.go.kr/pub/site/geopark/images/sub/sub03/02%EC%A7%80%EC%A7%88%EB%A7%88%EC%9D%84%EC%9D%B4%EC%95%BC%EA%B8%B0/%EC%A7%80%EC%A7%88%EB%A7%88%EC%9D%84/%EC%A7%80%EC%A7%88%EB%A7%88%EC%9D%84_%EC%84%B1%EC%82%B0%EC%9D%BC%EC%B6%9C%EB%B4%89/1412402261.jpg?400/400",
    }, {
        name: "해녀의 집(haenyeo)",
        address: "제주 서귀포시 성산읍 한도로 141-13지번오조리 3 오조해녀의집",
        img: "https://mblogthumb-phinf.pstatic.net/MjAxNjExMTdfMTc0/MDAxNDc5MzU3ODU0ODQy.KZYXCjzsXT3rCsE4HXBfxyCg2buvluBvN_7NxVp7BSwg.loJc89d8JjGXdNCn-4yMd7aMWPjfrZn21TI9Hyzemkog.JPEG.icocam11/20161010_100205.jpg?type=w800",
    }, {
        name: "오설록 티 뮤지엄(osulloc)",
        address: "제주 서귀포시 안덕면 신화역사로 15 오설록지번서광리 1235-1 오설록",
        img: "https://cdnweb01.wikitree.co.kr/webdata/editor/202007/01/img_20200701143323_2ced7627.webp",
    }, {
        name: "오설록 티 뮤지엄(osulloc)",
        address: "제주 서귀포시 안덕면 신화역사로 15 오설록지번서광리 1235-1 오설록",
        img: "https://upload.wikimedia.org/wikipedia/commons/thumb/e/eb/KOCIS_Halla_Mountain_in_Jeju-do_%286387785543%29.jpg/269px-KOCIS_Halla_Mountain_in_Jeju-do_%286387785543%29.jpg",
    }]

    if (state !== false) {
        // console.log(queryString.parse(props.location.search))
        //  = {keyword:search}
        // return <Redirect to={{
        //     pathname: `/search?keyword=${search}`,
        //     state: { id: search },
        // }} />;
        // history.pushState(null, null, "?"+queryParams.toString());
        // return <Redirect to={`/search?keyword=${search}`} />;
    }

    const handlePage = (num) => {
        setIndex(num);
baesangjune's avatar
baesangjune committed
120
121
        console.log("pagenation num", num)
        console.log(index)
Lee SeoYeon's avatar
merge    
Lee SeoYeon committed
122
123
124
125
126
127
128
129
130
    }


    const handleChange = (e) => {
        setSearch(e.target.value);
    }

    const handleSubmit = (e) => {
        e.preventDefault()
baesangjune's avatar
baesangjune committed
131
132
        setState(true)
        setIndex(1)
Lee SeoYeon's avatar
merge    
Lee SeoYeon committed
133
134
135
136
137
138
    }

    function paginate(items, pageNumber, itemNumber) {
        const page = [];
        const startIndex = (pageNumber - 1) * itemNumber
        for (var i = 0; i < itemNumber; i++) {
baesangjune's avatar
baesangjune committed
139

Lee SeoYeon's avatar
merge    
Lee SeoYeon committed
140
141
            page.push(items[(startIndex + i)])
        }
baesangjune's avatar
baesangjune committed
142
        console.log("뿌릴 data22222222222222222", page)
Lee SeoYeon's avatar
merge    
Lee SeoYeon committed
143
144
        return page
    }
baesangjune's avatar
baesangjune committed
145
    //usestate 쓰거나 한번에 useeffect에 넣기
Lee SeoYeon's avatar
merge    
Lee SeoYeon committed
146

Lee SeoYeon's avatar
.    
Lee SeoYeon committed
147
    async function handlebookmark(index) {
Lee SeoYeon's avatar
..    
Lee SeoYeon committed
148
        if (!bookmark[index]) {
Lee SeoYeon's avatar
.    
Lee SeoYeon committed
149
150
151
            console.log(pagePlace[index])
            const response = await axios.put(`/api/users/bookmark?ID=${user}&place=${pagePlace[index]._id}`)
            alert(response.data, '북마크가 저장되었습니다.')
Lee SeoYeon's avatar
..    
Lee SeoYeon committed
152
153
154
            const showArr = bookmark
            showArr[index] = true
            setBookmark(showArr)
Lee SeoYeon's avatar
.    
Lee SeoYeon committed
155
            console.log("bookmark=", bookmark)
Lee SeoYeon's avatar
..    
Lee SeoYeon committed
156
        } else {
Lee SeoYeon's avatar
.    
Lee SeoYeon committed
157
158
            const response = await axios.delete(`/api/users/bookmark?ID=${user}&place=${pagePlace[index]._id}`)
            alert(response.data, '저장된 북마크가 삭제되었습니다.')
Lee SeoYeon's avatar
..    
Lee SeoYeon committed
159
160
161
            const showArr = bookmark
            showArr[index] = false
            setBookmark(showArr)
Lee SeoYeon's avatar
.    
Lee SeoYeon committed
162
            console.log("bookmark=", bookmark)
Lee SeoYeon's avatar
..    
Lee SeoYeon committed
163
164
        }
    }
Lee SeoYeon's avatar
merge    
Lee SeoYeon committed
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187


    let time = new Date()

    return (
        <Container >
            <Link to="/" className="d-flex justify-content-center"><Image src={ohuh} /></Link>
            <Row className="mb-2" className="d-flex justify-content-center">
                <Form style={{ width: "90vw" }} onSubmit={handleSubmit}>
                    <InputGroup size="lg">
                        <FormControl
                            placeholder="검색어를 입력하세요."
                            value={search}
                            aria-label="Large"
                            aria-describedby="inputGroup-sizing-sm"
                            onChange={handleChange}
                        />
                        <InputGroup.Append>
                            <Button type="submit" variant="outline-secondary" >검색</Button>
                        </InputGroup.Append>
                    </InputGroup>
                </Form>
            </Row>
188
            {/* {time.toLocaleString()} */}
Lee SeoYeon's avatar
merge    
Lee SeoYeon committed
189
            <Row className="d-flex flex-wrap">
baesangjune's avatar
baesangjune committed
190
191

                {console.log("#####################33", pagePlace)}
Lee SeoYeon's avatar
merge    
Lee SeoYeon committed
192
193
194
195
                {pagePlace.map((place, index) => {
                    return (
                        <Col key={index} md={6} >
                            <Card align="center" border="info" style={{ margin: "3%" }}>
Lee SeoYeon's avatar
.    
Lee SeoYeon committed
196
197
198
199
200
201
202
203
204
205
206
207

                                <Card.Title className="d-flex justify-content-center" style={{ margin: "3%", fontSize: '200%', fontWeight: 'bold' }} >{place.name}
                                    {user ?
                                        <Button
                                        
                                            variant={bookmark[index] ? "primary" : "light"}
                                            style={{}}
                                            onClick={() => handlebookmark(index, place)}>
                                            <Icon.BookmarkStarFill size={35} />
                                            {console.log("bookmark", bookmark)}
                                            {console.log("bookmark[index]", bookmark[index])}</Button> : null}
                                </Card.Title>
Lee SeoYeon's avatar
merge    
Lee SeoYeon committed
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
                                <Card.Img variant="top" style={{ padding: "5%", width: "100%", height: "340px" }} src={place.img} />
                                <Card.Body >
                                    <Card.Text style={{ overflow: 'auto', fontSize: '25px', width: '100%', height: "80px" }} >
                                        {place.address} </Card.Text>
                                    <Button variant="primary" onClick={() => {
                                        const showArr = [false, false, false, false]
                                        showArr[index] = true
                                        setShowSet(showArr)
                                    }}>{place.name} 자세히 살펴보기</Button>
                                    <Place place={place} index={index} show={showSet[index]} onHide={() => setShowSet([false, false, false, false])} />
                                </Card.Body>
                            </Card>
                        </Col>
                    )
                })}
baesangjune's avatar
baesangjune committed
223
224


Lee SeoYeon's avatar
merge    
Lee SeoYeon committed
225
226
227
228
            </Row>
            <Row className="mt-2 d-flex justify-content-center">
                <Paginations index={index} endPage={endPage} handlePage={handlePage}></Paginations>
            </Row>
Lee SeoYeon's avatar
.    
Lee SeoYeon committed
229
        </Container >
Lee SeoYeon's avatar
merge    
Lee SeoYeon committed
230
231
232
233
    );
}

export default Search;