@contractspec/lib.presentation-runtime-react-native 11.0.0 → 12.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.
@@ -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 "react";
2
- import { DefaultValues, Resolver, UseFormReturn } from "react-hook-form";
3
- import { ListFetcher, ListState } from "@contractspec/lib.presentation-runtime-core";
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
- defaults,
32
- form: formOpts,
33
- toVariables,
34
- fetcher,
35
- toChips,
36
- useUrlState,
37
- replace
38
- }: UsePresentationControllerOpts<TFilters, TVars, TItem>): {
39
- readonly form: UseFormReturn<TFilters>;
40
- readonly url: {
41
- state: ListState<TFilters>;
42
- setState: (next: Partial<ListState<TFilters>>) => void;
43
- setFilter: (key: keyof TFilters, value: TFilters[keyof TFilters] | null) => void;
44
- clearFilters: () => void;
45
- };
46
- readonly variables: TVars;
47
- readonly data: TItem[];
48
- readonly loading: boolean;
49
- readonly error: unknown;
50
- readonly totalItems: number | undefined;
51
- readonly totalPages: number | undefined;
52
- readonly refetch: () => Promise<void>;
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
- defaults,
87
- form: formOpts,
88
- toVariables,
89
- toChips,
90
- useUrlState,
91
- replace
92
- }: UseListCoordinatorOpts<TFilters, TVars>): {
93
- readonly form: UseFormReturn<TFilters>;
94
- readonly url: {
95
- state: ListState<TFilters>;
96
- setState: (next: Partial<ListState<TFilters>>) => void;
97
- setFilter: (key: keyof TFilters, value: TFilters[keyof TFilters] | null) => void;
98
- clearFilters: () => void;
99
- };
100
- readonly variables: TVars;
101
- readonly chips: {
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
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../src/index.ts"],"mappings":";;;;;UASiB,6BAAA,kBACE,MAAA;EAIjB,QAAA,EAAU,SAAA,CAAU,QAAA;EACpB,IAAA;IACE,aAAA,EAAe,aAAA,CAAc,QAAA;IAC7B,QAAA,GAAW,QAAA,CAAS,QAAA;EAAA;EAEtB,WAAA,GAAc,KAAA,EAAO,SAAA,CAAU,QAAA,MAAc,KAAA;EAC7C,OAAA,EAAS,WAAA,CAAY,KAAA,EAAO,KAAA;EAC5B,OAAA,IACE,OAAA,EAAS,QAAA,EACT,SAAA,GACE,GAAA,QAAW,QAAA,EACX,KAAA,EAAO,QAAA,OAAe,QAAA;IAEnB,GAAA;IAAa,KAAA,EAAO,KAAA,CAAM,SAAA;IAAW,QAAA;EAAA;EAC5C,WAAA,GAAc,IAAA;IAAQ,QAAA,EAAU,SAAA,CAAU,QAAA;IAAW,OAAA;EAAA;IACnD,KAAA,EAAO,SAAA,CAAU,QAAA;IACjB,QAAA,GAAW,IAAA,EAAM,OAAA,CAAQ,SAAA,CAAU,QAAA;IACnC,SAAA,GACE,GAAA,QAAW,QAAA,EACX,KAAA,EAAO,QAAA,OAAe,QAAA;IAExB,YAAA;EAAA;EAEF,OAAA;AAAA;AAAA,iBAGc,yBAAA,kBACG,MAAA,gCAAA,CAAA;EAIjB,QAAA;EACA,IAAA,EAAM,QAAA;EACN,WAAA;EACA,OAAA;EACA,OAAA;EACA,WAAA;EACA;AAAA,GACC,6BAAA,CAA8B,QAAA,EAAU,KAAA,EAAO,KAAA;EAAA,eAsEhC,aAAA,CAAc,QAAA;EAAA;;;;;;;;;;;;;;;WA/FH,KAAA,CAAM,SAAA;;;;;;;UA+GlB,sBAAA,kBACE,MAAA;EAGjB,QAAA,EAAU,SAAA,CAAU,QAAA;EACpB,IAAA;IACE,aAAA,EAAe,aAAA,CAAc,QAAA;IAC7B,QAAA,GAAW,QAAA,CAAS,QAAA;EAAA;EAEtB,WAAA,GAAc,KAAA,EAAO,SAAA,CAAU,QAAA,MAAc,KAAA;EAC7C,OAAA,IACE,OAAA,EAAS,QAAA,EACT,SAAA,GACE,GAAA,QAAW,QAAA,EACX,KAAA,EAAO,QAAA,OAAe,QAAA;IAEnB,GAAA;IAAa,KAAA,EAAO,KAAA,CAAM,SAAA;IAAW,QAAA;EAAA;EAC5C,WAAA,GAAc,IAAA;IAAQ,QAAA,EAAU,SAAA,CAAU,QAAA;IAAW,OAAA;EAAA;IACnD,KAAA,EAAO,SAAA,CAAU,QAAA;IACjB,QAAA,GAAW,IAAA,EAAM,OAAA,CAAQ,SAAA,CAAU,QAAA;IACnC,SAAA,GACE,GAAA,QAAW,QAAA,EACX,KAAA,EAAO,QAAA,OAAe,QAAA;IAExB,YAAA;EAAA;EAEF,OAAA;AAAA;AAAA,iBAGc,kBAAA,kBACG,MAAA,yBAAA,CAAA;EAGjB,QAAA;EACA,IAAA,EAAM,QAAA;EACN,WAAA;EACA,OAAA;EACA,WAAA;EACA;AAAA,GACC,sBAAA,CAAuB,QAAA,EAAU,KAAA;EAAA,eAyClB,aAAA,CAAc,QAAA;EAAA;;;;;;;;;WAhEH,KAAA,CAAM,SAAA"}
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
- //#region src/index.ts
5
- function usePresentationController({ defaults, form: formOpts, toVariables, fetcher, toChips, useUrlState, replace }) {
6
- const url = useUrlState({
7
- defaults,
8
- replace
9
- });
10
- const form = useForm({
11
- defaultValues: formOpts.defaultValues,
12
- resolver: formOpts.resolver
13
- });
14
- React.useEffect(() => {
15
- form.reset({
16
- ...form.getValues(),
17
- ...url.state.filters
18
- });
19
- }, [url.state.filters]);
20
- const submitFilters = form.handleSubmit((values) => {
21
- url.setState({
22
- filters: values,
23
- page: 1
24
- });
25
- });
26
- const setSearch = React.useCallback((q) => url.setState({
27
- q,
28
- page: 1
29
- }), [url]);
30
- const variables = React.useMemo(() => toVariables(url.state), [url.state, toVariables]);
31
- const [data, setData] = React.useState([]);
32
- const [loading, setLoading] = React.useState(false);
33
- const [error, setError] = React.useState(null);
34
- const [totalItems, setTotalItems] = React.useState(void 0);
35
- const [totalPages, setTotalPages] = React.useState(void 0);
36
- const refetch = React.useCallback(async () => {
37
- setLoading(true);
38
- setError(null);
39
- try {
40
- const out = await fetcher(variables);
41
- setData(out.items);
42
- setTotalItems(out.totalItems);
43
- setTotalPages(out.totalPages);
44
- } catch (e) {
45
- setError(e);
46
- } finally {
47
- setLoading(false);
48
- }
49
- }, [variables, fetcher]);
50
- React.useEffect(() => {
51
- refetch();
52
- }, [refetch]);
53
- return {
54
- form,
55
- url,
56
- variables,
57
- data,
58
- loading,
59
- error,
60
- totalItems,
61
- totalPages,
62
- refetch,
63
- chips: React.useMemo(() => toChips ? toChips(url.state.filters || {}, url.setFilter) : [], [url.state.filters, toChips]),
64
- setSearch,
65
- submitFilters,
66
- clearAll: React.useCallback(() => {
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({ defaults, form: formOpts, toVariables, toChips, useUrlState, replace }) {
80
- const url = useUrlState({
81
- defaults,
82
- replace
83
- });
84
- const form = useForm({
85
- defaultValues: formOpts.defaultValues,
86
- resolver: formOpts.resolver
87
- });
88
- React.useEffect(() => {
89
- form.reset({
90
- ...form.getValues(),
91
- ...url.state.filters
92
- });
93
- }, [url.state.filters]);
94
- const submitFilters = form.handleSubmit((values) => {
95
- url.setState({
96
- filters: values,
97
- page: 1
98
- });
99
- });
100
- const setSearch = React.useCallback((q) => url.setState({
101
- q,
102
- page: 1
103
- }), [url]);
104
- return {
105
- form,
106
- url,
107
- variables: React.useMemo(() => toVariables(url.state), [url.state, toVariables]),
108
- chips: React.useMemo(() => toChips ? toChips(url.state.filters || {}, url.setFilter) : [], [url.state.filters, toChips]),
109
- setSearch,
110
- submitFilters,
111
- clearAll: React.useCallback(() => {
112
- form.reset(formOpts.defaultValues);
113
- url.setState({
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
- //#endregion
126
- export { useListCoordinator, usePresentationController };
127
- //# sourceMappingURL=index.js.map
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": "11.0.0",
3
+ "version": "12.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/nativewind-env.d.ts",
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:types && bun build:bundle",
21
- "build:bundle": "tsdown",
22
- "build:types": "tsc --noEmit -p tsconfig.json",
23
- "dev": "bun run build:bundle --watch",
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.57.0"
35
+ "@contractspec/lib.presentation-runtime-core": "1.58.0"
34
36
  },
35
37
  "dependencies": {
36
- "@contractspec/lib.presentation-runtime-core": "1.57.0",
37
- "@contractspec/lib.ui-kit": "1.57.0"
38
+ "@contractspec/lib.presentation-runtime-core": "1.58.0",
39
+ "@contractspec/lib.ui-kit": "1.58.0"
38
40
  },
39
41
  "files": [
40
42
  "dist",
41
43
  "README.md"
42
44
  ],
43
45
  "exports": {
44
- ".": "./dist/index.js",
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
- ".": "./dist/index.js",
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.57.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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"}
@@ -1 +0,0 @@
1
- export { };