@contractspec/lib.presentation-runtime-react-native 11.0.0 → 13.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser/index.js +108 -0
- package/dist/browser/nativewind-env.d.js +0 -0
- package/dist/index.d.ts +84 -103
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +105 -123
- package/dist/nativewind-env.d.js +1 -0
- package/package.json +28 -15
- package/dist/index.js.map +0 -1
- package/dist/nativewind-env.d.ts +0 -1
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
// src/index.ts
|
|
2
|
+
import * as React from "react";
|
|
3
|
+
import { useForm } from "@contractspec/lib.ui-kit/ui/form";
|
|
4
|
+
function usePresentationController({
|
|
5
|
+
defaults,
|
|
6
|
+
form: formOpts,
|
|
7
|
+
toVariables,
|
|
8
|
+
fetcher,
|
|
9
|
+
toChips,
|
|
10
|
+
useUrlState,
|
|
11
|
+
replace
|
|
12
|
+
}) {
|
|
13
|
+
const url = useUrlState({ defaults, replace });
|
|
14
|
+
const form = useForm({
|
|
15
|
+
defaultValues: formOpts.defaultValues,
|
|
16
|
+
resolver: formOpts.resolver
|
|
17
|
+
});
|
|
18
|
+
React.useEffect(() => {
|
|
19
|
+
form.reset({ ...form.getValues(), ...url.state.filters });
|
|
20
|
+
}, [url.state.filters]);
|
|
21
|
+
const submitFilters = form.handleSubmit((values) => {
|
|
22
|
+
url.setState({ filters: values, page: 1 });
|
|
23
|
+
});
|
|
24
|
+
const setSearch = React.useCallback((q) => url.setState({ q, page: 1 }), [url]);
|
|
25
|
+
const variables = React.useMemo(() => toVariables(url.state), [url.state, toVariables]);
|
|
26
|
+
const [data, setData] = React.useState([]);
|
|
27
|
+
const [loading, setLoading] = React.useState(false);
|
|
28
|
+
const [error, setError] = React.useState(null);
|
|
29
|
+
const [totalItems, setTotalItems] = React.useState(undefined);
|
|
30
|
+
const [totalPages, setTotalPages] = React.useState(undefined);
|
|
31
|
+
const refetch = React.useCallback(async () => {
|
|
32
|
+
setLoading(true);
|
|
33
|
+
setError(null);
|
|
34
|
+
try {
|
|
35
|
+
const out = await fetcher(variables);
|
|
36
|
+
setData(out.items);
|
|
37
|
+
setTotalItems(out.totalItems);
|
|
38
|
+
setTotalPages(out.totalPages);
|
|
39
|
+
} catch (e) {
|
|
40
|
+
setError(e);
|
|
41
|
+
} finally {
|
|
42
|
+
setLoading(false);
|
|
43
|
+
}
|
|
44
|
+
}, [variables, fetcher]);
|
|
45
|
+
React.useEffect(() => {
|
|
46
|
+
refetch();
|
|
47
|
+
}, [refetch]);
|
|
48
|
+
const chips = React.useMemo(() => toChips ? toChips(url.state.filters || {}, url.setFilter) : [], [url.state.filters, toChips]);
|
|
49
|
+
const clearAll = React.useCallback(() => {
|
|
50
|
+
form.reset(formOpts.defaultValues);
|
|
51
|
+
url.setState({ filters: {}, page: 1 });
|
|
52
|
+
}, [form, formOpts.defaultValues, url]);
|
|
53
|
+
return {
|
|
54
|
+
form,
|
|
55
|
+
url,
|
|
56
|
+
variables,
|
|
57
|
+
data,
|
|
58
|
+
loading,
|
|
59
|
+
error,
|
|
60
|
+
totalItems,
|
|
61
|
+
totalPages,
|
|
62
|
+
refetch,
|
|
63
|
+
chips,
|
|
64
|
+
setSearch,
|
|
65
|
+
submitFilters,
|
|
66
|
+
clearAll
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
function useListCoordinator({
|
|
70
|
+
defaults,
|
|
71
|
+
form: formOpts,
|
|
72
|
+
toVariables,
|
|
73
|
+
toChips,
|
|
74
|
+
useUrlState,
|
|
75
|
+
replace
|
|
76
|
+
}) {
|
|
77
|
+
const url = useUrlState({ defaults, replace });
|
|
78
|
+
const form = useForm({
|
|
79
|
+
defaultValues: formOpts.defaultValues,
|
|
80
|
+
resolver: formOpts.resolver
|
|
81
|
+
});
|
|
82
|
+
React.useEffect(() => {
|
|
83
|
+
form.reset({ ...form.getValues(), ...url.state.filters });
|
|
84
|
+
}, [url.state.filters]);
|
|
85
|
+
const submitFilters = form.handleSubmit((values) => {
|
|
86
|
+
url.setState({ filters: values, page: 1 });
|
|
87
|
+
});
|
|
88
|
+
const setSearch = React.useCallback((q) => url.setState({ q, page: 1 }), [url]);
|
|
89
|
+
const variables = React.useMemo(() => toVariables(url.state), [url.state, toVariables]);
|
|
90
|
+
const chips = React.useMemo(() => toChips ? toChips(url.state.filters || {}, url.setFilter) : [], [url.state.filters, toChips]);
|
|
91
|
+
const clearAll = React.useCallback(() => {
|
|
92
|
+
form.reset(formOpts.defaultValues);
|
|
93
|
+
url.setState({ filters: {}, page: 1 });
|
|
94
|
+
}, [form, formOpts.defaultValues, url]);
|
|
95
|
+
return {
|
|
96
|
+
form,
|
|
97
|
+
url,
|
|
98
|
+
variables,
|
|
99
|
+
chips,
|
|
100
|
+
setSearch,
|
|
101
|
+
submitFilters,
|
|
102
|
+
clearAll
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
export {
|
|
106
|
+
usePresentationController,
|
|
107
|
+
useListCoordinator
|
|
108
|
+
};
|
|
File without changes
|
package/dist/index.d.ts
CHANGED
|
@@ -1,112 +1,93 @@
|
|
|
1
|
-
import * as React from
|
|
2
|
-
import { DefaultValues, Resolver, UseFormReturn } from
|
|
3
|
-
import { ListFetcher, ListState } from
|
|
4
|
-
|
|
5
|
-
//#region src/index.d.ts
|
|
6
|
-
interface UsePresentationControllerOpts<TFilters extends Record<string, unknown>, TVars, TItem> {
|
|
7
|
-
defaults: ListState<TFilters>;
|
|
8
|
-
form: {
|
|
9
|
-
defaultValues: DefaultValues<TFilters>;
|
|
10
|
-
resolver?: Resolver<TFilters>;
|
|
11
|
-
};
|
|
12
|
-
toVariables: (input: ListState<TFilters>) => TVars;
|
|
13
|
-
fetcher: ListFetcher<TVars, TItem>;
|
|
14
|
-
toChips?: (filters: TFilters, setFilter: (key: keyof TFilters, value: TFilters[keyof TFilters] | null) => void) => {
|
|
15
|
-
key: string;
|
|
16
|
-
label: React.ReactNode;
|
|
17
|
-
onRemove?: () => void;
|
|
18
|
-
}[];
|
|
19
|
-
useUrlState: (args: {
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import type { DefaultValues, Resolver, UseFormReturn } from 'react-hook-form';
|
|
3
|
+
import type { ListFetcher, ListState } from '@contractspec/lib.presentation-runtime-core';
|
|
4
|
+
export interface UsePresentationControllerOpts<TFilters extends Record<string, unknown>, TVars, TItem> {
|
|
20
5
|
defaults: ListState<TFilters>;
|
|
6
|
+
form: {
|
|
7
|
+
defaultValues: DefaultValues<TFilters>;
|
|
8
|
+
resolver?: Resolver<TFilters>;
|
|
9
|
+
};
|
|
10
|
+
toVariables: (input: ListState<TFilters>) => TVars;
|
|
11
|
+
fetcher: ListFetcher<TVars, TItem>;
|
|
12
|
+
toChips?: (filters: TFilters, setFilter: (key: keyof TFilters, value: TFilters[keyof TFilters] | null) => void) => {
|
|
13
|
+
key: string;
|
|
14
|
+
label: React.ReactNode;
|
|
15
|
+
onRemove?: () => void;
|
|
16
|
+
}[];
|
|
17
|
+
useUrlState: (args: {
|
|
18
|
+
defaults: ListState<TFilters>;
|
|
19
|
+
replace?: boolean;
|
|
20
|
+
}) => {
|
|
21
|
+
state: ListState<TFilters>;
|
|
22
|
+
setState: (next: Partial<ListState<TFilters>>) => void;
|
|
23
|
+
setFilter: (key: keyof TFilters, value: TFilters[keyof TFilters] | null) => void;
|
|
24
|
+
clearFilters: () => void;
|
|
25
|
+
};
|
|
21
26
|
replace?: boolean;
|
|
22
|
-
}) => {
|
|
23
|
-
state: ListState<TFilters>;
|
|
24
|
-
setState: (next: Partial<ListState<TFilters>>) => void;
|
|
25
|
-
setFilter: (key: keyof TFilters, value: TFilters[keyof TFilters] | null) => void;
|
|
26
|
-
clearFilters: () => void;
|
|
27
|
-
};
|
|
28
|
-
replace?: boolean;
|
|
29
27
|
}
|
|
30
|
-
declare function usePresentationController<TFilters extends Record<string, unknown>, TVars, TItem>({
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
readonly chips: {
|
|
54
|
-
key: string;
|
|
55
|
-
label: React.ReactNode;
|
|
56
|
-
onRemove?: () => void;
|
|
57
|
-
}[];
|
|
58
|
-
readonly setSearch: (q: string) => void;
|
|
59
|
-
readonly submitFilters: (e?: React.BaseSyntheticEvent) => Promise<void>;
|
|
60
|
-
readonly clearAll: () => void;
|
|
28
|
+
export declare function usePresentationController<TFilters extends Record<string, unknown>, TVars, TItem>({ defaults, form: formOpts, toVariables, fetcher, toChips, useUrlState, replace, }: UsePresentationControllerOpts<TFilters, TVars, TItem>): {
|
|
29
|
+
readonly form: UseFormReturn<TFilters>;
|
|
30
|
+
readonly url: {
|
|
31
|
+
state: ListState<TFilters>;
|
|
32
|
+
setState: (next: Partial<ListState<TFilters>>) => void;
|
|
33
|
+
setFilter: (key: keyof TFilters, value: TFilters[keyof TFilters] | null) => void;
|
|
34
|
+
clearFilters: () => void;
|
|
35
|
+
};
|
|
36
|
+
readonly variables: TVars;
|
|
37
|
+
readonly data: TItem[];
|
|
38
|
+
readonly loading: boolean;
|
|
39
|
+
readonly error: unknown;
|
|
40
|
+
readonly totalItems: number | undefined;
|
|
41
|
+
readonly totalPages: number | undefined;
|
|
42
|
+
readonly refetch: () => Promise<void>;
|
|
43
|
+
readonly chips: {
|
|
44
|
+
key: string;
|
|
45
|
+
label: React.ReactNode;
|
|
46
|
+
onRemove?: () => void;
|
|
47
|
+
}[];
|
|
48
|
+
readonly setSearch: (q: string) => void;
|
|
49
|
+
readonly submitFilters: (e?: React.BaseSyntheticEvent) => Promise<void>;
|
|
50
|
+
readonly clearAll: () => void;
|
|
61
51
|
};
|
|
62
|
-
interface UseListCoordinatorOpts<TFilters extends Record<string, unknown>, TVars> {
|
|
63
|
-
defaults: ListState<TFilters>;
|
|
64
|
-
form: {
|
|
65
|
-
defaultValues: DefaultValues<TFilters>;
|
|
66
|
-
resolver?: Resolver<TFilters>;
|
|
67
|
-
};
|
|
68
|
-
toVariables: (input: ListState<TFilters>) => TVars;
|
|
69
|
-
toChips?: (filters: TFilters, setFilter: (key: keyof TFilters, value: TFilters[keyof TFilters] | null) => void) => {
|
|
70
|
-
key: string;
|
|
71
|
-
label: React.ReactNode;
|
|
72
|
-
onRemove?: () => void;
|
|
73
|
-
}[];
|
|
74
|
-
useUrlState: (args: {
|
|
52
|
+
export interface UseListCoordinatorOpts<TFilters extends Record<string, unknown>, TVars> {
|
|
75
53
|
defaults: ListState<TFilters>;
|
|
54
|
+
form: {
|
|
55
|
+
defaultValues: DefaultValues<TFilters>;
|
|
56
|
+
resolver?: Resolver<TFilters>;
|
|
57
|
+
};
|
|
58
|
+
toVariables: (input: ListState<TFilters>) => TVars;
|
|
59
|
+
toChips?: (filters: TFilters, setFilter: (key: keyof TFilters, value: TFilters[keyof TFilters] | null) => void) => {
|
|
60
|
+
key: string;
|
|
61
|
+
label: React.ReactNode;
|
|
62
|
+
onRemove?: () => void;
|
|
63
|
+
}[];
|
|
64
|
+
useUrlState: (args: {
|
|
65
|
+
defaults: ListState<TFilters>;
|
|
66
|
+
replace?: boolean;
|
|
67
|
+
}) => {
|
|
68
|
+
state: ListState<TFilters>;
|
|
69
|
+
setState: (next: Partial<ListState<TFilters>>) => void;
|
|
70
|
+
setFilter: (key: keyof TFilters, value: TFilters[keyof TFilters] | null) => void;
|
|
71
|
+
clearFilters: () => void;
|
|
72
|
+
};
|
|
76
73
|
replace?: boolean;
|
|
77
|
-
}) => {
|
|
78
|
-
state: ListState<TFilters>;
|
|
79
|
-
setState: (next: Partial<ListState<TFilters>>) => void;
|
|
80
|
-
setFilter: (key: keyof TFilters, value: TFilters[keyof TFilters] | null) => void;
|
|
81
|
-
clearFilters: () => void;
|
|
82
|
-
};
|
|
83
|
-
replace?: boolean;
|
|
84
74
|
}
|
|
85
|
-
declare function useListCoordinator<TFilters extends Record<string, unknown>, TVars>({
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
key: string;
|
|
103
|
-
label: React.ReactNode;
|
|
104
|
-
onRemove?: () => void;
|
|
105
|
-
}[];
|
|
106
|
-
readonly setSearch: (q: string) => void;
|
|
107
|
-
readonly submitFilters: (e?: React.BaseSyntheticEvent) => Promise<void>;
|
|
108
|
-
readonly clearAll: () => void;
|
|
75
|
+
export declare function useListCoordinator<TFilters extends Record<string, unknown>, TVars>({ defaults, form: formOpts, toVariables, toChips, useUrlState, replace, }: UseListCoordinatorOpts<TFilters, TVars>): {
|
|
76
|
+
readonly form: UseFormReturn<TFilters>;
|
|
77
|
+
readonly url: {
|
|
78
|
+
state: ListState<TFilters>;
|
|
79
|
+
setState: (next: Partial<ListState<TFilters>>) => void;
|
|
80
|
+
setFilter: (key: keyof TFilters, value: TFilters[keyof TFilters] | null) => void;
|
|
81
|
+
clearFilters: () => void;
|
|
82
|
+
};
|
|
83
|
+
readonly variables: TVars;
|
|
84
|
+
readonly chips: {
|
|
85
|
+
key: string;
|
|
86
|
+
label: React.ReactNode;
|
|
87
|
+
onRemove?: () => void;
|
|
88
|
+
}[];
|
|
89
|
+
readonly setSearch: (q: string) => void;
|
|
90
|
+
readonly submitFilters: (e?: React.BaseSyntheticEvent) => Promise<void>;
|
|
91
|
+
readonly clearAll: () => void;
|
|
109
92
|
};
|
|
110
|
-
//#endregion
|
|
111
|
-
export { UseListCoordinatorOpts, UsePresentationControllerOpts, useListCoordinator, usePresentationController };
|
|
112
93
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,127 +1,109 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
// src/index.ts
|
|
1
3
|
import * as React from "react";
|
|
2
4
|
import { useForm } from "@contractspec/lib.ui-kit/ui/form";
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
form.reset(formOpts.defaultValues);
|
|
68
|
-
url.setState({
|
|
69
|
-
filters: {},
|
|
70
|
-
page: 1
|
|
71
|
-
});
|
|
72
|
-
}, [
|
|
73
|
-
form,
|
|
74
|
-
formOpts.defaultValues,
|
|
75
|
-
url
|
|
76
|
-
])
|
|
77
|
-
};
|
|
5
|
+
function usePresentationController({
|
|
6
|
+
defaults,
|
|
7
|
+
form: formOpts,
|
|
8
|
+
toVariables,
|
|
9
|
+
fetcher,
|
|
10
|
+
toChips,
|
|
11
|
+
useUrlState,
|
|
12
|
+
replace
|
|
13
|
+
}) {
|
|
14
|
+
const url = useUrlState({ defaults, replace });
|
|
15
|
+
const form = useForm({
|
|
16
|
+
defaultValues: formOpts.defaultValues,
|
|
17
|
+
resolver: formOpts.resolver
|
|
18
|
+
});
|
|
19
|
+
React.useEffect(() => {
|
|
20
|
+
form.reset({ ...form.getValues(), ...url.state.filters });
|
|
21
|
+
}, [url.state.filters]);
|
|
22
|
+
const submitFilters = form.handleSubmit((values) => {
|
|
23
|
+
url.setState({ filters: values, page: 1 });
|
|
24
|
+
});
|
|
25
|
+
const setSearch = React.useCallback((q) => url.setState({ q, page: 1 }), [url]);
|
|
26
|
+
const variables = React.useMemo(() => toVariables(url.state), [url.state, toVariables]);
|
|
27
|
+
const [data, setData] = React.useState([]);
|
|
28
|
+
const [loading, setLoading] = React.useState(false);
|
|
29
|
+
const [error, setError] = React.useState(null);
|
|
30
|
+
const [totalItems, setTotalItems] = React.useState(undefined);
|
|
31
|
+
const [totalPages, setTotalPages] = React.useState(undefined);
|
|
32
|
+
const refetch = React.useCallback(async () => {
|
|
33
|
+
setLoading(true);
|
|
34
|
+
setError(null);
|
|
35
|
+
try {
|
|
36
|
+
const out = await fetcher(variables);
|
|
37
|
+
setData(out.items);
|
|
38
|
+
setTotalItems(out.totalItems);
|
|
39
|
+
setTotalPages(out.totalPages);
|
|
40
|
+
} catch (e) {
|
|
41
|
+
setError(e);
|
|
42
|
+
} finally {
|
|
43
|
+
setLoading(false);
|
|
44
|
+
}
|
|
45
|
+
}, [variables, fetcher]);
|
|
46
|
+
React.useEffect(() => {
|
|
47
|
+
refetch();
|
|
48
|
+
}, [refetch]);
|
|
49
|
+
const chips = React.useMemo(() => toChips ? toChips(url.state.filters || {}, url.setFilter) : [], [url.state.filters, toChips]);
|
|
50
|
+
const clearAll = React.useCallback(() => {
|
|
51
|
+
form.reset(formOpts.defaultValues);
|
|
52
|
+
url.setState({ filters: {}, page: 1 });
|
|
53
|
+
}, [form, formOpts.defaultValues, url]);
|
|
54
|
+
return {
|
|
55
|
+
form,
|
|
56
|
+
url,
|
|
57
|
+
variables,
|
|
58
|
+
data,
|
|
59
|
+
loading,
|
|
60
|
+
error,
|
|
61
|
+
totalItems,
|
|
62
|
+
totalPages,
|
|
63
|
+
refetch,
|
|
64
|
+
chips,
|
|
65
|
+
setSearch,
|
|
66
|
+
submitFilters,
|
|
67
|
+
clearAll
|
|
68
|
+
};
|
|
78
69
|
}
|
|
79
|
-
function useListCoordinator({
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
filters: {},
|
|
115
|
-
page: 1
|
|
116
|
-
});
|
|
117
|
-
}, [
|
|
118
|
-
form,
|
|
119
|
-
formOpts.defaultValues,
|
|
120
|
-
url
|
|
121
|
-
])
|
|
122
|
-
};
|
|
70
|
+
function useListCoordinator({
|
|
71
|
+
defaults,
|
|
72
|
+
form: formOpts,
|
|
73
|
+
toVariables,
|
|
74
|
+
toChips,
|
|
75
|
+
useUrlState,
|
|
76
|
+
replace
|
|
77
|
+
}) {
|
|
78
|
+
const url = useUrlState({ defaults, replace });
|
|
79
|
+
const form = useForm({
|
|
80
|
+
defaultValues: formOpts.defaultValues,
|
|
81
|
+
resolver: formOpts.resolver
|
|
82
|
+
});
|
|
83
|
+
React.useEffect(() => {
|
|
84
|
+
form.reset({ ...form.getValues(), ...url.state.filters });
|
|
85
|
+
}, [url.state.filters]);
|
|
86
|
+
const submitFilters = form.handleSubmit((values) => {
|
|
87
|
+
url.setState({ filters: values, page: 1 });
|
|
88
|
+
});
|
|
89
|
+
const setSearch = React.useCallback((q) => url.setState({ q, page: 1 }), [url]);
|
|
90
|
+
const variables = React.useMemo(() => toVariables(url.state), [url.state, toVariables]);
|
|
91
|
+
const chips = React.useMemo(() => toChips ? toChips(url.state.filters || {}, url.setFilter) : [], [url.state.filters, toChips]);
|
|
92
|
+
const clearAll = React.useCallback(() => {
|
|
93
|
+
form.reset(formOpts.defaultValues);
|
|
94
|
+
url.setState({ filters: {}, page: 1 });
|
|
95
|
+
}, [form, formOpts.defaultValues, url]);
|
|
96
|
+
return {
|
|
97
|
+
form,
|
|
98
|
+
url,
|
|
99
|
+
variables,
|
|
100
|
+
chips,
|
|
101
|
+
setSearch,
|
|
102
|
+
submitFilters,
|
|
103
|
+
clearAll
|
|
104
|
+
};
|
|
123
105
|
}
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
106
|
+
export {
|
|
107
|
+
usePresentationController,
|
|
108
|
+
useListCoordinator
|
|
109
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
// @bun
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@contractspec/lib.presentation-runtime-react-native",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "13.0.0",
|
|
4
4
|
"description": "React Native presentation runtime for mobile apps",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"contractspec",
|
|
@@ -11,44 +11,56 @@
|
|
|
11
11
|
"typescript"
|
|
12
12
|
],
|
|
13
13
|
"type": "module",
|
|
14
|
-
"types": "./dist/
|
|
14
|
+
"types": "./dist/index.d.ts",
|
|
15
15
|
"sideEffects": false,
|
|
16
16
|
"scripts": {
|
|
17
17
|
"clean": "rimraf dist .turbo",
|
|
18
18
|
"publish:pkg": "bun publish --tolerate-republish --ignore-scripts --verbose",
|
|
19
19
|
"publish:pkg:canary": "bun publish:pkg --tag canary",
|
|
20
|
-
"build": "bun build:
|
|
21
|
-
"build:bundle": "
|
|
22
|
-
"build:types": "
|
|
23
|
-
"dev": "bun
|
|
20
|
+
"build": "bun run prebuild && bun run build:bundle && bun run build:types",
|
|
21
|
+
"build:bundle": "contractspec-bun-build transpile",
|
|
22
|
+
"build:types": "contractspec-bun-build types",
|
|
23
|
+
"dev": "contractspec-bun-build dev",
|
|
24
24
|
"lint": "bun run lint:fix",
|
|
25
25
|
"lint:fix": "eslint src --fix",
|
|
26
|
-
"lint:check": "eslint src"
|
|
26
|
+
"lint:check": "eslint src",
|
|
27
|
+
"prebuild": "contractspec-bun-build prebuild",
|
|
28
|
+
"typecheck": "tsc --noEmit -p tsconfig.json"
|
|
27
29
|
},
|
|
28
30
|
"peerDependencies": {
|
|
29
31
|
"react": "^19.2.4",
|
|
30
32
|
"react-native": "*",
|
|
31
33
|
"react-hook-form": "^7.70.0",
|
|
32
34
|
"zod": "^4.3.5",
|
|
33
|
-
"@contractspec/lib.presentation-runtime-core": "1.
|
|
35
|
+
"@contractspec/lib.presentation-runtime-core": "1.59.0"
|
|
34
36
|
},
|
|
35
37
|
"dependencies": {
|
|
36
|
-
"@contractspec/lib.presentation-runtime-core": "1.
|
|
37
|
-
"@contractspec/lib.ui-kit": "1.
|
|
38
|
+
"@contractspec/lib.presentation-runtime-core": "1.59.0",
|
|
39
|
+
"@contractspec/lib.ui-kit": "1.59.0"
|
|
38
40
|
},
|
|
39
41
|
"files": [
|
|
40
42
|
"dist",
|
|
41
43
|
"README.md"
|
|
42
44
|
],
|
|
43
45
|
"exports": {
|
|
44
|
-
".": "./
|
|
45
|
-
"
|
|
46
|
+
".": "./src/index.ts",
|
|
47
|
+
"./nativewind-env.d": "./src/nativewind-env.d.ts"
|
|
46
48
|
},
|
|
47
49
|
"publishConfig": {
|
|
48
50
|
"access": "public",
|
|
49
51
|
"exports": {
|
|
50
|
-
".":
|
|
51
|
-
|
|
52
|
+
".": {
|
|
53
|
+
"types": "./dist/index.d.ts",
|
|
54
|
+
"bun": "./dist/index.js",
|
|
55
|
+
"browser": "./dist/browser/index.js",
|
|
56
|
+
"default": "./dist/index.js"
|
|
57
|
+
},
|
|
58
|
+
"./nativewind-env.d": {
|
|
59
|
+
"types": "./dist/nativewind-env.d.d.ts",
|
|
60
|
+
"bun": "./dist/nativewind-env.d.js",
|
|
61
|
+
"browser": "./dist/browser/nativewind-env.d.js",
|
|
62
|
+
"default": "./dist/nativewind-env.d.js"
|
|
63
|
+
}
|
|
52
64
|
},
|
|
53
65
|
"registry": "https://registry.npmjs.org/"
|
|
54
66
|
},
|
|
@@ -60,6 +72,7 @@
|
|
|
60
72
|
},
|
|
61
73
|
"homepage": "https://contractspec.io",
|
|
62
74
|
"devDependencies": {
|
|
63
|
-
"react-native-css": "^3.0.0"
|
|
75
|
+
"react-native-css": "^3.0.0",
|
|
76
|
+
"@contractspec/tool.bun": "1.58.0"
|
|
64
77
|
}
|
|
65
78
|
}
|
package/dist/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../src/index.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport * as React from 'react';\nimport type { DefaultValues, Resolver, UseFormReturn } from 'react-hook-form';\nimport { useForm } from '@contractspec/lib.ui-kit/ui/form';\nimport type {\n ListFetcher,\n ListState,\n} from '@contractspec/lib.presentation-runtime-core';\n\nexport interface UsePresentationControllerOpts<\n TFilters extends Record<string, unknown>,\n TVars,\n TItem,\n> {\n defaults: ListState<TFilters>;\n form: {\n defaultValues: DefaultValues<TFilters>;\n resolver?: Resolver<TFilters>;\n };\n toVariables: (input: ListState<TFilters>) => TVars;\n fetcher: ListFetcher<TVars, TItem>;\n toChips?: (\n filters: TFilters,\n setFilter: (\n key: keyof TFilters,\n value: TFilters[keyof TFilters] | null\n ) => void\n ) => { key: string; label: React.ReactNode; onRemove?: () => void }[];\n useUrlState: (args: { defaults: ListState<TFilters>; replace?: boolean }) => {\n state: ListState<TFilters>;\n setState: (next: Partial<ListState<TFilters>>) => void;\n setFilter: (\n key: keyof TFilters,\n value: TFilters[keyof TFilters] | null\n ) => void;\n clearFilters: () => void;\n };\n replace?: boolean;\n}\n\nexport function usePresentationController<\n TFilters extends Record<string, unknown>,\n TVars,\n TItem,\n>({\n defaults,\n form: formOpts,\n toVariables,\n fetcher,\n toChips,\n useUrlState,\n replace,\n}: UsePresentationControllerOpts<TFilters, TVars, TItem>) {\n const url = useUrlState({ defaults, replace });\n const form = useForm<TFilters>({\n defaultValues: formOpts.defaultValues,\n resolver: formOpts.resolver as any,\n } as any);\n\n React.useEffect(() => {\n form.reset({ ...(form.getValues() as any), ...(url.state.filters as any) });\n }, [url.state.filters]);\n\n const submitFilters = form.handleSubmit((values) => {\n url.setState({ filters: values as TFilters, page: 1 });\n });\n\n const setSearch = React.useCallback(\n (q: string) => url.setState({ q, page: 1 }),\n [url]\n );\n const variables = React.useMemo(\n () => toVariables(url.state),\n [url.state, toVariables]\n );\n\n const [data, setData] = React.useState<TItem[]>([]);\n const [loading, setLoading] = React.useState(false);\n const [error, setError] = React.useState<unknown>(null);\n const [totalItems, setTotalItems] = React.useState<number | undefined>(\n undefined\n );\n const [totalPages, setTotalPages] = React.useState<number | undefined>(\n undefined\n );\n\n const refetch = React.useCallback(async () => {\n setLoading(true);\n setError(null);\n try {\n const out = await fetcher(variables);\n setData(out.items);\n setTotalItems(out.totalItems);\n setTotalPages(out.totalPages);\n } catch (e) {\n setError(e);\n } finally {\n setLoading(false);\n }\n }, [variables, fetcher]);\n\n React.useEffect(() => {\n void refetch();\n }, [refetch]);\n\n const chips = React.useMemo(\n () =>\n toChips\n ? toChips(\n (url.state.filters as TFilters) || ({} as any),\n url.setFilter as any\n )\n : [],\n [url.state.filters, toChips]\n );\n\n const clearAll = React.useCallback(() => {\n form.reset(formOpts.defaultValues as TFilters);\n url.setState({ filters: {} as TFilters, page: 1 });\n }, [form, formOpts.defaultValues, url]);\n\n return {\n form: form as UseFormReturn<TFilters>,\n url,\n variables,\n data,\n loading,\n error,\n totalItems,\n totalPages,\n refetch,\n chips,\n setSearch,\n submitFilters,\n clearAll,\n } as const;\n}\n\nexport interface UseListCoordinatorOpts<\n TFilters extends Record<string, unknown>,\n TVars,\n> {\n defaults: ListState<TFilters>;\n form: {\n defaultValues: DefaultValues<TFilters>;\n resolver?: Resolver<TFilters>;\n };\n toVariables: (input: ListState<TFilters>) => TVars;\n toChips?: (\n filters: TFilters,\n setFilter: (\n key: keyof TFilters,\n value: TFilters[keyof TFilters] | null\n ) => void\n ) => { key: string; label: React.ReactNode; onRemove?: () => void }[];\n useUrlState: (args: { defaults: ListState<TFilters>; replace?: boolean }) => {\n state: ListState<TFilters>;\n setState: (next: Partial<ListState<TFilters>>) => void;\n setFilter: (\n key: keyof TFilters,\n value: TFilters[keyof TFilters] | null\n ) => void;\n clearFilters: () => void;\n };\n replace?: boolean;\n}\n\nexport function useListCoordinator<\n TFilters extends Record<string, unknown>,\n TVars,\n>({\n defaults,\n form: formOpts,\n toVariables,\n toChips,\n useUrlState,\n replace,\n}: UseListCoordinatorOpts<TFilters, TVars>) {\n const url = useUrlState({ defaults, replace });\n const form = useForm<TFilters>({\n defaultValues: formOpts.defaultValues,\n resolver: formOpts.resolver as any,\n } as any);\n\n React.useEffect(() => {\n form.reset({ ...(form.getValues() as any), ...(url.state.filters as any) });\n }, [url.state.filters]);\n\n const submitFilters = form.handleSubmit((values) => {\n url.setState({ filters: values as TFilters, page: 1 });\n });\n\n const setSearch = React.useCallback(\n (q: string) => url.setState({ q, page: 1 }),\n [url]\n );\n const variables = React.useMemo(\n () => toVariables(url.state),\n [url.state, toVariables]\n );\n\n const chips = React.useMemo(\n () =>\n toChips\n ? toChips(\n (url.state.filters as TFilters) || ({} as any),\n url.setFilter as any\n )\n : [],\n [url.state.filters, toChips]\n );\n\n const clearAll = React.useCallback(() => {\n form.reset(formOpts.defaultValues as TFilters);\n url.setState({ filters: {} as TFilters, page: 1 });\n }, [form, formOpts.defaultValues, url]);\n\n return {\n form: form as UseFormReturn<TFilters>,\n url,\n variables,\n chips,\n setSearch,\n submitFilters,\n clearAll,\n } as const;\n}\n"],"mappings":"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"}
|
package/dist/nativewind-env.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export { };
|