Skip to content

Commit

Permalink
feat: derive satellites and orbiters with canister sync data
Browse files Browse the repository at this point in the history
  • Loading branch information
peterpeterparker committed Jan 23, 2025
1 parent 12f9261 commit 84f4898
Show file tree
Hide file tree
Showing 5 changed files with 112 additions and 19 deletions.
62 changes: 43 additions & 19 deletions src/frontend/src/lib/components/segments/SegmentsTable.svelte
Original file line number Diff line number Diff line change
@@ -1,18 +1,21 @@
<script lang="ts">
import type { Principal } from '@dfinity/principal';
import { isEmptyString, nonNullish } from '@dfinity/utils';
import { debounce, isEmptyString, isNullish, nonNullish } from '@dfinity/utils';
import { onMount, type Snippet, untrack } from 'svelte';
import type { Orbiter, Satellite } from '$declarations/mission_control/mission_control.did';
import Segment from '$lib/components/segments/Segment.svelte';
import Checkbox from '$lib/components/ui/Checkbox.svelte';
import { orbiterStore } from '$lib/derived/orbiter.derived';
import { sortedSatellites } from '$lib/derived/satellites.derived';
import { loadOrbiters } from '$lib/services/orbiters.services';
import { loadSatellites } from '$lib/services/satellites.services';
import { i18n } from '$lib/stores/i18n.store';
import type { MissionControlId } from '$lib/types/mission-control';
import { orbiterName } from '$lib/utils/orbiter.utils';
import { satelliteName } from '$lib/utils/satellite.utils';
import { satellitesWithSyncData } from '$lib/derived/satellites-merged.derived';

Check failure on line 14 in src/frontend/src/lib/components/segments/SegmentsTable.svelte

View workflow job for this annotation

GitHub Actions / lint

`$lib/derived/satellites-merged.derived` import should occur before import of `$lib/services/orbiters.services`
import { orbiterWithSyncData } from '$lib/derived/orbiter-merged.derived';

Check failure on line 15 in src/frontend/src/lib/components/segments/SegmentsTable.svelte

View workflow job for this annotation

GitHub Actions / lint

`$lib/derived/orbiter-merged.derived` import should occur before import of `$lib/services/orbiters.services`
import { canisterSyncDataUncertifiedLoaded } from '$lib/derived/canisters.derived';

Check failure on line 16 in src/frontend/src/lib/components/segments/SegmentsTable.svelte

View workflow job for this annotation

GitHub Actions / lint

`$lib/derived/canisters.derived` import should occur before import of `$lib/services/orbiters.services`
import { satellitesLoaded } from '$lib/derived/satellites.derived';

Check failure on line 17 in src/frontend/src/lib/components/segments/SegmentsTable.svelte

View workflow job for this annotation

GitHub Actions / lint

`$lib/derived/satellites.derived` import should occur before import of `$lib/services/orbiters.services`
import { orbiterLoaded } from '$lib/derived/orbiter.derived';

Check failure on line 18 in src/frontend/src/lib/components/segments/SegmentsTable.svelte

View workflow job for this annotation

GitHub Actions / lint

`$lib/derived/orbiter.derived` import should occur before import of `$lib/services/orbiters.services`
interface Props {
missionControlId: MissionControlId;
Expand All @@ -36,8 +39,35 @@
reloadSegments = true
}: Props = $props();
let satellites: [Principal, Satellite][] = $state([]);
let orbiters: [Principal, Orbiter][] = $state([]);
let satellites: [Principal, Satellite][] | undefined = $derived(
$canisterSyncDataUncertifiedLoaded && $satellitesLoaded
? $satellitesWithSyncData.map(({ segment: { satellite_id, ...rest } }) => [
satellite_id,
{ satellite_id, ...rest }
])
: undefined
);
let orbiters: [Principal, Orbiter][] | undefined = $derived(
$canisterSyncDataUncertifiedLoaded && $orbiterLoaded
? (nonNullish($orbiterWithSyncData) ? [$orbiterWithSyncData] : []).map(
({ segment: { orbiter_id, ...rest } }) => [orbiter_id, { orbiter_id, ...rest }]
)
: undefined
);
$effect(() => {
console.log(satellites, orbiters);

Check failure on line 59 in src/frontend/src/lib/components/segments/SegmentsTable.svelte

View workflow job for this annotation

GitHub Actions / lint

Unexpected console statement
if (isNullish(satellites)) {
return;
}
if (isNullish(orbiters)) {
return;
}
debounceToggleAll();
});
const loadSegments = async () => {
const [{ result: resultSatellites }, { result: resultOrbiters }] = await Promise.all([
Expand All @@ -49,18 +79,8 @@
!['success', 'skip'].includes(resultSatellites) ||
!['success', 'skip'].includes(resultOrbiters)
) {
satellites = [];
orbiters = [];
return;
}
satellites = $sortedSatellites.map(({ satellite_id, ...rest }) => [
satellite_id,
{ satellite_id, ...rest }
]);
orbiters = nonNullish($orbiterStore) ? [[$orbiterStore.orbiter_id, $orbiterStore]] : [];
toggleAll();
};
onMount(() => {
Expand All @@ -72,11 +92,15 @@
const toggleAll = () => {
allSelected = !allSelected;
console.log('yo', satellites, orbiters);

Check failure on line 95 in src/frontend/src/lib/components/segments/SegmentsTable.svelte

View workflow job for this annotation

GitHub Actions / lint

Unexpected console statement
selectedMissionControl = allSelected;
selectedSatellites = allSelected ? [...satellites] : [];
selectedOrbiters = allSelected ? [...orbiters] : [];
selectedSatellites = allSelected ? [...(satellites ?? [])] : [];
selectedOrbiters = allSelected ? [...(orbiters ?? [])] : [];
};
const debounceToggleAll = debounce(toggleAll);
$effect(() => {
const disabled =
selectedSatellites.length === 0 && !selectedMissionControl && selectedOrbiters.length === 0;
Expand Down Expand Up @@ -114,7 +138,7 @@
</tr>
{/if}

{#each satellites as satellite}
{#each satellites ?? [] as satellite}
<tr>
<td class="actions"
><Checkbox
Expand All @@ -129,7 +153,7 @@
</tr>
{/each}

{#each orbiters as orbiter}
{#each orbiters ?? [] as orbiter}
{@const orbName = orbiterName(orbiter[1])}

<tr>
Expand Down
7 changes: 7 additions & 0 deletions src/frontend/src/lib/derived/canisters.derived.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import { canisterSyncDataUncertifiedStore } from '$lib/stores/canister-sync-data.store';
import { derived } from 'svelte/store';

export const canisterSyncDataUncertifiedLoaded = derived(
[canisterSyncDataUncertifiedStore],
([$canisterSyncDataUncertifiedStore]) => $canisterSyncDataUncertifiedStore !== undefined
);
28 changes: 28 additions & 0 deletions src/frontend/src/lib/derived/orbiter-merged.derived.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
import type { Orbiter } from '$declarations/mission_control/mission_control.did';
import { orbiterStore } from '$lib/derived/orbiter.derived';
import { canisterSyncDataUncertifiedStore } from '$lib/stores/canister-sync-data.store';
import type { SegmentWithSyncData } from '$lib/types/satellite';
import { isNullish } from '@dfinity/utils';
import { derived } from 'svelte/store';

export const orbiterWithSyncData = derived(
[orbiterStore, canisterSyncDataUncertifiedStore],
([$orbiterStore, $canisterSyncDataUncertifiedStore]) => {
if (isNullish($orbiterStore)) {
return undefined;
}

const { orbiter_id, ...rest } = $orbiterStore;

const canister = $canisterSyncDataUncertifiedStore?.[orbiter_id.toText()]?.data;

if (isNullish(canister)) {
return undefined;
}

return <SegmentWithSyncData<Orbiter>>{
segment: { orbiter_id, ...rest },
canister
};
}
);
26 changes: 26 additions & 0 deletions src/frontend/src/lib/derived/satellites-merged.derived.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import type { Satellite } from '$declarations/mission_control/mission_control.did';
import { sortedSatellites } from '$lib/derived/satellites.derived';
import { canisterSyncDataUncertifiedStore } from '$lib/stores/canister-sync-data.store';
import type { SegmentWithSyncData } from '$lib/types/satellite';
import { nonNullish } from '@dfinity/utils';
import { derived } from 'svelte/store';

export const satellitesWithSyncData = derived(
[sortedSatellites, canisterSyncDataUncertifiedStore],
([$sortedSatellites, $canisterSyncDataUncertifiedStore]) =>
$sortedSatellites.reduce<SegmentWithSyncData<Satellite>[]>((acc, { satellite_id, ...rest }) => {
const canister = $canisterSyncDataUncertifiedStore?.[satellite_id.toText()]?.data;

return [
...acc,
...(nonNullish(canister)
? [
{
segment: { satellite_id, ...rest },
canister
}
]
: [])
];
}, [])
);
8 changes: 8 additions & 0 deletions src/frontend/src/lib/types/satellite.ts
Original file line number Diff line number Diff line change
@@ -1 +1,9 @@
import type { Orbiter, Satellite } from '$declarations/mission_control/mission_control.did';
import type { CanisterSyncData } from '$lib/types/canister';

export type SatelliteIdText = string;

export interface SegmentWithSyncData<T extends Satellite | Orbiter> {
segment: T;
canister: CanisterSyncData;
}

0 comments on commit 84f4898

Please sign in to comment.