208 lines
6.1 KiB
Svelte
208 lines
6.1 KiB
Svelte
<script lang="ts">
|
|
import { goto } from '$app/navigation';
|
|
import { page } from '$app/stores'
|
|
|
|
import {
|
|
Button,
|
|
Dropdown,
|
|
DropdownItem,
|
|
DropdownMenu,
|
|
DropdownToggle,
|
|
Icon,
|
|
Navbar,
|
|
NavbarBrand,
|
|
Nav,
|
|
} from 'sveltestrap';
|
|
|
|
import { logout as APILogout } from '$lib/api/user';
|
|
import HelpButton from '$lib/components/Help.svelte';
|
|
import Logo from '$lib/components/Logo.svelte';
|
|
import { providersSpecs } from '$lib/stores/providers';
|
|
import { userSession, refreshUserSession } from '$lib/stores/usersession';
|
|
import { toasts } from '$lib/stores/toasts';
|
|
import { t, locales, locale } from '$lib/translations';
|
|
|
|
export { className as class };
|
|
let className = '';
|
|
|
|
export let routeId: string | null;
|
|
export let sw_state: boolean;
|
|
let helpLink = "";
|
|
$: if (routeId.startsWith("/providers/new/[ptype]")) {
|
|
helpLink = getHelpPathFromProvider($page.url.pathname.split("/")[3]);
|
|
} else {
|
|
helpLink = 'https://help.happydomain.org/' + encodeURIComponent($locale) + getHelpPathFromRoute(routeId);
|
|
}
|
|
|
|
function getHelpPathFromProvider(ptype: string): string {
|
|
if ($providersSpecs && $providersSpecs[ptype]) {
|
|
return $providersSpecs[ptype].helplink;
|
|
} else {
|
|
return 'https://help.happydomain.org/';
|
|
}
|
|
}
|
|
|
|
function getHelpPathFromRoute(routeId: string | null) {
|
|
if (routeId === null) return "/";
|
|
|
|
const path = routeId.split("/");
|
|
|
|
if (path.length < 2) return "/";
|
|
|
|
switch(path[1]) {
|
|
case "":
|
|
return "/pages/home/";
|
|
case "providers":
|
|
if (path.length > 2) {
|
|
if (path[2] == "new") return "/pages/source-new-choice/";
|
|
return "/pages/source-update/";
|
|
}
|
|
return "/pages/source-list/";
|
|
case "domains":
|
|
if (path.length == 2) return "/pages/home/";
|
|
if (path.length > 3 && path[3] == "new") return "/pages/domain-new/";
|
|
return "/pages/domain-abstract/";
|
|
case "me":
|
|
return "/pages/me/";
|
|
case "resolver":
|
|
return "/pages/tools-client/";
|
|
default:
|
|
return "/";
|
|
}
|
|
}
|
|
|
|
let activemenu = "";
|
|
$: {
|
|
const path = $page.url.pathname.split("/");
|
|
if (path.length > 1) {
|
|
activemenu = path[1];
|
|
}
|
|
}
|
|
|
|
function logout() {
|
|
APILogout().then(
|
|
() => {
|
|
refreshUserSession().then(
|
|
() => { },
|
|
() => {
|
|
goto('/login');
|
|
}
|
|
)
|
|
},
|
|
(error) => {
|
|
toasts.addErrorToast({
|
|
title: $t('errors.logout'),
|
|
message: error,
|
|
timeout: 20000,
|
|
})
|
|
}
|
|
)
|
|
}
|
|
</script>
|
|
|
|
<Navbar
|
|
class="{className} {$userSession?'p-0':''}"
|
|
container
|
|
expand="xs"
|
|
light
|
|
>
|
|
<NavbarBrand
|
|
href="/"
|
|
style="padding: 0; margin: -.5rem 0;"
|
|
>
|
|
<Logo />
|
|
</NavbarBrand>
|
|
<Nav class="ms-auto" navbar>
|
|
<HelpButton
|
|
href={helpLink}
|
|
size={$userSession?"sm":undefined}
|
|
class={$userSession?"my-2":"me-2"}
|
|
/>
|
|
{#if $userSession}
|
|
<Dropdown nav inNavbar>
|
|
<DropdownToggle nav caret>
|
|
<Button
|
|
color="dark"
|
|
size="sm"
|
|
>
|
|
<Icon name="person" />
|
|
{#if $userSession.email !== '_no_auth'}
|
|
{$userSession.email}
|
|
{:else}
|
|
{$t('menu.quick-menu')}
|
|
{/if}
|
|
</Button>
|
|
</DropdownToggle>
|
|
<DropdownMenu end>
|
|
<DropdownItem href="/domains/">
|
|
{$t('menu.my-domains')}
|
|
</DropdownItem>
|
|
<DropdownItem href="/providers/">
|
|
{$t('menu.my-providers')}
|
|
</DropdownItem>
|
|
<DropdownItem divider />
|
|
<DropdownItem href="/resolver">
|
|
{$t('menu.dns-resolver')}
|
|
</DropdownItem>
|
|
<DropdownItem divider />
|
|
<DropdownItem href="/me">
|
|
{$t('menu.my-account')}
|
|
</DropdownItem>
|
|
{#if $userSession.email !== '_no_auth'}
|
|
<DropdownItem divider />
|
|
<DropdownItem on:click={logout}>
|
|
{$t('menu.logout')}
|
|
</DropdownItem>
|
|
{/if}
|
|
</DropdownMenu>
|
|
</Dropdown>
|
|
{:else}
|
|
<Button
|
|
class="me-2"
|
|
color="info"
|
|
href="/resolver"
|
|
>
|
|
<Icon
|
|
name="list"
|
|
aria-hidden="true"
|
|
/>
|
|
{$t('menu.dns-resolver')}
|
|
</Button>
|
|
|
|
<Button
|
|
outline={activemenu != "join"}
|
|
color="dark"
|
|
href="/join"
|
|
>
|
|
<Icon
|
|
name="person-plus-fill"
|
|
aria-hidden="true"
|
|
/>
|
|
{$t('menu.signup')}
|
|
</Button>
|
|
<Button
|
|
outline={activemenu == "join"}
|
|
color="primary"
|
|
class="ms-2"
|
|
href="/login"
|
|
>
|
|
<Icon
|
|
name="person-check-fill"
|
|
aria-hidden="true"
|
|
/>
|
|
{$t('menu.signin')}
|
|
</Button>
|
|
<Dropdown nav inNavbar>
|
|
<DropdownToggle nav caret>{$locale}</DropdownToggle>
|
|
<DropdownMenu end>
|
|
{#each $locales as lang}
|
|
<DropdownItem on:click={() => $locale = lang}>
|
|
{lang}
|
|
</DropdownItem>
|
|
{/each}
|
|
</DropdownMenu>
|
|
</Dropdown>
|
|
{/if}
|
|
</Nav>
|
|
</Navbar>
|