Skip to content

Commit 24c780c

Browse files
committed
Refactor: useExtensionData hook not to change value when colony updates
1 parent 787acc6 commit 24c780c

File tree

3 files changed

+27
-19
lines changed

3 files changed

+27
-19
lines changed

src/hooks/useExtensionData.ts

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@ import {
1111
type InstalledExtensionData,
1212
type AnyExtensionData,
1313
} from '~types/extensions.ts';
14-
import { type Colony } from '~types/graphql.ts';
14+
import { type ColonyRole } from '~types/graphql.ts';
15+
import { extractColonyRoles } from '~utils/colonyRoles.ts';
1516
import { getMappedExtensionData } from '~utils/extensions.ts';
1617

1718
export enum ExtensionMethods {
@@ -42,6 +43,11 @@ interface UseExtensionDataReturn {
4243
const useExtensionData = (extensionId: string): UseExtensionDataReturn => {
4344
const { colony, refetchColony } = useColonyContext();
4445

46+
const colonyRoles = useMemo(
47+
() => extractColonyRoles(colony.roles),
48+
[colony.roles],
49+
);
50+
4551
const extensionHash = getExtensionHash(extensionId as Extension);
4652

4753
const {
@@ -66,19 +72,20 @@ const useExtensionData = (extensionId: string): UseExtensionDataReturn => {
6672
});
6773
const { version } = versionData?.getCurrentVersionByKey?.items?.[0] || {};
6874

69-
const extensionConfig = supportedExtensionsConfig.find(
70-
(e) => e.extensionId === extensionId,
75+
const extensionConfig = useMemo(
76+
() => supportedExtensionsConfig.find((e) => e.extensionId === extensionId),
77+
[extensionId],
7178
);
7279

7380
const extensionData = useMemo<AnyExtensionData | null>(
7481
() =>
7582
getMappedExtensionData({
76-
colony,
83+
colonyRoles,
7784
colonyExtension: rawExtensionData,
7885
version,
7986
extensionConfig,
8087
}),
81-
[colony, rawExtensionData, version, extensionConfig],
88+
[colonyRoles, rawExtensionData, version, extensionConfig],
8289
);
8390

8491
const handleRefetch = useCallback(
@@ -88,16 +95,17 @@ const useExtensionData = (extensionId: string): UseExtensionDataReturn => {
8895
refetchResponse.data.getExtensionByColonyAndHash?.items[0];
8996

9097
if (updatedColonyExtension) {
91-
let updatedColony: Colony | null = null;
98+
let updatedColonyRoles: ColonyRole[] | null = null;
9299
if (shouldRefetchPermissions) {
93100
const colonyRefetchResponse = await refetchColony();
94-
updatedColony =
95-
colonyRefetchResponse?.data.getColonyByName?.items?.[0] ?? null;
101+
const updatedColony =
102+
colonyRefetchResponse?.data.getColonyByName?.items?.[0];
103+
updatedColonyRoles = extractColonyRoles(updatedColony?.roles);
96104
}
97105

98106
// Extension is guaranteed to be installed if returned by the query
99107
return getMappedExtensionData({
100-
colony: updatedColony ?? colony,
108+
colonyRoles: updatedColonyRoles ?? colonyRoles,
101109
colonyExtension: updatedColonyExtension,
102110
version,
103111
extensionConfig,
@@ -106,7 +114,7 @@ const useExtensionData = (extensionId: string): UseExtensionDataReturn => {
106114

107115
return null;
108116
},
109-
[colony, extensionConfig, refetch, refetchColony, version],
117+
[colonyRoles, extensionConfig, refetch, refetchColony, version],
110118
);
111119

112120
return {

src/hooks/useExtensionsData.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import {
1212
type InstalledExtensionData,
1313
} from '~types/extensions.ts';
1414
import { notNull } from '~utils/arrays/index.ts';
15+
import { extractColonyRoles } from '~utils/colonyRoles.ts';
1516
import {
1617
mapToInstallableExtensionData,
1718
mapToInstalledExtensionData,
@@ -68,7 +69,7 @@ const useExtensionsData = (): UseExtensionsDataReturn => {
6869
}
6970

7071
return mapToInstalledExtensionData({
71-
colony,
72+
colonyRoles: extractColonyRoles(colony.roles),
7273
extensionConfig,
7374
colonyExtension: extension,
7475
version,

src/utils/extensions.ts

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,7 @@ import {
99
type InstalledExtensionData,
1010
type InstallableExtensionData,
1111
} from '~types/extensions.ts';
12-
import { type Colony, type ColonyExtension } from '~types/graphql.ts';
13-
import { extractColonyRoles } from '~utils/colonyRoles.ts';
12+
import { type ColonyRole, type ColonyExtension } from '~types/graphql.ts';
1413

1514
import { userHasRole } from './checks/index.ts';
1615

@@ -35,12 +34,12 @@ export const mapToInstallableExtensionData = (
3534
};
3635

3736
export const mapToInstalledExtensionData = ({
38-
colony,
37+
colonyRoles,
3938
extensionConfig,
4039
colonyExtension,
4140
version,
4241
}: {
43-
colony: Colony;
42+
colonyRoles: ColonyRole[];
4443
extensionConfig: ExtensionConfig;
4544
colonyExtension: ColonyExtension;
4645
version: number;
@@ -51,7 +50,7 @@ export const mapToInstalledExtensionData = ({
5150
const isEnabled = isInitialized && !colonyExtension.isDeprecated;
5251

5352
const extensionRoles = getUserRolesForDomain({
54-
colonyRoles: extractColonyRoles(colony.roles),
53+
colonyRoles,
5554
userAddress: colonyExtension.address,
5655
domainId: Id.RootDomain,
5756
});
@@ -72,12 +71,12 @@ export const mapToInstalledExtensionData = ({
7271
};
7372

7473
export const getMappedExtensionData = ({
75-
colony,
74+
colonyRoles,
7675
colonyExtension,
7776
version,
7877
extensionConfig,
7978
}: {
80-
colony: Colony;
79+
colonyRoles: ColonyRole[];
8180
colonyExtension?: ColonyExtension | null;
8281
version?: number;
8382
extensionConfig?: ExtensionConfig;
@@ -88,7 +87,7 @@ export const getMappedExtensionData = ({
8887

8988
if (colonyExtension) {
9089
return mapToInstalledExtensionData({
91-
colony,
90+
colonyRoles,
9291
extensionConfig,
9392
colonyExtension,
9493
version,

0 commit comments

Comments
 (0)