@molecule/app-solid 1.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/LICENSE +115 -0
- package/README.md +2543 -0
- package/dist/context.d.ts +82 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +141 -0
- package/dist/context.js.map +1 -0
- package/dist/index.d.ts +61 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +61 -0
- package/dist/index.js.map +1 -0
- package/dist/primitives/async-state.d.ts +46 -0
- package/dist/primitives/async-state.d.ts.map +1 -0
- package/dist/primitives/async-state.js +83 -0
- package/dist/primitives/async-state.js.map +1 -0
- package/dist/primitives/auth.d.ts +85 -0
- package/dist/primitives/auth.d.ts.map +1 -0
- package/dist/primitives/auth.js +147 -0
- package/dist/primitives/auth.js.map +1 -0
- package/dist/primitives/capacitor-app.d.ts +46 -0
- package/dist/primitives/capacitor-app.d.ts.map +1 -0
- package/dist/primitives/capacitor-app.js +57 -0
- package/dist/primitives/capacitor-app.js.map +1 -0
- package/dist/primitives/change-password.d.ts +36 -0
- package/dist/primitives/change-password.d.ts.map +1 -0
- package/dist/primitives/change-password.js +32 -0
- package/dist/primitives/change-password.js.map +1 -0
- package/dist/primitives/device.d.ts +48 -0
- package/dist/primitives/device.d.ts.map +1 -0
- package/dist/primitives/device.js +47 -0
- package/dist/primitives/device.js.map +1 -0
- package/dist/primitives/forms.d.ts +193 -0
- package/dist/primitives/forms.d.ts.map +1 -0
- package/dist/primitives/forms.js +309 -0
- package/dist/primitives/forms.js.map +1 -0
- package/dist/primitives/http.d.ts +176 -0
- package/dist/primitives/http.d.ts.map +1 -0
- package/dist/primitives/http.js +254 -0
- package/dist/primitives/http.js.map +1 -0
- package/dist/primitives/i18n.d.ts +146 -0
- package/dist/primitives/i18n.d.ts.map +1 -0
- package/dist/primitives/i18n.js +223 -0
- package/dist/primitives/i18n.js.map +1 -0
- package/dist/primitives/index.d.ts +27 -0
- package/dist/primitives/index.d.ts.map +1 -0
- package/dist/primitives/index.js +27 -0
- package/dist/primitives/index.js.map +1 -0
- package/dist/primitives/logger.d.ts +143 -0
- package/dist/primitives/logger.d.ts.map +1 -0
- package/dist/primitives/logger.js +165 -0
- package/dist/primitives/logger.js.map +1 -0
- package/dist/primitives/login.d.ts +37 -0
- package/dist/primitives/login.d.ts.map +1 -0
- package/dist/primitives/login.js +32 -0
- package/dist/primitives/login.js.map +1 -0
- package/dist/primitives/oauth.d.ts +102 -0
- package/dist/primitives/oauth.d.ts.map +1 -0
- package/dist/primitives/oauth.js +232 -0
- package/dist/primitives/oauth.js.map +1 -0
- package/dist/primitives/password-reset.d.ts +46 -0
- package/dist/primitives/password-reset.d.ts.map +1 -0
- package/dist/primitives/password-reset.js +49 -0
- package/dist/primitives/password-reset.js.map +1 -0
- package/dist/primitives/platform.d.ts +48 -0
- package/dist/primitives/platform.d.ts.map +1 -0
- package/dist/primitives/platform.js +47 -0
- package/dist/primitives/platform.js.map +1 -0
- package/dist/primitives/promise.d.ts +46 -0
- package/dist/primitives/promise.d.ts.map +1 -0
- package/dist/primitives/promise.js +104 -0
- package/dist/primitives/promise.js.map +1 -0
- package/dist/primitives/push.d.ts +52 -0
- package/dist/primitives/push.d.ts.map +1 -0
- package/dist/primitives/push.js +72 -0
- package/dist/primitives/push.js.map +1 -0
- package/dist/primitives/router.d.ts +170 -0
- package/dist/primitives/router.d.ts.map +1 -0
- package/dist/primitives/router.js +251 -0
- package/dist/primitives/router.js.map +1 -0
- package/dist/primitives/signup.d.ts +37 -0
- package/dist/primitives/signup.d.ts.map +1 -0
- package/dist/primitives/signup.js +32 -0
- package/dist/primitives/signup.js.map +1 -0
- package/dist/primitives/state.d.ts +132 -0
- package/dist/primitives/state.d.ts.map +1 -0
- package/dist/primitives/state.js +167 -0
- package/dist/primitives/state.js.map +1 -0
- package/dist/primitives/storage.d.ts +132 -0
- package/dist/primitives/storage.d.ts.map +1 -0
- package/dist/primitives/storage.js +275 -0
- package/dist/primitives/storage.js.map +1 -0
- package/dist/primitives/theme.d.ts +106 -0
- package/dist/primitives/theme.d.ts.map +1 -0
- package/dist/primitives/theme.js +187 -0
- package/dist/primitives/theme.js.map +1 -0
- package/dist/primitives/version.d.ts +50 -0
- package/dist/primitives/version.d.ts.map +1 -0
- package/dist/primitives/version.js +62 -0
- package/dist/primitives/version.js.map +1 -0
- package/dist/provider.d.ts +36 -0
- package/dist/provider.d.ts.map +1 -0
- package/dist/provider.jsx +71 -0
- package/dist/provider.jsx.map +1 -0
- package/dist/types.d.ts +82 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +7 -0
- package/dist/types.js.map +1 -0
- package/package.json +58 -0
|
@@ -0,0 +1,309 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Solid.js primitives for form handling.
|
|
3
|
+
*
|
|
4
|
+
* @module
|
|
5
|
+
*/
|
|
6
|
+
import { createEffect, createSignal, onCleanup } from 'solid-js';
|
|
7
|
+
/**
|
|
8
|
+
* Create form primitives for form state management and validation.
|
|
9
|
+
*
|
|
10
|
+
* @param provider - Form provider that creates controllers
|
|
11
|
+
* @param options - Form configuration options
|
|
12
|
+
* @returns Form primitives object
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```tsx
|
|
16
|
+
* import { createForm } from '@molecule/app-solid'
|
|
17
|
+
* import { createNativeFormProvider } from '@molecule/app-forms'
|
|
18
|
+
*
|
|
19
|
+
* const provider = createNativeFormProvider()
|
|
20
|
+
*
|
|
21
|
+
* function LoginForm() {
|
|
22
|
+
* const { register, handleSubmit, formState, isSubmitting, errors } = createForm(provider, {
|
|
23
|
+
* defaultValues: { email: '', password: '' },
|
|
24
|
+
* })
|
|
25
|
+
*
|
|
26
|
+
* const onSubmit = async (values: { email: string; password: string }) => {
|
|
27
|
+
* await login(values)
|
|
28
|
+
* }
|
|
29
|
+
*
|
|
30
|
+
* return (
|
|
31
|
+
* <form onSubmit={handleSubmit(onSubmit)}>
|
|
32
|
+
* <input {...register('email', { required: true, email: true })} />
|
|
33
|
+
* <Show when={errors().email}>
|
|
34
|
+
* <span>{errors().email}</span>
|
|
35
|
+
* </Show>
|
|
36
|
+
*
|
|
37
|
+
* <input {...register('password', { required: true, minLength: 8 })} type="password" />
|
|
38
|
+
* <Show when={errors().password}>
|
|
39
|
+
* <span>{errors().password}</span>
|
|
40
|
+
* </Show>
|
|
41
|
+
*
|
|
42
|
+
* <button type="submit" disabled={isSubmitting()}>
|
|
43
|
+
* {isSubmitting() ? 'Logging in...' : 'Log In'}
|
|
44
|
+
* </button>
|
|
45
|
+
* </form>
|
|
46
|
+
* )
|
|
47
|
+
* }
|
|
48
|
+
* ```
|
|
49
|
+
*/
|
|
50
|
+
export function createForm(provider, options) {
|
|
51
|
+
const controller = provider.createForm(options);
|
|
52
|
+
const [formState, setFormState] = createSignal(controller.getState());
|
|
53
|
+
// Subscribe to form state changes
|
|
54
|
+
createEffect(() => {
|
|
55
|
+
const unsubscribe = controller.subscribe((newState) => {
|
|
56
|
+
setFormState(newState);
|
|
57
|
+
});
|
|
58
|
+
onCleanup(() => {
|
|
59
|
+
unsubscribe();
|
|
60
|
+
controller.destroy();
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
// Derived accessors
|
|
64
|
+
const isValid = () => formState().isValid;
|
|
65
|
+
const isDirty = () => formState().isDirty;
|
|
66
|
+
const isSubmitting = () => formState().isSubmitting;
|
|
67
|
+
const errors = () => formState().errors;
|
|
68
|
+
const register = (name, registerOptions) => {
|
|
69
|
+
return controller.register({ ...registerOptions, name: name });
|
|
70
|
+
};
|
|
71
|
+
const getValue = (name) => {
|
|
72
|
+
return controller.getValue(name);
|
|
73
|
+
};
|
|
74
|
+
const setValue = (name, value) => {
|
|
75
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
76
|
+
controller.setValue(name, value);
|
|
77
|
+
};
|
|
78
|
+
const getError = (name) => {
|
|
79
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
80
|
+
return controller.getError(name);
|
|
81
|
+
};
|
|
82
|
+
const setError = (name, error) => {
|
|
83
|
+
if (error !== undefined) {
|
|
84
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
85
|
+
controller.setError(name, error);
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
controller.clearError(name);
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
const clearErrors = () => {
|
|
92
|
+
controller.clearErrors();
|
|
93
|
+
};
|
|
94
|
+
const handleSubmit = (onSubmit) => {
|
|
95
|
+
return controller.handleSubmit(onSubmit);
|
|
96
|
+
};
|
|
97
|
+
const reset = (values) => {
|
|
98
|
+
controller.reset(values);
|
|
99
|
+
};
|
|
100
|
+
const validate = () => {
|
|
101
|
+
return controller.validate();
|
|
102
|
+
};
|
|
103
|
+
return {
|
|
104
|
+
formState,
|
|
105
|
+
isValid,
|
|
106
|
+
isDirty,
|
|
107
|
+
isSubmitting,
|
|
108
|
+
errors,
|
|
109
|
+
register,
|
|
110
|
+
getValue,
|
|
111
|
+
setValue,
|
|
112
|
+
getError,
|
|
113
|
+
setError,
|
|
114
|
+
clearErrors,
|
|
115
|
+
handleSubmit,
|
|
116
|
+
reset,
|
|
117
|
+
validate,
|
|
118
|
+
controller,
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Create a reactive accessor for a single field's state.
|
|
123
|
+
*
|
|
124
|
+
* @param controller - Form controller
|
|
125
|
+
* @param name - Field name to track
|
|
126
|
+
* @returns Accessor for the field state
|
|
127
|
+
*
|
|
128
|
+
* @example
|
|
129
|
+
* ```tsx
|
|
130
|
+
* function EmailField(props: { controller: FormController<LoginValues> }) {
|
|
131
|
+
* const fieldState = createFieldSignal(props.controller, 'email')
|
|
132
|
+
*
|
|
133
|
+
* return (
|
|
134
|
+
* <div>
|
|
135
|
+
* <input value={fieldState().value as string} />
|
|
136
|
+
* <Show when={fieldState().error}>
|
|
137
|
+
* <span class="error">{fieldState().error}</span>
|
|
138
|
+
* </Show>
|
|
139
|
+
* <Show when={fieldState().touched && !fieldState().valid}>
|
|
140
|
+
* <span class="invalid">Invalid</span>
|
|
141
|
+
* </Show>
|
|
142
|
+
* </div>
|
|
143
|
+
* )
|
|
144
|
+
* }
|
|
145
|
+
* ```
|
|
146
|
+
*/
|
|
147
|
+
export function createFieldSignal(controller, name) {
|
|
148
|
+
const [fieldState, setFieldState] = createSignal(controller.getFieldState(name));
|
|
149
|
+
createEffect(() => {
|
|
150
|
+
const unsubscribe = controller.subscribe(() => {
|
|
151
|
+
setFieldState(controller.getFieldState(name));
|
|
152
|
+
});
|
|
153
|
+
onCleanup(unsubscribe);
|
|
154
|
+
});
|
|
155
|
+
return fieldState;
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Create a reactive accessor that tracks a single field's value.
|
|
159
|
+
*
|
|
160
|
+
* @param controller - Form controller
|
|
161
|
+
* @param name - Field name to watch
|
|
162
|
+
* @returns Accessor for the field value
|
|
163
|
+
*
|
|
164
|
+
* @example
|
|
165
|
+
* ```tsx
|
|
166
|
+
* function PasswordStrength(props: { controller: FormController<SignUpValues> }) {
|
|
167
|
+
* const password = createWatchSignal(props.controller, 'password')
|
|
168
|
+
*
|
|
169
|
+
* const strength = () => {
|
|
170
|
+
* const val = password()
|
|
171
|
+
* if (!val || (val as string).length < 4) return 'weak'
|
|
172
|
+
* if ((val as string).length < 8) return 'medium'
|
|
173
|
+
* return 'strong'
|
|
174
|
+
* }
|
|
175
|
+
*
|
|
176
|
+
* return <div class={`strength-${strength()}`}>Password: {strength()}</div>
|
|
177
|
+
* }
|
|
178
|
+
* ```
|
|
179
|
+
*/
|
|
180
|
+
export function createWatchSignal(controller, name) {
|
|
181
|
+
const [value, setValue] = createSignal(controller.getValue(name));
|
|
182
|
+
createEffect(() => {
|
|
183
|
+
const unsubscribe = controller.subscribe(() => {
|
|
184
|
+
setValue(() => controller.getValue(name));
|
|
185
|
+
});
|
|
186
|
+
onCleanup(unsubscribe);
|
|
187
|
+
});
|
|
188
|
+
return value;
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Create form helpers bound to a specific form provider.
|
|
192
|
+
*
|
|
193
|
+
* Returns a factory object so you can create multiple forms from the same provider
|
|
194
|
+
* without passing it each time.
|
|
195
|
+
*
|
|
196
|
+
* @param provider - Form provider
|
|
197
|
+
* @returns Object with a bound createForm function
|
|
198
|
+
*
|
|
199
|
+
* @example
|
|
200
|
+
* ```tsx
|
|
201
|
+
* import { createFormHelpers } from '@molecule/app-solid'
|
|
202
|
+
* import { createNativeFormProvider } from '@molecule/app-forms'
|
|
203
|
+
*
|
|
204
|
+
* const { createForm } = createFormHelpers(createNativeFormProvider())
|
|
205
|
+
*
|
|
206
|
+
* function LoginForm() {
|
|
207
|
+
* const { register, handleSubmit, isSubmitting } = createForm({
|
|
208
|
+
* defaultValues: { email: '', password: '' },
|
|
209
|
+
* })
|
|
210
|
+
*
|
|
211
|
+
* // ...
|
|
212
|
+
* }
|
|
213
|
+
* ```
|
|
214
|
+
*/
|
|
215
|
+
/**
|
|
216
|
+
* Creates a form helpers.
|
|
217
|
+
* @param provider - The provider implementation.
|
|
218
|
+
* @returns The created result.
|
|
219
|
+
*/
|
|
220
|
+
export function createFormHelpers(provider) {
|
|
221
|
+
return {
|
|
222
|
+
createForm: (options) => createForm(provider, options),
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Create form primitives from an existing controller.
|
|
227
|
+
*
|
|
228
|
+
* Useful when you have a controller created externally and want to
|
|
229
|
+
* wrap it with Solid reactivity.
|
|
230
|
+
*
|
|
231
|
+
* @param controller - An existing FormController
|
|
232
|
+
* @returns Form primitives object
|
|
233
|
+
*
|
|
234
|
+
* @example
|
|
235
|
+
* ```tsx
|
|
236
|
+
* const controller = provider.createForm({ defaultValues: { name: '' } })
|
|
237
|
+
*
|
|
238
|
+
* function NameForm() {
|
|
239
|
+
* const { formState, register, handleSubmit } = createFormFromController(controller)
|
|
240
|
+
* // ...
|
|
241
|
+
* }
|
|
242
|
+
* ```
|
|
243
|
+
*/
|
|
244
|
+
export function createFormFromController(controller) {
|
|
245
|
+
const [formState, setFormState] = createSignal(controller.getState());
|
|
246
|
+
createEffect(() => {
|
|
247
|
+
const unsubscribe = controller.subscribe((newState) => {
|
|
248
|
+
setFormState(newState);
|
|
249
|
+
});
|
|
250
|
+
onCleanup(unsubscribe);
|
|
251
|
+
});
|
|
252
|
+
const isValid = () => formState().isValid;
|
|
253
|
+
const isDirty = () => formState().isDirty;
|
|
254
|
+
const isSubmitting = () => formState().isSubmitting;
|
|
255
|
+
const errors = () => formState().errors;
|
|
256
|
+
const register = (name, registerOptions) => {
|
|
257
|
+
return controller.register({ ...registerOptions, name: name });
|
|
258
|
+
};
|
|
259
|
+
const getValue = (name) => {
|
|
260
|
+
return controller.getValue(name);
|
|
261
|
+
};
|
|
262
|
+
const setValue = (name, value) => {
|
|
263
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
264
|
+
controller.setValue(name, value);
|
|
265
|
+
};
|
|
266
|
+
const getError = (name) => {
|
|
267
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
268
|
+
return controller.getError(name);
|
|
269
|
+
};
|
|
270
|
+
const setError = (name, error) => {
|
|
271
|
+
if (error !== undefined) {
|
|
272
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
273
|
+
controller.setError(name, error);
|
|
274
|
+
}
|
|
275
|
+
else {
|
|
276
|
+
controller.clearError(name);
|
|
277
|
+
}
|
|
278
|
+
};
|
|
279
|
+
const clearErrors = () => {
|
|
280
|
+
controller.clearErrors();
|
|
281
|
+
};
|
|
282
|
+
const handleSubmit = (onSubmit) => {
|
|
283
|
+
return controller.handleSubmit(onSubmit);
|
|
284
|
+
};
|
|
285
|
+
const reset = (values) => {
|
|
286
|
+
controller.reset(values);
|
|
287
|
+
};
|
|
288
|
+
const validate = () => {
|
|
289
|
+
return controller.validate();
|
|
290
|
+
};
|
|
291
|
+
return {
|
|
292
|
+
formState,
|
|
293
|
+
isValid,
|
|
294
|
+
isDirty,
|
|
295
|
+
isSubmitting,
|
|
296
|
+
errors,
|
|
297
|
+
register,
|
|
298
|
+
getValue,
|
|
299
|
+
setValue,
|
|
300
|
+
getError,
|
|
301
|
+
setError,
|
|
302
|
+
clearErrors,
|
|
303
|
+
handleSubmit,
|
|
304
|
+
reset,
|
|
305
|
+
validate,
|
|
306
|
+
controller,
|
|
307
|
+
};
|
|
308
|
+
}
|
|
309
|
+
//# sourceMappingURL=forms.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"forms.js","sourceRoot":"","sources":["../../src/primitives/forms.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Solid.js primitives for HTTP requests.
|
|
3
|
+
*
|
|
4
|
+
* @module
|
|
5
|
+
*/
|
|
6
|
+
import { type Accessor, type Resource } from 'solid-js';
|
|
7
|
+
import type { FullRequestConfig, HttpClient, HttpResponse, RequestConfig } from '@molecule/app-http';
|
|
8
|
+
/**
|
|
9
|
+
* Create HTTP primitives for making requests.
|
|
10
|
+
*
|
|
11
|
+
* @returns HTTP methods and utilities
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```tsx
|
|
15
|
+
* import { createHttp } from '@molecule/app-solid'
|
|
16
|
+
*
|
|
17
|
+
* function UserList() {
|
|
18
|
+
* const { get } = createHttp()
|
|
19
|
+
* const [users] = createResource(() => get<User[]>('/api/users'))
|
|
20
|
+
*
|
|
21
|
+
* return (
|
|
22
|
+
* <Show when={!users.loading} fallback={<Spinner />}>
|
|
23
|
+
* <For each={users()}>
|
|
24
|
+
* {(user) => <UserCard user={user} />}
|
|
25
|
+
* </For>
|
|
26
|
+
* </Show>
|
|
27
|
+
* )
|
|
28
|
+
* }
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
/**
|
|
32
|
+
* Creates a http.
|
|
33
|
+
* @returns The created result.
|
|
34
|
+
*/
|
|
35
|
+
export declare function createHttp(): {
|
|
36
|
+
get: <T>(url: string, config?: RequestConfig) => Promise<HttpResponse<T>>;
|
|
37
|
+
post: <T>(url: string, data?: unknown, config?: RequestConfig) => Promise<HttpResponse<T>>;
|
|
38
|
+
put: <T>(url: string, data?: unknown, config?: RequestConfig) => Promise<HttpResponse<T>>;
|
|
39
|
+
patch: <T>(url: string, data?: unknown, config?: RequestConfig) => Promise<HttpResponse<T>>;
|
|
40
|
+
delete: <T>(url: string, config?: RequestConfig) => Promise<HttpResponse<T>>;
|
|
41
|
+
request: <T>(config: FullRequestConfig) => Promise<HttpResponse<T>>;
|
|
42
|
+
};
|
|
43
|
+
/**
|
|
44
|
+
* Create a resource for fetching data.
|
|
45
|
+
*
|
|
46
|
+
* @param url - URL string or accessor returning a URL string.
|
|
47
|
+
* @param config - Optional request configuration.
|
|
48
|
+
* @returns Solid resource
|
|
49
|
+
*
|
|
50
|
+
* @example
|
|
51
|
+
* ```tsx
|
|
52
|
+
* function UserProfile(props: { userId: string }) {
|
|
53
|
+
* const user = useFetch<User>(() => `/api/users/${props.userId}`)
|
|
54
|
+
*
|
|
55
|
+
* return (
|
|
56
|
+
* <Show when={!user.loading} fallback={<Loading />}>
|
|
57
|
+
* <h1>{user()?.name}</h1>
|
|
58
|
+
* </Show>
|
|
59
|
+
* )
|
|
60
|
+
* }
|
|
61
|
+
* ```
|
|
62
|
+
*/
|
|
63
|
+
export declare function useFetch<T>(url: Accessor<string> | string, config?: RequestConfig): Resource<T | undefined>;
|
|
64
|
+
/**
|
|
65
|
+
* Create a mutation function.
|
|
66
|
+
*
|
|
67
|
+
* @returns Mutation function and state
|
|
68
|
+
*
|
|
69
|
+
* @example
|
|
70
|
+
* ```tsx
|
|
71
|
+
* function CreateUserForm() {
|
|
72
|
+
* const { mutate, isLoading, error } = useMutation<User>()
|
|
73
|
+
*
|
|
74
|
+
* const handleSubmit = async (data: CreateUserData) => {
|
|
75
|
+
* const user = await mutate('/api/users', data)
|
|
76
|
+
* console.log('Created:', user)
|
|
77
|
+
* }
|
|
78
|
+
*
|
|
79
|
+
* return (
|
|
80
|
+
* <form onSubmit={handleSubmit}>
|
|
81
|
+
* <Show when={error()}>
|
|
82
|
+
* <ErrorMessage error={error()} />
|
|
83
|
+
* </Show>
|
|
84
|
+
* <button type="submit" disabled={isLoading()}>
|
|
85
|
+
* Create
|
|
86
|
+
* </button>
|
|
87
|
+
* </form>
|
|
88
|
+
* )
|
|
89
|
+
* }
|
|
90
|
+
* ```
|
|
91
|
+
*/
|
|
92
|
+
/**
|
|
93
|
+
* Hook for mutation.
|
|
94
|
+
* @returns The result.
|
|
95
|
+
*/
|
|
96
|
+
export declare function useMutation<T>(): {
|
|
97
|
+
mutate: (url: string, payload?: unknown, method?: 'POST' | 'PUT' | 'PATCH' | 'DELETE') => Promise<T>;
|
|
98
|
+
isLoading: Accessor<boolean>;
|
|
99
|
+
error: Accessor<Error | null>;
|
|
100
|
+
data: Accessor<T | null>;
|
|
101
|
+
reset: () => void;
|
|
102
|
+
};
|
|
103
|
+
/**
|
|
104
|
+
* Create a lazy query that only executes when called.
|
|
105
|
+
*
|
|
106
|
+
* @returns Query function and state
|
|
107
|
+
*
|
|
108
|
+
* @example
|
|
109
|
+
* ```tsx
|
|
110
|
+
* function SearchResults() {
|
|
111
|
+
* const { execute, data, isLoading } = useLazyQuery<SearchResult[]>()
|
|
112
|
+
*
|
|
113
|
+
* const handleSearch = (query: string) => {
|
|
114
|
+
* execute(`/api/search?q=${encodeURIComponent(query)}`)
|
|
115
|
+
* }
|
|
116
|
+
*
|
|
117
|
+
* return (
|
|
118
|
+
* <div>
|
|
119
|
+
* <SearchInput onSearch={handleSearch} />
|
|
120
|
+
* <Show when={!isLoading()} fallback={<Loading />}>
|
|
121
|
+
* <ResultsList results={data() ?? []} />
|
|
122
|
+
* </Show>
|
|
123
|
+
* </div>
|
|
124
|
+
* )
|
|
125
|
+
* }
|
|
126
|
+
* ```
|
|
127
|
+
*/
|
|
128
|
+
/**
|
|
129
|
+
* Hook for lazy query.
|
|
130
|
+
* @returns The result.
|
|
131
|
+
*/
|
|
132
|
+
export declare function useLazyQuery<T>(): {
|
|
133
|
+
execute: (url: string, config?: RequestConfig) => Promise<T>;
|
|
134
|
+
data: () => T | null;
|
|
135
|
+
isLoading: () => boolean;
|
|
136
|
+
error: () => Error | null;
|
|
137
|
+
reset: () => void;
|
|
138
|
+
};
|
|
139
|
+
/**
|
|
140
|
+
* Create HTTP helpers from context.
|
|
141
|
+
*
|
|
142
|
+
* @returns HTTP helper functions
|
|
143
|
+
*/
|
|
144
|
+
/**
|
|
145
|
+
* Creates a http helpers.
|
|
146
|
+
* @returns The created result.
|
|
147
|
+
*/
|
|
148
|
+
export declare function createHttpHelpers(): {
|
|
149
|
+
get: <T>(url: string, config?: RequestConfig) => Promise<HttpResponse<T>>;
|
|
150
|
+
post: <T>(url: string, data?: unknown, config?: RequestConfig) => Promise<HttpResponse<T>>;
|
|
151
|
+
put: <T>(url: string, data?: unknown, config?: RequestConfig) => Promise<HttpResponse<T>>;
|
|
152
|
+
patch: <T>(url: string, data?: unknown, config?: RequestConfig) => Promise<HttpResponse<T>>;
|
|
153
|
+
delete: <T>(url: string, config?: RequestConfig) => Promise<HttpResponse<T>>;
|
|
154
|
+
setAuthToken: (token: string | null) => void;
|
|
155
|
+
getAuthToken: () => string | null;
|
|
156
|
+
};
|
|
157
|
+
/**
|
|
158
|
+
* Create HTTP primitives from a specific client.
|
|
159
|
+
*
|
|
160
|
+
* @param client - HTTP client
|
|
161
|
+
* @returns HTTP methods
|
|
162
|
+
*/
|
|
163
|
+
/**
|
|
164
|
+
* Creates a http from client.
|
|
165
|
+
* @param client - The client instance.
|
|
166
|
+
* @returns The created result.
|
|
167
|
+
*/
|
|
168
|
+
export declare function createHttpFromClient(client: HttpClient): {
|
|
169
|
+
get: <T>(url: string, config?: RequestConfig) => Promise<HttpResponse<T>>;
|
|
170
|
+
post: <T>(url: string, data?: unknown, config?: RequestConfig) => Promise<HttpResponse<T>>;
|
|
171
|
+
put: <T>(url: string, data?: unknown, config?: RequestConfig) => Promise<HttpResponse<T>>;
|
|
172
|
+
patch: <T>(url: string, data?: unknown, config?: RequestConfig) => Promise<HttpResponse<T>>;
|
|
173
|
+
delete: <T>(url: string, config?: RequestConfig) => Promise<HttpResponse<T>>;
|
|
174
|
+
request: <T>(config: FullRequestConfig) => Promise<HttpResponse<T>>;
|
|
175
|
+
};
|
|
176
|
+
//# sourceMappingURL=http.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/primitives/http.ts"],"names":[],"mappings":"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"}
|