├── src
├── components
│ ├── VtMap
│ │ ├── VtMap.css
│ │ └── VtMap.js
│ ├── Search
│ │ ├── Search.css
│ │ └── Search.js
│ ├── VeterinerList
│ │ ├── VeterinerList.css
│ │ └── VeterinerList.js
│ └── Modal
│ │ └── Modal.js
├── index.css
├── App.test.js
├── index.js
├── App.css
├── App.js
├── logo.svg
└── registerServiceWorker.js
├── public
├── favicon.ico
├── manifest.json
└── index.html
├── .gitignore
├── package.json
├── README.md
└── LICENSE
/src/components/VtMap/VtMap.css:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/components/Search/Search.css:
--------------------------------------------------------------------------------
1 |
2 | .submitButton{
3 | margin-left:1%;
4 | }
--------------------------------------------------------------------------------
/src/components/VeterinerList/VeterinerList.css:
--------------------------------------------------------------------------------
1 | .list {
2 | margin:100px;
3 | }
4 |
5 |
--------------------------------------------------------------------------------
/src/index.css:
--------------------------------------------------------------------------------
1 | body {
2 | margin: 0;
3 | padding: 0;
4 | font-family: sans-serif;
5 | }
6 |
--------------------------------------------------------------------------------
/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/okandavut/react-veterinary-application/HEAD/public/favicon.ico
--------------------------------------------------------------------------------
/src/App.test.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import ReactDOM from 'react-dom';
3 | import App from './App';
4 |
5 | it('renders without crashing', () => {
6 | const div = document.createElement('div');
7 | ReactDOM.render( , div);
8 | ReactDOM.unmountComponentAtNode(div);
9 | });
10 |
--------------------------------------------------------------------------------
/src/index.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import ReactDOM from 'react-dom';
3 | import './index.css';
4 |
5 | import App from './App';
6 | import registerServiceWorker from './registerServiceWorker';
7 |
8 | ReactDOM.render( , document.getElementById('root'));
9 | registerServiceWorker();
10 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # See https://help.github.com/ignore-files/ for more about ignoring files.
2 |
3 | # dependencies
4 | /node_modules
5 |
6 | # testing
7 | /coverage
8 |
9 | # production
10 | /build
11 |
12 | # misc
13 | .DS_Store
14 | .env.local
15 | .env.development.local
16 | .env.test.local
17 | .env.production.local
18 |
19 | npm-debug.log*
20 | yarn-debug.log*
21 | yarn-error.log*
22 |
--------------------------------------------------------------------------------
/public/manifest.json:
--------------------------------------------------------------------------------
1 | {
2 | "short_name": "React App",
3 | "name": "Create React App Sample",
4 | "icons": [
5 | {
6 | "src": "favicon.ico",
7 | "sizes": "64x64 32x32 24x24 16x16",
8 | "type": "image/x-icon"
9 | }
10 | ],
11 | "start_url": "./index.html",
12 | "display": "standalone",
13 | "theme_color": "#000000",
14 | "background_color": "#ffffff"
15 | }
16 |
--------------------------------------------------------------------------------
/src/App.css:
--------------------------------------------------------------------------------
1 | .App-logo {
2 | animation: App-logo-spin infinite 20s linear;
3 | height: 80px;
4 | }
5 |
6 | .App-header {
7 | background-color: #222;
8 | height: 150px;
9 | padding: 20px;
10 | color: white;
11 | }
12 |
13 | .App-title {
14 | font-size: 1.5em;
15 | }
16 |
17 | .App-intro {
18 | font-size: large;
19 | }
20 |
21 | @keyframes App-logo-spin {
22 | from { transform: rotate(0deg); }
23 | to { transform: rotate(360deg); }
24 | }
25 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "veterinerler",
3 | "version": "0.1.0",
4 | "private": true,
5 | "dependencies": {
6 | "bootstrap": "^4.1.0",
7 | "google-maps": "^3.3.0",
8 | "google-maps-react": "^2.0.2",
9 | "jquery": "^3.3.1",
10 | "prop-types": "^15.6.1",
11 | "react": "^16.3.2",
12 | "react-bootstrap": "^0.32.1",
13 | "react-dom": "^16.3.2",
14 | "react-pager": "^1.3.3",
15 | "react-paginate": "^5.2.3",
16 | "react-scripts": "1.1.4",
17 | "react-select": "^1.2.1"
18 | },
19 | "scripts": {
20 | "start": "react-scripts start",
21 | "build": "react-scripts build",
22 | "test": "react-scripts test --env=jsdom",
23 | "eject": "react-scripts eject"
24 | },
25 | "devDependencies": {
26 | "google-maps": "^3.2.1"
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 |
2 | ## Veterinary listing and information retrieval application by cities with React.
3 |
4 | The Readme will change as the application evolves.
5 |
6 |
7 | New Editings :
8 | Google Maps was added.
9 |
10 | Screenshoot:
11 |
12 | 
13 |
14 | --------------------------------------------------------------------
15 |
16 | New Editings :
17 | Detail component was deleted.
18 | Modal component was created and detail info is shown in modal.
19 | Screenshoot :
20 |
21 |
22 | 
23 |
24 |
25 |
26 | --------------------------------------------------------------------
27 | Initial commit :
28 |
29 |
30 | 
31 |
32 |
33 |
34 | Veterinary API was used. Api was created by [@enderahmetyurt](https://github.com/enderahmetyurt) . Thank you for this API.
35 |
36 | https://github.com/enderahmetyurt/veterinary-list-api
37 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2018 Okan davut
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/src/App.js:
--------------------------------------------------------------------------------
1 | import React, { Component } from 'react';
2 | import Search from './components/Search/Search';
3 | import VeterinerList from './components/VeterinerList/VeterinerList';
4 |
5 | import './App.css';
6 |
7 | class App extends Component {
8 | constructor(props) {
9 | super();
10 | this.state = { veterinerler : [] , vetInfo : {} };
11 | this.show = false;
12 | }
13 | componentDidMount() {
14 | }
15 |
16 |
17 | setVeterinerler(items){
18 | this.setState({veterinerler:items});
19 | }
20 | setVeterinerInfo(vetInfo){
21 | this.setState({vetInfo:vetInfo});
22 | this.show = true;
23 | }
24 | render() {
25 | return (
26 |
27 |
28 |
29 | Veteriner Bilgi Sitesine Hoşgeldiniz.
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 | );
38 | }
39 | }
40 |
41 | export default App;
42 |
--------------------------------------------------------------------------------
/src/components/Modal/Modal.js:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import VtMap from "../VtMap/VtMap";
3 | import { GoogleApiWrapper } from "google-maps-react";
4 | import PropTypes from "prop-types";
5 |
6 | class Modal extends React.Component {
7 | render() {
8 | if (!this.props.show) {
9 | return null;
10 | }
11 |
12 | // The gray background
13 | const backdropStyle = {
14 | position: "fixed",
15 | top: 0,
16 | bottom: 0,
17 | left: 0,
18 | right: 0,
19 | backgroundColor: "rgba(0,0,0,0.3)",
20 | padding: 50,
21 | margin: "0 auto"
22 | };
23 |
24 | // The modal "window"
25 | const modalStyle = {
26 | backgroundColor: "#fff",
27 | borderRadius: 5,
28 | width: 500,
29 | maxHeight: 700,
30 | margin: "0 auto",
31 | padding: 30,
32 | display: "inline-block",
33 | marginTop: 30,
34 | textAlign: "center",
35 | overflowScrool: "true"
36 | };
37 |
38 | return (
39 |
40 |
41 | {this.props.children}
42 |
43 | Close
44 |
45 |
46 |
47 |
48 |
49 | );
50 | }
51 | }
52 |
53 | Modal.propTypes = {
54 | onClose: PropTypes.func.isRequired,
55 | show: PropTypes.bool,
56 | children: PropTypes.node
57 | };
58 |
59 | export default GoogleApiWrapper({
60 | apiKey: "maps-api-key"
61 | })(Modal);
62 |
--------------------------------------------------------------------------------
/public/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
11 |
12 |
13 |
22 | React App
23 |
24 |
25 |
26 | You need to enable JavaScript to run this app.
27 |
28 |
29 |
39 |
40 |
41 |
--------------------------------------------------------------------------------
/src/components/VeterinerList/VeterinerList.js:
--------------------------------------------------------------------------------
1 | import React, { Component } from "react";
2 | import ReactDOM from "react-dom";
3 | import Modal from "../Modal/Modal";
4 | import "bootstrap/dist/css/bootstrap.css";
5 | import "./VeterinerList.css";
6 | class VeterinerList extends Component {
7 | constructor(props) {
8 | super(props);
9 | this.state = { veterinerler: [], vetInfo: "", isOpen: false };
10 | }
11 | componentDidMount() {}
12 | toggleModal = () => {
13 | this.setState({ isOpen: false });
14 | };
15 | handleClick = item => {
16 | this.setState({ vetInfo: item, isOpen: true });
17 | this.props.setVeterinerInfo(item);
18 | };
19 | render() {
20 | return (
21 |
22 |
23 | {this.props.veterinerler.map(
24 | function(item, index) {
25 | return (
26 | this.handleClick(item)}>
27 | {item.name}
28 |
29 | );
30 | }.bind(this)
31 | )}
32 |
33 |
38 | ID: {this.state.vetInfo.id}
39 | NAME: {this.state.vetInfo.name}
40 | ADRES: {this.state.vetInfo.address}
41 | SEHİR: {this.state.vetInfo.city}
42 | İLÇE: {this.state.vetInfo.town}
43 | EMAİL: {this.state.vetInfo.email}
44 | TELEFON: {this.state.vetInfo.telephone}
45 |
46 |
47 | );
48 | }
49 | }
50 |
51 | export default VeterinerList;
52 |
--------------------------------------------------------------------------------
/src/components/Search/Search.js:
--------------------------------------------------------------------------------
1 | import React, { Component } from 'react';
2 | import ReactDOM from 'react-dom';
3 | import './Search.css';
4 | import 'bootstrap/dist/css/bootstrap.css';
5 | import Select from 'react-select';
6 | import 'react-select/dist/react-select.css';
7 |
8 | class Search extends Component {
9 | constructor(props) {
10 | super(props);
11 | this.state = { value: '',
12 | veterinerler : [],
13 | selectedOption: '',
14 | };
15 |
16 |
17 | this.handleChange = this.handleChange.bind(this);
18 | }
19 | componentDidMount() {
20 | this.fillCity();
21 | }
22 | handleChange = (selectedOption) => {
23 | this.setState({ selectedOption });
24 | this.VetList(selectedOption.value);
25 | }
26 | VetList(city) {
27 | fetch('http://veterinaries.enderahmetyurt.com/search?city='+city)
28 | .then((result) => {
29 | // Get the result
30 | // If we want text, call result.text()
31 | return result.json();
32 | }).then((jsonResult) => {
33 | // Do something with the result
34 | this.setState({veterinerler:jsonResult});
35 | this.props.setVeterinerler(this.state.veterinerler);
36 | })
37 | }
38 | fillCity(){
39 | this.state.cities= [
40 | { value: 'ankara', label: 'Ankara' },
41 | { value: 'izmir', label: 'Izmir' },
42 | { value: 'ordu', label: 'Ordu' },
43 | { value: 'kayseri', label: 'Kayseri' }
44 | ];
45 | }
46 | render() {
47 | this.fillCity();
48 | const { selectedOption } = this.state;
49 | return (
50 |
58 | );
59 | }
60 | }
61 |
62 | export default Search;
63 |
--------------------------------------------------------------------------------
/src/components/VtMap/VtMap.js:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import PropTypes from "prop-types";
3 | import ReactDOM from "react-dom";
4 |
5 | class VtMap extends React.Component {
6 | state = {
7 | locations: [
8 | {
9 | name: "New York County Supreme Court",
10 | location: { lat: 40.7143033, lng: -74.0036919 }
11 | },
12 | {
13 | name: "Queens County Supreme Court",
14 | location: { lat: 40.7046946, lng: -73.8091145 }
15 | },
16 | {
17 | name: "Kings County Supreme Court",
18 | location: { lat: 40.6940226, lng: -73.9890967 }
19 | },
20 | {
21 | name: "Richmond County Supreme Court",
22 | location: { lat: 40.6412336, lng: -74.0768597 }
23 | },
24 | {
25 | name: "Bronx Supreme Court",
26 | location: { lat: 40.8262388, lng: -73.9235238 }
27 | }
28 | ]
29 | };
30 | componentDidMount() {
31 | this.loadMap();
32 | }
33 | componentDidUpdate() {}
34 | loadMap() {
35 | if (this.props && this.props.google) {
36 | const { google } = this.props;
37 | const maps = google.maps;
38 | const mapRef = this.refs.map;
39 | const node = ReactDOM.findDOMNode(mapRef);
40 |
41 | const mapConfig = Object.assign(
42 | {},
43 | {
44 | center: { lat: 40.7485722, lng: -74.0068633 },
45 | zoom: 11,
46 | mapTypeId: "roadmap"
47 | }
48 | );
49 |
50 | this.map = new maps.Map(node, mapConfig);
51 |
52 | this.state.locations.forEach(location => {
53 | const marker = new google.maps.Marker({
54 | position: { lat: location.location.lat, lng: location.location.lng },
55 | map: this.map,
56 | title: location.name
57 | });
58 | });
59 | }
60 | }
61 | render() {
62 | const style = {
63 | width: "25vw",
64 | height: "30vh",
65 | marginTop: 40
66 | };
67 | return (
68 |
69 | loading map...
70 |
71 | );
72 | }
73 | }
74 |
75 | export default VtMap;
76 |
--------------------------------------------------------------------------------
/src/logo.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/src/registerServiceWorker.js:
--------------------------------------------------------------------------------
1 | // In production, we register a service worker to serve assets from local cache.
2 |
3 | // This lets the app load faster on subsequent visits in production, and gives
4 | // it offline capabilities. However, it also means that developers (and users)
5 | // will only see deployed updates on the "N+1" visit to a page, since previously
6 | // cached resources are updated in the background.
7 |
8 | // To learn more about the benefits of this model, read https://goo.gl/KwvDNy.
9 | // This link also includes instructions on opting out of this behavior.
10 |
11 | const isLocalhost = Boolean(
12 | window.location.hostname === 'localhost' ||
13 | // [::1] is the IPv6 localhost address.
14 | window.location.hostname === '[::1]' ||
15 | // 127.0.0.1/8 is considered localhost for IPv4.
16 | window.location.hostname.match(
17 | /^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/
18 | )
19 | );
20 |
21 | export default function register() {
22 | if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {
23 | // The URL constructor is available in all browsers that support SW.
24 | const publicUrl = new URL(process.env.PUBLIC_URL, window.location);
25 | if (publicUrl.origin !== window.location.origin) {
26 | // Our service worker won't work if PUBLIC_URL is on a different origin
27 | // from what our page is served on. This might happen if a CDN is used to
28 | // serve assets; see https://github.com/facebookincubator/create-react-app/issues/2374
29 | return;
30 | }
31 |
32 | window.addEventListener('load', () => {
33 | const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;
34 |
35 | if (isLocalhost) {
36 | // This is running on localhost. Lets check if a service worker still exists or not.
37 | checkValidServiceWorker(swUrl);
38 |
39 | // Add some additional logging to localhost, pointing developers to the
40 | // service worker/PWA documentation.
41 | navigator.serviceWorker.ready.then(() => {
42 | console.log(
43 | 'This web app is being served cache-first by a service ' +
44 | 'worker. To learn more, visit https://goo.gl/SC7cgQ'
45 | );
46 | });
47 | } else {
48 | // Is not local host. Just register service worker
49 | registerValidSW(swUrl);
50 | }
51 | });
52 | }
53 | }
54 |
55 | function registerValidSW(swUrl) {
56 | navigator.serviceWorker
57 | .register(swUrl)
58 | .then(registration => {
59 | registration.onupdatefound = () => {
60 | const installingWorker = registration.installing;
61 | installingWorker.onstatechange = () => {
62 | if (installingWorker.state === 'installed') {
63 | if (navigator.serviceWorker.controller) {
64 | // At this point, the old content will have been purged and
65 | // the fresh content will have been added to the cache.
66 | // It's the perfect time to display a "New content is
67 | // available; please refresh." message in your web app.
68 | console.log('New content is available; please refresh.');
69 | } else {
70 | // At this point, everything has been precached.
71 | // It's the perfect time to display a
72 | // "Content is cached for offline use." message.
73 | console.log('Content is cached for offline use.');
74 | }
75 | }
76 | };
77 | };
78 | })
79 | .catch(error => {
80 | console.error('Error during service worker registration:', error);
81 | });
82 | }
83 |
84 | function checkValidServiceWorker(swUrl) {
85 | // Check if the service worker can be found. If it can't reload the page.
86 | fetch(swUrl)
87 | .then(response => {
88 | // Ensure service worker exists, and that we really are getting a JS file.
89 | if (
90 | response.status === 404 ||
91 | response.headers.get('content-type').indexOf('javascript') === -1
92 | ) {
93 | // No service worker found. Probably a different app. Reload the page.
94 | navigator.serviceWorker.ready.then(registration => {
95 | registration.unregister().then(() => {
96 | window.location.reload();
97 | });
98 | });
99 | } else {
100 | // Service worker found. Proceed as normal.
101 | registerValidSW(swUrl);
102 | }
103 | })
104 | .catch(() => {
105 | console.log(
106 | 'No internet connection found. App is running in offline mode.'
107 | );
108 | });
109 | }
110 |
111 | export function unregister() {
112 | if ('serviceWorker' in navigator) {
113 | navigator.serviceWorker.ready.then(registration => {
114 | registration.unregister();
115 | });
116 | }
117 | }
118 |
--------------------------------------------------------------------------------