pstream is dead; long live pstream taciturnaxolotl.github.io/pstream-ng/
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

check if extension has permissions

Jorrin 94884376 a4b925dc

+55 -6
+8 -2
src/backend/extension/messaging.ts
··· 34 34 } 35 35 36 36 export async function sendExtensionRequest<T>( 37 - ops: Omit<MessagesMetadata["makeRequest"]["req"], "requestDomain">, 37 + ops: MessagesMetadata["makeRequest"]["req"], 38 38 ): Promise<ExtensionMakeRequestResponse<T> | null> { 39 39 return sendMessage("makeRequest", ops); 40 40 } 41 41 42 42 export async function setDomainRule( 43 - ops: Omit<MessagesMetadata["prepareStream"]["req"], "requestDomain">, 43 + ops: MessagesMetadata["prepareStream"]["req"], 44 44 ): Promise<MessagesMetadata["prepareStream"]["res"] | null> { 45 45 return sendMessage("prepareStream", ops); 46 + } 47 + 48 + export async function sendPage( 49 + ops: MessagesMetadata["openPage"]["req"], 50 + ): Promise<MessagesMetadata["openPage"]["res"] | null> { 51 + return sendMessage("openPage", ops); 46 52 } 47 53 48 54 export async function extensionInfo(): Promise<
+8
src/backend/extension/plasmo.ts
··· 12 12 export type ExtensionHelloResponse = ExtensionBaseResponse<{ 13 13 version: string; 14 14 allowed: boolean; 15 + hasPermission: boolean; 15 16 }>; 16 17 17 18 export interface ExtensionMakeRequest extends ExtensionBaseRequest { ··· 48 49 }; 49 50 prepareStream: { 50 51 req: ExtensionPrepareStreamRequest; 52 + res: ExtensionBaseResponse; 53 + }; 54 + openPage: { 55 + req: ExtensionBaseRequest & { 56 + page: string; 57 + redirectUrl: string; 58 + }; 51 59 res: ExtensionBaseResponse; 52 60 }; 53 61 }
+39 -4
src/pages/parts/player/MetaPart.tsx
··· 3 3 import { useAsync } from "react-use"; 4 4 import type { AsyncReturnType } from "type-fest"; 5 5 6 - import { isExtensionActive } from "@/backend/extension/messaging"; 6 + import { isAllowedExtensionVersion } from "@/backend/extension/compatibility"; 7 + import { extensionInfo, sendPage } from "@/backend/extension/messaging"; 7 8 import { 8 9 fetchMetadata, 9 10 setCachedMetadata, ··· 43 44 const navigate = useNavigate(); 44 45 45 46 const { error, value, loading } = useAsync(async () => { 46 - // check extension 47 - const isActive = await isExtensionActive(); 47 + const info = await extensionInfo(); 48 + const isAllowed = info?.success && isAllowedExtensionVersion(info.version); 49 + 50 + if (isAllowed) { 51 + if (!info.hasPermission) throw new Error("extension-no-permission"); 52 + } 48 53 49 54 // use api metadata or providers metadata 50 55 const providerApiUrl = getLoadbalancedProviderApiUrl(); 51 - if (providerApiUrl && !isActive) { 56 + if (providerApiUrl && !isAllowed) { 52 57 try { 53 58 await fetchMetadata(providerApiUrl); 54 59 } catch (err) { ··· 104 109 105 110 props.onGetMeta?.(meta, epId); 106 111 }, []); 112 + 113 + if (error && error.message === "extension-no-permission") { 114 + return ( 115 + <ErrorLayout> 116 + <ErrorContainer> 117 + <IconPill icon={Icons.WAND}> 118 + {t("player.metadata.failed.badge")} 119 + </IconPill> 120 + <Title>Configure the extension</Title> 121 + <Paragraph> 122 + You have the browser extension, but we need your permission to get 123 + started using the extension. 124 + </Paragraph> 125 + <Button 126 + onClick={() => { 127 + sendPage({ 128 + page: "PermissionGrant", 129 + redirectUrl: window.location.href, 130 + }); 131 + }} 132 + theme="purple" 133 + padding="md:px-12 p-2.5" 134 + className="mt-6" 135 + > 136 + Use extension 137 + </Button> 138 + </ErrorContainer> 139 + </ErrorLayout> 140 + ); 141 + } 107 142 108 143 if (error && error.message === "dmca") { 109 144 return (