diff --git a/packages/double-server-number/package.json b/packages/double-server-number/package.json index f93d973..6700a21 100644 --- a/packages/double-server-number/package.json +++ b/packages/double-server-number/package.json @@ -11,9 +11,12 @@ "exports": { ".": { "types": "./dist/index.d.mjs", - "react-server": "./dist/index.mjs", "default": "./src/index.ts" }, + "./rsc": { + "types": "./dist/rsc.d.mjs", + "default": "./src/rsc.ts" + }, "./package.json": "./package.json" }, "peerDependencies": { diff --git a/packages/double-server-number/src/action-provider.tsx b/packages/double-server-number/src/action-provider.tsx new file mode 100644 index 0000000..c219e16 --- /dev/null +++ b/packages/double-server-number/src/action-provider.tsx @@ -0,0 +1,32 @@ +import { resolveNumberFilePath } from "./storage"; +import { submitDoubleServerNumber } from "./action"; + +interface DoubleServerNumberActionProviderProps { + description?: string; + filePath?: string; + fieldName?: string; + children?: (action: (formData: FormData) => Promise) => React.ReactNode; +} + +async function DoubleServerNumberActionProvider({ + description = "A shared React Server Component that persists a number to a local text file and doubles it through a `use server` action.", + filePath, + children, + fieldName = "value", +}: DoubleServerNumberActionProviderProps) { + const resolvedFilePath = resolveNumberFilePath(filePath); + + const action = async (formData: FormData) => { + "use server"; + + void submitDoubleServerNumber( + { filePath: resolvedFilePath, fieldName }, + formData, + ); + }; + + return children ? children(action) : null; +} + +export type { DoubleServerNumberActionProviderProps }; +export { DoubleServerNumberActionProvider }; diff --git a/packages/double-server-number/src/double-server-number.tsx b/packages/double-server-number/src/double-server-number.tsx index 059221d..129b40a 100644 --- a/packages/double-server-number/src/double-server-number.tsx +++ b/packages/double-server-number/src/double-server-number.tsx @@ -1,11 +1,8 @@ -import path from "node:path"; - import { readPersistedNumber, resolveNumberFilePath } from "./storage"; import { DoubleServerNumberValue } from "./value"; import { DoubleServerNumberForm } from "./form"; -import { styles } from "./styles"; -import { submitDoubleServerNumber } from "./action"; import { DoubleServerNumberShell } from "./shell"; +import { DoubleServerNumberActionProvider } from "./action-provider"; interface DoubleServerNumberProps { title?: string; @@ -23,26 +20,21 @@ async function DoubleServerNumber({ const resolvedFilePath = resolveNumberFilePath(filePath); const persistedNumber = await readPersistedNumber(resolvedFilePath); - const action = async (formData: FormData) => { - "use server"; - - void submitDoubleServerNumber( - { filePath: resolvedFilePath, fieldName }, - formData, - ); - }; - return ( - - - - - + + {(action) => ( + + + + + + )} + ); } diff --git a/packages/double-server-number/src/form.tsx b/packages/double-server-number/src/form.tsx index 3992639..da2f338 100644 --- a/packages/double-server-number/src/form.tsx +++ b/packages/double-server-number/src/form.tsx @@ -33,4 +33,5 @@ function DoubleServerNumberForm({ ); } +export type { DoubleServerNumberFormProps }; export { DoubleServerNumberForm }; diff --git a/packages/double-server-number/src/index.ts b/packages/double-server-number/src/index.ts index cf42911..0b3c26f 100644 --- a/packages/double-server-number/src/index.ts +++ b/packages/double-server-number/src/index.ts @@ -1,4 +1,3 @@ -import "server-only"; +export type { DoubleServerNumberFormProps } from "./form"; -export type { DoubleServerNumberProps } from "./double-server-number"; -export { DoubleServerNumber } from "./double-server-number"; +export { DoubleServerNumberForm } from "./form"; diff --git a/packages/double-server-number/src/rsc.ts b/packages/double-server-number/src/rsc.ts new file mode 100644 index 0000000..80e13f8 --- /dev/null +++ b/packages/double-server-number/src/rsc.ts @@ -0,0 +1,12 @@ +import "server-only"; + +export type { DoubleServerNumberActionProviderProps } from "./action-provider"; +export type { DoubleServerNumberShellProps } from "./shell"; +export type { DoubleServerNumberValueProps } from "./value"; +export type { DoubleServerNumberProps } from "./double-server-number"; + +export { submitDoubleServerNumber } from "./action"; +export { DoubleServerNumberActionProvider } from "./action-provider"; +export { DoubleServerNumberShell } from "./shell"; +export { DoubleServerNumberValue } from "./value"; +export { DoubleServerNumber } from "./double-server-number"; diff --git a/packages/double-server-number/tsdown.config.ts b/packages/double-server-number/tsdown.config.ts index 08b6ae5..2dceed7 100644 --- a/packages/double-server-number/tsdown.config.ts +++ b/packages/double-server-number/tsdown.config.ts @@ -1,5 +1,5 @@ import { defineConfig } from "tsdown"; export default defineConfig({ - entry: "src/index.ts", + entry: ["src/index.ts", "src/rsc.ts"], });