Fixed types, basic auth, fixed geting location, added loginpage
parent
5110955b22
commit
4ea0a209f5
@ -1,6 +0,0 @@
|
|||||||
{
|
|
||||||
"phabricator.uri": "https://hub.sealcode.org/",
|
|
||||||
"load": [
|
|
||||||
"arcanist-linters"
|
|
||||||
]
|
|
||||||
}
|
|
@ -1,14 +0,0 @@
|
|||||||
{
|
|
||||||
"linters": {
|
|
||||||
"prettier": {
|
|
||||||
"type": "prettier",
|
|
||||||
"bin": "./node_modules/.bin/prettier",
|
|
||||||
"include": ["(\\.js$)", "(\\.ts$)", "(\\.css$)"]
|
|
||||||
},
|
|
||||||
"eslint": {
|
|
||||||
"type": "eslint",
|
|
||||||
"include": ["(\\.ts$)", "(\\.js$)"]
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
@ -0,0 +1,7 @@
|
|||||||
|
export interface FileType {
|
||||||
|
lastModified: number;
|
||||||
|
name: string;
|
||||||
|
size: number;
|
||||||
|
type: string;
|
||||||
|
webkitRelativePath: string;
|
||||||
|
}
|
@ -1,18 +0,0 @@
|
|||||||
import request from "request";
|
|
||||||
|
|
||||||
export async function getJSON(uri: string): Promise<Object> {
|
|
||||||
return new Promise(function (resolve, reject) {
|
|
||||||
let data = "";
|
|
||||||
const reply = request({
|
|
||||||
uri,
|
|
||||||
headers: {
|
|
||||||
"User-Agent": "Poznanski Parkingowy Patrol - telegram bot",
|
|
||||||
},
|
|
||||||
});
|
|
||||||
reply.on("data", (chunk) => {
|
|
||||||
data += chunk;
|
|
||||||
});
|
|
||||||
reply.on("error", reject);
|
|
||||||
reply.on("end", () => resolve(JSON.parse(data)));
|
|
||||||
});
|
|
||||||
}
|
|
@ -1,22 +1,24 @@
|
|||||||
import { getJSON } from "./http";
|
import axios from "axios";
|
||||||
|
|
||||||
export type Location = {
|
export type Location = {
|
||||||
lat: number;
|
lat: number;
|
||||||
lon: number;
|
lon: number;
|
||||||
};
|
};
|
||||||
|
|
||||||
export type Address = {
|
export type Address = {
|
||||||
house_number: string;
|
house_number?: string;
|
||||||
road: string;
|
road?: string;
|
||||||
suburb: string;
|
suburb?: string;
|
||||||
neighbourhood: string;
|
neighbourhood?: string;
|
||||||
hamlet: string;
|
hamlet?: string;
|
||||||
};
|
};
|
||||||
|
|
||||||
export async function getAddress(location: Location): Promise<Address> {
|
export async function getAddress(location: Location): Promise<Address | void> {
|
||||||
const nominatim_url = `https://nominatim.openstreetmap.org/reverse?lat=${location.lat}&lon=${location.lon}&format=jsonv2`;
|
const nominatim_url = `https://nominatim.openstreetmap.org/reverse?lat=${location.lat}&lon=${location.lon}&format=jsonv2`;
|
||||||
const nominatim_data = (await getJSON(nominatim_url)) as {
|
try {
|
||||||
address: Address;
|
const data = await axios.get(nominatim_url);
|
||||||
};
|
const nominatim_dat = data.data as { address: Address };
|
||||||
return nominatim_data.address;
|
return nominatim_dat.address;
|
||||||
|
} catch (error) {
|
||||||
|
console.log(123);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,14 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<link
|
||||||
|
href="https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.0.3/leaflet.css"
|
||||||
|
rel="stylesheet"
|
||||||
|
/>
|
||||||
|
<title>Zgłaszańsko</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="root"></div>
|
||||||
|
<script src="./login.tsx"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
@ -0,0 +1,97 @@
|
|||||||
|
/* eslint-disable @typescript-eslint/no-unused-vars */
|
||||||
|
import React, { ReactElement, useEffect, useState } from "react";
|
||||||
|
import ReactDOM from "react-dom";
|
||||||
|
import Nav from "./Nav";
|
||||||
|
import "./styles/reset.css";
|
||||||
|
import "./styles/app.scss";
|
||||||
|
import "regenerator-runtime/runtime";
|
||||||
|
import axios from "axios";
|
||||||
|
|
||||||
|
export default function Login(): ReactElement {
|
||||||
|
const [isLogged, setIsLogged] = useState(false);
|
||||||
|
const checkUser = async (): Promise<void> => {
|
||||||
|
try {
|
||||||
|
await axios.get(
|
||||||
|
"http://localhost:8080/api/v1/collections/users/me"
|
||||||
|
);
|
||||||
|
setIsLogged(true);
|
||||||
|
} catch (error) {
|
||||||
|
setIsLogged(false);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
useEffect(() => {
|
||||||
|
void checkUser();
|
||||||
|
}, []);
|
||||||
|
const [loginState, setLoginState] = useState({
|
||||||
|
username: "",
|
||||||
|
password: "",
|
||||||
|
});
|
||||||
|
const [error, setError] = useState(null);
|
||||||
|
const postLogin = async () => {
|
||||||
|
try {
|
||||||
|
await axios.post("http://localhost:8080/api/v1/sessions/", {
|
||||||
|
username: loginState.username,
|
||||||
|
password: loginState.password,
|
||||||
|
});
|
||||||
|
} catch (e) {
|
||||||
|
console.log(e);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
const logout = async () => {
|
||||||
|
const who = await axios.get(
|
||||||
|
"http://localhost:8080/api/v1/collections/users/me"
|
||||||
|
);
|
||||||
|
console.log(who);
|
||||||
|
const logout = await axios.delete(
|
||||||
|
"http://localhost:8080/api/v1/collections/sessions/current"
|
||||||
|
);
|
||||||
|
console.log(logout);
|
||||||
|
};
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<Nav isLogged={isLogged} />
|
||||||
|
<form>
|
||||||
|
<label htmlFor="username">
|
||||||
|
Nazwa użytkownika
|
||||||
|
<input
|
||||||
|
type="text"
|
||||||
|
name="username"
|
||||||
|
value={loginState.username}
|
||||||
|
onChange={(e) =>
|
||||||
|
setLoginState({
|
||||||
|
...loginState,
|
||||||
|
username: e.target.value,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
/>
|
||||||
|
</label>
|
||||||
|
<label htmlFor="password">
|
||||||
|
Hasło
|
||||||
|
<input
|
||||||
|
type="password"
|
||||||
|
name="password"
|
||||||
|
value={loginState.password}
|
||||||
|
onChange={(e) =>
|
||||||
|
setLoginState({
|
||||||
|
...loginState,
|
||||||
|
password: e.target.value,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
/>
|
||||||
|
</label>
|
||||||
|
<button
|
||||||
|
type="submit"
|
||||||
|
onClick={(e) => {
|
||||||
|
e.preventDefault();
|
||||||
|
console.log(postLogin());
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
Zaloguj
|
||||||
|
</button>
|
||||||
|
</form>
|
||||||
|
|
||||||
|
<button onClick={logout}>Wyloguj</button>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
ReactDOM.render(<Login />, document.getElementById("root"));
|
@ -1,110 +1,110 @@
|
|||||||
export type Offense = {
|
export type Offense = {
|
||||||
name: string;
|
name: string;
|
||||||
car_is: string;
|
car_is: string;
|
||||||
id: string;
|
id: string;
|
||||||
implies?: string[];
|
implies?: string[];
|
||||||
};
|
};
|
||||||
|
|
||||||
export const offenses: Offense[] = [
|
export const offenses: Offense[] = [
|
||||||
{
|
{
|
||||||
id: "obszar_wyłączony",
|
id: "obszar_wyłączony",
|
||||||
name: "Parkowanie na obszarze wyłączonym z ruchu",
|
name: "Parkowanie na obszarze wyłączonym z ruchu",
|
||||||
car_is: "jest zaparkowany na obszarze wyłączonym z ruchu",
|
car_is: "jest zaparkowany na obszarze wyłączonym z ruchu",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: "widoczność_pasy",
|
id: "widoczność_pasy",
|
||||||
name: "Ograniczanie widoczności na pasach",
|
name: "Ograniczanie widoczności na pasach",
|
||||||
car_is:
|
car_is:
|
||||||
"ogranicza widoczność na przejściu dla pieszych, powodując zagrożenie osób korzystających z przejścia",
|
"ogranicza widoczność na przejściu dla pieszych, powodując zagrożenie osób korzystających z przejścia",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: "widoczność_skrz",
|
id: "widoczność_skrz",
|
||||||
name: "Ograniczanie widoczności na skrzyżowaniu",
|
name: "Ograniczanie widoczności na skrzyżowaniu",
|
||||||
car_is:
|
car_is:
|
||||||
"ogranicza widoczność na skrzyżowaniu, powodując zagrożenie dla uczestników ruchu",
|
"ogranicza widoczność na skrzyżowaniu, powodując zagrożenie dla uczestników ruchu",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: "utrudnia_ruch_rowerom",
|
id: "utrudnia_ruch_rowerom",
|
||||||
name: "Utrudnianie ruchu rowerowego",
|
name: "Utrudnianie ruchu rowerowego",
|
||||||
car_is: "utrudnia ruch rowerowy",
|
car_is: "utrudnia ruch rowerowy",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: "utrudnia_ruch_pieszym",
|
id: "utrudnia_ruch_pieszym",
|
||||||
name: "Utrudnianie ruchu pieszego",
|
name: "Utrudnianie ruchu pieszego",
|
||||||
car_is: "utrudnia ruch pieszych",
|
car_is: "utrudnia ruch pieszych",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: "poza_wyzn",
|
id: "poza_wyzn",
|
||||||
name: "Parkowanie poza wyznaczonym miejscem",
|
name: "Parkowanie poza wyznaczonym miejscem",
|
||||||
car_is: "jest zaparkowany poza wyznaczonym miejscem parkingowym",
|
car_is: "jest zaparkowany poza wyznaczonym miejscem parkingowym",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: "przed_przejsc",
|
id: "przed_przejsc",
|
||||||
name: "Parkowanie <10m przed przejściem dla pieszych",
|
name: "Parkowanie <10m przed przejściem dla pieszych",
|
||||||
car_is: "jest zaparkowany mniej niż 10m przed przejściem dla pieszych",
|
car_is: "jest zaparkowany mniej niż 10m przed przejściem dla pieszych",
|
||||||
implies: ["widoczność_pasy"],
|
implies: ["widoczność_pasy"],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: "na_zakazie",
|
id: "na_zakazie",
|
||||||
name: "Parkowanie za znakiem zakazu parkowania",
|
name: "Parkowanie za znakiem zakazu parkowania",
|
||||||
car_is: "jest zaparkowany za znakiem zakazu parkowania",
|
car_is: "jest zaparkowany za znakiem zakazu parkowania",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: "brama",
|
id: "brama",
|
||||||
name: "Blokowanie bramy wjazdowej",
|
name: "Blokowanie bramy wjazdowej",
|
||||||
car_is: "blokuje bramę wjazdową",
|
car_is: "blokuje bramę wjazdową",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: "na_chodzie",
|
id: "na_chodzie",
|
||||||
name: "Postój na chodzie",
|
name: "Postój na chodzie",
|
||||||
car_is: "ma włączony silnik podczas postoju",
|
car_is: "ma włączony silnik podczas postoju",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: "blk_chodnik",
|
id: "blk_chodnik",
|
||||||
name: "Blokowanie chodnika",
|
name: "Blokowanie chodnika",
|
||||||
car_is:
|
car_is:
|
||||||
"jest zaparkowany na chodniku pozostawiając mniej niż 1,5m dla pieszych",
|
"jest zaparkowany na chodniku pozostawiając mniej niż 1,5m dla pieszych",
|
||||||
implies: ["utrudnia_ruch_pieszym"],
|
implies: ["utrudnia_ruch_pieszym"],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: "chyba2.5t",
|
id: "chyba2.5t",
|
||||||
name: "Duży samochód dostawczy na chodniku",
|
name: "Duży samochód dostawczy na chodniku",
|
||||||
car_is:
|
car_is:
|
||||||
"najprawdopodobniej przekracza dopuszczalną całkowitą masę 2,5t będąc zaparkowanym na chodniku",
|
"najprawdopodobniej przekracza dopuszczalną całkowitą masę 2,5t będąc zaparkowanym na chodniku",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: "hydrant",
|
id: "hydrant",
|
||||||
name: "Blokowanie hydrantu",
|
name: "Blokowanie hydrantu",
|
||||||
car_is: "blokuje dostęp do hydrantu",
|
car_is: "blokuje dostęp do hydrantu",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: "przystanek_15",
|
id: "przystanek_15",
|
||||||
name: "Parkowanie <15m od przystanku",
|
name: "Parkowanie <15m od przystanku",
|
||||||
car_is:
|
car_is:
|
||||||
"jest zaparkowany w odległości mniejszej niż 15m od tablicy oznaczającej przystanek",
|
"jest zaparkowany w odległości mniejszej niż 15m od tablicy oznaczającej przystanek",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: "utr_innym_zapark",
|
id: "utr_innym_zapark",
|
||||||
name: "Utrudnianie wyjazdu innym zaparkowanym samochodom",
|
name: "Utrudnianie wyjazdu innym zaparkowanym samochodom",
|
||||||
car_is:
|
car_is:
|
||||||
"dokonuje postoju w miejscu utrudniającym dostęp do innych, prawidłowo zaparkowanych pojazdów lub wyjazd tych pojazdów",
|
"dokonuje postoju w miejscu utrudniającym dostęp do innych, prawidłowo zaparkowanych pojazdów lub wyjazd tych pojazdów",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: "pas_rowerow",
|
id: "pas_rowerow",
|
||||||
name: "blokuje pas rowerów",
|
name: "blokuje pas rowerów",
|
||||||
car_is: "zaparkowany na pasie dla rowerów",
|
car_is: "zaparkowany na pasie dla rowerów",
|
||||||
implies: ["utrudnia_ruch_rowerom"],
|
implies: ["utrudnia_ruch_rowerom"],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: "t30",
|
id: "t30",
|
||||||
name: "Parkowanie niezgodnie z rysunkiem na tabliczce (T-30)",
|
name: "Parkowanie niezgodnie z rysunkiem na tabliczce (T-30)",
|
||||||
car_is:
|
car_is:
|
||||||
"nie stosuje się do znaku T-30, wskazującego sposób ustawienia pojazdu względem krawędzi jezdni",
|
"nie stosuje się do znaku T-30, wskazującego sposób ustawienia pojazdu względem krawędzi jezdni",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: "blokuje_znak",
|
id: "blokuje_znak",
|
||||||
name: "Zasłanianie znaku drogowego",
|
name: "Zasłanianie znaku drogowego",
|
||||||
car_is:
|
car_is:
|
||||||
"zaparkowany w odległości mniejszej niż 10m od przedniej strony znaku drogowego, zasłaniając go (Art 49, punkt 1, ust. 6)",
|
"zaparkowany w odległości mniejszej niż 10m od przedniej strony znaku drogowego, zasłaniając go (Art 49, punkt 1, ust. 6)",
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
@ -0,0 +1,26 @@
|
|||||||
|
.navbar {
|
||||||
|
width: 100%;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: space-between;
|
||||||
|
border-bottom: #000000 2px solid;
|
||||||
|
padding: 15px 0;
|
||||||
|
}
|
||||||
|
.navbar__title {
|
||||||
|
font-size: 1.5em;
|
||||||
|
margin: 0 15px;
|
||||||
|
}
|
||||||
|
.navbar__links {
|
||||||
|
display: flex;
|
||||||
|
}
|
||||||
|
.button-link {
|
||||||
|
background-color: #999;
|
||||||
|
height: 2rem;
|
||||||
|
line-height: 2rem;
|
||||||
|
padding: 0 0.75rem;
|
||||||
|
text-decoration: none;
|
||||||
|
color: white;
|
||||||
|
border: none;
|
||||||
|
cursor: pointer;
|
||||||
|
margin: 0 15px;
|
||||||
|
}
|
Loading…
Reference in New Issue