Merge branch 'master' of https://hope-fly.de/plesk-git/dog
This commit is contained in:
Binary file not shown.
BIN
docs/Bonny2.png
Normal file
BIN
docs/Bonny2.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 5.0 MiB |
BIN
docs/bc535769f3f10994c63fdb68ba2ec650.ico.zip
Normal file
BIN
docs/bc535769f3f10994c63fdb68ba2ec650.ico.zip
Normal file
Binary file not shown.
29
package-lock.json
generated
29
package-lock.json
generated
@ -16,6 +16,7 @@
|
||||
"@types/react": "^18.0.26",
|
||||
"@types/react-dom": "^18.0.9",
|
||||
"axios": "^1.2.1",
|
||||
"bootstrap": "^5.2.3",
|
||||
"env-cmd": "^10.1.0",
|
||||
"react": "^18.2.0",
|
||||
"react-dom": "^18.2.0",
|
||||
@ -3074,6 +3075,16 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/@popperjs/core": {
|
||||
"version": "2.11.6",
|
||||
"resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.6.tgz",
|
||||
"integrity": "sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw==",
|
||||
"peer": true,
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/popperjs"
|
||||
}
|
||||
},
|
||||
"node_modules/@remix-run/router": {
|
||||
"version": "1.0.5",
|
||||
"resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.0.5.tgz",
|
||||
@ -5174,6 +5185,24 @@
|
||||
"resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
|
||||
"integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww=="
|
||||
},
|
||||
"node_modules/bootstrap": {
|
||||
"version": "5.2.3",
|
||||
"resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.2.3.tgz",
|
||||
"integrity": "sha512-cEKPM+fwb3cT8NzQZYEu4HilJ3anCrWqh3CHAok1p9jXqMPsPTBhU25fBckEJHJ/p+tTxTFTsFQGM+gaHpi3QQ==",
|
||||
"funding": [
|
||||
{
|
||||
"type": "github",
|
||||
"url": "https://github.com/sponsors/twbs"
|
||||
},
|
||||
{
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/bootstrap"
|
||||
}
|
||||
],
|
||||
"peerDependencies": {
|
||||
"@popperjs/core": "^2.11.6"
|
||||
}
|
||||
},
|
||||
"node_modules/brace-expansion": {
|
||||
"version": "1.1.11",
|
||||
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
|
||||
|
||||
@ -11,6 +11,7 @@
|
||||
"@types/react": "^18.0.26",
|
||||
"@types/react-dom": "^18.0.9",
|
||||
"axios": "^1.2.1",
|
||||
"bootstrap": "^5.2.3",
|
||||
"env-cmd": "^10.1.0",
|
||||
"react": "^18.2.0",
|
||||
"react-dom": "^18.2.0",
|
||||
@ -44,7 +45,7 @@
|
||||
"last 1 safari version"
|
||||
]
|
||||
},
|
||||
"xxxhomepage____": "http://localhost:3000/dog",
|
||||
"xxxhomepage": "http://localhost:3000/dog",
|
||||
"homepage": "https://hope-fly.de/dog",
|
||||
"xxxxhomepage": "http://localhost/dog"
|
||||
}
|
||||
|
||||
@ -79,7 +79,7 @@ try
|
||||
$result = new CMsg(
|
||||
0,
|
||||
507,
|
||||
'Too many users registered on the server, try it again later');
|
||||
'Too many registered users on the server, try it again later');
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@ -58,7 +58,7 @@ if(isset($_POST["submit"]) && !empty($_FILES["file"]["name"]))
|
||||
if(move_uploaded_file($_FILES["file"]["tmp_name"], $targetFilePath))
|
||||
{
|
||||
// Insert image file name into database
|
||||
$update = $db->query("UPDATE dogs SET qr_codefile_name, uploaded_on) VALUES ('".$fileName."', NOW())");
|
||||
$update = $db->query("UPDATE dogs SET picture = '".$fileName."' WHERE qr_id = ".$user->qr_id);
|
||||
if($update)
|
||||
{
|
||||
$result = new CMsg(1,200,"The file ".$fileName. " has been uploaded successfully.");
|
||||
|
||||
18
src/App.tsx
18
src/App.tsx
@ -1,16 +1,21 @@
|
||||
import React from 'react';
|
||||
import {useContext} from 'react'
|
||||
import './App.css';
|
||||
import { BrowserRouter, Routes, Route, Navigate} from 'react-router-dom';
|
||||
import { BrowserRouter, Routes, Route } from 'react-router-dom';
|
||||
import Login from './components/Login';
|
||||
import Register from './components/Register';
|
||||
import Home from './components/Home';
|
||||
import Dog from './components/Dog';
|
||||
import {UserCtx, UserCtxT} from './context/UserContext';
|
||||
import Qr from './components/Qr';
|
||||
import Header from './components/Header';
|
||||
import Footer from './components/Footer';
|
||||
import Impressum from './components/Impressum';
|
||||
import "bootstrap/dist/css/bootstrap.min.css";
|
||||
import FileUpload from './components/FileUpload';
|
||||
|
||||
|
||||
function App()
|
||||
const App: React.FC = () =>
|
||||
{
|
||||
const {user} = useContext<UserCtxT | null>(UserCtx) as UserCtxT;
|
||||
|
||||
@ -18,17 +23,22 @@ function App()
|
||||
<div className="App">
|
||||
<div className="col middle">
|
||||
<BrowserRouter basename='/dog'>
|
||||
{user && <Header />}
|
||||
<Routes>
|
||||
{user && <Route path="/" element={<Home/>} />}
|
||||
{!user && <Route path="/" element={<Login/>} />}
|
||||
{user && <Route index path="/" element={<Home/>} />}
|
||||
{!user && <Route index path="/" element={<Login/>} />}
|
||||
{user && <Route path="/qr" element={<Qr/>} />}
|
||||
{user && <Route path="/d" element={<Dog/>} />}
|
||||
<Route path="/:qr_id" element={<Dog/>} />
|
||||
<Route path="/login" element={<Login/>} />
|
||||
<Route path="/reg" element={<Register/>} />
|
||||
<Route path="/impressum" element={<Impressum/>} />
|
||||
<Route path="/upload" element={<FileUpload/>} />
|
||||
</Routes>
|
||||
<Footer/>
|
||||
</BrowserRouter>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
import { ResponseT, UserCtx, UserCtxT } from '../context/UserContext';
|
||||
import React, { useContext, useState } from 'react'
|
||||
import { UserCtx, UserCtxT } from '../context/UserContext';
|
||||
import { useContext, ReactNode } from 'react'
|
||||
import { useParams } from "react-router-dom";
|
||||
import Img from './Img';
|
||||
import DogNameTxt from './DogNameTxt';
|
||||
@ -12,37 +12,39 @@ const Dog = () =>
|
||||
// m7MdMK
|
||||
const params = useParams();
|
||||
const qr_id = Object.values(params)[0];
|
||||
var data;
|
||||
var needData = dog.success === undefined;
|
||||
if(needData)
|
||||
{
|
||||
data = getDog(qr_id); // await not allowed?! => workaraound
|
||||
getDog(qr_id); // await not allowed?! => workaraound
|
||||
}
|
||||
var email = "nicht definiert;"
|
||||
var phone = "nicht definiert;"
|
||||
var picPath = "nicht definiert;"
|
||||
var qrPath = "nicht definiert;"
|
||||
//var qrPath = "nicht definiert;"
|
||||
var name = "nicht definiert;"
|
||||
if(dog.success === 1)
|
||||
{
|
||||
name = dog.data.name;
|
||||
qrPath = dog.data.qr_code;
|
||||
//qrPath = dog.data.qr_code;
|
||||
picPath = dog.data.picture;
|
||||
email = dog.data.email;
|
||||
phone = dog.data.phone;
|
||||
}
|
||||
|
||||
return (
|
||||
<div className = 'Dog'>
|
||||
<h1>Hast Du mich gefunden?</h1>
|
||||
{/* <p>name: {name}</p>
|
||||
<p>email: {email}</p>
|
||||
<p>phone: {phone}</p>
|
||||
<p>pic: {picPath}</p>
|
||||
<p>qr: {qrPath}</p> */}
|
||||
<Img pth={picPath} />
|
||||
<DogNameTxt name={name} email={email} phone={phone} />
|
||||
</div>
|
||||
)
|
||||
const content: ReactNode = dog.success === 1 ?
|
||||
<div className = 'Dog'>
|
||||
<h1>Hast Du mich gefunden?</h1>
|
||||
{/* <p>name: {name}</p>
|
||||
<p>email: {email}</p>
|
||||
<p>phone: {phone}</p>
|
||||
<p>pic: {picPath}</p>
|
||||
<p>qr: {qrPath}</p> */}
|
||||
<Img pth={picPath} />
|
||||
<DogNameTxt name={name} email={email} phone={phone} />
|
||||
</div>
|
||||
:
|
||||
<></>;
|
||||
|
||||
return ( content );
|
||||
}
|
||||
export default Dog;
|
||||
123
src/components/FileUpload.tsx
Normal file
123
src/components/FileUpload.tsx
Normal file
@ -0,0 +1,123 @@
|
||||
import { useState, useEffect } from "react";
|
||||
import UploadService from "../services/FileUploadService";
|
||||
import IFile from "../types/File";
|
||||
|
||||
const FileUpload: React.FC = () =>
|
||||
{
|
||||
const [currentFile, setCurrentFile] = useState<File>();
|
||||
const [progress, setProgress] = useState(0);
|
||||
const [message, setMessage] = useState("");
|
||||
const [fileInfos, setFileInfos] = useState([]);
|
||||
|
||||
|
||||
const selectFile = (event: React.ChangeEvent<HTMLInputElement>) =>
|
||||
{
|
||||
const { files } = event.target;
|
||||
const selectedFiles = files as FileList;
|
||||
setCurrentFile(selectedFiles?.[0]);
|
||||
setProgress(0);
|
||||
};
|
||||
|
||||
const upload = () =>
|
||||
{
|
||||
setProgress(0);
|
||||
if (!currentFile) return;
|
||||
|
||||
UploadService.upload(currentFile, (event: any) =>
|
||||
{
|
||||
setProgress(Math.round((100 * event.loaded) / event.total));
|
||||
})
|
||||
.then((response) =>
|
||||
{
|
||||
setMessage(response.data.message);
|
||||
return UploadService.getFiles();
|
||||
})
|
||||
.then((files) =>
|
||||
{
|
||||
setFileInfos(files.data);
|
||||
})
|
||||
.catch((err) =>
|
||||
{
|
||||
setProgress(0);
|
||||
|
||||
if (err.response && err.response.data && err.response.data.message)
|
||||
{
|
||||
setMessage(err.response.data.message);
|
||||
}
|
||||
else
|
||||
{
|
||||
setMessage("Could not upload the File!");
|
||||
}
|
||||
|
||||
setCurrentFile(undefined);
|
||||
});
|
||||
};
|
||||
|
||||
useEffect(() =>
|
||||
{
|
||||
UploadService.getFiles().then((response) =>
|
||||
{
|
||||
setFileInfos(response.data);
|
||||
});
|
||||
}, []);
|
||||
|
||||
|
||||
|
||||
return (
|
||||
<div>
|
||||
<div className="row">
|
||||
<div className="col-8">
|
||||
<label className="btn btn-default p-0">
|
||||
<input type="file" onChange={selectFile} />
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<div className="col-4">
|
||||
<button
|
||||
className="btn btn-success btn-sm"
|
||||
disabled={!currentFile}
|
||||
onClick={upload}
|
||||
>
|
||||
Upload
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{currentFile && (
|
||||
<div className="progress my-3">
|
||||
<div
|
||||
className="progress-bar progress-bar-info"
|
||||
role="progressbar"
|
||||
aria-valuenow={progress}
|
||||
aria-valuemin={0}
|
||||
aria-valuemax={100}
|
||||
style={{ width: progress + "%" }}
|
||||
>
|
||||
{progress}%
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
|
||||
{message && (
|
||||
<div className="alert alert-secondary mt-3" role="alert">
|
||||
{message}
|
||||
</div>
|
||||
)}
|
||||
|
||||
<div className="card mt-3">
|
||||
<div className="card-header">List of Files</div>
|
||||
<ul className="list-group list-group-flush">
|
||||
{fileInfos &&
|
||||
fileInfos.map((file: IFile, index: number) => (
|
||||
<li className="list-group-item" key={index}>
|
||||
<a href={file.url}>{file.name}</a>
|
||||
</li>
|
||||
))}
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
);
|
||||
}
|
||||
|
||||
export default FileUpload;
|
||||
0
src/components/Footer.css
Normal file
0
src/components/Footer.css
Normal file
10
src/components/Footer.tsx
Normal file
10
src/components/Footer.tsx
Normal file
@ -0,0 +1,10 @@
|
||||
import { Link } from 'react-router-dom';
|
||||
import './Footer.css';
|
||||
|
||||
function Footer() {
|
||||
return (
|
||||
<div><Link to={'./Impressum'}>Impressum</Link></div>
|
||||
);
|
||||
}
|
||||
|
||||
export default Footer;
|
||||
6
src/components/Header.css
Normal file
6
src/components/Header.css
Normal file
@ -0,0 +1,6 @@
|
||||
.logout
|
||||
{
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
justify-content: flex-end;
|
||||
}
|
||||
28
src/components/Header.tsx
Normal file
28
src/components/Header.tsx
Normal file
@ -0,0 +1,28 @@
|
||||
import React, { useContext } from 'react'
|
||||
import './Header.css';
|
||||
import {Axios, UserCtx, UserCtxT} from '../context/UserContext';
|
||||
|
||||
|
||||
function Header() {
|
||||
const {setUser} = useContext<UserCtxT | null>(UserCtx) as UserCtxT;
|
||||
const logOut = () =>
|
||||
{
|
||||
Axios.post('logout.php')
|
||||
.then((res) =>
|
||||
{
|
||||
console.log(res);
|
||||
})
|
||||
.catch((err) => console.error(err));
|
||||
|
||||
setUser(null);
|
||||
}
|
||||
|
||||
return (
|
||||
<div className='logout'>
|
||||
<div>Header</div>
|
||||
<button onClick={logOut}>Logout</button>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
export default Header;
|
||||
70
src/components/ImpressTxt.tsx
Normal file
70
src/components/ImpressTxt.tsx
Normal file
@ -0,0 +1,70 @@
|
||||
import React from 'react';
|
||||
|
||||
const ImpressTxt = () =>
|
||||
{
|
||||
return (
|
||||
<>
|
||||
<p><span className="underline">Angaben gem. § 5 TMG:</span></p>
|
||||
<p> </p>
|
||||
<p>Dipl.-Ing. Peter Hoppe</p>
|
||||
<p>Rachelstraße 12a</p>
|
||||
<p>93059 Regensburg</p>
|
||||
<p> </p>
|
||||
<p><span className="underline">Kontaktaufnahme:</span></p>
|
||||
<p> </p>
|
||||
<p>E-Mail:</p>
|
||||
<p> </p>
|
||||
<p><strong>Haftungsausschluss - Disclaimer:</strong></p>
|
||||
<p> </p>
|
||||
<p><span className="underline">Haftung für Inhalte</span></p>
|
||||
<p><strong> </strong></p>
|
||||
<p>Alle Inhalte unseres Internetauftritts wurden mit größter Sorgfalt und nach bestem Gewissen erstellt. Für die
|
||||
Richtigkeit, Vollständigkeit und Aktualität der Inhalte können wir jedoch keine Gewähr übernehmen. Als
|
||||
Diensteanbieter sind wir gemäß § 7 Abs.1 TMG für eigene Inhalte auf diesen Seiten nach den allgemeinen Gesetzen
|
||||
verantwortlich. Nach §§ 8 bis 10 TMG sind wir als Diensteanbieter jedoch nicht verpflichtet, übermittelte oder
|
||||
gespeicherte fremde Informationen zu überwachen oder nach Umständen zu forschen, die auf eine rechtswidrige
|
||||
Tätigkeit hinweisen. Verpflichtungen zur Entfernung oder Sperrung der Nutzung von Informationen nach den allgemeinen
|
||||
Gesetzen bleiben hiervon unberührt.</p>
|
||||
<p>Eine diesbezügliche Haftung ist jedoch erst ab dem Zeitpunkt der Kenntniserlangung einer konkreten Rechtsverletzung
|
||||
möglich. Bei Bekanntwerden von den o.g. Rechtsverletzungen werden wir diese Inhalte unverzüglich entfernen.</p>
|
||||
<p> </p>
|
||||
<p><span className="underline">Haftungsbeschränkung für externe Links</span></p>
|
||||
<p><strong> </strong></p>
|
||||
<p>Unsere Webseite enthält Links auf externe Webseiten Dritter. Auf die Inhalte dieser direkt oder indirekt verlinkten
|
||||
Webseiten haben wir keinen Einfluss. Daher können wir für die „externen Links“ auch keine Gewähr auf Richtigkeit der
|
||||
Inhalte übernehmen. Für die Inhalte der externen Links sind die jeweilige Anbieter oder Betreiber (Urheber) der
|
||||
Seiten verantwortlich.</p>
|
||||
<p>Die externen Links wurden zum Zeitpunkt der Linksetzung auf eventuelle Rechtsverstöße überprüft und waren im
|
||||
Zeitpunkt der Linksetzung frei von rechtswidrigen Inhalten. Eine ständige inhaltliche Überprüfung der externen Links
|
||||
ist ohne konkrete Anhaltspunkte einer Rechtsverletzung nicht möglich. Bei direkten oder indirekten Verlinkungen auf
|
||||
die Webseiten Dritter, die außerhalb unseres Verantwortungsbereichs liegen, würde eine Haftungsverpflichtung
|
||||
ausschließlich in dem Fall nur bestehen, wenn wir von den Inhalten Kenntnis erlangen und es uns technisch möglich
|
||||
und zumutbar wäre, die Nutzung im Falle rechtswidriger Inhalte zu verhindern.</p>
|
||||
<p>Diese Haftungsausschlusserklärung gilt auch innerhalb des eigenen Internetauftrittes „<em>Name Ihrer Domain</em>“
|
||||
gesetzten Links und Verweise von Fragestellern, Blogeinträgern, Gästen des Diskussionsforums. Für illegale,
|
||||
fehlerhafte oder unvollständige Inhalte und insbesondere für Schäden, die aus der Nutzung oder Nichtnutzung
|
||||
solcherart dargestellten Informationen entstehen, haftet allein der Diensteanbieter der Seite, auf welche verwiesen
|
||||
wurde, nicht derjenige, der über Links auf die jeweilige Veröffentlichung lediglich verweist.</p>
|
||||
<p>Werden uns Rechtsverletzungen bekannt, werden die externen Links durch uns unverzüglich entfernt.</p>
|
||||
<p> </p>
|
||||
<p><span className="underline">Urheberrecht</span></p>
|
||||
<p><strong> </strong></p>
|
||||
<p>Die auf unserer Webseite veröffentlichen Inhalte und Werke unterliegen dem deutschen Urheberrecht (<a
|
||||
href="http://www.gesetze-im-internet.de/bundesrecht/urhg/gesamt.pdf">http://www.gesetze-im-internet.de/bundesrecht/urhg/gesamt.pdf</a>)
|
||||
. Die Vervielfältigung, Bearbeitung, Verbreitung und jede Art der Verwertung des geistigen Eigentums in ideeller und
|
||||
materieller Sicht des Urhebers außerhalb der Grenzen des Urheberrechtes bedürfen der vorherigen schriftlichen
|
||||
Zustimmung des jeweiligen Urhebers i.S.d. Urhebergesetzes (<a
|
||||
href="http://www.gesetze-im-internet.de/bundesrecht/urhg/gesamt.pdf">http://www.gesetze-im-internet.de/bundesrecht/urhg/gesamt.pdf</a>
|
||||
). Downloads und Kopien dieser Seite sind nur für den privaten und nicht kommerziellen Gebrauch erlaubt. Sind die
|
||||
Inhalte auf unserer Webseite nicht von uns erstellt wurden, sind die Urheberrechte Dritter zu beachten. Die Inhalte
|
||||
Dritter werden als solche kenntlich gemacht. Sollten Sie trotzdem auf eine Urheberrechtsverletzung aufmerksam
|
||||
werden, bitten wir um einen entsprechenden Hinweis. Bei Bekanntwerden von Rechtsverletzungen werden wir derartige
|
||||
Inhalte unverzüglich entfernen.</p>
|
||||
<p>Dieses <a href="http://www.jurarat.de/muster-impressum">Impressum</a> wurde freundlicherweise von www.jurarat.de zur
|
||||
Verfügung gestellt.</p>
|
||||
</>
|
||||
);
|
||||
}
|
||||
export default ImpressTxt;
|
||||
|
||||
|
||||
4
src/components/Impressum.css
Normal file
4
src/components/Impressum.css
Normal file
@ -0,0 +1,4 @@
|
||||
.underline
|
||||
{
|
||||
text-decoration: underline;
|
||||
}
|
||||
16
src/components/Impressum.tsx
Normal file
16
src/components/Impressum.tsx
Normal file
@ -0,0 +1,16 @@
|
||||
import React from 'react';
|
||||
import ImpressTxt from './ImpressTxt';
|
||||
import './Impressum.css'
|
||||
|
||||
const Impressum = () =>
|
||||
{
|
||||
return (
|
||||
<>
|
||||
<h1>Impressum</h1>
|
||||
<ImpressTxt />
|
||||
</>
|
||||
)
|
||||
|
||||
;
|
||||
}
|
||||
export default Impressum;
|
||||
@ -38,7 +38,7 @@ const Login = () => {
|
||||
setRedirect('Redirecting...');
|
||||
setErrMsg(data.message);
|
||||
await getUser();
|
||||
e.currentTarget.reset();
|
||||
e?.currentTarget?.reset();
|
||||
return;
|
||||
}
|
||||
setErrMsg(data.message);
|
||||
|
||||
@ -23,7 +23,7 @@ img
|
||||
|
||||
.vertFont
|
||||
{
|
||||
writing-mode: vertical-lr;
|
||||
writing-mode: vertical-rl;
|
||||
}
|
||||
|
||||
.qrCodeVert
|
||||
@ -47,3 +47,16 @@ img
|
||||
flex-direction: row;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
|
||||
.order1
|
||||
{
|
||||
order: 1;
|
||||
}
|
||||
.order2
|
||||
{
|
||||
order: 2;
|
||||
}
|
||||
.order3
|
||||
{
|
||||
order: 3;
|
||||
}
|
||||
|
||||
@ -1,20 +1,26 @@
|
||||
import React, { useContext } from 'react'
|
||||
import { UserCtx, UserCtxT, DogT } from '../context/UserContext';
|
||||
import React, { useContext, useState } from 'react'
|
||||
import { UserCtx, UserCtxT, DogT, Axios, ResponseT, TUser } from '../context/UserContext';
|
||||
import Img from './Img';
|
||||
import './Qr.css';
|
||||
|
||||
|
||||
export default function Qr()
|
||||
{
|
||||
const {dog, getDog, user} = useContext<UserCtxT | null>(UserCtx) as UserCtxT;
|
||||
var needData = dog.success === undefined;
|
||||
if(needData)
|
||||
{
|
||||
if(user)
|
||||
{
|
||||
getDog(user?.qr_id); // await not allowed?! => workaraound
|
||||
}
|
||||
}
|
||||
const { user } = useContext<UserCtxT | null>(UserCtx) as UserCtxT;
|
||||
const [dog, setDog] = useState<DogT | any>({}); // local dog not the dog in UserContext
|
||||
|
||||
if(user && dog.success === undefined)
|
||||
{
|
||||
Axios.post<ResponseT>('getDog.php',
|
||||
{
|
||||
qr_id: user.qr_id
|
||||
})
|
||||
.then((resDog) =>
|
||||
{
|
||||
setDog(resDog.data);
|
||||
})
|
||||
.catch((err) => console.error(err));
|
||||
}
|
||||
|
||||
return (
|
||||
<>
|
||||
@ -33,57 +39,9 @@ export default function Qr()
|
||||
<Img pth={dog.data.qr_code}/>
|
||||
</div>
|
||||
<div className='qrCodeVert frame'>
|
||||
{/* <div className='vertFont'>{dog.data.phone}</div>
|
||||
<div className='vertFont'>{dog.data.email}</div> */}
|
||||
<div className='vertFont'>{dog.data.name}</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div className='qrCodeBackFront'>
|
||||
<div className='qrCode frame'>
|
||||
<div className='qrCode__'>SCAN ME</div>
|
||||
<Img pth={dog.data.qr_code}/>
|
||||
</div>
|
||||
<div className='qrCodeVert frame'>
|
||||
<div className='vertFont'>{dog.data.phone}</div>
|
||||
{/* <div className='vertFont'>{dog.data.email}</div> */}
|
||||
<div className='vertFont'>{dog.data.name}</div>
|
||||
</div>
|
||||
</div>
|
||||
<div className='qrCodeBackFront'>
|
||||
<div className='qrCode frame'>
|
||||
<div className='qrCode__'>SCAN ME</div>
|
||||
<Img pth={dog.data.qr_code}/>
|
||||
</div>
|
||||
<div className='qrCodeVert frame'>
|
||||
{/* <div className='vertFont'>{dog.data.phone}</div> */}
|
||||
<div className='vertFont'>{dog.data.email}</div>
|
||||
<div className='vertFont'>{dog.data.name}</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div className='qrCodeBackFront'>
|
||||
<div className='qrCode frame'>
|
||||
<div className='qrCode__'>SCAN ME</div>
|
||||
<Img pth={dog.data.qr_code}/>
|
||||
</div>
|
||||
<div className='qrCodeVert frame'>
|
||||
<div className='vertFont'>{dog.data.phone}</div>
|
||||
{/* <div className='vertFont'>{dog.data.email}</div>
|
||||
<div className='vertFont'>{dog.data.name}</div> */}
|
||||
</div>
|
||||
</div>
|
||||
<div className='qrCodeBackFront'>
|
||||
<div className='qrCode frame'>
|
||||
<div className='qrCode__'>SCAN ME</div>
|
||||
<Img pth={dog.data.qr_code}/>
|
||||
</div>
|
||||
<div className='qrCodeVert frame'>
|
||||
<div className='vertFont'>{dog.data.phone}</div>
|
||||
<div className='vertFont'>{dog.data.email}</div>
|
||||
{/* <div className='vertFont'>{dog.data.name}</div> */}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@ -94,9 +52,57 @@ export default function Qr()
|
||||
<Img pth={dog.data.qr_code}/>
|
||||
</div>
|
||||
<div className='qrCodeVert frame'>
|
||||
<div className='vertFont order2'>{dog.data.name}</div>
|
||||
<div className='vertFont order3'>{dog.data.phone}</div>
|
||||
<div className='vertFont order1'>{dog.data.email}</div>
|
||||
</div>
|
||||
</div>
|
||||
<div className='qrCodeBackFront'>
|
||||
<div className='qrCode frame'>
|
||||
<div className='qrCode__'>SCAN ME</div>
|
||||
<Img pth={dog.data.qr_code}/>
|
||||
</div>
|
||||
<div className='qrCodeVert frame'>
|
||||
<div className='vertFont'>{dog.data.name}</div>
|
||||
<div className='vertFont'>{dog.data.phone}</div>
|
||||
<div className='vertFont'>{dog.data.email}</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div className='qrCodeBackFront'>
|
||||
<div className='qrCode frame'>
|
||||
<div className='qrCode__'>SCAN ME</div>
|
||||
<Img pth={dog.data.qr_code}/>
|
||||
</div>
|
||||
<div className='qrCodeVert frame'>
|
||||
<div className='vertFont'>{dog.data.name}</div>
|
||||
<div className='vertFont'>{dog.data.phone}</div>
|
||||
<div className='vertFont'>{dog.data.email}</div>
|
||||
</div>
|
||||
</div>
|
||||
<div className='qrCodeBackFront'>
|
||||
<div className='qrCode frame'>
|
||||
<div className='qrCode__'>SCAN ME</div>
|
||||
<Img pth={dog.data.qr_code}/>
|
||||
</div>
|
||||
<div className='qrCodeVert frame'>
|
||||
<div className='vertFont'>{dog.data.name}</div>
|
||||
<div className='vertFont'>{dog.data.phone}</div>
|
||||
<div className='vertFont'>{dog.data.email}</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div className='qrCodeBackFront'>
|
||||
<div className='qrCode frame'>
|
||||
<div className='qrCode__'>SCAN ME</div>
|
||||
<Img pth={dog.data.qr_code}/>
|
||||
</div>
|
||||
<div className='qrCodeVert frame'>
|
||||
<div className='vertFont'>{dog.data.name}</div>
|
||||
<div className='vertFont'>{dog.data.phone}</div>
|
||||
<div className='vertFont'>{dog.data.email}</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@ -1,11 +0,0 @@
|
||||
<?php
|
||||
header("Access-Control-Allow-Origin: *");
|
||||
header("Access-Control-Allow-Headers: access");
|
||||
header("Access-Control-Allow-Methods: POST");
|
||||
header("Content-Type: application/json; charset=UTF-8");
|
||||
header("Access-Control-Allow-Headers: Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With");
|
||||
|
||||
session_start();
|
||||
session_destroy();
|
||||
session_abort();
|
||||
?>
|
||||
@ -41,6 +41,8 @@ export type UserCtxT =
|
||||
{
|
||||
user: TUser | null,
|
||||
|
||||
setUser: React.Dispatch<React.SetStateAction<TUser | null>>,
|
||||
|
||||
registerUser: ({ email, password }: {
|
||||
email: string;
|
||||
password: string;
|
||||
@ -153,7 +155,7 @@ export const UserCtxProvider = ({children}:TUserContextProviderProps) => {
|
||||
setUser(data.user);
|
||||
return;
|
||||
}
|
||||
setUser(null);
|
||||
//setUser(null);
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -165,6 +167,7 @@ export const UserCtxProvider = ({children}:TUserContextProviderProps) => {
|
||||
return;
|
||||
}
|
||||
}
|
||||
setUser(null);
|
||||
}
|
||||
|
||||
useEffect(() =>
|
||||
@ -212,6 +215,7 @@ export const UserCtxProvider = ({children}:TUserContextProviderProps) => {
|
||||
loginUser,
|
||||
wait,
|
||||
user,
|
||||
setUser,
|
||||
getUser,
|
||||
logout,
|
||||
getDog,
|
||||
|
||||
27
src/services/FileUploadService.ts
Normal file
27
src/services/FileUploadService.ts
Normal file
@ -0,0 +1,27 @@
|
||||
//import http from "../http-common";
|
||||
|
||||
import { Axios } from '../context/UserContext';
|
||||
|
||||
const upload = (file: File, onUploadProgress: any): Promise<any> => {
|
||||
let formData = new FormData();
|
||||
|
||||
formData.append("file", file);
|
||||
|
||||
return Axios.post("/upload", formData, {
|
||||
headers: {
|
||||
"Content-Type": "multipart/form-data",
|
||||
},
|
||||
onUploadProgress,
|
||||
});
|
||||
};
|
||||
|
||||
const getFiles = () : Promise<any> => {
|
||||
return Axios.get("/files");
|
||||
};
|
||||
|
||||
const FileUploadService = {
|
||||
upload,
|
||||
getFiles,
|
||||
};
|
||||
|
||||
export default FileUploadService;
|
||||
5
src/types/File.ts
Normal file
5
src/types/File.ts
Normal file
@ -0,0 +1,5 @@
|
||||
export default interface IFile
|
||||
{
|
||||
url: string,
|
||||
name: string,
|
||||
}
|
||||
Reference in New Issue
Block a user