Skip to content

Commit

Permalink
fix: types
Browse files Browse the repository at this point in the history
  • Loading branch information
prevwong committed May 21, 2021
1 parent 05d27f3 commit bd726c7
Show file tree
Hide file tree
Showing 10 changed files with 50 additions and 66 deletions.
4 changes: 2 additions & 2 deletions packages/core/src/editor/query.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -167,12 +167,12 @@ export function QueryMethods(state: EditorState) {
}
});

let childrenNodes = [];
let childrenNodes: NodeTree[] = [];

if (reactElement.props && reactElement.props.children) {
childrenNodes = React.Children.toArray(
reactElement.props.children
).reduce((accum, child) => {
).reduce<NodeTree[]>((accum, child: any) => {
if (React.isValidElement(child)) {
accum.push(_().parseReactElement(child).toNodeTree(normalize));
}
Expand Down
1 change: 1 addition & 0 deletions packages/core/src/editor/store.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,7 @@ export const useEditorStore = (
typeof QueryMethods
>
): EditorStore => {
// TODO: fix type
return useMethods(
ActionMethodsWithConfig,
{
Expand Down
26 changes: 12 additions & 14 deletions packages/core/src/editor/useInternalEditor.ts
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@
import {
useCollector,
useCollectorReturnType,
QueryCallbacksFor,
wrapConnectorHooks,
ChainableConnectors,
} from '@craftjs/utils';
import React, { useContext, useMemo } from 'react';
import { useContext, useMemo } from 'react';

import { EditorContext } from './EditorContext';
import { QueryMethods } from './query';
import { ActionMethodsWithConfig } from './store';
import { EditorStore } from './store';

import { CoreEventHandlers } from '../events/CoreEventHandlers';
import { useEventHandler } from '../events/EventContext';
Expand All @@ -19,26 +20,23 @@ export type EditorCollector<C> = (
query: QueryCallbacksFor<typeof QueryMethods>
) => C;

export type useInternalEditorReturnType<C = null> = (C extends null
? useCollector<typeof ActionMethodsWithConfig, typeof QueryMethods>
: useCollector<typeof ActionMethodsWithConfig, typeof QueryMethods, C>) & {
export type useInternalEditorReturnType<C = null> = useCollectorReturnType<
EditorStore,
C
> & {
inContext: boolean;
store: EditorContext;
store: EditorStore;
connectors: ChainableConnectors<
CoreEventHandlers['connectors'],
React.ReactElement
>;
};

export function useInternalEditor(): useInternalEditorReturnType;
export function useInternalEditor<C>(
collector: EditorCollector<C>
): useInternalEditorReturnType<C>;
export function useInternalEditor<C>(
collector?: any
collector?: EditorCollector<C>
): useInternalEditorReturnType<C> {
const handlers = useEventHandler();
const store = useContext<EditorContext>(EditorContext);
const store = useContext(EditorContext);
const collected = useCollector(store, collector);

const connectors = useMemo(
Expand All @@ -47,8 +45,8 @@ export function useInternalEditor<C>(
);

return {
...(collected as any),
connectors: connectors || {},
...collected,
connectors,
inContext: !!store,
store,
};
Expand Down
5 changes: 3 additions & 2 deletions packages/layers/src/manager/LayerManagerProvider.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { useMethods } from '@craftjs/utils';
import React from 'react';

import { LayerMethods } from './actions';
import { LayerManagerContext } from './context';
import { LayerManagerContext, LayerStore } from './context';

import { EventManager } from '../events';
import { LayerOptions } from '../interfaces';
Expand All @@ -11,6 +11,7 @@ import { DefaultLayer } from '../layers';
export const LayerManagerProvider: React.FC<{
options: Partial<LayerOptions>;
}> = ({ children, options }) => {
// TODO: fix type
const store = useMethods(LayerMethods, {
layers: {},
events: {
Expand All @@ -22,7 +23,7 @@ export const LayerManagerProvider: React.FC<{
renderLayer: DefaultLayer,
...options,
},
});
}) as LayerStore;

return (
<LayerManagerContext.Provider value={{ store }}>
Expand Down
11 changes: 5 additions & 6 deletions packages/layers/src/manager/useLayerManager.tsx
Original file line number Diff line number Diff line change
@@ -1,18 +1,17 @@
import { useCollector } from '@craftjs/utils';
import { useCollector, useCollectorReturnType } from '@craftjs/utils';
import { useContext } from 'react';

import { LayerMethods } from './actions';
import { LayerManagerContext } from './context';
import { LayerManagerContext, LayerStore } from './context';

import { LayerState } from '../interfaces';

export function useLayerManager(): useCollector<typeof LayerMethods, null>;
export function useLayerManager(): useCollectorReturnType<LayerStore>;
export function useLayerManager<C>(
collector?: (state: LayerState) => C
): useCollector<typeof LayerMethods, null, C>;
): useCollectorReturnType<LayerStore, C>;
export function useLayerManager<C>(
collector?: (state: LayerState) => C
): useCollector<typeof LayerMethods, null> {
): useCollectorReturnType<LayerStore> {
const { store } = useContext(LayerManagerContext);
return useCollector(store, collector);
}
4 changes: 2 additions & 2 deletions packages/slate/src/extend/slate/SlateNodeContext.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,8 @@ export const SlateNodeContextProvider: React.FC<SlateNodeContextProviderProps> =
enabled: initialEnabledValue,
}) => {
const { id } = useNode();
const [value, setValue] = useState([]);
const [enabled, setEnabled] = useState(initialEnabledValue || true);
const [value, setValue] = useState<Node[]>([]);
const [enabled, setEnabled] = useState<boolean>(initialEnabledValue || true);

const currentEditorSelectionRef = useRef(editor.selection);
currentEditorSelectionRef.current = editor.selection;
Expand Down
3 changes: 2 additions & 1 deletion packages/utils/src/EventHandlers/EventHandlers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import {
CraftEventListener,
EventHandlerConnectors,
CraftDOMEvent,
Connector,
} from './interfaces';
import { isEventBlockedByDescendant } from './isEventBlockedByDescendant';

Expand Down Expand Up @@ -74,7 +75,7 @@ export abstract class EventHandlers<O extends Record<string, any> = {}> {

get connectors(): EventHandlerConnectors<this> {
const connectors = this.handlers();
return Object.keys(connectors).reduce(
return Object.keys(connectors).reduce<Record<string, Connector>>(
(accum, connectorName) => ({
...accum,
[connectorName]: (el, required, options) => {
Expand Down
54 changes: 17 additions & 37 deletions packages/utils/src/useCollector.tsx
Original file line number Diff line number Diff line change
@@ -1,53 +1,33 @@
import { useState, useCallback, useRef, useEffect } from 'react';

import {
CallbacksFor,
MethodsOrOptions,
StateFor,
QueryCallbacksFor,
QueryMethods,
SubscriberAndCallbacksFor,
} from './useMethods';
import { SubscriberAndCallbacksFor } from './useMethods';
import { ConditionallyMergeRecordTypes } from './utilityTypes';

type Actions<M extends MethodsOrOptions, Q extends QueryMethods> = {
actions: CallbacksFor<M>;
query: QueryCallbacksFor<Q>;
type CollectorMethods<S extends SubscriberAndCallbacksFor<any, any>> = {
actions: S['actions'];
query: S['query'];
};

export type useCollector<
M extends MethodsOrOptions,
Q extends QueryMethods | null,
export type useCollectorReturnType<
S extends SubscriberAndCallbacksFor<any, any>,
C = null
> = C extends null ? Actions<M, Q> : C & Actions<M, Q>;

export function useCollector<
M extends MethodsOrOptions,
Q extends QueryMethods | null
>(store: SubscriberAndCallbacksFor<M, Q>): useCollector<M, Q>;

export function useCollector<
M extends MethodsOrOptions,
Q extends QueryMethods | null,
C
>(
store: SubscriberAndCallbacksFor<M, Q>,
collector: (state: StateFor<M>, query: Q) => C
): useCollector<M, Q, C>;

export function useCollector<
M extends MethodsOrOptions,
Q extends QueryMethods | null,
C
>(store: SubscriberAndCallbacksFor<M, Q>, collector?: any) {
> = ConditionallyMergeRecordTypes<C, CollectorMethods<S>>;
export function useCollector<S extends SubscriberAndCallbacksFor<any, any>, C>(
store: S,
collector?: (
state: ReturnType<S['getState']>['current'],
query: S['query']
) => C
): useCollectorReturnType<S, C> {
const { subscribe, getState, actions, query } = store;

const initial = useRef(true);
const collected = useRef<C | null>(null);
const collected = useRef<any>(null);
const collectorRef = useRef(collector);
collectorRef.current = collector;

const onCollect = useCallback(
(collected): useCollector<M, Q, C> => {
(collected) => {
return { ...collected, actions, query };
},
[actions, query]
Expand Down
4 changes: 2 additions & 2 deletions packages/utils/src/useMethods.ts
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ export type CallbacksFor<
>;
};
}
: never;
: {};

export type Methods<S = any, R extends MethodRecordBase<S> = any, Q = any> = (
state: S,
Expand Down Expand Up @@ -131,7 +131,7 @@ export type QueryCallbacksFor<M extends QueryMethods> = M extends QueryMethods<
canRedo: () => boolean;
};
}
: never;
: {};

export type PatchListenerAction<S, M extends MethodsOrOptions> = {
type: keyof CallbacksFor<M>;
Expand Down
4 changes: 4 additions & 0 deletions packages/utils/src/utilityTypes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,7 @@ export type Delete<T, U> = Pick<T, Exclude<keyof T, U>>;
export type OverwriteFnReturnType<F extends (...args: any) => void, R> = (
...args: Parameters<F>
) => Delete<ReturnType<F>, R>;
export type ConditionallyMergeRecordTypes<
C,
S extends Record<string, any>
> = C extends null ? S : C & S;

0 comments on commit bd726c7

Please sign in to comment.