fleeta-lib
Version:
A comprehensive library for fleet management applications - API, Auth, Device management
3 lines (2 loc) • 16.9 kB
JavaScript
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("zustand"),require("crypto-js")):"function"==typeof define&&define.amd?define(["exports","zustand","crypto-js"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).FleetAComponents={},e.zustand,e.CryptoJS)}(this,(function(e,t,n){"use strict";const r=t.create((e=>({config:null,isInitialized:!1,setConfig:t=>{e({config:t,isInitialized:!0})},clearConfig:()=>{e({config:null,isInitialized:!1})}})));function o(){const e=r.getState();return e.isInitialized&&e.config?e.config:null}function a(e){const t=o();return t?t[e]:null}function i(){const e=a("apiGateway");if(!e)throw new Error("API Gateway not configured. Please set VITE_API_GATEWAY in .env file.");return e}function s(e,t){let n;try{n=e()}catch(r){return}return{getItem:e=>{var t;const r=e=>null===e?null:JSON.parse(e,void 0),o=null!=(t=n.getItem(e))?t:null;return o instanceof Promise?o.then(r):r(o)},setItem:(e,t)=>n.setItem(e,JSON.stringify(t,void 0)),removeItem:e=>n.removeItem(e)}}const l=e=>t=>{try{const n=e(t);return n instanceof Promise?n:{then:e=>l(e)(n),catch(e){return this}}}catch(n){return{then(e){return this},catch:e=>l(e)(n)}}},u=(e,t)=>"getStorage"in t||"serialize"in t||"deserialize"in t?((e,t)=>(n,r,o)=>{let a={getStorage:()=>localStorage,serialize:JSON.stringify,deserialize:JSON.parse,partialize:e=>e,version:0,merge:(e,t)=>({...t,...e}),...t},i=!1;const s=new Set,u=new Set;let c;try{c=a.getStorage()}catch(m){}if(!c)return e(((...e)=>{n(...e)}),r,o);const d=l(a.serialize),g=()=>{const e=a.partialize({...r()});let t;const n=d({state:e,version:a.version}).then((e=>c.setItem(a.name,e))).catch((e=>{t=e}));if(t)throw t;return n},p=o.setState;o.setState=(e,t)=>{p(e,t),g()};const f=e(((...e)=>{n(...e),g()}),r,o);let h;const _=()=>{var e;if(!c)return;i=!1,s.forEach((e=>e(r())));const t=(null==(e=a.onRehydrateStorage)?void 0:e.call(a,r()))||void 0;return l(c.getItem.bind(c))(a.name).then((e=>{if(e)return a.deserialize(e)})).then((e=>{if(e){if("number"!=typeof e.version||e.version===a.version)return e.state;if(a.migrate)return a.migrate(e.state,e.version)}})).then((e=>{var t;return h=a.merge(e,null!=(t=r())?t:f),n(h,!0),g()})).then((()=>{null==t||t(h,void 0),i=!0,u.forEach((e=>e(h)))})).catch((e=>{null==t||t(void 0,e)}))};return o.persist={setOptions:e=>{a={...a,...e},e.getStorage&&(c=e.getStorage())},clearStorage:()=>{null==c||c.removeItem(a.name)},getOptions:()=>a,rehydrate:()=>_(),hasHydrated:()=>i,onHydrate:e=>(s.add(e),()=>{s.delete(e)}),onFinishHydration:e=>(u.add(e),()=>{u.delete(e)})},_(),h||f})(e,t):((e,t)=>(n,r,o)=>{let a={storage:s((()=>localStorage)),partialize:e=>e,version:0,merge:(e,t)=>({...t,...e}),...t},i=!1;const u=new Set,c=new Set;let d=a.storage;if(!d)return e(((...e)=>{n(...e)}),r,o);const g=()=>{const e=a.partialize({...r()});return d.setItem(a.name,{state:e,version:a.version})},p=o.setState;o.setState=(e,t)=>{p(e,t),g()};const f=e(((...e)=>{n(...e),g()}),r,o);let h;o.getInitialState=()=>f;const _=()=>{var e,t;if(!d)return;i=!1,u.forEach((e=>{var t;return e(null!=(t=r())?t:f)}));const o=(null==(t=a.onRehydrateStorage)?void 0:t.call(a,null!=(e=r())?e:f))||void 0;return l(d.getItem.bind(d))(a.name).then((e=>{if(e){if("number"!=typeof e.version||e.version===a.version)return[!1,e.state];if(a.migrate)return[!0,a.migrate(e.state,e.version)]}return[!1,void 0]})).then((e=>{var t;const[o,i]=e;if(h=a.merge(i,null!=(t=r())?t:f),n(h,!0),o)return g()})).then((()=>{null==o||o(h,void 0),h=r(),i=!0,c.forEach((e=>e(h)))})).catch((e=>{null==o||o(void 0,e)}))};return o.persist={setOptions:e=>{a={...a,...e},e.storage&&(d=e.storage)},clearStorage:()=>{null==d||d.removeItem(a.name)},getOptions:()=>a,rehydrate:()=>_(),hasHydrated:()=>i,onHydrate:e=>(u.add(e),()=>{u.delete(e)}),onFinishHydration:e=>(c.add(e),()=>{c.delete(e)})},a.skipHydration||_(),h||f})(e,t),c=t.create()(u((e=>({isAuthenticated:!1,userToken:null,jwtToken:null,serverConfig:null,userType:null,subscribeInfo:null,latestLoginInfo:null,error:null,setAuth:t=>{var n;if("BC_ERR_OK"===t.resultcode){const r=t.response||{},o=null==(n=r["logged in list"])?void 0:n.ids;e({isAuthenticated:!0,userToken:r.user_token??t.user_token??null,jwtToken:r.jsonwebtoken??t.jsonwebtoken??t.jwt_token??null,serverConfig:{was_server:r.was_server??"",was_port:r.was_port??"",gps_server:r.gps_server??"",gps_port:r.gps_port??"",gps_tracking_server:r.gps_tracking_server??"",gps_tracking_port:r.gps_tracking_port??"",geo_fence_server:r.geo_fence_server??"",geo_fence_port:r.geo_fence_port??""},userType:r.userType??null,subscribeInfo:r.subscribeinfo??null,latestLoginInfo:{timestamp:r.latestlogindt??"",mobileOS:r.lastMobileOS??"",appVersion:r.lastAppVer??"",webVersion:r.lastWebVer??"",duplicateLogins:o},error:null})}else e({error:t.message??"Login failed",isAuthenticated:!1})},clearAuth:()=>{e({isAuthenticated:!1,userToken:null,jwtToken:null,serverConfig:null,userType:null,subscribeInfo:null,latestLoginInfo:null,error:null})},setError:t=>e({error:t})})),{name:"auth-storage",skipHydration:!1}));let d=!1,g=!1;const p={BC_ERR_AUTHENTICATION:"Authentication failed. Please check your credentials.",BC_ERR_SIGNATURE:"Invalid security signature. Please try again.",BC_ERR_INVALID_DATA:"Something went wrong. Please try again.",BC_ERR_INVALID_PARAMETER:"Invalid login parameters. Please check your input.",BC_ERR_NEED_TO_CONFIRM:"Please verify your email address before logging in.",BC_ERR_BLACK_LIST:"Your account has been blocked for security reasons. Please contact support.",BC_ERR_SERVER:"Server error. Please try again later.",BC_ERR_DUPLICATED:"Account is already logged in on another device.",BC_ERR_GOOGLEAPPLE_ACCOUNT:"This account uses Google or Apple sign-in. Please continue with one of those."},f={BC_ERR_AUTHENTICATION:"Authentication failed. Please try again.",BC_ERR_SIGNATURE:"Security verification failed. Please try again.",BC_ERR_INVALID_DATA:"Invalid data received. Please try again.",BC_ERR_ALREADY_REQUESTED:"Password reset email has already been sent. Please check your inbox.",BC_ERR_INVALID_PARAMETER:"Invalid request parameters. Please try again.",BC_ERR_SERVER:"Internal server error. Please try again later.",BC_ERR_NOT_FOUND:"Email address not found. Please check your email and try again."},h={BC_ERR_AUTHENTICATION:"BCS Token not exists",BC_ERR_INVALID_PARAMETER:"Invalid parameter",BC_ERR_SERVER:"Internal server error"};function _(){const e=navigator.platform.toLowerCase();return e.includes("win")?"win32":e.includes("mac")?"macos":e.includes("linux")?"linux":"web"}function m(){var e;const t=c.getState();return t.isAuthenticated&&t.userToken&&t.jwtToken&&(null==(e=t.subscribeInfo)?void 0:e.userEmail)?{userToken:t.userToken,userEmail:t.subscribeInfo.userEmail,jwtToken:t.jwtToken}:null}function v(){return null!==m()}function E(){return"Authentication required. Please login first."}const w={BC_ERR_AUTHENTICATION:"Unauthorized - Authentication failed",BC_ERR_INVALID_PARAMETER:"Invalid parameter provided",BC_ERR_SERVER:"Internal server error occurred"};function I(e){const t=function(e){const t=e.length,n=e.filter((e=>"on"===e.device.active)).length,r=t-n,o=e.filter((e=>!!e.groupManagementID)).length,a=t-o,i=e.filter((e=>"on"===e.device.share_video)).length,s=e.filter((e=>"0"===e.device.mode)).length,l=e.filter((e=>"1"===e.device.mode)).length,u=e.filter((e=>"wifi"===e.device.reg_category)).length,c=e.filter((e=>"cloud"===e.device.reg_category)).length,d=e.filter((e=>!!e.device.battery)).length;return{total:t,online:n,offline:r,grouped:o,ungrouped:a,videoSharing:i,normalMode:s,parkingMode:l,wifiOnly:u,cloudEnabled:c,withBattery:d}}(e),n=function(e){const t=new Map;e.forEach((e=>{const n=e.groupManagementID||"ungrouped";t.has(n)||t.set(n,[]),t.get(n).push(e)}));const n=[];return t.forEach(((e,t)=>{const r=e[0];n.push({groupId:t,groupName:r.groupName||"Ungrouped",groupRegDate:r.groupRegDT,devices:e,isExpanded:"ungrouped"===t})})),n.sort(((e,t)=>"ungrouped"===e.groupId?-1:"ungrouped"===t.groupId?1:e.groupName.localeCompare(t.groupName))),n}(e);return{groups:n,statistics:t}}async function A(e){const t=m();if(!t)throw new Error("Authentication required. Please login first.");try{const n=i(),r={email:t.userEmail,userToken:t.userToken,tokenType:"web",...e},o=new URLSearchParams;o.append("email",r.email),o.append("userToken",r.userToken),o.append("tokenType",r.tokenType||"web"),r.keyword&&o.append("keyword",r.keyword),r.startIndex&&r.startIndex>=1&&o.append("startIndex",r.startIndex.toString()),r.endIndex&&r.endIndex>=1&&o.append("endIndex",r.endIndex.toString());const a=await fetch(`${n}/DashCam/DeviceList?${o.toString()}`,{method:"GET",headers:{"Content-Type":"application/json",Authorization:`Bearer ${t.jwtToken}`}});if(!a.ok)throw new Error(`HTTP error! status: ${a.status}`);const s=await a.json();if("BC_ERR_OK"!==s.resultcode){throw new Error(w[s.resultcode]||s.message||"Unknown error occurred")}const l=s.response||{deviceCount:s.deviceCount||0,deviceLimitCount:s.deviceLimitCount||0,sharedEventMap:s.sharedEventMap||"off",deviceListInfo:s.deviceListInfo||[]};if(!l)return{resultcode:s.resultcode,message:s.message,deviceCount:0,deviceLimitCount:0,sharedEventMap:"off",deviceListInfo:[],groupedData:{groups:[],statistics:{total:0,online:0,offline:0,grouped:0,ungrouped:0,videoSharing:0,normalMode:0,parkingMode:0,wifiOnly:0,cloudEnabled:0,withBattery:0}}};l.deviceListInfo||(l.deviceListInfo=[]);const{groups:u,statistics:c}=I(l.deviceListInfo);return{resultcode:s.resultcode,message:s.message,deviceCount:l.deviceCount||0,deviceLimitCount:l.deviceLimitCount||0,sharedEventMap:l.sharedEventMap||"off",deviceListInfo:l.deviceListInfo||[],groupedData:{groups:u,statistics:c}}}catch(n){throw n}}const y=5,R=20,S=["Seoul Fleet Alpha","Busan Transport Beta","Daegu Logistics Gamma","Incheon Delivery Delta","Gwangju Express Epsilon"],C=["DR970X-2CH","DR970X-1CH","DR900X-2CH","DR900X-1CH","DR750X-2CH"],T=["Wifi","Cat4","Cat-M1"];function M(){const e=Math.floor(100*Math.random()),t=Math.floor(60*Math.random())+10;return{ssid:`MOCK_BATTERY_${Math.random().toString(36).substr(2,9)}`,celsius:t,battery_percent:e,createdAt:new Date(Date.now()-6048e5*Math.random()).toISOString(),updatedAt:(new Date).toISOString(),state:e>70?"latest":e>30?"lateup1":"lateup2"}}function D(e,t,n){const r=function(e,t){return`MOCK${(e+1).toString().padStart(2,"0")}${(t+1).toString().padStart(3,"0")}`}(e,t),o=Math.random()>.3,a=Math.random()>.4,i=Math.random()>.5,s=Math.random()>.8,l=new Date,u=new Date(l.getTime()-31536e6*Math.random()),c=o?new Date(l.getTime()-864e5*Math.random()):new Date(l.getTime()-2592e6*Math.random());return{valid:"valid",psn:r,model:C[Math.floor(Math.random()*C.length)],active:o?"on":"off",dev_name:`${n.split(" ")[0]}-${(t+1).toString().padStart(3,"0")}`,battery:Math.random()>.2?M():void 0,lb_server_name:`mock-lb-${Math.floor(10*Math.random())}`,lb_http_port:80,lb_rtmp_port:1935,share_video:a?"on":"off",share_audio:a&&Math.random()>.5?"on":"off",share_dev_name:"on",share_gps:o?"on":"off",agree_gps:"on",fw_ver:`${Math.floor(3*Math.random())+1}.${Math.floor(10*Math.random())}.${Math.floor(100*Math.random())}`,upload_server:i?`cloud-upload-${Math.floor(5*Math.random())}.fleeta.io`:void 0,upload_port:i?443:void 0,lang:"eng",mode:s?"1":"0",communication_identifier:T[Math.floor(Math.random()*T.length)],temperature_level:Math.floor(5*Math.random())+1,sensitivity_level:Math.floor(5*Math.random())+1,dms_type:"standard",dms_version:"1.0.0",reg_date:u.toISOString(),login_date:c.toISOString(),iot_conn:o?"on":"off",reg_category:i?"cloud":"wifi",continentCode:"AS",countryCode:"KR",ip:`192.168.${Math.floor(255*Math.random())}.${Math.floor(255*Math.random())}`,liveview_rating:Math.floor(5*Math.random())+1,regInfoUpdateDT:(new Date).toISOString(),countryCodeUpdateDT:(new Date).toISOString(),profile_img:Math.random()>.7?`https://api.dicebear.com/7.x/identicon/svg?seed=${r}`:void 0,profile_img_v2:Math.random()>.7?`https://api.dicebear.com/7.x/avataaars/svg?seed=${r}`:void 0,cldn:`cldn_${r.toLowerCase()}`,ap_ssid:i?void 0:`MockWiFi_${t}`,ap_pw:i?void 0:`mock_pass_${t}`,require_time_sync:Math.random()>.5?"on":"off"}}const b="1.0.6",k="FleetA Library",O={version:b,name:k};e.API_MODULE_NAME="FleetA API Endpoint Manager",e.API_MODULE_VERSION="1.0.0",e.AUTH_MODULE_NAME="FleetA Authentication Module",e.AUTH_MODULE_VERSION="1.0.0",e.COMMUNICATION_TYPE_NAMES={Wifi:"Wi-Fi Connection",Cat4:"LTE Cat-4","Cat-M1":"LTE Cat-M1"},e.DEVICE_API_NAME="BlackVue Fleeta Device List API",e.DEVICE_API_VERSION="1.0.0",e.DEVICE_LIST_ERROR_MESSAGES=w,e.DEVICE_MODE_NAMES={0:"Normal Mode",1:"Parking Mode"},e.DEVICE_STATUS_NAMES={on:"Online",off:"Offline"},e.LIB_NAME=k,e.LIB_VERSION=b,e.default=O,e.getApiEndpoint=a,e.getApiEndpointConfig=o,e.getApiGateway=i,e.getAuthConfigFromStore=m,e.getAuthErrorMessage=E,e.getAuthHeaders=function(){const e=m();if(!e)throw new Error("Authentication required. Please login first.");return{Authorization:`Bearer ${e.jwtToken}`,"Content-Type":"application/json"}},e.getDeviceList=A,e.getEndpointErrorMessage=function(){return"API endpoints not configured. Please check your environment variables."},e.getIotApiGateway=function(){const e=a("iotApiGateway");if(!e)throw new Error("IoT API Gateway not configured. Please set VITE_IOT_API_GATEWAY in .env file.");return e},e.getMockDeviceList=async function(){let e=[],t=[];try{e=function(){const e=[];for(let t=0;y>t;t++){const n=S[t],r=`MOCK_GROUP_${(t+1).toString().padStart(3,"0")}`,o=new Date(Date.now()-31536e6*Math.random()).toISOString();for(let a=0;R>a;a++){const i=D(t,a,n);e.push({groupManagementID:r,groupName:n,groupRegDT:o,device:i})}}return e}()}catch(s){}if(v())try{const e=await A();"BC_ERR_OK"===e.resultcode&&(t=e.deviceListInfo||[])}catch(s){}const n=new Set(t.map((e=>e.device.psn))),r=e.filter((e=>!n.has(e.device.psn))),o=[...t,...r],{groups:a,statistics:i}=I(o);return{resultcode:"BC_ERR_OK",message:"Combined mock and real data with grouping",deviceCount:o.length,deviceLimitCount:1e3,sharedEventMap:"on",deviceListInfo:o,groupedData:{groups:a,statistics:i}}},e.isApiEndpointConfigured=function(){return null!==o()},e.isAuthConfigValid=function(){const e=m();return!!e&&(e.userToken.length>0&&e.jwtToken.length>0&&e.userEmail.includes("@"))},e.isAuthConfigured=v,e.isDeviceApiReady=function(){return null!==m()},e.login=async function({email:e,password:t}){if(!d)try{d=!0;const r=i(),o=new URLSearchParams({email:e,passwd:n.SHA256(t).toString(),mobile_uuid:"web-"+crypto.randomUUID(),mobile_name:navigator.userAgent,mobile_os_type:_(),app_ver:"1.0.0",web_ver:"1.0.0",time_interval:(-1*(new Date).getTimezoneOffset()).toString(),tokenType:"web",loginApp:"fleeta",loginType:"blackvue",companyID:"",mobileLang:navigator.language.split("-")[0]||"eng"}),a=await fetch(`${r}/BCS/userLogin.php`,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:o}),s=await a.json();if("BC_ERR_OK"!==s.resultcode){throw new Error(p[s.resultcode]||s.message)}c.getState().setAuth(s)}catch(r){throw c.getState().setError(r instanceof Error?r.message:"An error occurred during login"),r}finally{d=!1}},e.logout=async function(){const{userToken:e,subscribeInfo:t,jwtToken:n}=c.getState();if(!g){if(!e||!(null==t?void 0:t.userEmail))throw new Error("No active session found");try{g=!0;const r=i(),o=new URLSearchParams({email:t.userEmail,user_token:e,tokenType:"web"});let a=await fetch(`${r}/BCS/userLogout.php?${o.toString()}`,{method:"GET",headers:{"Content-Type":"application/x-www-form-urlencoded",Authorization:`Bearer ${n}`}});const s=await a.json();if("BC_ERR_OK"===s.resultcode)return void c.getState().clearAuth();{const e=h[s.resultcode]||s.message;throw c.getState().setError(e),new Error(e)}}catch(r){c.getState().clearAuth();const e=r instanceof Error?r.message:"An unexpected error occurred during logout";throw c.getState().setError(e),r}finally{g=!1}}},e.resetPassword=async function(e){try{const t=i(),n=new URLSearchParams({email:e,mobileLang:navigator.language.split("-")[0]||"eng",loginApp:"fleeta"}),r=await fetch(`${t}/BCS/initPasswd.php?${n.toString()}`,{method:"GET",headers:{"Content-Type":"application/x-www-form-urlencoded"}}),o=await r.json();if(!o||"object"!=typeof o)throw new Error("Invalid server response format");switch(o.resultcode){case"BC_ERR_OK":return{success:!0,alreadyRequested:!1};case"BC_ERR_ALREADY_REQUESTED":return{success:!0,alreadyRequested:!0};case"BC_ERR_NOT_FOUND":return{success:!1,alreadyRequested:!1};default:throw new Error(f[o.resultcode]||o.message||"An unexpected error occurred. Please try again.")}}catch(t){throw t}},e.useApiEndpointStore=r,e.useAuthStore=c,e.validateApiEndpoints=function(){const e=o();return!!e&&["apiGateway","iotApiGateway"].every((t=>{const n=e[t];return n&&n.trim().length>0}))},Object.defineProperties(e,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})}));
//# sourceMappingURL=index.umd.js.map