RocketChat/Rocket.Chat

View on GitHub
apps/meteor/client/views/room/providers/hooks/useInstance.ts

Summary

Maintainability
A
0 mins
Test Coverage
import { useRef, useEffect } from 'react';

import { useDepsMatch } from './useDepsMatch';

export function useInstance<T>(factory: () => [instance: T, release?: () => void], deps: unknown[]): T {
    const ref = useRef<[instance: T, release?: () => void]>();

    useEffect(
        () => () => {
            ref.current?.[1]?.();
        },
        [],
    );

    const depsMatch = useDepsMatch(deps);

    if (!ref.current || !depsMatch) {
        ref.current?.[1]?.();
        ref.current = factory();
    }

    return ref.current[0];
}