jordy 0.17.0 → 0.18.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.
@@ -1,8 +1,8 @@
1
1
  import { __read } from "tslib";
2
+ import { noop } from '../util/etc';
2
3
  import React, { createContext, useContext, useEffect, useMemo, useState, } from 'react';
3
- import { isMobile as isMobileCheck, isNativeApp as isNativeAppCheck, isServer, isTablet as isTabletCheck, } from '../util/envCheck';
4
- import { DeviceSizeEnum } from './device.type';
5
- function getIsMobile() {
4
+ import { isMobile as isMobileCheck, isServer, isTablet as isTabletCheck, } from '../util/envCheck';
5
+ function getIsMobile(breakpoint) {
6
6
  if (isServer()) {
7
7
  try {
8
8
  return isMobileCheck();
@@ -11,9 +11,9 @@ function getIsMobile() {
11
11
  }
12
12
  return false;
13
13
  }
14
- return isMobileCheck() || window.innerWidth < DeviceSizeEnum.TABLET;
14
+ return isMobileCheck() || window.innerWidth <= breakpoint;
15
15
  }
16
- function getIsTablet() {
16
+ function getIsTablet(breakpoints) {
17
17
  if (isServer()) {
18
18
  try {
19
19
  return isTabletCheck();
@@ -22,40 +22,70 @@ function getIsTablet() {
22
22
  }
23
23
  return false;
24
24
  }
25
+ if (isTabletCheck()) {
26
+ return true;
27
+ }
28
+ if (breakpoints.length < 2) {
29
+ return false;
30
+ }
25
31
  return (isTabletCheck() ||
26
- (window.innerWidth >= DeviceSizeEnum.TABLET &&
27
- window.innerWidth <= DeviceSizeEnum.DESKTOP_SM - 1));
32
+ (window.innerWidth > breakpoints[0] && window.innerWidth <= breakpoints[1]));
33
+ }
34
+ function defNativeAppChecker() {
35
+ return false;
28
36
  }
29
- export var DeviceDetectContext = createContext([
30
- getIsMobile(),
31
- getIsTablet(),
32
- isNativeAppCheck(),
33
- ]);
37
+ export var DeviceDetectContext = createContext([false, false, false]);
34
38
  var DeviceDetectContextProvider = DeviceDetectContext.Provider;
39
+ var DEVICE_DETECT_DEFAULT_BREAKPOINTS = [539, 1080];
40
+ function subscribeForMobile(breakpoint, setIsMobile) {
41
+ var mqMobile = window.matchMedia("screen and (max-width: ".concat(breakpoint, "px)"));
42
+ var handleResizeForMobile = function (e) {
43
+ setIsMobile(e.matches);
44
+ };
45
+ mqMobile.addEventListener('change', handleResizeForMobile);
46
+ return {
47
+ unsubscribe: function () {
48
+ mqMobile.removeEventListener('change', handleResizeForMobile);
49
+ },
50
+ };
51
+ }
52
+ function subscribeForTablet(breakpoints, setIsTablet) {
53
+ if (breakpoints.length < 2) {
54
+ return {
55
+ unsubscribe: noop,
56
+ };
57
+ }
58
+ var mqTablet = window.matchMedia("screen and (min-width: ".concat(breakpoints[0] + 1, "px) and (max-width: ").concat(breakpoints[1], "px)"));
59
+ var handleResizeForTablet = function (e) {
60
+ setIsTablet(e.matches);
61
+ };
62
+ mqTablet.addEventListener('change', handleResizeForTablet);
63
+ return {
64
+ unsubscribe: function () {
65
+ mqTablet.removeEventListener('change', handleResizeForTablet);
66
+ },
67
+ };
68
+ }
35
69
  export var DeviceDetectProvider = function (_a) {
36
- var children = _a.children;
37
- var _b = __read(useState(getIsMobile()), 2), isMobile = _b[0], setIsMobile = _b[1];
38
- var _c = __read(useState(getIsTablet()), 2), isTablet = _c[0], setIsTablet = _c[1];
39
- var isNative = useMemo(isNativeAppCheck, []);
70
+ var _b = _a.breakpoints, breakpoints = _b === void 0 ? DEVICE_DETECT_DEFAULT_BREAKPOINTS : _b, _c = _a.nativeAppChecker, nativeAppChecker = _c === void 0 ? defNativeAppChecker : _c, children = _a.children;
71
+ var _d = __read(useState(getIsMobile(breakpoints[0])), 2), isMobile = _d[0], setIsMobile = _d[1];
72
+ var _e = __read(useState(getIsTablet(breakpoints)), 2), isTablet = _e[0], setIsTablet = _e[1];
73
+ var isNative = useMemo(nativeAppChecker, []);
40
74
  useEffect(function () {
41
- if (isServer() || !window || typeof window.matchMedia !== 'function') {
75
+ if (isServer() ||
76
+ !window ||
77
+ typeof window.matchMedia !== 'function' ||
78
+ !breakpoints ||
79
+ breakpoints.length === 0) {
42
80
  return undefined;
43
81
  }
44
- var mqMobile = window.matchMedia("screen and (max-width: ".concat(DeviceSizeEnum.TABLET - 1, "px)"));
45
- var mqTablet = window.matchMedia("screen and (min-width: ".concat(DeviceSizeEnum.TABLET, "px) and (max-width: ").concat(DeviceSizeEnum.DESKTOP_SM - 1, "px)"));
46
- var handleResizeForMobile = function (e) {
47
- setIsMobile(e.matches);
48
- };
49
- var handleResizeForTablet = function (e) {
50
- setIsTablet(e.matches);
51
- };
52
- mqMobile.addEventListener('change', handleResizeForMobile);
53
- mqTablet.addEventListener('change', handleResizeForTablet);
82
+ var subMobile = subscribeForMobile(breakpoints[0], setIsMobile);
83
+ var subTablet = subscribeForTablet(breakpoints, setIsTablet);
54
84
  return function () {
55
- mqMobile.removeEventListener('change', handleResizeForMobile);
56
- mqTablet.removeEventListener('change', handleResizeForTablet);
85
+ subMobile.unsubscribe();
86
+ subTablet.unsubscribe();
57
87
  };
58
- }, []);
88
+ }, [breakpoints]);
59
89
  return (React.createElement(DeviceDetectContextProvider, { value: [isMobile, isTablet, isNative] }, children));
60
90
  };
61
91
  export var useIsMobile = function () { return useContext(DeviceDetectContext)[0]; };
@@ -38,18 +38,3 @@ export function isIOS() {
38
38
  }
39
39
  return /iPad|iPhone|iPad/.test(ua);
40
40
  }
41
- var nativeAppKeyword = '';
42
- var bIsNativeApp = null;
43
- export function setNativeAppKeyword(keyword) {
44
- nativeAppKeyword = keyword;
45
- }
46
- export function isNativeApp() {
47
- var ua = userAgent;
48
- if (!ua) {
49
- return false;
50
- }
51
- if (bIsNativeApp === null) {
52
- bIsNativeApp = ua.indexOf(nativeAppKeyword) >= 0;
53
- }
54
- return bIsNativeApp;
55
- }
@@ -1,7 +1,7 @@
1
1
  import { validate as validateOrigin } from './validate';
2
2
  import fn from './fn';
3
- export var validateFn = validateOrigin;
4
- validateFn.fn = fn;
3
+ export var validate = validateOrigin;
4
+ validate.fn = fn;
5
5
  export * from './mergeValidates';
6
6
  export * from './validate.type';
7
7
  export * from './useValidate';
@@ -1,7 +1,25 @@
1
1
  import React from 'react';
2
2
  export declare const DeviceDetectContext: React.Context<boolean[]>;
3
3
  interface DeviceDetectProviderProps {
4
- children: React.ReactNode;
4
+ /**
5
+ * 디바이스 디텍터에서 모바일및 태블릿 여부를 확인하는 사이즈 기준.
6
+ *
7
+ * - 하나만 설정하면 mobile / desktop 으로 구분된다.
8
+ * - 두개를 설정하면 mobile / tablet / desktop 3가지로 구분된다.
9
+ *
10
+ * @default [539, 1080]
11
+ */
12
+ breakpoints?: number[];
13
+ /**
14
+ * 네이티브 앱 여부를 확인하는 콜백.
15
+ *
16
+ * 결과가 true 면 네이티브앱, false 면 일반 웹이다.
17
+ *
18
+ * 콜백을 설정하지 않으면 항상 false 로 간주된다.
19
+ * @returns
20
+ */
21
+ nativeAppChecker?: () => boolean;
22
+ children?: React.ReactNode;
5
23
  }
6
24
  /**
7
25
  * 컨텍스트: UserAgent 및 Resizing 여부에 따른 태블릿/모바일 여부를 판별 해 준다.
@@ -13,7 +31,7 @@ interface DeviceDetectProviderProps {
13
31
  * @see https://stackoverflow.com/questions/29046324/whats-the-most-reliable-way-to-integrate-javascript-with-media-queries
14
32
  * @see https://jsperf.com/matchmedia-vs-resize/3
15
33
  */
16
- export declare const DeviceDetectProvider: ({ children, }: DeviceDetectProviderProps) => JSX.Element;
34
+ export declare const DeviceDetectProvider: ({ breakpoints, nativeAppChecker, children, }: DeviceDetectProviderProps) => JSX.Element;
17
35
  export declare const useIsMobile: () => boolean;
18
36
  export declare const useIsTablet: () => boolean;
19
37
  export declare const useIsNative: () => boolean;
@@ -49,8 +49,3 @@ export declare function isTablet(): boolean;
49
49
  * user-agent 정보를 이용하여 ios 여부를 판단한다.
50
50
  */
51
51
  export declare function isIOS(): boolean;
52
- export declare function setNativeAppKeyword(keyword: string): void;
53
- /**
54
- * user-agent 정보를 이용하여 native app 여부를 판단한다.
55
- */
56
- export declare function isNativeApp(): boolean;
@@ -52,7 +52,7 @@ declare type ValidationCheckerType = typeof validateOrigin & {
52
52
  *
53
53
  * @see ValidateBulkResultModel
54
54
  */
55
- export declare const validateFn: ValidationCheckerType;
55
+ export declare const validate: ValidationCheckerType;
56
56
  export * from './mergeValidates';
57
57
  export * from './validate.type';
58
58
  export * from './useValidate';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "jordy",
3
- "version": "0.17.0",
3
+ "version": "0.18.0",
4
4
  "description": "typescript based frontend toolkit",
5
5
  "repository": {
6
6
  "type": "git",
@@ -1,9 +0,0 @@
1
- export var DeviceSizeEnum;
2
- (function (DeviceSizeEnum) {
3
- DeviceSizeEnum[DeviceSizeEnum["MOBILE_SM"] = 320] = "MOBILE_SM";
4
- DeviceSizeEnum[DeviceSizeEnum["MOBILE"] = 481] = "MOBILE";
5
- DeviceSizeEnum[DeviceSizeEnum["TABLET_SM"] = 768] = "TABLET_SM";
6
- DeviceSizeEnum[DeviceSizeEnum["TABLET"] = 961] = "TABLET";
7
- DeviceSizeEnum[DeviceSizeEnum["DESKTOP_SM"] = 1025] = "DESKTOP_SM";
8
- DeviceSizeEnum[DeviceSizeEnum["DESKTOP"] = 1120] = "DESKTOP";
9
- })(DeviceSizeEnum || (DeviceSizeEnum = {}));
@@ -1,14 +0,0 @@
1
- /**
2
- * 기기별 사이즈를 정의한 것.
3
- *
4
- * 사이즈 참고:
5
- * https://stackoverflow.com/questions/6370690/media-queries-how-to-target-desktop-tablet-and-mobile
6
- */
7
- export declare enum DeviceSizeEnum {
8
- MOBILE_SM = 320,
9
- MOBILE = 481,
10
- TABLET_SM = 768,
11
- TABLET = 961,
12
- DESKTOP_SM = 1025,
13
- DESKTOP = 1120
14
- }