Skip to content

Commit a898f09

Browse files
HaroenvEunjae Lee
and
Eunjae Lee
authoredMar 30, 2021
feat(clearRefinements): implement canRefine (#4684)
* feat(clearRefinements): implement canRefine DX-1310 * Update src/connectors/clear-refinements/connectClearRefinements.ts Co-authored-by: Eunjae Lee <eunjae.lee@algolia.com> Co-authored-by: Eunjae Lee <eunjae.lee@algolia.com>
1 parent 0d2e450 commit a898f09

File tree

2 files changed

+30
-3
lines changed

2 files changed

+30
-3
lines changed
 

‎src/connectors/clear-refinements/__tests__/connectClearRefinements-test.ts

+18
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ See documentation: https://www.algolia.com/doc/api-reference/widgets/clear-refin
8484
expect(isFirstRenderAtInit).toBe(true);
8585
expect(firstRenderingOptions.createURL).toBeInstanceOf(Function);
8686
expect(firstRenderingOptions.refine).toBeInstanceOf(Function);
87+
expect(firstRenderingOptions.canRefine).toBe(false);
8788
expect(firstRenderingOptions.hasRefinements).toBe(false);
8889
expect(firstRenderingOptions.widgetParams).toEqual({
8990
foo: 'bar', // dummy param to test `widgetParams`
@@ -111,6 +112,7 @@ See documentation: https://www.algolia.com/doc/api-reference/widgets/clear-refin
111112
expect(secondRenderingOptions.createURL).toBeInstanceOf(Function);
112113
expect(secondRenderingOptions.refine).toBeInstanceOf(Function);
113114
expect(secondRenderingOptions.hasRefinements).toBe(false);
115+
expect(secondRenderingOptions.canRefine).toBe(false);
114116
});
115117

116118
it('does not throw without the unmount function', () => {
@@ -151,6 +153,7 @@ See documentation: https://www.algolia.com/doc/api-reference/widgets/clear-refin
151153

152154
expect(renderState1.clearRefinements).toEqual({
153155
hasRefinements: false,
156+
canRefine: false,
154157
createURL: expect.any(Function),
155158
refine: expect.any(Function),
156159
widgetParams: {},
@@ -197,6 +200,7 @@ See documentation: https://www.algolia.com/doc/api-reference/widgets/clear-refin
197200

198201
expect(renderState2.clearRefinements).toEqual({
199202
hasRefinements: true,
203+
canRefine: true,
200204
createURL: expect.any(Function),
201205
refine: expect.any(Function),
202206
widgetParams: {},
@@ -230,6 +234,7 @@ See documentation: https://www.algolia.com/doc/api-reference/widgets/clear-refin
230234

231235
expect(renderState1).toEqual({
232236
hasRefinements: false,
237+
canRefine: false,
233238
createURL: expect.any(Function),
234239
refine: expect.any(Function),
235240
widgetParams: {},
@@ -275,6 +280,7 @@ See documentation: https://www.algolia.com/doc/api-reference/widgets/clear-refin
275280

276281
expect(renderState2).toEqual({
277282
hasRefinements: true,
283+
canRefine: true,
278284
createURL: expect.any(Function),
279285
refine: expect.any(Function),
280286
widgetParams: {},
@@ -434,6 +440,7 @@ See documentation: https://www.algolia.com/doc/api-reference/widgets/clear-refin
434440
);
435441

436442
expect(rendering.mock.calls[0][0].hasRefinements).toBe(false);
443+
expect(rendering.mock.calls[0][0].canRefine).toBe(false);
437444

438445
widget.render!(
439446
createRenderOptions({
@@ -446,6 +453,7 @@ See documentation: https://www.algolia.com/doc/api-reference/widgets/clear-refin
446453
);
447454

448455
expect(rendering.mock.calls[1][0].hasRefinements).toBe(true);
456+
expect(rendering.mock.calls[1][0].canRefine).toBe(true);
449457
});
450458

451459
it('with query not excluded and not empty has refinements', () => {
@@ -471,6 +479,7 @@ See documentation: https://www.algolia.com/doc/api-reference/widgets/clear-refin
471479
);
472480

473481
expect(rendering.mock.calls[0][0].hasRefinements).toBe(false);
482+
expect(rendering.mock.calls[0][0].canRefine).toBe(false);
474483

475484
widget.render!(
476485
createRenderOptions({
@@ -483,6 +492,7 @@ See documentation: https://www.algolia.com/doc/api-reference/widgets/clear-refin
483492
);
484493

485494
expect(rendering.mock.calls[1][0].hasRefinements).toBe(true);
495+
expect(rendering.mock.calls[1][0].canRefine).toBe(true);
486496
});
487497

488498
it('with query not excluded and empty has no refinements', () => {
@@ -505,6 +515,7 @@ See documentation: https://www.algolia.com/doc/api-reference/widgets/clear-refin
505515
);
506516

507517
expect(rendering.mock.calls[0][0].hasRefinements).toBe(false);
518+
expect(rendering.mock.calls[0][0].canRefine).toBe(false);
508519

509520
widget.render!(
510521
createRenderOptions({
@@ -517,6 +528,7 @@ See documentation: https://www.algolia.com/doc/api-reference/widgets/clear-refin
517528
);
518529

519530
expect(rendering.mock.calls[1][0].hasRefinements).toBe(false);
531+
expect(rendering.mock.calls[1][0].canRefine).toBe(false);
520532
});
521533

522534
it('without includedAttributes or excludedAttributes and with a query has no refinements', () => {
@@ -536,6 +548,7 @@ See documentation: https://www.algolia.com/doc/api-reference/widgets/clear-refin
536548
);
537549

538550
expect(rendering.mock.calls[0][0].hasRefinements).toBe(false);
551+
expect(rendering.mock.calls[0][0].canRefine).toBe(false);
539552

540553
widget.render!(
541554
createRenderOptions({
@@ -548,6 +561,7 @@ See documentation: https://www.algolia.com/doc/api-reference/widgets/clear-refin
548561
);
549562

550563
expect(rendering.mock.calls[1][0].hasRefinements).toBe(false);
564+
expect(rendering.mock.calls[1][0].canRefine).toBe(false);
551565
});
552566

553567
it('includes only includedAttributes', () => {
@@ -601,6 +615,7 @@ See documentation: https://www.algolia.com/doc/api-reference/widgets/clear-refin
601615
expect(helper.hasRefinements('facet1')).toBe(false);
602616
expect(helper.hasRefinements('facet2')).toBe(true);
603617
expect(rendering.mock.calls[2][0].hasRefinements).toBe(false);
618+
expect(rendering.mock.calls[2][0].canRefine).toBe(false);
604619
});
605620

606621
it('includes only includedAttributes (with query)', () => {
@@ -651,6 +666,7 @@ See documentation: https://www.algolia.com/doc/api-reference/widgets/clear-refin
651666
expect(helper.hasRefinements('facet1')).toBe(false);
652667
expect(helper.state.query).toBe('');
653668
expect(rendering.mock.calls[2][0].hasRefinements).toBe(false);
669+
expect(rendering.mock.calls[2][0].canRefine).toBe(false);
654670
});
655671

656672
it('excludes excludedAttributes', () => {
@@ -699,6 +715,7 @@ See documentation: https://www.algolia.com/doc/api-reference/widgets/clear-refin
699715
expect(helper.hasRefinements('facet2')).toBe(true);
700716

701717
expect(rendering.mock.calls[1][0].hasRefinements).toBe(true);
718+
expect(rendering.mock.calls[1][0].canRefine).toBe(true);
702719
}
703720

704721
{
@@ -798,6 +815,7 @@ See documentation: https://www.algolia.com/doc/api-reference/widgets/clear-refin
798815
expect(helper.hasRefinements('facet3')).toBe(false);
799816
expect(helper.state.query).toBe('');
800817
expect(rendering.mock.calls[2][0].hasRefinements).toBe(false);
818+
expect(rendering.mock.calls[2][0].canRefine).toBe(false);
801819
});
802820

803821
describe('createURL', () => {

‎src/connectors/clear-refinements/connectClearRefinements.ts

+12-3
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,15 @@ export type ClearRefinementsRendererOptions = {
4040

4141
/**
4242
* Indicates if search state is refined.
43+
* @deprecated prefer reading canRefine
4344
*/
4445
hasRefinements: boolean;
4546

47+
/**
48+
* Indicates if search state can be refined.
49+
*/
50+
canRefine: boolean;
51+
4652
/**
4753
* Creates a url for the next state when refinements are cleared.
4854
*/
@@ -176,10 +182,13 @@ const connectClearRefinements: ClearRefinementsConnector = function connectClear
176182
)
177183
);
178184

185+
const canRefine = connectorState.attributesToClear.some(
186+
attributeToClear => attributeToClear.items.length > 0
187+
);
188+
179189
return {
180-
hasRefinements: connectorState.attributesToClear.some(
181-
attributeToClear => attributeToClear.items.length > 0
182-
),
190+
canRefine,
191+
hasRefinements: canRefine,
183192
refine: cachedRefine,
184193
createURL: cachedCreateURL,
185194
widgetParams,

0 commit comments

Comments
 (0)
Please sign in to comment.