Compare commits

..

No commits in common. "62f60c749173bb12fb3fcfdd4606ebbc0ea35faf" and "616b64a74229438235bb62eac37464cd71042b74" have entirely different histories.

17 changed files with 6782 additions and 4122 deletions

View File

@ -33,10 +33,6 @@ jobs:
echo "Unable to determine package manager" echo "Unable to determine package manager"
exit 1 exit 1
fi fi
- name: Install package manager (from package.json)
run: |
corepack enable
corepack install
- name: Setup Node - name: Setup Node
uses: actions/setup-node@v4 uses: actions/setup-node@v4
with: with:
@ -53,7 +49,7 @@ jobs:
- name: Make envfile - name: Make envfile
uses: SpicyPizza/create-envfile@v2.0 uses: SpicyPizza/create-envfile@v2.0
with: with:
envkey_PUBLIC_BACKEND_URL: ${{ vars.PUBLIC_BACKEND_URL }} envkey_PUBLIC_BACKEND_HOST: ${{ vars.PUBLIC_BACKEND_HOST }}
- name: Build with Astro - name: Build with Astro
run: | run: |
${{ steps.detect-package-manager.outputs.runner }} astro build ${{ steps.detect-package-manager.outputs.runner }} astro build
@ -77,3 +73,18 @@ jobs:
echo start at: echo start at:
date -u date -u
POST_SCRIPT: "echo done at: && date -u" POST_SCRIPT: "echo done at: && date -u"
- name: Send email notification
uses: dawidd6/action-send-mail@v3
if: ${{ always() }}
with:
server_address: mail.log101.dev
server_port: 465
secure: true
username: ${{secrets.MAIL_USERNAME}}
password: ${{secrets.MAIL_PASSWORD}}
subject: Github Actions job result
to: ffrknerdm@gmail.com
from: gitea@log101.dev
body:
Build job of ${{github.repository}} completed with status ${{
steps.deploy.outcome }}!

View File

@ -2,7 +2,7 @@ import { defineConfig } from 'astro/config';
import react from "@astrojs/react"; import react from "@astrojs/react";
import tailwind from "@astrojs/tailwind"; import tailwind from "@astrojs/tailwind";
const devMode = import.meta.env.DEV import node from "@astrojs/node";
// https://astro.build/config // https://astro.build/config
export default defineConfig({ export default defineConfig({
@ -10,5 +10,5 @@ export default defineConfig({
applyBaseStyles: false applyBaseStyles: false
})], })],
output: "static", output: "static",
site: devMode ? "http://localhost:4321" : "https://konulukonum.log101.dev" site: "https://konulukonum.log101.dev"
}); });

BIN
bun.lockb

Binary file not shown.

6730
package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

View File

@ -11,8 +11,10 @@
}, },
"dependencies": { "dependencies": {
"@astrojs/check": "^0.4.1", "@astrojs/check": "^0.4.1",
"@astrojs/node": "^8.3.2",
"@astrojs/react": "^3.6.0", "@astrojs/react": "^3.6.0",
"@astrojs/tailwind": "^5.1.0", "@astrojs/tailwind": "^5.1.0",
"@astrojs/vercel": "^7.7.2",
"@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-checkbox": "^1.1.1",
"@radix-ui/react-icons": "^1.3.0", "@radix-ui/react-icons": "^1.3.0",
"@radix-ui/react-label": "^2.1.0", "@radix-ui/react-label": "^2.1.0",
@ -36,8 +38,8 @@
"@types/leaflet": "^1.9.12", "@types/leaflet": "^1.9.12",
"@types/react": "^18.3.3", "@types/react": "^18.3.3",
"@types/react-dom": "^18.3.0", "@types/react-dom": "^18.3.0",
"@types/bun": "^1.1.6",
"@types/google.maps": "^3.55.11", "@types/google.maps": "^3.55.11",
"@types/toastify-js": "^1.12.3" "@types/toastify-js": "^1.12.3"
}, }
"packageManager": "yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e"
} }

View File

@ -1,12 +1,12 @@
import L from "leaflet" import L from "leaflet"
var targetLocationIcon = L.icon({ var targetLocationIcon = L.icon({
iconUrl: "/goal.svg", iconUrl: "goal.svg",
iconSize: [32, 32], iconSize: [32, 32],
}) })
var currentLocationIcon = L.icon({ var currentLocationIcon = L.icon({
iconUrl: "/blue-dot.png", iconUrl: "blue-dot.png",
iconSize: [32, 32], iconSize: [32, 32],
}) })

View File

@ -14,8 +14,7 @@ import { toast } from "@/lib/utils"
// Update the elements according to distance remaining // Update the elements according to distance remaining
function locationSuccessCallback( function locationSuccessCallback(
position: GeolocationPosition, position: GeolocationPosition,
targetPosition: LatLngTuple, targetPosition: LatLngTuple
radius: number
) { ) {
// Enable current location control // Enable current location control
removeClasses("current-location-control", "disabled-button") removeClasses("current-location-control", "disabled-button")
@ -28,7 +27,7 @@ function locationSuccessCallback(
) )
// If user has arrived to destination // If user has arrived to destination
if (distance < radius) { if (distance < 100) {
// Change the description texts // Change the description texts
updateText("button-text", "İçeriği Göster") updateText("button-text", "İçeriği Göster")
updateText("locked-content-description", "İçeriği görmek için butona bas!") updateText("locked-content-description", "İçeriği görmek için butona bas!")

View File

@ -12,10 +12,10 @@ import "toastify-js/src/toastify.css"
<link rel='icon' type='image/jpg' href='/konulu-konum-logo.jpg' /> <link rel='icon' type='image/jpg' href='/konulu-konum-logo.jpg' />
<meta property='og:title' content='Konulu Konum' /> <meta property='og:title' content='Konulu Konum' />
<meta property='og:description' content='Sevdiklerinizi şaşırtın!' /> <meta property='og:description' content='Sevdiklerinizi şaşırtın!' />
<meta property='og:url' content='https://konulukonum.log101.dev' /> <meta property='og:url' content='https://konulu-konum.vercel.app' />
<meta <meta
property='og:image' property='og:image'
content='https://konulukonum.log101.dev/konulu-konum-logo.jpg' content='https://konulu-konum.vercel.app/konulu-konum-logo.jpg'
/> />
<meta name='twitter:card' content='summary' /> <meta name='twitter:card' content='summary' />
<meta name='generator' content={Astro.generator} /> <meta name='generator' content={Astro.generator} />

View File

@ -10,6 +10,5 @@ export interface ContentTable {
author: string author: string
description: string description: string
created_at: string created_at: string
radius: number
unlocked_counter: number unlocked_counter: number
} }

View File

@ -4,8 +4,6 @@ import "../styles/locked-page.css"
import Layout from "../layouts/Layout.astro" import Layout from "../layouts/Layout.astro"
import { Loader2 } from "lucide-react" import { Loader2 } from "lucide-react"
const backendUrl = import.meta.env.PUBLIC_BACKEND_URL
--- ---
<Layout> <Layout>
@ -13,8 +11,6 @@ const backendUrl = import.meta.env.PUBLIC_BACKEND_URL
<form <form
class='flex flex-col gap-12 md:gap-10' class='flex flex-col gap-12 md:gap-10'
id='sample-form' id='sample-form'
action={`${backendUrl}/api/location`}
method='post'
enctype='multipart/form-data'> enctype='multipart/form-data'>
<div> <div>
<h1 <h1
@ -85,7 +81,6 @@ const backendUrl = import.meta.env.PUBLIC_BACKEND_URL
</p> </p>
</div> </div>
<input name='geolocation' id='geolocation-input' hidden /> <input name='geolocation' id='geolocation-input' hidden />
<input name='geolocation-radius' id='geolocation-radius-input' hidden />
</div> </div>
<div> <div>

View File

@ -144,15 +144,11 @@ import { CalendarIcon } from "@radix-ui/react-icons"
const lockedContentContainer = document.getElementById( const lockedContentContainer = document.getElementById(
"locked-content-container" "locked-content-container"
) )
if (lockedContentContainer) { if (lockedContentContainer)
lockedContentContainer.dataset.targetPosition = data?.loc lockedContentContainer.dataset.targetPosition = data?.loc
}
const leafletMap = document.getElementById("map") const leafletMap = document.getElementById("map")
if (leafletMap) { if (leafletMap) leafletMap.dataset.targetLocation = data?.loc
leafletMap.dataset.targetLocation = data?.loc
leafletMap.dataset.targetRadius = data?.radius.toString() ?? "50"
}
initMap() initMap()

View File

@ -16,6 +16,7 @@ export function toggleMap() {
} }
const handleSubmit = async (e: SubmitEvent) => { const handleSubmit = async (e: SubmitEvent) => {
e.preventDefault()
toggleButton("submit-button", "submit-button-spinner") toggleButton("submit-button", "submit-button-spinner")
const locationSelected = document.getElementById( const locationSelected = document.getElementById(
"geolocation-input" "geolocation-input"
@ -40,14 +41,24 @@ const handleSubmit = async (e: SubmitEvent) => {
} }
validateFileInput(inputEl) validateFileInput(inputEl)
const formData = new FormData(e.target as HTMLFormElement)
const res = await fetch(`http://127.0.0.1:3000/api/location`, {
method: "POST",
body: formData,
})
if (res.status === 200) {
const data = await res.json()
if (data.url) location.assign(`/x?id=${data.url}`)
} else {
toast("Konulu konum oluşturulamadı, lütfen tekrar deneyin.")
}
} }
document.getElementById("sample-form")!.onsubmit = handleSubmit document.getElementById("sample-form")!.onsubmit = handleSubmit
document.getElementById("photo-selector")!.oninput = (ev) => document.getElementById("photo-selector")!.oninput = (ev) =>
validateFileInput(ev.target as HTMLInputElement) validateFileInput(ev.target as HTMLInputElement)
const url = new URL(document.URL)
if (url.searchParams.get("error"))
toast("Konulu konum oluşturulamadı, lütfen tekrar deneyin.")

View File

@ -75,7 +75,7 @@ const targetLocationControl = new GoToTargetLocation({
position: "bottomleft", position: "bottomleft",
}) })
function addTargetLocationMarker(target: TargetLocation, radius = 50) { function addTargetLocationMarker(target: TargetLocation) {
if (target) { if (target) {
L.marker(target, { icon: targetLocationIcon }).addTo(map) L.marker(target, { icon: targetLocationIcon }).addTo(map)
@ -83,7 +83,7 @@ function addTargetLocationMarker(target: TargetLocation, radius = 50) {
color: "blue", color: "blue",
fillColor: "#30f", fillColor: "#30f",
fillOpacity: 0.2, fillOpacity: 0.2,
radius, radius: 50,
}).addTo(map) }).addTo(map)
} }
} }
@ -100,7 +100,6 @@ export function initMap() {
map = L.map("map") map = L.map("map")
const targetLocation = mapEl?.dataset.targetLocation const targetLocation = mapEl?.dataset.targetLocation
const targetRadius = mapEl?.dataset.targetRadius
const data = targetLocation ? JSON.parse(targetLocation) : null const data = targetLocation ? JSON.parse(targetLocation) : null
@ -114,7 +113,7 @@ export function initMap() {
'&copy; <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a>', '&copy; <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a>',
}).addTo(map) }).addTo(map)
addTargetLocationMarker(TARGET_LOCATION, Number(targetRadius)) addTargetLocationMarker(TARGET_LOCATION)
targetLocationControl.addTo(map) targetLocationControl.addTo(map)
goToCurrentLocationControl.addTo(map) goToCurrentLocationControl.addTo(map)
} }

View File

@ -21,8 +21,6 @@ let targetLocationMarker: L.Marker
let targetLocationCircle: L.Circle let targetLocationCircle: L.Circle
let targetLocationCircleRadius = 50
let currentLocationMarker: L.Marker let currentLocationMarker: L.Marker
map.on("locationerror", () => map.on("locationerror", () =>
@ -89,116 +87,12 @@ const AskPermissonControl = L.Control.extend({
}, },
}) })
const RadiusControl = L.Control.extend({
onAdd: function (map: L.Map) {
const radiusContainer = document.createElement("div")
radiusContainer.classList.add(
"bg-white",
"h-[40px]",
"p-2",
"flex",
"items-center",
"gap-2"
)
const radiusButtonClasses = [
"text-xl",
"border-2",
"border-slate-700",
"max-h-[30px]",
"flex",
"items-center",
"p-2",
"rounded-lg",
"bg-gray-100",
"hover:bg-gray-300",
]
const radiusIncreaseButton = document.createElement("button")
radiusIncreaseButton.classList.add(...radiusButtonClasses)
const radiusDecreaseButton = document.createElement("button")
radiusIncreaseButton.type = "button"
radiusDecreaseButton.type = "button"
radiusDecreaseButton.classList.add(...radiusButtonClasses)
const radiusContainerText = document.createElement("p")
const radiusText = document.createElement("p")
radiusContainerText.classList.add("text-xl")
radiusText.classList.add("text-xl")
radiusIncreaseButton.textContent = "+"
radiusDecreaseButton.textContent = "-"
radiusContainerText.textContent = "Yarıçap: "
radiusText.textContent = `${targetLocationCircleRadius.toString()}m`
radiusContainer.insertAdjacentElement("afterbegin", radiusIncreaseButton)
radiusContainer.insertAdjacentElement("afterbegin", radiusText)
radiusContainer.insertAdjacentElement("afterbegin", radiusDecreaseButton)
radiusContainer.insertAdjacentElement("afterbegin", radiusContainerText)
radiusContainer.id = "radius-control"
L.DomEvent.on(radiusIncreaseButton, "click", (ev) => {
targetLocationCircleRadius = Math.min(
targetLocationCircleRadius + 100,
2000
)
targetLocationCircle.setRadius(targetLocationCircleRadius)
radiusText.innerText = `${targetLocationCircleRadius.toString()}m`
updateInputValue(
"geolocation-radius-input",
targetLocationCircleRadius.toString()
)
L.DomEvent.stop(ev)
})
L.DomEvent.on(radiusIncreaseButton, "dblclick", (ev) => L.DomEvent.stop(ev))
L.DomEvent.on(radiusDecreaseButton, "click", (ev) => {
targetLocationCircleRadius = Math.max(
targetLocationCircleRadius - 100,
50
)
targetLocationCircle.setRadius(targetLocationCircleRadius)
radiusText.innerText = `${targetLocationCircleRadius.toString()}m`
updateInputValue(
"geolocation-radius-input",
targetLocationCircleRadius.toString()
)
L.DomEvent.stop(ev)
})
L.DomEvent.on(radiusDecreaseButton, "dblclick", (ev) => L.DomEvent.stop(ev))
return radiusContainer
},
})
const askPermissionControl = new AskPermissonControl({ position: "bottomleft" }) const askPermissionControl = new AskPermissonControl({ position: "bottomleft" })
const currentLocationControl = new CurrentLocationControl({ const currentLocationControl = new CurrentLocationControl({
position: "bottomleft", position: "bottomleft",
}) })
const radiusControl = new RadiusControl({ position: "bottomright" })
askPermissionControl.addTo(map) askPermissionControl.addTo(map)
currentLocationControl.addTo(map) currentLocationControl.addTo(map)
@ -216,10 +110,8 @@ map.on("click", (e) => {
color: "blue", color: "blue",
fillColor: "#30f", fillColor: "#30f",
fillOpacity: 0.2, fillOpacity: 0.2,
radius: targetLocationCircleRadius, radius: 50,
}).addTo(map) }).addTo(map)
radiusControl.addTo(map)
} }
const pos = targetLocationMarker.getLatLng() const pos = targetLocationMarker.getLatLng()

View File

@ -45,27 +45,13 @@ function getTargetPosition() {
return data return data
} }
function getRadius() {
const leafletMap = document.getElementById("map")
let targetRadiusString = leafletMap?.dataset.targetRadius
// TARGET_POSITION is required to calculate distance
if (!targetRadiusString) targetRadiusString = "50"
const data = Number(targetRadiusString)
return data
}
// Call Geolocation API to start watching user location // Call Geolocation API to start watching user location
function startWatchingLocation() { function startWatchingLocation() {
const TARGET_POSITION = getTargetPosition() const TARGET_POSITION = getTargetPosition()
const radius = getRadius()
if (!watchId) { if (!watchId) {
watchId = window.navigator.geolocation.watchPosition( watchId = window.navigator.geolocation.watchPosition(
(position) => locationSuccessCallback(position, TARGET_POSITION, radius), (position) => locationSuccessCallback(position, TARGET_POSITION),
errorCallback errorCallback
) )
} }
@ -79,10 +65,8 @@ navigator.permissions
switch (permissionStatus.state) { switch (permissionStatus.state) {
case "granted": case "granted":
const TARGET_POSITION = getTargetPosition() const TARGET_POSITION = getTargetPosition()
const radius = getRadius()
watchId = window.navigator.geolocation.watchPosition( watchId = window.navigator.geolocation.watchPosition(
(position) => (position) => locationSuccessCallback(position, TARGET_POSITION),
locationSuccessCallback(position, TARGET_POSITION, radius),
errorCallback errorCallback
) )
break break

View File

@ -11,19 +11,6 @@
cursor: pointer; cursor: pointer;
} }
.custom-map-control-div {
@apply text-xl;
background-color: #fff;
border: 0;
border-radius: 2px;
box-shadow: 0 1px 4px -1px rgba(0, 0, 0, 0.3);
margin: 10px;
padding: 0 0.5em;
overflow: hidden;
height: 40px;
cursor: pointer;
}
.custom-map-control-button:hover { .custom-map-control-button:hover {
background: rgb(235, 235, 235); background: rgb(235, 235, 235);
} }

3945
yarn.lock

File diff suppressed because it is too large Load Diff