Skip to content

Commit 17a11ba

Browse files
committed
feat(logout): adds logout button to the settings page
1 parent cbfcd1f commit 17a11ba

File tree

4 files changed

+55
-21
lines changed

4 files changed

+55
-21
lines changed

src/components/common/navbar/NavbarSettingsDopdown.vue

+4-17
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import { computed, defineProps, h, ref } from 'vue';
66
import { useRouter } from 'vue-router';
77
88
import type { DropdownProps } from 'naive-ui';
9-
109
import type { Component } from 'vue';
1110
1211
import type { ArrayElement } from '~/utils/typescript.utils';
@@ -21,13 +20,9 @@ import IconLogOut from '~/components/icons/IconLogOut.vue';
2120
import { Route } from '~/router';
2221
import { TraktService } from '~/services/trakt.service';
2322
import { ExternaLinks } from '~/settings/external.links';
24-
import { useAuthSettingsStore } from '~/stores/settings/auth.store';
2523
import { logger } from '~/stores/settings/log.store';
26-
import {
27-
defaultUser,
28-
useUserSettingsStore,
29-
useUserSettingsStoreRefs,
30-
} from '~/stores/settings/user.store';
24+
import { useLogout } from '~/stores/settings/use-logout';
25+
import { defaultUser, useUserSettingsStoreRefs } from '~/stores/settings/user.store';
3126
import { useI18n } from '~/utils';
3227
3328
import { chromeRuntimeId, createTab } from '~/utils/browser/browser.utils';
@@ -36,8 +31,6 @@ const i18n = useI18n('navbar', 'settings');
3631
const router = useRouter();
3732
3833
const { user, userSetting, userSettings } = useUserSettingsStoreRefs();
39-
const { setCurrentUser } = useUserSettingsStore();
40-
const { syncRestoreAuth } = useAuthSettingsStore();
4134
4235
const avatar = computed(() => userSetting.value?.user?.images?.avatar?.full);
4336
const username = computed(() => userSetting.value?.user?.username);
@@ -106,10 +99,7 @@ const options = computed<DropdownProps['options']>(() => {
10699
return baseOptions;
107100
});
108101
109-
const loadUser = async (account: string) => {
110-
const auth = await syncRestoreAuth(account);
111-
return TraktService.importAuthentication(auth);
112-
};
102+
const { loadUser, logout } = useLogout();
113103
114104
const onSelect: DropdownProps['onSelect'] = async (key: string, { label }) => {
115105
switch (key) {
@@ -124,10 +114,7 @@ const onSelect: DropdownProps['onSelect'] = async (key: string, { label }) => {
124114
case 'login':
125115
return TraktService.approve({ prompt: true });
126116
case 'logout':
127-
await TraktService.logout();
128-
await setCurrentUser();
129-
if (user.value !== defaultUser) return loadUser(user.value);
130-
return router.push(Route.Login);
117+
return logout();
131118
default:
132119
if (typeof label === 'string' && key.startsWith('user-')) {
133120
return loadUser(label);

src/components/views/settings/SettingsAccount.vue

+19-4
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,19 @@ import type { UserSetting } from '~/models/trakt-service.model';
88
import TextField from '~/components/common/typography/TextField.vue';
99
import IconAccount from '~/components/icons/IconAccount.vue';
1010
11+
import IconLogOut from '~/components/icons/IconLogOut.vue';
1112
import { ResolveExternalLinks } from '~/settings/external.links';
1213
import { useLinksStore } from '~/stores/settings/links.store';
1314
import { logger } from '~/stores/settings/log.store';
15+
import { useLogout } from '~/stores/settings/use-logout';
1416
import { useUserSettingsStoreRefs } from '~/stores/settings/user.store';
1517
import { useI18n } from '~/utils';
1618
import { chromeRuntimeId } from '~/utils/browser/browser.utils';
1719
1820
const i18n = useI18n('settings', 'account');
1921
2022
const { userSetting } = useUserSettingsStoreRefs();
23+
const { logout } = useLogout();
2124
2225
const fallback = ref<boolean>(!chromeRuntimeId);
2326
const avatar = computed(() => {
@@ -149,6 +152,16 @@ const onClick = () => {
149152
</NFlex>
150153
</NCard>
151154
</NFlex>
155+
156+
<!-- Footer -->
157+
<NFlex class="footer" align="center" justify="center">
158+
<NButton secondary type="error" @click="logout()">
159+
<span>{{ i18n('logout', 'common', 'button') }}</span>
160+
<template #icon>
161+
<NIcon :component="IconLogOut" />
162+
</template>
163+
</NButton>
164+
</NFlex>
152165
</template>
153166

154167
<style lang="scss" scoped>
@@ -157,16 +170,13 @@ const onClick = () => {
157170
.account-card {
158171
--border-color: var(--white-10);
159172
173+
margin-bottom: 1.5rem;
160174
background: var(--bg-black-soft);
161175
162176
&:hover {
163177
--border-color: var(--white-15);
164178
}
165179
166-
&:not(:last-child) {
167-
margin-bottom: 1.5rem;
168-
}
169-
170180
.avatar {
171181
--n-avatar-size-override: 8rem;
172182
@@ -202,4 +212,9 @@ const onClick = () => {
202212
min-width: 31%;
203213
}
204214
}
215+
216+
.footer {
217+
margin-bottom: 0.5rem;
218+
padding: 0.5rem;
219+
}
205220
</style>

src/i18n/en/common/button.json

+4
Original file line numberDiff line numberDiff line change
@@ -42,5 +42,9 @@
4242
"common__button__off": {
4343
"message": "Off",
4444
"description": "Button to turn off an item."
45+
},
46+
"common__button__logout": {
47+
"message": "Logout",
48+
"description": "Button to logout."
4549
}
4650
}

src/stores/settings/use-logout.ts

+28
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import { useRouter } from 'vue-router';
2+
3+
import { Route } from '~/router';
4+
import { TraktService } from '~/services/trakt.service';
5+
import { useAuthSettingsStore } from '~/stores/settings/auth.store';
6+
import { defaultUser, useUserSettingsStore, useUserSettingsStoreRefs } from '~/stores/settings/user.store';
7+
8+
export const useLogout = () => {
9+
const router = useRouter();
10+
const { user } = useUserSettingsStoreRefs();
11+
const { setCurrentUser } = useUserSettingsStore();
12+
const { syncRestoreAuth } = useAuthSettingsStore();
13+
14+
const loadUser = async (account: string) => {
15+
console.info('loadUser', account);
16+
const auth = await syncRestoreAuth(account);
17+
return TraktService.importAuthentication(auth);
18+
};
19+
20+
const logout = async () => {
21+
await TraktService.logout();
22+
await setCurrentUser();
23+
if (user.value !== defaultUser) return loadUser(user.value);
24+
return router.push(Route.Login);
25+
};
26+
27+
return { logout, loadUser };
28+
};

0 commit comments

Comments
 (0)