Skip to content

Commit 8c16a7e

Browse files
authored
Sort activated feature gates (#473)
Setup feature gate sorting so that activated gates (mainnet, devnet) show up last, but their intra-ordering preserved <img width="1098" alt="Screenshot 2025-02-26 at 11 57 44 PM" src="https://github.com/user-attachments/assets/db3e5bc7-0896-4a28-a34d-1b41b46a9e32" />
1 parent f7cde38 commit 8c16a7e

File tree

1 file changed

+37
-15
lines changed

1 file changed

+37
-15
lines changed

app/utils/feature-gate/featureGate.tsx

Lines changed: 37 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -16,21 +16,43 @@ export function UpcomingFeatures() {
1616
return null;
1717
}
1818

19-
const filteredFeatures = (FEATURES as FeatureInfoType[]).filter((feature: FeatureInfoType) => {
20-
switch (cluster) {
21-
case Cluster.MainnetBeta:
22-
// Show features activated on devnet and testnet
23-
return feature.devnetActivationEpoch !== null && feature.testnetActivationEpoch !== null;
24-
case Cluster.Devnet:
25-
// Show features activated on testnet, mark if already activated on devnet
26-
return feature.testnetActivationEpoch !== null;
27-
case Cluster.Testnet:
28-
// Only show features not yet activated on testnet
29-
return feature.testnetActivationEpoch === null;
30-
default:
31-
return false;
32-
}
33-
});
19+
const filteredFeatures = (FEATURES as FeatureInfoType[])
20+
.filter((feature: FeatureInfoType) => {
21+
switch (cluster) {
22+
case Cluster.MainnetBeta:
23+
// Show features activated on devnet and testnet
24+
return feature.devnetActivationEpoch !== null && feature.testnetActivationEpoch !== null;
25+
case Cluster.Devnet:
26+
// Show features activated on testnet, mark if already activated on devnet
27+
return feature.testnetActivationEpoch !== null;
28+
case Cluster.Testnet:
29+
// Only show features not yet activated on testnet
30+
return feature.testnetActivationEpoch === null;
31+
default:
32+
return false;
33+
}
34+
})
35+
.sort((a, b) => {
36+
// Helper function to check if a feature is activated on current cluster
37+
const isActivated = (feature: FeatureInfoType) => {
38+
switch (cluster) {
39+
case Cluster.MainnetBeta:
40+
return feature.mainnetActivationEpoch !== null;
41+
case Cluster.Devnet:
42+
return feature.devnetActivationEpoch !== null;
43+
case Cluster.Testnet:
44+
return feature.testnetActivationEpoch !== null;
45+
default:
46+
return false;
47+
}
48+
};
49+
50+
// Sort activated features to end while preserving existing ordering
51+
const aActivated = isActivated(a);
52+
const bActivated = isActivated(b);
53+
if (aActivated === bActivated) return 0;
54+
return aActivated ? 1 : -1;
55+
});
3456

3557
if (filteredFeatures.length === 0) {
3658
return null;

0 commit comments

Comments
 (0)