Skip to content

Commit

Permalink
Merge pull request alibaba#12 from alibaba/feat/dom_ts
Browse files Browse the repository at this point in the history
fix: dom ts
  • Loading branch information
brickspert authored Jun 12, 2020
2 parents 527c856 + 178c471 commit 2befdf9
Show file tree
Hide file tree
Showing 10 changed files with 43 additions and 44 deletions.
7 changes: 3 additions & 4 deletions packages/hooks/src/useClickAway/index.ts
Original file line number Diff line number Diff line change
@@ -1,15 +1,14 @@
import { useEffect, useCallback, MutableRefObject } from 'react';
import { getTargetElement } from '../utils/dom';
import { useEffect, useCallback } from 'react';
import { getTargetElement, BasicTarget } from '../utils/dom';

// 鼠标点击事件,click 不会监听右键
const defaultEvent = 'click';

type EventType = MouseEvent | TouchEvent;
type Target = (() => HTMLElement) | HTMLElement | MutableRefObject<HTMLElement>;

export default function useClickAway(
onClickAway: (event: EventType) => void,
target: Target,
target: BasicTarget,
eventName: string = defaultEvent,
) {
const handler = useCallback(
Expand Down
17 changes: 7 additions & 10 deletions packages/hooks/src/useEventListener/index.ts
Original file line number Diff line number Diff line change
@@ -1,14 +1,11 @@
import { useEffect, useRef } from 'react';
import { getTargetElement } from '../utils/dom';
import { useEffect, useRef, MutableRefObject } from 'react';
import { getTargetElement, BasicTarget } from '../utils/dom';

type Target = (() => HTMLElement) | HTMLElement | React.MutableRefObject<HTMLElement> | Window;
type Options = { target?: Target; capture?: boolean; once?: boolean; passive?: boolean; }
export type Target = BasicTarget<HTMLElement | Window>;

function useEventListener(
eventName: string,
handler: Function,
options?: Options,
) {
type Options = { target?: Target; capture?: boolean; once?: boolean; passive?: boolean };

function useEventListener(eventName: string, handler: Function, options?: Options) {
const savedHandler = useRef<Function>();

useEffect(() => {
Expand All @@ -29,7 +26,7 @@ function useEventListener(
targetElement.addEventListener(eventName, eventListener, {
capture: options?.capture,
once: options?.once,
passive: options?.passive
passive: options?.passive,
});

return () => {
Expand Down
6 changes: 2 additions & 4 deletions packages/hooks/src/useFullscreen/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,7 @@
import { useLayoutEffect, useRef, MutableRefObject } from 'react';
import screenfull from 'screenfull';
import useBoolean from '../useBoolean';
import { getTargetElement } from '../utils/dom';

type Target = HTMLElement | (() => HTMLElement) | MutableRefObject<HTMLElement>;
import { getTargetElement, BasicTarget } from '../utils/dom';

export interface Options {
onExitFull?: () => void;
Expand All @@ -21,7 +19,7 @@ interface Callback {
type Value = boolean;
type Result = [Value, Callback];

export default (target: Target, options?: Options): Result => {
export default (target: BasicTarget, options?: Options): Result => {
const { onExitFull, onFull } = options || {};

const onExitFullRef = useRef(onExitFull);
Expand Down
6 changes: 3 additions & 3 deletions packages/hooks/src/useHover/index.ts
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
import { useEffect, useRef } from 'react';
import useBoolean from '../useBoolean';
import { getTargetElement } from '../utils/dom';
import { getTargetElement, BasicTarget } from '../utils/dom';

export interface Options {
onEnter?: () => void;
onLeave?: () => void;
}

export default (
target: (() => HTMLElement) | HTMLElement | React.MutableRefObject<HTMLElement>,
target: BasicTarget,
options?: Options,
): boolean => {
const { onEnter, onLeave } = options || {};
Expand All @@ -19,7 +19,7 @@ export default (
const onLeaveRef = useRef(onLeave);
onLeaveRef.current = onLeave;

const [ state, { setTrue, setFalse }] = useBoolean(false);
const [state, { setTrue, setFalse }] = useBoolean(false);

useEffect(() => {
const onMouseEnter = () => {
Expand Down
9 changes: 4 additions & 5 deletions packages/hooks/src/useInViewport/index.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@

import { useEffect, useState, MutableRefObject } from 'react';
import { useEffect, useState } from 'react';
import 'intersection-observer';
import { getTargetElement } from '../utils/dom';
import { getTargetElement, BasicTarget } from '../utils/dom';

type Target = HTMLElement | (() => HTMLElement) | MutableRefObject<HTMLElement>;
type InViewport = boolean | undefined;

function isInViewPort(el: HTMLElement): boolean {
Expand All @@ -25,7 +24,7 @@ function isInViewPort(el: HTMLElement): boolean {
return false;
}

function useInViewport(target: Target): InViewport {
function useInViewport(target: BasicTarget): InViewport {
const [inViewPort, setInViewport] = useState<InViewport>(() => {
const el = getTargetElement(target)

Expand All @@ -35,7 +34,7 @@ function useInViewport(target: Target): InViewport {
useEffect(() => {
const el = getTargetElement(target);
if (!el) {
return () => {};
return () => { };
}

const observer = new IntersectionObserver(entries => {
Expand Down
10 changes: 6 additions & 4 deletions packages/hooks/src/useKeyPress/index.ts
Original file line number Diff line number Diff line change
@@ -1,15 +1,17 @@
import { useEffect, useCallback, useRef, MutableRefObject } from 'react';
import { getTargetElement } from '../utils/dom';
import { useEffect, useCallback, useRef } from 'react';
import { getTargetElement, BasicTarget } from '../utils/dom';

export type KeyPredicate = (event: KeyboardEvent) => boolean;
export type keyType = KeyboardEvent['keyCode'] | KeyboardEvent['key'];
export type KeyFilter = keyType | Array<keyType> | ((event: KeyboardEvent) => boolean);
export type EventHandler = (event: KeyboardEvent) => void;
export type keyEvent = 'keydown' | 'keyup';

export type Target = BasicTarget<HTMLElement | Document | Window>;

export type EventOption = {
events?: Array<keyEvent>;
target?: (() => HTMLElement) | HTMLElement | MutableRefObject<HTMLElement> | Document | Window
target?: Target;
};

// 键盘事件 keyCode 别名
Expand Down Expand Up @@ -138,7 +140,7 @@ function useKeyPress(
callbackRef.current = eventHandler;

const callbackHandler = useCallback(
event => {
(event) => {
const genGuard: KeyPredicate = genKeyFormater(keyFilter);
if (genGuard(event)) {
return callbackRef.current(event);
Expand Down
4 changes: 2 additions & 2 deletions packages/hooks/src/useScroll/index.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
import { useEffect, useState, MutableRefObject } from 'react';
import { getTargetElement } from '../utils/dom'
import { getTargetElement, BasicTarget } from '../utils/dom';

interface Position {
left: number;
top: number;
}

type Target = HTMLElement | (() => HTMLElement) | Document | MutableRefObject<HTMLElement>;
export type Target = BasicTarget<HTMLElement | Document>;

function useScroll(target?: Target): Position {
const [position, setPosition] = useState<Position>({
Expand Down
8 changes: 3 additions & 5 deletions packages/hooks/src/useSize/index.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,10 @@
import { useState, useLayoutEffect, MutableRefObject } from 'react';
import { useState, useLayoutEffect } from 'react';
import ResizeObserver from 'resize-observer-polyfill';
import { getTargetElement } from '../utils/dom';

type Target = HTMLElement | (() => HTMLElement) | MutableRefObject<HTMLElement>;
import { getTargetElement, BasicTarget } from '../utils/dom';

type Size = { width?: number; height?: number };

function useSize(target: Target): Size {
function useSize(target: BasicTarget): Size {
const [state, setState] = useState<Size>(() => {
const el = getTargetElement(target);
return {
Expand Down
8 changes: 3 additions & 5 deletions packages/hooks/src/useTextSelection/index.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { useState, useEffect, useRef, MutableRefObject } from 'react';
import { getTargetElement } from '../utils/dom';
import { useState, useEffect, useRef } from 'react';
import { getTargetElement, BasicTarget } from '../utils/dom';

interface IRect {
top: number;
Expand All @@ -13,8 +13,6 @@ export interface IState extends IRect {
text: string;
}

type Target = HTMLElement | (() => HTMLElement) | MutableRefObject<HTMLElement>;

const initRect: IRect = {
top: NaN,
left: NaN,
Expand Down Expand Up @@ -59,7 +57,7 @@ function getRectFromSelection(selection: Selection | null): IRect {
/**
* 获取用户选取的文本或当前光标插入的位置
* */
function useTextSelection(target?: Target): IState {
function useTextSelection(target?: BasicTarget): IState {
const [state, setState] = useState(initState);

const stateRef = useRef(state);
Expand Down
12 changes: 10 additions & 2 deletions packages/hooks/src/utils/dom.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,17 @@
import { MutableRefObject } from 'react';

export type BasicTarget<T = HTMLElement> =
| (() => T | null)
| T
| null
| MutableRefObject<T | undefined>;

type TargetElement = HTMLElement | Document | Window;
type TargetParams = (() => HTMLElement) | MutableRefObject<HTMLElement> | TargetElement;

export function getTargetElement(target?: TargetParams, defaultElement?: TargetElement): TargetElement | undefined {
export function getTargetElement(
target?: BasicTarget<TargetElement>,
defaultElement?: TargetElement,
): TargetElement | undefined {
if (!target) {
return defaultElement;
}
Expand Down

0 comments on commit 2befdf9

Please sign in to comment.