\n \n {loa.route_before} {loa.cop ?? \"LoR\"} {loa.route_after}\n | \n \n {loa.adep && loa.adep.length > 0 && (\n <>↗ {loa.adep.join(\", \")}>\n )}{\" \"}\n {loa.ades && loa.ades.length > 0 && (\n <>↘ {loa.ades.join(\", \")}>\n )}\n | \n \n {loa.transfer_type === \"D\" && <>↓>}\n {loa.transfer_type === \"C\" && <>↑>}\n\n {loa.sfl && <>{loa.qnh ? `${loa.sfl}00ft` : `FL${loa.sfl}`}->}\n \n {loa.level === null\n ? \"indiv. coord.\"\n : loa.qnh\n ? `${loa.level}00ft`\n : `FL${loa.level}`}\n \n {loa.qnh && <>, QNH {loa.qnh}>}\n | \n \n {[\n loa.level_at &&\n (loa.level_at[0] > 0\n ? `${loa.level_at[0]}nm after `\n : loa.level_at[0] < 0\n ? `${Math.abs(loa.level_at[0])}nm prior `\n : \"\") + `${loa.level_at[1]} at level`,\n loa.releases && `released ${loa.releases}`,\n /* TODO: filter by detected ATIS runway*/\n loa.runway &&\n loa.runway.length > 0 &&\n `Runways ${loa.runway.join(\", \")}`,\n /* TODO: filter by active areas*/\n loa.areas &&\n loa.areas.length > 0 &&\n `Active Areas ${loa.areas.join(\", \")}`,\n loa.rfl && `RFL: FL${loa.rfl}`,\n loa.remarks,\n ]\n .filter((val) => val)\n .join(\"; \")}\n | \n \n \n | \n \n \n | \n
\n )\n}\n","import { PayloadAction, createSlice } from \"@reduxjs/toolkit\"\nimport { api } from \"services/api\"\nimport { localStorageOrDefault, setLocalStorage } from \"../app/utils\"\nimport { SectorData } from \"types/vatglasses\"\nimport { ActivePositionState } from \"types/activePositions\"\n\nconst queryParams = new URLSearchParams(window.location.search)\n\nconst activePositionSlice = createSlice({\n name: \"activePositions\",\n initialState: {\n positions: {},\n selectedPosition: localStorageOrDefault(\n \"activePositions.selectedPosition\",\n null,\n ),\n sectorsSyncedToOnline:\n localStorageOrDefault(\"activePositions.sectorsSyncedToOnline\", true) &&\n !queryParams.has(\"pos\"),\n positionSyncedToOnline: localStorageOrDefault(\n \"activePositions.positionSyncedToOnline\",\n true,\n ),\n manualActive: queryParams\n .getAll(\"pos\")\n .reduce((acc, pos) => ({ ...acc, [pos]: true }), {}),\n onlineActive: {},\n controlType: queryParams.has(\"pos\")\n ? \"presets\"\n : localStorageOrDefault(\"activePositions.controlType\", \"manual\"),\n } as ActivePositionState,\n reducers: {\n setPosition(\n state,\n {\n payload: { id, active },\n }: PayloadAction<{ id: string; active: boolean }>,\n ) {\n state.manualActive[id] = active\n },\n setPositionGroup(\n state,\n {\n payload: { positions, active },\n }: PayloadAction<{ positions: string[]; active: boolean }>,\n ) {\n state.manualActive = {\n ...state.manualActive,\n ...positions.reduce((acc, pos) => ({ ...acc, [pos]: active }), {}),\n }\n },\n setSectorsSyncedToOnline(\n state,\n { payload: synced }: PayloadAction