Skip to content

Commit 52d689e

Browse files
committed
chore(dashboard): different options for apps with no configurable policies
1 parent 4c15061 commit 52d689e

File tree

5 files changed

+103
-26
lines changed

5 files changed

+103
-26
lines changed

packages/apps/app-dashboard/src/components/user-dashboard/connect/ConnectPageWraper.tsx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import { useUriPrecheck } from '@/hooks/user-dashboard/connect/useUriPrecheck';
2020
import { useFetchUserPermissions } from '@/hooks/user-dashboard/dashboard/useFetchUserPermissions';
2121
import { useAgentPkpForApp } from '@/hooks/user-dashboard/useAgentPkpForApp';
2222
import useReadAuthInfo from '@/hooks/user-dashboard/useAuthInfo';
23+
import { hasConfigurablePolicies } from '@/utils/user-dashboard/hasConfigurablePolicies';
2324

2425
type ViewMode = 'consent' | 'edit-permissions' | 'update-version';
2526

@@ -171,6 +172,8 @@ export function ConnectPageWrapper() {
171172
}
172173
// Check for existing user permissions
173174
else if (isPermitted === true && permittedVersion && versionData) {
175+
const hasPolicies = hasConfigurablePolicies(data, permittedVersion, appId);
176+
174177
// Toggle between consent, edit permissions, and update version views
175178
if (viewMode === 'edit-permissions') {
176179
content = (
@@ -204,6 +207,7 @@ export function ConnectPageWrapper() {
204207
activeVersionData={activeVersionData}
205208
readAuthInfo={{ authInfo, sessionSigs, isProcessing, error }}
206209
agentPKP={agentPKP!}
210+
hasConfigurablePolicies={hasPolicies}
207211
onEditPermissions={() => setViewMode('edit-permissions')}
208212
onUpdateVersion={() => setViewMode('update-version')}
209213
/>

packages/apps/app-dashboard/src/components/user-dashboard/connect/ReturningUserConnect.tsx

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ type ReturningUserConnectProps = {
2020
activeVersionData?: AppVersion;
2121
readAuthInfo: ReadAuthInfo;
2222
agentPKP: IRelayPKP;
23+
hasConfigurablePolicies: boolean;
2324
onEditPermissions: () => void;
2425
onUpdateVersion: () => void;
2526
};
@@ -31,6 +32,7 @@ export function ReturningUserConnect({
3132
activeVersionData,
3233
readAuthInfo,
3334
agentPKP,
35+
hasConfigurablePolicies,
3436
onEditPermissions,
3537
onUpdateVersion,
3638
}: ReturningUserConnectProps) {
@@ -195,18 +197,29 @@ export function ReturningUserConnect({
195197
icon={<RefreshCw className="w-4 h-4" style={{ color: theme.brandOrange }} />}
196198
iconBg="bg-orange-500/20"
197199
title="Update to Latest Version"
198-
description="Recommended - Get access to the latest features and improvements"
200+
description="Recommended for the latest features and improvements"
199201
onClick={handleUpdateVersion}
200202
/>
201203
)}
202-
{/* Edit Parameters Option - Show when version is enabled */}
203-
<ActionCard
204-
icon={<Settings className="w-4 h-4" style={{ color: theme.brandOrange }} />}
205-
iconBg="bg-orange-500/20"
206-
title="Edit Permissions"
207-
description="Review or modify app permissions and settings"
208-
onClick={handleEditParameters}
209-
/>
204+
{/* Edit Parameters Option - Show when there are configurable policies */}
205+
{hasConfigurablePolicies ? (
206+
<ActionCard
207+
icon={<Settings className="w-4 h-4" style={{ color: theme.brandOrange }} />}
208+
iconBg="bg-orange-500/20"
209+
title="Edit Permissions"
210+
description="Review or modify app permissions and settings"
211+
onClick={handleEditParameters}
212+
/>
213+
) : (
214+
/* Manage App Option - Show when no configurable policies */
215+
<ActionCard
216+
icon={<Settings className="w-4 h-4" style={{ color: theme.brandOrange }} />}
217+
iconBg="bg-orange-500/20"
218+
title="Manage App"
219+
description="View app details or unpermit this app"
220+
onClick={() => navigate(`/user/appId/${appData.appId}`)}
221+
/>
222+
)}
210223
</>
211224
)}
212225

packages/apps/app-dashboard/src/components/user-dashboard/dashboard/UserPermissionPage.tsx

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,24 @@
11
import { useState, useCallback, useRef, useEffect } from 'react';
22
import * as Sentry from '@sentry/react';
3-
import { getClient, PermissionData } from '@lit-protocol/vincent-contracts-sdk';
3+
import { PKPEthersWallet } from '@lit-protocol/pkp-ethers';
44
import { IRelayPKP } from '@lit-protocol/types';
5-
import { ConnectInfoMap } from '@/hooks/user-dashboard/connect/useConnectInfo';
6-
import { useFormatUserPermissions } from '@/hooks/user-dashboard/dashboard/useFormatUserPermissions';
5+
import { getClient, PermissionData } from '@lit-protocol/vincent-contracts-sdk';
6+
77
import { theme, fonts } from '@/components/user-dashboard/connect/ui/theme';
88
import { PolicyFormRef } from '../connect/ui/PolicyForm';
9-
import { ReadAuthInfo } from '@/hooks/user-dashboard/useAuthInfo';
10-
import { useAddPermittedActions } from '@/hooks/user-dashboard/connect/useAddPermittedActions';
11-
import { PermittedAppInfo } from './ui/PermittedAppInfo';
12-
import { UserPermissionButtons } from './ui/UserPermissionButtons';
139
import { StatusCard } from '../connect/ui/StatusCard';
14-
import { PKPEthersWallet } from '@lit-protocol/pkp-ethers';
15-
import { litNodeClient } from '@/utils/user-dashboard/lit';
1610
import { AppPermissionDashboardHeader } from './ui/AppPermissionDashboardHeader';
11+
import { PermittedAppInfo } from './ui/PermittedAppInfo';
12+
import { UserPermissionButtons } from './ui/UserPermissionButtons';
13+
import { useAddPermittedActions } from '@/hooks/user-dashboard/connect/useAddPermittedActions';
14+
import { ConnectInfoMap } from '@/hooks/user-dashboard/connect/useConnectInfo';
1715
import { useJwtRedirect } from '@/hooks/user-dashboard/connect/useJwtRedirect';
1816
import { useUrlRedirectUri } from '@/hooks/user-dashboard/connect/useUrlRedirectUri';
17+
import { useFormatUserPermissions } from '@/hooks/user-dashboard/dashboard/useFormatUserPermissions';
18+
import { ReadAuthInfo } from '@/hooks/user-dashboard/useAuthInfo';
1919
import { AppVersion } from '@/types/developer-dashboard/appTypes';
20+
import { hasConfigurablePolicies } from '@/utils/user-dashboard/hasConfigurablePolicies';
21+
import { litNodeClient } from '@/utils/user-dashboard/lit';
2022

2123
interface AppPermissionPageProps {
2224
connectInfoMap: ConnectInfoMap;
@@ -37,6 +39,11 @@ export function AppPermissionPage({
3739
appVersionsMap,
3840
onBackToConsent,
3941
}: AppPermissionPageProps) {
42+
const appIdString = connectInfoMap.app.appId.toString();
43+
const permittedVersion = permittedAppVersions[appIdString];
44+
45+
// Check if there are any configurable policies
46+
const hasPolicies = hasConfigurablePolicies(connectInfoMap, permittedVersion, appIdString);
4047
const [localError, setLocalError] = useState<string | null>(null);
4148
const [localStatus, setLocalStatus] = useState<string | null>(null);
4249
const [localSuccess, setLocalSuccess] = useState<string | null>(null);
@@ -65,9 +72,6 @@ export function AppPermissionPage({
6572
}
6673
}, [redirectUrl, localSuccess, executeRedirect]);
6774

68-
const appIdString = connectInfoMap.app.appId.toString();
69-
const permittedVersion = permittedAppVersions[appIdString];
70-
7175
const { formData, handleFormChange, selectedPolicies, handlePolicySelectionChange } =
7276
useFormatUserPermissions(connectInfoMap, existingData, Number(permittedVersion));
7377

@@ -353,6 +357,7 @@ export function AppPermissionPage({
353357
isGranting={isGranting}
354358
isUnpermitting={isUnpermitting}
355359
error={error || localError}
360+
hasConfigurablePolicies={hasPolicies}
356361
/>
357362
</div>
358363

packages/apps/app-dashboard/src/components/user-dashboard/dashboard/ui/UserPermissionButtons.tsx

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ interface UserPermissionButtonsProps {
1111
isGranting?: boolean; // For Grant Permissions spinner/text
1212
isUnpermitting?: boolean; // For Unpermit button spinner/text
1313
error?: string | null;
14+
hasConfigurablePolicies?: boolean;
1415
}
1516

1617
export function UserPermissionButtons({
@@ -21,6 +22,7 @@ export function UserPermissionButtons({
2122
isGranting = false,
2223
isUnpermitting = false,
2324
error,
25+
hasConfigurablePolicies = true,
2426
}: UserPermissionButtonsProps) {
2527
return (
2628
<div className="space-y-2">
@@ -59,20 +61,26 @@ export function UserPermissionButtons({
5961
</Button>
6062
</motion.div>
6163
<motion.div
62-
whileHover={{ scale: 1.02 }}
63-
whileTap={{ scale: 0.98 }}
64+
whileHover={hasConfigurablePolicies ? { scale: 1.02 } : {}}
65+
whileTap={hasConfigurablePolicies ? { scale: 0.98 } : {}}
6466
className="w-full sm:w-auto"
6567
>
6668
<Button
6769
onClick={onSubmit}
68-
className={`w-full sm:w-auto px-6 py-2 ${error ? 'bg-red-500/20 border-red-500/30 text-red-400' : `${theme.accentBg} ${theme.accentHover}`} border-0 flex items-center justify-center gap-2`}
69-
disabled={isLoading}
70+
className={`w-full sm:w-auto px-6 py-2 ${error ? 'bg-red-500/20 border-red-500/30 text-red-400' : hasConfigurablePolicies ? `${theme.accentBg} ${theme.accentHover}` : 'bg-gray-500/20 border-gray-500/30 text-gray-400 cursor-not-allowed'} border-0 flex items-center justify-center gap-2`}
71+
disabled={isLoading || !hasConfigurablePolicies}
7072
style={fonts.heading}
7173
>
7274
{isGranting && <Loader2 className="w-4 h-4 animate-spin -mt-px" />}
7375
{error && <AlertCircle className="w-4 h-4 -mt-px" />}
7476
<span className="leading-none">
75-
{error ? 'Retry' : isGranting ? 'Processing...' : 'Update Permissions'}
77+
{error
78+
? 'Retry'
79+
: isGranting
80+
? 'Processing...'
81+
: hasConfigurablePolicies
82+
? 'Update Permissions'
83+
: 'No Configurable Policies'}
7684
</span>
7785
</Button>
7886
</motion.div>
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
import { ConnectInfoMap } from '@/hooks/user-dashboard/connect/useConnectInfo';
2+
3+
/**
4+
* Check if there are any configurable policies for a given version
5+
* @param connectInfoMap - The connect info map containing abilities and policies
6+
* @param permittedVersion - The version to check for configurable policies
7+
* @param appId - Optional app ID to check (if not provided, checks all apps)
8+
* @returns true if there are any visible/configurable policies, false otherwise
9+
*/
10+
export function hasConfigurablePolicies(
11+
connectInfoMap: ConnectInfoMap,
12+
permittedVersion: number | string,
13+
appId?: string,
14+
): boolean {
15+
const appNames = appId ? [appId] : Object.keys(connectInfoMap.versionsByApp);
16+
17+
for (const appName of appNames) {
18+
const versions = connectInfoMap.versionsByApp[appName];
19+
if (!versions) continue;
20+
21+
const version = versions.find((v) => v.version.toString() === permittedVersion.toString());
22+
23+
if (version) {
24+
const versionKey = `${appName}-${version.version}`;
25+
const appVersionAbilities = connectInfoMap.appVersionAbilitiesByAppVersion[versionKey] || [];
26+
27+
for (const ability of appVersionAbilities) {
28+
const abilityKey = `${ability.abilityPackageName}-${ability.abilityVersion}`;
29+
const policies = connectInfoMap.supportedPoliciesByAbilityVersion[abilityKey] || [];
30+
31+
// Filter visible policies (same logic as PermittedAppInfo)
32+
const visiblePolicies = policies.filter((policy) => {
33+
if (!ability.hiddenSupportedPolicies || ability.hiddenSupportedPolicies.length === 0) {
34+
return true;
35+
}
36+
return !ability.hiddenSupportedPolicies.includes(policy.packageName);
37+
});
38+
39+
if (visiblePolicies.length > 0) {
40+
return true; // Found at least one configurable policy
41+
}
42+
}
43+
}
44+
}
45+
46+
return false; // No configurable policies found
47+
}

0 commit comments

Comments
 (0)