mirror of
https://seed.radicle.dev/rad:z4V1sjrXqjvFdnCUbxPFqd5p4DtH5.git
synced 2026-11-15 11:20:36 +08:00
77 lines
1.9 KiB
TypeScript
77 lines
1.9 KiB
TypeScript
import type { BaseUrl } from "@httpd-client";
|
|
|
|
import storedWritable from "@efstajas/svelte-stored-writable";
|
|
import unionBy from "lodash/unionBy";
|
|
import { array, number, string, object } from "zod";
|
|
import { derived } from "svelte/store";
|
|
|
|
import config from "virtual:config";
|
|
|
|
const preferredSeedSchema = object({
|
|
hostname: string(),
|
|
port: number(),
|
|
scheme: string(),
|
|
});
|
|
|
|
export const configuredPreferredSeeds = storedWritable<BaseUrl[]>(
|
|
"configuredPreferredSeeds",
|
|
array(preferredSeedSchema),
|
|
[],
|
|
);
|
|
const storedPreferredSeed = storedWritable<BaseUrl | undefined>(
|
|
"preferredSeed",
|
|
preferredSeedSchema,
|
|
undefined,
|
|
);
|
|
|
|
export function addSeedsToConfiguredSeeds(newSeeds: BaseUrl[]) {
|
|
configuredPreferredSeeds.update(seeds =>
|
|
unionBy(seeds, newSeeds, "hostname"),
|
|
);
|
|
}
|
|
|
|
export function selectPreferredSeed(seed: BaseUrl) {
|
|
storedPreferredSeed.set(seed);
|
|
}
|
|
|
|
export function removeSeedFromConfiguredSeeds(seedHostname: string) {
|
|
configuredPreferredSeeds.update(
|
|
seeds => seeds.filter(s => s.hostname !== seedHostname) ?? seeds,
|
|
);
|
|
}
|
|
|
|
export const preferredSeeds = derived(
|
|
[configuredPreferredSeeds, storedPreferredSeed],
|
|
([configuredPreferredSeeds, storedPreferredSeed]) => {
|
|
// No configured preferred seeds
|
|
if (configuredPreferredSeeds.length === 0)
|
|
return {
|
|
selected: config.fallbackPreferredSeed,
|
|
seeds: [config.fallbackPreferredSeed],
|
|
};
|
|
|
|
// No stored preferred seed
|
|
if (!storedPreferredSeed)
|
|
return {
|
|
selected: configuredPreferredSeeds[0],
|
|
seeds: configuredPreferredSeeds,
|
|
};
|
|
|
|
// Stored preferred seed not configured
|
|
if (
|
|
!configuredPreferredSeeds.some(
|
|
seed => seed.hostname === storedPreferredSeed.hostname,
|
|
)
|
|
)
|
|
return {
|
|
selected: configuredPreferredSeeds[0],
|
|
seeds: configuredPreferredSeeds,
|
|
};
|
|
|
|
return {
|
|
selected: storedPreferredSeed,
|
|
seeds: configuredPreferredSeeds,
|
|
};
|
|
},
|
|
);
|