Extensions
{#each FILTERS as f}
filter = f.id}> {f.id === "updates" && updateCount > 0 ? `Updates (${updateCount})` : f.label}
{/each}
openPanel("repos")} title="Manage repos">
openPanel("apk")} title="Install from URL">
{#if panel === "apk"}
Install from APK URL
panel = null}>
installError = null} onkeydown={(e) => e.key === "Enter" && !installing && installExternal()} use:focusOnMount />
{#if installing}
{:else if installSuccess}
Done {:else}Install{/if}
{#if installError}
{installError}
{/if}
{/if} {#if panel === "repos"}
Extension Repositories
panel = null}>
{#if reposLoading}
{:else} {#if repos.length === 0}
No repos configured.
{:else}
{#each repos as url}
{url}
removeRepo(url)} disabled={savingRepos} title="Remove repo"> {#if savingRepos}
{:else}
{/if}
{/each}
{/if}
repoError = null} onkeydown={(e) => e.key === "Enter" && !savingRepos && addRepo()} />
{#if savingRepos}
{:else}Add{/if}
{#if repoError}
{repoError}
{/if} {/if}
{/if} {#if loading}
{:else if groups.length === 0}
No extensions found.
{:else}
{#each groups as { base, primary, variants }} {@const isExpanded = expanded.has(base)} {@const hasVariants = variants.length > 0}
(e.target as HTMLImageElement).style.display = "none"} />
{base}
{primary.lang.toUpperCase()}
v{primary.versionName}
{#if working.has(primary.pkgName)}
{:else if primary.hasUpdate}
mutate(() => gql(UPDATE_EXTENSION, { id: primary.pkgName, update: true }), primary.pkgName)}>Update
mutate(() => gql(UPDATE_EXTENSION, { id: primary.pkgName, uninstall: true }), primary.pkgName)}>Remove
{:else if primary.isInstalled}
mutate(() => gql(UPDATE_EXTENSION, { id: primary.pkgName, uninstall: true }), primary.pkgName)}>Remove
{:else}
mutate(() => gql(UPDATE_EXTENSION, { id: primary.pkgName, install: true }), primary.pkgName)}>Install
{/if} {#if hasVariants}
toggleExpand(base)} title="{variants.length + 1} languages"> {#if isExpanded}
{:else}
{/if}
{variants.length + 1}
{/if}
{#if isExpanded && hasVariants}
{#each variants as v}
{v.lang.toUpperCase()}
{v.name}
v{v.versionName}
{#if v.hasUpdate}
↑
{/if}
{#if working.has(v.pkgName)}
{:else if v.hasUpdate}
mutate(() => gql(UPDATE_EXTENSION, { id: v.pkgName, update: true }), v.pkgName)}>Update
{:else if v.isInstalled}
mutate(() => gql(UPDATE_EXTENSION, { id: v.pkgName, uninstall: true }), v.pkgName)}>Remove
{:else}
mutate(() => gql(UPDATE_EXTENSION, { id: v.pkgName, install: true }), v.pkgName)}>Install
{/if}
{/each}
{/if}
{/each}
{/if}