{"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","useEffect","mapRef","fitCoordinates","window","google","bounds","maps","LatLngBounds","coordinates","coordinate","extend","LatLng","padding","top","right","bottom","left","current","fitBounds","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","setTimeout","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","mapMoved","setMapMoved","paddingLeft","paddingRight","paddingBottom","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","updateMapMoved","update","Map","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.006f8774.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 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 mapInstanceRef.current?.fitBounds(bounds, padding);\r\n },\r\n goToCoordinate(options: GoToCoordinateOptions) {\r\n mapInstanceRef.current?.setZoom(options.zoom ?? 15);\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 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\n\r\nexport const MapPositionController = forwardRef(function (\r\n {\r\n mapRef,\r\n mapMoved,\r\n setMapMoved,\r\n paddingLeft,\r\n paddingRight,\r\n paddingBottom,\r\n }: {\r\n mapRef: RefObject;\r\n mapMoved: RefObject;\r\n setMapMoved: (value: boolean) => void;\r\n paddingLeft: number;\r\n paddingRight: number;\r\n paddingBottom: number;\r\n },\r\n ref: ForwardedRef<() => void>\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.current) {\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.current) {\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, {\r\n useMemo,\r\n useState,\r\n useRef,\r\n useReducer,\r\n MutableRefObject,\r\n useLayoutEffect,\r\n} 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 { useAtomValue } 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({\r\n mapMoved,\r\n updateMapMoved,\r\n onPress,\r\n}: {\r\n mapMoved: MutableRefObject;\r\n updateMapMoved: MutableRefObject<(() => void) | null>;\r\n onPress(): void;\r\n}) {\r\n const [, update] = useReducer((x) => x + 1, 0);\r\n\r\n useLayoutEffect(() => {\r\n updateMapMoved.current = () => update();\r\n }, [update]);\r\n\r\n if (mapMoved.current) {\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 const updateMapMoved = useRef<(() => void) | null>(null);\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 const mapMoved = useRef(false);\r\n\r\n function setMapMoved(value: boolean) {\r\n if (mapMoved.current !== value) {\r\n mapMoved.current = value;\r\n updateMapMoved.current?.();\r\n }\r\n }\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":""}