chore(frontend): introduce prettier + eslint and prune unused code
- Add Prettier 3 with prettier-plugin-organize-imports (sorts/removes unused imports) - Add ESLint 10 flat config with typescript-eslint + eslint-plugin-vue + eslint-config-prettier - Add root scripts: format, format:check, lint, lint:fix - Reformat 257 files across admin-web, ops-web, desktop-client, packages - Remove unused locals/exports flagged by --noUnusedLocals/--noUnusedParameters - Fix duplicate localTabLabel key, surrogate-pair regex u-flag, NBSP literal in regex - Skip server/ (Go) and apps/browser-extension/ (deprecated per ADR) Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
import { defineStore } from "pinia";
|
||||
import { computed, ref } from "vue";
|
||||
import { defineStore } from 'pinia'
|
||||
import { computed, ref } from 'vue'
|
||||
|
||||
import { http } from "@/lib/http";
|
||||
import { http } from '@/lib/http'
|
||||
import {
|
||||
type OperatorView,
|
||||
clearStoredSession,
|
||||
@@ -9,66 +9,69 @@ import {
|
||||
readStoredSession,
|
||||
writeLoginPreference,
|
||||
writeStoredSession,
|
||||
} from "@/lib/storage";
|
||||
} from '@/lib/storage'
|
||||
|
||||
interface LoginResponse {
|
||||
access_token: string;
|
||||
expires_at: number;
|
||||
operator: OperatorView;
|
||||
access_token: string
|
||||
expires_at: number
|
||||
operator: OperatorView
|
||||
}
|
||||
|
||||
export const useAuthStore = defineStore("ops-auth", () => {
|
||||
const accessToken = ref<string | null>(null);
|
||||
const expiresAt = ref<number | null>(null);
|
||||
const operator = ref<OperatorView | null>(null);
|
||||
const initialized = ref(false);
|
||||
const persistent = ref(false);
|
||||
export const useAuthStore = defineStore('ops-auth', () => {
|
||||
const accessToken = ref<string | null>(null)
|
||||
const expiresAt = ref<number | null>(null)
|
||||
const operator = ref<OperatorView | null>(null)
|
||||
const initialized = ref(false)
|
||||
const persistent = ref(false)
|
||||
|
||||
function hydrate(): void {
|
||||
const stored = readStoredSession();
|
||||
accessToken.value = stored.session.accessToken;
|
||||
expiresAt.value = stored.session.expiresAt;
|
||||
operator.value = stored.session.operator;
|
||||
persistent.value = stored.persistent;
|
||||
initialized.value = true;
|
||||
const stored = readStoredSession()
|
||||
accessToken.value = stored.session.accessToken
|
||||
expiresAt.value = stored.session.expiresAt
|
||||
operator.value = stored.session.operator
|
||||
persistent.value = stored.persistent
|
||||
initialized.value = true
|
||||
}
|
||||
|
||||
let loginPromise: Promise<void> | null = null;
|
||||
let loginPromise: Promise<void> | null = null
|
||||
|
||||
async function login(username: string, password: string, remember: boolean): Promise<void> {
|
||||
if (loginPromise) {
|
||||
return loginPromise;
|
||||
return loginPromise
|
||||
}
|
||||
|
||||
const payload = { username, password, remember };
|
||||
loginPromise = http.post<LoginResponse>("/auth/login", {
|
||||
username: payload.username,
|
||||
password: payload.password,
|
||||
}).then((result) => {
|
||||
accessToken.value = result.access_token;
|
||||
expiresAt.value = result.expires_at;
|
||||
operator.value = result.operator;
|
||||
persistent.value = payload.remember;
|
||||
writeStoredSession(
|
||||
{
|
||||
accessToken: result.access_token,
|
||||
expiresAt: result.expires_at,
|
||||
operator: result.operator,
|
||||
},
|
||||
payload.remember,
|
||||
);
|
||||
writeLoginPreference({ remember: payload.remember, lastUsername: payload.username });
|
||||
}).finally(() => {
|
||||
loginPromise = null;
|
||||
});
|
||||
const payload = { username, password, remember }
|
||||
loginPromise = http
|
||||
.post<LoginResponse>('/auth/login', {
|
||||
username: payload.username,
|
||||
password: payload.password,
|
||||
})
|
||||
.then((result) => {
|
||||
accessToken.value = result.access_token
|
||||
expiresAt.value = result.expires_at
|
||||
operator.value = result.operator
|
||||
persistent.value = payload.remember
|
||||
writeStoredSession(
|
||||
{
|
||||
accessToken: result.access_token,
|
||||
expiresAt: result.expires_at,
|
||||
operator: result.operator,
|
||||
},
|
||||
payload.remember,
|
||||
)
|
||||
writeLoginPreference({ remember: payload.remember, lastUsername: payload.username })
|
||||
})
|
||||
.finally(() => {
|
||||
loginPromise = null
|
||||
})
|
||||
|
||||
return loginPromise;
|
||||
return loginPromise
|
||||
}
|
||||
|
||||
async function refreshSelf(): Promise<void> {
|
||||
if (!accessToken.value) return;
|
||||
if (!accessToken.value) return
|
||||
try {
|
||||
const me = await http.get<OperatorView & { last_login_at: string | null }>("/auth/me");
|
||||
const me = await http.get<OperatorView & { last_login_at: string | null }>('/auth/me')
|
||||
operator.value = {
|
||||
id: me.id,
|
||||
username: me.username,
|
||||
@@ -76,7 +79,7 @@ export const useAuthStore = defineStore("ops-auth", () => {
|
||||
email: me.email,
|
||||
role: me.role,
|
||||
status: me.status,
|
||||
};
|
||||
}
|
||||
writeStoredSession(
|
||||
{
|
||||
accessToken: accessToken.value,
|
||||
@@ -84,21 +87,21 @@ export const useAuthStore = defineStore("ops-auth", () => {
|
||||
operator: operator.value,
|
||||
},
|
||||
persistent.value,
|
||||
);
|
||||
)
|
||||
} catch {
|
||||
logout();
|
||||
logout()
|
||||
}
|
||||
}
|
||||
|
||||
function logout(): void {
|
||||
accessToken.value = null;
|
||||
expiresAt.value = null;
|
||||
operator.value = null;
|
||||
persistent.value = false;
|
||||
clearStoredSession();
|
||||
accessToken.value = null
|
||||
expiresAt.value = null
|
||||
operator.value = null
|
||||
persistent.value = false
|
||||
clearStoredSession()
|
||||
}
|
||||
|
||||
const isAuthenticated = computed(() => !!accessToken.value);
|
||||
const isAuthenticated = computed(() => !!accessToken.value)
|
||||
|
||||
return {
|
||||
accessToken,
|
||||
@@ -112,5 +115,5 @@ export const useAuthStore = defineStore("ops-auth", () => {
|
||||
refreshSelf,
|
||||
logout,
|
||||
readLoginPreference,
|
||||
};
|
||||
});
|
||||
}
|
||||
})
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
import { createPinia } from "pinia";
|
||||
import { createPinia } from 'pinia'
|
||||
|
||||
export const pinia = createPinia();
|
||||
export const pinia = createPinia()
|
||||
|
||||
Reference in New Issue
Block a user