diff --git a/docs/Bestellung # 000001860.pdf b/docs/Bestellung # 000001860.pdf deleted file mode 100644 index da08de4..0000000 Binary files a/docs/Bestellung # 000001860.pdf and /dev/null differ diff --git a/docs/Bonny2.png b/docs/Bonny2.png new file mode 100644 index 0000000..f8f9ae3 Binary files /dev/null and b/docs/Bonny2.png differ diff --git a/docs/bc535769f3f10994c63fdb68ba2ec650.ico.zip b/docs/bc535769f3f10994c63fdb68ba2ec650.ico.zip new file mode 100644 index 0000000..8a1b1fe Binary files /dev/null and b/docs/bc535769f3f10994c63fdb68ba2ec650.ico.zip differ diff --git a/package-lock.json b/package-lock.json index b91677f..e45212f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -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", diff --git a/package.json b/package.json index 50a30e0..e682a70 100644 --- a/package.json +++ b/package.json @@ -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" } diff --git a/php/php-dog/register.php b/php/php-dog/register.php index 2f69b4a..7fcc4d6 100644 --- a/php/php-dog/register.php +++ b/php/php-dog/register.php @@ -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 { diff --git a/src/App.tsx b/src/App.tsx index 684777d..28c681a 100644 --- a/src/App.tsx +++ b/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(UserCtx) as UserCtxT; @@ -18,17 +23,22 @@ function App()
+ {user &&
} - {user && } />} - {!user && } />} + {user && } />} + {!user && } />} {user && } />} {user && } />} } /> } /> } /> + } /> + } /> +
+
); } diff --git a/src/components/Dog.tsx b/src/components/Dog.tsx index 99ab361..2d2c5ae 100644 --- a/src/components/Dog.tsx +++ b/src/components/Dog.tsx @@ -1,10 +1,9 @@ -import { ResponseT, UserCtx, UserCtxT } from '../context/UserContext'; -import React, { useContext, useState, ReactNode } 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'; import './Dog.css'; -import { JSXElement, JSXFragment } from '@babel/types'; const Dog = () => { @@ -13,21 +12,20 @@ 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; diff --git a/src/components/FileUpload.tsx b/src/components/FileUpload.tsx new file mode 100644 index 0000000..5f08c33 --- /dev/null +++ b/src/components/FileUpload.tsx @@ -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(); + const [progress, setProgress] = useState(0); + const [message, setMessage] = useState(""); + const [fileInfos, setFileInfos] = useState([]); + + + const selectFile = (event: React.ChangeEvent) => + { + 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 ( +
+
+
+ +
+ +
+ +
+
+ + {currentFile && ( +
+
+ {progress}% +
+
+ )} + + {message && ( +
+ {message} +
+ )} + +
+
List of Files
+
    + {fileInfos && + fileInfos.map((file: IFile, index: number) => ( +
  • + {file.name} +
  • + ))} +
+
+
+ + ); +} + +export default FileUpload; \ No newline at end of file diff --git a/src/components/Footer.css b/src/components/Footer.css new file mode 100644 index 0000000..e69de29 diff --git a/src/components/Footer.tsx b/src/components/Footer.tsx new file mode 100644 index 0000000..0baccd3 --- /dev/null +++ b/src/components/Footer.tsx @@ -0,0 +1,10 @@ +import { Link } from 'react-router-dom'; +import './Footer.css'; + +function Footer() { + return ( +
Impressum
+ ); +} + +export default Footer; \ No newline at end of file diff --git a/src/components/Header.css b/src/components/Header.css new file mode 100644 index 0000000..2229a2b --- /dev/null +++ b/src/components/Header.css @@ -0,0 +1,6 @@ +.logout +{ + display: flex; + flex-direction: row; + justify-content: flex-end; +} \ No newline at end of file diff --git a/src/components/Header.tsx b/src/components/Header.tsx new file mode 100644 index 0000000..3b195fa --- /dev/null +++ b/src/components/Header.tsx @@ -0,0 +1,28 @@ +import React, { useContext } from 'react' +import './Header.css'; +import {Axios, UserCtx, UserCtxT} from '../context/UserContext'; + + +function Header() { + const {setUser} = useContext(UserCtx) as UserCtxT; + const logOut = () => + { + Axios.post('logout.php') + .then((res) => + { + console.log(res); + }) + .catch((err) => console.error(err)); + + setUser(null); + } + + return ( +
+
Header
+ +
+ ); +} + +export default Header; \ No newline at end of file diff --git a/src/components/Qr.tsx b/src/components/Qr.tsx index 2db2e19..3d0bcef 100644 --- a/src/components/Qr.tsx +++ b/src/components/Qr.tsx @@ -9,7 +9,7 @@ export default function Qr() const { user } = useContext(UserCtx) as UserCtxT; const [dog, setDog] = useState({}); // local dog not the dog in UserContext - if(user) + if(user && dog.success === undefined) { Axios.post('getDog.php', { diff --git a/src/components/logout.php b/src/components/logout.php deleted file mode 100644 index db82b7b..0000000 --- a/src/components/logout.php +++ /dev/null @@ -1,11 +0,0 @@ - diff --git a/src/context/UserContext.tsx b/src/context/UserContext.tsx index 9000912..9a0821b 100644 --- a/src/context/UserContext.tsx +++ b/src/context/UserContext.tsx @@ -41,6 +41,8 @@ export type UserCtxT = { user: TUser | null, + setUser: React.Dispatch>, + 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, diff --git a/src/services/FileUploadService.ts b/src/services/FileUploadService.ts new file mode 100644 index 0000000..7481093 --- /dev/null +++ b/src/services/FileUploadService.ts @@ -0,0 +1,27 @@ +//import http from "../http-common"; + +import { Axios } from '../context/UserContext'; + +const upload = (file: File, onUploadProgress: any): Promise => { + let formData = new FormData(); + + formData.append("file", file); + + return Axios.post("/upload", formData, { + headers: { + "Content-Type": "multipart/form-data", + }, + onUploadProgress, + }); +}; + +const getFiles = () : Promise => { + return Axios.get("/files"); + }; + + const FileUploadService = { + upload, + getFiles, + }; + + export default FileUploadService; \ No newline at end of file diff --git a/src/types/File.ts b/src/types/File.ts new file mode 100644 index 0000000..cd9b156 --- /dev/null +++ b/src/types/File.ts @@ -0,0 +1,5 @@ +export default interface IFile +{ + url: string, + name: string, +} \ No newline at end of file