personal web client for Bluesky
typescript
solidjs
bluesky
atcute
1import { type ParentProps, createContext, createMemo, useContext } from 'solid-js';
2
3export interface FieldsetContext {
4 readonly disabled: boolean;
5}
6
7const DEFAULT_FIELDSET: FieldsetContext = {
8 disabled: false,
9};
10
11const Context = createContext<FieldsetContext>(DEFAULT_FIELDSET);
12
13export const useFieldset = (): FieldsetContext => {
14 return useContext(Context);
15};
16
17export interface FieldsetProps extends ParentProps {
18 standalone?: boolean;
19 disabled?: boolean;
20}
21
22export const Fieldset = (props: FieldsetProps) => {
23 let context: FieldsetContext;
24
25 if (!('disabled' in props) && props.standalone) {
26 context = DEFAULT_FIELDSET;
27 } else {
28 const parent = useFieldset();
29
30 const isDisabled = createMemo((): boolean => {
31 return (!props.standalone && parent.disabled) || !!props.disabled;
32 });
33
34 context = {
35 get disabled() {
36 return isDisabled();
37 },
38 };
39 }
40
41 return <Context.Provider value={context}>{props.children}</Context.Provider>;
42};