-
Notifications
You must be signed in to change notification settings - Fork 22
/
useExtensionPermissions.ts
66 lines (59 loc) · 2.28 KB
/
useExtensionPermissions.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
/*
* Copyright (C) 2023 PixieBrix, Inc.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
import {
dropOverlappingPermissions,
selectAdditionalPermissionsSync,
} from "webext-additional-permissions";
import { type AsyncState } from "@/types/sliceTypes";
import useAsyncExternalStore from "@/hooks/useAsyncExternalStore";
export type DetailedPermissions = Array<{
name: string;
isOrigin: boolean;
isAdditional: boolean;
isUnique: boolean;
}>;
async function getDetailedPermissions() {
const all = await browser.permissions.getAll();
const unique = dropOverlappingPermissions(all);
const additional = selectAdditionalPermissionsSync(all);
return [
...(all.permissions ?? []).sort().map((permission) => ({
name: permission,
isOrigin: false,
isUnique: unique.permissions?.includes(permission) ?? false,
isAdditional: additional.permissions.includes(permission),
})),
...(all.origins ?? []).sort().map((origin) => ({
name: origin,
isOrigin: true,
isUnique: unique.origins?.includes(origin) ?? false,
isAdditional: additional.origins.includes(origin),
})),
];
}
function subscribe(callback: () => void) {
browser.permissions.onAdded.addListener(callback);
browser.permissions.onRemoved.addListener(callback);
return () => {
browser.permissions.onAdded.removeListener(callback);
browser.permissions.onRemoved.removeListener(callback);
};
}
/** Returns a sorted array of all the permission with details. Subscribes to browser permissions updates. */
export default function useExtensionPermissions(): AsyncState<DetailedPermissions> {
return useAsyncExternalStore(subscribe, getDetailedPermissions);
}