type-fest#AsyncReturnType TypeScript Examples

The following examples show how to use type-fest#AsyncReturnType. You can vote up the ones you like or vote down the ones you don't like, and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example #1
Source File: useServiceValue.ts    From TidGi-Desktop with Mozilla Public License 2.0 6 votes vote down vote up
/**
 * Use value from service, especially constant value that never changes
 * This will only update once, won't listen on later update.
 * @param valuePromise A promise contain the value we want to use in React
 * @param defaultValue empty array or undefined, as initial value
 */
export function usePromiseValue<T, DefaultValueType = T | undefined>(
  asyncValue: () => Promise<T>,
  defaultValue?: AsyncReturnType<typeof asyncValue>,
  dependency: unknown[] = [],
): T | DefaultValueType {
  const [value, valueSetter] = useState<T | DefaultValueType>(defaultValue as T | DefaultValueType);
  // use initial value
  useEffect(() => {
    void (async () => {
      valueSetter(await asyncValue());
    })();
    // eslint-disable-next-line react-hooks/exhaustive-deps
  }, dependency);

  return value;
}
Example #2
Source File: useServiceValue.ts    From TidGi-Desktop with Mozilla Public License 2.0 6 votes vote down vote up
export function usePromiseValueAndSetter<T, DefaultValueType = T | undefined>(
  asyncValue: () => Promise<T>,
  asyncSetter: (newValue: T | DefaultValueType) => Promise<unknown>,
  defaultValue?: AsyncReturnType<typeof asyncValue>,
): [T | DefaultValueType, (newValue: T | DefaultValueType) => void] {
  const [value, valueSetter] = useState<T | DefaultValueType>(defaultValue as T | DefaultValueType);
  // use initial value
  useEffect(() => {
    void (async () => {
      valueSetter(await asyncValue());
    })();
  }, [asyncValue]);
  // update remote value on change
  const updateRemoteValue = useDebouncedCallback(
    async (newValue: T | DefaultValueType) => {
      const previousValue = await asyncValue();
      if (value !== previousValue) {
        void asyncSetter(value);
      }
    },
    [asyncValue, asyncSetter],
    300,
  );

  const setter = useCallback(
    async (newValue: T | DefaultValueType) => {
      valueSetter(newValue);
      await updateRemoteValue(newValue);
    },
    [valueSetter, updateRemoteValue],
  );

  return [value, setter];
}