useOverlayLogo.ts 974 B

123456789101112131415161718192021222324252627
  1. import { useEffect, useState } from 'react';
  2. import { api } from '../api/client';
  3. export function useOverlayLogo(enabled: boolean, token: string | null = null, revision = 0) {
  4. const [logo, setLogo] = useState<{ url: string; token: string | null; revision: number } | null>(null);
  5. useEffect(() => {
  6. if (!enabled) return;
  7. const controller = new AbortController();
  8. let url: string | undefined;
  9. void api.getOverlayLogo(token, controller.signal).then((blob) => {
  10. if (controller.signal.aborted) return;
  11. if (blob) {
  12. url = URL.createObjectURL(blob);
  13. setLogo({ url, token, revision });
  14. } else {
  15. setLogo(null);
  16. }
  17. }).catch(() => {
  18. if (!controller.signal.aborted) setLogo(null);
  19. });
  20. return () => {
  21. controller.abort();
  22. if (url) URL.revokeObjectURL(url);
  23. };
  24. }, [enabled, token, revision]);
  25. return enabled && logo?.token === token && logo.revision === revision ? logo.url : null;
  26. }