Skip to content

Commit

Permalink
Avoid race condition in Browse models filter
Browse files Browse the repository at this point in the history
  • Loading branch information
rafpaf committed May 13, 2024
1 parent a672a24 commit 2a1c4ff
Show file tree
Hide file tree
Showing 3 changed files with 8 additions and 58 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3,20 +3,13 @@ import { hasPremiumFeature } from "metabase-enterprise/settings";

import { ModelFilterControls } from "./ModelFilterControls";
import { VerifiedFilter } from "./VerifiedFilter";
import {
availableModelFilters,
sortCollectionsByVerification,
sortModelsByVerification,
useModelFilterSettings,
} from "./utils";
import { availableModelFilters, useModelFilterSettings } from "./utils";

if (hasPremiumFeature("content_verification")) {
Object.assign(PLUGIN_CONTENT_VERIFICATION, {
VerifiedFilter,
ModelFilterControls,
availableModelFilters,
sortModelsByVerification,
sortCollectionsByVerification,
useModelFilterSettings,
});
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,34 +6,6 @@ import type {
AvailableModelFilters,
} from "metabase/browse/utils";
import { useUserSetting } from "metabase/common/hooks";
import type { CollectionEssentials, SearchResult } from "metabase-types/api";

export const sortCollectionsByVerification = (
collection1: CollectionEssentials,
collection2: CollectionEssentials,
) => {
const isCollection1Official = collection1.authority_level === "official";
const isCollection2Official = collection2.authority_level === "official";
if (isCollection1Official && !isCollection2Official) {
return -1;
}
if (isCollection2Official && !isCollection1Official) {
return 1;
}
return 0;
};

export const sortModelsByVerification = (a: SearchResult, b: SearchResult) => {
const aVerified = a.moderated_status === "verified";
const bVerified = b.moderated_status === "verified";
if (aVerified && !bVerified) {
return -1;
}
if (!aVerified && bVerified) {
return 1;
}
return 0;
};

export const availableModelFilters: AvailableModelFilters = {
onlyShowVerifiedModels: {
Expand All @@ -48,8 +20,13 @@ export const useModelFilterSettings = (): [
] => {
const [initialVerifiedFilterStatus] = useUserSetting(
"browse-filter-only-verified-models",
{ shouldRefresh: false },
{
shouldRefresh: false,
// Memoizing prevents race conditions
shouldMemoize: true,
},
);

const initialModelFilters = useMemo(
() => ({
onlyShowVerifiedModels: initialVerifiedFilterStatus ?? false,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,28 +1,8 @@
import type { CollectionEssentials } from "metabase-types/api";
import { createMockModelResult } from "metabase-types/api/mocks";

import { availableModelFilters, sortCollectionsByVerification } from "./utils";
import { availableModelFilters } from "./utils";

describe("Utilities related to content verification", () => {
it("include a function that sorts verified collections before unverified collections", () => {
const unsorted: CollectionEssentials[] = [
{
id: 99,
authority_level: "official",
name: "Collection Zulu - verified",
},
{
id: 1,
authority_level: null,
name: "Collection Alpha - unverified",
},
];
const sortFunction = (a: CollectionEssentials, b: CollectionEssentials) =>
sortCollectionsByVerification(a, b) || a.name.localeCompare(b.name);
const sorted = unsorted.sort(sortFunction);
expect(sorted[0].name).toBe("Collection Zulu - verified");
expect(sorted[1].name).toBe("Collection Alpha - unverified");
});
it("include a constant that defines a filter for only showing verified models", () => {
const models = [
createMockModelResult({
Expand Down

0 comments on commit 2a1c4ff

Please sign in to comment.