11<script setup lang="ts">
2- import { escapeLike , Zero } from ' @rocicorp/zero'
3- import { decodeJwt } from ' jose'
4- import Cookies from ' js-cookie'
5- import { computed , ref } from ' vue'
6- import { useQuery } from ' zero-vue'
2+ import { escapeLike } from ' @rocicorp/zero'
3+ import { useCookies } from ' @vueuse/integrations/useCookies'
74
5+ import { SignJWT } from ' jose'
6+ import { computed , ref } from ' vue'
87import { useInterval } from ' ~/composables/use-interval'
98import { randomMessage } from ' ~/db/data/test-data'
10- import { schema } from ' ~/db/schema'
119import { formatDate } from ' ~/utils/date'
1210import { randInt } from ' ~/utils/rand'
11+ import { useQuery , useZero } from ' ./zero'
1312
14- const encodedJWT = Cookies .get (' jwt' )
15- const decodedJWT = encodedJWT && decodeJwt (encodedJWT )
16- const userID = decodedJWT ?.sub ? (decodedJWT .sub as string ) : ' anon'
17-
18- const z = new Zero ({
19- userID ,
20- auth : () => encodedJWT || undefined ,
21- server: import .meta .env .VITE_PUBLIC_SERVER ,
22- schema ,
23- // This is often easier to develop with if you're frequently changing
24- // the schema. Switch to 'idb' for local-persistence.
25- kvStore: ' mem' ,
26- })
13+ const cookies = useCookies ()
2714
28- const { data : users } = useQuery (z .query .user )
29- const { data : mediums } = useQuery (z .query .medium )
30- const { data : allMessages } = useQuery (z .query .message )
15+ const z = useZero ()
16+ const { data : users } = useQuery (() => z .value .query .user )
17+ const { data : mediums } = useQuery (() => z .value .query .medium )
18+ const { data : allMessages } = useQuery (() => z .value .query .message )
3119
3220const filterUser = ref (' ' )
3321const filterText = ref (' ' )
3422const action = ref <' add' | ' remove' | undefined >(undefined )
3523
3624const { data : filteredMessages } = useQuery (() => {
37- let filtered = z .query .message
25+ let filtered = z .value . query .message
3826 .related (' medium' , medium => medium .one ())
3927 .related (' sender' , sender => sender .one ())
4028 .orderBy (' timestamp' , ' desc' )
@@ -57,13 +45,13 @@ function deleteRandomMessage() {
5745 return false
5846 }
5947 const index = randInt (allMessages .value .length )
60- z .mutate .message .delete ({ id: allMessages .value [index ]! .id })
48+ z .value . mutate .message .delete ({ id: allMessages .value [index ]! .id })
6149
6250 return true
6351}
6452
6553function addRandomMessage() {
66- z .mutate .message .insert (randomMessage (users .value , mediums .value ))
54+ z .value . mutate .message .insert (randomMessage (users .value , mediums .value ))
6755 return true
6856}
6957
@@ -97,7 +85,7 @@ function handleAddAction() {
9785}
9886
9987function handleRemoveAction(e : MouseEvent | TouchEvent ) {
100- if (z .userID === ' anon' && ' shiftKey' in e && ! e .shiftKey ) {
88+ if (z .value . userID === ' anon' && ' shiftKey' in e && ! e .shiftKey ) {
10189 // eslint-disable-next-line no-alert
10290 alert (' You must be logged in to delete. Hold shift to try anyway.' )
10391 return
@@ -119,7 +107,7 @@ function stopAction() {
119107}
120108
121109function editMessage(e : MouseEvent , id : string , senderID : string , prev : string ) {
122- if (senderID !== z .userID && ! e .shiftKey ) {
110+ if (senderID !== z .value . userID && ! e .shiftKey ) {
123111 // eslint-disable-next-line no-alert
124112 alert (
125113 ' You aren\' t logged in as the sender of this message. Editing won\' t be permitted. Hold the shift key to try anyway.' ,
@@ -129,23 +117,25 @@ function editMessage(e: MouseEvent, id: string, senderID: string, prev: string)
129117
130118 // eslint-disable-next-line no-alert
131119 const body = prompt (' Edit message' , prev )
132- z .mutate .message .update ({
120+ z .value . mutate .message .update ({
133121 id ,
134122 body: body ?? prev ,
135123 })
136124}
137125
138126async function toggleLogin() {
139- if (z .userID === ' anon' ) {
140- await fetch (' /api/login' )
127+ if (z .value .userID === ' anon' ) {
128+ const jwt = await new SignJWT ({ sub: ' ENzoNm7g4E' })
129+ .setProtectedHeader ({ alg: ' HS256' })
130+ .sign (new TextEncoder ().encode (import .meta .env .VITE_PUBLIC_AUTH_SECRET ))
131+ cookies .set (' jwt' , jwt )
141132 }
142133 else {
143- Cookies .remove (' jwt' )
134+ cookies .remove (' jwt' )
144135 }
145- location .reload ()
146136}
147137
148- const user = computed (() => users .value .find (user => user .id === z .userID )?.name ?? ' anon' )
138+ const user = computed (() => users .value .find (user => user .id === z .value . userID )?.name ?? ' anon' )
149139 </script >
150140
151141<template >
0 commit comments