@lssm/lib.presentation-runtime-react-native 0.0.0-canary-20251220002821 → 0.0.0-canary-20251220021406

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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../src/index.ts"],"sourcesContent":[],"mappings":";;;;;UAQiB,+CACE;YAIP,UAAU;EALL,IAAA,EAAA;IACE,aAAA,EAMA,aANA,CAMc,QANd,CAAA;IAIG,QAAA,CAAA,EAGP,QAHO,CAGE,QAHF,CAAA;EAAV,CAAA;EAEqB,WAAA,EAAA,CAAA,KAAA,EAGV,SAHU,CAGA,QAHA,CAAA,EAAA,GAGc,KAHd;EAAd,OAAA,EAIR,WAJQ,CAII,KAJJ,EAIW,KAJX,CAAA;EACK,OAAA,CAAA,EAAA,CAAA,OAAA,EAKX,QALW,EAAA,SAAA,EAAA,CAAA,GAAA,EAAA,MAOP,QAPO,EAAA,KAAA,EAQX,QARW,CAAA,MAQI,QARJ,CAAA,GAAA,IAAA,EAAA,GAAA,IAAA,EAAA,GAAA;IAAT,GAAA,EAAA,MAAA;IAEkB,KAAA,EAQJ,KAAA,CAAM,SARF;IAAV,QAAA,CAAA,EAAA,GAAA,GAAA,IAAA;EAAwB,CAAA,EAAA;EACxB,WAAA,EAAA,CAAA,IAAA,EAAA;IAAO,QAAA,EAQI,SARJ,CAQc,QARd,CAAA;IAAnB,OAAA,CAAA,EAAA,OAAA;EAEE,CAAA,EAAA,GAAA;IAEI,KAAA,EAKN,SALM,CAKI,QALJ,CAAA;IACJ,QAAA,EAAA,CAAA,IAAA,EAKQ,OALR,CAKgB,SALhB,CAK0B,QAL1B,CAAA,CAAA,EAAA,GAAA,IAAA;IAAe,SAAA,EAAA,CAAA,GAAA,EAAA,MAOX,QAPW,EAAA,KAAA,EAQf,QARe,CAAA,MAQA,QARA,CAAA,GAAA,IAAA,EAAA,GAAA,IAAA;IAEO,YAAA,EAAA,GAAA,GAAA,IAAA;EACS,CAAA;EAAV,OAAA,CAAA,EAAA,OAAA;;AACvB,iBAWK,yBAXL,CAAA,iBAYQ,MAZR,CAAA,MAAA,EAAA,OAAA,CAAA,EAAA,KAAA,EAAA,KAAA,CAAA,CAAA;EAAA,QAAA;EAAA,IAAA,EAiBH,QAjBG;EAAA,WAAA;EAAA,OAAA;EAAA,OAAA;EAAA,WAAA;EAAA;AAAA,CAAA,EAuBR,6BAvBQ,CAuBsB,QAvBtB,EAuBgC,KAvBhC,EAuBuC,KAvBvC,CAAA,CAAA,EAAA;EAC4B,SAAA,IAAA,EA8FrB,aA9FqB,CA8FP,QA9FO,CAAA;EAAV,SAAA,GAAA,EAAA;IAAR,KAAA,WAAA,SAAA,CAAA;IAEJ,QAAA,EAAA,CAAA,IAAA,SAAA,UAAA,SAAA,CAAA,CAAA,EAAA,GAAA,IAAA;IACJ,SAAA,EAAA,CAAA,GAAA,EAAA,cAAA,EAAA,KAAA,UAAA,CAAA,cAAA,CAAA,GAAA,IAAA,EAAA,GAAA,IAAA;IAAe,YAAA,EAAA,GAAA,GAAA,IAAA;EAAQ,CAAA;EAOpB,SAAA,SAAA,OAAA;EACG,SAAA,IAAA,OAAA,EAAA;EAIjB,SAAA,OAAA,EAAA,OAAA;EACM,SAAA,KAAA,EAAA,OAAA;EACN,SAAA,UAAA,EAAA,MAAA,GAAA,SAAA;EACA,SAAA,UAAA,EAAA,MAAA,GAAA,SAAA;EACA,SAAA,OAAA,EAAA,GAAA,UAAA,CAAA,IAAA,CAAA;EACA,SAAA,KAAA,EAAA;IACA,GAAA,EAAA,MAAA;IAC+B,KAAA,EAzBJ,KAAA,CAAM,SAyBF;IAAU,QAAA,CAAA,EAAA,GAAA,GAAA,IAAA;EAAO,CAAA,EAAA;EAA/C,SAAA,SAAA,EAAA,CAAA,CAAA,EAAA,MAAA,EAAA,GAAA,IAAA;EAwE6B,SAAA,aAAA,EAAA,CAAA,CAAA,CAAA,0BAAA,EAAA,UAAA,CAAA,IAAA,CAAA;EAAd,SAAA,QAAA,EAAA,GAAA,GAAA,IAAA;;UAgBD,wCACE;YAGP,UAAU;;mBAEH,cAAc;eAClB,SAAS;;uBAED,UAAU,cAAc;sBAElC,iCAEI,iBACJ,eAAe;;WAEC,KAAA,CAAM;IAjIA,QAAA,CAAA,EAAA,GAAA,GAAA,IAAA;;;cAkID,UAAU;IAjB3B,OAAA,CAAA,EAAA,OAAA;EACE,CAAA,EAAA,GAAA;IAGG,KAAA,EAcX,SAdW,CAcD,QAdC,CAAA;IAAV,QAAA,EAAA,CAAA,IAAA,EAeS,OAfT,CAeiB,SAfjB,CAe2B,QAf3B,CAAA,CAAA,EAAA,GAAA,IAAA;IAEqB,SAAA,EAAA,CAAA,GAAA,EAAA,MAehB,QAfgB,EAAA,KAAA,EAgBpB,QAhBoB,CAAA,MAgBL,QAhBK,CAAA,GAAA,IAAA,EAAA,GAAA,IAAA;IAAd,YAAA,EAAA,GAAA,GAAA,IAAA;EACK,CAAA;EAAT,OAAA,CAAA,EAAA,OAAA;;AAEQ,iBAoBP,kBApBO,CAAA,iBAqBJ,MArBI,CAAA,MAAA,EAAA,OAAA,CAAA,EAAA,KAAA,CAAA,CAAA;EAAA,QAAA;EAAA,IAAA,EAyBf,QAzBe;EAAA,WAAA;EAAA,OAAA;EAAA,WAAA;EAAA;AAAA,CAAA,EA8BpB,sBA9BoB,CA8BG,QA9BH,EA8Ba,KA9Bb,CAAA,CAAA,EAAA;EAAwB,SAAA,IAAA,EAyE7B,aAzE6B,CAyEf,QAzEe,CAAA;EAElC,SAAA,GAAA,EAAA;IAEI,KAAA,WAAA,SAAA,CAAA;IACJ,QAAA,EAAA,CAAA,IAAA,SAAA,UAAA,SAAA,CAAA,CAAA,EAAA,GAAA,IAAA;IAAe,SAAA,EAAA,CAAA,GAAA,EAAA,cAAA,EAAA,KAAA,UAAA,CAAA,cAAA,CAAA,GAAA,IAAA,EAAA,GAAA,IAAA;IAEO,YAAA,EAAA,GAAA,GAAA,IAAA;EACS,CAAA;EAAV,SAAA,SAAA,OAAA;EACb,SAAA,KAAA,EAAA;IAAV,GAAA,EAAA,MAAA;IAC4B,KAAA,EAHV,KAAA,CAAM,SAGI;IAAV,QAAA,CAAA,EAAA,GAAA,GAAA,IAAA;EAAR,CAAA,EAAA;EAEJ,SAAA,SAAA,EAAA,CAAA,CAAA,EAAA,MAAA,EAAA,GAAA,IAAA;EACJ,SAAA,aAAA,EAAA,CAAA,CAAA,CAAA,0BAAA,EAAA,UAAA,CAAA,IAAA,CAAA;EAAe,SAAA,QAAA,EAAA,GAAA,GAAA,IAAA;CAAQ"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../src/index.ts"],"sourcesContent":[],"mappings":"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"}
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../src/index.ts"],"sourcesContent":["import * as React from 'react';\nimport type { DefaultValues, Resolver, UseFormReturn } from 'react-hook-form';\nimport { useForm } from '@lssm/lib.ui-kit/ui/form';\nimport type {\n ListFetcher,\n ListState,\n} from '@lssm/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 // eslint-disable-next-line react-hooks/exhaustive-deps\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 // eslint-disable-next-line react-hooks/exhaustive-deps\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 // eslint-disable-next-line react-hooks/exhaustive-deps\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 // eslint-disable-next-line react-hooks/exhaustive-deps\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
+ {"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 '@lssm/lib.ui-kit/ui/form';\nimport type {\n ListFetcher,\n ListState,\n} from '@lssm/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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lssm/lib.presentation-runtime-react-native",
3
- "version": "0.0.0-canary-20251220002821",
3
+ "version": "0.0.0-canary-20251220021406",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.js",
@@ -22,11 +22,11 @@
22
22
  "react-native": "*",
23
23
  "react-hook-form": "^7.68.0",
24
24
  "zod": "^4.1.13",
25
- "@lssm/lib.presentation-runtime-core": "0.0.0-canary-20251220002821"
25
+ "@lssm/lib.presentation-runtime-core": "0.0.0-canary-20251220021406"
26
26
  },
27
27
  "dependencies": {
28
- "@lssm/lib.presentation-runtime-core": "0.0.0-canary-20251220002821",
29
- "@lssm/lib.ui-kit": "0.0.0-canary-20251220002821"
28
+ "@lssm/lib.presentation-runtime-core": "0.0.0-canary-20251220021406",
29
+ "@lssm/lib.ui-kit": "0.0.0-canary-20251220021406"
30
30
  },
31
31
  "files": [
32
32
  "dist",