UNPKG

@hakit/core

Version:

A collection of React hooks and helpers for Home Assistant to easily communicate with the Home Assistant WebSocket API.

3 lines (2 loc) 8.38 kB
"use strict";const ge=require("react/jsx-runtime"),o=require("react"),de=require("@emotion/cache"),J=require("@emotion/utils"),he=require("@emotion/serialize"),Se=require("react-is"),O=require("home-assistant-js-websocket"),W=require("lodash"),G=require("./cjs/HassConnect/token-storage.js"),u=require("./cjs/HassConnect/HassContext.js"),ye=require("./cjs/hooks/useStore/index.js"),be=require("./cjs/HassConnect/handleSuspendResume.js"),pe=require("./cjs/HassConnect/callApi.js"),Q=require("./cjs/HassConnect/tryConnection.js");function re(t){const e=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(t){for(const s in t)if(s!=="default"){const n=Object.getOwnPropertyDescriptor(t,s);Object.defineProperty(e,s,n.get?n:{enumerable:!0,get:()=>t[s]})}}return e.default=t,Object.freeze(e)}const M=re(ge),m=re(o);var L,Z;function Ce(){if(Z)return L;Z=1;var t=Se,e={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},s={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},n={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},a={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},i={};i[t.ForwardRef]=n,i[t.Memo]=a;function d(b){return t.isMemo(b)?a:i[b.$$typeof]||e}var S=Object.defineProperty,h=Object.getOwnPropertyNames,f=Object.getOwnPropertySymbols,U=Object.getOwnPropertyDescriptor,k=Object.getPrototypeOf,_=Object.prototype;function F(b,C,I){if(typeof C!="string"){if(_){var T=k(C);T&&T!==_&&F(b,T,I)}var j=h(C);f&&(j=j.concat(f(C)));for(var E=d(b),R=d(C),N=0;N<j.length;++N){var v=j[N];if(!s[v]&&!(I&&I[v])&&!(R&&R[v])&&!(E&&E[v])){var A=U(C,v);try{S(b,v,A)}catch{}}}}return b}return L=F,L}Ce();var Ee=function(e){return e()},ve=m.useInsertionEffect?m.useInsertionEffect:!1,me=ve||Ee,ne=m.createContext(typeof HTMLElement<"u"?de({key:"css"}):null);ne.Provider;var we=function(e){return o.forwardRef(function(s,n){var a=o.useContext(ne);return e(s,a,n)})},Pe=m.createContext({}),D={}.hasOwnProperty,X="__EMOTION_TYPE_PLEASE_DO_NOT_USE__",se=function(e,s){var n={};for(var a in s)D.call(s,a)&&(n[a]=s[a]);return n[X]=e,n},Oe=function(e){var s=e.cache,n=e.serialized,a=e.isStringTag;return J.registerStyles(s,n,a),me(function(){return J.insertStyles(s,n,a)}),null},je=we(function(t,e,s){var n=t.css;typeof n=="string"&&e.registered[n]!==void 0&&(n=e.registered[n]);var a=t[X],i=[n],d="";typeof t.className=="string"?d=J.getRegisteredStyles(e.registered,i,t.className):t.className!=null&&(d=t.className+" ");var S=he.serializeStyles(i,void 0,m.useContext(Pe));d+=e.key+"-"+S.name;var h={};for(var f in t)D.call(t,f)&&f!=="css"&&f!==X&&(h[f]=t[f]);return h.className=d,s&&(h.ref=s),m.createElement(m.Fragment,null,m.createElement(Oe,{cache:e,serialized:S,isStringTag:typeof a=="string"}),m.createElement(a,h))}),oe=je,xe=M.Fragment,Y=function(e,s,n){return D.call(s,"css")?M.jsx(oe,se(e,s),n):M.jsx(e,s,n)},ae=function(e,s,n){return D.call(s,"css")?M.jsxs(oe,se(e,s),n):M.jsxs(e,s,n)};const B=t=>Symbol.iterator in t,ee=t=>"entries"in t,te=(t,e)=>{const s=t instanceof Map?t:new Map(t.entries()),n=e instanceof Map?e:new Map(e.entries());if(s.size!==n.size)return!1;for(const[a,i]of s)if(!Object.is(i,n.get(a)))return!1;return!0},Ie=(t,e)=>{const s=t[Symbol.iterator](),n=e[Symbol.iterator]();let a=s.next(),i=n.next();for(;!a.done&&!i.done;){if(!Object.is(a.value,i.value))return!1;a=s.next(),i=n.next()}return!!a.done&&!!i.done};function Te(t,e){return Object.is(t,e)?!0:typeof t!="object"||t===null||typeof e!="object"||e===null||Object.getPrototypeOf(t)!==Object.getPrototypeOf(e)?!1:B(t)&&B(e)?ee(t)&&ee(e)?te(t,e):Ie(t,e):te({entries:()=>Object.entries(t)},{entries:()=>Object.entries(e)})}function ce(t){const e=o.useRef(void 0);return s=>{const n=t(s);return Te(e.current,n)?e.current:e.current=n}}const Re=()=>u.useInternalStore.getState().entities,$=()=>u.useInternalStore.getState().connection;function Ne({children:t,hassUrl:e,hassToken:s,portalRoot:n,windowContext:a,renderError:i=S=>S,handleResumeOptions:d}){const S=o.useRef(null),h=o.useRef(!1),f=o.useRef(null),{hash:U,ready:k,error:_,cannotConnect:F,setError:b}=u.useInternalStore(ce(r=>({hash:r.hash,routes:r.routes,ready:r.ready,error:r.error,cannotConnect:r.cannotConnect,auth:r.auth,setError:r.setError}))),C=o.useCallback(async()=>{const r=$();return r===null?null:await O.getStates(r)},[]),I=o.useCallback(async()=>{const r=$();return r===null?null:await O.getServices(r)},[]),T=o.useCallback(async()=>{const r=$();return r===null?null:await O.getConfig(r)},[]),j=o.useCallback(async()=>{const r=$();return r===null?null:await O.getUser(r)},[]);o.useEffect(()=>{const{setPortalRoot:r}=u.useInternalStore.getState();n&&r(n)},[n]),o.useEffect(()=>{const{setWindowContext:r}=u.useInternalStore.getState();a&&r(a)},[a]);const E=o.useCallback(()=>{const{setAuth:r,setUser:c,setCannotConnect:p,setConfig:g,setConnection:l,setEntities:w,setError:H,setReady:q,setRoutes:y,setConnectionStatus:x}=u.useInternalStore.getState();r(null),y([]),q(!1),l(null),w({}),g(null),H(null),p(!1),c(null),x("pending"),h.current=!1,f.current&&(f.current(),f.current=null),S.current&&(S.current(),S.current=null)},[]),R=o.useCallback(async()=>{const{setError:r}=u.useInternalStore.getState();try{E(),G.clearTokens(),location&&location.reload()}catch(c){console.error("Error:",c),r("Unable to log out!")}},[E]),N=o.useCallback(async()=>{const{setError:r,setUser:c,setCannotConnect:p,setAuth:g,setConnection:l,setEntities:w,setConfig:H,setConnectionStatus:q}=u.useInternalStore.getState(),y=await Q.tryConnection(e,s);if(y.type==="error")h.current=!1,r(y.error);else if(y.type==="failed")h.current=!1,p(!0);else if(y.type==="success"){const{connection:x,auth:ue}=y;g(ue),l(x),S.current=O.subscribeEntities(x,P=>{w(P)}),f.current=O.subscribeConfig(x,P=>{H(P)}),O.getUser(x).then(P=>{c(P)});const{onStatusChange:le,...fe}=d||{};return be.handleSuspendResume(x,{suspendWhenHidden:!0,hiddenDelayMs:3e5,debug:!1,onStatusChange:P=>{q(P),le?.(P)},...fe})}},[e,s,d]);o.useEffect(()=>{const{setHassUrl:r}=u.useInternalStore.getState();r(e)},[e]);const v=o.useCallback(r=>{const{connection:c}=u.useInternalStore.getState();return c?new URL(r,c?.options.auth?.data.hassUrl).toString():""},[]);o.useEffect(()=>{const{setHash:r}=u.useInternalStore.getState();location.hash!==""&&location.hash.replace("#","")!==U&&r(location.hash)},[U]),o.useEffect(()=>{function r(){const{routes:c,setRoutes:p,setHash:g}=u.useInternalStore.getState();p(c.map(l=>l.hash===location.hash.replace("#","")?{...l,active:!0}:{...l,active:!1})),g(location.hash)}return window.addEventListener("hashchange",r),()=>{window.removeEventListener("hashchange",r)}},[]);const A=o.useCallback(r=>{const{routes:c,setRoutes:p}=u.useInternalStore.getState();if(!(c.find(l=>l.hash===r.hash)!==void 0)&&typeof window<"u"){const l=window.location.hash.replace("#",""),w=l!==""&&l===r.hash;p([...c,{...r,active:w}])}},[]),z=o.useCallback(r=>u.useInternalStore.getState().routes.find(g=>g.hash===r)||null,[]),K=o.useCallback(async({domain:r,service:c,serviceData:p,target:g,returnResponse:l})=>{const{connection:w,ready:H}=u.useInternalStore.getState(),q=typeof g=="string"||W.isArray(g)?{entity_id:g}:g;if(typeof c!="string")throw new Error("service must be a string");if(w&&H)try{const y=await O.callService(w,W.snakeCase(r),W.snakeCase(c),p,q,l);return l?y:void 0}catch(y){console.log("Error:",y)}},[]);o.useEffect(()=>()=>{E()},[E]);const V=o.useCallback(async()=>{try{h.current&&E(),h.current=!0,d?.onStatusChange?.("pending"),await N()}catch(r){const c=Q.handleError(r);b(`Unable to connect to Home Assistant, please check the URL: "${c}"`)}},[E,N,b,d]);o.useEffect(()=>{V()},[V]);const ie=o.useMemo(()=>({useStore:ye.useStore,logout:R,addRoute:A,getRoute:z,getStates:C,getServices:I,getConfig:T,getUser:j,callApi:pe.callApi,getAllEntities:Re,callService:K,joinHassUrl:v}),[R,A,z,C,I,T,j,K,v]);return F?i(ae("p",{children:["Unable to connect to $",G.loadTokens(e).hassUrl,", refresh the page and try again, or ",Y("a",{onClick:R,children:"Logout"}),"."]})):Y(u.HassContext.Provider,{value:ie,children:_===null?t(k):i(_)})}exports.Fragment=xe;exports.HassProvider=Ne;exports.jsx=Y;exports.jsxs=ae;exports.useShallow=ce; //# sourceMappingURL=Provider-Dxd1Q51u.cjs.map