Skip to content

Commit 7353b84

Browse files
committed
feat: add SearchPaths type for dynamic field searching in onSearchQueryChange
1 parent d8a603e commit 7353b84

3 files changed

Lines changed: 59 additions & 3 deletions

File tree

mobile/package-lock.json

Lines changed: 34 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

mobile/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@
9898
"postinstall-postinstall": "^2.1.0",
9999
"prettier": "^2.6.2",
100100
"react-test-renderer": "19.0.0",
101+
"type-fest": "^5.8.0",
101102
"typescript": "~5.8.3"
102103
},
103104
"private": true

mobile/utils/overall.ts

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import mime from 'mime';
99
import ImagePicker from 'expo-image-picker';
1010
import { NativeSyntheticEvent } from 'react-native/Libraries/Types/CoreEventTypes';
1111
import { NativeScrollEvent } from 'react-native/Libraries/Components/ScrollView/ScrollView';
12+
import { Paths } from 'type-fest';
1213

1314
export const canAddReading = (meter: Meter): boolean => {
1415
if (!meter) {
@@ -69,12 +70,34 @@ export const pushOrRemove = (array: string[], push: boolean, value: string) => {
6970
return array;
7071
};
7172

73+
type Primitive =
74+
| string
75+
| number
76+
| boolean
77+
| bigint
78+
| symbol
79+
| null
80+
| undefined
81+
| Date
82+
| Function;
83+
84+
type SearchPaths<T> = T extends Primitive
85+
? never
86+
: {
87+
[K in keyof T & string]: T[K] extends Primitive
88+
? K
89+
: T[K] extends readonly (infer U)[]
90+
? K | `${K}.${SearchPaths<U>}`
91+
: T[K] extends object
92+
? K | `${K}.${SearchPaths<T[K]>}`
93+
: K;
94+
}[keyof T & string];
7295
export const onSearchQueryChange = <T>(
7396
query,
7497
criteria: SearchCriteria,
7598
setCriteria: React.Dispatch<React.SetStateAction<SearchCriteria>>,
7699
setSearchQuery: React.Dispatch<React.SetStateAction<string>>,
77-
fieldsToSearch: string[]
100+
fieldsToSearch: SearchPaths<T>[]
78101
) => {
79102
let newFilterFields: FilterField[] = [...criteria.filterFields];
80103

0 commit comments

Comments
 (0)