Compare commits
6 Commits
master
...
641e334d83
Author | SHA1 | Date | |
---|---|---|---|
641e334d83 | |||
887398fa02 | |||
6e43f12a4f | |||
d65335683c | |||
99196c6dba | |||
738381ee16 |
@ -47,8 +47,7 @@ WORKDIR /home/node
|
|||||||
EXPOSE 3000
|
EXPOSE 3000
|
||||||
|
|
||||||
# Add Healthcheck
|
# Add Healthcheck
|
||||||
# FIXME: faire en sorte que le healthcheck fonctionne
|
HEALTHCHECK --interval=10s --timeout=10s --start-period=5s --retries=3 CMD wget --no-verbose --tries=1 --spider http://localhost:3000 || exit 1
|
||||||
# HEALTHCHECK --interval=10s --timeout=10s --start-period=5s --retries=3 CMD wget --no-verbose --tries=1 --spider http://localhost:3000 || exit 1
|
|
||||||
|
|
||||||
# copy from build image
|
# copy from build image
|
||||||
COPY --chown=node:node --from=BUILD_IMAGE /home/node/node_modules ./node_modules
|
COPY --chown=node:node --from=BUILD_IMAGE /home/node/node_modules ./node_modules
|
||||||
|
@ -1,8 +1,5 @@
|
|||||||
/** @type {import('ts-jest').JestConfigWithTsJest} */
|
/** @type {import('ts-jest').JestConfigWithTsJest} */
|
||||||
module.exports = {
|
module.exports = {
|
||||||
testPathIgnorePatterns: [
|
|
||||||
"<rootDir>/dist/"
|
|
||||||
],
|
|
||||||
testTimeout: 10000,
|
testTimeout: 10000,
|
||||||
preset: 'ts-jest',
|
preset: 'ts-jest',
|
||||||
testEnvironment: 'node',
|
testEnvironment: 'node',
|
||||||
|
24
Express/barAndCafe/package-lock.json
generated
24
Express/barAndCafe/package-lock.json
generated
@ -8,7 +8,6 @@
|
|||||||
"@types/express": "^4.17.21",
|
"@types/express": "^4.17.21",
|
||||||
"@types/node": "^20.12.7",
|
"@types/node": "^20.12.7",
|
||||||
"axios": "^1.6.8",
|
"axios": "^1.6.8",
|
||||||
"cors": "^2.8.5",
|
|
||||||
"dotenv": "^16.4.5",
|
"dotenv": "^16.4.5",
|
||||||
"express": "^4.19.2",
|
"express": "^4.19.2",
|
||||||
"rimraf": "^5.0.5",
|
"rimraf": "^5.0.5",
|
||||||
@ -16,7 +15,6 @@
|
|||||||
"swagger-ui-express": "^5.0.0"
|
"swagger-ui-express": "^5.0.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/cors": "^2.8.17",
|
|
||||||
"@types/jest": "^29.5.12",
|
"@types/jest": "^29.5.12",
|
||||||
"@types/rewire": "^2.5.30",
|
"@types/rewire": "^2.5.30",
|
||||||
"@types/supertest": "^6.0.2",
|
"@types/supertest": "^6.0.2",
|
||||||
@ -1970,15 +1968,6 @@
|
|||||||
"integrity": "sha512-he+DHOWReW0nghN24E1WUqM0efK4kI9oTqDm6XmK8ZPe2djZ90BSNdGnIyCLzCPw7/pogPlGbzI2wHGGmi4O/Q==",
|
"integrity": "sha512-he+DHOWReW0nghN24E1WUqM0efK4kI9oTqDm6XmK8ZPe2djZ90BSNdGnIyCLzCPw7/pogPlGbzI2wHGGmi4O/Q==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/@types/cors": {
|
|
||||||
"version": "2.8.17",
|
|
||||||
"resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz",
|
|
||||||
"integrity": "sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==",
|
|
||||||
"dev": true,
|
|
||||||
"dependencies": {
|
|
||||||
"@types/node": "*"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/@types/express": {
|
"node_modules/@types/express": {
|
||||||
"version": "4.17.21",
|
"version": "4.17.21",
|
||||||
"resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz",
|
"resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz",
|
||||||
@ -4756,18 +4745,6 @@
|
|||||||
"dev": true,
|
"dev": true,
|
||||||
"optional": true
|
"optional": true
|
||||||
},
|
},
|
||||||
"node_modules/cors": {
|
|
||||||
"version": "2.8.5",
|
|
||||||
"resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
|
|
||||||
"integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
|
|
||||||
"dependencies": {
|
|
||||||
"object-assign": "^4",
|
|
||||||
"vary": "^1"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">= 0.10"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/create-jest": {
|
"node_modules/create-jest": {
|
||||||
"version": "29.7.0",
|
"version": "29.7.0",
|
||||||
"resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz",
|
"resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz",
|
||||||
@ -9271,6 +9248,7 @@
|
|||||||
"version": "4.1.1",
|
"version": "4.1.1",
|
||||||
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
|
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
|
||||||
"integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
|
"integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
|
||||||
|
"dev": true,
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=0.10.0"
|
"node": ">=0.10.0"
|
||||||
}
|
}
|
||||||
|
@ -14,7 +14,6 @@
|
|||||||
"@types/express": "^4.17.21",
|
"@types/express": "^4.17.21",
|
||||||
"@types/node": "^20.12.7",
|
"@types/node": "^20.12.7",
|
||||||
"axios": "^1.6.8",
|
"axios": "^1.6.8",
|
||||||
"cors": "^2.8.5",
|
|
||||||
"dotenv": "^16.4.5",
|
"dotenv": "^16.4.5",
|
||||||
"express": "^4.19.2",
|
"express": "^4.19.2",
|
||||||
"rimraf": "^5.0.5",
|
"rimraf": "^5.0.5",
|
||||||
@ -22,7 +21,6 @@
|
|||||||
"swagger-ui-express": "^5.0.0"
|
"swagger-ui-express": "^5.0.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/cors": "^2.8.17",
|
|
||||||
"@types/jest": "^29.5.12",
|
"@types/jest": "^29.5.12",
|
||||||
"@types/rewire": "^2.5.30",
|
"@types/rewire": "^2.5.30",
|
||||||
"@types/supertest": "^6.0.2",
|
"@types/supertest": "^6.0.2",
|
||||||
|
@ -1,13 +1,11 @@
|
|||||||
import { getCity, getRadius, getPoiId, getBox } from "./openTripMaps"
|
import { getCity, getRadius, getPoiId, getBox } from "./openTripMaps"
|
||||||
import express from "express"
|
import express from "express"
|
||||||
import cors from "cors"
|
|
||||||
/**
|
/**
|
||||||
* Initialize Express application instance.
|
* Initialize Express application instance.
|
||||||
* @returns An initialized Express application object.
|
* @returns An initialized Express application object.
|
||||||
*/
|
*/
|
||||||
const app = express()
|
const app = express()
|
||||||
|
|
||||||
app.use(cors())
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -13,7 +13,7 @@ const key = process.env.OPEN_TRIP_MAPS_KEY
|
|||||||
* @param {string} lat2 Latitude of the 2nd point of the box
|
* @param {string} lat2 Latitude of the 2nd point of the box
|
||||||
* @returns {FeatureCollection} a list of POIs with their type, id, etc. (cf: [opentripmap](https://dev.opentripmap.org/docs#))
|
* @returns {FeatureCollection} a list of POIs with their type, id, etc. (cf: [opentripmap](https://dev.opentripmap.org/docs#))
|
||||||
*/
|
*/
|
||||||
async function callBox(lon1:string, lat1:string, lon2: string, lat2: string, rate: string) {
|
async function callBox(lon1:string, lat1:string, lon2: string, lat2: string) {
|
||||||
const lonMin = Math.min(parseFloat(lon1), parseFloat(lon2))
|
const lonMin = Math.min(parseFloat(lon1), parseFloat(lon2))
|
||||||
const lonMax = Math.max(parseFloat(lon1), parseFloat(lon2))
|
const lonMax = Math.max(parseFloat(lon1), parseFloat(lon2))
|
||||||
const latMin = Math.min(parseFloat(lat1), parseFloat(lat2))
|
const latMin = Math.min(parseFloat(lat1), parseFloat(lat2))
|
||||||
@ -27,7 +27,6 @@ async function callBox(lon1:string, lat1:string, lon2: string, lat2: string, rat
|
|||||||
lon_max: lonMax,
|
lon_max: lonMax,
|
||||||
lat_min: latMin,
|
lat_min: latMin,
|
||||||
lat_max: latMax,
|
lat_max: latMax,
|
||||||
rate: rate,
|
|
||||||
apikey: key,
|
apikey: key,
|
||||||
kinds: 'bars,cafes,pubs,biergartens'
|
kinds: 'bars,cafes,pubs,biergartens'
|
||||||
},
|
},
|
||||||
@ -183,16 +182,12 @@ export async function getBox(req:express.Request, res: express.Response) {
|
|||||||
const lat1 = req.query["lat1"] as string
|
const lat1 = req.query["lat1"] as string
|
||||||
const lon2 = req.query["lon2"] as string
|
const lon2 = req.query["lon2"] as string
|
||||||
const lat2 = req.query["lat2"] as string
|
const lat2 = req.query["lat2"] as string
|
||||||
let rate = req.query["rate"] as string
|
|
||||||
if(!lon1 || !lat1 || !lon2 || !lat2){
|
if(!lon1 || !lat1 || !lon2 || !lat2){
|
||||||
res.status(400).send("Missing Argument")
|
res.status(400).send("Missing Argument")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!rate){
|
res.send( await callBox(lon1, lat1, lon2, lat2))
|
||||||
rate = "1";
|
|
||||||
}
|
|
||||||
|
|
||||||
res.send( await callBox(lon1, lat1, lon2, lat2, rate))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//TODO: fair une route ou l'on donne 2 coordonée
|
||||||
|
@ -21,7 +21,7 @@ const options = {
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
apis: ['./src/*.ts','./dist/src/*.js'],
|
apis: ['./src/*.ts'],
|
||||||
explorer: true
|
explorer: true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -219,14 +219,6 @@ describe("Test the otm city path", () => {
|
|||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
function sleep(milliseconds: number) {
|
|
||||||
const date = Date.now();
|
|
||||||
let currentDate = null;
|
|
||||||
do {
|
|
||||||
currentDate = Date.now();
|
|
||||||
} while (currentDate - date < milliseconds);
|
|
||||||
}
|
|
||||||
sleep(2000);
|
|
||||||
request(app)
|
request(app)
|
||||||
.get("/otm/box")
|
.get("/otm/box")
|
||||||
.query({'lon1':'-1.435199','lon2':'-1.43519', 'lat1':'46.668460', 'lat2':'46.668461'})
|
.query({'lon1':'-1.435199','lon2':'-1.43519', 'lat1':'46.668460', 'lat2':'46.668461'})
|
||||||
|
@ -1,18 +0,0 @@
|
|||||||
{
|
|
||||||
"folders": [
|
|
||||||
{
|
|
||||||
"name": "Ratrapage_WEB",
|
|
||||||
"path": "."
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "barAndCafe",
|
|
||||||
"path": "Express/barAndCafe"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"path": "front"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"settings": {
|
|
||||||
"typescript.tsdk": "node_modules/typescript/lib"
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,6 +1,5 @@
|
|||||||
vars {
|
vars {
|
||||||
TRIPMAP_URL: https://api.opentripmap.com/0.1
|
TRIPMAP_URL: https://api.opentripmap.com/0.1
|
||||||
EXPRESS_API: http://localhost:3001
|
|
||||||
}
|
}
|
||||||
vars:secret [
|
vars:secret [
|
||||||
app_key,
|
app_key,
|
||||||
|
@ -1,8 +0,0 @@
|
|||||||
vars {
|
|
||||||
EXPRESS_API: https://drink-tweb.cb85.fr
|
|
||||||
PB_URL: https://pb-tweb.cb85.fr
|
|
||||||
TRIPMAP_URL: https://api.opentripmap.com/0.1/
|
|
||||||
}
|
|
||||||
vars:secret [
|
|
||||||
OTM_KEY
|
|
||||||
]
|
|
@ -5,7 +5,7 @@ meta {
|
|||||||
}
|
}
|
||||||
|
|
||||||
get {
|
get {
|
||||||
url: {{EXPRESS_API}}/otm/city?name=La roche sur yon&radius=300
|
url: http://localhost:3001/otm/city?name=La roche sur yon&radius=300
|
||||||
body: none
|
body: none
|
||||||
auth: none
|
auth: none
|
||||||
}
|
}
|
||||||
|
@ -1,16 +0,0 @@
|
|||||||
meta {
|
|
||||||
name: otm_city
|
|
||||||
type: http
|
|
||||||
seq: 5
|
|
||||||
}
|
|
||||||
|
|
||||||
get {
|
|
||||||
url: {{TRIPMAP_URL}}/en/places/geoname?name=paris&apikey={{OTM_KEY}}
|
|
||||||
body: none
|
|
||||||
auth: none
|
|
||||||
}
|
|
||||||
|
|
||||||
query {
|
|
||||||
name: paris
|
|
||||||
apikey: {{OTM_KEY}}
|
|
||||||
}
|
|
@ -1,18 +0,0 @@
|
|||||||
meta {
|
|
||||||
name: connexion
|
|
||||||
type: http
|
|
||||||
seq: 1
|
|
||||||
}
|
|
||||||
|
|
||||||
post {
|
|
||||||
url: {{PB_URL}}/api/collections/users/auth-with-password
|
|
||||||
body: json
|
|
||||||
auth: none
|
|
||||||
}
|
|
||||||
|
|
||||||
body:json {
|
|
||||||
{
|
|
||||||
"identity": "michel.biche@aptatio.com",
|
|
||||||
"password": "123456789"
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,27 +0,0 @@
|
|||||||
meta {
|
|
||||||
name: get all poi
|
|
||||||
type: http
|
|
||||||
seq: 5
|
|
||||||
}
|
|
||||||
|
|
||||||
get {
|
|
||||||
url: {{PB_URL}}/api/collections/user_poi/records?filter=owner='vvy93m1hoaeshwy'&&poi_list='cabkkovmjsfoapa'
|
|
||||||
body: json
|
|
||||||
auth: bearer
|
|
||||||
}
|
|
||||||
|
|
||||||
query {
|
|
||||||
filter: owner
|
|
||||||
poi_list: 'cabkkovmjsfoapa'
|
|
||||||
}
|
|
||||||
|
|
||||||
auth:bearer {
|
|
||||||
token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJjb2xsZWN0aW9uSWQiOiJfcGJfdXNlcnNfYXV0aF8iLCJleHAiOjE3MTg4Mjg0NzEsImlkIjoidnZ5OTNtMWhvYWVzaHd5IiwidHlwZSI6ImF1dGhSZWNvcmQifQ.pC7u-QaZ_BYqWA5wG8wu1lRbbd4mKuKeAveWe_IBnfU
|
|
||||||
}
|
|
||||||
|
|
||||||
body:json {
|
|
||||||
{
|
|
||||||
"owner": "vvy93m1hoaeshwy",
|
|
||||||
"poi_list": "sh430u0im37cxm5"
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,22 +0,0 @@
|
|||||||
meta {
|
|
||||||
name: link user to poi
|
|
||||||
type: http
|
|
||||||
seq: 3
|
|
||||||
}
|
|
||||||
|
|
||||||
post {
|
|
||||||
url: {{PB_URL}}/api/collections/user_poi/records
|
|
||||||
body: json
|
|
||||||
auth: bearer
|
|
||||||
}
|
|
||||||
|
|
||||||
auth:bearer {
|
|
||||||
token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJjb2xsZWN0aW9uSWQiOiJfcGJfdXNlcnNfYXV0aF8iLCJleHAiOjE3MTg4Mjg0NzEsImlkIjoidnZ5OTNtMWhvYWVzaHd5IiwidHlwZSI6ImF1dGhSZWNvcmQifQ.pC7u-QaZ_BYqWA5wG8wu1lRbbd4mKuKeAveWe_IBnfU
|
|
||||||
}
|
|
||||||
|
|
||||||
body:json {
|
|
||||||
{
|
|
||||||
"owner": "vvy93m1hoaeshwy",
|
|
||||||
"poi_list": "sh430u0im37cxm5"
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,40 +0,0 @@
|
|||||||
meta {
|
|
||||||
name: send a poi
|
|
||||||
type: http
|
|
||||||
seq: 2
|
|
||||||
}
|
|
||||||
|
|
||||||
post {
|
|
||||||
url: {{PB_URL}}/api/collections/POI/records
|
|
||||||
body: json
|
|
||||||
auth: bearer
|
|
||||||
}
|
|
||||||
|
|
||||||
auth:bearer {
|
|
||||||
token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJjb2xsZWN0aW9uSWQiOiJfcGJfdXNlcnNfYXV0aF8iLCJleHAiOjE3MTg4Mjg0NzEsImlkIjoidnZ5OTNtMWhvYWVzaHd5IiwidHlwZSI6ImF1dGhSZWNvcmQifQ.pC7u-QaZ_BYqWA5wG8wu1lRbbd4mKuKeAveWe_IBnfU
|
|
||||||
}
|
|
||||||
|
|
||||||
body:json {
|
|
||||||
{
|
|
||||||
"Poi_id": "11472887",
|
|
||||||
"Poi": {
|
|
||||||
"type": "Feature",
|
|
||||||
"id": "11472887",
|
|
||||||
"geometry": {
|
|
||||||
"type": "Point",
|
|
||||||
"coordinates": [
|
|
||||||
-0.0626024,
|
|
||||||
51.4924088
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"properties": {
|
|
||||||
"xid": "W544344833",
|
|
||||||
"name": "The Blue Anchor",
|
|
||||||
"rate": 2,
|
|
||||||
"osm": "way/544344833",
|
|
||||||
"wikidata": "Q7718716",
|
|
||||||
"kinds": "pubs,foods,shops,marketplaces,tourist_facilities"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,37 +0,0 @@
|
|||||||
meta {
|
|
||||||
name: send fav to astro
|
|
||||||
type: http
|
|
||||||
seq: 4
|
|
||||||
}
|
|
||||||
|
|
||||||
post {
|
|
||||||
url: http://localhost:3000/maps/save_poi
|
|
||||||
body: json
|
|
||||||
auth: bearer
|
|
||||||
}
|
|
||||||
|
|
||||||
auth:bearer {
|
|
||||||
token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJjb2xsZWN0aW9uSWQiOiJfcGJfdXNlcnNfYXV0aF8iLCJleHAiOjE3MTg4ODY2OTIsImlkIjoidnZ5OTNtMWhvYWVzaHd5IiwidHlwZSI6ImF1dGhSZWNvcmQifQ.R9PBGlHn6aBHt89g6G0NykMh_Vye24OpKEUYtz6R6Og
|
|
||||||
}
|
|
||||||
|
|
||||||
body:json {
|
|
||||||
{
|
|
||||||
"type": "Feature",
|
|
||||||
"id": "11472888",
|
|
||||||
"geometry": {
|
|
||||||
"type": "Point",
|
|
||||||
"coordinates": [
|
|
||||||
-0.0626024,
|
|
||||||
51.4924088
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"properties": {
|
|
||||||
"xid": "W544344833",
|
|
||||||
"name": "The Blue Anchor",
|
|
||||||
"rate": 2,
|
|
||||||
"osm": "way/544344833",
|
|
||||||
"wikidata": "Q7718716",
|
|
||||||
"kinds": "pubs,foods,shops,marketplaces,tourist_facilities"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -18,9 +18,7 @@ services:
|
|||||||
- public
|
- public
|
||||||
|
|
||||||
front:
|
front:
|
||||||
image: git.lab-ouest.org/epitech/ratrapage_t-web_front:pr-16-head
|
image: git.lab-ouest.org/epitech/ratrapage_t-web_front:pr-1-head
|
||||||
environment:
|
|
||||||
- POCKETBASE_URL=https://${POCKET_BASE_URL}
|
|
||||||
depends_on:
|
depends_on:
|
||||||
- pocketbase
|
- pocketbase
|
||||||
labels:
|
labels:
|
||||||
@ -32,10 +30,9 @@ services:
|
|||||||
- public
|
- public
|
||||||
|
|
||||||
back_drink:
|
back_drink:
|
||||||
image: git.lab-ouest.org/epitech/ratrapage_t-web_back:master
|
image: git.lab-ouest.org/epitech/ratrapage_t-web_back:pr-6-head
|
||||||
environment:
|
environment:
|
||||||
- port=${BACK_BASE_PORT}
|
- port=${BACK_BASE_PORT}
|
||||||
- OPEN_TRIP_MAPS_KEY=${OPEN_TRIP_MAPS_KEY}
|
|
||||||
labels:
|
labels:
|
||||||
- traefik.enable=true
|
- traefik.enable=true
|
||||||
- traefik.http.routers.expressDrinkTweb.rule=Host(`${DRINK_URL}`)
|
- traefik.http.routers.expressDrinkTweb.rule=Host(`${DRINK_URL}`)
|
||||||
|
@ -27,7 +27,6 @@ const whenExternalScripts = (items = []) =>
|
|||||||
|
|
||||||
export default defineConfig({
|
export default defineConfig({
|
||||||
|
|
||||||
output: 'server',
|
|
||||||
compressHTML: true,
|
compressHTML: true,
|
||||||
build: {
|
build: {
|
||||||
assets: 'assets',
|
assets: 'assets',
|
||||||
@ -38,6 +37,7 @@ export default defineConfig({
|
|||||||
port: 3000
|
port: 3000
|
||||||
},
|
},
|
||||||
trailingSlash: 'never',
|
trailingSlash: 'never',
|
||||||
|
output: 'server',
|
||||||
adapter: node({
|
adapter: node({
|
||||||
mode: 'standalone'
|
mode: 'standalone'
|
||||||
}),
|
}),
|
||||||
|
97
front/package-lock.json
generated
97
front/package-lock.json
generated
@ -20,16 +20,12 @@
|
|||||||
"astro-embed": "^0.7.2",
|
"astro-embed": "^0.7.2",
|
||||||
"astro-icon": "^1.1.0",
|
"astro-icon": "^1.1.0",
|
||||||
"leaflet": "^1.9.4",
|
"leaflet": "^1.9.4",
|
||||||
"leaflet-control-geocoder": "^2.4.0",
|
|
||||||
"leaflet-geosearch": "^4.0.0",
|
|
||||||
"leaflet-routing-machine": "^3.2.12",
|
|
||||||
"limax": "4.1.0",
|
"limax": "4.1.0",
|
||||||
"lodash.merge": "^4.6.2",
|
"lodash.merge": "^4.6.2",
|
||||||
"lucide-astro": "^0.372.0",
|
"lucide-astro": "^0.372.0",
|
||||||
"pocketbase": "^0.21.1",
|
"pocketbase": "^0.21.1",
|
||||||
"react-leaflet": "^4.2.1",
|
"react-leaflet": "^4.2.1",
|
||||||
"simple-icons-astro": "^11.12.0",
|
"simple-icons-astro": "^11.12.0",
|
||||||
"tailwind-merge": "^2.3.0",
|
|
||||||
"tailwindcss": "^3.4.3",
|
"tailwindcss": "^3.4.3",
|
||||||
"unpic": "^3.18.0"
|
"unpic": "^3.18.0"
|
||||||
},
|
},
|
||||||
@ -46,7 +42,6 @@
|
|||||||
"@types/eslint__js": "^8.42.3",
|
"@types/eslint__js": "^8.42.3",
|
||||||
"@types/js-yaml": "^4.0.9",
|
"@types/js-yaml": "^4.0.9",
|
||||||
"@types/leaflet": "^1.9.12",
|
"@types/leaflet": "^1.9.12",
|
||||||
"@types/leaflet-routing-machine": "^3.2.8",
|
|
||||||
"@types/lodash.merge": "^4.6.9",
|
"@types/lodash.merge": "^4.6.9",
|
||||||
"@types/node": "^20",
|
"@types/node": "^20",
|
||||||
"@typescript-eslint/eslint-plugin": "^6.21.0",
|
"@typescript-eslint/eslint-plugin": "^6.21.0",
|
||||||
@ -64,6 +59,7 @@
|
|||||||
"reading-time": "^1.5.0",
|
"reading-time": "^1.5.0",
|
||||||
"rehype-plugin-image-native-lazy-loading": "^1.2.0",
|
"rehype-plugin-image-native-lazy-loading": "^1.2.0",
|
||||||
"sharp": "0.33.3",
|
"sharp": "0.33.3",
|
||||||
|
"tailwind-merge": "^2.3.0",
|
||||||
"tailwindcss": "^3.4.3",
|
"tailwindcss": "^3.4.3",
|
||||||
"typescript": "^5",
|
"typescript": "^5",
|
||||||
"typescript-eslint": "^7.9.0",
|
"typescript-eslint": "^7.9.0",
|
||||||
@ -1133,6 +1129,7 @@
|
|||||||
"version": "7.24.5",
|
"version": "7.24.5",
|
||||||
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.5.tgz",
|
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.5.tgz",
|
||||||
"integrity": "sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g==",
|
"integrity": "sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g==",
|
||||||
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"regenerator-runtime": "^0.14.0"
|
"regenerator-runtime": "^0.14.0"
|
||||||
},
|
},
|
||||||
@ -1749,15 +1746,6 @@
|
|||||||
"resolved": "https://registry.npmjs.org/@fontsource-variable/inter/-/inter-5.0.18.tgz",
|
"resolved": "https://registry.npmjs.org/@fontsource-variable/inter/-/inter-5.0.18.tgz",
|
||||||
"integrity": "sha512-rJzSrtJ3b7djiGFvRuTe6stDfbYJGhdQSfn2SI2WfXviee7Er0yKAHE5u7FU7OWVQQQ1x3+cxdmx9NdiAkcrcA=="
|
"integrity": "sha512-rJzSrtJ3b7djiGFvRuTe6stDfbYJGhdQSfn2SI2WfXviee7Er0yKAHE5u7FU7OWVQQQ1x3+cxdmx9NdiAkcrcA=="
|
||||||
},
|
},
|
||||||
"node_modules/@googlemaps/js-api-loader": {
|
|
||||||
"version": "1.16.6",
|
|
||||||
"resolved": "https://registry.npmjs.org/@googlemaps/js-api-loader/-/js-api-loader-1.16.6.tgz",
|
|
||||||
"integrity": "sha512-V8p5W9DbPQx74jWUmyYJOerhiB4C+MHekaO0ZRmc6lrOYrvY7+syLhzOWpp55kqSPeNb+qbC2h8i69aLIX6krQ==",
|
|
||||||
"optional": true,
|
|
||||||
"dependencies": {
|
|
||||||
"fast-deep-equal": "^3.1.3"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/@humanwhocodes/config-array": {
|
"node_modules/@humanwhocodes/config-array": {
|
||||||
"version": "0.11.14",
|
"version": "0.11.14",
|
||||||
"resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz",
|
"resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz",
|
||||||
@ -2471,22 +2459,6 @@
|
|||||||
"@jridgewell/sourcemap-codec": "^1.4.14"
|
"@jridgewell/sourcemap-codec": "^1.4.14"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@mapbox/corslite": {
|
|
||||||
"version": "0.0.7",
|
|
||||||
"resolved": "https://registry.npmjs.org/@mapbox/corslite/-/corslite-0.0.7.tgz",
|
|
||||||
"integrity": "sha512-w/uS474VFjmqQ7fFWIMZINQM1BAQxDLuoJaZZIPES1BmeYpCtlh9MtbFxKGGDAsfvut8/HircIsVvEYRjQ+iMg=="
|
|
||||||
},
|
|
||||||
"node_modules/@mapbox/polyline": {
|
|
||||||
"version": "0.2.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/@mapbox/polyline/-/polyline-0.2.0.tgz",
|
|
||||||
"integrity": "sha512-GCddO0iw6AzOQqZgBmjEQI9Pgo40/yRgkTkikGctE01kNBN0ThWYuAnTD+hRWrAWMV6QJ0rNm4m8DAsaAXE7Pg==",
|
|
||||||
"bin": {
|
|
||||||
"polyline": "bin/polyline.bin.js"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": "*"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/@mdx-js/mdx": {
|
"node_modules/@mdx-js/mdx": {
|
||||||
"version": "3.0.1",
|
"version": "3.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.0.1.tgz",
|
||||||
@ -3089,15 +3061,6 @@
|
|||||||
"@types/geojson": "*"
|
"@types/geojson": "*"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@types/leaflet-routing-machine": {
|
|
||||||
"version": "3.2.8",
|
|
||||||
"resolved": "https://registry.npmjs.org/@types/leaflet-routing-machine/-/leaflet-routing-machine-3.2.8.tgz",
|
|
||||||
"integrity": "sha512-v2pJDv/nqbB769SsytHemhLkqwjVor9UdWvZ1l6Y2SEaXNt1yDwVrktc4sCT8/4n7npuEb8VP+UAk8xrPePqSQ==",
|
|
||||||
"dev": true,
|
|
||||||
"dependencies": {
|
|
||||||
"@types/leaflet": "*"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/@types/lodash": {
|
"node_modules/@types/lodash": {
|
||||||
"version": "4.17.4",
|
"version": "4.17.4",
|
||||||
"resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.4.tgz",
|
"resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.4.tgz",
|
||||||
@ -6355,7 +6318,7 @@
|
|||||||
"version": "3.1.3",
|
"version": "3.1.3",
|
||||||
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
|
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
|
||||||
"integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
|
"integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
|
||||||
"devOptional": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/fast-glob": {
|
"node_modules/fast-glob": {
|
||||||
"version": "3.3.2",
|
"version": "3.3.2",
|
||||||
@ -8154,36 +8117,6 @@
|
|||||||
"resolved": "https://registry.npmjs.org/leaflet/-/leaflet-1.9.4.tgz",
|
"resolved": "https://registry.npmjs.org/leaflet/-/leaflet-1.9.4.tgz",
|
||||||
"integrity": "sha512-nxS1ynzJOmOlHp+iL3FyWqK89GtNL8U8rvlMOsQdTTssxZwCXh8N2NB3GDQOL+YR3XnWyZAxwQixURb+FA74PA=="
|
"integrity": "sha512-nxS1ynzJOmOlHp+iL3FyWqK89GtNL8U8rvlMOsQdTTssxZwCXh8N2NB3GDQOL+YR3XnWyZAxwQixURb+FA74PA=="
|
||||||
},
|
},
|
||||||
"node_modules/leaflet-control-geocoder": {
|
|
||||||
"version": "2.4.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/leaflet-control-geocoder/-/leaflet-control-geocoder-2.4.0.tgz",
|
|
||||||
"integrity": "sha512-b2QlxuFd40uIDbnoUI3U9fzfnB4yKUYlmsXjquJ2d2YjoJqnyVYcIJeErAVv3kPvX3nI0gzvBq1XHMgSVFrGkQ==",
|
|
||||||
"optionalDependencies": {
|
|
||||||
"open-location-code": "^1.0.0"
|
|
||||||
},
|
|
||||||
"peerDependencies": {
|
|
||||||
"leaflet": "^1.6.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/leaflet-geosearch": {
|
|
||||||
"version": "4.0.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/leaflet-geosearch/-/leaflet-geosearch-4.0.0.tgz",
|
|
||||||
"integrity": "sha512-a92VNY9gxyv3oyEDqIWoCNoBllajWRYejztzOSNmpLRtzpA6JtGgy/wwl9tsB8+6Eek1fe+L6+W0MDEOaidbXA==",
|
|
||||||
"optionalDependencies": {
|
|
||||||
"@googlemaps/js-api-loader": "^1.16.6",
|
|
||||||
"leaflet": "^1.6.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/leaflet-routing-machine": {
|
|
||||||
"version": "3.2.12",
|
|
||||||
"resolved": "https://registry.npmjs.org/leaflet-routing-machine/-/leaflet-routing-machine-3.2.12.tgz",
|
|
||||||
"integrity": "sha512-HLde58G1YtD9xSIzZavJ6BPABZaV1hHeGst8ouhzuxmSC3s32NVtADT+njbIUMW1maHRCrsgTk/E4hz5QH7FrA==",
|
|
||||||
"dependencies": {
|
|
||||||
"@mapbox/corslite": "0.0.7",
|
|
||||||
"@mapbox/polyline": "^0.2.0",
|
|
||||||
"osrm-text-instructions": "^0.13.2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/levn": {
|
"node_modules/levn": {
|
||||||
"version": "0.4.1",
|
"version": "0.4.1",
|
||||||
"resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
|
"resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
|
||||||
@ -8231,6 +8164,7 @@
|
|||||||
"cpu": [
|
"cpu": [
|
||||||
"arm64"
|
"arm64"
|
||||||
],
|
],
|
||||||
|
"dev": true,
|
||||||
"optional": true,
|
"optional": true,
|
||||||
"os": [
|
"os": [
|
||||||
"darwin"
|
"darwin"
|
||||||
@ -8250,6 +8184,7 @@
|
|||||||
"cpu": [
|
"cpu": [
|
||||||
"x64"
|
"x64"
|
||||||
],
|
],
|
||||||
|
"dev": true,
|
||||||
"optional": true,
|
"optional": true,
|
||||||
"os": [
|
"os": [
|
||||||
"darwin"
|
"darwin"
|
||||||
@ -8269,6 +8204,7 @@
|
|||||||
"cpu": [
|
"cpu": [
|
||||||
"x64"
|
"x64"
|
||||||
],
|
],
|
||||||
|
"dev": true,
|
||||||
"optional": true,
|
"optional": true,
|
||||||
"os": [
|
"os": [
|
||||||
"freebsd"
|
"freebsd"
|
||||||
@ -8288,6 +8224,7 @@
|
|||||||
"cpu": [
|
"cpu": [
|
||||||
"arm"
|
"arm"
|
||||||
],
|
],
|
||||||
|
"dev": true,
|
||||||
"optional": true,
|
"optional": true,
|
||||||
"os": [
|
"os": [
|
||||||
"linux"
|
"linux"
|
||||||
@ -8307,6 +8244,7 @@
|
|||||||
"cpu": [
|
"cpu": [
|
||||||
"arm64"
|
"arm64"
|
||||||
],
|
],
|
||||||
|
"dev": true,
|
||||||
"optional": true,
|
"optional": true,
|
||||||
"os": [
|
"os": [
|
||||||
"linux"
|
"linux"
|
||||||
@ -8326,6 +8264,7 @@
|
|||||||
"cpu": [
|
"cpu": [
|
||||||
"arm64"
|
"arm64"
|
||||||
],
|
],
|
||||||
|
"dev": true,
|
||||||
"optional": true,
|
"optional": true,
|
||||||
"os": [
|
"os": [
|
||||||
"linux"
|
"linux"
|
||||||
@ -8345,6 +8284,7 @@
|
|||||||
"cpu": [
|
"cpu": [
|
||||||
"x64"
|
"x64"
|
||||||
],
|
],
|
||||||
|
"dev": true,
|
||||||
"optional": true,
|
"optional": true,
|
||||||
"os": [
|
"os": [
|
||||||
"linux"
|
"linux"
|
||||||
@ -8364,6 +8304,7 @@
|
|||||||
"cpu": [
|
"cpu": [
|
||||||
"x64"
|
"x64"
|
||||||
],
|
],
|
||||||
|
"dev": true,
|
||||||
"optional": true,
|
"optional": true,
|
||||||
"os": [
|
"os": [
|
||||||
"linux"
|
"linux"
|
||||||
@ -8383,6 +8324,7 @@
|
|||||||
"cpu": [
|
"cpu": [
|
||||||
"x64"
|
"x64"
|
||||||
],
|
],
|
||||||
|
"dev": true,
|
||||||
"optional": true,
|
"optional": true,
|
||||||
"os": [
|
"os": [
|
||||||
"win32"
|
"win32"
|
||||||
@ -10064,12 +10006,6 @@
|
|||||||
"url": "https://github.com/sponsors/sindresorhus"
|
"url": "https://github.com/sponsors/sindresorhus"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/open-location-code": {
|
|
||||||
"version": "1.0.3",
|
|
||||||
"resolved": "https://registry.npmjs.org/open-location-code/-/open-location-code-1.0.3.tgz",
|
|
||||||
"integrity": "sha512-DBm14BSn40Ee241n80zIFXIT6+y8Tb0I+jTdosLJ8Sidvr2qONvymwqymVbHV2nS+1gkDZ5eTNpnOIVV0Kn2fw==",
|
|
||||||
"optional": true
|
|
||||||
},
|
|
||||||
"node_modules/optionator": {
|
"node_modules/optionator": {
|
||||||
"version": "0.9.4",
|
"version": "0.9.4",
|
||||||
"resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz",
|
"resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz",
|
||||||
@ -10120,11 +10056,6 @@
|
|||||||
"url": "https://github.com/chalk/chalk?sponsor=1"
|
"url": "https://github.com/chalk/chalk?sponsor=1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/osrm-text-instructions": {
|
|
||||||
"version": "0.13.4",
|
|
||||||
"resolved": "https://registry.npmjs.org/osrm-text-instructions/-/osrm-text-instructions-0.13.4.tgz",
|
|
||||||
"integrity": "sha512-ge4ZTIetMQKAHKq2MwWf83ntzdJN20ndRKRaVNoZ3SkDkBNO99Qddz7r6+hrVx38I+ih6Rk5T1yslczAB6Q9Pg=="
|
|
||||||
},
|
|
||||||
"node_modules/p-limit": {
|
"node_modules/p-limit": {
|
||||||
"version": "5.0.0",
|
"version": "5.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-5.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-5.0.0.tgz",
|
||||||
@ -10968,7 +10899,8 @@
|
|||||||
"node_modules/regenerator-runtime": {
|
"node_modules/regenerator-runtime": {
|
||||||
"version": "0.14.1",
|
"version": "0.14.1",
|
||||||
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
|
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
|
||||||
"integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw=="
|
"integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==",
|
||||||
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/regexp.prototype.flags": {
|
"node_modules/regexp.prototype.flags": {
|
||||||
"version": "1.5.2",
|
"version": "1.5.2",
|
||||||
@ -12340,6 +12272,7 @@
|
|||||||
"version": "2.3.0",
|
"version": "2.3.0",
|
||||||
"resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.3.0.tgz",
|
"resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.3.0.tgz",
|
||||||
"integrity": "sha512-vkYrLpIP+lgR0tQCG6AP7zZXCTLc1Lnv/CCRT3BqJ9CZ3ui2++GPaGb1x/ILsINIMSYqqvrpqjUFsMNLlW99EA==",
|
"integrity": "sha512-vkYrLpIP+lgR0tQCG6AP7zZXCTLc1Lnv/CCRT3BqJ9CZ3ui2++GPaGb1x/ILsINIMSYqqvrpqjUFsMNLlW99EA==",
|
||||||
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/runtime": "^7.24.1"
|
"@babel/runtime": "^7.24.1"
|
||||||
},
|
},
|
||||||
|
@ -16,32 +16,37 @@
|
|||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@astrojs/node": "^8.2.5",
|
"@astrojs/node": "^8.2.5",
|
||||||
"@astrojs/rss": "^4.0.5",
|
|
||||||
"@astrojs/sitemap": "^3.1.4",
|
|
||||||
"@astrojs/tailwind": "^5.1.0",
|
"@astrojs/tailwind": "^5.1.0",
|
||||||
"@astrolib/analytics": "^0.5.0",
|
|
||||||
"@astrolib/seo": "^1.0.0-beta.5",
|
|
||||||
"@fontsource-variable/inter": "^5.0.18",
|
|
||||||
"@tailwindcss/typography": "^0.5.12",
|
"@tailwindcss/typography": "^0.5.12",
|
||||||
"astro": "^4.8.3",
|
|
||||||
"astro-embed": "^0.7.2",
|
|
||||||
"astro-icon": "^1.1.0",
|
|
||||||
"leaflet": "^1.9.4",
|
"leaflet": "^1.9.4",
|
||||||
"leaflet-control-geocoder": "^2.4.0",
|
|
||||||
"leaflet-geosearch": "^4.0.0",
|
|
||||||
"leaflet-routing-machine": "^3.2.12",
|
|
||||||
"limax": "4.1.0",
|
|
||||||
"lodash.merge": "^4.6.2",
|
|
||||||
"lucide-astro": "^0.372.0",
|
"lucide-astro": "^0.372.0",
|
||||||
"pocketbase": "^0.21.1",
|
"pocketbase": "^0.21.1",
|
||||||
"react-leaflet": "^4.2.1",
|
"react-leaflet": "^4.2.1",
|
||||||
"simple-icons-astro": "^11.12.0",
|
"simple-icons-astro": "^11.12.0",
|
||||||
"tailwind-merge": "^2.3.0",
|
|
||||||
"tailwindcss": "^3.4.3",
|
"tailwindcss": "^3.4.3",
|
||||||
|
"@astrojs/rss": "^4.0.5",
|
||||||
|
"@astrojs/sitemap": "^3.1.4",
|
||||||
|
"@astrolib/analytics": "^0.5.0",
|
||||||
|
"@astrolib/seo": "^1.0.0-beta.5",
|
||||||
|
"@fontsource-variable/inter": "^5.0.18",
|
||||||
|
"astro": "^4.8.3",
|
||||||
|
"astro-embed": "^0.7.2",
|
||||||
|
"astro-icon": "^1.1.0",
|
||||||
|
"limax": "4.1.0",
|
||||||
|
"lodash.merge": "^4.6.2",
|
||||||
"unpic": "^3.18.0"
|
"unpic": "^3.18.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@astrojs/check": "^0",
|
"@astrojs/check": "^0",
|
||||||
|
"@types/leaflet": "^1.9.12",
|
||||||
|
"@types/node": "^20",
|
||||||
|
"@typescript-eslint/eslint-plugin": "^6.21.0",
|
||||||
|
"@typescript-eslint/parser": "^6.21.0",
|
||||||
|
"@vitest/coverage-v8": "^1",
|
||||||
|
"eslint": "^8.57.0",
|
||||||
|
"eslint-plugin-astro": "^0.31.4",
|
||||||
|
"typescript": "^5",
|
||||||
|
"vitest": "^1",
|
||||||
"@astrojs/mdx": "^3.0.0",
|
"@astrojs/mdx": "^3.0.0",
|
||||||
"@astrojs/partytown": "^2.1.0",
|
"@astrojs/partytown": "^2.1.0",
|
||||||
"@astrojs/tailwind": "5.1.0",
|
"@astrojs/tailwind": "5.1.0",
|
||||||
@ -52,16 +57,8 @@
|
|||||||
"@tailwindcss/typography": "^0.5.13",
|
"@tailwindcss/typography": "^0.5.13",
|
||||||
"@types/eslint__js": "^8.42.3",
|
"@types/eslint__js": "^8.42.3",
|
||||||
"@types/js-yaml": "^4.0.9",
|
"@types/js-yaml": "^4.0.9",
|
||||||
"@types/leaflet": "^1.9.12",
|
|
||||||
"@types/leaflet-routing-machine": "^3.2.8",
|
|
||||||
"@types/lodash.merge": "^4.6.9",
|
"@types/lodash.merge": "^4.6.9",
|
||||||
"@types/node": "^20",
|
|
||||||
"@typescript-eslint/eslint-plugin": "^6.21.0",
|
|
||||||
"@typescript-eslint/parser": "^6.21.0",
|
|
||||||
"@vitest/coverage-v8": "^1",
|
|
||||||
"astro-eslint-parser": "^1.0.2",
|
"astro-eslint-parser": "^1.0.2",
|
||||||
"eslint": "^8.57.0",
|
|
||||||
"eslint-plugin-astro": "^0.31.4",
|
|
||||||
"eslint-plugin-jsx-a11y": "^6.8.0",
|
"eslint-plugin-jsx-a11y": "^6.8.0",
|
||||||
"globals": "^15.2.0",
|
"globals": "^15.2.0",
|
||||||
"js-yaml": "^4.1.0",
|
"js-yaml": "^4.1.0",
|
||||||
@ -71,9 +68,8 @@
|
|||||||
"reading-time": "^1.5.0",
|
"reading-time": "^1.5.0",
|
||||||
"rehype-plugin-image-native-lazy-loading": "^1.2.0",
|
"rehype-plugin-image-native-lazy-loading": "^1.2.0",
|
||||||
"sharp": "0.33.3",
|
"sharp": "0.33.3",
|
||||||
|
"tailwind-merge": "^2.3.0",
|
||||||
"tailwindcss": "^3.4.3",
|
"tailwindcss": "^3.4.3",
|
||||||
"typescript": "^5",
|
"typescript-eslint": "^7.9.0"
|
||||||
"typescript-eslint": "^7.9.0",
|
|
||||||
"vitest": "^1"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,30 +0,0 @@
|
|||||||
---
|
|
||||||
import type { Input as Props } from 'types';
|
|
||||||
|
|
||||||
const {value, checked ,name, label, autocomplete, placeholder, divClass, inputClass} = Astro.props;
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
<>
|
|
||||||
{
|
|
||||||
name && (
|
|
||||||
<div class={"flex flex-row items-center " + divClass}>
|
|
||||||
<input
|
|
||||||
type="checkbox"
|
|
||||||
name={name}
|
|
||||||
id={name}
|
|
||||||
checked={checked}
|
|
||||||
value={value}
|
|
||||||
autocomplete={autocomplete}
|
|
||||||
placeholder={placeholder}
|
|
||||||
class={"mr-2 size-5 " + inputClass}
|
|
||||||
/>
|
|
||||||
{label && (
|
|
||||||
<label for={name} class="block text-lg font-medium">
|
|
||||||
{label}
|
|
||||||
</label>
|
|
||||||
)}
|
|
||||||
</div>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
</>
|
|
@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
import favIcon from 'assets/favicons/favicon.ico';
|
import favIcon from '~/assets/favicons/favicon.ico';
|
||||||
import favIconSvg from 'assets/favicons/favicon.svg';
|
import favIconSvg from '~/assets/favicons/favicon.svg';
|
||||||
import appleTouchIcon from 'assets/favicons/apple-touch-icon.png';
|
import appleTouchIcon from '~/assets/favicons/apple-touch-icon.png';
|
||||||
---
|
---
|
||||||
|
|
||||||
<link rel="shortcut icon" href={favIcon} />
|
<link rel="shortcut icon" href={favIcon} />
|
||||||
|
@ -1,28 +0,0 @@
|
|||||||
---
|
|
||||||
import type { Input as Props } from 'types';
|
|
||||||
|
|
||||||
const { type, name, label, autocomplete, placeholder, divClass, inputClass} = Astro.props;
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
<>
|
|
||||||
{
|
|
||||||
name && (
|
|
||||||
<div class={divClass}>
|
|
||||||
{label && (
|
|
||||||
<label for={name} class="block text-sm font-medium">
|
|
||||||
{label}
|
|
||||||
</label>
|
|
||||||
)}
|
|
||||||
<input
|
|
||||||
type={type}
|
|
||||||
name={name}
|
|
||||||
id={name}
|
|
||||||
autocomplete={autocomplete}
|
|
||||||
placeholder={placeholder}
|
|
||||||
class={"py-3 px-4 block w-full text-md rounded-lg border border-gray-200 dark:border-gray-700 bg-white dark:bg-slate-900" + inputClass}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
</>
|
|
@ -1,53 +0,0 @@
|
|||||||
---
|
|
||||||
import ContactUs from 'components/widgets/Contact.astro';
|
|
||||||
import CallToAction from 'components/widgets/CallToAction.astro';
|
|
||||||
|
|
||||||
const pb = Astro.locals.pb
|
|
||||||
const oauths = (await pb.collection('users').listAuthMethods()).authProviders;
|
|
||||||
const discordProvider = oauths.find(item => item.name === 'discord');
|
|
||||||
const googleProvider = oauths.find(item => item.name === 'google');
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
<>
|
|
||||||
<CallToAction
|
|
||||||
actions={[
|
|
||||||
{
|
|
||||||
variant: 'primary',
|
|
||||||
text: 'Discord',
|
|
||||||
href: discordProvider!.authUrl + Astro.url.protocol + "//" + Astro.url.host + '/account/oauth',
|
|
||||||
icon: 'tabler:brand-discord',
|
|
||||||
class: "oauth-btn",
|
|
||||||
"data-cookie": encodeURIComponent(JSON.stringify(discordProvider))
|
|
||||||
},
|
|
||||||
{
|
|
||||||
variant: 'primary',
|
|
||||||
text: 'Google',
|
|
||||||
href: googleProvider!.authUrl + Astro.url.protocol + "//" + Astro.url.host + '/account/oauth',
|
|
||||||
icon: 'tabler:brand-google',
|
|
||||||
class: "oauth-btn",
|
|
||||||
"data-cookie": encodeURIComponent(JSON.stringify(googleProvider))
|
|
||||||
}
|
|
||||||
]}
|
|
||||||
>
|
|
||||||
<Fragment slot="title">
|
|
||||||
Oauth
|
|
||||||
</Fragment>
|
|
||||||
|
|
||||||
<Fragment slot="subtitle">
|
|
||||||
Connecter Vous aussi avec
|
|
||||||
</Fragment>
|
|
||||||
</CallToAction>
|
|
||||||
</>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
// import { date } from "astro/zod";
|
|
||||||
|
|
||||||
document.cookie = "provider" + '=; expires=Thu, 01 Jan 1970 00:00:01 GMT;';
|
|
||||||
// console.log(date.toString)
|
|
||||||
|
|
||||||
const btn = document.querySelectorAll('.oauth-btn')
|
|
||||||
btn.forEach((item: Element) =>(item.addEventListener('click', (ev) =>{
|
|
||||||
document.cookie = "provider" + "=" + item.getAttribute('data-cookie') + "; path=/;"// expires=" + ;
|
|
||||||
})))
|
|
||||||
</script>
|
|
@ -1,19 +0,0 @@
|
|||||||
---
|
|
||||||
|
|
||||||
export interface Props {
|
|
||||||
values: Array<{label:String, name:string, checked?:boolean | undefined}>
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
const fields = Astro.props.values
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
<>
|
|
||||||
<div class="flex, flex-col">
|
|
||||||
{fields.map(value => (
|
|
||||||
<input type="radio" id={value.name} name="note-min" value={value.name} checked={value.checked}>
|
|
||||||
<label for={value.name} class="ml-1">{value.label}</label><br>
|
|
||||||
))}
|
|
||||||
</div>
|
|
||||||
</>
|
|
@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
import Item from 'components/blog/GridItem.astro';
|
import Item from '~/components/blog/GridItem.astro';
|
||||||
import type { Post } from 'types';
|
import type { Post } from '~/types';
|
||||||
|
|
||||||
export interface Props {
|
export interface Props {
|
||||||
posts: Array<Post>;
|
posts: Array<Post>;
|
||||||
|
@ -1,11 +1,11 @@
|
|||||||
---
|
---
|
||||||
import { APP_BLOG } from 'astrowind:config';
|
import { APP_BLOG } from 'astrowind:config';
|
||||||
import type { Post } from 'types';
|
import type { Post } from '~/types';
|
||||||
|
|
||||||
import Image from 'components/common/Image.astro';
|
import Image from '~/components/common/Image.astro';
|
||||||
|
|
||||||
import { findImage } from 'utils/images';
|
import { findImage } from '~/utils/images';
|
||||||
import { getPermalink } from 'utils/permalinks';
|
import { getPermalink } from '~/utils/permalinks';
|
||||||
|
|
||||||
export interface Props {
|
export interface Props {
|
||||||
post: Post;
|
post: Post;
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
import Item from 'components/blog/ListItem.astro';
|
import Item from '~/components/blog/ListItem.astro';
|
||||||
import type { Post } from 'types';
|
import type { Post } from '~/types';
|
||||||
|
|
||||||
export interface Props {
|
export interface Props {
|
||||||
posts: Array<Post>;
|
posts: Array<Post>;
|
||||||
|
@ -1,15 +1,15 @@
|
|||||||
---
|
---
|
||||||
import type { ImageMetadata } from 'astro';
|
import type { ImageMetadata } from 'astro';
|
||||||
import { Icon } from 'astro-icon/components';
|
import { Icon } from 'astro-icon/components';
|
||||||
import Image from 'components/common/Image.astro';
|
import Image from '~/components/common/Image.astro';
|
||||||
import PostTags from 'components/blog/Tags.astro';
|
import PostTags from '~/components/blog/Tags.astro';
|
||||||
|
|
||||||
import { APP_BLOG } from 'astrowind:config';
|
import { APP_BLOG } from 'astrowind:config';
|
||||||
import type { Post } from 'types';
|
import type { Post } from '~/types';
|
||||||
|
|
||||||
import { getPermalink } from 'utils/permalinks';
|
import { getPermalink } from '~/utils/permalinks';
|
||||||
import { findImage } from 'utils/images';
|
import { findImage } from '~/utils/images';
|
||||||
import { getFormattedDate } from 'utils/utils';
|
import { getFormattedDate } from '~/utils/utils';
|
||||||
|
|
||||||
export interface Props {
|
export interface Props {
|
||||||
post: Post;
|
post: Post;
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
import { Icon } from 'astro-icon/components';
|
import { Icon } from 'astro-icon/components';
|
||||||
import { getPermalink } from 'utils/permalinks';
|
import { getPermalink } from '~/utils/permalinks';
|
||||||
import Button from 'components/ui/Button.astro';
|
import Button from '~/components/ui/Button.astro';
|
||||||
|
|
||||||
export interface Props {
|
export interface Props {
|
||||||
prevUrl?: string;
|
prevUrl?: string;
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
---
|
---
|
||||||
import { APP_BLOG } from 'astrowind:config';
|
import { APP_BLOG } from 'astrowind:config';
|
||||||
|
|
||||||
import { getRelatedPosts } from 'utils/blog';
|
import { getRelatedPosts } from '~/utils/blog';
|
||||||
import BlogHighlightedPosts from '../widgets/BlogHighlightedPosts.astro';
|
import BlogHighlightedPosts from '../widgets/BlogHighlightedPosts.astro';
|
||||||
import type { Post } from 'types';
|
import type { Post } from '~/types';
|
||||||
import { getBlogPermalink } from 'utils/permalinks';
|
import { getBlogPermalink } from '~/utils/permalinks';
|
||||||
|
|
||||||
export interface Props {
|
export interface Props {
|
||||||
post: Post;
|
post: Post;
|
||||||
|
@ -1,14 +1,14 @@
|
|||||||
---
|
---
|
||||||
import { Icon } from 'astro-icon/components';
|
import { Icon } from 'astro-icon/components';
|
||||||
|
|
||||||
import Image from 'components/common/Image.astro';
|
import Image from '~/components/common/Image.astro';
|
||||||
import PostTags from 'components/blog/Tags.astro';
|
import PostTags from '~/components/blog/Tags.astro';
|
||||||
import SocialShare from 'components/common/SocialShare.astro';
|
import SocialShare from '~/components/common/SocialShare.astro';
|
||||||
|
|
||||||
import { getPermalink } from 'utils/permalinks';
|
import { getPermalink } from '~/utils/permalinks';
|
||||||
import { getFormattedDate } from 'utils/utils';
|
import { getFormattedDate } from '~/utils/utils';
|
||||||
|
|
||||||
import type { Post } from 'types';
|
import type { Post } from '~/types';
|
||||||
|
|
||||||
export interface Props {
|
export interface Props {
|
||||||
post: Post;
|
post: Post;
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
---
|
---
|
||||||
import { getPermalink } from 'utils/permalinks';
|
import { getPermalink } from '~/utils/permalinks';
|
||||||
|
|
||||||
import { APP_BLOG } from 'astrowind:config';
|
import { APP_BLOG } from 'astrowind:config';
|
||||||
import type { Post } from 'types';
|
import type { Post } from '~/types';
|
||||||
|
|
||||||
export interface Props {
|
export interface Props {
|
||||||
tags: Post['tags'];
|
tags: Post['tags'];
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
---
|
---
|
||||||
import { Icon } from 'astro-icon/components';
|
import { Icon } from 'astro-icon/components';
|
||||||
import { getBlogPermalink } from 'utils/permalinks';
|
import { getBlogPermalink } from '~/utils/permalinks';
|
||||||
import { I18N } from 'astrowind:config';
|
import { I18N } from 'astrowind:config';
|
||||||
import Button from 'components/ui/Button.astro';
|
import Button from '~/components/ui/Button.astro';
|
||||||
|
|
||||||
const { textDirection } = I18N;
|
const { textDirection } = I18N;
|
||||||
---
|
---
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
---
|
---
|
||||||
import { getAsset } from 'utils/permalinks';
|
import { getAsset } from '~/utils/permalinks';
|
||||||
---
|
---
|
||||||
|
|
||||||
<meta charset="UTF-8" />
|
<meta charset="UTF-8" />
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
---
|
---
|
||||||
import { findImage } from 'utils/images';
|
import { findImage } from '~/utils/images';
|
||||||
import {
|
import {
|
||||||
getImagesOptimized,
|
getImagesOptimized,
|
||||||
astroAsseetsOptimizer,
|
astroAsseetsOptimizer,
|
||||||
@ -7,7 +7,7 @@ import {
|
|||||||
isUnpicCompatible,
|
isUnpicCompatible,
|
||||||
type ImageProps,
|
type ImageProps,
|
||||||
type AttributesProps,
|
type AttributesProps,
|
||||||
} from 'utils/images-optimization';
|
} from '~/utils/images-optimization';
|
||||||
|
|
||||||
type Props = ImageProps;
|
type Props = ImageProps;
|
||||||
type ImageType = {
|
type ImageType = {
|
||||||
|
@ -5,10 +5,10 @@ import { AstroSeo } from '@astrolib/seo';
|
|||||||
import type { Props as AstroSeoProps } from '@astrolib/seo';
|
import type { Props as AstroSeoProps } from '@astrolib/seo';
|
||||||
|
|
||||||
import { SITE, METADATA, I18N } from 'astrowind:config';
|
import { SITE, METADATA, I18N } from 'astrowind:config';
|
||||||
import type { MetaData } from 'types';
|
import type { MetaData } from '~/types';
|
||||||
import { getCanonical } from 'utils/permalinks';
|
import { getCanonical } from '~/utils/permalinks';
|
||||||
|
|
||||||
import { adaptOpenGraphImages } from 'utils/images';
|
import { adaptOpenGraphImages } from '~/utils/images';
|
||||||
|
|
||||||
export interface Props extends MetaData {
|
export interface Props extends MetaData {
|
||||||
dontUseTitleTemplate?: boolean;
|
dontUseTitleTemplate?: boolean;
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
import { Icon } from 'astro-icon/components';
|
import { Icon } from 'astro-icon/components';
|
||||||
import { twMerge } from 'tailwind-merge';
|
import { twMerge } from 'tailwind-merge';
|
||||||
import type { CallToAction as Props } from 'types';
|
import type { CallToAction as Props } from '~/types';
|
||||||
|
|
||||||
const {
|
const {
|
||||||
variant = 'secondary',
|
variant = 'secondary',
|
||||||
|
@ -1,11 +1,11 @@
|
|||||||
---
|
---
|
||||||
import type { Form as Props } from 'types';
|
import type { Form as Props } from '~/types';
|
||||||
import Button from 'components/ui/Button.astro';
|
import Button from '~/components/ui/Button.astro';
|
||||||
|
|
||||||
const { inputs, textarea, disclaimer, button = 'Contact us', description = '', id, method, enctype } = Astro.props;
|
const { inputs, textarea, disclaimer, button = 'Contact us', description = '' } = Astro.props;
|
||||||
---
|
---
|
||||||
|
|
||||||
<form id={id} method={method} enctype={enctype}>
|
<form>
|
||||||
{
|
{
|
||||||
inputs &&
|
inputs &&
|
||||||
inputs.map(
|
inputs.map(
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
---
|
---
|
||||||
import type { Headline as Props } from 'types';
|
import type { Headline as Props } from '~/types';
|
||||||
import { twMerge } from 'tailwind-merge';
|
import { twMerge } from 'tailwind-merge';
|
||||||
|
|
||||||
const {
|
const {
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
---
|
---
|
||||||
import type { ItemGrid as Props } from 'types';
|
import type { ItemGrid as Props } from '~/types';
|
||||||
import { twMerge } from 'tailwind-merge';
|
import { twMerge } from 'tailwind-merge';
|
||||||
import Button from './Button.astro';
|
import Button from './Button.astro';
|
||||||
import { Icon } from 'astro-icon/components';
|
import { Icon } from 'astro-icon/components';
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
---
|
---
|
||||||
import type { ItemGrid as Props } from 'types';
|
import type { ItemGrid as Props } from '~/types';
|
||||||
import { Icon } from 'astro-icon/components';
|
import { Icon } from 'astro-icon/components';
|
||||||
import { twMerge } from 'tailwind-merge';
|
import { twMerge } from 'tailwind-merge';
|
||||||
import Button from './Button.astro';
|
import Button from './Button.astro';
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
import { Icon } from 'astro-icon/components';
|
import { Icon } from 'astro-icon/components';
|
||||||
import { twMerge } from 'tailwind-merge';
|
import { twMerge } from 'tailwind-merge';
|
||||||
import type { Item } from 'types';
|
import type { Item } from '~/types';
|
||||||
|
|
||||||
export interface Props {
|
export interface Props {
|
||||||
items?: Array<Item>;
|
items?: Array<Item>;
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
import type { HTMLTag } from 'astro/types';
|
import type { HTMLTag } from 'astro/types';
|
||||||
import type { Widget } from 'types';
|
import type { Widget } from '~/types';
|
||||||
import { twMerge } from 'tailwind-merge';
|
import { twMerge } from 'tailwind-merge';
|
||||||
import Background from './Background.astro';
|
import Background from './Background.astro';
|
||||||
|
|
||||||
|
@ -1,12 +1,12 @@
|
|||||||
---
|
---
|
||||||
import { APP_BLOG } from 'astrowind:config';
|
import { APP_BLOG } from 'astrowind:config';
|
||||||
|
|
||||||
import Grid from 'components/blog/Grid.astro';
|
import Grid from '~/components/blog/Grid.astro';
|
||||||
|
|
||||||
import { getBlogPermalink } from 'utils/permalinks';
|
import { getBlogPermalink } from '~/utils/permalinks';
|
||||||
import { findPostsByIds } from 'utils/blog';
|
import { findPostsByIds } from '~/utils/blog';
|
||||||
import WidgetWrapper from 'components/ui/WidgetWrapper.astro';
|
import WidgetWrapper from '~/components/ui/WidgetWrapper.astro';
|
||||||
import type { Widget } from 'types';
|
import type { Widget } from '~/types';
|
||||||
|
|
||||||
export interface Props extends Widget {
|
export interface Props extends Widget {
|
||||||
title?: string;
|
title?: string;
|
||||||
|
@ -1,12 +1,12 @@
|
|||||||
---
|
---
|
||||||
import { APP_BLOG } from 'astrowind:config';
|
import { APP_BLOG } from 'astrowind:config';
|
||||||
|
|
||||||
import Grid from 'components/blog/Grid.astro';
|
import Grid from '~/components/blog/Grid.astro';
|
||||||
|
|
||||||
import { getBlogPermalink } from 'utils/permalinks';
|
import { getBlogPermalink } from '~/utils/permalinks';
|
||||||
import { findLatestPosts } from 'utils/blog';
|
import { findLatestPosts } from '~/utils/blog';
|
||||||
import WidgetWrapper from 'components/ui/WidgetWrapper.astro';
|
import WidgetWrapper from '~/components/ui/WidgetWrapper.astro';
|
||||||
import type { Widget } from 'types';
|
import type { Widget } from '~/types';
|
||||||
import Button from '../ui/Button.astro';
|
import Button from '../ui/Button.astro';
|
||||||
|
|
||||||
export interface Props extends Widget {
|
export interface Props extends Widget {
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
---
|
---
|
||||||
import { Icon } from 'astro-icon/components';
|
import { Icon } from 'astro-icon/components';
|
||||||
import type { Brands as Props } from 'types';
|
import type { Brands as Props } from '~/types';
|
||||||
|
|
||||||
import Image from 'components/common/Image.astro';
|
import Image from '~/components/common/Image.astro';
|
||||||
import Headline from 'components/ui/Headline.astro';
|
import Headline from '~/components/ui/Headline.astro';
|
||||||
import WidgetWrapper from 'components/ui/WidgetWrapper.astro';
|
import WidgetWrapper from '~/components/ui/WidgetWrapper.astro';
|
||||||
const {
|
const {
|
||||||
title = '',
|
title = '',
|
||||||
subtitle = '',
|
subtitle = '',
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
---
|
---
|
||||||
import WidgetWrapper from '../ui/WidgetWrapper.astro';
|
import WidgetWrapper from '../ui/WidgetWrapper.astro';
|
||||||
import type { CallToAction, Widget } from 'types';
|
import type { CallToAction, Widget } from '~/types';
|
||||||
import Headline from 'components/ui/Headline.astro';
|
import Headline from '~/components/ui/Headline.astro';
|
||||||
import Button from 'components/ui/Button.astro';
|
import Button from '~/components/ui/Button.astro';
|
||||||
|
|
||||||
interface Props extends Widget {
|
interface Props extends Widget {
|
||||||
title?: string;
|
title?: string;
|
||||||
@ -45,7 +45,7 @@ const {
|
|||||||
{Array.isArray(actions) ? (
|
{Array.isArray(actions) ? (
|
||||||
actions.map((action) => (
|
actions.map((action) => (
|
||||||
<div class="flex w-full sm:w-auto">
|
<div class="flex w-full sm:w-auto">
|
||||||
<Button {...(action || {})} class:list={["w-full", "sm:mb-0", action.class]} />
|
<Button {...(action || {})} class="w-full sm:mb-0" />
|
||||||
</div>
|
</div>
|
||||||
))
|
))
|
||||||
) : (
|
) : (
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
---
|
---
|
||||||
import FormContainer from 'components/ui/Form.astro';
|
import FormContainer from '~/components/ui/Form.astro';
|
||||||
import Headline from 'components/ui/Headline.astro';
|
import Headline from '~/components/ui/Headline.astro';
|
||||||
import WidgetWrapper from 'components/ui/WidgetWrapper.astro';
|
import WidgetWrapper from '~/components/ui/WidgetWrapper.astro';
|
||||||
import type { Contact as Props } from 'types';
|
import type { Contact as Props } from '~/types';
|
||||||
|
|
||||||
const {
|
const {
|
||||||
title = await Astro.slots.render('title'),
|
title = await Astro.slots.render('title'),
|
||||||
@ -13,9 +13,6 @@ const {
|
|||||||
disclaimer,
|
disclaimer,
|
||||||
button,
|
button,
|
||||||
description,
|
description,
|
||||||
formid,
|
|
||||||
method,
|
|
||||||
enctype,
|
|
||||||
|
|
||||||
id,
|
id,
|
||||||
isDark = false,
|
isDark = false,
|
||||||
@ -36,9 +33,6 @@ const {
|
|||||||
disclaimer={disclaimer}
|
disclaimer={disclaimer}
|
||||||
button={button}
|
button={button}
|
||||||
description={description}
|
description={description}
|
||||||
id={formid}
|
|
||||||
method={method}
|
|
||||||
enctype={enctype}
|
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
---
|
---
|
||||||
import type { Content as Props } from 'types';
|
import type { Content as Props } from '~/types';
|
||||||
import Headline from '../ui/Headline.astro';
|
import Headline from '../ui/Headline.astro';
|
||||||
import WidgetWrapper from '../ui/WidgetWrapper.astro';
|
import WidgetWrapper from '../ui/WidgetWrapper.astro';
|
||||||
import Image from 'components/common/Image.astro';
|
import Image from '~/components/common/Image.astro';
|
||||||
import Button from 'components/ui/Button.astro';
|
import Button from '~/components/ui/Button.astro';
|
||||||
import ItemGrid from '../ui/ItemGrid.astro';
|
import ItemGrid from '../ui/ItemGrid.astro';
|
||||||
|
|
||||||
const {
|
const {
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
---
|
---
|
||||||
import Headline from 'components/ui/Headline.astro';
|
import Headline from '~/components/ui/Headline.astro';
|
||||||
import ItemGrid from 'components/ui/ItemGrid.astro';
|
import ItemGrid from '~/components/ui/ItemGrid.astro';
|
||||||
import WidgetWrapper from 'components/ui/WidgetWrapper.astro';
|
import WidgetWrapper from '~/components/ui/WidgetWrapper.astro';
|
||||||
import type { Faqs as Props } from 'types';
|
import type { Faqs as Props } from '~/types';
|
||||||
|
|
||||||
const {
|
const {
|
||||||
title = '',
|
title = '',
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
---
|
---
|
||||||
import WidgetWrapper from 'components/ui/WidgetWrapper.astro';
|
import WidgetWrapper from '~/components/ui/WidgetWrapper.astro';
|
||||||
import ItemGrid from 'components/ui/ItemGrid.astro';
|
import ItemGrid from '~/components/ui/ItemGrid.astro';
|
||||||
import Headline from 'components/ui/Headline.astro';
|
import Headline from '~/components/ui/Headline.astro';
|
||||||
import type { Features as Props } from 'types';
|
import type { Features as Props } from '~/types';
|
||||||
|
|
||||||
const {
|
const {
|
||||||
title = await Astro.slots.render('title'),
|
title = await Astro.slots.render('title'),
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
---
|
---
|
||||||
import WidgetWrapper from 'components/ui/WidgetWrapper.astro';
|
import WidgetWrapper from '~/components/ui/WidgetWrapper.astro';
|
||||||
import Headline from 'components/ui/Headline.astro';
|
import Headline from '~/components/ui/Headline.astro';
|
||||||
import ItemGrid2 from 'components/ui/ItemGrid2.astro';
|
import ItemGrid2 from '~/components/ui/ItemGrid2.astro';
|
||||||
import type { Features as Props } from 'types';
|
import type { Features as Props } from '~/types';
|
||||||
|
|
||||||
const {
|
const {
|
||||||
title = await Astro.slots.render('title'),
|
title = await Astro.slots.render('title'),
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
---
|
---
|
||||||
import Headline from 'components/ui/Headline.astro';
|
import Headline from '~/components/ui/Headline.astro';
|
||||||
import ItemGrid from 'components/ui/ItemGrid.astro';
|
import ItemGrid from '~/components/ui/ItemGrid.astro';
|
||||||
import WidgetWrapper from 'components/ui/WidgetWrapper.astro';
|
import WidgetWrapper from '~/components/ui/WidgetWrapper.astro';
|
||||||
import Image from 'components/common/Image.astro';
|
import Image from '~/components/common/Image.astro';
|
||||||
import type { Features as Props } from 'types';
|
import type { Features as Props } from '~/types';
|
||||||
|
|
||||||
const {
|
const {
|
||||||
title = await Astro.slots.render('title'),
|
title = await Astro.slots.render('title'),
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
import { Icon } from 'astro-icon/components';
|
import { Icon } from 'astro-icon/components';
|
||||||
import { SITE } from 'astrowind:config';
|
import { SITE } from 'astrowind:config';
|
||||||
import { getHomePermalink } from 'utils/permalinks';
|
import { getHomePermalink } from '~/utils/permalinks';
|
||||||
|
|
||||||
interface Link {
|
interface Link {
|
||||||
text?: string;
|
text?: string;
|
||||||
@ -26,7 +26,7 @@ export interface Props {
|
|||||||
const { socialLinks = [], secondaryLinks = [], links = [], footNote = '', theme = 'light' } = Astro.props;
|
const { socialLinks = [], secondaryLinks = [], links = [], footNote = '', theme = 'light' } = Astro.props;
|
||||||
---
|
---
|
||||||
|
|
||||||
<footer class:list={[{ dark: theme === 'dark' }, 'relative border-t border-gray-200 dark:border-slate-800 not-prose, mt-auto, h-{11rem}']}>
|
<footer class:list={[{ dark: theme === 'dark' }, 'relative border-t border-gray-200 dark:border-slate-800 not-prose']}>
|
||||||
<div class="dark:bg-dark absolute inset-0 pointer-events-none" aria-hidden="true"></div>
|
<div class="dark:bg-dark absolute inset-0 pointer-events-none" aria-hidden="true"></div>
|
||||||
<div class="relative max-w-7xl mx-auto px-4 sm:px-6 dark:text-slate-300">
|
<div class="relative max-w-7xl mx-auto px-4 sm:px-6 dark:text-slate-300">
|
||||||
<div class="grid grid-cols-12 gap-4 gap-y-8 sm:gap-8 py-8 md:py-12">
|
<div class="grid grid-cols-12 gap-4 gap-y-8 sm:gap-8 py-8 md:py-12">
|
||||||
|
@ -1,40 +1,37 @@
|
|||||||
---
|
---
|
||||||
import { Icon } from 'astro-icon/components'
|
import { Icon } from 'astro-icon/components';
|
||||||
import Logo from 'components/Logo.astro'
|
import Logo from '~/components/Logo.astro';
|
||||||
import ToggleTheme from 'components/common/ToggleTheme.astro'
|
import ToggleTheme from '~/components/common/ToggleTheme.astro';
|
||||||
import ToggleMenu from 'components/common/ToggleMenu.astro'
|
import ToggleMenu from '~/components/common/ToggleMenu.astro';
|
||||||
import Button from 'components/ui/Button.astro'
|
import Button from '~/components/ui/Button.astro';
|
||||||
|
|
||||||
import { getHomePermalink } from 'utils/permalinks'
|
import { getHomePermalink } from '~/utils/permalinks';
|
||||||
import { trimSlash, getAsset } from 'utils/permalinks'
|
import { trimSlash, getAsset } from '~/utils/permalinks';
|
||||||
import type { CallToAction } from 'types'
|
import type { CallToAction } from '~/types';
|
||||||
|
|
||||||
const pb = Astro.locals.pb
|
|
||||||
|
|
||||||
const connected = pb.authStore.isValid
|
|
||||||
interface Link {
|
interface Link {
|
||||||
text?: string
|
text?: string;
|
||||||
href?: string
|
href?: string;
|
||||||
ariaLabel?: string
|
ariaLabel?: string;
|
||||||
icon?: string
|
icon?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
interface ActionLink extends CallToAction {}
|
interface ActionLink extends CallToAction {}
|
||||||
|
|
||||||
interface MenuLink extends Link {
|
interface MenuLink extends Link {
|
||||||
links?: Array<MenuLink>
|
links?: Array<MenuLink>;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface Props {
|
export interface Props {
|
||||||
id?: string
|
id?: string;
|
||||||
links?: Array<MenuLink>
|
links?: Array<MenuLink>;
|
||||||
actions?: Array<ActionLink>
|
actions?: Array<ActionLink>;
|
||||||
isSticky?: boolean
|
isSticky?: boolean;
|
||||||
isDark?: boolean
|
isDark?: boolean;
|
||||||
isFullWidth?: boolean
|
isFullWidth?: boolean;
|
||||||
showToggleTheme?: boolean
|
showToggleTheme?: boolean;
|
||||||
showRssFeed?: boolean
|
showRssFeed?: boolean;
|
||||||
position?: string
|
position?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
const {
|
const {
|
||||||
@ -47,15 +44,15 @@ const {
|
|||||||
showToggleTheme = false,
|
showToggleTheme = false,
|
||||||
showRssFeed = false,
|
showRssFeed = false,
|
||||||
position = 'center',
|
position = 'center',
|
||||||
} = Astro.props
|
} = Astro.props;
|
||||||
|
|
||||||
const currentPath = `/${trimSlash(new URL(Astro.url).pathname)}`
|
const currentPath = `/${trimSlash(new URL(Astro.url).pathname)}`;
|
||||||
---
|
---
|
||||||
|
|
||||||
<header
|
<header
|
||||||
class:list={[
|
class:list={[
|
||||||
{ sticky: isSticky, relative: !isSticky, dark: isDark },
|
{ sticky: isSticky, relative: !isSticky, dark: isDark },
|
||||||
'top-0 z-[1001] h-[5rem] bg-page flex-none mx-auto w-full border-b border-gray-50/0 transition-[opacity] ease-in-out',
|
'top-0 z-40 flex-none mx-auto w-full border-b border-gray-50/0 transition-[opacity] ease-in-out',
|
||||||
]}
|
]}
|
||||||
{...isSticky ? { 'data-aw-sticky-header': true } : {}}
|
{...isSticky ? { 'data-aw-sticky-header': true } : {}}
|
||||||
{...id ? { id } : {}}
|
{...id ? { id } : {}}
|
||||||
@ -88,7 +85,7 @@ const currentPath = `/${trimSlash(new URL(Astro.url).pathname)}`
|
|||||||
aria-label="Main navigation"
|
aria-label="Main navigation"
|
||||||
>
|
>
|
||||||
<ul
|
<ul
|
||||||
class="flex flex-col bg-page md:flex-row md:self-center w-full md:w-auto text-xl md:text-[0.9375rem] tracking-[0.01rem] font-medium md:justify-center"
|
class="flex flex-col md:flex-row md:self-center w-full md:w-auto text-xl md:text-[0.9375rem] tracking-[0.01rem] font-medium md:justify-center"
|
||||||
>
|
>
|
||||||
{
|
{
|
||||||
links.map(({ text, href, links }) => (
|
links.map(({ text, href, links }) => (
|
||||||
@ -152,21 +149,17 @@ const currentPath = `/${trimSlash(new URL(Astro.url).pathname)}`
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
</div>
|
</div>
|
||||||
{ !connected && (
|
{
|
||||||
|
actions?.length ? (
|
||||||
<span class="ml-4 rtl:ml-0 rtl:mr-4">
|
<span class="ml-4 rtl:ml-0 rtl:mr-4">
|
||||||
<Button href='/account/login' variant='primary' class="ml-2 py-2.5 px-5.5 md:px-6 font-semibold shadow-none text-sm w-auto">
|
{actions.map((btnProps) => (
|
||||||
Connexion
|
<Button {...btnProps} class="ml-2 py-2.5 px-5.5 md:px-6 font-semibold shadow-none text-sm w-auto" />
|
||||||
</Button>
|
))}
|
||||||
<Button href='/account/register' variant='secondary' class="ml-2 py-2.5 px-5.5 md:px-6 font-semibold shadow-none text-sm w-auto">
|
|
||||||
Inscription
|
|
||||||
</Button>
|
|
||||||
</span>
|
</span>
|
||||||
)}
|
) : (
|
||||||
{ connected && (
|
''
|
||||||
<Button href='/account/logout' variant='primary' class="ml-2 py-2.5 px-5.5 md:px-6 font-semibold shadow-none text-sm w-auto">
|
)
|
||||||
Déconnexion
|
}
|
||||||
</Button>
|
|
||||||
)}
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
import Image from 'components/common/Image.astro';
|
import Image from '~/components/common/Image.astro';
|
||||||
import Button from 'components/ui/Button.astro';
|
import Button from '~/components/ui/Button.astro';
|
||||||
import type { CallToAction } from 'types';
|
import type { CallToAction } from '~/types';
|
||||||
|
|
||||||
export interface Props {
|
export interface Props {
|
||||||
id?: string;
|
id?: string;
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
import Image from 'components/common/Image.astro';
|
import Image from '~/components/common/Image.astro';
|
||||||
import type { CallToAction } from 'types';
|
import type { CallToAction } from '~/types';
|
||||||
import Button from 'components/ui/Button.astro';
|
import Button from '~/components/ui/Button.astro';
|
||||||
|
|
||||||
export interface Props {
|
export interface Props {
|
||||||
title?: string;
|
title?: string;
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
import type { CallToAction } from 'types';
|
import type { CallToAction } from '~/types';
|
||||||
import Button from 'components/ui/Button.astro';
|
import Button from '~/components/ui/Button.astro';
|
||||||
|
|
||||||
export interface Props {
|
export interface Props {
|
||||||
title?: string;
|
title?: string;
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
---
|
---
|
||||||
import { Icon } from 'astro-icon/components';
|
import { Icon } from 'astro-icon/components';
|
||||||
import Button from 'components/ui/Button.astro';
|
import Button from '~/components/ui/Button.astro';
|
||||||
import Headline from 'components/ui/Headline.astro';
|
import Headline from '~/components/ui/Headline.astro';
|
||||||
import WidgetWrapper from 'components/ui/WidgetWrapper.astro';
|
import WidgetWrapper from '~/components/ui/WidgetWrapper.astro';
|
||||||
import type { Pricing as Props } from 'types';
|
import type { Pricing as Props } from '~/types';
|
||||||
|
|
||||||
const {
|
const {
|
||||||
title = '',
|
title = '',
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
---
|
---
|
||||||
import type { Stats as Props } from 'types';
|
import type { Stats as Props } from '~/types';
|
||||||
import WidgetWrapper from '../ui/WidgetWrapper.astro';
|
import WidgetWrapper from '../ui/WidgetWrapper.astro';
|
||||||
import Headline from '../ui/Headline.astro';
|
import Headline from '../ui/Headline.astro';
|
||||||
import { Icon } from 'astro-icon/components';
|
import { Icon } from 'astro-icon/components';
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
---
|
---
|
||||||
import WidgetWrapper from 'components/ui/WidgetWrapper.astro';
|
import WidgetWrapper from '~/components/ui/WidgetWrapper.astro';
|
||||||
import Timeline from 'components/ui/Timeline.astro';
|
import Timeline from '~/components/ui/Timeline.astro';
|
||||||
import Headline from 'components/ui/Headline.astro';
|
import Headline from '~/components/ui/Headline.astro';
|
||||||
import Image from 'components/common/Image.astro';
|
import Image from '~/components/common/Image.astro';
|
||||||
import type { Steps as Props } from 'types';
|
import type { Steps as Props } from '~/types';
|
||||||
|
|
||||||
const {
|
const {
|
||||||
title = await Astro.slots.render('title'),
|
title = await Astro.slots.render('title'),
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
---
|
---
|
||||||
import { Icon } from 'astro-icon/components';
|
import { Icon } from 'astro-icon/components';
|
||||||
import WidgetWrapper from 'components/ui/WidgetWrapper.astro';
|
import WidgetWrapper from '~/components/ui/WidgetWrapper.astro';
|
||||||
import Headline from 'components/ui/Headline.astro';
|
import Headline from '~/components/ui/Headline.astro';
|
||||||
import Button from 'components/ui/Button.astro';
|
import Button from '~/components/ui/Button.astro';
|
||||||
import type { Steps as Props } from 'types';
|
import type { Steps as Props } from '~/types';
|
||||||
|
|
||||||
const {
|
const {
|
||||||
title = await Astro.slots.render('title'),
|
title = await Astro.slots.render('title'),
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
---
|
---
|
||||||
import Headline from 'components/ui/Headline.astro';
|
import Headline from '~/components/ui/Headline.astro';
|
||||||
import WidgetWrapper from 'components/ui/WidgetWrapper.astro';
|
import WidgetWrapper from '~/components/ui/WidgetWrapper.astro';
|
||||||
import Button from 'components/ui/Button.astro';
|
import Button from '~/components/ui/Button.astro';
|
||||||
import Image from 'components/common/Image.astro';
|
import Image from '~/components/common/Image.astro';
|
||||||
import type { Testimonials as Props } from 'types';
|
import type { Testimonials as Props } from '~/types';
|
||||||
|
|
||||||
const {
|
const {
|
||||||
title = '',
|
title = '',
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
site:
|
site:
|
||||||
name: EpicRoadTrip
|
name: AstroWind
|
||||||
site: 'https://front-tweb.cb85.fr'
|
site: 'https://astrowind.vercel.app'
|
||||||
base: '/'
|
base: '/'
|
||||||
trailingSlash: false
|
trailingSlash: false
|
||||||
|
|
||||||
|
@ -12,8 +12,8 @@ metadata:
|
|||||||
canonical: https://astrowind.vercel.app/astrowind-template-in-depth
|
canonical: https://astrowind.vercel.app/astrowind-template-in-depth
|
||||||
---
|
---
|
||||||
|
|
||||||
import DListItem from 'components/ui/DListItem.astro';
|
import DListItem from '~/components/ui/DListItem.astro';
|
||||||
import ToggleTheme from 'components/common/ToggleTheme.astro';
|
import ToggleTheme from '~/components/common/ToggleTheme.astro';
|
||||||
|
|
||||||
## Overview
|
## Overview
|
||||||
|
|
||||||
|
@ -8,7 +8,7 @@ tags:
|
|||||||
- Astro
|
- Astro
|
||||||
---
|
---
|
||||||
|
|
||||||
import Logo from 'components/Logo.astro';
|
import Logo from '~/components/Logo.astro';
|
||||||
import { YouTube, Tweet, Vimeo } from 'astro-embed';
|
import { YouTube, Tweet, Vimeo } from 'astro-embed';
|
||||||
|
|
||||||
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
|
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
---
|
---
|
||||||
import PageLayout from 'layouts/PageLayout.astro';
|
import PageLayout from '~/layouts/PageLayout.astro';
|
||||||
import Header from 'components/widgets/Header.astro';
|
import Header from '~/components/widgets/Header.astro';
|
||||||
|
|
||||||
import { headerData } from 'navigation';
|
import { headerData } from '~/navigation';
|
||||||
import type { MetaData } from 'types';
|
import type { MetaData } from '~/types';
|
||||||
|
|
||||||
export interface Props {
|
export interface Props {
|
||||||
metadata?: MetaData;
|
metadata?: MetaData;
|
||||||
|
@ -3,19 +3,19 @@ import '~/assets/styles/tailwind.css';
|
|||||||
|
|
||||||
import { I18N } from 'astrowind:config';
|
import { I18N } from 'astrowind:config';
|
||||||
|
|
||||||
import CommonMeta from 'components/common/CommonMeta.astro';
|
import CommonMeta from '~/components/common/CommonMeta.astro';
|
||||||
import Favicons from 'components/Favicons.astro';
|
import Favicons from '~/components/Favicons.astro';
|
||||||
import CustomStyles from 'components/CustomStyles.astro';
|
import CustomStyles from '~/components/CustomStyles.astro';
|
||||||
import ApplyColorMode from 'components/common/ApplyColorMode.astro';
|
import ApplyColorMode from '~/components/common/ApplyColorMode.astro';
|
||||||
import Metadata from 'components/common/Metadata.astro';
|
import Metadata from '~/components/common/Metadata.astro';
|
||||||
import SiteVerification from 'components/common/SiteVerification.astro';
|
import SiteVerification from '~/components/common/SiteVerification.astro';
|
||||||
import Analytics from 'components/common/Analytics.astro';
|
import Analytics from '~/components/common/Analytics.astro';
|
||||||
import BasicScripts from 'components/common/BasicScripts.astro';
|
import BasicScripts from '~/components/common/BasicScripts.astro';
|
||||||
|
|
||||||
// Comment the line below to disable View Transitions
|
// Comment the line below to disable View Transitions
|
||||||
import { ViewTransitions } from 'astro:transitions';
|
import { ViewTransitions } from 'astro:transitions';
|
||||||
|
|
||||||
import type { MetaData as MetaDataType } from 'types';
|
import type { MetaData as MetaDataType } from '~/types';
|
||||||
|
|
||||||
export interface Props {
|
export interface Props {
|
||||||
metadata?: MetaDataType;
|
metadata?: MetaDataType;
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
import Layout from 'layouts/PageLayout.astro';
|
import Layout from '~/layouts/PageLayout.astro';
|
||||||
|
|
||||||
import type { MetaData } from 'types';
|
import type { MetaData } from '~/types';
|
||||||
|
|
||||||
export interface Props {
|
export interface Props {
|
||||||
frontmatter: {
|
frontmatter: {
|
||||||
|
@ -1,12 +1,12 @@
|
|||||||
---
|
---
|
||||||
import Layout from 'layouts/Layout.astro';
|
import Layout from '~/layouts/Layout.astro';
|
||||||
import Header from 'components/widgets/Header.astro';
|
import Header from '~/components/widgets/Header.astro';
|
||||||
import Footer from 'components/widgets/Footer.astro';
|
import Footer from '~/components/widgets/Footer.astro';
|
||||||
import Announcement from 'components/widgets/Announcement.astro';
|
import Announcement from '~/components/widgets/Announcement.astro';
|
||||||
|
|
||||||
import { headerData, footerData } from 'navigation';
|
import { headerData, footerData } from '~/navigation';
|
||||||
|
|
||||||
import type { MetaData } from 'types';
|
import type { MetaData } from '~/types';
|
||||||
|
|
||||||
export interface Props {
|
export interface Props {
|
||||||
metadata?: MetaData;
|
metadata?: MetaData;
|
||||||
@ -16,12 +16,11 @@ const { metadata } = Astro.props;
|
|||||||
---
|
---
|
||||||
|
|
||||||
<Layout metadata={metadata}>
|
<Layout metadata={metadata}>
|
||||||
<div id="posts" class="flex flex-col min-h-screen">
|
<slot name="announcement">
|
||||||
<!-- <slot name="announcement">
|
|
||||||
<Announcement />
|
<Announcement />
|
||||||
</slot> -->
|
</slot>
|
||||||
<slot name="header">
|
<slot name="header">
|
||||||
<Header {...headerData} isSticky showToggleTheme />
|
<Header {...headerData} isSticky showRssFeed showToggleTheme />
|
||||||
</slot>
|
</slot>
|
||||||
<main>
|
<main>
|
||||||
<slot />
|
<slot />
|
||||||
@ -29,5 +28,4 @@ const { metadata } = Astro.props;
|
|||||||
<slot name="footer">
|
<slot name="footer">
|
||||||
<Footer {...footerData} />
|
<Footer {...footerData} />
|
||||||
</slot>
|
</slot>
|
||||||
</div>
|
|
||||||
</Layout>
|
</Layout>
|
||||||
|
@ -1,28 +1,122 @@
|
|||||||
import { getPermalink, getBlogPermalink } from './utils/permalinks'
|
import { getPermalink, getBlogPermalink, getAsset } from './utils/permalinks';
|
||||||
|
|
||||||
export const headerData = {
|
export const headerData = {
|
||||||
links: [
|
links: [
|
||||||
{
|
{
|
||||||
text: 'Explorer POI',
|
text: 'Homes',
|
||||||
href: '/maps',
|
links: [
|
||||||
|
{
|
||||||
|
text: 'SaaS',
|
||||||
|
href: getPermalink('/homes/saas'),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
text: 'itinéraire',
|
text: 'Startup',
|
||||||
href: '/maps/find_route',
|
href: getPermalink('/homes/startup'),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
text: 'Compte',
|
text: 'Mobile App',
|
||||||
href: '/account',
|
href: getPermalink('/homes/mobile-app'),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
text: 'Personal',
|
||||||
|
href: getPermalink('/homes/personal'),
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
// actions: [
|
},
|
||||||
// {
|
{
|
||||||
// text: 'Connexion',
|
text: 'Pages',
|
||||||
// href: '',
|
links: [
|
||||||
// target: '_blank',
|
{
|
||||||
// },
|
text: 'Features (Anchor Link)',
|
||||||
// ],
|
href: getPermalink('/#features'),
|
||||||
}
|
},
|
||||||
|
{
|
||||||
|
text: 'Services',
|
||||||
|
href: getPermalink('/services'),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
text: 'Pricing',
|
||||||
|
href: getPermalink('/pricing'),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
text: 'About us',
|
||||||
|
href: getPermalink('/about'),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
text: 'Contact',
|
||||||
|
href: getPermalink('/contact'),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
text: 'Terms',
|
||||||
|
href: getPermalink('/terms'),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
text: 'Privacy policy',
|
||||||
|
href: getPermalink('/privacy'),
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
text: 'Landing',
|
||||||
|
links: [
|
||||||
|
{
|
||||||
|
text: 'Lead Generation',
|
||||||
|
href: getPermalink('/landing/lead-generation'),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
text: 'Long-form Sales',
|
||||||
|
href: getPermalink('/landing/sales'),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
text: 'Click-Through',
|
||||||
|
href: getPermalink('/landing/click-through'),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
text: 'Product Details (or Services)',
|
||||||
|
href: getPermalink('/landing/product'),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
text: 'Coming Soon or Pre-Launch',
|
||||||
|
href: getPermalink('/landing/pre-launch'),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
text: 'Subscription',
|
||||||
|
href: getPermalink('/landing/subscription'),
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
text: 'Blog',
|
||||||
|
links: [
|
||||||
|
{
|
||||||
|
text: 'Blog List',
|
||||||
|
href: getBlogPermalink(),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
text: 'Article',
|
||||||
|
href: getPermalink('get-started-website-with-astro-tailwind-css', 'post'),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
text: 'Article (with MDX)',
|
||||||
|
href: getPermalink('markdown-elements-demo-post', 'post'),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
text: 'Category Page',
|
||||||
|
href: getPermalink('tutorials', 'category'),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
text: 'Tag Page',
|
||||||
|
href: getPermalink('astro', 'tag'),
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
text: 'Widgets',
|
||||||
|
href: '#',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
actions: [{ text: 'Download', href: 'https://github.com/onwidget/astrowind', target: '_blank' }],
|
||||||
|
};
|
||||||
|
|
||||||
export const footerData = {
|
export const footerData = {
|
||||||
links: [
|
links: [
|
||||||
@ -31,6 +125,11 @@ export const footerData = {
|
|||||||
links: [
|
links: [
|
||||||
{ text: 'Features', href: '#' },
|
{ text: 'Features', href: '#' },
|
||||||
{ text: 'Security', href: '#' },
|
{ text: 'Security', href: '#' },
|
||||||
|
{ text: 'Team', href: '#' },
|
||||||
|
{ text: 'Enterprise', href: '#' },
|
||||||
|
{ text: 'Customer stories', href: '#' },
|
||||||
|
{ text: 'Pricing', href: '#' },
|
||||||
|
{ text: 'Resources', href: '#' },
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -38,6 +137,9 @@ export const footerData = {
|
|||||||
links: [
|
links: [
|
||||||
{ text: 'Developer API', href: '#' },
|
{ text: 'Developer API', href: '#' },
|
||||||
{ text: 'Partners', href: '#' },
|
{ text: 'Partners', href: '#' },
|
||||||
|
{ text: 'Atom', href: '#' },
|
||||||
|
{ text: 'Electron', href: '#' },
|
||||||
|
{ text: 'AstroWind Desktop', href: '#' },
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -45,6 +147,9 @@ export const footerData = {
|
|||||||
links: [
|
links: [
|
||||||
{ text: 'Docs', href: '#' },
|
{ text: 'Docs', href: '#' },
|
||||||
{ text: 'Community Forum', href: '#' },
|
{ text: 'Community Forum', href: '#' },
|
||||||
|
{ text: 'Professional Services', href: '#' },
|
||||||
|
{ text: 'Skills', href: '#' },
|
||||||
|
{ text: 'Status', href: '#' },
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -52,6 +157,11 @@ export const footerData = {
|
|||||||
links: [
|
links: [
|
||||||
{ text: 'About', href: '#' },
|
{ text: 'About', href: '#' },
|
||||||
{ text: 'Blog', href: '#' },
|
{ text: 'Blog', href: '#' },
|
||||||
|
{ text: 'Careers', href: '#' },
|
||||||
|
{ text: 'Press', href: '#' },
|
||||||
|
{ text: 'Inclusion', href: '#' },
|
||||||
|
{ text: 'Social Impact', href: '#' },
|
||||||
|
{ text: 'Shop', href: '#' },
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
@ -59,5 +169,15 @@ export const footerData = {
|
|||||||
{ text: 'Terms', href: getPermalink('/terms') },
|
{ text: 'Terms', href: getPermalink('/terms') },
|
||||||
{ text: 'Privacy Policy', href: getPermalink('/privacy') },
|
{ text: 'Privacy Policy', href: getPermalink('/privacy') },
|
||||||
],
|
],
|
||||||
socialLinks:[]
|
socialLinks: [
|
||||||
}
|
{ ariaLabel: 'X', icon: 'tabler:brand-x', href: '#' },
|
||||||
|
{ ariaLabel: 'Instagram', icon: 'tabler:brand-instagram', href: '#' },
|
||||||
|
{ ariaLabel: 'Facebook', icon: 'tabler:brand-facebook', href: '#' },
|
||||||
|
{ ariaLabel: 'RSS', icon: 'tabler:rss', href: getAsset('/rss.xml') },
|
||||||
|
{ ariaLabel: 'Github', icon: 'tabler:brand-github', href: 'https://github.com/onwidget/astrowind' },
|
||||||
|
],
|
||||||
|
footNote: `
|
||||||
|
<img class="w-5 h-5 md:w-6 md:h-6 md:-mt-0.5 bg-cover mr-1.5 rtl:mr-0 rtl:ml-1.5 float-left rtl:float-right rounded-sm" src="https://onwidget.com/favicon/favicon-32x32.png" alt="onWidget logo" loading="lazy"></img>
|
||||||
|
Made by <a class="text-blue-600 underline dark:text-muted" href="https://onwidget.com/"> onWidget</a> · All rights reserved.
|
||||||
|
`,
|
||||||
|
};
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
import Layout from 'layouts/Layout.astro';
|
import Layout from '~/layouts/Layout.astro';
|
||||||
import { getHomePermalink } from 'utils/permalinks';
|
import { getHomePermalink } from '~/utils/permalinks';
|
||||||
|
|
||||||
const title = `Error 404`;
|
const title = `Error 404`;
|
||||||
---
|
---
|
||||||
|
@ -1,13 +1,13 @@
|
|||||||
---
|
---
|
||||||
import type { InferGetStaticPropsType, GetStaticPaths } from 'astro';
|
import type { InferGetStaticPropsType, GetStaticPaths } from 'astro';
|
||||||
|
|
||||||
import Layout from 'layouts/PageLayout.astro';
|
import Layout from '~/layouts/PageLayout.astro';
|
||||||
import BlogList from 'components/blog/List.astro';
|
import BlogList from '~/components/blog/List.astro';
|
||||||
import Headline from 'components/blog/Headline.astro';
|
import Headline from '~/components/blog/Headline.astro';
|
||||||
import Pagination from 'components/blog/Pagination.astro';
|
import Pagination from '~/components/blog/Pagination.astro';
|
||||||
// import PostTags from "~/components/blog/Tags.astro";
|
// import PostTags from "~/components/blog/Tags.astro";
|
||||||
|
|
||||||
import { blogListRobots, getStaticPathsBlogList } from 'utils/blog';
|
import { blogListRobots, getStaticPathsBlogList } from '~/utils/blog';
|
||||||
|
|
||||||
export const prerender = true;
|
export const prerender = true;
|
||||||
|
|
||||||
|
@ -1,11 +1,11 @@
|
|||||||
---
|
---
|
||||||
import type { InferGetStaticPropsType, GetStaticPaths } from 'astro';
|
import type { InferGetStaticPropsType, GetStaticPaths } from 'astro';
|
||||||
import { blogCategoryRobots, getStaticPathsBlogCategory } from 'utils/blog';
|
import { blogCategoryRobots, getStaticPathsBlogCategory } from '~/utils/blog';
|
||||||
|
|
||||||
import Layout from 'layouts/PageLayout.astro';
|
import Layout from '~/layouts/PageLayout.astro';
|
||||||
import BlogList from 'components/blog/List.astro';
|
import BlogList from '~/components/blog/List.astro';
|
||||||
import Headline from 'components/blog/Headline.astro';
|
import Headline from '~/components/blog/Headline.astro';
|
||||||
import Pagination from 'components/blog/Pagination.astro';
|
import Pagination from '~/components/blog/Pagination.astro';
|
||||||
|
|
||||||
export const prerender = true;
|
export const prerender = true;
|
||||||
|
|
||||||
|
@ -1,11 +1,11 @@
|
|||||||
---
|
---
|
||||||
import type { InferGetStaticPropsType, GetStaticPaths } from 'astro';
|
import type { InferGetStaticPropsType, GetStaticPaths } from 'astro';
|
||||||
import { blogTagRobots, getStaticPathsBlogTag } from 'utils/blog';
|
import { blogTagRobots, getStaticPathsBlogTag } from '~/utils/blog';
|
||||||
|
|
||||||
import Layout from 'layouts/PageLayout.astro';
|
import Layout from '~/layouts/PageLayout.astro';
|
||||||
import BlogList from 'components/blog/List.astro';
|
import BlogList from '~/components/blog/List.astro';
|
||||||
import Headline from 'components/blog/Headline.astro';
|
import Headline from '~/components/blog/Headline.astro';
|
||||||
import Pagination from 'components/blog/Pagination.astro';
|
import Pagination from '~/components/blog/Pagination.astro';
|
||||||
|
|
||||||
export const prerender = true;
|
export const prerender = true;
|
||||||
|
|
||||||
|
@ -3,15 +3,15 @@ import type { InferGetStaticPropsType, GetStaticPaths } from 'astro';
|
|||||||
|
|
||||||
import merge from 'lodash.merge';
|
import merge from 'lodash.merge';
|
||||||
import type { ImageMetadata } from 'astro';
|
import type { ImageMetadata } from 'astro';
|
||||||
import Layout from 'layouts/PageLayout.astro';
|
import Layout from '~/layouts/PageLayout.astro';
|
||||||
import SinglePost from 'components/blog/SinglePost.astro';
|
import SinglePost from '~/components/blog/SinglePost.astro';
|
||||||
import ToBlogLink from 'components/blog/ToBlogLink.astro';
|
import ToBlogLink from '~/components/blog/ToBlogLink.astro';
|
||||||
|
|
||||||
import { getCanonical, getPermalink } from 'utils/permalinks';
|
import { getCanonical, getPermalink } from '~/utils/permalinks';
|
||||||
import { getStaticPathsBlogPost, blogPostRobots } from 'utils/blog';
|
import { getStaticPathsBlogPost, blogPostRobots } from '~/utils/blog';
|
||||||
import { findImage } from 'utils/images';
|
import { findImage } from '~/utils/images';
|
||||||
import type { MetaData } from 'types';
|
import type { MetaData } from '~/types';
|
||||||
import RelatedPosts from 'components/blog/RelatedPosts.astro';
|
import RelatedPosts from '~/components/blog/RelatedPosts.astro';
|
||||||
|
|
||||||
export const prerender = true;
|
export const prerender = true;
|
||||||
|
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
---
|
---
|
||||||
import Features2 from 'components/widgets/Features2.astro';
|
import Features2 from '~/components/widgets/Features2.astro';
|
||||||
import Features3 from 'components/widgets/Features3.astro';
|
import Features3 from '~/components/widgets/Features3.astro';
|
||||||
import Hero from 'components/widgets/Hero.astro';
|
import Hero from '~/components/widgets/Hero.astro';
|
||||||
import Stats from 'components/widgets/Stats.astro';
|
import Stats from '~/components/widgets/Stats.astro';
|
||||||
import Steps2 from 'components/widgets/Steps2.astro';
|
import Steps2 from '~/components/widgets/Steps2.astro';
|
||||||
import Layout from 'layouts/PageLayout.astro';
|
import Layout from '~/layouts/PageLayout.astro';
|
||||||
|
|
||||||
const metadata = {
|
const metadata = {
|
||||||
title: 'About us',
|
title: 'About us',
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
---
|
---
|
||||||
import Layout from 'layouts/PageLayout.astro';
|
import Layout from 'layouts/Layout.astro'
|
||||||
//import Layout from 'layouts/Layout.astro';
|
|
||||||
import PocketBase from 'pocketbase'
|
import PocketBase from 'pocketbase'
|
||||||
|
|
||||||
|
|
||||||
@ -12,12 +11,11 @@ if(!auth.isValid){
|
|||||||
return Astro.redirect("/account/login");
|
return Astro.redirect("/account/login");
|
||||||
}
|
}
|
||||||
|
|
||||||
const metadata = {
|
|
||||||
title: 'Account',
|
|
||||||
ignoreTitleTemplate: true,
|
|
||||||
};
|
|
||||||
---
|
---
|
||||||
|
|
||||||
<Layout metadata={metadata}>
|
<Layout title="Account setting">
|
||||||
<h1>Bonjour {user!.username}</h1>
|
<h1>Bonjour {user!.username}</h1>
|
||||||
|
<div>
|
||||||
|
<a href="/account/logout">deconnexion</a>
|
||||||
|
</div>
|
||||||
</Layout>
|
</Layout>
|
||||||
|
@ -1,11 +1,8 @@
|
|||||||
---
|
---
|
||||||
import Layout from 'layouts/PageLayout.astro';
|
import Layout from "layouts/Layout.astro";
|
||||||
//import Layout from 'layouts/Layout.astro';
|
|
||||||
import AstroUtils from "libs/AstroUtils";
|
import AstroUtils from "libs/AstroUtils";
|
||||||
import PocketBase from 'pocketbase'
|
import PocketBase from 'pocketbase'
|
||||||
import ContactUs from 'components/widgets/Contact.astro';
|
|
||||||
import CallToAction from 'components/widgets/CallToAction.astro';
|
|
||||||
import Oauth from 'components/Oauth.astro';
|
|
||||||
|
|
||||||
const pb = Astro.locals.pb
|
const pb = Astro.locals.pb
|
||||||
|
|
||||||
@ -13,8 +10,7 @@ if(pb.authStore.isValid){
|
|||||||
return Astro.redirect("/account")
|
return Astro.redirect("/account")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const res = await AstroUtils.wrap(async () => {
|
||||||
await AstroUtils.wrap(async () => {
|
|
||||||
if (Astro.request.method !== 'POST') {
|
if (Astro.request.method !== 'POST') {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -33,33 +29,12 @@ await AstroUtils.wrap(async () => {
|
|||||||
return Astro.redirect("/account/login");// route('/account/login', {message: 'Compte invalide, valider les identifiants'})) //XXX: comprendre comment le system de route fonctionne
|
return Astro.redirect("/account/login");// route('/account/login', {message: 'Compte invalide, valider les identifiants'})) //XXX: comprendre comment le system de route fonctionne
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
const metadata = {
|
|
||||||
title: 'Login',
|
|
||||||
ignoreTitleTemplate: true,
|
|
||||||
};
|
|
||||||
---
|
---
|
||||||
|
|
||||||
<Layout metadata={metadata}>
|
<Layout title="login">
|
||||||
<ContactUs
|
<form id="account-creation" method="post" enctype="multipart/form-data">
|
||||||
formid="login"
|
<input required name="username" placeholder="Pseudo ou email"/>
|
||||||
title="Connexion"
|
<input required name="password" type="password" placeholder="Mot de passe" />
|
||||||
subtitle="Connectez vous pour sauvegardez vos recherche"
|
<button>Connection</button>
|
||||||
button='Connexion'
|
</form>
|
||||||
method='post'
|
|
||||||
enctype="multipart/form-data"
|
|
||||||
inputs={[
|
|
||||||
{
|
|
||||||
type: 'text',
|
|
||||||
name: 'username',
|
|
||||||
label: 'Nom d\'utilisateur ou e-mail',
|
|
||||||
placeholder: "michel@example.com"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
type: "password",
|
|
||||||
name: "password"
|
|
||||||
}
|
|
||||||
]}
|
|
||||||
/>
|
|
||||||
<Oauth/>
|
|
||||||
</Layout>
|
</Layout>
|
@ -8,6 +8,6 @@ if(pb.authStore.isValid){
|
|||||||
pb.authStore.clear()
|
pb.authStore.clear()
|
||||||
}
|
}
|
||||||
|
|
||||||
return Astro.redirect('/')
|
return Astro.redirect('/account/login')
|
||||||
|
|
||||||
---
|
---
|
@ -4,6 +4,9 @@ const redirectUrl = Astro.url.protocol + "//" + Astro.url.host + '/account/oauth
|
|||||||
const params = Astro.url.searchParams
|
const params = Astro.url.searchParams
|
||||||
const code = params.get('code')
|
const code = params.get('code')
|
||||||
|
|
||||||
|
console.log(redirectUrl)
|
||||||
|
console.log(Astro.request.headers.get('cookie'))
|
||||||
|
//TODO socké dans les cookies
|
||||||
// load the previously stored provider's data
|
// load the previously stored provider's data
|
||||||
const providerstr = Astro.cookies.get('provider')
|
const providerstr = Astro.cookies.get('provider')
|
||||||
|
|
||||||
@ -21,13 +24,9 @@ if (!code) {
|
|||||||
|
|
||||||
// compare the redirect's state param and the stored provider's one
|
// compare the redirect's state param and the stored provider's one
|
||||||
if (provider.state !== params.get('state')) {
|
if (provider.state !== params.get('state')) {
|
||||||
console.log(provider.state)
|
|
||||||
console.log(params.get('state'))
|
|
||||||
throw "State parameters don't match.";
|
throw "State parameters don't match.";
|
||||||
}
|
}
|
||||||
|
|
||||||
let authenticated = false
|
|
||||||
|
|
||||||
await pb.collection('users').authWithOAuth2Code(
|
await pb.collection('users').authWithOAuth2Code(
|
||||||
provider.name,
|
provider.name,
|
||||||
code,
|
code,
|
||||||
@ -39,15 +38,15 @@ await pb.collection('users').authWithOAuth2Code(
|
|||||||
).then((authData) => {
|
).then((authData) => {
|
||||||
//REDIRECT
|
//REDIRECT
|
||||||
console.log("oauth OK !!");
|
console.log("oauth OK !!");
|
||||||
authenticated = true
|
console.log(JSON.stringify(authData, null, 2));
|
||||||
|
console.log(pb.authStore.isValid);
|
||||||
|
console.log(pb.authStore.isValid);
|
||||||
|
return Astro.redirect("/account")
|
||||||
}).catch((err) => {
|
}).catch((err) => {
|
||||||
console.log("oauth fail !!");
|
console.log("oauth fail !!");
|
||||||
console.log(err);
|
console.log(err);
|
||||||
});
|
});
|
||||||
|
|
||||||
if (authenticated) {
|
|
||||||
return Astro.redirect("/account")
|
|
||||||
}
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
@ -1,24 +1,38 @@
|
|||||||
---
|
---
|
||||||
import Layout from 'layouts/PageLayout.astro';
|
import Layout from 'layouts/Layout.astro';
|
||||||
//import Layout from 'layouts/Layout.astro';
|
|
||||||
import AstroUtils from 'libs/AstroUtils';
|
import AstroUtils from 'libs/AstroUtils';
|
||||||
import { getEnv } from 'libs/Env';
|
import { getEnv } from 'libs/Env';
|
||||||
import ContactUs from 'components/widgets/Contact.astro';
|
|
||||||
import Oauth from 'components/Oauth.astro';
|
|
||||||
|
|
||||||
const pb = Astro.locals.pb
|
const pb = Astro.locals.pb
|
||||||
|
|
||||||
|
const oauths = await pb.collection('users').listAuthMethods();
|
||||||
|
|
||||||
|
|
||||||
|
console.log(JSON.stringify(oauths.authProviders[0]));
|
||||||
|
|
||||||
|
let secure = true
|
||||||
|
if (getEnv('NODE_ENV', 'production') !== 'production') {
|
||||||
|
secure = false
|
||||||
|
}
|
||||||
|
|
||||||
|
Astro.cookies.set('provider', oauths.authProviders[0],{
|
||||||
|
httpOnly: true,
|
||||||
|
path: '/',
|
||||||
|
secure: secure,
|
||||||
|
sameSite: 'lax',
|
||||||
|
maxAge: 365000
|
||||||
|
})
|
||||||
|
|
||||||
if(pb.authStore.isValid){
|
if(pb.authStore.isValid){
|
||||||
return Astro.redirect("/account")
|
return Astro.redirect("/account")
|
||||||
}
|
}
|
||||||
|
|
||||||
let loged = false
|
|
||||||
|
|
||||||
await AstroUtils.wrap(async () => {
|
await AstroUtils.wrap(async () => {
|
||||||
if (Astro.request.method !== 'POST'){
|
if (Astro.request.method !== 'POST'){
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
const form = await Astro.request.formData()
|
const form = await Astro.request.formData()
|
||||||
|
if(form.get("type") == "userPassword"){
|
||||||
const request = {
|
const request = {
|
||||||
username: form.get("username") as string,
|
username: form.get("username") as string,
|
||||||
name: form.get("name") as string,
|
name: form.get("name") as string,
|
||||||
@ -28,56 +42,36 @@ await AstroUtils.wrap(async () => {
|
|||||||
}
|
}
|
||||||
try{
|
try{
|
||||||
await pb.collection('users').create(request)
|
await pb.collection('users').create(request)
|
||||||
loged = true
|
return Astro.redirect('/account/login')
|
||||||
}catch(e){
|
}catch(e){
|
||||||
console.log(e);
|
console.log(e);
|
||||||
}
|
}
|
||||||
})
|
}else if (form.get("type") == "discord2FA") {
|
||||||
if (loged) {
|
// console.log("pouet")
|
||||||
return Astro.redirect('/account/login')
|
// await pb.collection('user').authWithOAuth2({provider: 'discord'})
|
||||||
}
|
// console.log("pouetF");
|
||||||
|
|
||||||
const metadata = {
|
}else{
|
||||||
title: 'Register',
|
Astro.redirect("/404")
|
||||||
ignoreTitleTemplate: true,
|
}
|
||||||
};
|
})
|
||||||
---
|
---
|
||||||
|
|
||||||
<Layout metadata={metadata}>
|
<Layout title="register">
|
||||||
|
<form id="account-creation" method="post" enctype="multipart/form-data">
|
||||||
|
<input type="hidden" name="type" value="userPassword">
|
||||||
|
<input required name="name" placeholder="Prénom Nom"/>
|
||||||
|
<input required name="username" placeholder="Pseudo"/>
|
||||||
|
<input required name="email" type="email" placeholder="Renseignez votre email" />
|
||||||
|
<input required name="password" type="password" placeholder="Créez un mot de passe" />
|
||||||
|
<input required name="passwordConfirm" type="password" placeholder="Confirmer votre mot de passe" />
|
||||||
|
<button>Créer un compte</button>
|
||||||
|
</form>
|
||||||
|
|
||||||
<ContactUs
|
<button id="OauthDiscord">connexion avec discord</button>
|
||||||
formid='account-creation'
|
<form method="post" enctype="multipart/form-data">
|
||||||
title='Inscription'
|
<input type="hidden" name="type" value="discord2FA">
|
||||||
subtitle="inscrivez vous pour sauvegardez vos recherche"
|
</form>
|
||||||
button='Créer un compte'
|
<a href={oauths.authProviders[0].authUrl + Astro.url.protocol + "//" + Astro.url.host + '/account/oauth'}>discord?</a>
|
||||||
method='post'
|
|
||||||
enctype="multipart/form-data"
|
|
||||||
inputs={[
|
|
||||||
{
|
|
||||||
type: 'text',
|
|
||||||
name: 'name',
|
|
||||||
label: 'Prénom Nom',
|
|
||||||
placeholder: "Michel Biche"
|
|
||||||
},{
|
|
||||||
type: 'text',
|
|
||||||
name: 'username',
|
|
||||||
label: 'Nom d\'utilisateur',
|
|
||||||
placeholder: "michel85"
|
|
||||||
},{
|
|
||||||
type: 'email',
|
|
||||||
name: 'email',
|
|
||||||
label: 'Adresse email',
|
|
||||||
placeholder: "michel@example.com"
|
|
||||||
},{
|
|
||||||
type: 'password',
|
|
||||||
name: 'password',
|
|
||||||
label: 'Créez un mot de passe',
|
|
||||||
},{
|
|
||||||
type: 'password',
|
|
||||||
name: 'passwordConfirm',
|
|
||||||
label: 'Confirmer votre mot de passe',
|
|
||||||
},
|
|
||||||
]}
|
|
||||||
/>
|
|
||||||
<Oauth/>
|
|
||||||
</Layout>
|
</Layout>
|
||||||
|
|
@ -1,8 +1,8 @@
|
|||||||
---
|
---
|
||||||
import Layout from 'layouts/PageLayout.astro';
|
import Layout from '~/layouts/PageLayout.astro';
|
||||||
import HeroText from 'components/widgets/HeroText.astro';
|
import HeroText from '~/components/widgets/HeroText.astro';
|
||||||
import ContactUs from 'components/widgets/Contact.astro';
|
import ContactUs from '~/components/widgets/Contact.astro';
|
||||||
import Features2 from 'components/widgets/Features2.astro';
|
import Features2 from '~/components/widgets/Features2.astro';
|
||||||
|
|
||||||
const metadata = {
|
const metadata = {
|
||||||
title: 'Contact',
|
title: 'Contact',
|
||||||
|
@ -1,18 +1,18 @@
|
|||||||
---
|
---
|
||||||
import Layout from 'layouts/PageLayout.astro';
|
import Layout from '~/layouts/PageLayout.astro';
|
||||||
|
|
||||||
import Header from 'components/widgets/Header.astro';
|
import Header from '~/components/widgets/Header.astro';
|
||||||
|
|
||||||
import Hero2 from 'components/widgets/Hero2.astro';
|
import Hero2 from '~/components/widgets/Hero2.astro';
|
||||||
import CallToAction from 'components/widgets/CallToAction.astro';
|
import CallToAction from '~/components/widgets/CallToAction.astro';
|
||||||
import Features3 from 'components/widgets/Features3.astro';
|
import Features3 from '~/components/widgets/Features3.astro';
|
||||||
import Content from 'components/widgets/Content.astro';
|
import Content from '~/components/widgets/Content.astro';
|
||||||
import Testimonials from 'components/widgets/Testimonials.astro';
|
import Testimonials from '~/components/widgets/Testimonials.astro';
|
||||||
import FAQs from 'components/widgets/FAQs.astro';
|
import FAQs from '~/components/widgets/FAQs.astro';
|
||||||
import Stats from 'components/widgets/Stats.astro';
|
import Stats from '~/components/widgets/Stats.astro';
|
||||||
|
|
||||||
import Button from 'components/ui/Button.astro';
|
import Button from '~/components/ui/Button.astro';
|
||||||
import Image from 'components/common/Image.astro';
|
import Image from '~/components/common/Image.astro';
|
||||||
|
|
||||||
const appStoreImg = '~/assets/images/app-store.png';
|
const appStoreImg = '~/assets/images/app-store.png';
|
||||||
const appStoreDownloadLink = 'https://github.com/onwidget/astrowind';
|
const appStoreDownloadLink = 'https://github.com/onwidget/astrowind';
|
||||||
|
@ -1,15 +1,15 @@
|
|||||||
---
|
---
|
||||||
import Layout from 'layouts/PageLayout.astro';
|
import Layout from '~/layouts/PageLayout.astro';
|
||||||
|
|
||||||
import Header from 'components/widgets/Header.astro';
|
import Header from '~/components/widgets/Header.astro';
|
||||||
import Hero from 'components/widgets/Hero.astro';
|
import Hero from '~/components/widgets/Hero.astro';
|
||||||
import Content from 'components/widgets/Content.astro';
|
import Content from '~/components/widgets/Content.astro';
|
||||||
import CallToAction from 'components/widgets/CallToAction.astro';
|
import CallToAction from '~/components/widgets/CallToAction.astro';
|
||||||
import Features3 from 'components/widgets/Features3.astro';
|
import Features3 from '~/components/widgets/Features3.astro';
|
||||||
import Testimonials from 'components/widgets/Testimonials.astro';
|
import Testimonials from '~/components/widgets/Testimonials.astro';
|
||||||
import Steps from 'components/widgets/Steps.astro';
|
import Steps from '~/components/widgets/Steps.astro';
|
||||||
import BlogLatestPosts from 'components/widgets/BlogLatestPosts.astro';
|
import BlogLatestPosts from '~/components/widgets/BlogLatestPosts.astro';
|
||||||
import { getPermalink } from 'utils/permalinks';
|
import { getPermalink } from '~/utils/permalinks';
|
||||||
|
|
||||||
const metadata = {
|
const metadata = {
|
||||||
title: 'Personal Homepage Demo',
|
title: 'Personal Homepage Demo',
|
||||||
|
@ -1,16 +1,16 @@
|
|||||||
---
|
---
|
||||||
import Layout from 'layouts/PageLayout.astro';
|
import Layout from '~/layouts/PageLayout.astro';
|
||||||
|
|
||||||
import Header from 'components/widgets/Header.astro';
|
import Header from '~/components/widgets/Header.astro';
|
||||||
import Hero2 from 'components/widgets/Hero2.astro';
|
import Hero2 from '~/components/widgets/Hero2.astro';
|
||||||
import Features from 'components/widgets/Features.astro';
|
import Features from '~/components/widgets/Features.astro';
|
||||||
import Steps2 from 'components/widgets/Steps2.astro';
|
import Steps2 from '~/components/widgets/Steps2.astro';
|
||||||
import Content from 'components/widgets/Content.astro';
|
import Content from '~/components/widgets/Content.astro';
|
||||||
import Pricing from 'components/widgets/Pricing.astro';
|
import Pricing from '~/components/widgets/Pricing.astro';
|
||||||
|
|
||||||
import { headerData } from 'navigation';
|
import { headerData } from '~/navigation';
|
||||||
import FAQs from 'components/widgets/FAQs.astro';
|
import FAQs from '~/components/widgets/FAQs.astro';
|
||||||
import BlogLatestPosts from 'components/widgets/BlogLatestPosts.astro';
|
import BlogLatestPosts from '~/components/widgets/BlogLatestPosts.astro';
|
||||||
|
|
||||||
const metadata = {
|
const metadata = {
|
||||||
title: 'SaaS Landing Page',
|
title: 'SaaS Landing Page',
|
||||||
|
@ -1,15 +1,15 @@
|
|||||||
---
|
---
|
||||||
import Layout from 'layouts/PageLayout.astro';
|
import Layout from '~/layouts/PageLayout.astro';
|
||||||
|
|
||||||
import Hero from 'components/widgets/Hero.astro';
|
import Hero from '~/components/widgets/Hero.astro';
|
||||||
import CallToAction from 'components/widgets/CallToAction.astro';
|
import CallToAction from '~/components/widgets/CallToAction.astro';
|
||||||
|
|
||||||
import Features2 from 'components/widgets/Features2.astro';
|
import Features2 from '~/components/widgets/Features2.astro';
|
||||||
import Features from 'components/widgets/Features.astro';
|
import Features from '~/components/widgets/Features.astro';
|
||||||
import Stats from 'components/widgets/Stats.astro';
|
import Stats from '~/components/widgets/Stats.astro';
|
||||||
import Features3 from 'components/widgets/Features3.astro';
|
import Features3 from '~/components/widgets/Features3.astro';
|
||||||
import FAQs from 'components/widgets/FAQs.astro';
|
import FAQs from '~/components/widgets/FAQs.astro';
|
||||||
import Brands from 'components/widgets/Brands.astro';
|
import Brands from '~/components/widgets/Brands.astro';
|
||||||
|
|
||||||
import { YouTube } from 'astro-embed';
|
import { YouTube } from 'astro-embed';
|
||||||
|
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
---
|
---
|
||||||
import Layout from 'layouts/LandingLayout.astro';
|
import Layout from '~/layouts/LandingLayout.astro';
|
||||||
|
|
||||||
import Hero2 from 'components/widgets/Hero2.astro';
|
import Hero2 from '~/components/widgets/Hero2.astro';
|
||||||
import CallToAction from 'components/widgets/CallToAction.astro';
|
import CallToAction from '~/components/widgets/CallToAction.astro';
|
||||||
|
|
||||||
const metadata = {
|
const metadata = {
|
||||||
title: 'Click-through Landing Page Demo',
|
title: 'Click-through Landing Page Demo',
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
---
|
---
|
||||||
import Layout from 'layouts/LandingLayout.astro';
|
import Layout from '~/layouts/LandingLayout.astro';
|
||||||
|
|
||||||
import Hero from 'components/widgets/Hero.astro';
|
import Hero from '~/components/widgets/Hero.astro';
|
||||||
import CallToAction from 'components/widgets/CallToAction.astro';
|
import CallToAction from '~/components/widgets/CallToAction.astro';
|
||||||
|
|
||||||
const metadata = {
|
const metadata = {
|
||||||
title: 'Lead Generation Landing Page Demo',
|
title: 'Lead Generation Landing Page Demo',
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
---
|
---
|
||||||
import Layout from 'layouts/LandingLayout.astro';
|
import Layout from '~/layouts/LandingLayout.astro';
|
||||||
|
|
||||||
import Hero2 from 'components/widgets/Hero2.astro';
|
import Hero2 from '~/components/widgets/Hero2.astro';
|
||||||
import CallToAction from 'components/widgets/CallToAction.astro';
|
import CallToAction from '~/components/widgets/CallToAction.astro';
|
||||||
|
|
||||||
const metadata = {
|
const metadata = {
|
||||||
title: 'Pre-Launch Landing Page',
|
title: 'Pre-Launch Landing Page',
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
---
|
---
|
||||||
import Layout from 'layouts/LandingLayout.astro';
|
import Layout from '~/layouts/LandingLayout.astro';
|
||||||
|
|
||||||
import Hero from 'components/widgets/Hero.astro';
|
import Hero from '~/components/widgets/Hero.astro';
|
||||||
import CallToAction from 'components/widgets/CallToAction.astro';
|
import CallToAction from '~/components/widgets/CallToAction.astro';
|
||||||
|
|
||||||
const metadata = {
|
const metadata = {
|
||||||
title: 'Product Details Landing Page Demo',
|
title: 'Product Details Landing Page Demo',
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
---
|
---
|
||||||
import Layout from 'layouts/LandingLayout.astro';
|
import Layout from '~/layouts/LandingLayout.astro';
|
||||||
|
|
||||||
import Hero2 from 'components/widgets/Hero2.astro';
|
import Hero2 from '~/components/widgets/Hero2.astro';
|
||||||
import CallToAction from 'components/widgets/CallToAction.astro';
|
import CallToAction from '~/components/widgets/CallToAction.astro';
|
||||||
|
|
||||||
const metadata = {
|
const metadata = {
|
||||||
title: 'Sales Landing Page Demo',
|
title: 'Sales Landing Page Demo',
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
---
|
---
|
||||||
import Layout from 'layouts/LandingLayout.astro';
|
import Layout from '~/layouts/LandingLayout.astro';
|
||||||
|
|
||||||
import Hero2 from 'components/widgets/Hero2.astro';
|
import Hero2 from '~/components/widgets/Hero2.astro';
|
||||||
import CallToAction from 'components/widgets/CallToAction.astro';
|
import CallToAction from '~/components/widgets/CallToAction.astro';
|
||||||
|
|
||||||
const metadata = {
|
const metadata = {
|
||||||
title: 'Subscription Landing Page Demo',
|
title: 'Subscription Landing Page Demo',
|
||||||
|
26
front/src/pages/maps.astro
Normal file
26
front/src/pages/maps.astro
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
---
|
||||||
|
import Layout from 'layouts/Layout.astro';
|
||||||
|
import 'leaflet/dist/leaflet.css'
|
||||||
|
---
|
||||||
|
|
||||||
|
<Layout title="maps test">
|
||||||
|
|
||||||
|
<div class="w-52 h-52" id="map" />
|
||||||
|
|
||||||
|
|
||||||
|
</Layout>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import L from 'leaflet'
|
||||||
|
|
||||||
|
const map = L.map('map', {
|
||||||
|
center: [50,0],
|
||||||
|
zoom: 13,
|
||||||
|
preferCanvas: true
|
||||||
|
})
|
||||||
|
L.tileLayer('https://tile.openstreetmap.org/{z}/{x}/{y}.png', {
|
||||||
|
maxZoom: 19,
|
||||||
|
attribution: '© <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a>'
|
||||||
|
}).addTo(map);
|
||||||
|
var marker = L.marker([51.5, -0.09]).addTo(map);
|
||||||
|
</script>
|
@ -1,87 +0,0 @@
|
|||||||
---
|
|
||||||
import Layout from 'layouts/PageLayout.astro'
|
|
||||||
import 'leaflet/dist/leaflet.css'
|
|
||||||
import 'leaflet-routing-machine/dist/leaflet-routing-machine.css'
|
|
||||||
import FormContainer from 'components/ui/Form.astro'
|
|
||||||
import Input from 'components/Input.astro'
|
|
||||||
import Button from 'components/ui/Button.astro'
|
|
||||||
|
|
||||||
const metadata = {
|
|
||||||
title: 'Maps',
|
|
||||||
ignoreTitleTemplate: true,
|
|
||||||
}
|
|
||||||
---
|
|
||||||
|
|
||||||
<Layout metadata={metadata}>
|
|
||||||
|
|
||||||
<div class="h-[calc(100vh-5rem)] flex flex-col">
|
|
||||||
<div class="w-full h-96 grow" id="map" />
|
|
||||||
<Button id="test-btn">test</Button>
|
|
||||||
</div>
|
|
||||||
<!-- for remouve footer -->
|
|
||||||
<div slot="footer"></div>
|
|
||||||
</Layout>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
import * as L from 'leaflet'
|
|
||||||
import markerShadow from "leaflet/dist/images/marker-shadow.png"
|
|
||||||
import markerIcon from "leaflet/dist/images/marker-icon.png"
|
|
||||||
import 'leaflet-routing-machine/dist/leaflet-routing-machine.js'
|
|
||||||
import 'leaflet-control-geocoder/dist/Control.Geocoder.js'
|
|
||||||
|
|
||||||
const icon = {icon: new L.Icon({iconUrl: markerIcon.src, shadowUrl: markerShadow.src, iconAnchor: [13,41]})}
|
|
||||||
|
|
||||||
// declare map
|
|
||||||
const map = L.map('map', {
|
|
||||||
center: [51.5, -0.09],
|
|
||||||
zoom: 13,
|
|
||||||
preferCanvas: true,
|
|
||||||
zoomControl: false
|
|
||||||
})
|
|
||||||
L.tileLayer('https://tile.openstreetmap.org/{z}/{x}/{y}.png', {
|
|
||||||
maxZoom: 19,
|
|
||||||
attribution: '© <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a>'
|
|
||||||
}).addTo(map)
|
|
||||||
|
|
||||||
// move zoom ctl to bottom
|
|
||||||
L.control.zoom({
|
|
||||||
position: 'bottomleft'
|
|
||||||
}).addTo(map);
|
|
||||||
|
|
||||||
const routing = L.Routing.control({
|
|
||||||
// utile pour afficher des route stocké
|
|
||||||
// waypoints: [
|
|
||||||
// L.latLng(46.6705431, -1.4269698),
|
|
||||||
// L.latLng(47.218536, -1.554075)
|
|
||||||
// ],
|
|
||||||
routeWhileDragging: true,
|
|
||||||
//@ts-ignore
|
|
||||||
geocoder: L.Control.Geocoder.nominatim(),
|
|
||||||
//@ts-ignore
|
|
||||||
position: 'topleft',
|
|
||||||
showAlternatives: true,
|
|
||||||
reverseWaypoints: true,
|
|
||||||
altLineOptions: {
|
|
||||||
missingRouteTolerance: 50,
|
|
||||||
extendToWaypoints: true,
|
|
||||||
styles: [
|
|
||||||
{color: 'black', opacity: 0.15, weight: 9},
|
|
||||||
{color: 'white', opacity: 0.2, weight: 6},
|
|
||||||
{color: 'blue', opacity: 5, weight: 2}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}).addTo(map).on('routeselected', (e) => {
|
|
||||||
console.log("iténeraire choisie")
|
|
||||||
console.log(e)
|
|
||||||
}).on('routesfound', (e) =>{
|
|
||||||
console.log("route trouvé")
|
|
||||||
console.log(e)
|
|
||||||
})
|
|
||||||
document.querySelector<HTMLButtonElement>('#test-btn')?.addEventListener('click', () => {
|
|
||||||
routing.setWaypoints(
|
|
||||||
[L.latLng(46.6705431, -1.4269698),L.latLng(47.218536, -1.554075)]
|
|
||||||
)
|
|
||||||
routing.route();
|
|
||||||
})
|
|
||||||
|
|
||||||
</script>
|
|
@ -1,281 +0,0 @@
|
|||||||
---
|
|
||||||
import Layout from 'layouts/PageLayout.astro'
|
|
||||||
import 'leaflet/dist/leaflet.css'
|
|
||||||
import 'leaflet-geosearch/dist/geosearch.css'
|
|
||||||
import CheckBox from 'components/CheckBox.astro'
|
|
||||||
import Radios from 'components/Radios.astro'
|
|
||||||
import ListResult, { type RecordModel } from 'pocketbase'
|
|
||||||
import { Expand, Trash } from 'lucide-astro'
|
|
||||||
|
|
||||||
const pb = Astro.locals.pb
|
|
||||||
const connected = pb.authStore.isValid
|
|
||||||
|
|
||||||
const metadata = {
|
|
||||||
title: 'Maps',
|
|
||||||
ignoreTitleTemplate: true,
|
|
||||||
}
|
|
||||||
|
|
||||||
let fav = new Array<any>
|
|
||||||
|
|
||||||
if(connected){
|
|
||||||
try {
|
|
||||||
const request = await pb.collection('user_poi').getList(1,10,{filter:`owner="${pb.authStore.model!.id}"`, expand:"poi_list"})
|
|
||||||
request.items.forEach(element => {
|
|
||||||
fav.push(element.expand!.poi_list.Poi)
|
|
||||||
});
|
|
||||||
} catch (error) {
|
|
||||||
console.log(error);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
console.log(fav);
|
|
||||||
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
<Layout metadata={metadata}>
|
|
||||||
|
|
||||||
<div class="h-[calc(100vh-5rem)] flex flex-row">
|
|
||||||
<div class="w-1/5 flex flex-col">
|
|
||||||
<p id="message" class="hidden text-center mb-3">pouet</p>
|
|
||||||
<p class="text-center text-2xl mb-3">Filtre :</p>
|
|
||||||
<div class="">
|
|
||||||
<p>note minimal :</p>
|
|
||||||
<Radios
|
|
||||||
values={[
|
|
||||||
{name: "1", label: "1", checked: true},
|
|
||||||
{name: "2", label: "2"},
|
|
||||||
{name: "3", label: "3"},
|
|
||||||
{name: "1h", label: "1h"},
|
|
||||||
{name: "2h", label: "2h"},
|
|
||||||
{name: "3h", label: "3h"},
|
|
||||||
]}
|
|
||||||
/>
|
|
||||||
<p class="text-center text-xl mb-3">Type POI :</p>
|
|
||||||
<CheckBox
|
|
||||||
label="Bar, Pub, Café,..."
|
|
||||||
name="filter"
|
|
||||||
value="drink"
|
|
||||||
checked
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
<div class="mb-3 grow">
|
|
||||||
<p class="text-center text-xl mb-3">Source :</p>
|
|
||||||
<CheckBox
|
|
||||||
label="Open Trip Maps"
|
|
||||||
name="filter"
|
|
||||||
value="otm"
|
|
||||||
checked
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
{connected && (
|
|
||||||
<div class="mb-2">
|
|
||||||
<p class="text-center text-xl mb-3">Favori :</p>
|
|
||||||
{fav.map(val =>(
|
|
||||||
<div class="ml-2 flex flex-row mb-1" id="fav-div">
|
|
||||||
<p class="grow poi-favori" id={val.id} data-pos={val.geometry.coordinates}>{val.properties.name}</p>
|
|
||||||
<Trash id={val.id} class="poi-trash"/>
|
|
||||||
</div>
|
|
||||||
))}
|
|
||||||
</div>
|
|
||||||
)}
|
|
||||||
</div>
|
|
||||||
<div class="flex flex-col h-full grow">
|
|
||||||
<div class="w-full h-full grow" id="map" />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<!-- TODO: faire en sort que le style soit propre -->
|
|
||||||
|
|
||||||
<!-- for remouve footer -->
|
|
||||||
<div slot="footer"></div>
|
|
||||||
<!-- penser a rm 11 au rem au dessus pour la taille -->
|
|
||||||
</Layout>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
import L, {Popup} from 'leaflet'
|
|
||||||
import markerShadow from "leaflet/dist/images/marker-shadow.png"
|
|
||||||
import markerIcon from "leaflet/dist/images/marker-icon.png"
|
|
||||||
import { OpenStreetMapProvider } from 'leaflet-geosearch'
|
|
||||||
import { GeoSearchControl } from 'leaflet-geosearch'
|
|
||||||
|
|
||||||
const showFav = document.querySelectorAll(".poi-favori")
|
|
||||||
const trashFav = document.querySelectorAll(".poi-trash")
|
|
||||||
const favDiv = document.querySelector('#fav-div')
|
|
||||||
|
|
||||||
const icon = {icon: new L.Icon({iconUrl: markerIcon.src, shadowUrl: markerShadow.src, iconAnchor: [13,41]})}
|
|
||||||
|
|
||||||
// const BACK_URL = "http://localhost:3001/" //XXX : mettre url de prod
|
|
||||||
const BACK_URL = "https://drink-tweb.cb85.fr/" //XXX : mettre url de prod
|
|
||||||
|
|
||||||
// declare map
|
|
||||||
const map = L.map('map', {
|
|
||||||
center: [51.5, -0.09],
|
|
||||||
zoom: 13,
|
|
||||||
preferCanvas: true,
|
|
||||||
zoomControl: false
|
|
||||||
})
|
|
||||||
L.tileLayer('https://tile.openstreetmap.org/{z}/{x}/{y}.png', {
|
|
||||||
maxZoom: 19,
|
|
||||||
attribution: '© <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a>'
|
|
||||||
}).addTo(map)
|
|
||||||
|
|
||||||
// move zoom ctl to bottom
|
|
||||||
L.control.zoom({
|
|
||||||
position: 'bottomleft'
|
|
||||||
}).addTo(map)
|
|
||||||
|
|
||||||
const provider = new OpenStreetMapProvider()
|
|
||||||
|
|
||||||
map.addControl(
|
|
||||||
GeoSearchControl({
|
|
||||||
notFoundMessage: 'Adresse introuvable !',
|
|
||||||
provider,
|
|
||||||
showMarker: false,
|
|
||||||
style: 'bar',
|
|
||||||
}),
|
|
||||||
)
|
|
||||||
|
|
||||||
async function saveToFav(element: any, save: boolean){
|
|
||||||
const url = '/maps/save_poi';
|
|
||||||
const options = {
|
|
||||||
method: 'POST',
|
|
||||||
body: JSON.stringify({Poi : element, save: save})
|
|
||||||
};
|
|
||||||
|
|
||||||
try {
|
|
||||||
const response = await fetch(url, options);
|
|
||||||
const data = await response.json();
|
|
||||||
console.log(data);
|
|
||||||
} catch (error) {
|
|
||||||
console.error(error);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function eventGotoFav(e: Element){
|
|
||||||
e.addEventListener('click', () =>{
|
|
||||||
const pose = e.getAttribute('data-pos')?.split(',')
|
|
||||||
map.panTo(new L.LatLng(parseFloat(pose![1]),parseFloat(pose![0])))
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
function eventRemoveFav(e: Element){
|
|
||||||
e.addEventListener('click', async () => {
|
|
||||||
await saveToFav({id:e.id, type:"Feature"},false)
|
|
||||||
document.location.reload()
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
showFav.forEach(e => {eventGotoFav(e)})
|
|
||||||
trashFav.forEach(e => {eventRemoveFav(e)})
|
|
||||||
|
|
||||||
let poiMarkers = new Array<L.Marker>
|
|
||||||
let minimalNote = "1"
|
|
||||||
let drink = true
|
|
||||||
let otm = true
|
|
||||||
|
|
||||||
// run api search
|
|
||||||
function searchBox(){
|
|
||||||
const nordWest = map.getBounds().getNorthWest()
|
|
||||||
const southEast = map.getBounds().getSouthEast()
|
|
||||||
const params: URLSearchParams = new URLSearchParams()
|
|
||||||
|
|
||||||
params.append("lon1", nordWest.lng.toString())
|
|
||||||
params.append("lat1", nordWest.lat.toString())
|
|
||||||
params.append("lon2", southEast.lng.toString())
|
|
||||||
params.append("lat2", southEast.lat.toString())
|
|
||||||
params.append("rate", minimalNote)
|
|
||||||
|
|
||||||
if(drink && otm){
|
|
||||||
fetch(`${BACK_URL}otm/box?${params.toString()}`,{method: 'GET',headers: {'Content-Type': 'application/json',}}).then(function (response) {
|
|
||||||
return response.json()
|
|
||||||
}).then(function (data) {
|
|
||||||
poiMarkers.forEach(element => {
|
|
||||||
element.remove()
|
|
||||||
})
|
|
||||||
console.log(data)
|
|
||||||
data.features.forEach(element => {
|
|
||||||
const prop = element.properties
|
|
||||||
const popup: Popup = new Popup()
|
|
||||||
let tags = new String()
|
|
||||||
prop.kinds.split(",").forEach(element => {
|
|
||||||
tags += "- " + element + "<br/>"
|
|
||||||
})
|
|
||||||
const poiMarker = L.marker([element.geometry.coordinates[1],element.geometry.coordinates[0]],icon)
|
|
||||||
.bindPopup(`<b>${prop.name}</b><br/>note : ${prop.rate} <br/>tags:<br/> ${tags} <p>favori : <input type="checkbox" name="like" id=${element.id}/><p>`)
|
|
||||||
.on("click", () => {
|
|
||||||
document.querySelectorAll<HTMLInputElement>('input[name="like"]').forEach(e => {
|
|
||||||
e.addEventListener("click", () => {
|
|
||||||
console.log(element)
|
|
||||||
saveToFav(element, e.checked)
|
|
||||||
document.location.reload()
|
|
||||||
})
|
|
||||||
})
|
|
||||||
})
|
|
||||||
poiMarker.addTo(map)
|
|
||||||
poiMarkers.push(poiMarker)
|
|
||||||
})
|
|
||||||
}).catch(function (err) {
|
|
||||||
console.warn('Something went wrong.', err)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// fonciton pour lancer la recherche de box sur l'api
|
|
||||||
function sender(){
|
|
||||||
if(map.getZoom() >= 13){
|
|
||||||
console.log("zoom OKAY")
|
|
||||||
//TODO: mettre un message de recherche en cour
|
|
||||||
searchBox()
|
|
||||||
}else{
|
|
||||||
console.log("zoom more to see result")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// envent pour lancer la recherche
|
|
||||||
const cooldown = 400
|
|
||||||
sender()
|
|
||||||
let timeoutHandle = window.setTimeout(sender, cooldown)
|
|
||||||
|
|
||||||
window.clearTimeout(timeoutHandle)
|
|
||||||
|
|
||||||
map.addEventListener("move",() =>{
|
|
||||||
window.clearTimeout(timeoutHandle)
|
|
||||||
timeoutHandle = window.setTimeout(sender, cooldown)
|
|
||||||
})
|
|
||||||
|
|
||||||
map.addEventListener("zoom", () => {
|
|
||||||
if(map.getZoom() <= 11){
|
|
||||||
poiMarkers.forEach(element => {
|
|
||||||
element.remove()
|
|
||||||
})
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
document.querySelectorAll<HTMLInputElement>("input[name='filter']").forEach(e =>{
|
|
||||||
e.addEventListener("click", () => {
|
|
||||||
switch (e.value) {
|
|
||||||
case "drink":
|
|
||||||
drink = e.checked
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "otm":
|
|
||||||
otm = e.checked
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
poiMarkers.forEach(element => {
|
|
||||||
element.remove()
|
|
||||||
})
|
|
||||||
searchBox()
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
document.querySelectorAll<HTMLInputElement>('input[name="note-min"]').forEach(e => {
|
|
||||||
e.addEventListener("click", () => {
|
|
||||||
minimalNote = e.value
|
|
||||||
searchBox()
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
</script>
|
|
@ -1,47 +0,0 @@
|
|||||||
---
|
|
||||||
import AstroUtils from "libs/AstroUtils";
|
|
||||||
import type { RecordModel } from "pocketbase";
|
|
||||||
|
|
||||||
|
|
||||||
const pb = Astro.locals.pb
|
|
||||||
|
|
||||||
if(!pb.authStore.isValid){
|
|
||||||
return Astro.redirect("/account")
|
|
||||||
}
|
|
||||||
|
|
||||||
await AstroUtils.wrap(async () => {
|
|
||||||
if (Astro.request.method !== 'POST') {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
const poiJson = await Astro.request.json()
|
|
||||||
|
|
||||||
const data = {Poi: poiJson.Poi, Poi_id:poiJson.Poi.id}
|
|
||||||
|
|
||||||
let record: RecordModel
|
|
||||||
|
|
||||||
try {
|
|
||||||
record = await pb.collection('POI').create(data);
|
|
||||||
} catch (error) {
|
|
||||||
try{
|
|
||||||
record = await pb.collection('POI').getFirstListItem(`Poi_id="${poiJson.Poi.id}"`)
|
|
||||||
} catch (error2) {
|
|
||||||
console.log("error 1 :")
|
|
||||||
console.log(error)
|
|
||||||
console.log("error 2 :")
|
|
||||||
console.log(error2)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
if(poiJson.save){
|
|
||||||
await pb.collection('user_poi').create({owner: pb.authStore.model!.id, poi_list:record!.id})
|
|
||||||
}else{
|
|
||||||
record = await pb.collection('user_poi').getFirstListItem(`poi_list="${record!.id}"&&owner="${pb.authStore.model!.id}"`)
|
|
||||||
await pb.collection('user_poi').delete(record.id)
|
|
||||||
}
|
|
||||||
} catch (error) {
|
|
||||||
console.log(error)
|
|
||||||
}
|
|
||||||
|
|
||||||
})
|
|
||||||
---
|
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user