* feat: 🎸 Load spinner when selecting gcloud store. Add key on td * feat: 🎸 Code review. Translate loading study status * feat: 🎸 Code review. Minor code refactoring * fix: add missing study and index declerations * Newer version of react-dates (calendar input component) * Add useMedia hook * Add useDebounce hook * Export hooks for consumption * Pull search filter into own component * StudyListWithData to StudyListRoute * Rename pagination component * Rename Toolbar * CustomeDateRangePicker to plain ol' css * Remove unused styles * Misc * Magic to make our "OR" filters work * Play w/ Mobile styles * Fix pagination pushing out max width for viewport * Tidy up small and medium templates * Remove unecessary nesting * Better mobile header and logo styles * Fix studyList font size * Remove unused code * hookup on click * Fix table search selectors * Cypress uses medium width * Remove irrelevant test * Fix primary sort * Fix sort for our smaller displays * fix study list sometimes longer than specified rowsPerPage * Simplify date picker styles * restore study date filters * Fix about table styling * fix take value for search * Fix header sizing for viewer and list route * Remove dead code * Restore isLoading * Update platform/ui/src/components/studyList/StudyList.styl Co-Authored-By: Rodrigo Antinarelli <rodrigoantinarelli@gmail.com> * Attempt first usage of translations w/ hooks * Pull from react-i18n library * Fit presets on to a single line * add no results message * Show error message in studyList table * Update input selectors for e2e tests * Make sure messages span all columns * fix test selector for table results * Skip hover for result rows * fix imports * Date filtering w/ config * Default export * Pushed to PageComponent * Remove DropZone This previously only worked for null/undefined studies. I'm unable to trigger the state by testing the data. This "might" have happened when using a fresh/empty PACS; but even an empty array of studies would not show
55 lines
1.7 KiB
JavaScript
55 lines
1.7 KiB
JavaScript
import { useState, useEffect } from 'react';
|
|
|
|
/**
|
|
*
|
|
* @example <caption></caption>
|
|
* const currentViewportSize = useMedia(
|
|
* // Media queries
|
|
* ['(min-width: 1500px)', '(min-width: 1000px)', '(min-width: 600px)'],
|
|
* // Value to return for matched media query
|
|
* ['large', 'medium', 'small'],
|
|
* // Default value
|
|
* 'medium'
|
|
* );
|
|
* @param {string[]} queries
|
|
* @param {*} values
|
|
* @param {*} defaultValue
|
|
* @returns
|
|
*/
|
|
function useMedia(queries, values, defaultValue) {
|
|
// Array containing a media query list for each query
|
|
const mediaQueryLists = queries.map(q => window.matchMedia(q));
|
|
|
|
// Function that gets value based on matching media query
|
|
const getValue = () => {
|
|
// Get index of first media query that matches
|
|
const index = mediaQueryLists.findIndex(mql => mql.matches);
|
|
|
|
// Return related value or defaultValue if none
|
|
return typeof values[index] !== 'undefined' ? values[index] : defaultValue;
|
|
};
|
|
|
|
// State and setter for matched value
|
|
const [value, setValue] = useState(getValue);
|
|
|
|
useEffect(
|
|
() => {
|
|
// Event listener callback
|
|
// Note: By defining getValue outside of useEffect we ensure that it has ...
|
|
// ... current values of hook args (as this hook callback is created once on mount).
|
|
const handler = () => setValue(getValue);
|
|
|
|
// Set a listener for each media query with above handler as callback.
|
|
mediaQueryLists.forEach(mql => mql.addListener(handler));
|
|
|
|
// Remove listeners on cleanup
|
|
return () => mediaQueryLists.forEach(mql => mql.removeListener(handler));
|
|
},
|
|
[] // Empty array ensures effect is only run on mount and unmount
|
|
);
|
|
|
|
return value;
|
|
}
|
|
|
|
export default useMedia;
|