Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions packages/client/src/clients/guide/client.ts
Original file line number Diff line number Diff line change
Expand Up @@ -868,14 +868,14 @@ export class KnockGuideClient {
if (!this.stage || this.stage.status === "closed") return;

// Deep merge to accumulate the results.
const queriedByKey = this.stage.results.key || {};
const queriedByKey = this.stage.results.byKey || {};
if (filters.key) {
queriedByKey[filters.key] = {
...(queriedByKey[filters.key] || {}),
...{ [limit]: result },
};
}
const queriedByType = this.stage.results.type || {};
const queriedByType = this.stage.results.byType || {};
if (filters.type) {
queriedByType[filters.type] = {
...(queriedByType[filters.type] || {}),
Expand All @@ -885,7 +885,7 @@ export class KnockGuideClient {

this.stage = {
...this.stage,
results: { key: queriedByKey, type: queriedByType },
results: { byKey: queriedByKey, byType: queriedByType },
};
}

Expand Down
4 changes: 2 additions & 2 deletions packages/client/src/clients/guide/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -296,8 +296,8 @@ type SelectionResultByLimit = {
};

type RecordedSelectionResults = {
key?: Record<KnockGuide["key"], SelectionResultByLimit>;
type?: Record<KnockGuide["type"], SelectionResultByLimit>;
byKey?: Record<KnockGuide["key"], SelectionResultByLimit>;
byType?: Record<KnockGuide["type"], SelectionResultByLimit>;
};

export type GroupStage = {
Expand Down
34 changes: 17 additions & 17 deletions packages/client/test/clients/guide/guide.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4152,11 +4152,11 @@ describe("KnockGuideClient", () => {
const stage = client.getStage();
expect(stage).toBeDefined();
expect(stage!.status).toBe("open");
expect(stage!.results.key).toBeDefined();
expect(stage!.results.key!["onboarding"]).toBeDefined();
expect(stage!.results.key!["onboarding"]!.one).toBeDefined();
expect(stage!.results.key!["onboarding"]!.one!.metadata).toBeDefined();
expect(stage!.results.key!["onboarding"]!.one!.metadata!.limit).toBe(
expect(stage!.results.byKey).toBeDefined();
expect(stage!.results.byKey!["onboarding"]).toBeDefined();
expect(stage!.results.byKey!["onboarding"]!.one).toBeDefined();
expect(stage!.results.byKey!["onboarding"]!.one!.metadata).toBeDefined();
expect(stage!.results.byKey!["onboarding"]!.one!.metadata!.limit).toBe(
"one",
);
});
Expand All @@ -4181,9 +4181,9 @@ describe("KnockGuideClient", () => {

const stage = client.getStage();
expect(stage).toBeDefined();
expect(stage!.results.type).toBeDefined();
expect(stage!.results.type!["card"]).toBeDefined();
expect(stage!.results.type!["card"]!.one).toBeDefined();
expect(stage!.results.byType).toBeDefined();
expect(stage!.results.byType!["card"]).toBeDefined();
expect(stage!.results.byType!["card"]!.one).toBeDefined();
});

test("does not record when not debugging", () => {
Expand Down Expand Up @@ -4248,8 +4248,8 @@ describe("KnockGuideClient", () => {
client.selectGuide(stateWithGuides, { type: "banner" });

const stage = client.getStage();
expect(stage!.results.key!["onboarding"].one).toBeDefined();
expect(stage!.results.type!["banner"].one).toBeDefined();
expect(stage!.results.byKey!["onboarding"].one).toBeDefined();
expect(stage!.results.byType!["banner"].one).toBeDefined();
});

test("selectGuides records result with 'all' limit", () => {
Expand All @@ -4272,14 +4272,14 @@ describe("KnockGuideClient", () => {
client.selectGuides(stateWithGuides, { type: "card" });

const stage = client.getStage();
expect(stage!.results.type).toBeDefined();
expect(stage!.results.type!["card"]).toBeDefined();
expect(stage!.results.type!["card"]!.all).toBeDefined();
expect(stage!.results.type!["card"]!.all!.metadata!.limit).toBe("all");
expect(stage!.results.byType).toBeDefined();
expect(stage!.results.byType!["card"]).toBeDefined();
expect(stage!.results.byType!["card"]!.all).toBeDefined();
expect(stage!.results.byType!["card"]!.all!.metadata!.limit).toBe("all");

// selectGuides calls selectGuide internally with recordSelectQuery: false,
// so the "one" limit should NOT be recorded for the same type filter.
expect(stage!.results.type!["card"]!.one).toBeUndefined();
expect(stage!.results.byType!["card"]!.one).toBeUndefined();
});

test("does not record when stage is closed", () => {
Expand Down Expand Up @@ -4344,8 +4344,8 @@ describe("KnockGuideClient", () => {
client.selectGuide(stateWithGuides, { key: "onboarding" });

const stage = client.getStage();
expect(stage!.results.key).toBeDefined();
expect(stage!.results.key!["onboarding"]).toBeDefined();
expect(stage!.results.byKey).toBeDefined();
expect(stage!.results.byKey!["onboarding"]).toBeDefined();
});
});

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,8 +59,8 @@ type SelectionResultByLimit = {
all?: KnockGuideSelectionResult;
};
type SelectionResultByQuery = {
key?: SelectionResultByLimit;
type?: SelectionResultByLimit;
byKey?: SelectionResultByLimit;
byType?: SelectionResultByLimit;
};
type SelectableStatusPresent = {
status: "returned" | "throttled" | "queried";
Expand Down Expand Up @@ -157,8 +157,8 @@ const inferSelectByKeyReturnStatus = (
query: SelectionResultByQuery,
): SelectableStatusPresent["status"] => {
const includeThrottled =
!!query.key?.one?.metadata?.opts?.includeThrottled ||
!!query.key?.all?.metadata?.opts?.includeThrottled;
!!query.byKey?.one?.metadata?.opts?.includeThrottled ||
!!query.byKey?.all?.metadata?.opts?.includeThrottled;

// If unthrottled, then it should always be returned.
if (guide.bypass_global_group_limit) {
Expand All @@ -185,9 +185,10 @@ const inferSelectOneByTypeReturnStatus = (
stage: KnockGuideClientGroupStage,
query: SelectionResultByQuery,
): SelectableStatusPresent["status"] => {
const includeThrottled = !!query.type?.one?.metadata?.opts?.includeThrottled;
const includeThrottled =
!!query.byType?.one?.metadata?.opts?.includeThrottled;

const result = query.type!.one!;
const result = query.byType!.one!;
if (result.size === 0) {
return "queried";
}
Expand Down Expand Up @@ -229,7 +230,7 @@ const inferSelectAllByTypeReturnStatus = (
stage: KnockGuideClientGroupStage,
query: SelectionResultByQuery,
): SelectableStatusPresent["status"] => {
const result = query.type!.all!;
const result = query.byType!.all!;
if (result.size === 0) {
return "queried";
}
Expand All @@ -241,7 +242,8 @@ const inferSelectAllByTypeReturnStatus = (
const guidesByKey: Record<KnockGuide["key"], KnockGuide> = byKey(guides);

// If includeThrottled given, then expect all selected guides to be returned.
const includeThrottled = !!query.type?.all?.metadata?.opts?.includeThrottled;
const includeThrottled =
!!query.byType?.all?.metadata?.opts?.includeThrottled;
if (includeThrottled) {
return guidesByKey[guide.key] ? "returned" : "queried";
}
Expand Down Expand Up @@ -270,14 +272,14 @@ const inferSelectReturnStatus = (
) => {
// Querying by key can only return up to a max of one guide, regardless of
// useGuide or useGuides, and should take precedence in status designation.
if (query.key) {
if (query.byKey) {
return inferSelectByKeyReturnStatus(guide, snapshot, stage, query);
}

if (query.type?.all) {
if (query.byType?.all) {
return inferSelectAllByTypeReturnStatus(guide, snapshot, stage, query);
}
if (query.type?.one) {
if (query.byType?.one) {
return inferSelectOneByTypeReturnStatus(guide, snapshot, stage, query);
}

Expand All @@ -295,11 +297,11 @@ const toSelectableStatus = (
}

const query = {
key: (stage.results.key || {})[guide.key],
type: (stage.results.type || {})[guide.type],
byKey: (stage.results.byKey || {})[guide.key],
byType: (stage.results.byType || {})[guide.type],
};

const queried = Boolean(query.key || query.type);
const queried = Boolean(query.byKey || query.byType);
if (!queried) {
// No present query in the current location can select this guide.
return { status: undefined };
Expand Down
Loading
Loading