You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
60 lines
1.3 KiB
60 lines
1.3 KiB
<script lang="ts" context="module">
|
|
const contextKey = {ctx: "scopeListCtx"};
|
|
|
|
interface ScopeListContextData {
|
|
scopes: Readable<Scope[]>,
|
|
reloadScopeList(): Promise<void>,
|
|
};
|
|
|
|
const fallback: ScopeListContextData = {
|
|
scopes: readable([]),
|
|
reloadScopeList: () => Promise.resolve()
|
|
};
|
|
|
|
export function getScopeListContext() {
|
|
return getContext(contextKey) as ScopeListContextData || fallback
|
|
}
|
|
</script>
|
|
|
|
<script lang="ts">
|
|
import { readable, writable, type Readable } from "svelte/store";
|
|
import { getContext, setContext } from "svelte";
|
|
import { sl3 } from "$lib/clients/sl3";
|
|
import type Scope from "$lib/models/scope";
|
|
import { getStores } from "$app/stores";
|
|
|
|
export let scopes: Scope[];
|
|
|
|
const {page} = getStores();
|
|
|
|
let scopesWritable = writable<Scope[]>(scopes);
|
|
let loading = false;
|
|
let lastSet = scopes;
|
|
|
|
setContext<ScopeListContextData>(contextKey, {
|
|
scopes: {subscribe: scopesWritable.subscribe},
|
|
reloadScopeList,
|
|
});
|
|
|
|
async function reloadScopeList() {
|
|
if (loading) {
|
|
return
|
|
}
|
|
|
|
try {
|
|
const newScopes = await sl3(fetch, $page.stuff.idToken).listScopes()
|
|
scopesWritable.set(newScopes);
|
|
} catch(_) {}
|
|
|
|
loading = false;
|
|
}
|
|
|
|
$: {
|
|
if (lastSet !== scopes) {
|
|
scopesWritable.set(scopes);
|
|
lastSet = scopes;
|
|
}
|
|
}
|
|
</script>
|
|
|
|
<slot></slot>
|