{"version":3,"sources":["common/storage/mmkv.ts","common/hooks/useToast.tsx","common/api/useAPIQuery.tsx","common/api/useAPIMutation.tsx","common/api/apiFetch.ts","assets/misc/background_pin_dark.png","assets/misc/background_pin_light.png","components/Maps/Implementations/GoogleMapsJS.tsx","assets/zones/blue.png","assets/zones/green.png","assets/zones/red.png","assets/zones/yellow.png","assets/misc/logo_dark.png","assets/misc/logo_light.png","components/Controls/Input.tsx","common/hooks/useValidatedForm.tsx","components/Images/CacheFixedImage.tsx","common/hooks/useKeyboardHeight.ts","common/api/endpoint.ts","features/auth/api.ts","features/auth/login/screen.tsx","features/auth/forgotPassword/screen.tsx","components/Blurred/BlurredBottomSheetBackground.tsx","common/logs/logController.ts","features/settings/debugging/screen.tsx","features/settings/debugging/zip.web.ts","components/Blurred/BlurredBottomSheet.tsx","components/Blurred/BlurredBox.tsx","features/locate/api/common.ts","features/locate/display/speedBrackets.ts","features/locate/display/assetIcons.tsx","common/hooks/useLocateOptions.ts","features/locate/api/locate.ts","features/locate/mapOverlays.tsx","components/Panels/Panels.tsx","features/locate/api/track.ts","features/locate/mapPositionController.tsx","features/locate/mapItems/locate.tsx","features/locate/display/zone.ts","features/locate/mapItems/track.tsx","features/locate/map.tsx","common/hooks/useComponentSize.ts","features/navigation/routerInternal.web.tsx","features/settings/screen.tsx","components/BottomSheet/BottomSheetCompatibleViews.tsx","common/hooks/useSearch.ts","components/BottomSheet/PanelHeader.tsx","components/BottomSheet/BottomSheetInput.tsx","features/locate/panels/listPanel.tsx","features/locate/api/group.ts","features/locate/panels/groupsPanel.tsx","features/locate/display/asset.ts","components/DatePicker/DatePickerContext.ts","components/DatePicker/Day.tsx","components/DatePicker/Month.tsx","components/DatePicker/DateRangePicker.tsx","components/DatePicker/DateRangePickerModal.tsx","components/DatePicker/TrackDatePickerPopover.tsx","features/locate/panels/detailsPanel.tsx","features/locate/panels/trackPanel.tsx","changelogs.ts","features/changelogs/modal.tsx","features/navigation/tabbedScreen.tsx","features/changelogs/screen.tsx","features/navigation/navigation.tsx","App.tsx","common/hooks/useSystemColorScheme.ts","index.js","common/storage/atoms.ts"],"names":["mmkv","MMKV","ToastAlert","id","status","title","description","isClosable","rest","close","NB_useToast","maxWidth","alignSelf","flexDirection","variant","space","flexShrink","w","alignItems","justifyContent","Icon","fontSize","fontWeight","color","icon","size","_icon","onPress","px","useToast","show","item","duration","render","apiBasePath","useAPIQuery","endpoint","body","options","useAtom","loginAtom","login","setLogin","toast","useQuery","fjss","a","async","apiFetch","undefined","useAPIMutation","baseBody","useMutation","data","basePath","onAuthenticationFailure","path","request","method","headers","Headers","mutatedData","paramsMutator","token","append","JSON","stringify","URLSearchParams","Object","fromEntries","entries","filter","i","toString","fetch","response","Message","ok","json","responseMutator","module","exports","apiKey","MapView","forwardRef","props","ref","mapViewRef","useRef","mapInstanceRef","ignoreZoomRef","useEffect","mapRef","fitCoordinates","window","google","bounds","maps","LatLngBounds","coordinates","coordinate","extend","LatLng","padding","top","right","bottom","left","current","fitBounds","setTimeout","goToCoordinate","setZoom","zoom","panTo","lat","latitude","lng","longitude","panBy","useMemo","center","mapTypeControl","fullscreenControl","streetViewControl","zoomControl","mapId","colorScheme","isFractionalZoomEnabled","version","googleMapsApiKey","mapContainerStyle","flex","mapTypeId","mapStyle","onDrag","onMapMove","onZoomChanged","onHeadingChanged","getHeading","setHeading","onLoad","map","onMapLoad","children","Marker","position","mapPaneName","GMOverlayView","OVERLAY_MOUSE_TARGET","onClick","ev","stopPropagation","style","transform","anchor","x","y","zIndex","Polyline","strokeWeight","width","strokeColor","FormInput","controller","useController","Input","onBlur","field","onChangeText","value","onChange","useValidatedForm","useForm","resolver","zodResolver","schema","CacheFixedImage","Image","source","useKeyboardHeight","keyboardVisible","useSharedValue","keyboardEndCoordinates","keyboardHeight","useDerivedValue","height","handleKeyboardWillChangeFrame","useCallback","endCoordinates","handleKeyboardWillHide","emitter","Keyboard","addListener","remove","responseSymbol","Symbol","mutatedResponseSymbol","createEndpoint","params","z","void","this","mutator","loginEndpoint","withPath","withMethod","withParams","object","username","string","password","clientCode","withResponse","forgotPasswordEndpoint","AnimatedStack","Animated","createAnimatedComponent","Stack","LoginScreen","useState","showPassword","setShowPassword","navigate","useNavigate","control","handleSubmit","formState","colorMode","useColorMode","loginMutation","onSuccess","accessToken","keyboardAvoidingStyle","useAnimatedStyle","marginBottom","withSpring","overshootClamping","Box","bg","_dark","alt","require","opacity","resizeMode","ScrollView","keyboardShouldPersistTaps","contentContainerStyle","flexGrow","p","safeArea","shadow","rounded","isError","Alert","HStack","mt","VStack","Text","error","message","keys","fields","length","values","flat","join","FormControl","isRequired","isInvalid","errors","Label","name","returnKeyType","ErrorMessage","autoCompleteType","type","secure","rightElement","IconButton","as","MaterialCommunityIcons","borderRadius","Button","isLoading","isLoadingText","mutate","ForgotPasswordScreen","forgotPasswordMutation","isSuccess","AnimatedBlurView","BlurView","BlurredBottomSheetBackground","animatedIndex","lightGreen","useToken","darkGreen","lightContainerAnimatedStyle","backgroundColor","interpolateColor","darkContainerAnimatedStyle","backgroundStyle","intensity","tint","pointerEvents","View","logController","enabled","getBoolean","logs","log","toggleEnabledLogFunction","set","internal_log","timestamp","addLog","Date","now","push","save","cleanup","getAllKeys","startsWith","removeAll","getLogKeys","removeBefore","key","logGroupTimestamp","Number","split","isNaN","delete","logGroup","getString","logGroupLogs","parse","e","getAllLogs","DataExporting","exporting","setExporting","Heading","mb","disabled","targetPath","cacheDirectory","documentDirectory","shareAsync","Logging","useReducer","rerender","Checkbox","m","aria-label","setEnabled","isChecked","getJSON","Share","share","AtomToggle","atom","setValue","label","disableBottomSheetAtom","atomWithMMKV","disableMapsAtom","disableAssetListAtom","disableAssetIconsAtom","googleMapsAtom","primaryColorAtom","ExtraOptions","primaryColor","setPrimaryColor","Platform","OS","flexWrap","DebuggingScreen","pl","__DEV__","BlurredBottomSheet","handleColor","disableBottomSheet","useAtomValue","snapPoints","backgroundComponent","handleIndicatorStyle","onChangeIndex","animateOnMount","ApiV2ZoneDisplay","ApiV2AssetStatus","ApiV2AssetType","BlurredBox","entering","exiting","layout","overflow","speedBrackets","speedBracketsString","bracket","useSpeedBrackets","tokens","index","minSpeed","speedString","getSpeedBracket","speed","find","slice","reverse","getAssetIcon","asset","speedBracket","hasDirection","showOnLegend","isUnsure","isPrivate","Private","Stopped","StoppedIdle","StoppedIdleUnsure","DrivingUnsure","Plant","Driving","AssetIcon","selected","colorName","borderColor","gray300","scale","borderWidth","rotate","heading","lineHeight","selectedTrackAtom","useLocateGroupOption","mainParams","useMatch","groupId","useLocateSelectedAssetOption","assetParams","useLocateOptions","selectedTrack","setSelectedTrack","useLocateSelectedTrackOption","group","selectedAsset","track","trackParams","start","dayjs","startOf","end","endOf","useLocateTrackOption","locateEndpoint","number","optional","useLocate","query","refetchInterval","keepPreviousData","assets","sort","b","toLowerCase","formatting","mapStyleAtom","mapLegendAtom","LayersMenu","setMapStyle","showLegend","setShowLegend","Menu","shouldOverlapWithTrigger","trigger","triggerProps","startIcon","Item","mx","fitToContent","Switch","onValueChange","trackExampleAssets","Car","Legend","dedupedAssets","NotInstalled","localeCompare","py","UnableToLoadDataBanner","failureCount","errorUpdatedAt","dataUpdatedAt","ApiV2TrackEntryType","Panels","trackEndpoint","objectId","startTimeUtc","finishTimeUtc","withParamsMutator","Math","min","withResponseMutator","shouldShowRefresh","format","useTrack","valueOf","refetchOnReconnect","refetchOnWindowFocus","refetchOnMount","MapPositionController","mapMovedAtom","paddingLeft","paddingRight","paddingBottom","mapMoved","setMapMoved","trackQuery","updateCameraPosition","moveInstantly","segments","entry","altitude","animated","entryId","flatMap","points","location","useLayoutEffect","ZoneMarker","zone","display","PoiBlue","angle","PoiGreen","PoiRed","PoiYellow","getZoneIcon","AssetMarker","isSelected","selectedLabelColor","ICON_SIZE","marginLeft","textAlign","numberOfLines","MapLocateItems","selectedAssetRef","showMarkers","setShowMarkers","zones","replace","TrackEntryMarker","driving","stopped","idle","pto_on","Unknown","TrackSegment","segment","Color","alpha","hexa","MapTrackItems","n","MapFitButton","Map","useSetAtom","setIndex","disableMaps","React","setSize","event","nativeEvent","useComponentSize","pageSize","onPageLayout","windowSize","useWindowDimensions","isDesktop","isLargeDesktop","panels","context","useContext","UNSAFE_RouteContext","outlet","usePanelData","leftPanel","leftPanelKey","leftKey","rightKey","rightPanel","rightPanelKey","useSafeAreaInsets","bottomSheetHeight","onLayout","safeAreaTop","Fragment","SlideInLeft","SlideOutLeft","SlideInRight","SlideOutRight","Link","to","back","Pressable","href","preventDefault","SettingsScreen","incrementCounter","themeAtom","setColorMode","updateAvailable","setUpdateAvailable","Select","selectedValue","fontFamily","select","ios","android","web","default","nativeApplicationVersion","Updates","nativeBuildVersion","result","isAvailable","manifest","createdAt","toLocaleString","SafeAreaAwareBottomSheetCompatibleScrollView","enableSafeArea","ScrollViewComponent","useBottomSheetInternal","BottomSheetScrollView","safeAreaBottom","PanelScrollView","header","scrollRef","bottomSheet","scrollTo","animateToPosition","animatedSnapPoints","ANIMATION_SOURCE","USER","SafeAreaAwareBottomSheetCompatibleFlatList","FlatListComponent","BottomSheetFlatList","FlatList","ListFooterComponent","PanelFlatList","scrollToOffset","offset","useSearch","timeout","search","setSearch","timeoutRef","val","clearTimeout","PanelHeader","h","upperTitle","ellipsizeMode","trimEnd","titleRight","subtitle","button","BottomSheetInput","onFocus","handleOnFocus","args","AssetEntry","textColor","selectBgColor","driver","address","renderAssetEntry","ListPanel","onValue","filteredAssets","Fuse","threshold","seeUninstalled","setSeeUninstalled","disableAssetList","Uninstalled","ListHeaderComponent","InputLeftElement","ml","placeholder","keyExtractor","getItemLayout","renderItem","groupEndpoint","GroupsPanel","groups","useGroups","filteredGroups","getDirection","uniformAngle","floor","getStatusText","MovingIgnitionOff","DatePickerContext","createContext","Day","dayLabel","date","focusedDate","isDateFocused","isDateSelected","isDateHovered","isDateBlocked","isFirstOrLastSelectedDate","isStartDate","isEndDate","onDateSelect","onDateFocus","onDateHover","useDay","isSelectedStartOrEnd","disabledDate","Month","year","month","firstDayOfWeek","prev","next","useMonth","days","weekdayLabels","monthLabel","day","Array","fill","_","DateRangePicker","START_DATE","focusedInput","setFocusedInput","datePicker","useDatepicker","startDate","endDate","maxBookingDate","onDatesChange","numberOfMonths","Provider","activeMonths","goToPreviousMonthsByOneMonth","goToNextMonthsByOneMonth","DateRangePickerModal","initialStartDate","setStartDate","initialEndDate","setEndDate","isLarge","Modal","isOpen","open","onClose","Content","CloseButton","Header","Body","Footer","Group","onSelect","TrackDatePickerPopover","setOpen","modalOpen","setModalOpen","Popover","onOpen","Arrow","add","toDate","DetailsPanel","actualAsset","previousAsset","trackAvailable","marginHorizontal","speedUnit","statusSince","showLocation","dialogTitle","naverCallerName","directionsMode","distanceToday","distanceUnit","comment","formatDuration","milliseconds","hours","minutes","Entry","total","hasStartAndEnd","from","isMultiDay","distance","TrackPanel","trackData","refetch","isEmpty","some","Divider","overview","cost","toFixed","allChangelogs","iconColor","Changelog","changelog","image","imageRounded","ChangelogsModal","latestChangelogVersion","changelogVersionAtom","changelogVersion","setChangelogVersion","changelogOpen","changelogs","tabs","prefix","TabbedScreen","useLocation","pathname","ChangelogHistoryScreen","Navigation","backHandler","BackHandler","addEventListener","element","LogBox","ignoreLogs","localizedFormat","locale","queryClient","QueryClient","defaultOptions","queries","cacheTime","asyncStoragePersistor","createAsyncStoragePersistor","storage","getItem","setItem","removeItem","ThemeHandler","systemColorScheme","delay","Appearance","getColorScheme","setColorScheme","resetCurrentTimeout","onColorSchemeChange","preferences","AppearanceChange","addChangeListener","useSystemColorScheme","themeSelection","green","StatusBar","persistQueryClient","persistor","registerRootComponent","primaryColorName","theme","defaultTheme","extendTheme","colors","primary","components","defaultProps","_input","_actionSheetContent","_item","_hover","_focus","_pressed","_selectedItem","endIcon","Check","client","NativeBaseProvider","initialValue","atomWithStorage","createJSONStorage","newValue"],"mappings":"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","file":"static/js/app.0a27d9f2.chunk.js","sourcesContent":["import { MMKV } from \"react-native-mmkv\";\r\n\r\nexport const mmkv = new MMKV();\r\n","import {\r\n Alert,\r\n CloseIcon,\r\n HStack,\r\n IconButton,\r\n Text,\r\n useToast as NB_useToast,\r\n VStack,\r\n} from \"native-base\";\r\nimport React from \"react\";\r\n\r\nexport interface ToastAlertProps {\r\n id: string;\r\n status: \"success\" | \"danger\" | \"warning\" | \"info\";\r\n title: string;\r\n description?: string;\r\n isClosable?: boolean;\r\n duration?: number;\r\n}\r\n\r\nfunction ToastAlert({\r\n id,\r\n status,\r\n // variant,\r\n title,\r\n description,\r\n isClosable,\r\n ...rest\r\n}: ToastAlertProps) {\r\n const { close } = NB_useToast();\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n {title}\r\n \r\n \r\n {isClosable ? (\r\n }\r\n _icon={{\r\n color: \"lightText\",\r\n }}\r\n onPress={() => close(id)}\r\n />\r\n ) : null}\r\n \r\n {!!description && (\r\n \r\n {description}\r\n \r\n )}\r\n \r\n \r\n );\r\n}\r\n\r\nexport function useToast() {\r\n const { show } = NB_useToast();\r\n\r\n return {\r\n show: (item: Omit) => {\r\n show({\r\n duration: item.duration ?? 2000,\r\n render: ({ id }) => {\r\n return ;\r\n },\r\n });\r\n },\r\n };\r\n}\r\n","import { useQuery, UseQueryOptions } from \"react-query\";\r\nimport { mutatedResponseSymbol, type Endpoint } from \"./endpoint\";\r\nimport fjss from \"fast-json-stable-stringify\";\r\nimport { z } from \"zod\";\r\nimport { ApiV2Error } from \"./apiError\";\r\nimport { useAtom } from \"jotai\";\r\nimport { loginAtom } from \"~/common/storage/atoms\";\r\nimport { apiFetch } from \"~/common/api/apiFetch\";\r\nimport { useToast } from \"../hooks/useToast\";\r\n\r\nconst apiBasePath = process.env.API_BASE_PATH;\r\n\r\nif (!apiBasePath) {\r\n throw \"Missing API Base Path\";\r\n}\r\n\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\nexport function useAPIQuery, R extends z.infer>(\r\n endpoint: E,\r\n body: R,\r\n options?: Omit<\r\n UseQueryOptions>>,\r\n \"mutationKey\" | \"mutationFn\"\r\n >\r\n) {\r\n const [login, setLogin] = useAtom(loginAtom);\r\n const toast = useToast();\r\n return useQuery>>(\r\n [endpoint, fjss(body), fjss(login)],\r\n async () => {\r\n return await apiFetch(apiBasePath!, endpoint, body, login, () => {\r\n setLogin(undefined);\r\n toast.show({\r\n title: \"Session expired.\",\r\n description: \"Please log in again.\",\r\n status: \"danger\",\r\n duration: 3000,\r\n });\r\n });\r\n },\r\n options\r\n );\r\n}\r\n","import { useMutation, UseMutationOptions } from \"react-query\";\r\nimport { mutatedResponseSymbol, type Endpoint } from \"./endpoint\";\r\nimport fjss from \"fast-json-stable-stringify\";\r\nimport { z } from \"zod\";\r\nimport { ApiV2Error } from \"./apiError\";\r\nimport { useAtom } from \"jotai\";\r\nimport { loginAtom } from \"~/common/storage/atoms\";\r\nimport { apiFetch } from \"~/common/api/apiFetch\";\r\nimport { useToast } from \"../hooks/useToast\";\r\n\r\nconst apiBasePath = process.env.API_BASE_PATH;\r\n\r\nif (!apiBasePath) {\r\n throw \"Missing API Base Path\";\r\n}\r\n\r\nexport function useAPIMutation<\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n E extends Endpoint,\r\n R extends Partial>\r\n>(\r\n endpoint: E,\r\n baseBody?: R,\r\n options?: Omit<\r\n UseMutationOptions<\r\n E[typeof mutatedResponseSymbol],\r\n ApiV2Error>,\r\n Omit, keyof R> &\r\n Partial, keyof R & keyof z.infer>>\r\n >,\r\n \"mutationKey\" | \"mutationFn\"\r\n >\r\n) {\r\n const [login, setLogin] = useAtom(loginAtom);\r\n const toast = useToast();\r\n return useMutation<\r\n E[typeof mutatedResponseSymbol],\r\n ApiV2Error>,\r\n Omit, keyof R> &\r\n Partial, keyof R & keyof z.infer>>\r\n >(\r\n [endpoint, fjss(baseBody)],\r\n async (data) => {\r\n return await apiFetch(apiBasePath!, endpoint, { ...baseBody, ...data }, login, () => {\r\n setLogin(undefined);\r\n toast.show({\r\n title: \"Session expired.\",\r\n description: \"Please log in again.\",\r\n status: \"danger\",\r\n duration: 3000,\r\n });\r\n });\r\n },\r\n options\r\n );\r\n}\r\n","import { Endpoint, mutatedResponseSymbol } from \"~/common/api/endpoint\";\r\nimport { z } from \"zod\";\r\n\r\nexport async function apiFetch<\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n E extends Endpoint\r\n>(\r\n basePath: string,\r\n endpoint: E,\r\n data: z.infer,\r\n login: { username: string; token: string } | undefined,\r\n onAuthenticationFailure: () => void\r\n): Promise {\r\n let path = `${basePath}${endpoint.path}`;\r\n const request = {\r\n method: endpoint.method,\r\n headers: new Headers(),\r\n body: undefined as string | undefined,\r\n };\r\n let mutatedData = data;\r\n if (endpoint.paramsMutator) {\r\n mutatedData = endpoint.paramsMutator(data);\r\n }\r\n if (login?.token) {\r\n request.headers?.append(\"Authorization\", `Bearer ${login.token}`);\r\n }\r\n if (request.method === \"POST\") {\r\n request.headers.append(\"Content-Type\", \"application/json\");\r\n if (data) request.body = JSON.stringify(mutatedData);\r\n } else {\r\n if (data)\r\n path += `?${new URLSearchParams(\r\n Object.fromEntries(Object.entries(mutatedData).filter((i) => i[1])) as Record<\r\n string,\r\n string\r\n >\r\n ).toString()}`;\r\n }\r\n let response;\r\n try {\r\n response = await fetch(path, request);\r\n } catch {\r\n throw {\r\n Message: \"Failed to connect to the server\",\r\n };\r\n }\r\n if (response.ok) {\r\n const data = await response.json();\r\n if (endpoint.responseMutator) {\r\n return endpoint.responseMutator(data, mutatedData);\r\n }\r\n return data;\r\n }\r\n if (response.status === 401) {\r\n onAuthenticationFailure();\r\n }\r\n throw await response.json();\r\n}\r\n","module.exports = __webpack_public_path__ + \"static/media/background_pin_dark.fecfb019.png\";","module.exports = __webpack_public_path__ + \"static/media/background_pin_light.c836ca33.png\";","import {\r\n GoogleMap,\r\n LoadScript,\r\n OverlayView as GMOverlayView,\r\n Polyline as GMPolyline,\r\n} from \"@react-google-maps/api\";\r\nimport {\r\n FitCoordinatesOptions,\r\n GoToCoordinateOptions,\r\n MapViewProps,\r\n MapViewRef,\r\n MarkerProps,\r\n PolylineProps,\r\n} from \"~/components/Maps/Common\";\r\nimport { ForwardedRef, forwardRef, useEffect, useMemo, useRef } from \"react\";\r\n\r\nconst apiKey = process.env.GOOGLE_MAPS_WEB_KEY;\r\n\r\nexport const MapView = forwardRef(function (props: MapViewProps, ref: ForwardedRef) {\r\n const mapViewRef = useRef(null);\r\n const mapInstanceRef = useRef(null);\r\n const ignoreZoomRef = useRef(0);\r\n useEffect(() => {\r\n const mapRef: MapViewRef = {\r\n fitCoordinates(options: FitCoordinatesOptions) {\r\n if (!window.google) return;\r\n const bounds = new window.google.maps.LatLngBounds();\r\n for (const coordinate of options.coordinates) {\r\n bounds.extend(new window.google.maps.LatLng(coordinate[0], coordinate[1]));\r\n }\r\n const padding = {\r\n top: (options.padding?.top ?? 0) + (props.padding?.top ?? 0),\r\n right: (options.padding?.right ?? 0) + (props.padding?.right ?? 0),\r\n bottom: (options.padding?.bottom ?? 0) + (props.padding?.bottom ?? 0),\r\n left: (options.padding?.left ?? 0) + (props.padding?.left ?? 0),\r\n };\r\n ignoreZoomRef.current++;\r\n mapInstanceRef.current?.fitBounds(bounds, padding);\r\n setTimeout(() => {\r\n ignoreZoomRef.current--;\r\n }, 200);\r\n },\r\n goToCoordinate(options: GoToCoordinateOptions) {\r\n ignoreZoomRef.current++;\r\n mapInstanceRef.current?.setZoom(options.zoom ?? 15);\r\n ignoreZoomRef.current--;\r\n mapInstanceRef.current?.panTo({\r\n lat: options.latitude,\r\n lng: options.longitude,\r\n });\r\n if (props.padding)\r\n mapInstanceRef.current?.panBy(\r\n (props.padding.right - props.padding.left) / 2,\r\n (props.padding.bottom - props.padding.top) / 2\r\n );\r\n },\r\n };\r\n if (typeof ref === \"function\") {\r\n ref(mapRef);\r\n } else if (ref) {\r\n ref.current = mapRef;\r\n }\r\n }, [props.padding?.top, props.padding?.left, props.padding?.right, props.padding?.bottom]);\r\n const options = useMemo(\r\n () => ({\r\n center: { lat: 0, lng: 0 },\r\n zoom: 0,\r\n mapTypeControl: false,\r\n fullscreenControl: false,\r\n streetViewControl: false,\r\n zoomControl: false,\r\n mapId:\r\n props.colorScheme === \"dark\"\r\n ? process.env.GOOGLE_MAPS_WEB_ID_DARK\r\n : process.env.GOOGLE_MAPS_WEB_ID_LIGHT,\r\n isFractionalZoomEnabled: true,\r\n }),\r\n [props.colorScheme, \"google\" in window]\r\n );\r\n return (\r\n \r\n \r\n {\r\n if (!ignoreZoomRef.current) props.onMapMove?.();\r\n }\r\n : undefined\r\n }\r\n onHeadingChanged={() => {\r\n const heading = mapInstanceRef.current?.getHeading() ?? 0;\r\n if (heading !== 0) {\r\n setTimeout(() => {\r\n mapInstanceRef.current?.setHeading(0);\r\n });\r\n }\r\n }}\r\n onLoad={(map) => {\r\n mapInstanceRef.current = map;\r\n props.onMapLoad?.();\r\n }}\r\n >\r\n {props.children}\r\n \r\n \r\n );\r\n});\r\n\r\nexport function Marker(props: MarkerProps) {\r\n return (\r\n \r\n {\r\n ev.stopPropagation();\r\n props.onPress?.();\r\n }\r\n : undefined\r\n }\r\n style={{\r\n transform: `translateX(-${(props.anchor?.x ?? 0.5) * 100}%) translateY(-${\r\n (props.anchor?.y ?? 1) * 100\r\n }%)`,\r\n position: \"absolute\",\r\n top: 0,\r\n left: 0,\r\n zIndex: props.zIndex ?? 0,\r\n }}\r\n >\r\n {props.children}\r\n \r\n \r\n );\r\n}\r\n\r\nexport function Polyline(props: PolylineProps) {\r\n return (\r\n ({\r\n lat: coordinate[0],\r\n lng: coordinate[1],\r\n }))}\r\n onClick={props.onPress}\r\n options={{\r\n zIndex: props.zIndex ?? 0,\r\n strokeWeight: props.width ?? 2,\r\n strokeColor: props.color ?? \"#000000\",\r\n }}\r\n />\r\n );\r\n}\r\n","module.exports = __webpack_public_path__ + \"static/media/blue.4606254c.png\";","module.exports = __webpack_public_path__ + \"static/media/green.f5511a16.png\";","module.exports = __webpack_public_path__ + \"static/media/red.141c73b7.png\";","module.exports = __webpack_public_path__ + \"static/media/yellow.c8c837c6.png\";","module.exports = __webpack_public_path__ + \"static/media/logo_dark.7f5a6286.png\";","module.exports = __webpack_public_path__ + \"static/media/logo_light.4cc3b591.png\";","import { IInputProps, Input } from \"native-base\";\r\nimport { FieldValues, FieldPath, useController } from \"react-hook-form\";\r\nimport { ControlProps } from \".\";\r\n\r\nexport function FormInput<\r\n TFieldValues extends FieldValues = FieldValues,\r\n TName extends FieldPath = FieldPath\r\n>(\r\n props: ControlProps, TFieldValues, TName>\r\n) {\r\n const controller = useController(props);\r\n\r\n return (\r\n controller.field.onChange(value)}\r\n value={controller.field.value}\r\n />\r\n );\r\n}\r\n","/* eslint-disable @typescript-eslint/no-explicit-any */\r\nimport { zodResolver } from \"@hookform/resolvers/zod\";\r\nimport { UseFormProps, useForm } from \"react-hook-form\";\r\nimport { ZodType, z } from \"zod\";\r\n\r\nexport function useValidatedForm>(\r\n props: Omit & { schema: T }\r\n) {\r\n return useForm>({\r\n ...props,\r\n resolver: zodResolver(props.schema),\r\n } as any);\r\n}\r\n","import { IImageProps, Image } from \"native-base\";\r\nimport fjss from \"fast-json-stable-stringify\";\r\n\r\nexport function CacheFixedImage(props: IImageProps) {\r\n return ;\r\n}\r\n","// Based on https://dev.to/karlmarxlopez/a-simple-reusable-keyboard-avoiding-animation-hook-with-typescript-reanimated-v2-1npj\r\nimport { useDerivedValue, useSharedValue } from \"react-native-reanimated\";\r\nimport { Keyboard, KeyboardEventListener, ScreenRect } from \"react-native\";\r\nimport { useCallback, useEffect } from \"react\";\r\n\r\nexport function useKeyboardHeight() {\r\n const keyboardVisible = useSharedValue(false);\r\n const keyboardEndCoordinates = useSharedValue(null);\r\n const keyboardHeight = useDerivedValue(() => {\r\n if (keyboardVisible.value && keyboardEndCoordinates.value) {\r\n return keyboardEndCoordinates.value.height;\r\n }\r\n return 0;\r\n }, [keyboardEndCoordinates]);\r\n\r\n const handleKeyboardWillChangeFrame = useCallback(\r\n ({ endCoordinates }) => {\r\n keyboardVisible.value = true;\r\n keyboardEndCoordinates.value = endCoordinates;\r\n },\r\n [keyboardEndCoordinates, keyboardVisible]\r\n );\r\n\r\n const handleKeyboardWillHide = useCallback(\r\n ({ endCoordinates }) => {\r\n keyboardVisible.value = false;\r\n keyboardEndCoordinates.value = endCoordinates;\r\n },\r\n [keyboardEndCoordinates, keyboardVisible]\r\n );\r\n\r\n useEffect(() => {\r\n const emitter = Keyboard.addListener(\"keyboardWillChangeFrame\", handleKeyboardWillChangeFrame);\r\n\r\n return () => emitter.remove();\r\n }, [handleKeyboardWillChangeFrame]);\r\n\r\n useEffect(() => {\r\n const emitter = Keyboard.addListener(\"keyboardWillHide\", handleKeyboardWillHide);\r\n\r\n return () => emitter.remove();\r\n }, [handleKeyboardWillHide]);\r\n\r\n return { keyboardVisible, keyboardEndCoordinates, keyboardHeight };\r\n}\r\n","import { z } from \"zod\";\r\n\r\nexport const responseSymbol = Symbol();\r\nexport const mutatedResponseSymbol = Symbol();\r\nexport interface Endpoint {\r\n path: string;\r\n method: \"GET\" | \"POST\";\r\n params: Schema;\r\n paramsMutator?: (params: z.infer) => unknown;\r\n [responseSymbol]: Response;\r\n [mutatedResponseSymbol]: MutatedResponse;\r\n responseMutator?: (response: Response, params: z.infer) => MutatedResponse;\r\n withPath(path: string): Endpoint;\r\n withMethod(method: \"GET\" | \"POST\"): Endpoint;\r\n withParams(\r\n params: NewSchema\r\n ): Endpoint;\r\n withParamsMutator(\r\n mutator: (params: z.infer) => z.infer\r\n ): Endpoint;\r\n withResponse(): Endpoint;\r\n withResponseMutator(\r\n mutator: (response: Response, params: z.infer) => NewMutatedResponse\r\n ): Endpoint;\r\n}\r\n\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\nexport function createEndpoint(): Endpoint {\r\n return {\r\n path: \"\",\r\n method: \"GET\",\r\n params: z.void(),\r\n [responseSymbol]: \"\",\r\n [mutatedResponseSymbol]: \"\",\r\n withPath(path) {\r\n return { ...this, path };\r\n },\r\n withMethod(method) {\r\n return { ...this, method };\r\n },\r\n withParams(params) {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n return { ...this, params } as any;\r\n },\r\n withResponse() {\r\n return { ...this, [responseSymbol]: \"\" as unknown as Response, responseMutator: undefined };\r\n },\r\n withResponseMutator(mutator: (data: Response) => NewMutatedResponse) {\r\n return {\r\n ...this,\r\n responseMutator: mutator,\r\n };\r\n },\r\n withParamsMutator(mutator) {\r\n return { ...this, paramsMutator: mutator };\r\n },\r\n };\r\n}\r\n","import { z } from \"zod\";\r\nimport { createEndpoint } from \"~/common/api/endpoint\";\r\n\r\nexport const loginEndpoint = createEndpoint()\r\n .withPath(\"account/login/v2\")\r\n .withMethod(\"POST\")\r\n .withParams(\r\n z.object({\r\n username: z.string(),\r\n password: z.string(),\r\n clientCode: z.string(),\r\n })\r\n )\r\n .withResponse<{\r\n clientCode: string;\r\n username: string;\r\n accessToken: string;\r\n }>();\r\n\r\nexport const forgotPasswordEndpoint = createEndpoint()\r\n .withPath(\"account/forgotpassword\")\r\n .withMethod(\"POST\")\r\n .withParams(\r\n z.object({\r\n username: z.string(),\r\n clientCode: z.string(),\r\n })\r\n )\r\n .withResponse<{\r\n message: string;\r\n }>();\r\n","import {\r\n Alert,\r\n Box,\r\n Button,\r\n FormControl,\r\n HStack,\r\n Icon,\r\n IconButton,\r\n ScrollView,\r\n Stack,\r\n Text,\r\n useColorMode,\r\n VStack,\r\n} from \"native-base\";\r\nimport { FormInput } from \"~/components/Controls/Input\";\r\nimport { useValidatedForm } from \"~/common/hooks/useValidatedForm\";\r\nimport { useAPIMutation } from \"~/common/api/useAPIMutation\";\r\nimport { useAtom } from \"jotai\";\r\nimport React, { useState } from \"react\";\r\nimport { CacheFixedImage } from \"~/components/Images/CacheFixedImage\";\r\nimport Animated, { useAnimatedStyle, withSpring } from \"react-native-reanimated\";\r\nimport { useNavigate } from \"react-router\";\r\nimport { useKeyboardHeight } from \"~/common/hooks/useKeyboardHeight\";\r\nimport { loginAtom } from \"~/common/storage/atoms\";\r\nimport { loginEndpoint } from \"~/features/auth/api\";\r\nimport { MaterialCommunityIcons } from \"@expo/vector-icons\";\r\n\r\nconst AnimatedStack = Animated.createAnimatedComponent(Stack);\r\n\r\nexport function LoginScreen() {\r\n const [, setLogin] = useAtom(loginAtom);\r\n const [showPassword, setShowPassword] = useState(false);\r\n const navigate = useNavigate();\r\n const { control, handleSubmit, formState } = useValidatedForm({\r\n schema: loginEndpoint.params,\r\n });\r\n const { colorMode } = useColorMode();\r\n const loginMutation = useAPIMutation(\r\n loginEndpoint,\r\n {},\r\n {\r\n onSuccess: (data) => {\r\n setLogin({\r\n username: data.username,\r\n token: data.accessToken,\r\n clientCode: data.clientCode,\r\n });\r\n },\r\n }\r\n );\r\n const { keyboardHeight } = useKeyboardHeight();\r\n const keyboardAvoidingStyle = useAnimatedStyle(() => {\r\n return {\r\n marginBottom: withSpring(keyboardHeight.value, {\r\n overshootClamping: true,\r\n }),\r\n };\r\n }, [keyboardHeight]);\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n {loginMutation.isError && (\r\n \r\n \r\n \r\n \r\n \r\n {loginMutation.error.message}\r\n \r\n {Object.keys(loginMutation.error.fields ?? {}).length > 0 && (\r\n \r\n {Object.values(loginMutation.error.fields ?? {})\r\n .flat()\r\n .join(\"\\n\")}\r\n \r\n )}\r\n \r\n \r\n \r\n )}\r\n\r\n \r\n Client Code\r\n \r\n \r\n {formState.errors.clientCode?.message}\r\n \r\n \r\n\r\n \r\n\r\n \r\n Username\r\n \r\n \r\n {formState.errors.username?.message}\r\n \r\n \r\n \r\n Password\r\n setShowPassword(!showPassword)}\r\n icon={\r\n \r\n }\r\n borderRadius=\"full\"\r\n />\r\n }\r\n />\r\n \r\n {formState.errors.password?.message}\r\n \r\n \r\n {\r\n loginMutation.mutate(data);\r\n })}\r\n >\r\n Login\r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n}\r\n","import {\r\n Alert,\r\n Box,\r\n Button,\r\n FormControl,\r\n HStack,\r\n ScrollView,\r\n Stack,\r\n Text,\r\n useColorMode,\r\n VStack,\r\n} from \"native-base\";\r\nimport { FormInput } from \"~/components/Controls/Input\";\r\nimport { useValidatedForm } from \"~/common/hooks/useValidatedForm\";\r\nimport { useAPIMutation } from \"~/common/api/useAPIMutation\";\r\nimport React from \"react\";\r\nimport { CacheFixedImage } from \"~/components/Images/CacheFixedImage\";\r\nimport Animated, { useAnimatedStyle, withSpring } from \"react-native-reanimated\";\r\nimport { useNavigate } from \"react-router\";\r\nimport { useKeyboardHeight } from \"~/common/hooks/useKeyboardHeight\";\r\nimport { forgotPasswordEndpoint } from \"~/features/auth/api\";\r\n\r\nconst AnimatedStack = Animated.createAnimatedComponent(Stack);\r\n\r\nexport function ForgotPasswordScreen() {\r\n const navigate = useNavigate();\r\n const { control, handleSubmit, formState } = useValidatedForm({\r\n schema: forgotPasswordEndpoint.params,\r\n });\r\n const { colorMode } = useColorMode();\r\n const forgotPasswordMutation = useAPIMutation(forgotPasswordEndpoint, {});\r\n const { keyboardHeight } = useKeyboardHeight();\r\n const keyboardAvoidingStyle = useAnimatedStyle(() => {\r\n return {\r\n marginBottom: withSpring(keyboardHeight.value, {\r\n overshootClamping: true,\r\n }),\r\n };\r\n }, [keyboardHeight]);\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n {forgotPasswordMutation.isError && (\r\n \r\n \r\n \r\n \r\n \r\n {forgotPasswordMutation.error.message}\r\n \r\n {Object.keys(forgotPasswordMutation.error.fields ?? {}).length > 0 && (\r\n \r\n {Object.values(forgotPasswordMutation.error.fields ?? {})\r\n .flat()\r\n .join(\"\\n\")}\r\n \r\n )}\r\n \r\n \r\n \r\n )}\r\n {forgotPasswordMutation.isSuccess && (\r\n \r\n \r\n \r\n \r\n \r\n \r\n {forgotPasswordMutation.data.message}\r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n\r\n \r\n Client Code\r\n \r\n \r\n {formState.errors.clientCode?.message}\r\n \r\n \r\n\r\n \r\n Username\r\n \r\n \r\n {formState.errors.username?.message}\r\n \r\n \r\n {\r\n forgotPasswordMutation.mutate(data);\r\n })}\r\n >\r\n Request Password Reset\r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n}\r\n","import Animated, { interpolateColor, useAnimatedStyle } from \"react-native-reanimated\";\r\nimport { BlurView } from \"expo-blur\";\r\nimport React, { useMemo } from \"react\";\r\nimport { BottomSheetBackgroundProps } from \"@gorhom/bottom-sheet\";\r\nimport { useColorMode, useToken } from \"native-base\";\r\n\r\nconst AnimatedBlurView = Animated.createAnimatedComponent(BlurView);\r\n\r\nexport const BlurredBottomSheetBackground: React.FC<\r\n Pick\r\n> = ({ style, animatedIndex }) => {\r\n const { colorMode } = useColorMode();\r\n const lightGreen = useToken(\"colors\", \"primary.200\");\r\n const darkGreen = useToken(\"colors\", \"dark.100\");\r\n\r\n const lightContainerAnimatedStyle = useAnimatedStyle(() => ({\r\n backgroundColor: interpolateColor(animatedIndex.value, [0, 1], [lightGreen + \"88\", lightGreen]),\r\n }));\r\n const darkContainerAnimatedStyle = useAnimatedStyle(() => ({\r\n backgroundColor: interpolateColor(animatedIndex.value, [0, 1], [darkGreen + \"aa\", darkGreen]),\r\n }));\r\n const backgroundStyle = useMemo(\r\n () => [\r\n { flex: 1 },\r\n colorMode === \"dark\" ? darkContainerAnimatedStyle : lightContainerAnimatedStyle,\r\n ],\r\n [style, lightContainerAnimatedStyle, darkContainerAnimatedStyle, colorMode]\r\n );\r\n\r\n return (\r\n \r\n \r\n \r\n );\r\n};\r\n","import { mmkv } from \"../storage/mmkv\";\r\n\r\ninterface Log {\r\n timestamp: number;\r\n data: string;\r\n}\r\n\r\nclass LogController {\r\n enabled: boolean = mmkv.getBoolean(`@tin-app/logs_enabled`);\r\n logs: Log[] = [];\r\n constructor() {\r\n this.logs = [];\r\n this.toggleEnabledLogFunction();\r\n }\r\n\r\n setEnabled(enabled: boolean): void {\r\n this.enabled = enabled;\r\n this.toggleEnabledLogFunction();\r\n mmkv.set(`@tin-app/logs_enabled`, enabled);\r\n }\r\n\r\n toggleEnabledLogFunction(): void {\r\n this.log = this.enabled ? this.internal_log : null;\r\n }\r\n\r\n log: ((data: string, timestamp?: number) => void) | null = null;\r\n\r\n internal_log(data: string, timestamp?: number): void {\r\n this.addLog({\r\n timestamp: timestamp ?? Date.now(),\r\n data,\r\n });\r\n }\r\n\r\n private addLog(log: Log): void {\r\n if (!this.enabled) return;\r\n this.logs.push(log);\r\n if (this.logs.length > 10) {\r\n this.save();\r\n }\r\n }\r\n\r\n save(): void {\r\n mmkv.set(`@tin-app/logs/${Date.now()}`, JSON.stringify(this.logs));\r\n this.logs = [];\r\n this.cleanup();\r\n }\r\n\r\n private getLogKeys(): string[] {\r\n return mmkv.getAllKeys().filter((i) => i.startsWith(\"@tin-app/logs/\"));\r\n }\r\n\r\n cleanup(removeAll = false): void {\r\n const keys = this.getLogKeys();\r\n const removeBefore = Date.now() - 1000 * 60 * 60 * 24; // 1 day\r\n for (const key of keys) {\r\n const logGroupTimestamp = Number(key.split(\"/\")[2]);\r\n if (removeAll || Number.isNaN(logGroupTimestamp) || logGroupTimestamp < removeBefore) {\r\n mmkv.delete(key);\r\n }\r\n }\r\n if (removeAll) {\r\n this.logs = [];\r\n }\r\n }\r\n\r\n getAllLogs(): Log[] {\r\n const logs: Log[] = [];\r\n const keys = this.getLogKeys();\r\n for (const key of keys) {\r\n const logGroup = mmkv.getString(key);\r\n if (!logGroup) continue;\r\n try {\r\n const logGroupLogs: Log[] = JSON.parse(logGroup);\r\n logs.push(...logGroupLogs);\r\n } catch (e) {\r\n logs.push({\r\n timestamp: Date.now(),\r\n data: `Error parsing log group: ${logGroup}`,\r\n });\r\n }\r\n }\r\n logs.push(...this.logs);\r\n return logs;\r\n }\r\n\r\n getJSON() {\r\n const logs = this.getAllLogs();\r\n if (logs.length === 0) return null;\r\n return JSON.stringify(logs, null, 2);\r\n }\r\n}\r\n\r\nexport const logController = new LogController();\r\n","import {\r\n Alert,\r\n Box,\r\n Button,\r\n Checkbox,\r\n Heading,\r\n HStack,\r\n Icon,\r\n IconButton,\r\n ScrollView,\r\n Stack,\r\n Text,\r\n VStack,\r\n} from \"native-base\";\r\nimport { MaterialCommunityIcons } from \"@expo/vector-icons\";\r\nimport React, { useReducer, useState } from \"react\";\r\nimport { useNavigate } from \"react-router\";\r\nimport { cacheDirectory, documentDirectory } from \"expo-file-system\";\r\nimport { zipWithPassword } from \"./zip\";\r\nimport { shareAsync } from \"expo-sharing\";\r\nimport { logController } from \"~/common/logs/logController\";\r\nimport { Platform, Share } from \"react-native\";\r\nimport { Experiments } from \"./experiments\";\r\nimport { useToast } from \"~/common/hooks/useToast\";\r\nimport { useAtom, WritableAtom } from \"jotai\";\r\nimport { atomWithMMKV } from \"~/common/storage/atoms\";\r\n\r\nfunction DataExporting() {\r\n const [exporting, setExporting] = useState(false);\r\n const toast = useToast();\r\n return (\r\n \r\n \r\n \r\n Data Exporting\r\n \r\n {\r\n try {\r\n setExporting(true);\r\n const targetPath = `${cacheDirectory!}/export-${Date.now()}.zip`;\r\n logController.log?.(`[Settings:DataExport] Exporting to ${targetPath}... `);\r\n const sourcePath = documentDirectory!;\r\n // This password should at least stop the average person from viewing the data\r\n await zipWithPassword(sourcePath, targetPath, \"notagoodpassword\");\r\n logController.log?.(\"[Settings:DataExport] Exported, Sharing...\");\r\n await shareAsync(targetPath);\r\n logController.log?.(\"[Settings:DataExport] Shared.\");\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n } catch (e: any) {\r\n logController.log?.(`[Settings:DataExport] Error: ${e.toString()}`);\r\n toast.show({\r\n title: `Failed to export data: ${e}`,\r\n status: \"danger\",\r\n duration: 2000,\r\n });\r\n }\r\n }}\r\n >\r\n Export Data\r\n \r\n \r\n \r\n );\r\n}\r\n\r\nfunction Logging() {\r\n const [, rerender] = useReducer((i) => {\r\n return i + 1;\r\n }, 0);\r\n const toast = useToast();\r\n return (\r\n \r\n \r\n \r\n Logging\r\n \r\n {\r\n logController.setEnabled(!logController.enabled);\r\n rerender();\r\n }}\r\n isChecked={logController.enabled}\r\n >\r\n Debug Logging\r\n \r\n {\r\n try {\r\n const data = logController.getJSON();\r\n if (data === null) {\r\n toast.show({\r\n title: \"No Logs to Export\",\r\n status: \"info\",\r\n duration: 2000,\r\n });\r\n return;\r\n }\r\n\r\n await Share.share({\r\n message: data,\r\n title: \"TVA Logs\",\r\n });\r\n } catch {\r\n toast.show({\r\n title: \"Failed to export logs\",\r\n status: \"danger\",\r\n duration: 2000,\r\n });\r\n }\r\n }}\r\n >\r\n Export Logs\r\n \r\n \r\n \r\n );\r\n}\r\n\r\nfunction AtomToggle(props: { label: string; atom: WritableAtom }) {\r\n const [value, setValue] = useAtom(props.atom);\r\n return (\r\n {\r\n setValue(!value);\r\n }}\r\n isChecked={value}\r\n >\r\n {props.label}\r\n \r\n );\r\n}\r\n\r\nexport const disableBottomSheetAtom = atomWithMMKV(\"disableBottomSheet\", false);\r\nexport const disableMapsAtom = atomWithMMKV(\"disableMaps\", false);\r\nexport const disableAssetListAtom = atomWithMMKV(\"disableAssetList\", false);\r\nexport const disableAssetIconsAtom = atomWithMMKV(\"disableAssetIcons\", false);\r\nexport const googleMapsAtom = atomWithMMKV(\"googleMaps\", false);\r\nexport const primaryColorAtom = atomWithMMKV(\"primaryColor\", \"green\");\r\n\r\nfunction ExtraOptions() {\r\n const [primaryColor, setPrimaryColor] = useAtom(primaryColorAtom);\r\n return (\r\n \r\n \r\n \r\n Extra Options\r\n \r\n \r\n \r\n \r\n \r\n {Platform.OS === \"android\" && (\r\n \r\n )}\r\n \r\n {[\r\n \"light\",\r\n \"rose\",\r\n \"pink\",\r\n \"fuchsia\",\r\n \"purple\",\r\n \"violet\",\r\n \"indigo\",\r\n \"blue\",\r\n \"lightBlue\",\r\n \"darkBlue\",\r\n \"cyan\",\r\n \"teal\",\r\n \"emerald\",\r\n \"green\",\r\n \"lime\",\r\n \"yellow\",\r\n \"amber\",\r\n \"orange\",\r\n \"red\",\r\n \"warmGray\",\r\n \"trueGray\",\r\n \"gray\",\r\n \"coolGray\",\r\n \"blueGray\",\r\n ].map((i) => (\r\n setPrimaryColor(i)}\r\n >\r\n {i}\r\n \r\n ))}\r\n \r\n \r\n \r\n );\r\n}\r\n\r\nexport function DebuggingScreen() {\r\n const navigate = useNavigate();\r\n return (\r\n \r\n \r\n \r\n navigate(-1)}\r\n icon={}\r\n />\r\n Debugging Tools\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n Danger Ahead\r\n \r\n \r\n \r\n \r\n \r\n These tools are for debugging and testing purposes only. If you don't know what\r\n you're doing, you should not use them.\r\n \r\n \r\n \r\n \r\n\r\n \r\n\r\n {Platform.OS !== \"web\" && }\r\n\r\n \r\n\r\n {__DEV__ && }\r\n \r\n \r\n );\r\n}\r\n","export function zip() {\r\n return null;\r\n}\r\nexport function zipWithPassword() {\r\n return null;\r\n}\r\n","import BottomSheet from \"@gorhom/bottom-sheet\";\r\nimport { Box, useColorMode, useToken } from \"native-base\";\r\nimport React from \"react\";\r\nimport { Platform } from \"react-native\";\r\nimport { SharedValue } from \"react-native-reanimated\";\r\nimport { BlurredBottomSheetBackground } from \"~/components/Blurred/BlurredBottomSheetBackground\";\r\nimport { useAtomValue } from \"jotai\";\r\nimport { disableBottomSheetAtom } from \"~/features/settings/debugging/screen\";\r\n\r\nexport interface BlurredBottomSheetProps {\r\n children: React.ReactNode;\r\n snapPoints: (string | number)[];\r\n animatedIndex: SharedValue;\r\n onChangeIndex: (index: number) => void;\r\n}\r\n\r\nexport function BlurredBottomSheet(props: BlurredBottomSheetProps) {\r\n const { colorMode } = useColorMode();\r\n const handleColor = useToken(\"colors\", colorMode === \"dark\" ? \"gray.300\" : \"gray.800\");\r\n const disableBottomSheet = useAtomValue(disableBottomSheetAtom);\r\n if (Platform.OS === \"web\" || disableBottomSheet) {\r\n return (\r\n \r\n \r\n {props.children}\r\n \r\n );\r\n }\r\n return (\r\n \r\n {props.children}\r\n \r\n );\r\n}\r\n","import { BlurView } from \"expo-blur\";\r\nimport React, { ReactNode } from \"react\";\r\nimport { useColorMode, useToken } from \"native-base\";\r\nimport { View, ViewStyle } from \"react-native\";\r\nimport Animated, {\r\n BaseAnimationBuilder,\r\n EntryExitAnimationFunction,\r\n Keyframe,\r\n LayoutAnimationFunction,\r\n} from \"react-native-reanimated\";\r\n\r\nconst AnimatedBlurView = Animated.createAnimatedComponent(BlurView);\r\n\r\nexport const BlurredBox: React.FC<{\r\n status?: \"danger\";\r\n children: ReactNode;\r\n style: ViewStyle;\r\n layout?: BaseAnimationBuilder | LayoutAnimationFunction | typeof BaseAnimationBuilder;\r\n entering?:\r\n | BaseAnimationBuilder\r\n | typeof BaseAnimationBuilder\r\n | EntryExitAnimationFunction\r\n | Keyframe;\r\n exiting?:\r\n | BaseAnimationBuilder\r\n | typeof BaseAnimationBuilder\r\n | EntryExitAnimationFunction\r\n | Keyframe;\r\n}> = (props) => {\r\n const { colorMode } = useColorMode();\r\n const lightGreen = useToken(\"colors\", props.status === \"danger\" ? \"red.200\" : \"primary.200\");\r\n const darkGreen = useToken(\"colors\", props.status === \"danger\" ? \"red.800\" : \"dark.100\");\r\n const shadow = useToken(\"shadows\", \"2\");\r\n\r\n return (\r\n \r\n \r\n {props.children}\r\n \r\n \r\n );\r\n};\r\n","export interface ApiV2Formatting {\r\n distanceUnit: string;\r\n speedUnit: string;\r\n /**\r\n * @deprecated Use app-side useSpeedBrackets() instead\r\n */\r\n speedBrackets: ApiV2SpeedBracket[];\r\n}\r\n\r\nexport interface ApiV2SpeedBracket {\r\n name: string;\r\n color: string;\r\n}\r\n\r\nexport enum ApiV2ZoneDisplay {\r\n Hidden = \"Hidden\",\r\n Outline = \"Outline\",\r\n PoiBlue = \"PoiBlue\",\r\n PoiGreen = \"PoiGreen\",\r\n PoiRed = \"PoiRed\",\r\n PoiYellow = \"PoiYellow\",\r\n}\r\n\r\nexport interface ApiV2Zone {\r\n id: number;\r\n name: string;\r\n display: ApiV2ZoneDisplay;\r\n latitude: number;\r\n longitude: number;\r\n}\r\n\r\nexport interface ApiV2Point {\r\n latitude: number;\r\n longitude: number;\r\n}\r\n\r\nexport enum ApiV2AssetStatus {\r\n NotInstalled = \"Not installed\",\r\n Unknown = \"Unknown\",\r\n Stopped = \"Stopped\",\r\n StoppedIdle = \"StoppedIdle\",\r\n Driving = \"Driving\",\r\n MovingIgnitionOff = \"MovingIgnitionOff\",\r\n StoppedIdleUnsure = \"StoppedIdleUnsure\",\r\n DrivingUnsure = \"DrivingUnsure\",\r\n Private = \"Private\",\r\n Uninstalled = \"Uninstalled\",\r\n}\r\n\r\nexport enum ApiV2AssetType {\r\n Car = \"Car\",\r\n // [Description(\"HGV (artic.)\")\r\n HGVartic = \"HGVartic\",\r\n Plant = \"Plant\",\r\n Aviation = \"Aviation\",\r\n Unknown = \"Unknown\",\r\n Motorbike = \"Motorbike\",\r\n Van = \"Van\",\r\n // [Description(\"HGV (rigid)\")\r\n HGVrigid = \"HGVrigid\",\r\n Coach = \"Coach\",\r\n Marine = \"Marine\",\r\n Trailer = \"Trailer\",\r\n // [Description(\"Walking / Sports\")\r\n WalkingSports = \"WalkingSports\",\r\n}\r\n","import { useToken } from \"native-base\";\r\n\r\nconst speedBrackets: [minSpeed: number, color: string][] = [\r\n [0, \"indigo.400\"],\r\n [30, \"cyan.400\"],\r\n [40, \"green.400\"],\r\n [60, \"amber.400\"],\r\n [70, \"red.400\"],\r\n];\r\n\r\nexport interface SpeedBracket {\r\n minSpeed: number;\r\n speedString: string;\r\n color: string;\r\n label: string;\r\n}\r\n\r\nexport const speedBracketsString = speedBrackets.map((bracket) => bracket[0].toString()).join(\",\");\r\n\r\nexport function useSpeedBrackets() {\r\n const tokens = useToken(\r\n \"colors\",\r\n speedBrackets.map((i) => i[1])\r\n );\r\n\r\n return speedBrackets.map((bracket, index) => {\r\n return {\r\n minSpeed: bracket[0],\r\n speedString: bracket[0].toString(),\r\n color: tokens[index] as string,\r\n label: speedBrackets[index + 1]\r\n ? `${bracket[0]}-${speedBrackets[index + 1][0]}`\r\n : `${bracket[0]}+`,\r\n };\r\n });\r\n}\r\n\r\nexport function getSpeedBracket(\r\n speedBrackets: SpeedBracket[],\r\n speed: number | string\r\n): SpeedBracket;\r\nexport function getSpeedBracket(\r\n speedBrackets: SpeedBracket[],\r\n speed: number | string | null\r\n): SpeedBracket | null;\r\nexport function getSpeedBracket(speedBrackets: SpeedBracket[], speed: number | string | null) {\r\n if (speed === null) return null;\r\n if (typeof speed === \"string\") {\r\n return speedBrackets.find((bracket) => speed === bracket.speedString) ?? speedBrackets[0];\r\n }\r\n return (\r\n speedBrackets\r\n .slice()\r\n .reverse()\r\n .find((bracket) => speed >= bracket.minSpeed) ?? speedBrackets[0]\r\n );\r\n}\r\n\r\nexport function useSpeedBracket(speed: number | string): SpeedBracket;\r\nexport function useSpeedBracket(speed: number | string | null): SpeedBracket | null;\r\nexport function useSpeedBracket(speed: number | string | null) {\r\n const speedBrackets = useSpeedBrackets();\r\n return getSpeedBracket(speedBrackets, speed);\r\n}\r\n","import { Icon, useToken } from \"native-base\";\r\nimport { ApiV2Asset } from \"../api/locate\";\r\nimport { getSpeedBracket, SpeedBracket, useSpeedBrackets } from \"./speedBrackets\";\r\nimport { MaterialCommunityIcons } from \"@expo/vector-icons\";\r\nimport { ApiV2AssetStatus, ApiV2AssetType } from \"~/features/locate/api/common\";\r\nimport { useAtomValue } from \"jotai\";\r\nimport { disableAssetIconsAtom } from \"~/features/settings/debugging/screen\";\r\nimport { View, ViewStyle, Text } from \"react-native\";\r\n\r\nexport function getAssetIcon(\r\n speedBrackets: SpeedBracket[],\r\n asset: Pick\r\n) {\r\n const speedBracket = getSpeedBracket(speedBrackets, asset.speed);\r\n let color = \"gray.500\";\r\n let hasDirection = false;\r\n let name = \"Unknown\";\r\n let showOnLegend = true;\r\n let isUnsure = false;\r\n let isPrivate = false;\r\n switch (asset.status) {\r\n case ApiV2AssetStatus.Private:\r\n color = \"purple.500\";\r\n name = \"Private\";\r\n showOnLegend = false;\r\n isPrivate = true;\r\n break;\r\n case ApiV2AssetStatus.Stopped:\r\n color = \"black\";\r\n name = \"Stopped\";\r\n break;\r\n case ApiV2AssetStatus.StoppedIdle:\r\n color = \"red.500\";\r\n name = \"Idling\";\r\n break;\r\n case ApiV2AssetStatus.StoppedIdleUnsure:\r\n color = \"red.500\";\r\n name = \"Idling Unsure\";\r\n isUnsure = true;\r\n break;\r\n case ApiV2AssetStatus.DrivingUnsure:\r\n if (asset.type === ApiV2AssetType.Plant) {\r\n color = \"green.500\";\r\n isUnsure = true;\r\n name = \"Working Unsure\";\r\n break;\r\n }\r\n hasDirection = true;\r\n color = \"gray.400\";\r\n name = \"Driving Unsure\";\r\n break;\r\n case ApiV2AssetStatus.Driving:\r\n if (asset.type === ApiV2AssetType.Plant) {\r\n color = \"green.500\";\r\n name = \"Working\";\r\n break;\r\n }\r\n hasDirection = true;\r\n showOnLegend = false;\r\n color = speedBracket?.color ?? \"gray.500\";\r\n name = speedBracket?.label ?? \"Driving\";\r\n break;\r\n }\r\n return { color, hasDirection, isUnsure, isPrivate, showOnLegend, name };\r\n}\r\n\r\nexport function AssetIcon({\r\n asset,\r\n size = 6,\r\n label,\r\n selected,\r\n style,\r\n}: {\r\n asset: Pick;\r\n size?: number;\r\n label?: string;\r\n selected?: boolean;\r\n style?: ViewStyle;\r\n}) {\r\n const speedBrackets = useSpeedBrackets();\r\n\r\n const disableAssetIcons = useAtomValue(disableAssetIconsAtom);\r\n\r\n if (disableAssetIcons) return null;\r\n\r\n const {\r\n color: colorName,\r\n hasDirection,\r\n isUnsure,\r\n isPrivate,\r\n } = getAssetIcon(speedBrackets, asset);\r\n\r\n const borderColor = useToken(\"colors\", selected ? \"primary.500\" : \"black\");\r\n const gray300 = useToken(\"colors\", \"gray.300\");\r\n const color = useToken(\"colors\", colorName) ?? colorName;\r\n\r\n return (\r\n \r\n \r\n \r\n {isUnsure && (\r\n \r\n )}\r\n {label ? (\r\n \r\n {label}\r\n \r\n ) : hasDirection ? (\r\n \r\n ) : null}\r\n {isPrivate && (\r\n P\r\n )}\r\n \r\n \r\n \r\n );\r\n}\r\n","import { useMatch } from \"react-router\";\r\nimport dayjs, { Dayjs } from \"dayjs\";\r\nimport { useMemo } from \"react\";\r\nimport { atom, useAtom } from \"jotai\";\r\n\r\nexport interface LocateOptions {\r\n group: \"all\" | number;\r\n selectedAsset?: number;\r\n track?: {\r\n start: Dayjs;\r\n end: Dayjs;\r\n };\r\n selectedTrack?: string;\r\n\r\n setSelectedTrack(value: string | undefined): void;\r\n}\r\n\r\nconst selectedTrackAtom = atom(null);\r\n\r\nexport function useLocateGroupOption() {\r\n const mainParams = useMatch(\"/locate/:groupId/*\")?.params;\r\n return mainParams?.groupId && mainParams?.groupId !== \"all\" ? Number(mainParams.groupId) : \"all\";\r\n}\r\n\r\nexport function useLocateSelectedAssetOption() {\r\n const assetParams = useMatch(\"/locate/:groupId/asset/:id/*\")?.params;\r\n return assetParams?.id ? Number(assetParams.id) : undefined;\r\n}\r\n\r\nexport function useLocateTrackOption() {\r\n const trackParams = useMatch(\"/locate/:groupId/asset/:id/track/:start/:end\")?.params;\r\n return useMemo(() => {\r\n if (!trackParams) {\r\n return undefined;\r\n }\r\n return {\r\n start: dayjs(trackParams.start).startOf(\"day\"),\r\n end: dayjs(trackParams.end).endOf(\"day\"),\r\n };\r\n }, [trackParams?.start, trackParams?.end]);\r\n}\r\n\r\nexport function useLocateSelectedTrackOption() {\r\n const [selectedTrack, setSelectedTrack] = useAtom(selectedTrackAtom);\r\n return {\r\n selectedTrack: selectedTrack ?? undefined,\r\n setSelectedTrack(value: string | undefined) {\r\n setSelectedTrack(value ?? null);\r\n },\r\n };\r\n}\r\n\r\nexport function useLocateOptions(): LocateOptions {\r\n const { selectedTrack, setSelectedTrack } = useLocateSelectedTrackOption();\r\n const group = useLocateGroupOption();\r\n const selectedAsset = useLocateSelectedAssetOption();\r\n const track = useLocateTrackOption();\r\n\r\n return {\r\n group,\r\n selectedAsset,\r\n track,\r\n selectedTrack,\r\n setSelectedTrack,\r\n };\r\n}\r\n","import { z } from \"zod\";\r\nimport { createEndpoint } from \"~/common/api/endpoint\";\r\nimport { ApiV2AssetStatus, ApiV2AssetType, ApiV2Formatting, ApiV2Point, ApiV2Zone } from \"./common\";\r\nimport { useLocateOptions } from \"~/common/hooks/useLocateOptions\";\r\nimport { useAPIQuery } from \"~/common/api/useAPIQuery\";\r\nimport { useMemo } from \"react\";\r\n\r\nexport interface ApiV2LocateResponse {\r\n assets: ApiV2Asset[];\r\n zones: ApiV2Zone[];\r\n group: ApiV2Group;\r\n formatting: ApiV2Formatting;\r\n trackAvailable: boolean;\r\n}\r\n\r\nexport interface ApiV2Group {\r\n id: number;\r\n name: string;\r\n}\r\n\r\nexport interface ApiV2Asset {\r\n id: number;\r\n type: ApiV2AssetType;\r\n name: string;\r\n driver: string | null;\r\n status: ApiV2AssetStatus | null;\r\n ptoOn: boolean | null;\r\n zone: string | null;\r\n address: string | null;\r\n speed: number | null;\r\n heading: number | null;\r\n statusSince: string | null;\r\n comment: string;\r\n updatedAt: number;\r\n distanceToday: number;\r\n location: ApiV2Point | null;\r\n}\r\n\r\nexport const locateEndpoint = createEndpoint()\r\n .withPath(\"locate/v2\")\r\n .withMethod(\"GET\")\r\n .withParams(\r\n z.object({\r\n groupId: z.number().optional(),\r\n })\r\n )\r\n .withResponse();\r\n\r\nexport function useLocate() {\r\n // Selected Group\r\n const { group, selectedAsset } = useLocateOptions();\r\n\r\n // Data Loading\r\n const query = useAPIQuery(\r\n locateEndpoint,\r\n {\r\n groupId: group === \"all\" ? undefined : Number(group),\r\n },\r\n {\r\n refetchInterval: selectedAsset ? 15000 : 60000,\r\n keepPreviousData: true,\r\n }\r\n );\r\n const assets = useMemo(() => {\r\n const assets = query.data?.assets ?? [];\r\n // Sort assets by name\r\n return assets.slice().sort((a, b) => {\r\n if (a.name.toLowerCase() < b.name.toLowerCase()) {\r\n return -1;\r\n }\r\n if (a.name.toLowerCase() > b.name.toLowerCase()) {\r\n return 1;\r\n }\r\n return 0;\r\n });\r\n }, [query.data]);\r\n\r\n return {\r\n query,\r\n assets: assets,\r\n selectedAsset: assets.find((i) => i.id === selectedAsset),\r\n formatting: query.data?.formatting,\r\n };\r\n}\r\n","import { Box, Button, Heading, HStack, Icon, Menu, Switch, Text, VStack } from \"native-base\";\r\nimport { BlurredBox } from \"~/components/Blurred/BlurredBox\";\r\nimport React, { useMemo } from \"react\";\r\nimport { useSpeedBrackets } from \"./display/speedBrackets\";\r\nimport { AssetIcon, getAssetIcon } from \"./display/assetIcons\";\r\nimport { useLocateOptions } from \"~/common/hooks/useLocateOptions\";\r\nimport { useLocate, ApiV2Asset } from \"./api/locate\";\r\nimport { MaterialCommunityIcons } from \"@expo/vector-icons\";\r\nimport { Platform } from \"react-native\";\r\nimport { atomWithMMKV } from \"~/common/storage/atoms\";\r\nimport { useAtom } from \"jotai\";\r\nimport { ApiV2AssetStatus, ApiV2AssetType } from \"~/features/locate/api/common\";\r\n\r\nexport const mapStyleAtom = atomWithMMKV<\"standard\" | \"hybrid\" | \"terrain\">(\"mapStyle\", \"standard\");\r\nexport const mapLegendAtom = atomWithMMKV(\"mapLegend\", false);\r\n\r\nexport interface LayersMenuProps {\r\n fitToContent(): void;\r\n}\r\n\r\nexport function LayersMenu(props: LayersMenuProps) {\r\n const [, setMapStyle] = useAtom(mapStyleAtom);\r\n const [showLegend, setShowLegend] = useAtom(mapLegendAtom);\r\n return (\r\n {\r\n return (\r\n }\r\n {...triggerProps}\r\n />\r\n );\r\n }}\r\n >\r\n {\r\n setMapStyle(\"standard\");\r\n }}\r\n >\r\n Standard Map\r\n \r\n {\r\n setMapStyle(\"hybrid\");\r\n }}\r\n >\r\n Satellite Map\r\n \r\n {Platform.OS !== \"ios\" && (\r\n {\r\n setMapStyle(\"terrain\");\r\n }}\r\n >\r\n Terrain Map\r\n \r\n )}\r\n }\r\n onPress={props.fitToContent}\r\n >\r\n Fit to Content\r\n \r\n \r\n Tap to reset the map to show selected track/assets.\r\n \r\n \r\n Show Legend\r\n \r\n \r\n \r\n );\r\n}\r\n\r\nconst trackExampleAssets: Pick[] = [\r\n { type: ApiV2AssetType.Car, speed: 0, status: ApiV2AssetStatus.Stopped },\r\n { type: ApiV2AssetType.Car, speed: 0, status: ApiV2AssetStatus.StoppedIdle },\r\n];\r\n\r\nexport function Legend() {\r\n const speedBrackets = useSpeedBrackets();\r\n const { assets } = useLocate();\r\n\r\n const { track } = useLocateOptions();\r\n const dedupedAssets = useMemo(() => {\r\n return Object.values(\r\n Object.fromEntries(\r\n (track ? trackExampleAssets : assets)\r\n .filter((i) => i.status !== ApiV2AssetStatus.NotInstalled)\r\n .map((asset) => {\r\n const icon = getAssetIcon(speedBrackets, asset);\r\n return [icon.name, { asset, icon }];\r\n })\r\n )\r\n )\r\n .filter((i) => i.icon.showOnLegend)\r\n .sort((a, b) => a.icon.name.localeCompare(b.icon.name));\r\n }, [assets, track]);\r\n return (\r\n \r\n \r\n \r\n \r\n Speed (MPH)\r\n \r\n \r\n {speedBrackets.map((i) => (\r\n \r\n {track ? (\r\n \r\n ) : (\r\n \r\n )}\r\n {i.label}\r\n \r\n ))}\r\n \r\n \r\n Status\r\n \r\n \r\n {dedupedAssets.map((i) => (\r\n \r\n \r\n \r\n {i.icon.name}\r\n \r\n \r\n ))}\r\n \r\n \r\n );\r\n}\r\n\r\nexport function UnableToLoadDataBanner() {\r\n const { query } = useLocate();\r\n if (query.failureCount > 2 || query.errorUpdatedAt > query.dataUpdatedAt)\r\n return (\r\n \r\n \r\n \r\n Unable to load data\r\n Please check your network connection.\r\n \r\n \r\n \r\n );\r\n return null;\r\n}\r\n","import { ReactNode, useContext } from \"react\";\r\nimport { UNSAFE_RouteContext } from \"react-router\";\r\n\r\nexport interface PanelsProps {\r\n left: ReactNode;\r\n leftKey: string;\r\n right?: ReactNode;\r\n rightKey?: string;\r\n}\r\n\r\nexport const Panels: (props: PanelsProps) => null = () => null;\r\n\r\nexport function usePanelData(): PanelsProps | null {\r\n const context = useContext(UNSAFE_RouteContext);\r\n if (context?.outlet?.props?.children?.type === Panels) {\r\n return context?.outlet?.props?.children?.props ?? null;\r\n }\r\n return null;\r\n}\r\n","import { createEndpoint } from \"~/common/api/endpoint\";\r\nimport { z } from \"zod\";\r\nimport { ApiV2Formatting, ApiV2Point, ApiV2Zone } from \"./common\";\r\nimport dayjs from \"dayjs\";\r\nimport { useLocateOptions } from \"~/common/hooks/useLocateOptions\";\r\nimport { useAPIQuery } from \"~/common/api/useAPIQuery\";\r\nimport { useMemo } from \"react\";\r\nimport { speedBracketsString } from \"~/features/locate/display/speedBrackets\";\r\n\r\nexport enum ApiV2TrackEntryType {\r\n Driving = \"driving\",\r\n PTO = \"pto_on\",\r\n Idle = \"idle\",\r\n Stopped = \"stopped\",\r\n}\r\n\r\nexport interface ApiV2TrackSegment {\r\n speed: string;\r\n private: boolean;\r\n points: ApiV2Point[];\r\n entryId: string;\r\n}\r\n\r\nexport interface ApiV2TrackOverviewItem {\r\n name: string;\r\n duration: number;\r\n cost: number | null;\r\n distance: number | null;\r\n}\r\n\r\nexport interface ApiV2TrackEntry extends ApiV2Point {\r\n id: string;\r\n type: ApiV2TrackEntryType;\r\n number: number;\r\n duration: number;\r\n distance: number | null;\r\n location: string;\r\n from: number | null;\r\n to: number | null;\r\n}\r\n\r\nexport interface ApiV2TrackResponse {\r\n zones: ApiV2Zone[];\r\n segments: ApiV2TrackSegment[];\r\n entries: ApiV2TrackEntry[];\r\n overview: ApiV2TrackOverviewItem[];\r\n objectId: number;\r\n formatting: ApiV2Formatting;\r\n}\r\n\r\nexport const trackEndpoint = createEndpoint()\r\n .withPath(\"track/v2\")\r\n .withMethod(\"GET\")\r\n .withParams(\r\n z.object({\r\n objectId: z.number(),\r\n startTimeUtc: z.number(),\r\n finishTimeUtc: z.number(),\r\n speedBrackets: z.string(),\r\n })\r\n )\r\n .withParamsMutator((data) => {\r\n return {\r\n ...data,\r\n finishTimeUtc: Math.min(Date.now(), data.finishTimeUtc),\r\n };\r\n })\r\n .withResponse()\r\n .withResponseMutator((response, params) => ({\r\n ...response,\r\n shouldShowRefresh:\r\n dayjs(params.finishTimeUtc).format(\"YYYY-MM-DD\") === dayjs().format(\"YYYY-MM-DD\"),\r\n params,\r\n }));\r\n\r\nexport function useTrack() {\r\n const { selectedAsset, track } = useLocateOptions();\r\n const query = useAPIQuery(\r\n trackEndpoint,\r\n {\r\n objectId: selectedAsset!,\r\n // eslint-disable-next-line @typescript-eslint/no-non-null-asserted-optional-chain\r\n startTimeUtc: track?.start.valueOf()!,\r\n // eslint-disable-next-line @typescript-eslint/no-non-null-asserted-optional-chain\r\n finishTimeUtc: track?.end.valueOf()!,\r\n speedBrackets: speedBracketsString,\r\n },\r\n {\r\n refetchInterval: false,\r\n refetchOnReconnect: false,\r\n refetchOnWindowFocus: false,\r\n refetchOnMount: true,\r\n keepPreviousData: false,\r\n enabled: !!(selectedAsset && track),\r\n }\r\n );\r\n const entries = useMemo(() => {\r\n return query.data?.entries ?? [];\r\n }, [query.data]);\r\n return {\r\n query,\r\n entries,\r\n };\r\n}\r\n","import {\r\n ForwardedRef,\r\n forwardRef,\r\n RefObject,\r\n useCallback,\r\n useEffect,\r\n useLayoutEffect,\r\n} from \"react\";\r\nimport { MapViewRef } from \"~/components/Maps/Common\";\r\nimport { useTrack } from \"~/features/locate/api/track\";\r\nimport { useLocateOptions } from \"~/common/hooks/useLocateOptions\";\r\nimport { useLocate } from \"~/features/locate/api/locate\";\r\nimport { useAtom, WritableAtom } from \"jotai\";\r\n\r\nexport const MapPositionController = forwardRef(function (\r\n {\r\n mapRef,\r\n mapMovedAtom,\r\n paddingLeft,\r\n paddingRight,\r\n paddingBottom,\r\n }: {\r\n mapRef: RefObject;\r\n mapMovedAtom: WritableAtom;\r\n paddingLeft: number;\r\n paddingRight: number;\r\n paddingBottom: number;\r\n },\r\n ref: ForwardedRef<() => void>\r\n) {\r\n const [mapMoved, setMapMoved] = useAtom(mapMovedAtom);\r\n\r\n const { assets } = useLocate();\r\n\r\n const { query: trackQuery } = useTrack();\r\n\r\n // Parameters\r\n const { selectedTrack, selectedAsset } = useLocateOptions();\r\n\r\n // Camera Position\r\n const updateCameraPosition = useCallback(\r\n (moveInstantly = false) => {\r\n // Fit Track Data if on Asset Track Page\r\n if (trackQuery.data && trackQuery.data.segments.length > 0) {\r\n // Fit Track Section if selected\r\n if (selectedTrack !== undefined) {\r\n const entry = trackQuery.data.entries.find((i) => i.id === selectedTrack);\r\n // Zoom to Stop if stop selected\r\n if (entry?.number) {\r\n mapRef.current?.goToCoordinate({\r\n latitude: entry.latitude,\r\n longitude: entry.longitude,\r\n zoom: 15,\r\n altitude: 6000,\r\n animated: !moveInstantly,\r\n });\r\n return;\r\n }\r\n\r\n if (entry) {\r\n mapRef.current?.fitCoordinates({\r\n coordinates: trackQuery.data.segments\r\n .filter((i) => i.entryId === selectedTrack)\r\n .flatMap((i) => i.points)\r\n .map((i) => [i.latitude, i.longitude]),\r\n padding: {\r\n top: 20,\r\n right: 20,\r\n bottom: 20,\r\n left: 20,\r\n },\r\n animated: !moveInstantly,\r\n });\r\n return;\r\n }\r\n }\r\n\r\n mapRef.current?.fitCoordinates({\r\n coordinates: trackQuery.data.segments\r\n .flatMap((i) => i.points)\r\n .map((i) => [i.latitude, i.longitude]),\r\n padding: {\r\n top: 20,\r\n right: 20,\r\n bottom: 20,\r\n left: 20,\r\n },\r\n animated: !moveInstantly,\r\n });\r\n return;\r\n }\r\n // View Asset if on Asset Details Page\r\n if (selectedAsset !== undefined) {\r\n const asset = assets.find((i) => i.id === selectedAsset);\r\n if (asset?.location) {\r\n mapRef.current?.goToCoordinate({\r\n latitude: asset.location?.latitude ?? 0,\r\n longitude: asset.location?.longitude ?? 0,\r\n zoom: 12,\r\n altitude: 10000,\r\n animated: !moveInstantly,\r\n });\r\n return;\r\n }\r\n }\r\n // Otherwise, View all Assets\r\n mapRef.current?.fitCoordinates({\r\n coordinates: assets\r\n .filter((i) => i.location?.latitude !== undefined && i.location?.longitude !== undefined)\r\n .map((i) => [i.location!.latitude, i.location!.longitude]),\r\n padding: {\r\n top: 50,\r\n right: 100,\r\n bottom: 50,\r\n left: 50,\r\n },\r\n animated: !moveInstantly,\r\n });\r\n },\r\n [selectedAsset, selectedTrack, assets, trackQuery.data]\r\n );\r\n\r\n // Update Camera Position when assets first load\r\n useEffect(() => {\r\n updateCameraPosition(true);\r\n setMapMoved(false);\r\n }, [\r\n !!assets.length, // Assets Loaded\r\n ]);\r\n\r\n // Update Camera Position when selections changed or track changed\r\n useEffect(() => {\r\n updateCameraPosition();\r\n setMapMoved(false);\r\n }, [selectedAsset, trackQuery.dataUpdatedAt, selectedTrack]);\r\n\r\n // Update Camera Position when assets moved or track changed\r\n // only if map hasn't been moved manually\r\n useEffect(() => {\r\n if (!mapMoved) {\r\n updateCameraPosition();\r\n }\r\n }, [assets]);\r\n\r\n // Update Camera Position when padding changed\r\n // only if map hasn't been moved manually\r\n useEffect(() => {\r\n if (!mapMoved) {\r\n updateCameraPosition();\r\n }\r\n }, [paddingLeft, paddingRight, paddingBottom]);\r\n\r\n useLayoutEffect(() => {\r\n if (ref && typeof ref === \"function\") {\r\n ref(updateCameraPosition);\r\n } else if (ref) {\r\n ref.current = updateCameraPosition;\r\n }\r\n }, [updateCameraPosition]);\r\n\r\n return null;\r\n});\r\n","import React, { useEffect, useMemo, useRef, useState } from \"react\";\r\nimport { ApiV2Asset, useLocate } from \"~/features/locate/api/locate\";\r\nimport {\r\n useLocateGroupOption,\r\n useLocateSelectedAssetOption,\r\n} from \"~/common/hooks/useLocateOptions\";\r\nimport { useNavigate } from \"react-router\";\r\nimport { ApiV2Zone } from \"~/features/locate/api/common\";\r\nimport { getZoneIcon } from \"~/features/locate/display/zone\";\r\nimport { Marker } from \"~/components/Maps/MapView\";\r\nimport { Box, useToken } from \"native-base\";\r\nimport { CacheFixedImage } from \"~/components/Images/CacheFixedImage\";\r\nimport { AssetIcon } from \"~/features/locate/display/assetIcons\";\r\nimport { View, Text } from \"react-native\";\r\n\r\nfunction ZoneMarker({ zone }: { zone: ApiV2Zone }) {\r\n const icon = getZoneIcon(zone);\r\n if (!icon) return null;\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n );\r\n}\r\n\r\nfunction AssetMarker({ asset, onPress }: { asset: ApiV2Asset; onPress: () => void }) {\r\n const selectedAsset = useLocateSelectedAssetOption();\r\n const isSelected = selectedAsset === asset.id;\r\n const WIDTH = 92;\r\n const HEIGHT = 28;\r\n const ICON_SIZE = 16;\r\n const showLabels = true;\r\n const selectedLabelColor = useToken(\"colors\", \"primary.500\");\r\n return useMemo(\r\n () => (\r\n \r\n \r\n {showLabels ? (\r\n \r\n \r\n {asset.name}\r\n \r\n \r\n ) : (\r\n \r\n )}\r\n \r\n \r\n \r\n ),\r\n [asset, isSelected]\r\n );\r\n}\r\n\r\nexport function MapLocateItems() {\r\n const selectedAssetRef = useRef(undefined);\r\n const selectedAsset = useLocateSelectedAssetOption();\r\n const group = useLocateGroupOption();\r\n const { query, assets } = useLocate();\r\n const navigate = useNavigate();\r\n const [showMarkers, setShowMarkers] = useState(false);\r\n useEffect(() => {\r\n setTimeout(() => {\r\n setShowMarkers(true);\r\n });\r\n }, []);\r\n useEffect(() => {\r\n selectedAssetRef.current = selectedAsset;\r\n }, [selectedAsset]);\r\n return useMemo(\r\n () =>\r\n showMarkers ? (\r\n <>\r\n {query.data?.zones.map((zone) => (\r\n \r\n ))}\r\n {assets\r\n .filter((asset) => asset.location !== null)\r\n .map((asset) => (\r\n {\r\n navigate(`/locate/${group}/asset/${asset.id}`, {\r\n replace: selectedAssetRef.current !== undefined,\r\n });\r\n }}\r\n />\r\n ))}\r\n \r\n ) : null,\r\n [showMarkers, query.dataUpdatedAt, group]\r\n );\r\n}\r\n","import { ApiV2ZoneDisplay, ApiV2Zone } from \"~/features/locate/api/common\";\r\n\r\nexport function getZoneIcon({ display }: Pick) {\r\n switch (display) {\r\n case ApiV2ZoneDisplay.PoiBlue:\r\n return {\r\n source: require(\"~/assets/zones/blue.png\"),\r\n angle: 0,\r\n };\r\n case ApiV2ZoneDisplay.PoiGreen:\r\n return {\r\n source: require(\"~/assets/zones/green.png\"),\r\n angle: 0,\r\n };\r\n case ApiV2ZoneDisplay.PoiRed:\r\n return {\r\n source: require(\"~/assets/zones/red.png\"),\r\n angle: 0,\r\n };\r\n case ApiV2ZoneDisplay.PoiYellow:\r\n return {\r\n source: require(\"~/assets/zones/yellow.png\"),\r\n angle: 0,\r\n };\r\n }\r\n return null;\r\n}\r\n","import React, { useMemo } from \"react\";\r\nimport { ApiV2TrackEntry, ApiV2TrackSegment, useTrack } from \"~/features/locate/api/track\";\r\nimport { useLocateOptions } from \"~/common/hooks/useLocateOptions\";\r\nimport { Marker, Polyline } from \"~/components/Maps/MapView\";\r\nimport { AssetIcon } from \"~/features/locate/display/assetIcons\";\r\nimport { ApiV2AssetStatus, ApiV2AssetType } from \"~/features/locate/api/common\";\r\nimport { useSpeedBracket } from \"~/features/locate/display/speedBrackets\";\r\nimport Color from \"color\";\r\n\r\nfunction TrackEntryMarker({ entry }: { entry: ApiV2TrackEntry }) {\r\n const { selectedTrack, setSelectedTrack } = useLocateOptions();\r\n const selected = selectedTrack === entry.id;\r\n return useMemo(() => {\r\n if (!entry.latitude || !entry.longitude) {\r\n return null;\r\n }\r\n return (\r\n {\r\n setSelectedTrack(entry.id);\r\n }}\r\n >\r\n \r\n \r\n );\r\n }, [entry, selected]);\r\n}\r\n\r\nfunction TrackSegment({ segment, index }: { segment: ApiV2TrackSegment; index: number }) {\r\n const bracket = useSpeedBracket(segment.speed);\r\n const { selectedTrack, setSelectedTrack } = useLocateOptions();\r\n const selected = selectedTrack === segment.entryId;\r\n return useMemo(\r\n () => (\r\n {\r\n setSelectedTrack(segment.entryId);\r\n }}\r\n zIndex={selected ? 10 : 0}\r\n coordinates={segment.points.map((i) => [i.latitude, i.longitude])}\r\n width={selected ? 12 : 8}\r\n color={Color(bracket.color)\r\n .alpha(selected ? 0.8 : 0.5)\r\n .hexa()}\r\n />\r\n ),\r\n [selected, segment.entryId, index]\r\n );\r\n}\r\n\r\nexport function MapTrackItems() {\r\n const { query } = useTrack();\r\n return (\r\n <>\r\n {query.data?.segments.map((segment, n) => (\r\n \r\n ))}\r\n\r\n {query.data?.entries\r\n .filter((i) => i.number)\r\n .map((entry) => (\r\n \r\n ))}\r\n \r\n );\r\n}\r\n","import { Box, Button, HStack, Icon, useColorMode, VStack, Spacer } from \"native-base\";\r\nimport { MapView } from \"~/components/Maps/MapView\";\r\nimport React, { useMemo, useState, useRef } from \"react\";\r\nimport { BlurredBottomSheet } from \"~/components/Blurred/BlurredBottomSheet\";\r\nimport { useComponentSize } from \"~/common/hooks/useComponentSize\";\r\nimport { MapViewRef } from \"~/components/Maps/Common\";\r\nimport { BlurredBox } from \"~/components/Blurred/BlurredBox\";\r\nimport {\r\n SlideInLeft,\r\n SlideInRight,\r\n SlideOutLeft,\r\n SlideOutRight,\r\n useSharedValue,\r\n} from \"react-native-reanimated\";\r\nimport { useSafeAreaInsets } from \"react-native-safe-area-context\";\r\nimport { useWindowDimensions } from \"react-native\";\r\nimport { MaterialCommunityIcons } from \"@expo/vector-icons\";\r\nimport {\r\n LayersMenu,\r\n Legend,\r\n mapLegendAtom,\r\n mapStyleAtom,\r\n UnableToLoadDataBanner,\r\n} from \"./mapOverlays\";\r\nimport { usePanelData } from \"~/components/Panels/Panels\";\r\nimport { atom, Atom, useAtomValue, useSetAtom } from \"jotai\";\r\nimport { disableMapsAtom } from \"~/features/settings/debugging/screen\";\r\nimport { MapPositionController } from \"./mapPositionController\";\r\nimport { MapLocateItems } from \"~/features/locate/mapItems/locate\";\r\nimport { MapTrackItems } from \"./mapItems/track\";\r\n\r\nfunction MapFitButton({ mapMovedAtom, onPress }: { mapMovedAtom: Atom; onPress(): void }) {\r\n const mapMoved = useAtomValue(mapMovedAtom);\r\n\r\n if (mapMoved) {\r\n return (\r\n }\r\n onPress={onPress}\r\n />\r\n );\r\n }\r\n return null;\r\n}\r\n\r\nexport function Map() {\r\n const updateCameraPosition = useRef<() => void>(null);\r\n\r\n const [mapMovedAtom] = useState(() => atom(false));\r\n const setMapMoved = useSetAtom(mapMovedAtom);\r\n\r\n // Bottom Sheet\r\n const snapPoints = useMemo(() => [100, \"70%\"], []);\r\n const animatedIndex = useSharedValue(1);\r\n const [index, setIndex] = useState(0);\r\n\r\n // Map\r\n const showLegend = useAtomValue(mapLegendAtom);\r\n const mapStyle = useAtomValue(mapStyleAtom);\r\n const disableMaps = useAtomValue(disableMapsAtom);\r\n const { colorMode } = useColorMode();\r\n const mapRef = React.useRef(null);\r\n\r\n // Page Size\r\n const [pageSize, onPageLayout] = useComponentSize();\r\n const windowSize = useWindowDimensions();\r\n\r\n // Size\r\n const isDesktop = windowSize.width >= 800;\r\n const isLargeDesktop = windowSize.width >= 1200;\r\n\r\n // Panels\r\n const panels = usePanelData();\r\n const leftPanel = isLargeDesktop ? panels?.left : panels?.right ?? panels?.left;\r\n const leftPanelKey = isLargeDesktop ? panels?.leftKey : panels?.rightKey ?? panels?.leftKey;\r\n const rightPanel = isLargeDesktop ? panels?.right : null;\r\n const rightPanelKey = isLargeDesktop ? panels?.rightKey : null;\r\n\r\n // Safe Areas\r\n const safeArea = useSafeAreaInsets();\r\n\r\n // Map Padding\r\n const bottomSheetHeight = useMemo(() => {\r\n const height = pageSize.height;\r\n return [100, 0.7 * height][index];\r\n }, [pageSize.height, index]);\r\n const paddingLeft = isDesktop && leftPanel ? 408 + safeArea.left : 0;\r\n const paddingRight = isDesktop && rightPanel ? 408 + safeArea.right : 0;\r\n const paddingBottom = isDesktop ? 0 : bottomSheetHeight;\r\n\r\n return (\r\n \r\n \r\n {!disableMaps && (\r\n {\r\n updateCameraPosition.current?.();\r\n }}\r\n onMapMove={() => {\r\n setMapMoved(true);\r\n }}\r\n ref={mapRef}\r\n >\r\n \r\n\r\n \r\n \r\n )}\r\n \r\n \r\n \r\n \r\n {\r\n setMapMoved(false);\r\n updateCameraPosition.current?.();\r\n }}\r\n />\r\n {\r\n setMapMoved(false);\r\n updateCameraPosition.current?.();\r\n }}\r\n />\r\n \r\n {showLegend && (\r\n \r\n \r\n \r\n )}\r\n \r\n \r\n \r\n\r\n {isDesktop ? (\r\n \r\n {!!leftPanel && (\r\n \r\n {leftPanel}\r\n \r\n )}\r\n {!!rightPanel && (\r\n \r\n {rightPanel}\r\n \r\n )}\r\n \r\n ) : (\r\n \r\n {\r\n setIndex(i);\r\n }}\r\n snapPoints={snapPoints}\r\n >\r\n {leftPanel}\r\n \r\n \r\n )}\r\n \r\n );\r\n}\r\n","import { useCallback, useState } from \"react\";\r\nimport { LayoutChangeEvent } from \"react-native\";\r\n\r\nexport function useComponentSize(): [\r\n { width: number; height: number },\r\n (event: LayoutChangeEvent) => void\r\n] {\r\n const [size, setSize] = useState<{\r\n width: number;\r\n height: number;\r\n }>({ width: 0, height: 0 });\r\n\r\n const onLayout = useCallback((event) => {\r\n const { width, height } = event.nativeEvent.layout;\r\n setSize({ width, height });\r\n }, []);\r\n\r\n return [size, onLayout];\r\n}\r\n","import { IPressableProps, Pressable } from \"native-base\";\r\n\r\nimport { useNavigate } from \"react-router\";\r\nexport { BrowserRouter as Router, Routes as Routes, Navigate as Navigate } from \"react-router-dom\";\r\n\r\ntype LinkProps = (\r\n | {\r\n to: string;\r\n back?: undefined;\r\n }\r\n | {\r\n back: boolean;\r\n to?: undefined;\r\n }\r\n) &\r\n IPressableProps;\r\nexport function Link({ to, back, ...props }: LinkProps) {\r\n const navigate = useNavigate();\r\n return (\r\n {\r\n ev.preventDefault();\r\n props.onPress?.(ev);\r\n back ? navigate(-1) : navigate(to || \"\");\r\n }}\r\n />\r\n );\r\n}\r\n","import {\r\n Box,\r\n Button,\r\n Heading,\r\n HStack,\r\n ScrollView,\r\n Select,\r\n Spacer,\r\n Stack,\r\n Text,\r\n VStack,\r\n} from \"native-base\";\r\nimport React, { useReducer, useState } from \"react\";\r\nimport { useNavigate } from \"react-router\";\r\nimport { loginAtom, themeAtom } from \"~/common/storage/atoms\";\r\nimport { useAtom } from \"jotai\";\r\nimport { Platform } from \"react-native\";\r\nimport { nativeApplicationVersion, nativeBuildVersion } from \"expo-application\";\r\nimport * as Updates from \"expo-updates\";\r\nimport { useToast } from \"~/common/hooks/useToast\";\r\n\r\nexport function SettingsScreen() {\r\n const [, incrementCounter] = useReducer<(i: number, n: number | null) => number>(\r\n (i, n) => n ?? i + 1,\r\n 0\r\n );\r\n const navigate = useNavigate();\r\n const [colorMode, setColorMode] = useAtom(themeAtom);\r\n const [login, setLogin] = useAtom(loginAtom);\r\n const [updateAvailable, setUpdateAvailable] = useState(false);\r\n const toast = useToast();\r\n return (\r\n \r\n \r\n \r\n Settings\r\n \r\n\r\n \r\n Client Code\r\n {login?.clientCode ?? \"Unknown\"}\r\n \r\n Username\r\n \r\n {login?.username ?? \"Unknown\"}\r\n {\r\n setLogin(undefined);\r\n }}\r\n >\r\n Logout\r\n \r\n \r\n\r\n \r\n \r\n \r\n Theme\r\n \r\n setColorMode(value)}\r\n >\r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n\r\n \r\n \r\n \r\n About\r\n \r\n \r\n {Platform.select({\r\n ios: \"iOS \",\r\n android: \"Android \",\r\n web: \"Web \",\r\n default: \"\",\r\n })}\r\n App Version:{\" \"}\r\n {nativeApplicationVersion ??\r\n (Updates.manifest as { version?: string })?.version ??\r\n \"Unknown\"}{\" \"}\r\n ({Platform.OS === \"web\" ? \"Web\" : nativeBuildVersion ?? \"Unknown\"})\r\n \r\n \r\n OTA Channel {Updates?.releaseChannel ?? \"N/A\"} -{\" \"}\r\n incrementCounter(null)}>\r\n Update {Updates?.updateId ?? \"N/A\"}\r\n \r\n \r\n \r\n\r\n {Platform.OS === \"web\" ? null : updateAvailable ? (\r\n {\r\n try {\r\n await Updates.fetchUpdateAsync();\r\n } catch (e) {\r\n toast.show({\r\n title: \"Failed to Download Update\",\r\n description: \"Update failed to download. Please try again later.\",\r\n status: \"danger\",\r\n });\r\n return;\r\n }\r\n try {\r\n await Updates.reloadAsync();\r\n } catch (e) {\r\n toast.show({\r\n title: \"Failed to Install Update\",\r\n description: \"Update failed to install. Please try again later.\",\r\n status: \"danger\",\r\n });\r\n return;\r\n }\r\n }}\r\n >\r\n Install Update\r\n \r\n ) : (\r\n {\r\n try {\r\n const result = await Updates.checkForUpdateAsync();\r\n\r\n toast.show({\r\n title: result?.isAvailable ? \"Update Available\" : \"No Update Available\",\r\n description: result?.manifest?.createdAt\r\n ? `Release Date: ${new Date(result?.manifest?.createdAt).toLocaleString()}`\r\n : undefined,\r\n status: result?.isAvailable ? \"success\" : \"info\",\r\n });\r\n setUpdateAvailable(!!result?.isAvailable);\r\n } catch (e) {\r\n toast.show({\r\n title: \"Failed to Check\",\r\n description: \"Checking for Updates Failed\",\r\n status: \"danger\",\r\n });\r\n }\r\n }}\r\n >\r\n Check for Updates\r\n \r\n )}\r\n\r\n {\r\n navigate(\"/settings/changelogs\");\r\n }}\r\n >\r\n View Previous Changelogs\r\n \r\n \r\n\r\n {\r\n navigate(\"/settings/debugging\");\r\n }}\r\n >\r\n Debugging Tools\r\n \r\n \r\n \r\n );\r\n}\r\n","import React, { ForwardedRef, forwardRef, ReactNode } from \"react\";\r\nimport {\r\n useBottomSheetInternal,\r\n BottomSheetFlatList,\r\n BottomSheetScrollView,\r\n ANIMATION_SOURCE,\r\n} from \"@gorhom/bottom-sheet\";\r\nimport { FlatList, FlatListProps, ScrollView, useWindowDimensions } from \"react-native\";\r\nimport { Box, Pressable } from \"native-base\";\r\n\r\nconst SafeAreaAwareBottomSheetCompatibleScrollView = forwardRef(function (\r\n {\r\n children,\r\n enableSafeArea,\r\n }: {\r\n children: ReactNode;\r\n enableSafeArea: boolean;\r\n },\r\n ref: ForwardedRef\r\n) {\r\n const isInBottomSheet = !!useBottomSheetInternal(true);\r\n const ScrollViewComponent = isInBottomSheet ? BottomSheetScrollView : ScrollView;\r\n return (\r\n \r\n \r\n {children}\r\n \r\n \r\n );\r\n});\r\n\r\nexport function PanelScrollView({\r\n header,\r\n ...props\r\n}: {\r\n children: ReactNode;\r\n} & { header: ReactNode }) {\r\n const scrollRef = React.useRef(null);\r\n const windowSize = useWindowDimensions();\r\n const isDesktop = windowSize.width >= 800;\r\n const bottomSheet = useBottomSheetInternal(true);\r\n return (\r\n \r\n {\r\n scrollRef.current?.scrollTo({ animated: true, y: 0 });\r\n if (bottomSheet?.animatedIndex.value === 0)\r\n bottomSheet?.animateToPosition(\r\n bottomSheet?.animatedSnapPoints.value[1],\r\n ANIMATION_SOURCE.USER\r\n );\r\n }}\r\n >\r\n {header}\r\n \r\n \r\n \r\n );\r\n}\r\n\r\nconst SafeAreaAwareBottomSheetCompatibleFlatList = forwardRef(function (\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n props: FlatListProps & { enableSafeArea: boolean },\r\n ref: ForwardedRef\r\n) {\r\n const isInBottomSheet = !!useBottomSheetInternal(true);\r\n const FlatListComponent = isInBottomSheet ? BottomSheetFlatList : FlatList;\r\n return (\r\n \r\n {props.ListFooterComponent}\r\n \r\n }\r\n />\r\n );\r\n});\r\n\r\nexport function PanelFlatList({ header, ...props }: FlatListProps & { header: ReactNode }) {\r\n const scrollRef = React.useRef(null);\r\n const windowSize = useWindowDimensions();\r\n const isDesktop = windowSize.width >= 800;\r\n const bottomSheet = useBottomSheetInternal(true);\r\n return (\r\n \r\n {\r\n scrollRef.current?.scrollToOffset({ animated: true, offset: 0 });\r\n if (bottomSheet?.animatedIndex.value === 0)\r\n bottomSheet?.animateToPosition(\r\n bottomSheet?.animatedSnapPoints.value[1],\r\n ANIMATION_SOURCE.USER\r\n );\r\n }}\r\n >\r\n {header}\r\n \r\n \r\n \r\n );\r\n}\r\n","import { useRef, useState } from \"react\";\r\n\r\nexport function useSearch(timeout: number): [string, string, (x: string) => void] {\r\n const [value, setValue] = useState(\"\");\r\n const [search, setSearch] = useState(\"\");\r\n const timeoutRef = useRef(null);\r\n\r\n function onValue(val: string) {\r\n if (timeoutRef.current) clearTimeout(timeoutRef.current);\r\n setValue(val);\r\n timeoutRef.current = setTimeout(() => {\r\n return setSearch(val);\r\n }, timeout);\r\n }\r\n return [value, search, onValue];\r\n}\r\n","import { Heading, HStack, Icon, IconButton, Text, VStack } from \"native-base\";\r\nimport { MaterialCommunityIcons } from \"@expo/vector-icons\";\r\nimport React from \"react\";\r\nimport { useNavigate } from \"react-router\";\r\n\r\nexport interface PanelHeaderProps {\r\n back?: boolean;\r\n upperTitle?: string;\r\n title: string;\r\n titleRight?: string;\r\n subtitle?: string;\r\n button?: React.ReactNode;\r\n}\r\n\r\nexport function PanelHeader(props: PanelHeaderProps) {\r\n const navigate = useNavigate();\r\n return (\r\n \r\n {props.back && (\r\n navigate(-1)}\r\n icon={}\r\n />\r\n )}\r\n \r\n {!!props.upperTitle && (\r\n \r\n {props.upperTitle}\r\n \r\n )}\r\n \r\n \r\n {props.title.trimEnd()} \r\n \r\n {!!props.titleRight && (\r\n \r\n {props.titleRight}\r\n \r\n )}\r\n \r\n {!!props.subtitle && {props.subtitle}}\r\n \r\n {props.button}\r\n \r\n );\r\n}\r\n","import { IInputProps, Input } from \"native-base\";\r\nimport { useCallback } from \"react\";\r\nimport { ANIMATION_SOURCE, useBottomSheetInternal } from \"@gorhom/bottom-sheet\";\r\n\r\nexport function BottomSheetInput({ onFocus, ...rest }: IInputProps) {\r\n const bottomSheet = useBottomSheetInternal(true);\r\n\r\n const handleOnFocus = useCallback(\r\n (args) => {\r\n bottomSheet?.animateToPosition(\r\n bottomSheet?.animatedSnapPoints.value[1],\r\n ANIMATION_SOURCE.USER\r\n );\r\n if (onFocus) {\r\n onFocus(args);\r\n }\r\n },\r\n [onFocus, bottomSheet]\r\n );\r\n\r\n return ;\r\n}\r\n","import { MaterialCommunityIcons } from \"@expo/vector-icons\";\r\nimport { Button, Heading, Icon, useColorMode, useToken, VStack } from \"native-base\";\r\nimport React, { useEffect, useMemo, useRef, useState } from \"react\";\r\nimport { useNavigate } from \"react-router\";\r\nimport { PanelFlatList } from \"~/components/BottomSheet/BottomSheetCompatibleViews\";\r\nimport { ApiV2Asset, useLocate } from \"../api/locate\";\r\nimport { useLocateOptions } from \"~/common/hooks/useLocateOptions\";\r\nimport { useSearch } from \"~/common/hooks/useSearch\";\r\nimport Fuse from \"fuse.js\";\r\nimport dayjs from \"dayjs\";\r\nimport { PanelHeader } from \"~/components/BottomSheet/PanelHeader\";\r\nimport { ANIMATION_SOURCE, useBottomSheetInternal } from \"@gorhom/bottom-sheet\";\r\nimport { BottomSheetInput } from \"~/components/BottomSheet/BottomSheetInput\";\r\nimport { AssetIcon } from \"../display/assetIcons\";\r\nimport { CacheFixedImage } from \"~/components/Images/CacheFixedImage\";\r\nimport { ApiV2AssetStatus } from \"~/features/locate/api/common\";\r\nimport { useAtomValue } from \"jotai\";\r\nimport { disableAssetListAtom } from \"~/features/settings/debugging/screen\";\r\nimport { View, Pressable, Text } from \"react-native\";\r\nimport Color from \"color\";\r\n\r\nexport function AssetEntry({ asset }: { asset: ApiV2Asset }) {\r\n const { group, selectedAsset } = useLocateOptions();\r\n const selectedAssetRef = useRef(undefined);\r\n useEffect(() => {\r\n selectedAssetRef.current = selectedAsset;\r\n }, [selectedAsset]);\r\n const navigate = useNavigate();\r\n const { colorMode } = useColorMode();\r\n const textColor = useToken(\"colors\", colorMode === \"dark\" ? \"dark.900\" : \"light.900\");\r\n const selectBgColor = useToken(\"colors\", colorMode === \"dark\" ? \"primary.100\" : \"primary.500\");\r\n return useMemo(\r\n () => (\r\n \r\n navigate(`/locate/${group}/asset/${asset.id}`, { replace: !!selectedAssetRef.current })\r\n }\r\n >\r\n \r\n \r\n \r\n \r\n \r\n {asset.name}\r\n {asset.driver ? (\r\n \r\n {\" \"}\r\n - {asset.driver}\r\n \r\n ) : null}\r\n \r\n {!!(asset.address || asset.zone) && (\r\n \r\n {asset.zone || asset.address}\r\n \r\n )}\r\n \r\n \r\n \r\n ),\r\n [asset, selectedAsset === asset.id, textColor, selectBgColor]\r\n );\r\n}\r\n\r\nfunction renderAssetEntry({ item }: { item: ApiV2Asset }) {\r\n return ;\r\n}\r\n\r\nexport function ListPanel() {\r\n const { query, assets } = useLocate();\r\n const { group } = useLocateOptions();\r\n const navigate = useNavigate();\r\n\r\n const { colorMode } = useColorMode();\r\n\r\n const [value, search, onValue] = useSearch(300);\r\n\r\n const filteredAssets = useMemo(() => {\r\n if (!search) {\r\n return assets;\r\n }\r\n const fuse = new Fuse(assets, {\r\n keys: [\"name\"],\r\n threshold: 0.3,\r\n });\r\n return fuse.search(search).map((i) => i.item);\r\n }, [assets, search]);\r\n\r\n const [seeUninstalled, setSeeUninstalled] = useState(false);\r\n\r\n const bottomSheet = useBottomSheetInternal(true);\r\n\r\n const disableAssetList = useAtomValue(disableAssetListAtom);\r\n\r\n return (\r\n \r\n i.status !== ApiV2AssetStatus.NotInstalled &&\r\n i.status !== ApiV2AssetStatus.Uninstalled\r\n ).length\r\n })`}\r\n subtitle={`Updated ${\r\n query.dataUpdatedAt ? `at ${dayjs(query.dataUpdatedAt).format(\"HH:mm\")}` : \"Never\"\r\n }`}\r\n button={\r\n group !== \"all\" ? (\r\n navigate(`/locate/all`, { replace: true })}\r\n startIcon={}\r\n >\r\n Show All\r\n \r\n ) : (\r\n {\r\n navigate(`/locate/${group}/groups`);\r\n bottomSheet?.animateToPosition(\r\n bottomSheet?.animatedSnapPoints.value[1],\r\n ANIMATION_SOURCE.USER\r\n );\r\n }}\r\n startIcon={}\r\n >\r\n Group\r\n \r\n )\r\n }\r\n />\r\n }\r\n style={{ flex: 1 }}\r\n ListHeaderComponent={\r\n \r\n onValue(val)}\r\n size=\"md\"\r\n m=\"2\"\r\n InputLeftElement={\r\n } size=\"md\" ml=\"2\" />\r\n }\r\n placeholder=\"Search\"\r\n />\r\n \r\n }\r\n keyExtractor={(item) => item.id.toString()}\r\n data={\r\n disableAssetList\r\n ? []\r\n : filteredAssets.filter(\r\n (i) =>\r\n i.status !== ApiV2AssetStatus.NotInstalled &&\r\n i.status !== ApiV2AssetStatus.Uninstalled\r\n )\r\n }\r\n getItemLayout={(data, index) => ({ length: 60, offset: 60 * index, index })}\r\n renderItem={renderAssetEntry}\r\n ListFooterComponent={\r\n \r\n \r\n }\r\n variant=\"ghost\"\r\n colorScheme=\"gray\"\r\n textAlign=\"left\"\r\n onPress={() => setSeeUninstalled(!seeUninstalled)}\r\n >\r\n {`${seeUninstalled ? \"Hide\" : \"Show\"} Uninstalled Assets`}\r\n \r\n {seeUninstalled && (\r\n <>\r\n \r\n Uninstalled Assets (\r\n {\r\n filteredAssets.filter(\r\n (i) =>\r\n i.status === ApiV2AssetStatus.NotInstalled ||\r\n i.status === ApiV2AssetStatus.Uninstalled\r\n ).length\r\n }\r\n )\r\n \r\n {assets\r\n .filter(\r\n (i) =>\r\n i.status === ApiV2AssetStatus.NotInstalled ||\r\n i.status === ApiV2AssetStatus.Uninstalled\r\n )\r\n .map((asset) => (\r\n \r\n {asset.name}\r\n \r\n ))}\r\n \r\n )}\r\n \r\n \r\n }\r\n />\r\n );\r\n}\r\n","import { createEndpoint } from \"~/common/api/endpoint\";\r\nimport { useAPIQuery } from \"~/common/api/useAPIQuery\";\r\nimport { useMemo } from \"react\";\r\n\r\n// TODO: Group V2\r\n\r\nexport interface GroupData {\r\n groups: Group[];\r\n}\r\n\r\nexport interface Group {\r\n id: number;\r\n name: string;\r\n}\r\n\r\nexport const groupEndpoint = createEndpoint()\r\n .withPath(\"group\")\r\n .withMethod(\"GET\")\r\n .withResponse();\r\n\r\nexport function useGroups() {\r\n const query = useAPIQuery(groupEndpoint, undefined, {\r\n refetchInterval: 5 * 60000,\r\n });\r\n\r\n const groups = useMemo(() => {\r\n return (\r\n query.data?.groups.slice().sort((a, b) => {\r\n if (a.name < b.name) {\r\n return -1;\r\n }\r\n if (a.name > b.name) {\r\n return 1;\r\n }\r\n return 0;\r\n }) ?? []\r\n );\r\n }, [query.data]);\r\n return {\r\n query,\r\n groups,\r\n };\r\n}\r\n","import { VStack, Heading, HStack, Pressable, Icon, Input } from \"native-base\";\r\nimport React from \"react\";\r\nimport { useMemo } from \"react\";\r\nimport { useNavigate } from \"react-router\";\r\nimport { MaterialCommunityIcons } from \"@expo/vector-icons\";\r\nimport { PanelScrollView } from \"~/components/BottomSheet/BottomSheetCompatibleViews\";\r\nimport { useSearch } from \"~/common/hooks/useSearch\";\r\nimport Fuse from \"fuse.js\";\r\nimport { useGroups } from \"../api/group\";\r\nimport { PanelHeader } from \"~/components/BottomSheet/PanelHeader\";\r\n\r\nexport function GroupsPanel() {\r\n const { groups } = useGroups();\r\n const navigate = useNavigate();\r\n\r\n const [value, search, onValue] = useSearch(300);\r\n\r\n const filteredGroups = useMemo(() => {\r\n if (!search) {\r\n return groups;\r\n }\r\n const fuse = new Fuse(groups, {\r\n keys: [\"name\"],\r\n threshold: 0.3,\r\n });\r\n return fuse.search(search).map((i) => i.item);\r\n }, [groups, search]);\r\n\r\n return (\r\n }>\r\n \r\n onValue(val)}\r\n size=\"md\"\r\n m=\"2\"\r\n InputLeftElement={\r\n } size=\"md\" ml=\"2\" />\r\n }\r\n placeholder=\"Search\"\r\n />\r\n {filteredGroups.map((group) => {\r\n return (\r\n navigate(`/locate/${group.id}`)}>\r\n \r\n {group.name}\r\n \r\n \r\n );\r\n })}\r\n \r\n \r\n );\r\n}\r\n","import { ImageRequireSource } from \"react-native\";\r\nimport { ApiV2Asset } from \"../api/locate\";\r\nimport { ApiV2AssetStatus, ApiV2AssetType } from \"~/features/locate/api/common\";\r\n\r\nexport function getDirection(angle: number) {\r\n const uniformAngle = ((angle % 360) + 382.5) % 360;\r\n const direction = Math.floor(uniformAngle / 45);\r\n return [\"N\", \"NE\", \"E\", \"SE\", \"S\", \"SW\", \"W\", \"NW\"][direction];\r\n}\r\n\r\nexport interface AssetIcon {\r\n source: ImageRequireSource;\r\n angle: number;\r\n}\r\n\r\nexport function getStatusText(asset: Pick) {\r\n switch (asset.status) {\r\n case ApiV2AssetStatus.Driving:\r\n if (asset.type === ApiV2AssetType.Plant) return \"Working\";\r\n return \"Driving\";\r\n case ApiV2AssetStatus.DrivingUnsure:\r\n if (asset.type === ApiV2AssetType.Plant)\r\n return \"Working (precise location uncertain - poor network coverage)\";\r\n return \"Driving (precise location uncertain - poor network coverage)\";\r\n case ApiV2AssetStatus.MovingIgnitionOff:\r\n return \"Moving with ignition off\";\r\n case ApiV2AssetStatus.Stopped:\r\n return \"Stopped\";\r\n case ApiV2AssetStatus.StoppedIdle:\r\n return \"Idle\";\r\n case ApiV2AssetStatus.StoppedIdleUnsure:\r\n return \"Idle (uncertain - poor network coverage)\";\r\n case ApiV2AssetStatus.Private:\r\n return \"Private\";\r\n case ApiV2AssetStatus.NotInstalled:\r\n case ApiV2AssetStatus.Uninstalled:\r\n return \"Uninstalled\";\r\n default:\r\n return \"Unknown\";\r\n }\r\n}\r\n","import { createContext, useContext } from \"react\";\r\nimport { useDatepicker } from \"@datepicker-react/hooks\";\r\n\r\nexport const DatePickerContext = createContext>(\r\n {} as ReturnType\r\n);\r\nexport function useDatePickerContext() {\r\n return useContext(DatePickerContext);\r\n}\r\n","import { useDatePickerContext } from \"~/components/DatePicker/DatePickerContext\";\r\nimport { Box, Pressable, Text } from \"native-base\";\r\nimport { useDay } from \"@datepicker-react/hooks\";\r\n\r\nexport interface DayProps {\r\n dayLabel: string;\r\n date: Date;\r\n}\r\n\r\nexport function Day({ dayLabel, date }: DayProps) {\r\n const {\r\n focusedDate,\r\n isDateFocused,\r\n isDateSelected,\r\n isDateHovered,\r\n isDateBlocked,\r\n isFirstOrLastSelectedDate,\r\n isStartDate,\r\n isEndDate,\r\n onDateSelect,\r\n onDateFocus,\r\n onDateHover,\r\n } = useDatePickerContext();\r\n\r\n const { isSelected, isSelectedStartOrEnd, disabledDate, onClick } = useDay({\r\n date,\r\n focusedDate,\r\n isDateFocused,\r\n isDateSelected,\r\n isDateHovered,\r\n isDateBlocked,\r\n isFirstOrLastSelectedDate,\r\n onDateFocus,\r\n onDateSelect,\r\n onDateHover,\r\n });\r\n\r\n return (\r\n \r\n {isSelected && (\r\n \r\n \r\n \r\n )}\r\n \r\n \r\n {dayLabel}\r\n \r\n \r\n \r\n );\r\n}\r\n","import { FirstDayOfWeek, useMonth } from \"@datepicker-react/hooks\";\r\nimport { VStack, HStack, Text, Box, IconButton, Icon, Heading } from \"native-base\";\r\nimport { Day } from \"./Day\";\r\nimport { MaterialCommunityIcons } from \"@expo/vector-icons\";\r\n\r\nexport interface MonthProps {\r\n month: number;\r\n year: number;\r\n firstDayOfWeek: FirstDayOfWeek;\r\n prev?: () => void;\r\n next?: () => void;\r\n}\r\n\r\nexport function Month({ year, month, firstDayOfWeek, prev, next }: MonthProps) {\r\n const { days, weekdayLabels, monthLabel } = useMonth({\r\n year,\r\n month,\r\n firstDayOfWeek,\r\n });\r\n return (\r\n \r\n \r\n {!!prev && (\r\n }\r\n onPress={prev}\r\n />\r\n )}\r\n \r\n {monthLabel}\r\n \r\n {!!next && (\r\n }\r\n onPress={next}\r\n />\r\n )}\r\n \r\n \r\n {weekdayLabels.map((label) => (\r\n \r\n \r\n {label}\r\n \r\n \r\n ))}\r\n \r\n \r\n {days.map((day, n) =>\r\n typeof day === \"number\" ? (\r\n \r\n ) : (\r\n \r\n )\r\n )}\r\n {new Array(6).fill(0).map((_, n) => (\r\n \r\n ))}\r\n \r\n \r\n );\r\n}\r\n","import { END_DATE, START_DATE, useDatepicker } from \"@datepicker-react/hooks\";\r\nimport { useState } from \"react\";\r\nimport { Month } from \"./Month\";\r\nimport { DatePickerContext } from \"~/components/DatePicker/DatePickerContext\";\r\nimport { HStack } from \"native-base\";\r\n\r\nexport interface DateRangePickerProps {\r\n startDate: Date | null;\r\n endDate: Date | null;\r\n onDatesChange: (startDate: Date | null, endDate: Date | null) => void;\r\n numberOfMonths?: number;\r\n}\r\n\r\nexport function DateRangePicker(props: DateRangePickerProps) {\r\n const [focusedInput, setFocusedInput] = useState(START_DATE);\r\n const datePicker = useDatepicker({\r\n startDate: props.startDate,\r\n endDate: props.endDate,\r\n focusedInput: focusedInput,\r\n maxBookingDate: new Date(),\r\n onDatesChange: (data) => {\r\n props.onDatesChange(data.startDate, data.endDate);\r\n setFocusedInput(data.focusedInput ?? START_DATE);\r\n },\r\n numberOfMonths: props.numberOfMonths ?? 1,\r\n });\r\n return (\r\n \r\n \r\n {datePicker.activeMonths.map((month, n, a) => (\r\n \r\n ))}\r\n \r\n \r\n );\r\n}\r\n","import { Button, Modal } from \"native-base\";\r\nimport { useState } from \"react\";\r\nimport { DateRangePicker } from \"~/components/DatePicker/DateRangePicker\";\r\nimport { useWindowDimensions } from \"react-native\";\r\nimport { useToast } from \"~/common/hooks/useToast\";\r\n\r\nexport interface DateRangePickerModalProps {\r\n initialStartDate?: Date;\r\n initialEndDate?: Date;\r\n open: boolean;\r\n onClose: () => void;\r\n onSelect: (startDate: Date, endDate: Date) => void;\r\n}\r\n\r\nexport function DateRangePickerModal(props: DateRangePickerModalProps) {\r\n const [startDate, setStartDate] = useState(props.initialStartDate ?? new Date());\r\n const [endDate, setEndDate] = useState(props.initialEndDate ?? new Date());\r\n const toast = useToast();\r\n const windowSize = useWindowDimensions();\r\n const isLarge = windowSize.width > 800;\r\n return (\r\n props.onClose()} size={isLarge ? \"lg\" : \"md\"}>\r\n \r\n \r\n Select Range\r\n \r\n {\r\n setStartDate(startDate);\r\n setEndDate(endDate);\r\n }}\r\n numberOfMonths={isLarge ? 2 : 1}\r\n />\r\n \r\n \r\n \r\n {\r\n props.onClose();\r\n }}\r\n >\r\n Cancel\r\n \r\n {\r\n if (!startDate) {\r\n toast.show({\r\n title: \"Please select a start and end date\",\r\n status: \"danger\",\r\n });\r\n return;\r\n }\r\n if (!endDate) {\r\n props.onSelect(startDate, startDate);\r\n return;\r\n }\r\n props.onSelect(startDate, endDate);\r\n }}\r\n >\r\n Select\r\n \r\n \r\n \r\n \r\n \r\n );\r\n}\r\n","import { Button, Popover, VStack } from \"native-base\";\r\nimport React, { ReactElement, useState } from \"react\";\r\nimport { useNavigate } from \"react-router\";\r\nimport { useLocateOptions } from \"~/common/hooks/useLocateOptions\";\r\nimport dayjs from \"dayjs\";\r\nimport { DateRangePickerModal } from \"~/components/DatePicker/DateRangePickerModal\";\r\nimport { ANIMATION_SOURCE, useBottomSheetInternal } from \"@gorhom/bottom-sheet\";\r\n\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\nexport function TrackDatePickerPopover(props: { trigger: (triggerProps: any) => ReactElement }) {\r\n const [open, setOpen] = useState(false);\r\n const [modalOpen, setModalOpen] = useState(false);\r\n const navigate = useNavigate();\r\n const { group, selectedAsset, track } = useLocateOptions();\r\n const bottomSheet = useBottomSheetInternal(true);\r\n\r\n return (\r\n <>\r\n setOpen(false)}\r\n onOpen={() => setOpen(true)}\r\n trigger={props.trigger}\r\n >\r\n \r\n \r\n \r\n \r\n {\r\n setOpen(false);\r\n if (!track)\r\n bottomSheet?.animateToPosition(\r\n bottomSheet?.animatedSnapPoints.value[1],\r\n ANIMATION_SOURCE.USER\r\n );\r\n navigate(\r\n `/locate/${group}/asset/${selectedAsset}/track/${dayjs()\r\n .startOf(\"day\")\r\n .format(\"YYYY-MM-DD\")}/${dayjs().endOf(\"day\").format(\"YYYY-MM-DD\")}`,\r\n { replace: !!track }\r\n );\r\n }}\r\n >\r\n Today\r\n \r\n {\r\n setOpen(false);\r\n if (!track)\r\n bottomSheet?.animateToPosition(\r\n bottomSheet?.animatedSnapPoints.value[1],\r\n ANIMATION_SOURCE.USER\r\n );\r\n navigate(\r\n `/locate/${group}/asset/${selectedAsset}/track/${dayjs()\r\n .add(-1, \"day\")\r\n .startOf(\"day\")\r\n .format(\"YYYY-MM-DD\")}/${dayjs()\r\n .add(-1, \"day\")\r\n .endOf(\"day\")\r\n .format(\"YYYY-MM-DD\")}`,\r\n { replace: !!track }\r\n );\r\n }}\r\n >\r\n Yesterday\r\n \r\n {\r\n setModalOpen(true);\r\n setOpen(false);\r\n }}\r\n >\r\n Custom\r\n \r\n \r\n \r\n \r\n \r\n {\r\n setModalOpen(false);\r\n }}\r\n onSelect={(start, end) => {\r\n setModalOpen(false);\r\n if (!track)\r\n bottomSheet?.animateToPosition(\r\n bottomSheet?.animatedSnapPoints.value[1],\r\n ANIMATION_SOURCE.USER\r\n );\r\n navigate(\r\n `/locate/${group}/asset/${selectedAsset}/track/${dayjs(start)\r\n .startOf(\"day\")\r\n .format(\"YYYY-MM-DD\")}/${dayjs(end).endOf(\"day\").format(\"YYYY-MM-DD\")}`,\r\n { replace: !!track }\r\n );\r\n }}\r\n />\r\n \r\n );\r\n}\r\n","import { MaterialCommunityIcons } from \"@expo/vector-icons\";\r\nimport { VStack, Heading, Text, HStack, Button, Icon } from \"native-base\";\r\nimport React, { useMemo, useRef } from \"react\";\r\nimport dayjs from \"dayjs\";\r\nimport { useLocate } from \"~/features/locate/api/locate\";\r\nimport { useLocateOptions } from \"~/common/hooks/useLocateOptions\";\r\nimport { PanelScrollView } from \"~/components/BottomSheet/BottomSheetCompatibleViews\";\r\nimport { getDirection, getStatusText } from \"~/features/locate/display/asset\";\r\n\r\nimport { showLocation } from \"react-native-map-link\";\r\nimport { Platform } from \"react-native\";\r\nimport { ApiV2Asset } from \"~/features/locate/api/locate\";\r\nimport { TrackDatePickerPopover } from \"~/components/DatePicker/TrackDatePickerPopover\";\r\nimport { PanelHeader } from \"~/components/BottomSheet/PanelHeader\";\r\nimport { AssetIcon } from \"~/features/locate/display/assetIcons\";\r\nimport { ApiV2AssetStatus } from \"~/features/locate/api/common\";\r\n\r\nexport function DetailsPanel() {\r\n const { selectedAsset } = useLocateOptions();\r\n const { query, selectedAsset: actualAsset, formatting } = useLocate();\r\n\r\n const previousAsset = useRef(null);\r\n const asset = useMemo(() => {\r\n if (!selectedAsset) {\r\n return actualAsset ?? previousAsset.current;\r\n }\r\n previousAsset.current = actualAsset ?? null;\r\n return actualAsset;\r\n }, [actualAsset, selectedAsset]);\r\n\r\n if (!asset) {\r\n return (\r\n }>\r\n \r\n Please check the URL and try again.\r\n \r\n \r\n );\r\n }\r\n\r\n return (\r\n <>\r\n {\r\n return (\r\n \r\n }\r\n {...triggerProps}\r\n >\r\n Track\r\n \r\n );\r\n }}\r\n />\r\n ) : undefined\r\n }\r\n />\r\n }\r\n >\r\n \r\n \r\n \r\n \r\n \r\n {getStatusText(asset)}\r\n {asset.status === ApiV2AssetStatus.Driving && (\r\n {` (${asset.speed} ${formatting?.speedUnit} ${\r\n asset.heading ? getDirection(asset.heading) : \"\"\r\n })`}\r\n )}\r\n \r\n Since {asset.statusSince ?? \"unknown\"}\r\n \r\n \r\n\r\n {!!asset.driver && (\r\n \r\n \r\n \r\n {asset.driver}\r\n \r\n \r\n )}\r\n\r\n \r\n \r\n {asset.status === ApiV2AssetStatus.Private ? (\r\n \r\n Location is Private\r\n \r\n ) : (\r\n \r\n {!!asset.zone && {asset.zone}}\r\n {asset.address}\r\n \r\n )}\r\n {Platform.OS !== \"web\" && (\r\n }\r\n onPress={() => {\r\n showLocation({\r\n latitude: asset.location!.latitude,\r\n longitude: asset.location!.longitude,\r\n dialogTitle: `Open Directions`,\r\n naverCallerName: \"com.trackitnow.era\",\r\n directionsMode: \"car\",\r\n });\r\n }}\r\n />\r\n )}\r\n \r\n\r\n \r\n \r\n \r\n \r\n {asset.distanceToday} {formatting?.distanceUnit}\r\n \r\n Travelled Today\r\n \r\n \r\n\r\n {!!asset.comment && (\r\n \r\n \r\n \r\n Comment\r\n {asset.comment}\r\n \r\n \r\n )}\r\n \r\n \r\n \r\n );\r\n}\r\n","import { MaterialCommunityIcons } from \"@expo/vector-icons\";\r\nimport { VStack, Heading, Text, HStack, Button, Icon, Box, Pressable, Divider } from \"native-base\";\r\nimport React, { useMemo, useRef } from \"react\";\r\nimport dayjs from \"dayjs\";\r\nimport {\r\n PanelFlatList,\r\n PanelScrollView,\r\n} from \"~/components/BottomSheet/BottomSheetCompatibleViews\";\r\nimport { useLocate } from \"~/features/locate/api/locate\";\r\nimport { useTrack } from \"~/features/locate/api/track\";\r\nimport { useLocateOptions } from \"~/common/hooks/useLocateOptions\";\r\nimport { ApiV2Asset } from \"~/features/locate/api/locate\";\r\nimport { ApiV2TrackEntry } from \"~/features/locate/api/track\";\r\nimport { TrackDatePickerPopover } from \"~/components/DatePicker/TrackDatePickerPopover\";\r\nimport { PanelHeader } from \"~/components/BottomSheet/PanelHeader\";\r\nimport { BlurredBox } from \"~/components/Blurred/BlurredBox\";\r\nimport { AssetIcon } from \"../display/assetIcons\";\r\nimport { ApiV2AssetStatus, ApiV2AssetType } from \"~/features/locate/api/common\";\r\n\r\nfunction formatDuration(milliseconds: number) {\r\n const hours = Math.floor(milliseconds / (1000 * 60 ** 2));\r\n const minutes = Math.floor((milliseconds / (1000 * 60)) % 60);\r\n return hours > 0 ? `${hours}h ${minutes}m` : `${minutes} min${minutes === 1 ? \"\" : \"s\"}`;\r\n}\r\n\r\nfunction Entry({\r\n entry,\r\n onPress,\r\n index,\r\n total,\r\n distanceUnit,\r\n}: {\r\n entry: ApiV2TrackEntry;\r\n onPress: () => void;\r\n index: number;\r\n total: number;\r\n distanceUnit: string;\r\n}) {\r\n const { track: { start } = {}, selectedTrack } = useLocateOptions();\r\n const duration = formatDuration(entry.duration);\r\n const hasStartAndEnd = entry.from && entry.to;\r\n const isMultiDay =\r\n dayjs(entry.from ?? start)?.format(\"DD-MM-YYYY\") !== dayjs(entry.to)?.format(\"DD-MM-YYYY\");\r\n return (\r\n \r\n \r\n \r\n {index !== total - 1 && (\r\n \r\n )}\r\n \r\n \r\n \r\n {entry.location ? (\r\n <>\r\n {hasStartAndEnd ? (\r\n \r\n \r\n {dayjs(entry.from).format(\"ddd DD/MM | LT\")}\r\n {\" \"}\r\n to{\" \"}\r\n \r\n {dayjs(entry.to).format(isMultiDay ? \"ddd DD/MM | LT\" : \"LT\")}\r\n \r\n \r\n ) : (\r\n \r\n \r\n {start?.format(\"ddd DD/MM | LT\") ?? \"???\"}\r\n {\" \"}\r\n (already here) to{\" \"}\r\n \r\n {dayjs(entry.to).format(isMultiDay ? \"ddd DD/MM | LT\" : \"LT\")}\r\n \r\n \r\n )}\r\n {entry.location}\r\n \r\n ) : (\r\n <>\r\n \r\n Travelled {entry.distance} {distanceUnit}\r\n \r\n \r\n )}\r\n \r\n {hasStartAndEnd && (\r\n \r\n {duration}\r\n \r\n )}\r\n \r\n \r\n );\r\n}\r\n\r\nexport function TrackPanel() {\r\n const { selectedAsset: actualAsset } = useLocate();\r\n const { query, entries } = useTrack();\r\n const trackData = query.data;\r\n const { track, selectedAsset, setSelectedTrack, selectedTrack } = useLocateOptions();\r\n\r\n const previousAsset = useRef(null);\r\n const asset = useMemo(() => {\r\n if (!selectedAsset) {\r\n return actualAsset ?? previousAsset.current;\r\n }\r\n previousAsset.current = actualAsset ?? null;\r\n return actualAsset;\r\n }, [actualAsset, selectedAsset]);\r\n\r\n if (!asset) {\r\n return (\r\n }>\r\n \r\n Please check the URL and try again.\r\n \r\n \r\n );\r\n }\r\n\r\n const start = dayjs(track?.start).format(\"ddd DD/MM/YY\");\r\n const end = dayjs(track?.end).format(\"ddd DD/MM/YY\");\r\n\r\n const header = (\r\n (\r\n }\r\n >\r\n Dates\r\n \r\n )}\r\n />\r\n }\r\n />\r\n );\r\n\r\n if (query.error && \"type\" in query.error && query.error.type === \"forbidden\") {\r\n return (\r\n \r\n \r\n \r\n \r\n Missing Permission\r\n {query.error.message}\r\n \r\n \r\n \r\n \r\n );\r\n }\r\n\r\n if (query.error && query.errorUpdatedAt > query.dataUpdatedAt) {\r\n return (\r\n \r\n \r\n \r\n \r\n Unable to load data\r\n Please check your network connection.\r\n {\r\n query.refetch();\r\n }}\r\n >\r\n Reload\r\n \r\n \r\n \r\n \r\n \r\n );\r\n }\r\n\r\n if (!trackData || !track) {\r\n return (\r\n \r\n \r\n Loading...\r\n \r\n \r\n );\r\n }\r\n\r\n const isEmpty = !trackData.entries.some((i) => i.number);\r\n\r\n return (\r\n <>\r\n i.id}\r\n ListHeaderComponent={\r\n \r\n {trackData.shouldShowRefresh && (\r\n \r\n Data loaded up to {dayjs(trackData.params.finishTimeUtc).format(\"LT\")}\r\n {\r\n query.refetch();\r\n }}\r\n >\r\n Reload\r\n \r\n \r\n )}\r\n {trackData.shouldShowRefresh && (\r\n \r\n )}\r\n {isEmpty ? (\r\n No data available for this period.\r\n ) : (\r\n <>\r\n \r\n \r\n \r\n Category\r\n \r\n {trackData.overview.map((i) => (\r\n \r\n {i.name}\r\n \r\n ))}\r\n \r\n \r\n \r\n Duration\r\n \r\n {trackData.overview.map((i) => (\r\n \r\n {formatDuration(i.duration)}\r\n \r\n ))}\r\n \r\n \r\n \r\n Cost\r\n \r\n {trackData.overview.map((i) => (\r\n \r\n {i.cost ? `£${i.cost.toFixed(2)}` : \"\"}\r\n \r\n ))}\r\n \r\n \r\n \r\n Distance\r\n \r\n {trackData.overview.map((i) => (\r\n \r\n {i.distance ? `${i.distance} ${trackData.formatting.distanceUnit}` : \"\"}\r\n \r\n ))}\r\n \r\n \r\n \r\n )}\r\n \r\n }\r\n data={isEmpty ? [] : entries ?? []}\r\n renderItem={({ item, index }) => (\r\n {\r\n if (selectedTrack === item.id) {\r\n setSelectedTrack(undefined);\r\n } else {\r\n setSelectedTrack(item.id);\r\n }\r\n }}\r\n entry={item}\r\n index={index}\r\n total={(trackData.entries.entries ?? []).length}\r\n distanceUnit={trackData.formatting.distanceUnit}\r\n />\r\n )}\r\n />\r\n \r\n );\r\n}\r\n","import { ImageSourcePropType } from \"react-native\";\r\n\r\nexport interface ChangelogInterface {\r\n version: number;\r\n title: string;\r\n description: string;\r\n icon?: string;\r\n iconColor?: string;\r\n image?: ImageSourcePropType;\r\n imageRounded?: boolean;\r\n}\r\n\r\n// Insert new changelogs at the top of the list, with an updated version number\r\n// You can put multiple changelog entries for the same version number\r\nexport const allChangelogs: ChangelogInterface[] = [\r\n {\r\n version: 1.00_00,\r\n icon: \"rocket\",\r\n iconColor: \"green.500\",\r\n title: \"Initial Release\",\r\n description: \"This is the first release of the new app.\",\r\n },\r\n];\r\n","import { useEffect } from \"react\";\r\nimport { changelogVersionAtom } from \"~/common/storage/atoms\";\r\nimport { useAtom } from \"jotai\";\r\nimport { Button, Heading, HStack, Icon, Modal, Text, VStack } from \"native-base\";\r\nimport { MaterialCommunityIcons } from \"@expo/vector-icons\";\r\nimport { CacheFixedImage } from \"~/components/Images/CacheFixedImage\";\r\nimport { ChangelogInterface, allChangelogs } from \"~/changelogs\";\r\n\r\nexport function Changelog({ changelog }: { changelog: ChangelogInterface }) {\r\n return (\r\n \r\n {changelog.icon && (\r\n \r\n )}\r\n {changelog.image && (\r\n \r\n )}\r\n \r\n {changelog.title}\r\n {changelog.description}\r\n \r\n \r\n );\r\n}\r\n\r\nexport function ChangelogsModal() {\r\n const latestChangelogVersion = allChangelogs[0].version;\r\n\r\n const [changelogVersion, setChangelogVersion] = useAtom(changelogVersionAtom);\r\n useEffect(() => {\r\n if (changelogVersion === undefined || changelogVersion === null) {\r\n setChangelogVersion(latestChangelogVersion);\r\n }\r\n if ((changelogVersion ?? latestChangelogVersion) > latestChangelogVersion) {\r\n setChangelogVersion(latestChangelogVersion);\r\n }\r\n }, [changelogVersion]);\r\n\r\n const changelogOpen = (changelogVersion ?? latestChangelogVersion) < latestChangelogVersion;\r\n\r\n // Only show the last 10 unseen changelogs\r\n const changelogs = allChangelogs\r\n .filter((changelog) => changelog.version > (changelogVersion ?? latestChangelogVersion))\r\n .slice(-10);\r\n\r\n return (\r\n 0}\r\n onClose={() => setChangelogVersion(latestChangelogVersion)}\r\n >\r\n \r\n \r\n What's New\r\n \r\n \r\n {changelogs.map((changelog) => (\r\n \r\n ))}\r\n \r\n \r\n \r\n {\r\n setChangelogVersion(latestChangelogVersion);\r\n }}\r\n >\r\n Dismiss\r\n \r\n \r\n \r\n \r\n );\r\n}\r\n","import { MaterialCommunityIcons } from \"@expo/vector-icons\";\r\nimport { Box, Icon, Text } from \"native-base\";\r\nimport { useWindowDimensions } from \"react-native\";\r\nimport { Outlet, useLocation } from \"react-router\";\r\nimport { Link } from \"~/features/navigation/router\";\r\nimport React from \"react\";\r\nimport { ChangelogsModal } from \"~/features/changelogs/modal\";\r\n\r\nexport type Tab = {\r\n label: string;\r\n icon: keyof typeof MaterialCommunityIcons.glyphMap;\r\n prefix: string;\r\n path: string;\r\n};\r\nconst tabs: Tab[] = [\r\n {\r\n label: \"Home\",\r\n icon: \"home\",\r\n prefix: \"/locate\",\r\n path: \"/locate/all\",\r\n },\r\n // {\r\n // label: \"Messages\",\r\n // icon: \"bell\",\r\n // prefix: \"/messages\",\r\n // path: \"/messages\",\r\n // },\r\n {\r\n label: \"Settings\",\r\n icon: \"cog\",\r\n prefix: \"/settings\",\r\n path: \"/settings\",\r\n },\r\n];\r\n\r\nexport function TabbedScreen() {\r\n const location = useLocation();\r\n const windowSize = useWindowDimensions();\r\n const isDesktop = windowSize.width >= 800;\r\n\r\n if (isDesktop) {\r\n return (\r\n \r\n \r\n \r\n {tabs.map((i) => (\r\n \r\n \r\n \r\n {i.label}\r\n \r\n \r\n ))}\r\n \r\n \r\n \r\n \r\n \r\n );\r\n }\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n {tabs.map((i) => (\r\n \r\n \r\n \r\n {i.label}\r\n \r\n \r\n ))}\r\n \r\n \r\n \r\n \r\n );\r\n}\r\n","import { Heading, HStack, Icon, IconButton, ScrollView, VStack } from \"native-base\";\r\nimport React from \"react\";\r\nimport { useNavigate } from \"react-router\";\r\nimport { allChangelogs } from \"~/changelogs\";\r\nimport { Changelog } from \"~/features/changelogs/modal\";\r\nimport { MaterialCommunityIcons } from \"@expo/vector-icons\";\r\n\r\nexport function ChangelogHistoryScreen() {\r\n const navigate = useNavigate();\r\n return (\r\n \r\n \r\n \r\n navigate(-1)}\r\n icon={}\r\n />\r\n Changelog\r\n \r\n\r\n {allChangelogs.slice().map((changelog) => (\r\n \r\n ))}\r\n \r\n \r\n );\r\n}\r\n","import { useAtomValue } from \"jotai\";\r\nimport { Route, useNavigate } from \"react-router\";\r\nimport { loginAtom } from \"~/common/storage/atoms\";\r\nimport { LoginScreen } from \"~/features/auth/login/screen\";\r\nimport { ForgotPasswordScreen } from \"~/features/auth/forgotPassword/screen\";\r\nimport { Map } from \"~/features/locate/map\";\r\nimport { Navigate, Routes } from \"~/features/navigation/router\";\r\nimport { SettingsScreen } from \"~/features/settings/screen\";\r\nimport { DebuggingScreen } from \"~/features/settings/debugging/screen\";\r\nimport { ListPanel } from \"~/features/locate/panels/listPanel\";\r\nimport { GroupsPanel } from \"~/features/locate/panels/groupsPanel\";\r\nimport { DetailsPanel } from \"~/features/locate/panels/detailsPanel\";\r\nimport { TrackPanel } from \"~/features/locate/panels/trackPanel\";\r\nimport { useEffect } from \"react\";\r\nimport { TabbedScreen } from \"~/features/navigation/tabbedScreen\";\r\nimport { BackHandler } from \"react-native\";\r\nimport { ChangelogHistoryScreen } from \"~/features/changelogs/screen\";\r\nimport { Panels } from \"~/components/Panels/Panels\";\r\n\r\nexport function Navigation() {\r\n const navigate = useNavigate();\r\n useEffect(() => {\r\n const backAction = () => {\r\n navigate(-1);\r\n return true;\r\n };\r\n\r\n const backHandler = BackHandler.addEventListener(\"hardwareBackPress\", backAction);\r\n\r\n return () => backHandler.remove();\r\n }, []);\r\n\r\n const login = useAtomValue(loginAtom);\r\n if (!login) {\r\n return (\r\n \r\n } />\r\n } />\r\n } />\r\n \r\n );\r\n }\r\n return (\r\n \r\n }>\r\n } />\r\n } />\r\n } />\r\n } />\r\n }>\r\n } />}\r\n />\r\n } />}\r\n />\r\n }\r\n rightKey=\"AssetDetails\"\r\n right={}\r\n />\r\n }\r\n />\r\n }\r\n rightKey=\"AssetDetails\"\r\n right={}\r\n />\r\n }\r\n />\r\n \r\n \r\n \r\n );\r\n}\r\n","import { StatusBar } from \"expo-status-bar\";\r\nimport { CheckIcon, extendTheme, NativeBaseProvider, useColorMode, useToken } from \"native-base\";\r\nimport { useEffect, useMemo } from \"react\";\r\nimport { SafeAreaProvider } from \"react-native-safe-area-context\";\r\nimport { Navigation } from \"~/features/navigation/navigation\";\r\n\r\nimport { QueryClient, QueryClientProvider } from \"react-query\";\r\n\r\nimport { persistQueryClient } from \"react-query/persistQueryClient-experimental\";\r\nimport { createAsyncStoragePersistor } from \"react-query/createAsyncStoragePersistor-experimental\";\r\nimport { themeAtom } from \"./common/storage/atoms\";\r\nimport { Router } from \"./features/navigation/router\";\r\nimport { GestureHandlerRootView } from \"react-native-gesture-handler\";\r\nimport { LogBox, Platform } from \"react-native\";\r\nimport { useAtom, useAtomValue } from \"jotai\";\r\nimport { mmkv } from \"~/common/storage/mmkv\";\r\n\r\nimport localizedFormat from \"dayjs/plugin/localizedFormat\";\r\nimport dayjs from \"dayjs\";\r\nimport \"dayjs/locale/en-gb\";\r\nimport { useSystemColorScheme } from \"~/common/hooks/useSystemColorScheme\";\r\nimport { primaryColorAtom } from \"~/features/settings/debugging/screen\";\r\n\r\nLogBox.ignoreLogs([\"PropType will be removed from React Native\"]);\r\n\r\ndayjs.extend(localizedFormat);\r\ndayjs.locale(\"en-GB\");\r\n\r\nconst queryClient = new QueryClient({\r\n defaultOptions: {\r\n queries: {\r\n cacheTime: 1000 * 60 * 60 * 24, // 24 hours\r\n },\r\n },\r\n});\r\n\r\nconst asyncStoragePersistor = createAsyncStoragePersistor({\r\n storage: {\r\n getItem: async (key) => {\r\n const value = mmkv.getString(key);\r\n return value ?? null;\r\n },\r\n setItem: async (key, value) => {\r\n mmkv.set(key, value);\r\n },\r\n removeItem: async (key) => {\r\n mmkv.delete(key);\r\n },\r\n },\r\n});\r\n\r\npersistQueryClient({\r\n queryClient,\r\n persistor: asyncStoragePersistor,\r\n});\r\n\r\nfunction ThemeHandler() {\r\n const systemColorScheme = useSystemColorScheme();\r\n const { setColorMode } = useColorMode();\r\n const [themeSelection] = useAtom(themeAtom);\r\n const colorMode = useMemo(() => {\r\n return (themeSelection === \"system\" ? systemColorScheme : themeSelection) === \"dark\"\r\n ? \"dark\"\r\n : \"light\";\r\n }, [systemColorScheme, themeSelection]);\r\n useEffect(() => {\r\n setColorMode(colorMode);\r\n }, [colorMode]);\r\n const green = useToken(\"colors\", \"primary.500\");\r\n return (\r\n <>\r\n {Platform.OS === \"web\" && (\r\n \r\n )}\r\n \r\n \r\n );\r\n}\r\n\r\nexport default function App() {\r\n const primaryColorName = useAtomValue(primaryColorAtom);\r\n const theme = useMemo(() => {\r\n const defaultTheme = extendTheme({});\r\n const primaryColor =\r\n defaultTheme.colors[primaryColorName as keyof typeof defaultTheme.colors] ??\r\n defaultTheme.colors.green;\r\n return extendTheme({\r\n colors: {\r\n primary: primaryColor,\r\n },\r\n components: {\r\n Input: {\r\n defaultProps: {\r\n bg: \"light.100\",\r\n _dark: {\r\n bg: \"dark.100\",\r\n },\r\n },\r\n },\r\n Select: {\r\n defaultProps: {\r\n variant: \"filled\",\r\n bg: \"light.200\",\r\n _input: {\r\n _dark: {\r\n bg: \"dark.100\",\r\n },\r\n },\r\n _actionSheetContent: {\r\n _dark: { bg: \"dark.200\" },\r\n bg: \"primary.300\",\r\n },\r\n _item: {\r\n borderRadius: 4,\r\n bg: \"primary.300\",\r\n _dark: {\r\n bg: \"dark.200\",\r\n _hover: {\r\n bg: \"dark.200\",\r\n },\r\n _focus: {\r\n bg: \"dark.200\",\r\n },\r\n _pressed: {\r\n bg: \"dark.200\",\r\n },\r\n },\r\n _hover: {\r\n bg: \"primary.200\",\r\n },\r\n _focus: {\r\n bg: \"primary.200\",\r\n },\r\n _pressed: {\r\n bg: \"primary.200\",\r\n },\r\n },\r\n _selectedItem: {\r\n bg: \"primary.500\",\r\n _dark: {\r\n bg: \"primary.500\",\r\n },\r\n endIcon: (\r\n \r\n ),\r\n },\r\n },\r\n },\r\n },\r\n });\r\n }, [primaryColorName]);\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n}\r\n","import { Appearance, ColorSchemeName } from \"react-native\";\r\nimport { useCallback, useEffect, useRef, useState } from \"react\";\r\n\r\n// Source: https://github.com/expo/expo/issues/10815#issuecomment-995830659\r\nexport function useSystemColorScheme(delay = 500): NonNullable {\r\n const [colorScheme, setColorScheme] = useState(Appearance.getColorScheme());\r\n const timeout = useRef(null);\r\n\r\n const resetCurrentTimeout = useCallback(() => {\r\n if (timeout?.current) {\r\n clearTimeout(timeout.current);\r\n }\r\n }, [timeout]);\r\n\r\n const onColorSchemeChange = useCallback(\r\n (preferences: Appearance.AppearancePreferences) => {\r\n resetCurrentTimeout();\r\n\r\n timeout.current = setTimeout(() => {\r\n setColorScheme(preferences.colorScheme);\r\n }, delay);\r\n },\r\n [delay, resetCurrentTimeout]\r\n );\r\n\r\n useEffect(() => {\r\n const AppearanceChange = Appearance.addChangeListener(onColorSchemeChange);\r\n return () => {\r\n resetCurrentTimeout();\r\n if (AppearanceChange) AppearanceChange.remove();\r\n };\r\n }, [onColorSchemeChange, resetCurrentTimeout]);\r\n\r\n return colorScheme as NonNullable;\r\n}\r\n","import { registerRootComponent } from \"expo\";\r\n\r\nimport App from \"./App\";\r\n\r\n// registerRootComponent calls AppRegistry.registerComponent('main', () => App);\r\n// It also ensures that whether you load the app in Expo Go or in a native build,\r\n// the environment is set up appropriately\r\nregisterRootComponent(App);\r\n","import { atomWithStorage, createJSONStorage } from \"jotai/utils\";\r\nimport { mmkv } from \"./mmkv\";\r\n\r\nconst createMMKVStorage = () =>\r\n createJSONStorage(() => ({\r\n getItem: (key: string) => mmkv.getString(key) ?? null,\r\n setItem: (key: string, newValue: string | undefined) => {\r\n if (newValue === undefined) {\r\n mmkv.delete(key);\r\n } else {\r\n mmkv.set(key, newValue);\r\n }\r\n },\r\n removeItem: (key: string) => mmkv.delete(key),\r\n }));\r\n\r\nexport function atomWithMMKV(key: string, initialValue?: T) {\r\n return atomWithStorage(`@tin-app/${key}`, initialValue!, createMMKVStorage());\r\n}\r\n\r\nexport const loginAtom = atomWithMMKV<\r\n | {\r\n username: string;\r\n token: string;\r\n clientCode?: string;\r\n }\r\n | undefined\r\n>(\"login\");\r\n\r\nexport const themeAtom = atomWithMMKV(\"theme\", \"system\");\r\n\r\nexport const changelogVersionAtom = atomWithMMKV(\"changelogVersion\");\r\n"],"sourceRoot":""}