This commit is contained in:
retoor 2025-02-08 17:31:03 +01:00
parent 8d0d709e18
commit d7b943dc8c
6 changed files with 96 additions and 2 deletions

View File

@ -27,6 +27,7 @@ from snek.view.rpc import RPCView
from snek.view.status import StatusView from snek.view.status import StatusView
from snek.view.web import WebView from snek.view.web import WebView
from snek.view.upload import UploadView from snek.view.upload import UploadView
from snek.view.search_user import SearchUserView
SESSION_KEY = b"c79a0c5fda4b424189c427d28c9f7c34" SESSION_KEY = b"c79a0c5fda4b424189c427d28c9f7c34"
@ -83,6 +84,8 @@ class Application(BaseApplication):
self.router.add_view("/register.json", RegisterView) self.router.add_view("/register.json", RegisterView)
self.router.add_view("/drive.bin", UploadView) self.router.add_view("/drive.bin", UploadView)
self.router.add_view("/drive.bin/{uid}", UploadView) self.router.add_view("/drive.bin/{uid}", UploadView)
self.router.add_view("/search-user.html", SearchUserView)
self.router.add_view("/search-user.json", SearchUserView)
self.router.add_get("/http-get", self.handle_http_get) self.router.add_get("/http-get", self.handle_http_get)
self.router.add_get("/http-photo", self.handle_http_photo) self.router.add_get("/http-photo", self.handle_http_photo)
self.router.add_get("/rpc.ws", RPCView) self.router.add_get("/rpc.ws", RPCView)

30
src/snek/static/push.js Normal file
View File

@ -0,0 +1,30 @@
this.onpush = (event) => {
console.log(event.data);
// From here we can write the data to IndexedDB, send it to any open
// windows, display a notification, etc.
};
navigator.serviceWorker
.register("service-worker.js")
.then((serviceWorkerRegistration) => {
serviceWorkerRegistration.pushManager.subscribe().then(
(pushSubscription) => {
const subscriptionObject = {
endpoint: pushSubscription.endpoint,
keys: {
p256dh: pushSubscription.getKey('p256dh'),
auth: pushSubscription.getKey('auth'),
},
encoding: PushManager.supportedContentEncodings,
/* other app-specific data, such as user identity */
};
console.log(pushSubscription.endpoint, pushSubscription, subscriptionObject);
// The push subscription details needed by the application
// server are now available, and can be sent to it using,
// for example, the fetch() API.
},
(error) => {
console.error(error);
},
);
});

View File

@ -0,0 +1,30 @@
self.addEventListener("install", (event) => {
console.log("Service worker installed");
});
self.addEventListener("push", (event) => {
if (!(self.Notification && self.Notification.permission === "granted")) {
return;
}
console.log("Received a push message", event);
const data = event.data?.json() ?? {};
const title = data.title || "Something Has Happened";
const message =
data.message || "Here's something you might want to check out.";
const icon = "images/new-notification.png";
event.waitUntil(self.registration.showNotification(title, {
body: message,
tag: "simple-push-demo-notification",
icon,
}));
});
self.addEventListener("notificationclick", (event) => {
console.log("Notification click Received.", event);
event.notification.close();
event.waitUntil(clients.openWindow(
"https://snek.molodetz.nl",));
});

View File

@ -24,6 +24,7 @@
<div class="logo">Snek</div> <div class="logo">Snek</div>
<nav> <nav>
<a href="/web.html">🏠</a> <a href="/web.html">🏠</a>
<a href="/search-user.html">🔍</a>
<a style="display:none" id="install-button" href="#">📥</a> <a style="display:none" id="install-button" href="#">📥</a>
<a href="/web.html">👥</a> <a href="/web.html">👥</a>
<a href="#">⚙️</a> <a href="#">⚙️</a>
@ -52,7 +53,7 @@ let installPrompt = null
window.addEventListener("beforeinstallprompt", async(event) => { window.addEventListener("beforeinstallprompt", async(event) => {
event.preventDefault(); event.preventDefault();
installPrompt = event; installPrompt = event;
//document.addEventListener("DOMContentLoaded", () => { document.addEventListener("DOMContentLoaded", () => {
alert("Jaaah") alert("Jaaah")
const button = document.getElementById("install-button") const button = document.getElementById("install-button")
button.addEventListener("click", async ()=>{ button.addEventListener("click", async ()=>{
@ -61,7 +62,8 @@ let installPrompt = null
}) })
button.style.display = 'inline-block' button.style.display = 'inline-block'
}); })
});
; ;
</script> </script>
</body> </body>

View File

@ -0,0 +1,8 @@
{% extends "app.html" %}
{% block title %}Search{% endblock %}
{% block main %}
<h1>Search user</h1>
<generic-form class="center" url="/search_user.json"></generic-form>
{% endblock %}

View File

@ -0,0 +1,21 @@
from aiohttp import web
from snek.form.search_user import SearchUserForm
from snek.system.view import BaseFormView
class SearchUserView(BaseFormView):
form = SearchUserForm
async def get(self):
if self.session.get("logged_in"):
return web.HTTPFound("/web.html")
if self.request.path.endswith(".json"):
return await super().get()
return await self.render_template("login.html")
async def submit(self, form):
if await form.is_valid:
return {"redirect_url": "/search-user.html?query=" + form.query.value}
return {"is_valid": False}