@sendbird/uikit-utils 3.12.1 → 3.12.3

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.
@@ -78,7 +78,7 @@ const useFreshCallback = callback => {
78
78
  };
79
79
  exports.useFreshCallback = useFreshCallback;
80
80
  const useDebounceEffect = (action, delay, deps = []) => {
81
- const timeoutRef = (0, _react.useRef)();
81
+ const timeoutRef = (0, _react.useRef)(undefined);
82
82
  (0, _react.useEffect)(() => {
83
83
  timeoutRef.current = setTimeout(async () => {
84
84
  try {
@@ -1 +1 @@
1
- {"version":3,"names":["_react","require","idPool","useUniqId","key","useState","exports","useUniqHandlerId","name","id","useForceUpdate","updater","useCallback","prev","useAsyncEffect","asyncEffect","deps","useEffect","createAsyncEffectCallback","useAsyncLayoutEffect","useLayoutEffect","useIIFE","callback","iife","destructor","Promise","awaitedDestructor","useIsMountedRef","isMounted","useRef","current","useIsFirstMount","isFirstMount","useFreshCallback","ref","args","useDebounceEffect","action","delay","timeoutRef","setTimeout","undefined","clearTimeout","usePartialState","initialState","useReducer","state","useRefTracker","target"],"sources":["index.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type { DependencyList } from 'react';\nimport { useCallback, useEffect, useLayoutEffect, useReducer, useRef, useState } from 'react';\n\ntype Destructor = () => void;\ntype AsyncEffectCallback = () => void | Destructor | Promise<void> | Promise<Destructor>;\n\nconst idPool: { [key: string]: number } = {};\nexport const useUniqId = (key: string) => {\n return useState(() => {\n if (!idPool[key]) idPool[key] = 1;\n return idPool[key]++;\n })[0];\n};\n\nexport const useUniqHandlerId = (name: string) => {\n const id = useUniqId(name);\n return `${name}_${id}`;\n};\n\nexport const useForceUpdate = () => {\n const [, updater] = useState(0);\n return useCallback(() => updater((prev) => prev + 1), []);\n};\n\nexport const useAsyncEffect = (asyncEffect: AsyncEffectCallback, deps?: DependencyList) => {\n useEffect(createAsyncEffectCallback(asyncEffect), deps);\n};\nexport const useAsyncLayoutEffect = (asyncEffect: AsyncEffectCallback, deps?: DependencyList) => {\n useLayoutEffect(createAsyncEffectCallback(asyncEffect), deps);\n};\nexport const useIIFE = <T>(callback: () => T) => {\n return iife(callback);\n};\nconst iife = <T extends (...args: any[]) => any>(callback: T): ReturnType<T> => callback();\nconst createAsyncEffectCallback = (asyncEffect: AsyncEffectCallback) => () => {\n const destructor = iife(asyncEffect);\n return () => {\n if (!destructor) return;\n\n if (destructor instanceof Promise) {\n iife(async () => {\n const awaitedDestructor = await destructor;\n if (awaitedDestructor) awaitedDestructor();\n });\n } else {\n iife(destructor);\n }\n };\n};\n\nexport const useIsMountedRef = () => {\n const isMounted = useRef(true);\n\n useEffect(() => {\n return () => {\n isMounted.current = false;\n };\n }, []);\n\n return isMounted;\n};\n\nexport const useIsFirstMount = () => {\n const isFirstMount = useRef(true);\n\n if (isFirstMount.current) {\n isFirstMount.current = false;\n return true;\n }\n\n return isFirstMount.current;\n};\n\nexport const useFreshCallback = <T extends Function>(callback: T): T => {\n const ref = useRef<T>(callback);\n ref.current = callback;\n return useCallback(((...args: any[]) => ref.current(...args)) as unknown as T, []);\n};\n\nexport const useDebounceEffect = (action: () => void, delay: number, deps: DependencyList = []) => {\n const timeoutRef = useRef<NodeJS.Timeout>();\n\n useEffect(() => {\n timeoutRef.current = setTimeout(async () => {\n try {\n await action();\n } finally {\n timeoutRef.current = undefined;\n }\n }, delay);\n\n return () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = undefined;\n }\n };\n }, [delay, ...deps]);\n};\n\nexport const usePartialState = <S>(initialState: S) => {\n return useReducer((prev: S, state: Partial<S>) => ({ ...prev, ...state }), initialState);\n};\n\nexport const useRefTracker = <T>(target: T) => {\n const ref = useRef(target);\n\n useLayoutEffect(() => {\n ref.current = target;\n });\n\n return ref;\n};\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_react","require","idPool","useUniqId","key","useState","exports","useUniqHandlerId","name","id","useForceUpdate","updater","useCallback","prev","useAsyncEffect","asyncEffect","deps","useEffect","createAsyncEffectCallback","useAsyncLayoutEffect","useLayoutEffect","useIIFE","callback","iife","destructor","Promise","awaitedDestructor","useIsMountedRef","isMounted","useRef","current","useIsFirstMount","isFirstMount","useFreshCallback","ref","args","useDebounceEffect","action","delay","timeoutRef","undefined","setTimeout","clearTimeout","usePartialState","initialState","useReducer","state","useRefTracker","target"],"sources":["index.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type { DependencyList } from 'react';\nimport { useCallback, useEffect, useLayoutEffect, useReducer, useRef, useState } from 'react';\n\ntype Destructor = () => void;\ntype AsyncEffectCallback = () => void | Destructor | Promise<void> | Promise<Destructor>;\n\nconst idPool: { [key: string]: number } = {};\nexport const useUniqId = (key: string) => {\n return useState(() => {\n if (!idPool[key]) idPool[key] = 1;\n return idPool[key]++;\n })[0];\n};\n\nexport const useUniqHandlerId = (name: string) => {\n const id = useUniqId(name);\n return `${name}_${id}`;\n};\n\nexport const useForceUpdate = () => {\n const [, updater] = useState(0);\n return useCallback(() => updater((prev) => prev + 1), []);\n};\n\nexport const useAsyncEffect = (asyncEffect: AsyncEffectCallback, deps?: DependencyList) => {\n useEffect(createAsyncEffectCallback(asyncEffect), deps);\n};\nexport const useAsyncLayoutEffect = (asyncEffect: AsyncEffectCallback, deps?: DependencyList) => {\n useLayoutEffect(createAsyncEffectCallback(asyncEffect), deps);\n};\nexport const useIIFE = <T>(callback: () => T) => {\n return iife(callback);\n};\nconst iife = <T extends (...args: any[]) => any>(callback: T): ReturnType<T> => callback();\nconst createAsyncEffectCallback = (asyncEffect: AsyncEffectCallback) => () => {\n const destructor = iife(asyncEffect);\n return () => {\n if (!destructor) return;\n\n if (destructor instanceof Promise) {\n iife(async () => {\n const awaitedDestructor = await destructor;\n if (awaitedDestructor) awaitedDestructor();\n });\n } else {\n iife(destructor);\n }\n };\n};\n\nexport const useIsMountedRef = () => {\n const isMounted = useRef(true);\n\n useEffect(() => {\n return () => {\n isMounted.current = false;\n };\n }, []);\n\n return isMounted;\n};\n\nexport const useIsFirstMount = () => {\n const isFirstMount = useRef(true);\n\n if (isFirstMount.current) {\n isFirstMount.current = false;\n return true;\n }\n\n return isFirstMount.current;\n};\n\nexport const useFreshCallback = <T extends Function>(callback: T): T => {\n const ref = useRef<T>(callback);\n ref.current = callback;\n return useCallback(((...args: any[]) => ref.current(...args)) as unknown as T, []);\n};\n\nexport const useDebounceEffect = (action: () => void, delay: number, deps: DependencyList = []) => {\n const timeoutRef = useRef<NodeJS.Timeout | undefined>(undefined);\n\n useEffect(() => {\n timeoutRef.current = setTimeout(async () => {\n try {\n await action();\n } finally {\n timeoutRef.current = undefined;\n }\n }, delay);\n\n return () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = undefined;\n }\n };\n }, [delay, ...deps]);\n};\n\nexport const usePartialState = <S>(initialState: S) => {\n return useReducer((prev: S, state: Partial<S>) => ({ ...prev, ...state }), initialState);\n};\n\nexport const useRefTracker = <T>(target: T) => {\n const ref = useRef(target);\n\n useLayoutEffect(() => {\n ref.current = target;\n });\n\n return ref;\n};\n"],"mappings":"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","ignoreList":[]}
@@ -56,7 +56,7 @@ const useAppState = (type, listener) => {
56
56
  * */
57
57
  exports.useAppState = useAppState;
58
58
  const useDeferredModalState = () => {
59
- const resolveRef = (0, _react.useRef)();
59
+ const resolveRef = (0, _react.useRef)(undefined);
60
60
  const [visible, setVisible] = (0, _react.useState)(false);
61
61
  return {
62
62
  onClose: () => {
@@ -1 +1 @@
1
- {"version":3,"names":["_react","require","_reactNative","_reactNativeSafeAreaContext","edgePaddingMap","ltr","left","right","top","bottom","rtl","useSafeAreaPadding","edges","direction","I18nManager","isRTL","safeAreaInsets","useSafeAreaInsets","reduce","map","edge","paddingKey","exports","useAppState","type","listener","callbackRef","useRef","current","useEffect","eventListener","state","subscriber","AppState","addEventListener","remove","useDeferredModalState","resolveRef","visible","setVisible","useState","onClose","Promise","resolve","onDismiss","_resolveRef$current","call"],"sources":["react-native.ts"],"sourcesContent":["import { useEffect, useRef, useState } from 'react';\nimport { AppState, AppStateEvent, AppStateStatus, I18nManager } from 'react-native';\nimport { EdgeInsets, useSafeAreaInsets } from 'react-native-safe-area-context';\n\ntype EdgePaddingMap = {\n left: 'paddingStart' | 'paddingEnd';\n right: 'paddingStart' | 'paddingEnd';\n top: 'paddingTop';\n bottom: 'paddingBottom';\n};\n\nconst edgePaddingMap: Record<'ltr' | 'rtl', EdgePaddingMap> = {\n ltr: {\n left: 'paddingStart',\n right: 'paddingEnd',\n top: 'paddingTop',\n bottom: 'paddingBottom',\n },\n rtl: {\n left: 'paddingEnd',\n right: 'paddingStart',\n top: 'paddingTop',\n bottom: 'paddingBottom',\n },\n};\n\nexport const useSafeAreaPadding = <\n T extends keyof EdgeInsets,\n Result extends { [key in EdgePaddingMap[T]]: EdgeInsets[T] },\n>(\n edges: T[],\n direction: 'ltr' | 'rtl' = I18nManager.isRTL ? 'rtl' : 'ltr',\n): Result => {\n const safeAreaInsets = useSafeAreaInsets();\n return edges.reduce((map, edge) => {\n const paddingKey = edgePaddingMap[direction][edge];\n map[paddingKey] = safeAreaInsets[edge];\n\n if (edge === 'left') {\n // @ts-expect-error backward compatibility\n map['paddingLeft'] = safeAreaInsets[edge];\n }\n if (edge === 'right') {\n // @ts-expect-error backward compatibility\n map['paddingRight'] = safeAreaInsets[edge];\n }\n return map;\n }, {} as { [key in EdgePaddingMap[T]]: EdgeInsets[T] }) as Result;\n};\n\ntype AppStateListener = (status: AppStateStatus) => void;\n\nexport const useAppState = (type: AppStateEvent, listener: AppStateListener) => {\n const callbackRef = useRef<AppStateListener>(listener);\n callbackRef.current = listener;\n\n useEffect(() => {\n const eventListener = (state: AppStateStatus) => callbackRef.current(state);\n const subscriber = AppState.addEventListener(type, eventListener);\n\n return () => {\n if (subscriber?.remove) subscriber.remove();\n };\n }, []);\n};\n\n/**\n * To display a new modal in React-Native, you should ensure that a new modal is opened only after the existing modal has been dismissed to avoid conflicts.\n * To achieve this, you can use a deferred onClose that can be awaited until the onDismiss is called.\n * */\nexport const useDeferredModalState = () => {\n const resolveRef = useRef<(value: void) => void>();\n const [visible, setVisible] = useState(false);\n\n return {\n onClose: () => {\n return new Promise<void>((resolve) => {\n resolveRef.current = resolve;\n setVisible(false);\n });\n },\n onDismiss: () => {\n resolveRef.current?.();\n },\n visible,\n setVisible,\n };\n};\n"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,OAAA;AACA,IAAAC,YAAA,GAAAD,OAAA;AACA,IAAAE,2BAAA,GAAAF,OAAA;AASA,MAAMG,cAAqD,GAAG;EAC5DC,GAAG,EAAE;IACHC,IAAI,EAAE,cAAc;IACpBC,KAAK,EAAE,YAAY;IACnBC,GAAG,EAAE,YAAY;IACjBC,MAAM,EAAE;EACV,CAAC;EACDC,GAAG,EAAE;IACHJ,IAAI,EAAE,YAAY;IAClBC,KAAK,EAAE,cAAc;IACrBC,GAAG,EAAE,YAAY;IACjBC,MAAM,EAAE;EACV;AACF,CAAC;AAEM,MAAME,kBAAkB,GAAGA,CAIhCC,KAAU,EACVC,SAAwB,GAAGC,wBAAW,CAACC,KAAK,GAAG,KAAK,GAAG,KAAK,KACjD;EACX,MAAMC,cAAc,GAAG,IAAAC,6CAAiB,EAAC,CAAC;EAC1C,OAAOL,KAAK,CAACM,MAAM,CAAC,CAACC,GAAG,EAAEC,IAAI,KAAK;IACjC,MAAMC,UAAU,GAAGjB,cAAc,CAACS,SAAS,CAAC,CAACO,IAAI,CAAC;IAClDD,GAAG,CAACE,UAAU,CAAC,GAAGL,cAAc,CAACI,IAAI,CAAC;IAEtC,IAAIA,IAAI,KAAK,MAAM,EAAE;MACnB;MACAD,GAAG,CAAC,aAAa,CAAC,GAAGH,cAAc,CAACI,IAAI,CAAC;IAC3C;IACA,IAAIA,IAAI,KAAK,OAAO,EAAE;MACpB;MACAD,GAAG,CAAC,cAAc,CAAC,GAAGH,cAAc,CAACI,IAAI,CAAC;IAC5C;IACA,OAAOD,GAAG;EACZ,CAAC,EAAE,CAAC,CAAkD,CAAC;AACzD,CAAC;AAACG,OAAA,CAAAX,kBAAA,GAAAA,kBAAA;AAIK,MAAMY,WAAW,GAAGA,CAACC,IAAmB,EAAEC,QAA0B,KAAK;EAC9E,MAAMC,WAAW,GAAG,IAAAC,aAAM,EAAmBF,QAAQ,CAAC;EACtDC,WAAW,CAACE,OAAO,GAAGH,QAAQ;EAE9B,IAAAI,gBAAS,EAAC,MAAM;IACd,MAAMC,aAAa,GAAIC,KAAqB,IAAKL,WAAW,CAACE,OAAO,CAACG,KAAK,CAAC;IAC3E,MAAMC,UAAU,GAAGC,qBAAQ,CAACC,gBAAgB,CAACV,IAAI,EAAEM,aAAa,CAAC;IAEjE,OAAO,MAAM;MACX,IAAIE,UAAU,aAAVA,UAAU,eAAVA,UAAU,CAAEG,MAAM,EAAEH,UAAU,CAACG,MAAM,CAAC,CAAC;IAC7C,CAAC;EACH,CAAC,EAAE,EAAE,CAAC;AACR,CAAC;;AAED;AACA;AACA;AACA;AAHAb,OAAA,CAAAC,WAAA,GAAAA,WAAA;AAIO,MAAMa,qBAAqB,GAAGA,CAAA,KAAM;EACzC,MAAMC,UAAU,GAAG,IAAAV,aAAM,EAAwB,CAAC;EAClD,MAAM,CAACW,OAAO,EAAEC,UAAU,CAAC,GAAG,IAAAC,eAAQ,EAAC,KAAK,CAAC;EAE7C,OAAO;IACLC,OAAO,EAAEA,CAAA,KAAM;MACb,OAAO,IAAIC,OAAO,CAAQC,OAAO,IAAK;QACpCN,UAAU,CAACT,OAAO,GAAGe,OAAO;QAC5BJ,UAAU,CAAC,KAAK,CAAC;MACnB,CAAC,CAAC;IACJ,CAAC;IACDK,SAAS,EAAEA,CAAA,KAAM;MAAA,IAAAC,mBAAA;MACf,CAAAA,mBAAA,GAAAR,UAAU,CAACT,OAAO,cAAAiB,mBAAA,eAAlBA,mBAAA,CAAAC,IAAA,CAAAT,UAAqB,CAAC;IACxB,CAAC;IACDC,OAAO;IACPC;EACF,CAAC;AACH,CAAC;AAACjB,OAAA,CAAAc,qBAAA,GAAAA,qBAAA","ignoreList":[]}
1
+ {"version":3,"names":["_react","require","_reactNative","_reactNativeSafeAreaContext","edgePaddingMap","ltr","left","right","top","bottom","rtl","useSafeAreaPadding","edges","direction","I18nManager","isRTL","safeAreaInsets","useSafeAreaInsets","reduce","map","edge","paddingKey","exports","useAppState","type","listener","callbackRef","useRef","current","useEffect","eventListener","state","subscriber","AppState","addEventListener","remove","useDeferredModalState","resolveRef","undefined","visible","setVisible","useState","onClose","Promise","resolve","onDismiss","_resolveRef$current","call"],"sources":["react-native.ts"],"sourcesContent":["import { useEffect, useRef, useState } from 'react';\nimport { AppState, AppStateEvent, AppStateStatus, I18nManager } from 'react-native';\nimport { EdgeInsets, useSafeAreaInsets } from 'react-native-safe-area-context';\n\ntype EdgePaddingMap = {\n left: 'paddingStart' | 'paddingEnd';\n right: 'paddingStart' | 'paddingEnd';\n top: 'paddingTop';\n bottom: 'paddingBottom';\n};\n\nconst edgePaddingMap: Record<'ltr' | 'rtl', EdgePaddingMap> = {\n ltr: {\n left: 'paddingStart',\n right: 'paddingEnd',\n top: 'paddingTop',\n bottom: 'paddingBottom',\n },\n rtl: {\n left: 'paddingEnd',\n right: 'paddingStart',\n top: 'paddingTop',\n bottom: 'paddingBottom',\n },\n};\n\nexport const useSafeAreaPadding = <\n T extends keyof EdgeInsets,\n Result extends { [key in EdgePaddingMap[T]]: EdgeInsets[T] },\n>(\n edges: T[],\n direction: 'ltr' | 'rtl' = I18nManager.isRTL ? 'rtl' : 'ltr',\n): Result => {\n const safeAreaInsets = useSafeAreaInsets();\n return edges.reduce((map, edge) => {\n const paddingKey = edgePaddingMap[direction][edge];\n map[paddingKey] = safeAreaInsets[edge];\n\n if (edge === 'left') {\n // @ts-expect-error backward compatibility\n map['paddingLeft'] = safeAreaInsets[edge];\n }\n if (edge === 'right') {\n // @ts-expect-error backward compatibility\n map['paddingRight'] = safeAreaInsets[edge];\n }\n return map;\n }, {} as { [key in EdgePaddingMap[T]]: EdgeInsets[T] }) as Result;\n};\n\ntype AppStateListener = (status: AppStateStatus) => void;\n\nexport const useAppState = (type: AppStateEvent, listener: AppStateListener) => {\n const callbackRef = useRef<AppStateListener>(listener);\n callbackRef.current = listener;\n\n useEffect(() => {\n const eventListener = (state: AppStateStatus) => callbackRef.current(state);\n const subscriber = AppState.addEventListener(type, eventListener);\n\n return () => {\n if (subscriber?.remove) subscriber.remove();\n };\n }, []);\n};\n\n/**\n * To display a new modal in React-Native, you should ensure that a new modal is opened only after the existing modal has been dismissed to avoid conflicts.\n * To achieve this, you can use a deferred onClose that can be awaited until the onDismiss is called.\n * */\nexport const useDeferredModalState = () => {\n const resolveRef = useRef<((value: void) => void) | undefined>(undefined);\n const [visible, setVisible] = useState(false);\n\n return {\n onClose: () => {\n return new Promise<void>((resolve) => {\n resolveRef.current = resolve;\n setVisible(false);\n });\n },\n onDismiss: () => {\n resolveRef.current?.();\n },\n visible,\n setVisible,\n };\n};\n"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,OAAA;AACA,IAAAC,YAAA,GAAAD,OAAA;AACA,IAAAE,2BAAA,GAAAF,OAAA;AASA,MAAMG,cAAqD,GAAG;EAC5DC,GAAG,EAAE;IACHC,IAAI,EAAE,cAAc;IACpBC,KAAK,EAAE,YAAY;IACnBC,GAAG,EAAE,YAAY;IACjBC,MAAM,EAAE;EACV,CAAC;EACDC,GAAG,EAAE;IACHJ,IAAI,EAAE,YAAY;IAClBC,KAAK,EAAE,cAAc;IACrBC,GAAG,EAAE,YAAY;IACjBC,MAAM,EAAE;EACV;AACF,CAAC;AAEM,MAAME,kBAAkB,GAAGA,CAIhCC,KAAU,EACVC,SAAwB,GAAGC,wBAAW,CAACC,KAAK,GAAG,KAAK,GAAG,KAAK,KACjD;EACX,MAAMC,cAAc,GAAG,IAAAC,6CAAiB,EAAC,CAAC;EAC1C,OAAOL,KAAK,CAACM,MAAM,CAAC,CAACC,GAAG,EAAEC,IAAI,KAAK;IACjC,MAAMC,UAAU,GAAGjB,cAAc,CAACS,SAAS,CAAC,CAACO,IAAI,CAAC;IAClDD,GAAG,CAACE,UAAU,CAAC,GAAGL,cAAc,CAACI,IAAI,CAAC;IAEtC,IAAIA,IAAI,KAAK,MAAM,EAAE;MACnB;MACAD,GAAG,CAAC,aAAa,CAAC,GAAGH,cAAc,CAACI,IAAI,CAAC;IAC3C;IACA,IAAIA,IAAI,KAAK,OAAO,EAAE;MACpB;MACAD,GAAG,CAAC,cAAc,CAAC,GAAGH,cAAc,CAACI,IAAI,CAAC;IAC5C;IACA,OAAOD,GAAG;EACZ,CAAC,EAAE,CAAC,CAAkD,CAAC;AACzD,CAAC;AAACG,OAAA,CAAAX,kBAAA,GAAAA,kBAAA;AAIK,MAAMY,WAAW,GAAGA,CAACC,IAAmB,EAAEC,QAA0B,KAAK;EAC9E,MAAMC,WAAW,GAAG,IAAAC,aAAM,EAAmBF,QAAQ,CAAC;EACtDC,WAAW,CAACE,OAAO,GAAGH,QAAQ;EAE9B,IAAAI,gBAAS,EAAC,MAAM;IACd,MAAMC,aAAa,GAAIC,KAAqB,IAAKL,WAAW,CAACE,OAAO,CAACG,KAAK,CAAC;IAC3E,MAAMC,UAAU,GAAGC,qBAAQ,CAACC,gBAAgB,CAACV,IAAI,EAAEM,aAAa,CAAC;IAEjE,OAAO,MAAM;MACX,IAAIE,UAAU,aAAVA,UAAU,eAAVA,UAAU,CAAEG,MAAM,EAAEH,UAAU,CAACG,MAAM,CAAC,CAAC;IAC7C,CAAC;EACH,CAAC,EAAE,EAAE,CAAC;AACR,CAAC;;AAED;AACA;AACA;AACA;AAHAb,OAAA,CAAAC,WAAA,GAAAA,WAAA;AAIO,MAAMa,qBAAqB,GAAGA,CAAA,KAAM;EACzC,MAAMC,UAAU,GAAG,IAAAV,aAAM,EAAsCW,SAAS,CAAC;EACzE,MAAM,CAACC,OAAO,EAAEC,UAAU,CAAC,GAAG,IAAAC,eAAQ,EAAC,KAAK,CAAC;EAE7C,OAAO;IACLC,OAAO,EAAEA,CAAA,KAAM;MACb,OAAO,IAAIC,OAAO,CAAQC,OAAO,IAAK;QACpCP,UAAU,CAACT,OAAO,GAAGgB,OAAO;QAC5BJ,UAAU,CAAC,KAAK,CAAC;MACnB,CAAC,CAAC;IACJ,CAAC;IACDK,SAAS,EAAEA,CAAA,KAAM;MAAA,IAAAC,mBAAA;MACf,CAAAA,mBAAA,GAAAT,UAAU,CAACT,OAAO,cAAAkB,mBAAA,eAAlBA,mBAAA,CAAAC,IAAA,CAAAV,UAAqB,CAAC;IACxB,CAAC;IACDE,OAAO;IACPC;EACF,CAAC;AACH,CAAC;AAAClB,OAAA,CAAAc,qBAAA,GAAAA,qBAAA","ignoreList":[]}
@@ -12,6 +12,7 @@ exports.getFileType = void 0;
12
12
  exports.getMimeFromFileExtension = getMimeFromFileExtension;
13
13
  exports.imageExtRegex = void 0;
14
14
  exports.isImage = isImage;
15
+ exports.nonImageMimeSubtypes = void 0;
15
16
  exports.normalizeFileName = normalizeFileName;
16
17
  exports.parseMimeType = parseMimeType;
17
18
  exports.shouldCompressImage = shouldCompressImage;
@@ -58,15 +59,21 @@ const EXTENSION_MIME_MAP = {
58
59
  const imageExtRegex = exports.imageExtRegex = /jpeg|jpg|png|webp|gif/i;
59
60
  const audioExtRegex = exports.audioExtRegex = /3gp|aac|aax|act|aiff|flac|gsm|m4a|m4b|m4p|tta|wma|mp3|webm|wav|ogg/i;
60
61
  const videoExtRegex = exports.videoExtRegex = /mov|vod|mp4|avi|mpeg|ogv/i;
62
+ // HEIC/HEIF should be treated as file, not image (not universally supported for inline display)
63
+ const nonImageMimeSubtypes = exports.nonImageMimeSubtypes = /heic|heif/i;
61
64
  const getFileType = extensionOrType => {
62
65
  const lowerCased = extensionOrType.toLowerCase();
63
66
 
64
67
  // mime type
65
68
  if (lowerCased.indexOf('/') > -1) {
66
- const type = lowerCased.split('/')[0];
69
+ const [type, subtype] = lowerCased.split('/');
67
70
  if (type === 'video') return 'video';
68
71
  if (type === 'audio') return 'audio';
69
- if (type === 'image') return 'image';
72
+ if (type === 'image') {
73
+ // HEIC/HEIF are not universally supported, treat as file
74
+ if (subtype !== null && subtype !== void 0 && subtype.match(nonImageMimeSubtypes)) return 'file';
75
+ return 'image';
76
+ }
70
77
  return 'file';
71
78
  }
72
79
 
@@ -1 +1 @@
1
- {"version":3,"names":["EXTENSION_MIME_MAP","imageExtRegex","exports","audioExtRegex","videoExtRegex","getFileType","extensionOrType","lowerCased","toLowerCase","indexOf","type","split","match","startsWith","getDownscaleSize","origin","resizing","ratio","maxWidth","width","maxHeight","height","Math","min","normalizeFileName","fileName","extension","_extension","_filename","hasExtension","lastIndexOf","length","parseMimeType","mimeType","fullType","parts","subtype","parameters","part","name","value","trim","getFileExtensionFromMime","MIME_EXTENSION_MAP","Object","entries","reduce","acc","key","getMimeFromFileExtension","ext","sliceIdx","extWithoutDot","slice","getFileExtension","filePath","pathWithoutParams","idx","result","getFileExtensionFromUri","uri","fetch","then","response","headers","get","isImage","shouldCompressImage","mime","compressionEnabled","isJPG","Boolean"],"sources":["file.ts"],"sourcesContent":["const EXTENSION_MIME_MAP = {\n // Image\n 'jpeg': 'image/jpeg',\n 'jpg': 'image/jpeg',\n 'png': 'image/png',\n 'gif': 'image/gif',\n 'webp': 'image/webp',\n 'svg': 'image/svg+xml',\n 'heic': 'image/heic',\n 'heif': 'image/heif',\n\n // Video\n '3gp': 'video/3gpp',\n 'mp4': 'video/mp4',\n 'mpeg': 'video/mpeg',\n 'ogv': 'video/ogg',\n 'video/quicktime': 'mov',\n 'webm': 'video/webm',\n 'avi': 'video/x-msvideo',\n\n // Audio\n 'aac': 'audio/aac',\n 'm4a': 'audio/m4a',\n 'mid': 'audio/midi',\n 'mp3': 'audio/mpeg',\n 'ogg': 'audio/ogg',\n 'wav': 'audio/wav',\n 'weba': 'audio/webm',\n\n // Files\n 'txt': 'text/plain',\n 'pdf': 'application/pdf',\n 'doc': 'application/msword',\n 'docx': 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n 'xls': 'application/vnd.ms-excel',\n 'xlsx': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n 'ppt': 'application/vnd.ms-powerpoint',\n 'pptx': 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\n 'zip': 'application/zip',\n 'json': 'application/json',\n 'gzip': 'application/x-gzip',\n} as Record<string, string>;\n\nexport const imageExtRegex = /jpeg|jpg|png|webp|gif/i;\nexport const audioExtRegex = /3gp|aac|aax|act|aiff|flac|gsm|m4a|m4b|m4p|tta|wma|mp3|webm|wav|ogg/i;\nexport const videoExtRegex = /mov|vod|mp4|avi|mpeg|ogv/i;\nexport const getFileType = (extensionOrType: string) => {\n const lowerCased = extensionOrType.toLowerCase();\n\n // mime type\n if (lowerCased.indexOf('/') > -1) {\n const type = lowerCased.split('/')[0];\n if (type === 'video') return 'video';\n if (type === 'audio') return 'audio';\n if (type === 'image') return 'image';\n return 'file';\n }\n\n // extensions\n if (lowerCased.match(imageExtRegex)) return 'image';\n if (lowerCased.match(audioExtRegex)) return 'audio';\n if (lowerCased.match(videoExtRegex)) return 'video';\n\n // others\n if (lowerCased.startsWith('image')) return 'image';\n if (lowerCased.startsWith('audio')) return 'audio';\n if (lowerCased.startsWith('video')) return 'video';\n\n return 'file';\n};\n\n/**\n * Calculates the downscaled size of an image while preserving its aspect ratio.\n *\n * @param {Object} origin - The original size object with `width` and `height` properties.\n * @param {Object} resizing - The resizing object with optional `width` and `height` properties.\n * @returns {Object} - A new size object with the downscaled `width` and `height` properties.\n * @example\n * ```ts\n * getDownscaleSize({ width: 1200, height: 800 }, { width: 600 }); // returns { width: 600, height: 400 }\n * ```\n */\ntype Size = { width: number; height: number };\nexport function getDownscaleSize(origin: Size, resizing: Partial<Size>) {\n let ratio: number;\n\n const maxWidth = resizing.width || origin.width,\n maxHeight = resizing.height || origin.height;\n\n if (origin.width <= maxWidth && origin.height <= maxHeight) {\n ratio = 1;\n } else if (origin.width > maxWidth && origin.height <= maxHeight) {\n ratio = maxWidth / origin.width;\n } else if (origin.width <= maxWidth && origin.height > maxHeight) {\n ratio = maxHeight / origin.height;\n } else {\n ratio = Math.min(maxWidth / origin.width, maxHeight / origin.height);\n }\n\n return { width: origin.width * ratio, height: origin.height * ratio };\n}\n\n/**\n * Normalize a file name by ensuring it has the given extension, if it doesn't already.\n *\n * @param {string} fileName - The file name to normalize.\n * @param {string} extension - The desired extension, without a leading period.\n * @returns {string} - The normalized file name, with the extension.\n */\nexport function normalizeFileName(fileName: string, extension: string) {\n if (!extension) return fileName;\n\n // .extension\n let _extension = extension.toLowerCase();\n if (_extension.indexOf('.') !== 0) {\n _extension = '.' + _extension;\n }\n\n // filename.extension | filename\n const _filename = fileName.toLowerCase();\n const hasExtension = _filename.lastIndexOf(_extension) === _filename.length - _extension.length;\n if (!hasExtension) {\n // filename.extension\n return fileName + _extension;\n } else {\n // filename.extension\n return fileName;\n }\n}\n\n/**\n * Parses a MIME type string into its components.\n *\n * @param mimeType - The MIME type string to parse.\n * @returns An object containing the type, subtype, and parameters of the MIME type.\n */\ntype MimeType = { type: string; subtype: string; parameters: Record<string, string> };\nexport function parseMimeType(mimeType: string): MimeType {\n const [fullType, ...parts] = mimeType.split(';');\n const [type, subtype] = fullType.split('/');\n const parameters: MimeType['parameters'] = {};\n\n for (const part of parts) {\n const [name, value] = part.trim().split('=');\n parameters[name] = value;\n }\n\n return { type, subtype, parameters };\n}\n\n/**\n * Returns the file extension based on the MIME type.\n *\n * @param {string | null | undefined} mimeType - The MIME type to look up.\n * @returns {string} - The file extension for the given MIME type, or an empty string if no matching file extension was found.\n */\nexport function getFileExtensionFromMime(mimeType?: string | null): string {\n if (!mimeType) return '';\n const MIME_EXTENSION_MAP = Object.entries(EXTENSION_MIME_MAP).reduce((acc, [key, value]) => {\n acc[value] = key;\n return acc;\n }, {} as Record<string, string>);\n\n const extension = MIME_EXTENSION_MAP[mimeType.toLowerCase()];\n if (extension) return '.' + extension;\n return '';\n}\n\n/**\n * Returns the MIME type based on the file extension.\n *\n * @param {string | null | undefined} ext - The file extension to look up.\n * @returns {string} - The MIME type for the given file extension, or an empty string if no matching MIME type was found.\n */\nexport function getMimeFromFileExtension(ext?: string | null) {\n if (!ext) return '';\n\n const sliceIdx = ext.lastIndexOf('.');\n const extWithoutDot = sliceIdx === -1 ? ext : ext.slice(sliceIdx + 1);\n\n return EXTENSION_MIME_MAP[extWithoutDot.toLowerCase()] || '';\n}\n\n/**\n * Returns the file extension of a file path.\n *\n * @param {string} filePath - The file path to extract the extension from.\n * @returns {string} - The file extension, or an empty string if the file path does not have an extension.\n */\nexport function getFileExtension(filePath: string) {\n const pathWithoutParams = filePath.split('?')[0];\n\n const idx = pathWithoutParams.lastIndexOf('.');\n if (idx === -1) return '';\n\n const result = pathWithoutParams.slice(idx - pathWithoutParams.length).toLowerCase();\n if (result === '.') return '';\n else return result;\n}\n\nexport async function getFileExtensionFromUri(uri: string) {\n const type = await fetch(uri).then((response) => response.headers.get('content-type'));\n return getFileExtensionFromMime(type);\n}\n\nexport function isImage(filePath: string, mimeType?: string) {\n const type = getFileType(mimeType || getFileExtension(filePath));\n return type === 'image';\n}\n\nexport function shouldCompressImage(mime: string, compressionEnabled = true) {\n const extension = isJPG(mime) ? 'jpg' : getFileExtensionFromMime(mime);\n return Boolean(extension.match(/jpg|jpeg|png/i) && compressionEnabled);\n}\n\n/**\n * https://github.com/gathertown/sendbird-uikit-react-native/pull/29\n * This function is used solely for the purpose of classifying `image/jpg`.\n *\n * We only use it to determine whether image compression is applied because `image/jpg` is not a MIME type standard.\n * Therefore, it is not reflected in `EXTENSION_MIME_MAP`, which extracts MIME types uploaded to the server. (to comply standard)\n * */\nfunction isJPG(mime: string) {\n return mime === 'image/jpg';\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["EXTENSION_MIME_MAP","imageExtRegex","exports","audioExtRegex","videoExtRegex","nonImageMimeSubtypes","getFileType","extensionOrType","lowerCased","toLowerCase","indexOf","type","subtype","split","match","startsWith","getDownscaleSize","origin","resizing","ratio","maxWidth","width","maxHeight","height","Math","min","normalizeFileName","fileName","extension","_extension","_filename","hasExtension","lastIndexOf","length","parseMimeType","mimeType","fullType","parts","parameters","part","name","value","trim","getFileExtensionFromMime","MIME_EXTENSION_MAP","Object","entries","reduce","acc","key","getMimeFromFileExtension","ext","sliceIdx","extWithoutDot","slice","getFileExtension","filePath","pathWithoutParams","idx","result","getFileExtensionFromUri","uri","fetch","then","response","headers","get","isImage","shouldCompressImage","mime","compressionEnabled","isJPG","Boolean"],"sources":["file.ts"],"sourcesContent":["const EXTENSION_MIME_MAP = {\n // Image\n 'jpeg': 'image/jpeg',\n 'jpg': 'image/jpeg',\n 'png': 'image/png',\n 'gif': 'image/gif',\n 'webp': 'image/webp',\n 'svg': 'image/svg+xml',\n 'heic': 'image/heic',\n 'heif': 'image/heif',\n\n // Video\n '3gp': 'video/3gpp',\n 'mp4': 'video/mp4',\n 'mpeg': 'video/mpeg',\n 'ogv': 'video/ogg',\n 'video/quicktime': 'mov',\n 'webm': 'video/webm',\n 'avi': 'video/x-msvideo',\n\n // Audio\n 'aac': 'audio/aac',\n 'm4a': 'audio/m4a',\n 'mid': 'audio/midi',\n 'mp3': 'audio/mpeg',\n 'ogg': 'audio/ogg',\n 'wav': 'audio/wav',\n 'weba': 'audio/webm',\n\n // Files\n 'txt': 'text/plain',\n 'pdf': 'application/pdf',\n 'doc': 'application/msword',\n 'docx': 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n 'xls': 'application/vnd.ms-excel',\n 'xlsx': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n 'ppt': 'application/vnd.ms-powerpoint',\n 'pptx': 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\n 'zip': 'application/zip',\n 'json': 'application/json',\n 'gzip': 'application/x-gzip',\n} as Record<string, string>;\n\nexport const imageExtRegex = /jpeg|jpg|png|webp|gif/i;\nexport const audioExtRegex = /3gp|aac|aax|act|aiff|flac|gsm|m4a|m4b|m4p|tta|wma|mp3|webm|wav|ogg/i;\nexport const videoExtRegex = /mov|vod|mp4|avi|mpeg|ogv/i;\n// HEIC/HEIF should be treated as file, not image (not universally supported for inline display)\nexport const nonImageMimeSubtypes = /heic|heif/i;\nexport const getFileType = (extensionOrType: string) => {\n const lowerCased = extensionOrType.toLowerCase();\n\n // mime type\n if (lowerCased.indexOf('/') > -1) {\n const [type, subtype] = lowerCased.split('/');\n if (type === 'video') return 'video';\n if (type === 'audio') return 'audio';\n if (type === 'image') {\n // HEIC/HEIF are not universally supported, treat as file\n if (subtype?.match(nonImageMimeSubtypes)) return 'file';\n return 'image';\n }\n return 'file';\n }\n\n // extensions\n if (lowerCased.match(imageExtRegex)) return 'image';\n if (lowerCased.match(audioExtRegex)) return 'audio';\n if (lowerCased.match(videoExtRegex)) return 'video';\n\n // others\n if (lowerCased.startsWith('image')) return 'image';\n if (lowerCased.startsWith('audio')) return 'audio';\n if (lowerCased.startsWith('video')) return 'video';\n\n return 'file';\n};\n\n/**\n * Calculates the downscaled size of an image while preserving its aspect ratio.\n *\n * @param {Object} origin - The original size object with `width` and `height` properties.\n * @param {Object} resizing - The resizing object with optional `width` and `height` properties.\n * @returns {Object} - A new size object with the downscaled `width` and `height` properties.\n * @example\n * ```ts\n * getDownscaleSize({ width: 1200, height: 800 }, { width: 600 }); // returns { width: 600, height: 400 }\n * ```\n */\ntype Size = { width: number; height: number };\nexport function getDownscaleSize(origin: Size, resizing: Partial<Size>) {\n let ratio: number;\n\n const maxWidth = resizing.width || origin.width,\n maxHeight = resizing.height || origin.height;\n\n if (origin.width <= maxWidth && origin.height <= maxHeight) {\n ratio = 1;\n } else if (origin.width > maxWidth && origin.height <= maxHeight) {\n ratio = maxWidth / origin.width;\n } else if (origin.width <= maxWidth && origin.height > maxHeight) {\n ratio = maxHeight / origin.height;\n } else {\n ratio = Math.min(maxWidth / origin.width, maxHeight / origin.height);\n }\n\n return { width: origin.width * ratio, height: origin.height * ratio };\n}\n\n/**\n * Normalize a file name by ensuring it has the given extension, if it doesn't already.\n *\n * @param {string} fileName - The file name to normalize.\n * @param {string} extension - The desired extension, without a leading period.\n * @returns {string} - The normalized file name, with the extension.\n */\nexport function normalizeFileName(fileName: string, extension: string) {\n if (!extension) return fileName;\n\n // .extension\n let _extension = extension.toLowerCase();\n if (_extension.indexOf('.') !== 0) {\n _extension = '.' + _extension;\n }\n\n // filename.extension | filename\n const _filename = fileName.toLowerCase();\n const hasExtension = _filename.lastIndexOf(_extension) === _filename.length - _extension.length;\n if (!hasExtension) {\n // filename.extension\n return fileName + _extension;\n } else {\n // filename.extension\n return fileName;\n }\n}\n\n/**\n * Parses a MIME type string into its components.\n *\n * @param mimeType - The MIME type string to parse.\n * @returns An object containing the type, subtype, and parameters of the MIME type.\n */\ntype MimeType = { type: string; subtype: string; parameters: Record<string, string> };\nexport function parseMimeType(mimeType: string): MimeType {\n const [fullType, ...parts] = mimeType.split(';');\n const [type, subtype] = fullType.split('/');\n const parameters: MimeType['parameters'] = {};\n\n for (const part of parts) {\n const [name, value] = part.trim().split('=');\n parameters[name] = value;\n }\n\n return { type, subtype, parameters };\n}\n\n/**\n * Returns the file extension based on the MIME type.\n *\n * @param {string | null | undefined} mimeType - The MIME type to look up.\n * @returns {string} - The file extension for the given MIME type, or an empty string if no matching file extension was found.\n */\nexport function getFileExtensionFromMime(mimeType?: string | null): string {\n if (!mimeType) return '';\n const MIME_EXTENSION_MAP = Object.entries(EXTENSION_MIME_MAP).reduce((acc, [key, value]) => {\n acc[value] = key;\n return acc;\n }, {} as Record<string, string>);\n\n const extension = MIME_EXTENSION_MAP[mimeType.toLowerCase()];\n if (extension) return '.' + extension;\n return '';\n}\n\n/**\n * Returns the MIME type based on the file extension.\n *\n * @param {string | null | undefined} ext - The file extension to look up.\n * @returns {string} - The MIME type for the given file extension, or an empty string if no matching MIME type was found.\n */\nexport function getMimeFromFileExtension(ext?: string | null) {\n if (!ext) return '';\n\n const sliceIdx = ext.lastIndexOf('.');\n const extWithoutDot = sliceIdx === -1 ? ext : ext.slice(sliceIdx + 1);\n\n return EXTENSION_MIME_MAP[extWithoutDot.toLowerCase()] || '';\n}\n\n/**\n * Returns the file extension of a file path.\n *\n * @param {string} filePath - The file path to extract the extension from.\n * @returns {string} - The file extension, or an empty string if the file path does not have an extension.\n */\nexport function getFileExtension(filePath: string) {\n const pathWithoutParams = filePath.split('?')[0];\n\n const idx = pathWithoutParams.lastIndexOf('.');\n if (idx === -1) return '';\n\n const result = pathWithoutParams.slice(idx - pathWithoutParams.length).toLowerCase();\n if (result === '.') return '';\n else return result;\n}\n\nexport async function getFileExtensionFromUri(uri: string) {\n const type = await fetch(uri).then((response) => response.headers.get('content-type'));\n return getFileExtensionFromMime(type);\n}\n\nexport function isImage(filePath: string, mimeType?: string) {\n const type = getFileType(mimeType || getFileExtension(filePath));\n return type === 'image';\n}\n\nexport function shouldCompressImage(mime: string, compressionEnabled = true) {\n const extension = isJPG(mime) ? 'jpg' : getFileExtensionFromMime(mime);\n return Boolean(extension.match(/jpg|jpeg|png/i) && compressionEnabled);\n}\n\n/**\n * https://github.com/gathertown/sendbird-uikit-react-native/pull/29\n * This function is used solely for the purpose of classifying `image/jpg`.\n *\n * We only use it to determine whether image compression is applied because `image/jpg` is not a MIME type standard.\n * Therefore, it is not reflected in `EXTENSION_MIME_MAP`, which extracts MIME types uploaded to the server. (to comply standard)\n * */\nfunction isJPG(mime: string) {\n return mime === 'image/jpg';\n}\n"],"mappings":"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","ignoreList":[]}
@@ -63,7 +63,7 @@ export const useFreshCallback = callback => {
63
63
  return useCallback((...args) => ref.current(...args), []);
64
64
  };
65
65
  export const useDebounceEffect = (action, delay, deps = []) => {
66
- const timeoutRef = useRef();
66
+ const timeoutRef = useRef(undefined);
67
67
  useEffect(() => {
68
68
  timeoutRef.current = setTimeout(async () => {
69
69
  try {
@@ -1 +1 @@
1
- {"version":3,"names":["useCallback","useEffect","useLayoutEffect","useReducer","useRef","useState","idPool","useUniqId","key","useUniqHandlerId","name","id","useForceUpdate","updater","prev","useAsyncEffect","asyncEffect","deps","createAsyncEffectCallback","useAsyncLayoutEffect","useIIFE","callback","iife","destructor","Promise","awaitedDestructor","useIsMountedRef","isMounted","current","useIsFirstMount","isFirstMount","useFreshCallback","ref","args","useDebounceEffect","action","delay","timeoutRef","setTimeout","undefined","clearTimeout","usePartialState","initialState","state","useRefTracker","target"],"sources":["index.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type { DependencyList } from 'react';\nimport { useCallback, useEffect, useLayoutEffect, useReducer, useRef, useState } from 'react';\n\ntype Destructor = () => void;\ntype AsyncEffectCallback = () => void | Destructor | Promise<void> | Promise<Destructor>;\n\nconst idPool: { [key: string]: number } = {};\nexport const useUniqId = (key: string) => {\n return useState(() => {\n if (!idPool[key]) idPool[key] = 1;\n return idPool[key]++;\n })[0];\n};\n\nexport const useUniqHandlerId = (name: string) => {\n const id = useUniqId(name);\n return `${name}_${id}`;\n};\n\nexport const useForceUpdate = () => {\n const [, updater] = useState(0);\n return useCallback(() => updater((prev) => prev + 1), []);\n};\n\nexport const useAsyncEffect = (asyncEffect: AsyncEffectCallback, deps?: DependencyList) => {\n useEffect(createAsyncEffectCallback(asyncEffect), deps);\n};\nexport const useAsyncLayoutEffect = (asyncEffect: AsyncEffectCallback, deps?: DependencyList) => {\n useLayoutEffect(createAsyncEffectCallback(asyncEffect), deps);\n};\nexport const useIIFE = <T>(callback: () => T) => {\n return iife(callback);\n};\nconst iife = <T extends (...args: any[]) => any>(callback: T): ReturnType<T> => callback();\nconst createAsyncEffectCallback = (asyncEffect: AsyncEffectCallback) => () => {\n const destructor = iife(asyncEffect);\n return () => {\n if (!destructor) return;\n\n if (destructor instanceof Promise) {\n iife(async () => {\n const awaitedDestructor = await destructor;\n if (awaitedDestructor) awaitedDestructor();\n });\n } else {\n iife(destructor);\n }\n };\n};\n\nexport const useIsMountedRef = () => {\n const isMounted = useRef(true);\n\n useEffect(() => {\n return () => {\n isMounted.current = false;\n };\n }, []);\n\n return isMounted;\n};\n\nexport const useIsFirstMount = () => {\n const isFirstMount = useRef(true);\n\n if (isFirstMount.current) {\n isFirstMount.current = false;\n return true;\n }\n\n return isFirstMount.current;\n};\n\nexport const useFreshCallback = <T extends Function>(callback: T): T => {\n const ref = useRef<T>(callback);\n ref.current = callback;\n return useCallback(((...args: any[]) => ref.current(...args)) as unknown as T, []);\n};\n\nexport const useDebounceEffect = (action: () => void, delay: number, deps: DependencyList = []) => {\n const timeoutRef = useRef<NodeJS.Timeout>();\n\n useEffect(() => {\n timeoutRef.current = setTimeout(async () => {\n try {\n await action();\n } finally {\n timeoutRef.current = undefined;\n }\n }, delay);\n\n return () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = undefined;\n }\n };\n }, [delay, ...deps]);\n};\n\nexport const usePartialState = <S>(initialState: S) => {\n return useReducer((prev: S, state: Partial<S>) => ({ ...prev, ...state }), initialState);\n};\n\nexport const useRefTracker = <T>(target: T) => {\n const ref = useRef(target);\n\n useLayoutEffect(() => {\n ref.current = target;\n });\n\n return ref;\n};\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["useCallback","useEffect","useLayoutEffect","useReducer","useRef","useState","idPool","useUniqId","key","useUniqHandlerId","name","id","useForceUpdate","updater","prev","useAsyncEffect","asyncEffect","deps","createAsyncEffectCallback","useAsyncLayoutEffect","useIIFE","callback","iife","destructor","Promise","awaitedDestructor","useIsMountedRef","isMounted","current","useIsFirstMount","isFirstMount","useFreshCallback","ref","args","useDebounceEffect","action","delay","timeoutRef","undefined","setTimeout","clearTimeout","usePartialState","initialState","state","useRefTracker","target"],"sources":["index.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type { DependencyList } from 'react';\nimport { useCallback, useEffect, useLayoutEffect, useReducer, useRef, useState } from 'react';\n\ntype Destructor = () => void;\ntype AsyncEffectCallback = () => void | Destructor | Promise<void> | Promise<Destructor>;\n\nconst idPool: { [key: string]: number } = {};\nexport const useUniqId = (key: string) => {\n return useState(() => {\n if (!idPool[key]) idPool[key] = 1;\n return idPool[key]++;\n })[0];\n};\n\nexport const useUniqHandlerId = (name: string) => {\n const id = useUniqId(name);\n return `${name}_${id}`;\n};\n\nexport const useForceUpdate = () => {\n const [, updater] = useState(0);\n return useCallback(() => updater((prev) => prev + 1), []);\n};\n\nexport const useAsyncEffect = (asyncEffect: AsyncEffectCallback, deps?: DependencyList) => {\n useEffect(createAsyncEffectCallback(asyncEffect), deps);\n};\nexport const useAsyncLayoutEffect = (asyncEffect: AsyncEffectCallback, deps?: DependencyList) => {\n useLayoutEffect(createAsyncEffectCallback(asyncEffect), deps);\n};\nexport const useIIFE = <T>(callback: () => T) => {\n return iife(callback);\n};\nconst iife = <T extends (...args: any[]) => any>(callback: T): ReturnType<T> => callback();\nconst createAsyncEffectCallback = (asyncEffect: AsyncEffectCallback) => () => {\n const destructor = iife(asyncEffect);\n return () => {\n if (!destructor) return;\n\n if (destructor instanceof Promise) {\n iife(async () => {\n const awaitedDestructor = await destructor;\n if (awaitedDestructor) awaitedDestructor();\n });\n } else {\n iife(destructor);\n }\n };\n};\n\nexport const useIsMountedRef = () => {\n const isMounted = useRef(true);\n\n useEffect(() => {\n return () => {\n isMounted.current = false;\n };\n }, []);\n\n return isMounted;\n};\n\nexport const useIsFirstMount = () => {\n const isFirstMount = useRef(true);\n\n if (isFirstMount.current) {\n isFirstMount.current = false;\n return true;\n }\n\n return isFirstMount.current;\n};\n\nexport const useFreshCallback = <T extends Function>(callback: T): T => {\n const ref = useRef<T>(callback);\n ref.current = callback;\n return useCallback(((...args: any[]) => ref.current(...args)) as unknown as T, []);\n};\n\nexport const useDebounceEffect = (action: () => void, delay: number, deps: DependencyList = []) => {\n const timeoutRef = useRef<NodeJS.Timeout | undefined>(undefined);\n\n useEffect(() => {\n timeoutRef.current = setTimeout(async () => {\n try {\n await action();\n } finally {\n timeoutRef.current = undefined;\n }\n }, delay);\n\n return () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = undefined;\n }\n };\n }, [delay, ...deps]);\n};\n\nexport const usePartialState = <S>(initialState: S) => {\n return useReducer((prev: S, state: Partial<S>) => ({ ...prev, ...state }), initialState);\n};\n\nexport const useRefTracker = <T>(target: T) => {\n const ref = useRef(target);\n\n useLayoutEffect(() => {\n ref.current = target;\n });\n\n return ref;\n};\n"],"mappings":"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","ignoreList":[]}
@@ -48,7 +48,7 @@ export const useAppState = (type, listener) => {
48
48
  * To achieve this, you can use a deferred onClose that can be awaited until the onDismiss is called.
49
49
  * */
50
50
  export const useDeferredModalState = () => {
51
- const resolveRef = useRef();
51
+ const resolveRef = useRef(undefined);
52
52
  const [visible, setVisible] = useState(false);
53
53
  return {
54
54
  onClose: () => {
@@ -1 +1 @@
1
- {"version":3,"names":["useEffect","useRef","useState","AppState","I18nManager","useSafeAreaInsets","edgePaddingMap","ltr","left","right","top","bottom","rtl","useSafeAreaPadding","edges","direction","isRTL","safeAreaInsets","reduce","map","edge","paddingKey","useAppState","type","listener","callbackRef","current","eventListener","state","subscriber","addEventListener","remove","useDeferredModalState","resolveRef","visible","setVisible","onClose","Promise","resolve","onDismiss","_resolveRef$current","call"],"sources":["react-native.ts"],"sourcesContent":["import { useEffect, useRef, useState } from 'react';\nimport { AppState, AppStateEvent, AppStateStatus, I18nManager } from 'react-native';\nimport { EdgeInsets, useSafeAreaInsets } from 'react-native-safe-area-context';\n\ntype EdgePaddingMap = {\n left: 'paddingStart' | 'paddingEnd';\n right: 'paddingStart' | 'paddingEnd';\n top: 'paddingTop';\n bottom: 'paddingBottom';\n};\n\nconst edgePaddingMap: Record<'ltr' | 'rtl', EdgePaddingMap> = {\n ltr: {\n left: 'paddingStart',\n right: 'paddingEnd',\n top: 'paddingTop',\n bottom: 'paddingBottom',\n },\n rtl: {\n left: 'paddingEnd',\n right: 'paddingStart',\n top: 'paddingTop',\n bottom: 'paddingBottom',\n },\n};\n\nexport const useSafeAreaPadding = <\n T extends keyof EdgeInsets,\n Result extends { [key in EdgePaddingMap[T]]: EdgeInsets[T] },\n>(\n edges: T[],\n direction: 'ltr' | 'rtl' = I18nManager.isRTL ? 'rtl' : 'ltr',\n): Result => {\n const safeAreaInsets = useSafeAreaInsets();\n return edges.reduce((map, edge) => {\n const paddingKey = edgePaddingMap[direction][edge];\n map[paddingKey] = safeAreaInsets[edge];\n\n if (edge === 'left') {\n // @ts-expect-error backward compatibility\n map['paddingLeft'] = safeAreaInsets[edge];\n }\n if (edge === 'right') {\n // @ts-expect-error backward compatibility\n map['paddingRight'] = safeAreaInsets[edge];\n }\n return map;\n }, {} as { [key in EdgePaddingMap[T]]: EdgeInsets[T] }) as Result;\n};\n\ntype AppStateListener = (status: AppStateStatus) => void;\n\nexport const useAppState = (type: AppStateEvent, listener: AppStateListener) => {\n const callbackRef = useRef<AppStateListener>(listener);\n callbackRef.current = listener;\n\n useEffect(() => {\n const eventListener = (state: AppStateStatus) => callbackRef.current(state);\n const subscriber = AppState.addEventListener(type, eventListener);\n\n return () => {\n if (subscriber?.remove) subscriber.remove();\n };\n }, []);\n};\n\n/**\n * To display a new modal in React-Native, you should ensure that a new modal is opened only after the existing modal has been dismissed to avoid conflicts.\n * To achieve this, you can use a deferred onClose that can be awaited until the onDismiss is called.\n * */\nexport const useDeferredModalState = () => {\n const resolveRef = useRef<(value: void) => void>();\n const [visible, setVisible] = useState(false);\n\n return {\n onClose: () => {\n return new Promise<void>((resolve) => {\n resolveRef.current = resolve;\n setVisible(false);\n });\n },\n onDismiss: () => {\n resolveRef.current?.();\n },\n visible,\n setVisible,\n };\n};\n"],"mappings":"AAAA,SAASA,SAAS,EAAEC,MAAM,EAAEC,QAAQ,QAAQ,OAAO;AACnD,SAASC,QAAQ,EAAiCC,WAAW,QAAQ,cAAc;AACnF,SAAqBC,iBAAiB,QAAQ,gCAAgC;AAS9E,MAAMC,cAAqD,GAAG;EAC5DC,GAAG,EAAE;IACHC,IAAI,EAAE,cAAc;IACpBC,KAAK,EAAE,YAAY;IACnBC,GAAG,EAAE,YAAY;IACjBC,MAAM,EAAE;EACV,CAAC;EACDC,GAAG,EAAE;IACHJ,IAAI,EAAE,YAAY;IAClBC,KAAK,EAAE,cAAc;IACrBC,GAAG,EAAE,YAAY;IACjBC,MAAM,EAAE;EACV;AACF,CAAC;AAED,OAAO,MAAME,kBAAkB,GAAGA,CAIhCC,KAAU,EACVC,SAAwB,GAAGX,WAAW,CAACY,KAAK,GAAG,KAAK,GAAG,KAAK,KACjD;EACX,MAAMC,cAAc,GAAGZ,iBAAiB,CAAC,CAAC;EAC1C,OAAOS,KAAK,CAACI,MAAM,CAAC,CAACC,GAAG,EAAEC,IAAI,KAAK;IACjC,MAAMC,UAAU,GAAGf,cAAc,CAACS,SAAS,CAAC,CAACK,IAAI,CAAC;IAClDD,GAAG,CAACE,UAAU,CAAC,GAAGJ,cAAc,CAACG,IAAI,CAAC;IAEtC,IAAIA,IAAI,KAAK,MAAM,EAAE;MACnB;MACAD,GAAG,CAAC,aAAa,CAAC,GAAGF,cAAc,CAACG,IAAI,CAAC;IAC3C;IACA,IAAIA,IAAI,KAAK,OAAO,EAAE;MACpB;MACAD,GAAG,CAAC,cAAc,CAAC,GAAGF,cAAc,CAACG,IAAI,CAAC;IAC5C;IACA,OAAOD,GAAG;EACZ,CAAC,EAAE,CAAC,CAAkD,CAAC;AACzD,CAAC;AAID,OAAO,MAAMG,WAAW,GAAGA,CAACC,IAAmB,EAAEC,QAA0B,KAAK;EAC9E,MAAMC,WAAW,GAAGxB,MAAM,CAAmBuB,QAAQ,CAAC;EACtDC,WAAW,CAACC,OAAO,GAAGF,QAAQ;EAE9BxB,SAAS,CAAC,MAAM;IACd,MAAM2B,aAAa,GAAIC,KAAqB,IAAKH,WAAW,CAACC,OAAO,CAACE,KAAK,CAAC;IAC3E,MAAMC,UAAU,GAAG1B,QAAQ,CAAC2B,gBAAgB,CAACP,IAAI,EAAEI,aAAa,CAAC;IAEjE,OAAO,MAAM;MACX,IAAIE,UAAU,aAAVA,UAAU,eAAVA,UAAU,CAAEE,MAAM,EAAEF,UAAU,CAACE,MAAM,CAAC,CAAC;IAC7C,CAAC;EACH,CAAC,EAAE,EAAE,CAAC;AACR,CAAC;;AAED;AACA;AACA;AACA;AACA,OAAO,MAAMC,qBAAqB,GAAGA,CAAA,KAAM;EACzC,MAAMC,UAAU,GAAGhC,MAAM,CAAwB,CAAC;EAClD,MAAM,CAACiC,OAAO,EAAEC,UAAU,CAAC,GAAGjC,QAAQ,CAAC,KAAK,CAAC;EAE7C,OAAO;IACLkC,OAAO,EAAEA,CAAA,KAAM;MACb,OAAO,IAAIC,OAAO,CAAQC,OAAO,IAAK;QACpCL,UAAU,CAACP,OAAO,GAAGY,OAAO;QAC5BH,UAAU,CAAC,KAAK,CAAC;MACnB,CAAC,CAAC;IACJ,CAAC;IACDI,SAAS,EAAEA,CAAA,KAAM;MAAA,IAAAC,mBAAA;MACf,CAAAA,mBAAA,GAAAP,UAAU,CAACP,OAAO,cAAAc,mBAAA,eAAlBA,mBAAA,CAAAC,IAAA,CAAAR,UAAqB,CAAC;IACxB,CAAC;IACDC,OAAO;IACPC;EACF,CAAC;AACH,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["useEffect","useRef","useState","AppState","I18nManager","useSafeAreaInsets","edgePaddingMap","ltr","left","right","top","bottom","rtl","useSafeAreaPadding","edges","direction","isRTL","safeAreaInsets","reduce","map","edge","paddingKey","useAppState","type","listener","callbackRef","current","eventListener","state","subscriber","addEventListener","remove","useDeferredModalState","resolveRef","undefined","visible","setVisible","onClose","Promise","resolve","onDismiss","_resolveRef$current","call"],"sources":["react-native.ts"],"sourcesContent":["import { useEffect, useRef, useState } from 'react';\nimport { AppState, AppStateEvent, AppStateStatus, I18nManager } from 'react-native';\nimport { EdgeInsets, useSafeAreaInsets } from 'react-native-safe-area-context';\n\ntype EdgePaddingMap = {\n left: 'paddingStart' | 'paddingEnd';\n right: 'paddingStart' | 'paddingEnd';\n top: 'paddingTop';\n bottom: 'paddingBottom';\n};\n\nconst edgePaddingMap: Record<'ltr' | 'rtl', EdgePaddingMap> = {\n ltr: {\n left: 'paddingStart',\n right: 'paddingEnd',\n top: 'paddingTop',\n bottom: 'paddingBottom',\n },\n rtl: {\n left: 'paddingEnd',\n right: 'paddingStart',\n top: 'paddingTop',\n bottom: 'paddingBottom',\n },\n};\n\nexport const useSafeAreaPadding = <\n T extends keyof EdgeInsets,\n Result extends { [key in EdgePaddingMap[T]]: EdgeInsets[T] },\n>(\n edges: T[],\n direction: 'ltr' | 'rtl' = I18nManager.isRTL ? 'rtl' : 'ltr',\n): Result => {\n const safeAreaInsets = useSafeAreaInsets();\n return edges.reduce((map, edge) => {\n const paddingKey = edgePaddingMap[direction][edge];\n map[paddingKey] = safeAreaInsets[edge];\n\n if (edge === 'left') {\n // @ts-expect-error backward compatibility\n map['paddingLeft'] = safeAreaInsets[edge];\n }\n if (edge === 'right') {\n // @ts-expect-error backward compatibility\n map['paddingRight'] = safeAreaInsets[edge];\n }\n return map;\n }, {} as { [key in EdgePaddingMap[T]]: EdgeInsets[T] }) as Result;\n};\n\ntype AppStateListener = (status: AppStateStatus) => void;\n\nexport const useAppState = (type: AppStateEvent, listener: AppStateListener) => {\n const callbackRef = useRef<AppStateListener>(listener);\n callbackRef.current = listener;\n\n useEffect(() => {\n const eventListener = (state: AppStateStatus) => callbackRef.current(state);\n const subscriber = AppState.addEventListener(type, eventListener);\n\n return () => {\n if (subscriber?.remove) subscriber.remove();\n };\n }, []);\n};\n\n/**\n * To display a new modal in React-Native, you should ensure that a new modal is opened only after the existing modal has been dismissed to avoid conflicts.\n * To achieve this, you can use a deferred onClose that can be awaited until the onDismiss is called.\n * */\nexport const useDeferredModalState = () => {\n const resolveRef = useRef<((value: void) => void) | undefined>(undefined);\n const [visible, setVisible] = useState(false);\n\n return {\n onClose: () => {\n return new Promise<void>((resolve) => {\n resolveRef.current = resolve;\n setVisible(false);\n });\n },\n onDismiss: () => {\n resolveRef.current?.();\n },\n visible,\n setVisible,\n };\n};\n"],"mappings":"AAAA,SAASA,SAAS,EAAEC,MAAM,EAAEC,QAAQ,QAAQ,OAAO;AACnD,SAASC,QAAQ,EAAiCC,WAAW,QAAQ,cAAc;AACnF,SAAqBC,iBAAiB,QAAQ,gCAAgC;AAS9E,MAAMC,cAAqD,GAAG;EAC5DC,GAAG,EAAE;IACHC,IAAI,EAAE,cAAc;IACpBC,KAAK,EAAE,YAAY;IACnBC,GAAG,EAAE,YAAY;IACjBC,MAAM,EAAE;EACV,CAAC;EACDC,GAAG,EAAE;IACHJ,IAAI,EAAE,YAAY;IAClBC,KAAK,EAAE,cAAc;IACrBC,GAAG,EAAE,YAAY;IACjBC,MAAM,EAAE;EACV;AACF,CAAC;AAED,OAAO,MAAME,kBAAkB,GAAGA,CAIhCC,KAAU,EACVC,SAAwB,GAAGX,WAAW,CAACY,KAAK,GAAG,KAAK,GAAG,KAAK,KACjD;EACX,MAAMC,cAAc,GAAGZ,iBAAiB,CAAC,CAAC;EAC1C,OAAOS,KAAK,CAACI,MAAM,CAAC,CAACC,GAAG,EAAEC,IAAI,KAAK;IACjC,MAAMC,UAAU,GAAGf,cAAc,CAACS,SAAS,CAAC,CAACK,IAAI,CAAC;IAClDD,GAAG,CAACE,UAAU,CAAC,GAAGJ,cAAc,CAACG,IAAI,CAAC;IAEtC,IAAIA,IAAI,KAAK,MAAM,EAAE;MACnB;MACAD,GAAG,CAAC,aAAa,CAAC,GAAGF,cAAc,CAACG,IAAI,CAAC;IAC3C;IACA,IAAIA,IAAI,KAAK,OAAO,EAAE;MACpB;MACAD,GAAG,CAAC,cAAc,CAAC,GAAGF,cAAc,CAACG,IAAI,CAAC;IAC5C;IACA,OAAOD,GAAG;EACZ,CAAC,EAAE,CAAC,CAAkD,CAAC;AACzD,CAAC;AAID,OAAO,MAAMG,WAAW,GAAGA,CAACC,IAAmB,EAAEC,QAA0B,KAAK;EAC9E,MAAMC,WAAW,GAAGxB,MAAM,CAAmBuB,QAAQ,CAAC;EACtDC,WAAW,CAACC,OAAO,GAAGF,QAAQ;EAE9BxB,SAAS,CAAC,MAAM;IACd,MAAM2B,aAAa,GAAIC,KAAqB,IAAKH,WAAW,CAACC,OAAO,CAACE,KAAK,CAAC;IAC3E,MAAMC,UAAU,GAAG1B,QAAQ,CAAC2B,gBAAgB,CAACP,IAAI,EAAEI,aAAa,CAAC;IAEjE,OAAO,MAAM;MACX,IAAIE,UAAU,aAAVA,UAAU,eAAVA,UAAU,CAAEE,MAAM,EAAEF,UAAU,CAACE,MAAM,CAAC,CAAC;IAC7C,CAAC;EACH,CAAC,EAAE,EAAE,CAAC;AACR,CAAC;;AAED;AACA;AACA;AACA;AACA,OAAO,MAAMC,qBAAqB,GAAGA,CAAA,KAAM;EACzC,MAAMC,UAAU,GAAGhC,MAAM,CAAsCiC,SAAS,CAAC;EACzE,MAAM,CAACC,OAAO,EAAEC,UAAU,CAAC,GAAGlC,QAAQ,CAAC,KAAK,CAAC;EAE7C,OAAO;IACLmC,OAAO,EAAEA,CAAA,KAAM;MACb,OAAO,IAAIC,OAAO,CAAQC,OAAO,IAAK;QACpCN,UAAU,CAACP,OAAO,GAAGa,OAAO;QAC5BH,UAAU,CAAC,KAAK,CAAC;MACnB,CAAC,CAAC;IACJ,CAAC;IACDI,SAAS,EAAEA,CAAA,KAAM;MAAA,IAAAC,mBAAA;MACf,CAAAA,mBAAA,GAAAR,UAAU,CAACP,OAAO,cAAAe,mBAAA,eAAlBA,mBAAA,CAAAC,IAAA,CAAAT,UAAqB,CAAC;IACxB,CAAC;IACDE,OAAO;IACPC;EACF,CAAC;AACH,CAAC","ignoreList":[]}
@@ -40,15 +40,21 @@ const EXTENSION_MIME_MAP = {
40
40
  export const imageExtRegex = /jpeg|jpg|png|webp|gif/i;
41
41
  export const audioExtRegex = /3gp|aac|aax|act|aiff|flac|gsm|m4a|m4b|m4p|tta|wma|mp3|webm|wav|ogg/i;
42
42
  export const videoExtRegex = /mov|vod|mp4|avi|mpeg|ogv/i;
43
+ // HEIC/HEIF should be treated as file, not image (not universally supported for inline display)
44
+ export const nonImageMimeSubtypes = /heic|heif/i;
43
45
  export const getFileType = extensionOrType => {
44
46
  const lowerCased = extensionOrType.toLowerCase();
45
47
 
46
48
  // mime type
47
49
  if (lowerCased.indexOf('/') > -1) {
48
- const type = lowerCased.split('/')[0];
50
+ const [type, subtype] = lowerCased.split('/');
49
51
  if (type === 'video') return 'video';
50
52
  if (type === 'audio') return 'audio';
51
- if (type === 'image') return 'image';
53
+ if (type === 'image') {
54
+ // HEIC/HEIF are not universally supported, treat as file
55
+ if (subtype !== null && subtype !== void 0 && subtype.match(nonImageMimeSubtypes)) return 'file';
56
+ return 'image';
57
+ }
52
58
  return 'file';
53
59
  }
54
60
 
@@ -1 +1 @@
1
- {"version":3,"names":["EXTENSION_MIME_MAP","imageExtRegex","audioExtRegex","videoExtRegex","getFileType","extensionOrType","lowerCased","toLowerCase","indexOf","type","split","match","startsWith","getDownscaleSize","origin","resizing","ratio","maxWidth","width","maxHeight","height","Math","min","normalizeFileName","fileName","extension","_extension","_filename","hasExtension","lastIndexOf","length","parseMimeType","mimeType","fullType","parts","subtype","parameters","part","name","value","trim","getFileExtensionFromMime","MIME_EXTENSION_MAP","Object","entries","reduce","acc","key","getMimeFromFileExtension","ext","sliceIdx","extWithoutDot","slice","getFileExtension","filePath","pathWithoutParams","idx","result","getFileExtensionFromUri","uri","fetch","then","response","headers","get","isImage","shouldCompressImage","mime","compressionEnabled","isJPG","Boolean"],"sources":["file.ts"],"sourcesContent":["const EXTENSION_MIME_MAP = {\n // Image\n 'jpeg': 'image/jpeg',\n 'jpg': 'image/jpeg',\n 'png': 'image/png',\n 'gif': 'image/gif',\n 'webp': 'image/webp',\n 'svg': 'image/svg+xml',\n 'heic': 'image/heic',\n 'heif': 'image/heif',\n\n // Video\n '3gp': 'video/3gpp',\n 'mp4': 'video/mp4',\n 'mpeg': 'video/mpeg',\n 'ogv': 'video/ogg',\n 'video/quicktime': 'mov',\n 'webm': 'video/webm',\n 'avi': 'video/x-msvideo',\n\n // Audio\n 'aac': 'audio/aac',\n 'm4a': 'audio/m4a',\n 'mid': 'audio/midi',\n 'mp3': 'audio/mpeg',\n 'ogg': 'audio/ogg',\n 'wav': 'audio/wav',\n 'weba': 'audio/webm',\n\n // Files\n 'txt': 'text/plain',\n 'pdf': 'application/pdf',\n 'doc': 'application/msword',\n 'docx': 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n 'xls': 'application/vnd.ms-excel',\n 'xlsx': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n 'ppt': 'application/vnd.ms-powerpoint',\n 'pptx': 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\n 'zip': 'application/zip',\n 'json': 'application/json',\n 'gzip': 'application/x-gzip',\n} as Record<string, string>;\n\nexport const imageExtRegex = /jpeg|jpg|png|webp|gif/i;\nexport const audioExtRegex = /3gp|aac|aax|act|aiff|flac|gsm|m4a|m4b|m4p|tta|wma|mp3|webm|wav|ogg/i;\nexport const videoExtRegex = /mov|vod|mp4|avi|mpeg|ogv/i;\nexport const getFileType = (extensionOrType: string) => {\n const lowerCased = extensionOrType.toLowerCase();\n\n // mime type\n if (lowerCased.indexOf('/') > -1) {\n const type = lowerCased.split('/')[0];\n if (type === 'video') return 'video';\n if (type === 'audio') return 'audio';\n if (type === 'image') return 'image';\n return 'file';\n }\n\n // extensions\n if (lowerCased.match(imageExtRegex)) return 'image';\n if (lowerCased.match(audioExtRegex)) return 'audio';\n if (lowerCased.match(videoExtRegex)) return 'video';\n\n // others\n if (lowerCased.startsWith('image')) return 'image';\n if (lowerCased.startsWith('audio')) return 'audio';\n if (lowerCased.startsWith('video')) return 'video';\n\n return 'file';\n};\n\n/**\n * Calculates the downscaled size of an image while preserving its aspect ratio.\n *\n * @param {Object} origin - The original size object with `width` and `height` properties.\n * @param {Object} resizing - The resizing object with optional `width` and `height` properties.\n * @returns {Object} - A new size object with the downscaled `width` and `height` properties.\n * @example\n * ```ts\n * getDownscaleSize({ width: 1200, height: 800 }, { width: 600 }); // returns { width: 600, height: 400 }\n * ```\n */\ntype Size = { width: number; height: number };\nexport function getDownscaleSize(origin: Size, resizing: Partial<Size>) {\n let ratio: number;\n\n const maxWidth = resizing.width || origin.width,\n maxHeight = resizing.height || origin.height;\n\n if (origin.width <= maxWidth && origin.height <= maxHeight) {\n ratio = 1;\n } else if (origin.width > maxWidth && origin.height <= maxHeight) {\n ratio = maxWidth / origin.width;\n } else if (origin.width <= maxWidth && origin.height > maxHeight) {\n ratio = maxHeight / origin.height;\n } else {\n ratio = Math.min(maxWidth / origin.width, maxHeight / origin.height);\n }\n\n return { width: origin.width * ratio, height: origin.height * ratio };\n}\n\n/**\n * Normalize a file name by ensuring it has the given extension, if it doesn't already.\n *\n * @param {string} fileName - The file name to normalize.\n * @param {string} extension - The desired extension, without a leading period.\n * @returns {string} - The normalized file name, with the extension.\n */\nexport function normalizeFileName(fileName: string, extension: string) {\n if (!extension) return fileName;\n\n // .extension\n let _extension = extension.toLowerCase();\n if (_extension.indexOf('.') !== 0) {\n _extension = '.' + _extension;\n }\n\n // filename.extension | filename\n const _filename = fileName.toLowerCase();\n const hasExtension = _filename.lastIndexOf(_extension) === _filename.length - _extension.length;\n if (!hasExtension) {\n // filename.extension\n return fileName + _extension;\n } else {\n // filename.extension\n return fileName;\n }\n}\n\n/**\n * Parses a MIME type string into its components.\n *\n * @param mimeType - The MIME type string to parse.\n * @returns An object containing the type, subtype, and parameters of the MIME type.\n */\ntype MimeType = { type: string; subtype: string; parameters: Record<string, string> };\nexport function parseMimeType(mimeType: string): MimeType {\n const [fullType, ...parts] = mimeType.split(';');\n const [type, subtype] = fullType.split('/');\n const parameters: MimeType['parameters'] = {};\n\n for (const part of parts) {\n const [name, value] = part.trim().split('=');\n parameters[name] = value;\n }\n\n return { type, subtype, parameters };\n}\n\n/**\n * Returns the file extension based on the MIME type.\n *\n * @param {string | null | undefined} mimeType - The MIME type to look up.\n * @returns {string} - The file extension for the given MIME type, or an empty string if no matching file extension was found.\n */\nexport function getFileExtensionFromMime(mimeType?: string | null): string {\n if (!mimeType) return '';\n const MIME_EXTENSION_MAP = Object.entries(EXTENSION_MIME_MAP).reduce((acc, [key, value]) => {\n acc[value] = key;\n return acc;\n }, {} as Record<string, string>);\n\n const extension = MIME_EXTENSION_MAP[mimeType.toLowerCase()];\n if (extension) return '.' + extension;\n return '';\n}\n\n/**\n * Returns the MIME type based on the file extension.\n *\n * @param {string | null | undefined} ext - The file extension to look up.\n * @returns {string} - The MIME type for the given file extension, or an empty string if no matching MIME type was found.\n */\nexport function getMimeFromFileExtension(ext?: string | null) {\n if (!ext) return '';\n\n const sliceIdx = ext.lastIndexOf('.');\n const extWithoutDot = sliceIdx === -1 ? ext : ext.slice(sliceIdx + 1);\n\n return EXTENSION_MIME_MAP[extWithoutDot.toLowerCase()] || '';\n}\n\n/**\n * Returns the file extension of a file path.\n *\n * @param {string} filePath - The file path to extract the extension from.\n * @returns {string} - The file extension, or an empty string if the file path does not have an extension.\n */\nexport function getFileExtension(filePath: string) {\n const pathWithoutParams = filePath.split('?')[0];\n\n const idx = pathWithoutParams.lastIndexOf('.');\n if (idx === -1) return '';\n\n const result = pathWithoutParams.slice(idx - pathWithoutParams.length).toLowerCase();\n if (result === '.') return '';\n else return result;\n}\n\nexport async function getFileExtensionFromUri(uri: string) {\n const type = await fetch(uri).then((response) => response.headers.get('content-type'));\n return getFileExtensionFromMime(type);\n}\n\nexport function isImage(filePath: string, mimeType?: string) {\n const type = getFileType(mimeType || getFileExtension(filePath));\n return type === 'image';\n}\n\nexport function shouldCompressImage(mime: string, compressionEnabled = true) {\n const extension = isJPG(mime) ? 'jpg' : getFileExtensionFromMime(mime);\n return Boolean(extension.match(/jpg|jpeg|png/i) && compressionEnabled);\n}\n\n/**\n * https://github.com/gathertown/sendbird-uikit-react-native/pull/29\n * This function is used solely for the purpose of classifying `image/jpg`.\n *\n * We only use it to determine whether image compression is applied because `image/jpg` is not a MIME type standard.\n * Therefore, it is not reflected in `EXTENSION_MIME_MAP`, which extracts MIME types uploaded to the server. (to comply standard)\n * */\nfunction isJPG(mime: string) {\n return mime === 'image/jpg';\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["EXTENSION_MIME_MAP","imageExtRegex","audioExtRegex","videoExtRegex","nonImageMimeSubtypes","getFileType","extensionOrType","lowerCased","toLowerCase","indexOf","type","subtype","split","match","startsWith","getDownscaleSize","origin","resizing","ratio","maxWidth","width","maxHeight","height","Math","min","normalizeFileName","fileName","extension","_extension","_filename","hasExtension","lastIndexOf","length","parseMimeType","mimeType","fullType","parts","parameters","part","name","value","trim","getFileExtensionFromMime","MIME_EXTENSION_MAP","Object","entries","reduce","acc","key","getMimeFromFileExtension","ext","sliceIdx","extWithoutDot","slice","getFileExtension","filePath","pathWithoutParams","idx","result","getFileExtensionFromUri","uri","fetch","then","response","headers","get","isImage","shouldCompressImage","mime","compressionEnabled","isJPG","Boolean"],"sources":["file.ts"],"sourcesContent":["const EXTENSION_MIME_MAP = {\n // Image\n 'jpeg': 'image/jpeg',\n 'jpg': 'image/jpeg',\n 'png': 'image/png',\n 'gif': 'image/gif',\n 'webp': 'image/webp',\n 'svg': 'image/svg+xml',\n 'heic': 'image/heic',\n 'heif': 'image/heif',\n\n // Video\n '3gp': 'video/3gpp',\n 'mp4': 'video/mp4',\n 'mpeg': 'video/mpeg',\n 'ogv': 'video/ogg',\n 'video/quicktime': 'mov',\n 'webm': 'video/webm',\n 'avi': 'video/x-msvideo',\n\n // Audio\n 'aac': 'audio/aac',\n 'm4a': 'audio/m4a',\n 'mid': 'audio/midi',\n 'mp3': 'audio/mpeg',\n 'ogg': 'audio/ogg',\n 'wav': 'audio/wav',\n 'weba': 'audio/webm',\n\n // Files\n 'txt': 'text/plain',\n 'pdf': 'application/pdf',\n 'doc': 'application/msword',\n 'docx': 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n 'xls': 'application/vnd.ms-excel',\n 'xlsx': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n 'ppt': 'application/vnd.ms-powerpoint',\n 'pptx': 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\n 'zip': 'application/zip',\n 'json': 'application/json',\n 'gzip': 'application/x-gzip',\n} as Record<string, string>;\n\nexport const imageExtRegex = /jpeg|jpg|png|webp|gif/i;\nexport const audioExtRegex = /3gp|aac|aax|act|aiff|flac|gsm|m4a|m4b|m4p|tta|wma|mp3|webm|wav|ogg/i;\nexport const videoExtRegex = /mov|vod|mp4|avi|mpeg|ogv/i;\n// HEIC/HEIF should be treated as file, not image (not universally supported for inline display)\nexport const nonImageMimeSubtypes = /heic|heif/i;\nexport const getFileType = (extensionOrType: string) => {\n const lowerCased = extensionOrType.toLowerCase();\n\n // mime type\n if (lowerCased.indexOf('/') > -1) {\n const [type, subtype] = lowerCased.split('/');\n if (type === 'video') return 'video';\n if (type === 'audio') return 'audio';\n if (type === 'image') {\n // HEIC/HEIF are not universally supported, treat as file\n if (subtype?.match(nonImageMimeSubtypes)) return 'file';\n return 'image';\n }\n return 'file';\n }\n\n // extensions\n if (lowerCased.match(imageExtRegex)) return 'image';\n if (lowerCased.match(audioExtRegex)) return 'audio';\n if (lowerCased.match(videoExtRegex)) return 'video';\n\n // others\n if (lowerCased.startsWith('image')) return 'image';\n if (lowerCased.startsWith('audio')) return 'audio';\n if (lowerCased.startsWith('video')) return 'video';\n\n return 'file';\n};\n\n/**\n * Calculates the downscaled size of an image while preserving its aspect ratio.\n *\n * @param {Object} origin - The original size object with `width` and `height` properties.\n * @param {Object} resizing - The resizing object with optional `width` and `height` properties.\n * @returns {Object} - A new size object with the downscaled `width` and `height` properties.\n * @example\n * ```ts\n * getDownscaleSize({ width: 1200, height: 800 }, { width: 600 }); // returns { width: 600, height: 400 }\n * ```\n */\ntype Size = { width: number; height: number };\nexport function getDownscaleSize(origin: Size, resizing: Partial<Size>) {\n let ratio: number;\n\n const maxWidth = resizing.width || origin.width,\n maxHeight = resizing.height || origin.height;\n\n if (origin.width <= maxWidth && origin.height <= maxHeight) {\n ratio = 1;\n } else if (origin.width > maxWidth && origin.height <= maxHeight) {\n ratio = maxWidth / origin.width;\n } else if (origin.width <= maxWidth && origin.height > maxHeight) {\n ratio = maxHeight / origin.height;\n } else {\n ratio = Math.min(maxWidth / origin.width, maxHeight / origin.height);\n }\n\n return { width: origin.width * ratio, height: origin.height * ratio };\n}\n\n/**\n * Normalize a file name by ensuring it has the given extension, if it doesn't already.\n *\n * @param {string} fileName - The file name to normalize.\n * @param {string} extension - The desired extension, without a leading period.\n * @returns {string} - The normalized file name, with the extension.\n */\nexport function normalizeFileName(fileName: string, extension: string) {\n if (!extension) return fileName;\n\n // .extension\n let _extension = extension.toLowerCase();\n if (_extension.indexOf('.') !== 0) {\n _extension = '.' + _extension;\n }\n\n // filename.extension | filename\n const _filename = fileName.toLowerCase();\n const hasExtension = _filename.lastIndexOf(_extension) === _filename.length - _extension.length;\n if (!hasExtension) {\n // filename.extension\n return fileName + _extension;\n } else {\n // filename.extension\n return fileName;\n }\n}\n\n/**\n * Parses a MIME type string into its components.\n *\n * @param mimeType - The MIME type string to parse.\n * @returns An object containing the type, subtype, and parameters of the MIME type.\n */\ntype MimeType = { type: string; subtype: string; parameters: Record<string, string> };\nexport function parseMimeType(mimeType: string): MimeType {\n const [fullType, ...parts] = mimeType.split(';');\n const [type, subtype] = fullType.split('/');\n const parameters: MimeType['parameters'] = {};\n\n for (const part of parts) {\n const [name, value] = part.trim().split('=');\n parameters[name] = value;\n }\n\n return { type, subtype, parameters };\n}\n\n/**\n * Returns the file extension based on the MIME type.\n *\n * @param {string | null | undefined} mimeType - The MIME type to look up.\n * @returns {string} - The file extension for the given MIME type, or an empty string if no matching file extension was found.\n */\nexport function getFileExtensionFromMime(mimeType?: string | null): string {\n if (!mimeType) return '';\n const MIME_EXTENSION_MAP = Object.entries(EXTENSION_MIME_MAP).reduce((acc, [key, value]) => {\n acc[value] = key;\n return acc;\n }, {} as Record<string, string>);\n\n const extension = MIME_EXTENSION_MAP[mimeType.toLowerCase()];\n if (extension) return '.' + extension;\n return '';\n}\n\n/**\n * Returns the MIME type based on the file extension.\n *\n * @param {string | null | undefined} ext - The file extension to look up.\n * @returns {string} - The MIME type for the given file extension, or an empty string if no matching MIME type was found.\n */\nexport function getMimeFromFileExtension(ext?: string | null) {\n if (!ext) return '';\n\n const sliceIdx = ext.lastIndexOf('.');\n const extWithoutDot = sliceIdx === -1 ? ext : ext.slice(sliceIdx + 1);\n\n return EXTENSION_MIME_MAP[extWithoutDot.toLowerCase()] || '';\n}\n\n/**\n * Returns the file extension of a file path.\n *\n * @param {string} filePath - The file path to extract the extension from.\n * @returns {string} - The file extension, or an empty string if the file path does not have an extension.\n */\nexport function getFileExtension(filePath: string) {\n const pathWithoutParams = filePath.split('?')[0];\n\n const idx = pathWithoutParams.lastIndexOf('.');\n if (idx === -1) return '';\n\n const result = pathWithoutParams.slice(idx - pathWithoutParams.length).toLowerCase();\n if (result === '.') return '';\n else return result;\n}\n\nexport async function getFileExtensionFromUri(uri: string) {\n const type = await fetch(uri).then((response) => response.headers.get('content-type'));\n return getFileExtensionFromMime(type);\n}\n\nexport function isImage(filePath: string, mimeType?: string) {\n const type = getFileType(mimeType || getFileExtension(filePath));\n return type === 'image';\n}\n\nexport function shouldCompressImage(mime: string, compressionEnabled = true) {\n const extension = isJPG(mime) ? 'jpg' : getFileExtensionFromMime(mime);\n return Boolean(extension.match(/jpg|jpeg|png/i) && compressionEnabled);\n}\n\n/**\n * https://github.com/gathertown/sendbird-uikit-react-native/pull/29\n * This function is used solely for the purpose of classifying `image/jpg`.\n *\n * We only use it to determine whether image compression is applied because `image/jpg` is not a MIME type standard.\n * Therefore, it is not reflected in `EXTENSION_MIME_MAP`, which extracts MIME types uploaded to the server. (to comply standard)\n * */\nfunction isJPG(mime: string) {\n return mime === 'image/jpg';\n}\n"],"mappings":"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","ignoreList":[]}
@@ -7,10 +7,10 @@ export declare const useForceUpdate: () => () => void;
7
7
  export declare const useAsyncEffect: (asyncEffect: AsyncEffectCallback, deps?: DependencyList) => void;
8
8
  export declare const useAsyncLayoutEffect: (asyncEffect: AsyncEffectCallback, deps?: DependencyList) => void;
9
9
  export declare const useIIFE: <T>(callback: () => T) => T;
10
- export declare const useIsMountedRef: () => import("react").MutableRefObject<boolean>;
10
+ export declare const useIsMountedRef: () => import("react").RefObject<boolean>;
11
11
  export declare const useIsFirstMount: () => boolean;
12
12
  export declare const useFreshCallback: <T extends Function>(callback: T) => T;
13
13
  export declare const useDebounceEffect: (action: () => void, delay: number, deps?: DependencyList) => void;
14
- export declare const usePartialState: <S>(initialState: S) => [S & Partial<S>, import("react").Dispatch<Partial<S>>];
15
- export declare const useRefTracker: <T>(target: T) => import("react").MutableRefObject<T>;
14
+ export declare const usePartialState: <S>(initialState: S) => [S, import("react").ActionDispatch<[state: Partial<S>]>];
15
+ export declare const useRefTracker: <T>(target: T) => import("react").RefObject<T>;
16
16
  export {};
@@ -1,7 +1,8 @@
1
1
  export declare const imageExtRegex: RegExp;
2
2
  export declare const audioExtRegex: RegExp;
3
3
  export declare const videoExtRegex: RegExp;
4
- export declare const getFileType: (extensionOrType: string) => "video" | "audio" | "image" | "file";
4
+ export declare const nonImageMimeSubtypes: RegExp;
5
+ export declare const getFileType: (extensionOrType: string) => "video" | "audio" | "file" | "image";
5
6
  /**
6
7
  * Calculates the downscaled size of an image while preserving its aspect ratio.
7
8
  *
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sendbird/uikit-utils",
3
- "version": "3.12.1",
3
+ "version": "3.12.3",
4
4
  "description": "A collection of utility functions and constants for building chat UI components with Sendbird UIKit.",
5
5
  "keywords": [
6
6
  "sendbird",
@@ -92,5 +92,5 @@
92
92
  ]
93
93
  ]
94
94
  },
95
- "gitHead": "367f6209c4e1db1ec2d44dbdc3e3d3a55c6beb78"
95
+ "gitHead": "6c20512fbcfb708b75339474c47558225e8ce262"
96
96
  }
@@ -79,7 +79,7 @@ export const useFreshCallback = <T extends Function>(callback: T): T => {
79
79
  };
80
80
 
81
81
  export const useDebounceEffect = (action: () => void, delay: number, deps: DependencyList = []) => {
82
- const timeoutRef = useRef<NodeJS.Timeout>();
82
+ const timeoutRef = useRef<NodeJS.Timeout | undefined>(undefined);
83
83
 
84
84
  useEffect(() => {
85
85
  timeoutRef.current = setTimeout(async () => {
@@ -69,7 +69,7 @@ export const useAppState = (type: AppStateEvent, listener: AppStateListener) =>
69
69
  * To achieve this, you can use a deferred onClose that can be awaited until the onDismiss is called.
70
70
  * */
71
71
  export const useDeferredModalState = () => {
72
- const resolveRef = useRef<(value: void) => void>();
72
+ const resolveRef = useRef<((value: void) => void) | undefined>(undefined);
73
73
  const [visible, setVisible] = useState(false);
74
74
 
75
75
  return {
@@ -44,15 +44,21 @@ const EXTENSION_MIME_MAP = {
44
44
  export const imageExtRegex = /jpeg|jpg|png|webp|gif/i;
45
45
  export const audioExtRegex = /3gp|aac|aax|act|aiff|flac|gsm|m4a|m4b|m4p|tta|wma|mp3|webm|wav|ogg/i;
46
46
  export const videoExtRegex = /mov|vod|mp4|avi|mpeg|ogv/i;
47
+ // HEIC/HEIF should be treated as file, not image (not universally supported for inline display)
48
+ export const nonImageMimeSubtypes = /heic|heif/i;
47
49
  export const getFileType = (extensionOrType: string) => {
48
50
  const lowerCased = extensionOrType.toLowerCase();
49
51
 
50
52
  // mime type
51
53
  if (lowerCased.indexOf('/') > -1) {
52
- const type = lowerCased.split('/')[0];
54
+ const [type, subtype] = lowerCased.split('/');
53
55
  if (type === 'video') return 'video';
54
56
  if (type === 'audio') return 'audio';
55
- if (type === 'image') return 'image';
57
+ if (type === 'image') {
58
+ // HEIC/HEIF are not universally supported, treat as file
59
+ if (subtype?.match(nonImageMimeSubtypes)) return 'file';
60
+ return 'image';
61
+ }
56
62
  return 'file';
57
63
  }
58
64