-
Notifications
You must be signed in to change notification settings - Fork 306
/
site-adaptor.ts
105 lines (95 loc) · 4.07 KB
/
site-adaptor.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
import { unreachable } from '@masknet/kit'
import { useValueRef } from '@masknet/shared-base-ui'
import { type EnhanceableSite, ValueRef, ValueRefWithReady } from '@masknet/shared-base'
import { createManager } from './manage.js'
import { getPluginDefine } from './store.js'
import type { Plugin } from '../types.js'
const {
events,
activated,
startDaemon,
minimalMode: minimalModeSub,
} = createManager((def) => def.SiteAdaptor, createManager.NoManagedContext)
const ActivatedPluginsSiteAdaptorAny = new ValueRefWithReady<Plugin.SiteAdaptor.Definition[]>([])
const ActivatedPluginsSiteAdaptorTrue = new ValueRefWithReady<Plugin.SiteAdaptor.Definition[]>([])
const ActivatedPluginsSiteAdaptorFalse = new ValueRefWithReady<Plugin.SiteAdaptor.Definition[]>([])
{
const update = () => {
ActivatedPluginsSiteAdaptorTrue.value = query(true)
ActivatedPluginsSiteAdaptorFalse.value = query(false)
}
events.on('activateChanged', () => {
ActivatedPluginsSiteAdaptorAny.value = [...activated.plugins]
})
events.on('activateChanged', update)
events.on('minimalModeChanged', update)
function query(minimalModeEqualsTo: boolean): Plugin.SiteAdaptor.Definition[] {
const result = [...activated.plugins]
if (minimalModeEqualsTo === true) return result.filter((x) => minimalModeSub[x.ID]?.value)
else if (minimalModeEqualsTo === false) return result.filter((x) => !minimalModeSub[x.ID]?.value)
return result
}
}
export function useActivatedPluginsSiteAdaptor(minimalModeEqualsTo: 'any' | boolean) {
return useValueRef(
minimalModeEqualsTo === 'any' ? ActivatedPluginsSiteAdaptorAny
: minimalModeEqualsTo === true ? ActivatedPluginsSiteAdaptorTrue
: minimalModeEqualsTo === false ? ActivatedPluginsSiteAdaptorFalse
: unreachable(minimalModeEqualsTo),
)
}
useActivatedPluginsSiteAdaptor.visibility = {
useMinimalMode: () => useValueRef(ActivatedPluginsSiteAdaptorTrue),
useNotMinimalMode: () => useValueRef(ActivatedPluginsSiteAdaptorFalse),
useAnyMode: () => useValueRef(ActivatedPluginsSiteAdaptorAny),
}
// this should never be used for a normal plugin
const TRUE = new ValueRef(true)
export function useIsMinimalMode(pluginID: string) {
return useValueRef(minimalModeSub[pluginID] || TRUE)
}
export async function checkIsMinimalMode(pluginID: string) {
const sub = minimalModeSub[pluginID]
if (!sub) return true
await sub.readyPromise
return sub.value
}
/**
*
* @param pluginID Get the plugin ID
* @param visibility Should invisible plugin included?
* @returns
*/
export function useActivatedPluginSiteAdaptor(pluginID: string, minimalModeEqualsTo: 'any' | boolean) {
const plugins = useActivatedPluginsSiteAdaptor(minimalModeEqualsTo)
const minimalMode = useIsMinimalMode(pluginID)
const result = plugins.find((x) => x.ID === pluginID)
if (!result) return undefined
if (minimalModeEqualsTo === 'any') return result
else if (minimalModeEqualsTo === true) {
if (minimalMode) return result
return undefined
} else if (minimalModeEqualsTo === false) {
if (minimalMode) return undefined
return result
}
unreachable(minimalModeEqualsTo)
}
useActivatedPluginSiteAdaptor.visibility = {
useMinimalMode: (pluginID: string) => useActivatedPluginSiteAdaptor(pluginID, true),
useNotMinimalMode: (pluginID: string) => useActivatedPluginSiteAdaptor(pluginID, false),
useAnyMode: (pluginID: string) => useActivatedPluginSiteAdaptor(pluginID, 'any'),
}
export function startPluginSiteAdaptor(
currentNetwork: EnhanceableSite,
host: Plugin.__Host.Host<Plugin.SiteAdaptor.Definition, Plugin.SiteAdaptor.SiteAdaptorContext>,
) {
startDaemon(host, (id) => {
const def = getPluginDefine(id)
if (!def) return false
const status = def.enableRequirement.supports.sites[currentNetwork]
if (def.enableRequirement.supports.type === 'opt-in' && status !== true) return false
if (def.enableRequirement.supports.type === 'opt-out' && status === true) return false
return true
})
}