DeploymentTargetContext.tsx 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. import React, { createContext, useContext, useMemo } from "react";
  2. import { useLocation } from "react-router";
  3. import { useDefaultDeploymentTarget } from "lib/hooks/useDeploymentTarget";
  4. export type DeploymentTarget = {
  5. id: string;
  6. isPreview: boolean;
  7. };
  8. export const DeploymentTargetContext = createContext<{
  9. currentDeploymentTarget: DeploymentTarget | null;
  10. } | null>(null);
  11. export const useDeploymentTarget = () => {
  12. const context = useContext(DeploymentTargetContext);
  13. if (context === null) {
  14. throw new Error(
  15. "useDeploymentTarget must be used within a DeploymentTargetContext"
  16. );
  17. }
  18. return context;
  19. };
  20. const DeploymentTargetProvider = ({ children }: { children: JSX.Element }) => {
  21. const { search } = useLocation();
  22. const queryParams = new URLSearchParams(search);
  23. const idParam = queryParams.get("target");
  24. const defaultDeploymentTarget = useDefaultDeploymentTarget();
  25. const deploymentTarget: DeploymentTarget | null = useMemo(() => {
  26. if (!idParam && !defaultDeploymentTarget) {
  27. return null;
  28. }
  29. if (idParam) {
  30. return {
  31. id: idParam,
  32. isPreview: true,
  33. };
  34. }
  35. if (defaultDeploymentTarget) {
  36. return {
  37. id: defaultDeploymentTarget.deployment_target_id,
  38. isPreview: false,
  39. };
  40. }
  41. return null;
  42. }, [idParam, defaultDeploymentTarget]);
  43. return (
  44. <DeploymentTargetContext.Provider
  45. value={{
  46. currentDeploymentTarget: deploymentTarget,
  47. }}
  48. >
  49. {children}
  50. </DeploymentTargetContext.Provider>
  51. );
  52. };
  53. export default DeploymentTargetProvider;