Skip to content

Commit 9653a0f

Browse files
committed
next: use runed persisted state
1 parent 1f7e7aa commit 9653a0f

File tree

17 files changed

+121
-177
lines changed

17 files changed

+121
-177
lines changed

src/Exceptionless.Web/ClientApp/src/lib/features/auth/index.svelte.ts

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,30 @@
11
import { goto } from '$app/navigation';
22
import { page } from '$app/stores';
33
import { env } from '$env/dynamic/public';
4-
import { AuthJSONSerializer, persisted } from '$shared/persisted.svelte';
54
import { useFetchClient } from '@exceptionless/fetchclient';
5+
import { PersistedState } from 'runed';
66
import { get } from 'svelte/store';
77

88
import type { Login, TokenResult } from './models';
99

10-
export const accessToken = persisted('satellizer_token', null, new AuthJSONSerializer());
10+
const authSerializer = {
11+
deserialize: (value: null | string): null | string => {
12+
if (value === '') {
13+
return null;
14+
}
15+
16+
return value;
17+
},
18+
serialize: (value: null | string): string => {
19+
if (value === null) {
20+
return '';
21+
}
22+
23+
return value;
24+
}
25+
};
26+
27+
export const accessToken = new PersistedState<null | string>('satellizer_token', null, { serializer: authSerializer });
1128

1229
export const enableAccountCreation = env.PUBLIC_ENABLE_ACCOUNT_CREATION === 'true';
1330
export const facebookClientId = env.PUBLIC_FACEBOOK_APPID;
@@ -98,7 +115,7 @@ export async function login(email: string, password: string) {
98115
});
99116

100117
if (response.ok && response.data?.token) {
101-
accessToken.value = response.data.token;
118+
accessToken.current = response.data.token;
102119
} else if (response.status === 401) {
103120
response.problem.setErrorMessage('Invalid email or password');
104121
}
@@ -109,7 +126,7 @@ export async function login(email: string, password: string) {
109126
export async function logout() {
110127
const client = useFetchClient();
111128
await client.get('auth/logout', { expectedStatusCodes: [200, 401] });
112-
accessToken.value = null;
129+
accessToken.current = null;
113130
}
114131

115132
async function oauthLogin(options: {
@@ -158,7 +175,7 @@ async function oauthLogin(options: {
158175
});
159176

160177
if (response.ok && response.data?.token) {
161-
accessToken.value = response.data.token;
178+
accessToken.current = response.data.token;
162179
await goto(options.redirectUrl || '/');
163180
}
164181
}

src/Exceptionless.Web/ClientApp/src/lib/features/events/api.svelte.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ export interface GetStackEventsRequest {
124124
export function deleteEvent(request: DeleteEventsRequest) {
125125
const queryClient = useQueryClient();
126126
return createMutation<WorkInProgressResult, ProblemDetails, void>(() => ({
127-
enabled: () => !!accessToken.value && !!request.route.ids?.length,
127+
enabled: () => !!accessToken.current && !!request.route.ids?.length,
128128
mutationFn: async () => {
129129
const client = useFetchClient();
130130
const response = await client.deleteJSON<WorkInProgressResult>(`events/${request.route.ids?.join(',')}`);
@@ -145,7 +145,7 @@ export function getCountQuery(request: GetCountRequest) {
145145
const queryClient = useQueryClient();
146146

147147
return createQuery<CountResult, ProblemDetails>(() => ({
148-
enabled: () => !!accessToken.value,
148+
enabled: () => !!accessToken.current,
149149
queryClient,
150150
queryFn: async ({ signal }: { signal: AbortSignal }) => {
151151
const client = useFetchClient();
@@ -165,7 +165,7 @@ export function getCountQuery(request: GetCountRequest) {
165165

166166
export function getEventQuery(request: GetEventRequest) {
167167
return createQuery<PersistentEvent, ProblemDetails>(() => ({
168-
enabled: () => !!accessToken.value && !!request.route.id,
168+
enabled: () => !!accessToken.current && !!request.route.id,
169169
queryFn: async ({ signal }: { signal: AbortSignal }) => {
170170
const client = useFetchClient();
171171
const response = await client.getJSON<PersistentEvent>(`events/${request.route.id}`, {
@@ -186,7 +186,7 @@ export function getProjectCountQuery(request: GetProjectCountRequest) {
186186
const queryClient = useQueryClient();
187187

188188
return createQuery<CountResult, ProblemDetails>(() => ({
189-
enabled: () => !!accessToken.value && !!request.route.projectId,
189+
enabled: () => !!accessToken.current && !!request.route.projectId,
190190
queryClient,
191191
queryFn: async ({ signal }: { signal: AbortSignal }) => {
192192
const client = useFetchClient();
@@ -208,7 +208,7 @@ export function getStackCountQuery(request: GetStackCountRequest) {
208208
const queryClient = useQueryClient();
209209

210210
return createQuery<CountResult, ProblemDetails>(() => ({
211-
enabled: () => !!accessToken.value && !!request.route.stackId,
211+
enabled: () => !!accessToken.current && !!request.route.stackId,
212212
queryClient,
213213
queryFn: async ({ signal }: { signal: AbortSignal }) => {
214214
const client = useFetchClient();
@@ -233,7 +233,7 @@ export function getStackEventsQuery(request: GetStackEventsRequest) {
233233
const queryClient = useQueryClient();
234234

235235
return createQuery<PersistentEvent[], ProblemDetails>(() => ({
236-
enabled: () => !!accessToken.value && !!request.route.stackId,
236+
enabled: () => !!accessToken.current && !!request.route.stackId,
237237
onSuccess: (data: PersistentEvent[]) => {
238238
data.forEach((event) => {
239239
queryClient.setQueryData(queryKeys.id(event.id!), event);

src/Exceptionless.Web/ClientApp/src/lib/features/events/components/table/options.svelte.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import TimeAgo from '$comp/formatters/TimeAgo.svelte';
55
import { Checkbox } from '$comp/ui/checkbox';
66
import { nameof } from '$lib/utils';
77
import { DEFAULT_LIMIT } from '$shared/api/api.svelte';
8-
import { persisted } from '$shared/persisted.svelte';
98
import {
109
type ColumnDef,
1110
type ColumnSort,
@@ -17,6 +16,7 @@ import {
1716
type Updater,
1817
type VisibilityState
1918
} from '@tanstack/svelte-table';
19+
import { PersistedState } from 'runed';
2020

2121
import type { GetEventsMode, GetEventsParams } from '../../api.svelte';
2222
import type { EventSummaryModel, StackSummaryModel, SummaryModel, SummaryTemplateKeys } from '../summary/index';
@@ -270,15 +270,15 @@ export function getTableContext<TSummaryModel extends SummaryModel<SummaryTempla
270270
}
271271

272272
function createPersistedTableState<T>(key: string, initialValue: T): [() => T, (updater: Updater<T>) => void] {
273-
const persistedValue = persisted<T>(key, initialValue);
273+
const persistedValue = new PersistedState<T>(key, initialValue);
274274

275275
return [
276-
() => persistedValue.value,
276+
() => persistedValue.current,
277277
(updater: Updater<T>) => {
278278
if (updater instanceof Function) {
279-
persistedValue.value = updater(persistedValue.value);
279+
persistedValue.current = updater(persistedValue.current);
280280
} else {
281-
persistedValue.value = updater;
281+
persistedValue.current = updater;
282282
}
283283
}
284284
];

src/Exceptionless.Web/ClientApp/src/lib/features/organizations/api.svelte.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ export function getOrganizationQuery(request: GetOrganizationsRequest) {
3535
const queryClient = useQueryClient();
3636

3737
return createQuery<ViewOrganization[], ProblemDetails>(() => ({
38-
enabled: () => !!accessToken.value,
38+
enabled: () => !!accessToken.current,
3939
onSuccess: (data: ViewOrganization[]) => {
4040
data.forEach((organization) => {
4141
queryClient.setQueryData(queryKeys.id(organization.id!), organization);

src/Exceptionless.Web/ClientApp/src/lib/features/projects/api.svelte.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ export function getOrganizationProjectsQuery(request: GetOrganizationProjectsReq
9292
const queryClient = useQueryClient();
9393

9494
return createQuery<ViewProject[], ProblemDetails>(() => ({
95-
enabled: () => !!accessToken.value && !!request.route.organizationId,
95+
enabled: () => !!accessToken.current && !!request.route.organizationId,
9696
onSuccess: (data: ViewProject[]) => {
9797
data.forEach((project) => {
9898
queryClient.setQueryData(queryKeys.id(project.id!), project);
@@ -117,7 +117,7 @@ export function getOrganizationProjectsQuery(request: GetOrganizationProjectsReq
117117

118118
export function getProjectQuery(request: GetProjectRequest) {
119119
return createQuery<ViewProject, ProblemDetails>(() => ({
120-
enabled: () => !!accessToken.value && !!request.route.id,
120+
enabled: () => !!accessToken.current && !!request.route.id,
121121
queryFn: async ({ signal }: { signal: AbortSignal }) => {
122122
const client = useFetchClient();
123123
const response = await client.getJSON<ViewProject>(`projects/${request.route.id}`, {

src/Exceptionless.Web/ClientApp/src/lib/features/shared/components/filters/filters.svelte.ts

Lines changed: 20 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import type { PersistentEventKnownTypes } from '$features/events/models';
22
import type { StackStatus } from '$features/stacks/models';
3-
import type { Serializer } from '$shared/persisted.svelte';
43

54
export interface IFilter {
65
isEmpty(): boolean;
@@ -99,29 +98,6 @@ export class DateFilter implements IFilter {
9998
}
10099
}
101100

102-
export class FilterSerializer implements Serializer<IFilter[]> {
103-
public deserialize(text: string): IFilter[] {
104-
if (!text) {
105-
return [];
106-
}
107-
108-
const data: unknown[] = JSON.parse(text);
109-
const filters: IFilter[] = [];
110-
for (const filterData of data) {
111-
const filter = getFilter(filterData as Omit<IFilter, 'isEmpty' | 'reset' | 'toFilter'>);
112-
if (filter) {
113-
filters.push(filter);
114-
}
115-
}
116-
117-
return filters;
118-
}
119-
120-
public serialize(object: IFilter[]): string {
121-
return JSON.stringify(object);
122-
}
123-
}
124-
125101
export class KeywordFilter implements IFilter {
126102
public type: string = 'keyword';
127103

@@ -532,6 +508,26 @@ export function filterChanged(filters: IFilter[], updated: IFilter): IFilter[] {
532508
return processFilterRules(setFilter(filters, updated), updated);
533509
}
534510

511+
export const filterSerializer = {
512+
deserialize: (value: string): IFilter[] => {
513+
if (!value) {
514+
return [];
515+
}
516+
517+
const data: unknown[] = JSON.parse(value);
518+
const filters: IFilter[] = [];
519+
for (const filterData of data) {
520+
const filter = getFilter(filterData as Omit<IFilter, 'isEmpty' | 'reset' | 'toFilter'>);
521+
if (filter) {
522+
filters.push(filter);
523+
}
524+
}
525+
526+
return filters;
527+
},
528+
serialize: JSON.stringify
529+
};
530+
535531
export function filterRemoved(filters: IFilter[], defaultFilters: IFilter[], removed?: IFilter): IFilter[] {
536532
// If detail is undefined, remove all filters.
537533
if (!removed) {

src/Exceptionless.Web/ClientApp/src/lib/features/shared/persisted.svelte.ts

Lines changed: 0 additions & 67 deletions
This file was deleted.

0 commit comments

Comments
 (0)