diff --git a/helpers/stork/browser.js b/helpers/stork/browser.js index 48a1da0..a5e881d 100644 --- a/helpers/stork/browser.js +++ b/helpers/stork/browser.js @@ -226,3 +226,73 @@ export class StorkClient { return } } + + +export class StorkFilters { + constructor({ + initialFilters = {} + } = {}) { + this.filters = { + ...initialFilters + } + } + + + + get filtersForQuery () { + return Object.entries( this.filters ).map( ([ filterKey, filterValue ]) => { + return `${ filterKey }_${ filterValue }` + } ).join(' ') + } + + isQueryValue ( filterNameOrQueryValue ) { + return filterNameOrQueryValue.includes('_') + } + + getKeyAndValue ( filterQueryValue ) { + const [ key, value ] = filterQueryValue.split('_') + return { key, value } + } + + getFilterNameAndValueFromString ( filterNameOrQueryValue ) { + if ( this.isQueryValue( filterNameOrQueryValue ) ) { + return this.getKeyAndValue( filterNameOrQueryValue ) + } + + return { + key: filterNameOrQueryValue, + value: null + } + } + + toggleFilter ( filterNameOrQueryValue, filterValue = null ) { + + const fromString = this.getFilterNameAndValueFromString( filterNameOrQueryValue ) + + const filterName = fromString.key + filterValue = filterValue || fromString.value + + if ( !!this.filters[ filterName ] ) { + delete this.filters[ filterName ] + + return + } + + // Throw error if filter value is not a string + if ( typeof filterValue !== 'string' ) { + throw new Error(`Filter value must be a string. Got ${ typeof filterValue }`) + } + + this.filters[ filterName ] = filterValue + } + + hasFilter ( filterNameOrQueryValue ) { + + const { + key : filterName, + } = this.getFilterNameAndValueFromString( filterNameOrQueryValue ) + + + return !!this.filters[ filterName ] + } +} diff --git a/test/prebuild/filters.js b/test/prebuild/filters.js new file mode 100644 index 0000000..a0bcbaa --- /dev/null +++ b/test/prebuild/filters.js @@ -0,0 +1,35 @@ +import test from 'ava' +// import MarkdownIt from 'markdown-it' + +// import { isValidHttpUrl } from '~/helpers/check-types.js' +import { StorkFilters } from '~/helpers/stork/browser.js' + + +require('dotenv').config() + + +test('Can Toggle off existing filter' , async t => { + const filters = new StorkFilters({ + initialFilters: { + 'test': 'yes' + } + }) + + filters.toggleFilter('test') + + t.deepEqual(filters.hasFilter('test'), false) + + filters.toggleFilter('test', 'yes') + filters.toggleFilter('status', 'native') + + t.deepEqual(filters.hasFilter('test'), true) + + t.deepEqual(filters.filtersForQuery, 'test_yes status_native') + + filters.toggleFilter('status_native') + + t.deepEqual(filters.filtersForQuery, 'test_yes') +}) + + +// Can handle query values with multiple underscores