How to use the observable-hooks.useObservable function in observable-hooks

To help you get started, we’ve selected a few observable-hooks examples, based on popular ways it is used in public projects.

Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.

github crimx / ext-saladict / src / content / components / MenuBar / SearchBox.tsx View on Github external
export const SearchBox: FC = props => {
  // Textarea also shares the text so only replace here
  const text = props.text.replace(/\s+/g, ' ')

  const [onSearchBoxFocusBlur, searchBoxFocusBlur$] = useObservableCallback(
    focusBlur
  )

  const [onSuggestFocusBlur, suggestFocusBlur$] = useObservableCallback(
    focusBlur
  )

  const [onShowSugget, onShowSugget$] = useObservableCallback(identity)

  const isShowSuggest = useObservableState(
    useObservable(
      inputs$ =>
        combineLatest(
          inputs$,
          merge(
            // only show suggest when start typing
            searchBoxFocusBlur$.pipe(filter(isFocus => !isFocus)),
            suggestFocusBlur$,
            onShowSugget$
          )
        ).pipe(
          map(([[enableSuggest, text], shouldShowSuggest]) =>
            Boolean(enableSuggest && text && shouldShowSuggest)
          ),
          distinctUntilChanged()
        ),
      [props.enableSuggest, props.text] as [boolean, string]
github crimx / ext-saladict / src / content / components / MenuBar / MenuBar.tsx View on Github external
export const MenuBar: FC = props => {
  const { t } = useTranslate(['content', 'common'])

  const [updateProfileHeight, profileHeight$] = useObservableCallback(
    heightChangeTransform
  )

  const [updateSBHeight, searchBoxHeight$] = useObservableCallback(
    heightChangeTransform
  )

  // update panel min height
  useSubscription(
    useObservable(() =>
      combineLatest(profileHeight$, searchBoxHeight$).pipe(
        // a little delay for organic feeling
        debounceTime(100),
        map(heights => {
          const max = Math.max(...heights)
          return max > 0 ? max + 72 : 0
        })
      )
    ),
    props.onHeightChanged
  )

  return (
    <header>
      </header>
github crimx / observable-hooks / examples / typeahead / src / Suggests.tsx View on Github external
export const Suggests: React.FC = props =&gt; {
  const fetchFunc$ = useObservable(pluckFirst, [props.fetchFunc])
  return useObservableState(
    // A stream of React elements! I know it's mind-blowing.
    useObservable(
      inputs$ =&gt;
        inputs$.pipe(
          filter(([text]) =&gt; text.length &gt; 1),
          distinctUntilChanged(),
          switchMap(([text]) =&gt;
            // delay in sub-stream so that users can see the
            // searching state quickly. But no actual request
            // is performed until the delay is hit.
            forkJoin(
              // minimum 1s delay to prevent flickering if user got really greate network condition
              timer(1000),
              timer(750).pipe(
                tap(() =&gt; console.log('&gt;&gt;&gt; really start searching...')),
github crimx / observable-hooks / examples / typeahead / src / Suggests.tsx View on Github external
export const Suggests: React.FC = props =&gt; {
  const fetchFunc$ = useObservable(pluckFirst, [props.fetchFunc])
  return useObservableState(
    // A stream of React elements! I know it's mind-blowing.
    useObservable(
      inputs$ =&gt;
        inputs$.pipe(
          filter(([text]) =&gt; text.length &gt; 1),
          distinctUntilChanged(),
          switchMap(([text]) =&gt;
            // delay in sub-stream so that users can see the
            // searching state quickly. But no actual request
            // is performed until the delay is hit.
            forkJoin(
              // minimum 1s delay to prevent flickering if user got really greate network condition
              timer(1000),
              timer(750).pipe(
                tap(() =&gt; console.log('&gt;&gt;&gt; really start searching...')),
                withLatestFrom(fetchFunc$),
                switchMap(([, fetchFunc]) =&gt; fetchFunc(text))
              )
github crimx / ext-saladict / src / content / components / MenuBar / Profiles.tsx View on Github external
React.MouseEvent<element>
  &gt;(hoverWithDelay)

  const [onMouseOverOut, mouseOverOut$] = useObservableCallback&lt;
    boolean,
    React.MouseEvent<element>
  &gt;(hover)

  const [onFocusBlur, focusBlur$] = useObservableCallback(focusBlur)

  const [showHideProfiles, showHideProfiles$] = useObservableCallback(
    identity
  )

  const isShowProfiles = useObservableState(
    useObservable(() =&gt;
      merge(mouseOverOut$, mouseOverOutDelay$, focusBlur$, showHideProfiles$)
    ).pipe(debounceTime(100)),
    false
  )

  const listItem = props.profiles.map(p =&gt; {
    return {
      key: p.id,
      content: (
        <span>
          {getProfileName(p.name, props.t)}
        </span></element></element>
github crimx / ext-saladict / src / content / components / MenuBar / Suggest.tsx View on Github external
(props: SuggestProps, ref: React.Ref) =&gt; {
    return useObservableState(
      useObservable(
        inputs$ =&gt;
          inputs$.pipe(
            map(([text]) =&gt; text),
            filter(Boolean),
            distinctUntilChanged(),
            debounceTime(750),
            switchMap(text =&gt;
              from(
                message
                  .send&lt;'GET_SUGGESTS'&gt;({
                    type: 'GET_SUGGESTS',
                    payload: text
                  })
                  .catch(() =&gt; [] as readonly SuggestItem[])
              ).pipe(
                map(suggests =&gt; (
github crimx / ext-saladict / src / selection / select-text.ts View on Github external
export function useInPanelSelect(
  touchMode: AppConfig['touchMode'],
  language: AppConfig['language'],
  doubleClickDelay: AppConfig['doubleClickDelay'],
  newSelection: (payload: Message&lt;'SELECTION'&gt;['payload']) =&gt; void
) {
  const [onMouseUp, mouseUp$] = useObservableCallback(
    event$ =&gt; event$.pipe(filter(e =&gt; e.button === 0))
  )

  const config$ = useObservable(identity, [touchMode, language] as const)

  const clickPeriodCount$ = useObservable(
    inputs$ =&gt;
      inputs$.pipe(
        switchMap(([doubleClickDelay]) =&gt;
          clickPeriodCountStream(mouseUp$, doubleClickDelay)
        )
      ),
    [doubleClickDelay] as const
  )

  const output$ = useObservable(() =&gt;
    mouseUp$.pipe(
      withLatestFrom(config$),
      filter(([mouseup, [touchMode]]) =&gt; {
        if (touchMode) {
github crimx / observable-hooks / examples / typeahead / src / input-time-ago.tsx View on Github external
export const InputTimeAgo: React.FC = props =&gt; {
  const [text, diff] = useObservableState(
    useObservable(
      inputs$ =&gt;
        inputs$.pipe(
          switchMap(([text]) =&gt;
            interval(1000).pipe(
              startWith(-1),
              map(count =&gt; [text, fromNow(count + 1)] as [string, string])
            )
          )
        ),
      [props.text]
    )
  )!

  return (
    <div>
      You typed {text ? `"${text}"` : 'nothing'} {diff}.</div>
github crimx / ext-saladict / src / content / components / WordEditor / Notes.tsx View on Github external
export const Notes: FC = props =&gt; {
  const { t } = useTranslate(['common', 'content'])
  const [isDirty, setDirty] = useState(false)
  const [isShowCtxTransList, setShowCtxTransList] = useState(false)

  const [word, setWord] = useState(props.wordEditor.word)
  const word$ = useObservable(pluckFirst, [word])

  const [ctxTransConfig, setCtxTransConfig] = useState(props.ctxTrans)
  useUpdateEffect(() =&gt; {
    setCtxTransConfig(props.ctxTrans)
  }, [props.ctxTrans])

  const [ctxTransResult, setCtxTransResult] = useState(() =&gt;
    Object.keys(props.ctxTrans).reduce(
      (result, id) =&gt; {
        result[id] = ''
        return result
      },
      {} as CtxTranslateResults
    )
  )
github crimx / ext-saladict / src / selection / select-text.ts View on Github external
export function useInPanelSelect(
  touchMode: AppConfig['touchMode'],
  language: AppConfig['language'],
  doubleClickDelay: AppConfig['doubleClickDelay'],
  newSelection: (payload: Message&lt;'SELECTION'&gt;['payload']) =&gt; void
) {
  const [onMouseUp, mouseUp$] = useObservableCallback(
    event$ =&gt; event$.pipe(filter(e =&gt; e.button === 0))
  )

  const config$ = useObservable(identity, [touchMode, language] as const)

  const clickPeriodCount$ = useObservable(
    inputs$ =&gt;
      inputs$.pipe(
        switchMap(([doubleClickDelay]) =&gt;
          clickPeriodCountStream(mouseUp$, doubleClickDelay)
        )
      ),
    [doubleClickDelay] as const
  )

  const output$ = useObservable(() =&gt;
    mouseUp$.pipe(
      withLatestFrom(config$),
      filter(([mouseup, [touchMode]]) =&gt; {
        if (touchMode) {
          return false
        }

observable-hooks

React hooks for RxJS Observables. Simple, flexible, testable and performant.

MIT
Latest version published 9 months ago

Package Health Score

71 / 100
Full package analysis