perf: notification supports clicking to open the source website
This commit is contained in:
parent
aa3c0703dc
commit
653229c8fa
3 changed files with 37 additions and 10 deletions
|
@ -1,14 +1,16 @@
|
||||||
import { EVENT } from '@/constants/event'
|
import { EVENT } from '@/constants/event'
|
||||||
import { messenger } from '@/messenger'
|
import { messenger } from '@/messenger'
|
||||||
import { browser } from 'wxt/browser'
|
import { browser, Tabs } from 'wxt/browser'
|
||||||
import { defineBackground } from 'wxt/sandbox'
|
import { defineBackground } from 'wxt/sandbox'
|
||||||
|
|
||||||
export default defineBackground({
|
export default defineBackground({
|
||||||
type: 'module',
|
type: 'module',
|
||||||
main() {
|
main() {
|
||||||
|
const historyNotificationTabs = new Map<string, Tabs.Tab>()
|
||||||
messenger.onMessage(EVENT.OPTIONS_PAGE_OPEN, () => {
|
messenger.onMessage(EVENT.OPTIONS_PAGE_OPEN, () => {
|
||||||
browser.runtime.openOptionsPage()
|
browser.runtime.openOptionsPage()
|
||||||
})
|
})
|
||||||
|
|
||||||
messenger.onMessage(EVENT.NOTIFICATION_PUSH, async ({ data: message, sender }) => {
|
messenger.onMessage(EVENT.NOTIFICATION_PUSH, async ({ data: message, sender }) => {
|
||||||
// Check if there is an active tab on the same site
|
// Check if there is an active tab on the same site
|
||||||
const tabs = await browser.tabs.query({ active: true })
|
const tabs = await browser.tabs.query({ active: true })
|
||||||
|
@ -17,15 +19,46 @@ export default defineBackground({
|
||||||
})
|
})
|
||||||
|
|
||||||
if (hasActiveSomeSiteTab) return
|
if (hasActiveSomeSiteTab) return
|
||||||
|
|
||||||
browser.notifications.create(message.id, {
|
browser.notifications.create(message.id, {
|
||||||
type: 'basic',
|
type: 'basic',
|
||||||
iconUrl: message.userAvatar,
|
iconUrl: message.userAvatar,
|
||||||
title: message.username,
|
title: message.username,
|
||||||
message: message.body
|
message: message.body,
|
||||||
|
contextMessage: sender.tab!.url!
|
||||||
})
|
})
|
||||||
|
historyNotificationTabs.set(message.id, sender.tab!)
|
||||||
})
|
})
|
||||||
messenger.onMessage(EVENT.NOTIFICATION_CLEAR, async ({ data: id }) => {
|
messenger.onMessage(EVENT.NOTIFICATION_CLEAR, async ({ data: id }) => {
|
||||||
browser.notifications.clear(id)
|
browser.notifications.clear(id)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
browser.notifications.onButtonClicked.addListener(async (id) => {
|
||||||
|
const fromTab = historyNotificationTabs.get(id)
|
||||||
|
if (fromTab?.id) {
|
||||||
|
try {
|
||||||
|
const tab = await browser.tabs.get(fromTab.id)
|
||||||
|
browser.tabs.update(tab.id, { active: true })
|
||||||
|
} catch {
|
||||||
|
browser.tabs.create({ url: fromTab.url })
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
browser.notifications.onClicked.addListener(async (id) => {
|
||||||
|
const fromTab = historyNotificationTabs.get(id)
|
||||||
|
if (fromTab?.id) {
|
||||||
|
try {
|
||||||
|
const tab = await browser.tabs.get(fromTab.id)
|
||||||
|
browser.tabs.update(tab.id, { active: true })
|
||||||
|
} catch {
|
||||||
|
browser.tabs.create({ url: fromTab.url })
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
browser.notifications.onClosed.addListener(async (id) => {
|
||||||
|
historyNotificationTabs.delete(id)
|
||||||
|
})
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
|
@ -3,16 +3,12 @@ import { TextMessage } from '../Room'
|
||||||
|
|
||||||
export interface Notification {
|
export interface Notification {
|
||||||
push: (message: TextMessage) => Promise<string>
|
push: (message: TextMessage) => Promise<string>
|
||||||
clear: (id: string) => Promise<boolean>
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export const NotificationExtern = Remesh.extern<Notification>({
|
export const NotificationExtern = Remesh.extern<Notification>({
|
||||||
default: {
|
default: {
|
||||||
push: () => {
|
push: () => {
|
||||||
throw new Error('"push" not implemented.')
|
throw new Error('"push" not implemented.')
|
||||||
},
|
|
||||||
clear: () => {
|
|
||||||
throw new Error('"clear" not implemented.')
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
|
@ -4,14 +4,12 @@ import { EVENT } from '@/constants/event'
|
||||||
import { messenger } from '@/messenger'
|
import { messenger } from '@/messenger'
|
||||||
|
|
||||||
class Notification {
|
class Notification {
|
||||||
|
messages: TextMessage[] = []
|
||||||
async push(message: TextMessage) {
|
async push(message: TextMessage) {
|
||||||
await messenger.sendMessage(EVENT.NOTIFICATION_PUSH, message)
|
await messenger.sendMessage(EVENT.NOTIFICATION_PUSH, message)
|
||||||
|
this.messages.push(message)
|
||||||
return message.id
|
return message.id
|
||||||
}
|
}
|
||||||
async clear(id: string) {
|
|
||||||
await messenger.sendMessage(EVENT.NOTIFICATION_CLEAR, id)
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export const NotificationImpl = NotificationExtern.impl(new Notification())
|
export const NotificationImpl = NotificationExtern.impl(new Notification())
|
||||||
|
|
Loading…
Reference in a new issue