⬆️ Fix notification listen

This commit is contained in:
LittleSheep 2024-06-26 15:18:33 +08:00
parent 8044a1e5f2
commit 880ed9a999
2 changed files with 37 additions and 41 deletions

View File

@ -4,14 +4,8 @@
<option name="autoReloadType" value="ALL" /> <option name="autoReloadType" value="ALL" />
</component> </component>
<component name="ChangeListManager"> <component name="ChangeListManager">
<list default="true" id="3fefb2c4-b6f9-466b-a523-53352e8d6f95" name="更改" comment=":sparkles: Recommend app component"> <list default="true" id="3fefb2c4-b6f9-466b-a523-53352e8d6f95" name="更改" comment=":bug: Bug fixes">
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" /> <change beforePath="$PROJECT_DIR$/web/src/stores/notifications.ts" beforeDir="false" afterPath="$PROJECT_DIR$/web/src/stores/notifications.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/pkg/internal/services/ticket.go" beforeDir="false" afterPath="$PROJECT_DIR$/pkg/internal/services/ticket.go" afterDir="false" />
<change beforePath="$PROJECT_DIR$/settings.toml" beforeDir="false" afterPath="$PROJECT_DIR$/settings.toml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/web/src/components/UserMenu.vue" beforeDir="false" afterPath="$PROJECT_DIR$/web/src/components/UserMenu.vue" afterDir="false" />
<change beforePath="$PROJECT_DIR$/web/src/components/auth/FactorPicker.vue" beforeDir="false" afterPath="$PROJECT_DIR$/web/src/components/auth/FactorPicker.vue" afterDir="false" />
<change beforePath="$PROJECT_DIR$/web/src/router/index.ts" beforeDir="false" afterPath="$PROJECT_DIR$/web/src/router/index.ts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/web/src/stores/userinfo.ts" beforeDir="false" afterPath="$PROJECT_DIR$/web/src/stores/userinfo.ts" afterDir="false" />
</list> </list>
<option name="SHOW_DIALOG" value="false" /> <option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" /> <option name="HIGHLIGHT_CONFLICTS" value="true" />
@ -151,7 +145,6 @@
<component name="VcsManagerConfiguration"> <component name="VcsManagerConfiguration">
<MESSAGE value=":sparkles: Firebase is back" /> <MESSAGE value=":sparkles: Firebase is back" />
<MESSAGE value=":sparkles: Apple push notification services" /> <MESSAGE value=":sparkles: Apple push notification services" />
<MESSAGE value=":bug: Bug fixes" />
<MESSAGE value=":bug: Bug fix and fix" /> <MESSAGE value=":bug: Bug fix and fix" />
<MESSAGE value=":bug: Fix APNs non-production" /> <MESSAGE value=":bug: Fix APNs non-production" />
<MESSAGE value=":bug: Bug fixes on notification badges for APNs" /> <MESSAGE value=":bug: Bug fixes on notification badges for APNs" />
@ -174,7 +167,8 @@
<MESSAGE value=":wastebasket: Remove the personal page" /> <MESSAGE value=":wastebasket: Remove the personal page" />
<MESSAGE value=":recycle: OAuth authenticate" /> <MESSAGE value=":recycle: OAuth authenticate" />
<MESSAGE value=":sparkles: Recommend app component" /> <MESSAGE value=":sparkles: Recommend app component" />
<option name="LAST_COMMIT_MESSAGE" value=":sparkles: Recommend app component" /> <MESSAGE value=":bug: Bug fixes" />
<option name="LAST_COMMIT_MESSAGE" value=":bug: Bug fixes" />
</component> </component>
<component name="VgoProject"> <component name="VgoProject">
<settings-migrated>true</settings-migrated> <settings-migrated>true</settings-migrated>

View File

@ -1,64 +1,66 @@
import { defineStore } from "pinia"; import { defineStore } from "pinia"
import { ref } from "vue"; import { ref } from "vue"
import { checkLoggedIn, getAtk } from "@/stores/userinfo"; import { checkLoggedIn, getAtk } from "@/stores/userinfo"
import { request } from "@/scripts/request"; import { request } from "@/scripts/request"
export const useNotifications = defineStore("notifications", () => { export const useNotifications = defineStore("notifications", () => {
let socket: WebSocket; let socket: WebSocket
const loading = ref(false); const loading = ref(false)
const notifications = ref<any[]>([]); const notifications = ref<any[]>([])
const total = ref(0) const total = ref(0)
async function list() { async function list() {
loading.value = true; loading.value = true
const res = await request( const res = await request(
"/api/notifications?" + "/api/notifications?" +
new URLSearchParams({ new URLSearchParams({
take: (25).toString(), take: (25).toString(),
offset: (0).toString() offset: (0).toString(),
}), }),
{ {
headers: { Authorization: `Bearer ${getAtk()}` } headers: { Authorization: `Bearer ${getAtk()}` },
} },
); )
if (res.status === 200) { if (res.status === 200) {
const data = await res.json(); const data = await res.json()
notifications.value = data["data"]; notifications.value = data["data"]
total.value = data["count"]; total.value = data["count"]
} }
loading.value = false; loading.value = false
} }
function remove(idx: number) { function remove(idx: number) {
notifications.value.splice(idx, 1) notifications.value.splice(idx, 1)
total.value--; total.value--
} }
async function connect() { async function connect() {
if (!(checkLoggedIn())) return; if (!(checkLoggedIn())) return
const uri = `ws://${window.location.host}/api/ws`; const uri = `ws://${window.location.host}/api/ws`
socket = new WebSocket(uri + `?tk=${getAtk() as string}`); socket = new WebSocket(uri + `?tk=${getAtk() as string}`)
socket.addEventListener("open", (event) => { socket.addEventListener("open", (event) => {
console.log("[NOTIFICATIONS] The listen websocket has been established... ", event.type); console.log("[NOTIFICATIONS] The listen websocket has been established... ", event.type)
}); })
socket.addEventListener("close", (event) => { socket.addEventListener("close", (event) => {
console.warn("[NOTIFICATIONS] The listen websocket is disconnected... ", event.reason, event.code); console.warn("[NOTIFICATIONS] The listen websocket is disconnected... ", event.reason, event.code)
}); })
socket.addEventListener("message", (event) => { socket.addEventListener("message", (event) => {
const data = JSON.parse(event.data); const data = JSON.parse(event.data)
notifications.value.push(data); if (data["w"] == "notifications.new") {
total.value++; notifications.value.push(data["p"])
}); total.value++
}
})
} }
function disconnect() { function disconnect() {
socket.close(); socket.close()
} }
return { loading, notifications, total, list, remove, connect, disconnect }; return { loading, notifications, total, list, remove, connect, disconnect }
}); })