The source code for this blog is available on GitHub.

Blog.

Goodie! Keyboard status context provider

Cover Image for Goodie! Keyboard status context provider
Julia Stjerna
Julia Stjerna

Goodie! Keyboard status context provider

Writing good context providers results in maintainable code, always strive to keep your components as clean as possible. Beautiful code: beautiful 🧠 with less confusion.

P.s. use this template for other state that could live in the global context, e.g. is the user authenticated? Is it dark or bright theme? The possibilities are endless!

import React, {
  ReactElement,
  createContext,
  useContext,
  useEffect,
  useState,
} from "react";
import { Keyboard } from "react-native";

type KeyboardStatusProps = {
  keyboardStatus: boolean,
};

const KeyboardStatusContext =
  createContext < Partial < KeyboardStatusProps >> {};

export function useKeyboardStatus() {
  return useContext(KeyboardStatusContext);
}

export const KeyboardStatusProvider = ({
  children,
}: {
  children: ReactElement,
}) => {
  const [keyboardStatus, setKeyboardStatus] = useState(false);

  useEffect(() => {
    const showSubscription = Keyboard.addListener("keyboardDidShow", () => {
      setKeyboardStatus(true);
    });
    const hideSubscription = Keyboard.addListener("keyboardDidHide", () => {
      setKeyboardStatus(false);
    });

    return () => {
      showSubscription.remove();
      hideSubscription.remove();
    };
  }, []);

  return (
    <KeyboardStatusContext.Provider
      value={{
        keyboardStatus,
      }}
    >
      {children}
    </KeyboardStatusContext.Provider>
  );
};

Good to know:

You can also pass setters if you need your components to be able to set local state of the context provider. To type such setter do this:

type KeyboardStatusProps = {
  theme: Themes,
  setTheme: Dispatch<SetStateAction<Themes>>,
};