Skip to content

Commit aac499a

Browse files
committed
Store klage values in sessionStorage during login
1 parent 1e6dc6f commit aac499a

File tree

6 files changed

+351
-31
lines changed

6 files changed

+351
-31
lines changed

src/auth/login.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@ import { environment } from '../environment/environment';
22

33
export const LOGGED_IN_REDIRECT_PATH_KEY = 'logged-in-redirect-path';
44

5-
export function login(redirectAfter: string = current(window.location)) {
5+
export function login() {
6+
const redirectAfter = current(window.location);
67
localStorage.setItem(LOGGED_IN_REDIRECT_PATH_KEY, redirectAfter);
78
window.location.replace(environment.loginUrl);
89
}

src/klage/klage-loader.tsx

+16-2
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,11 @@ import { useParams } from 'react-router-dom';
33
import { AlertStripeFeil } from 'nav-frontend-alertstriper';
44
import NavFrontendSpinner from 'nav-frontend-spinner';
55
import { Normaltekst } from 'nav-frontend-typografi';
6-
import { getKlage } from '../api/api';
6+
import { getKlage, updateKlage } from '../api/api';
77
import { CenteredContainer } from '../styled-components/common';
88
import { AppContext } from '../app-context/app-context';
99
import { Klage } from './klage';
10+
import klageStore from './klage-store';
1011

1112
interface Props {
1213
render: (klage: Klage) => JSX.Element;
@@ -20,10 +21,23 @@ const KlageLoader = (props: Props) => {
2021
const { klage, setKlage } = useContext(AppContext);
2122
const { klageId } = useParams<Match>();
2223
const [error, setError] = useState<string | null>(null);
24+
const [status, setStatus] = useState('Laster klage...');
2325

2426
useEffect(() => {
2527
if (klage === null || klageId !== klage.id.toString()) {
2628
getKlage(klageId)
29+
.then(klage => {
30+
setStatus('Gjenoppretter klage...');
31+
const restoredKlage = klageStore.restore(klage);
32+
if (restoredKlage !== klage) {
33+
return updateKlage(restoredKlage).then(() => {
34+
klageStore.clear();
35+
return restoredKlage;
36+
});
37+
}
38+
klageStore.clear();
39+
return klage;
40+
})
2741
.then(setKlage)
2842
.catch((error: Error) => setError(formatError(klageId, error)));
2943
}
@@ -37,7 +51,7 @@ const KlageLoader = (props: Props) => {
3751
return (
3852
<CenteredContainer>
3953
<NavFrontendSpinner type={'XL'} />
40-
<Normaltekst>Laster klage...</Normaltekst>
54+
<Normaltekst>{status}</Normaltekst>
4155
</CenteredContainer>
4256
);
4357
}

src/klage/klage-store.test.ts

+213
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,213 @@
1+
import { TemaKey } from '../tema/tema';
2+
import { Klage, KlageStatus, VedtakType } from './klage';
3+
import { KlageStorage, KLAGE_STORAGE_KEYS } from './klage-store';
4+
5+
describe('Klage store', () => {
6+
const BASE_KLAGE: Klage = {
7+
id: '123',
8+
finalizedDate: null,
9+
journalpostId: null,
10+
modifiedByUser: '2020-12-31T15:45:59.123',
11+
saksnummer: null,
12+
tema: TemaKey.FOR,
13+
vedlegg: [],
14+
ytelse: 'En ytelse',
15+
status: KlageStatus.DRAFT,
16+
fritekst: '',
17+
vedtakType: null,
18+
vedtakDate: null
19+
};
20+
21+
it('Should store klage values', () => {
22+
const storage = new MockStorage();
23+
const klageStore = new KlageStorage(storage);
24+
const expectedFritekst = 'fritekst';
25+
const expectedVedtakDate = '2020-12-31';
26+
const expectedVedtakType = VedtakType.EARLIER;
27+
28+
klageStore.store(expectedFritekst, expectedVedtakType, expectedVedtakDate);
29+
30+
const fritekst = storage.getItem(KLAGE_STORAGE_KEYS.KLAGE_FRITEKST);
31+
const dateOption = storage.getItem(KLAGE_STORAGE_KEYS.KLAGE_VEDTAK_TYPE);
32+
const isoDate = storage.getItem(KLAGE_STORAGE_KEYS.KLAGE_VEDTAK_DATE);
33+
34+
expect(fritekst).toBe(expectedFritekst);
35+
expect(dateOption).toBe(expectedVedtakType);
36+
expect(isoDate).toBe(expectedVedtakDate);
37+
});
38+
39+
it('Should overwrite klage when fritekst is different, vedtak is equal, and klage status is DRAFT', () => {
40+
const storage = new MockStorage();
41+
const klageStore = new KlageStorage(storage);
42+
const expectedFritekst = 'a new and better fritekst';
43+
const expectedVedtakDate = '2020-12-31';
44+
const expectedVedtakType = VedtakType.EARLIER;
45+
46+
klageStore.store(expectedFritekst, expectedVedtakType, expectedVedtakDate);
47+
48+
const klage: Klage = {
49+
...BASE_KLAGE,
50+
status: KlageStatus.DRAFT,
51+
fritekst: 'old and poor fritekst',
52+
vedtakType: expectedVedtakType,
53+
vedtakDate: expectedVedtakDate
54+
};
55+
const expectedKlage: Klage = {
56+
...klage,
57+
fritekst: expectedFritekst,
58+
vedtakType: expectedVedtakType,
59+
vedtakDate: expectedVedtakDate
60+
};
61+
const restoredKlage = klageStore.restore(klage);
62+
63+
expect(restoredKlage).not.toBe(expectedKlage);
64+
expect(restoredKlage).toStrictEqual(expectedKlage);
65+
});
66+
67+
it('Should overwrite klage when fritekst is equal, vedtak is different, and klage status is DRAFT', () => {
68+
const storage = new MockStorage();
69+
const klageStore = new KlageStorage(storage);
70+
const expectedFritekst = 'fritekst';
71+
const expectedVedtakDate = '2020-12-31';
72+
const expectedVedtakType = VedtakType.EARLIER;
73+
74+
klageStore.store(expectedFritekst, expectedVedtakType, expectedVedtakDate);
75+
76+
const klage: Klage = {
77+
...BASE_KLAGE,
78+
status: KlageStatus.DRAFT,
79+
fritekst: expectedFritekst,
80+
vedtakType: VedtakType.LATEST,
81+
vedtakDate: null
82+
};
83+
const expectedKlage: Klage = {
84+
...klage,
85+
fritekst: expectedFritekst,
86+
vedtakType: expectedVedtakType,
87+
vedtakDate: expectedVedtakDate
88+
};
89+
const restoredKlage = klageStore.restore(klage);
90+
91+
expect(restoredKlage).not.toBe(expectedKlage);
92+
expect(restoredKlage).toStrictEqual(expectedKlage);
93+
});
94+
95+
it('Should not overwrite klage when values are null', () => {
96+
const storage = new MockStorage();
97+
const klageStore = new KlageStorage(storage);
98+
const expectedFritekst = 'fritekst';
99+
const expectedVedtakDate = '2020-12-31';
100+
const expectedVedtakType = VedtakType.EARLIER;
101+
102+
const expectedKlage: Klage = {
103+
...BASE_KLAGE,
104+
status: KlageStatus.DRAFT,
105+
fritekst: expectedFritekst,
106+
vedtakType: expectedVedtakType,
107+
vedtakDate: expectedVedtakDate
108+
};
109+
const restoredKlage = klageStore.restore(expectedKlage);
110+
111+
expect(restoredKlage).toBe(expectedKlage);
112+
});
113+
114+
it('Should not overwrite klage when values are equal', () => {
115+
const storage = new MockStorage();
116+
const klageStore = new KlageStorage(storage);
117+
const expectedFritekst = 'fritekst';
118+
const expectedVedtakDate = '2020-12-31';
119+
const expectedVedtakType = VedtakType.EARLIER;
120+
121+
klageStore.store(expectedFritekst, expectedVedtakType, expectedVedtakDate);
122+
123+
const expectedKlage: Klage = {
124+
...BASE_KLAGE,
125+
status: KlageStatus.DRAFT,
126+
fritekst: expectedFritekst,
127+
vedtakType: expectedVedtakType,
128+
vedtakDate: expectedVedtakDate
129+
};
130+
const restoredKlage = klageStore.restore(expectedKlage);
131+
132+
expect(restoredKlage).toBe(expectedKlage);
133+
});
134+
135+
it('Should not overwrite klage when status is not DRAFT', () => {
136+
const storage = new MockStorage();
137+
const klageStore = new KlageStorage(storage);
138+
const expectedFritekst = 'fritekst';
139+
const expectedVedtakDate = '2020-12-31';
140+
const expectedVedtakType = VedtakType.EARLIER;
141+
142+
klageStore.store(expectedFritekst, expectedVedtakType, expectedVedtakDate);
143+
144+
const expectedKlage: Klage = {
145+
...BASE_KLAGE,
146+
status: KlageStatus.DONE,
147+
fritekst: 'outdated',
148+
vedtakType: expectedVedtakType,
149+
vedtakDate: expectedVedtakDate
150+
};
151+
const restoredKlage = klageStore.restore(expectedKlage);
152+
153+
expect(restoredKlage).toBe(expectedKlage);
154+
});
155+
156+
it('Should ONLY clear storage keys it owns', () => {
157+
const storage = new MockStorage({
158+
shouldBe: 'still here',
159+
shouldStill: 'be here',
160+
[KLAGE_STORAGE_KEYS.KLAGE_FRITEKST]: 'not here',
161+
[KLAGE_STORAGE_KEYS.KLAGE_VEDTAK_TYPE]: 'not here',
162+
[KLAGE_STORAGE_KEYS.KLAGE_VEDTAK_DATE]: 'not here'
163+
});
164+
const klageStore = new KlageStorage(storage);
165+
klageStore.clear();
166+
167+
expect(storage.getItem('shouldBe')).toBe('still here');
168+
expect(storage.getItem('shouldStill')).toBe('be here');
169+
expect(storage.getItem(KLAGE_STORAGE_KEYS.KLAGE_FRITEKST)).toBeNull();
170+
expect(storage.getItem(KLAGE_STORAGE_KEYS.KLAGE_VEDTAK_TYPE)).toBeNull();
171+
expect(storage.getItem(KLAGE_STORAGE_KEYS.KLAGE_VEDTAK_DATE)).toBeNull();
172+
});
173+
});
174+
175+
class MockStorage implements Storage {
176+
private values: Map<string, string>;
177+
178+
constructor(initialValues: { [name: string]: string } = {}) {
179+
this.values = new Map(Object.entries(initialValues));
180+
}
181+
182+
public getItem(key: string): string | null {
183+
const value = this.values.get(key);
184+
if (typeof value === 'string') {
185+
return value;
186+
}
187+
return null;
188+
}
189+
190+
public setItem(key: string, value: string) {
191+
this.values.set(key, value);
192+
}
193+
194+
public removeItem(key: string): void {
195+
this.values.delete(key);
196+
}
197+
198+
public key(index: number): string | null {
199+
if (index < 0 || index >= this.length) {
200+
return null;
201+
}
202+
const keys = Array.from(this.values.keys());
203+
return keys[index];
204+
}
205+
206+
public clear() {
207+
this.values.clear();
208+
}
209+
210+
get length(): number {
211+
return this.values.size;
212+
}
213+
}

src/klage/klage-store.ts

+59
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
import { ISODate } from '../date/date';
2+
import { Klage, KlageStatus, VedtakType } from './klage';
3+
4+
export enum KLAGE_STORAGE_KEYS {
5+
KLAGE_FRITEKST = 'KLAGE_FRITEKST',
6+
KLAGE_VEDTAK_DATE = 'KLAGE_ISO_DATE',
7+
KLAGE_VEDTAK_TYPE = 'KLAGE_DATE_OPTION'
8+
}
9+
10+
export class KlageStorage {
11+
private storage: Storage;
12+
private keys = Object.values(KLAGE_STORAGE_KEYS);
13+
14+
constructor(storage: Storage) {
15+
this.storage = storage;
16+
}
17+
18+
private setValue(key: KLAGE_STORAGE_KEYS, value: VedtakType | ISODate | string | null) {
19+
if (value === null) {
20+
this.storage.removeItem(key);
21+
} else {
22+
this.storage.setItem(key, value);
23+
}
24+
}
25+
26+
public store(fritekst: string, vedtakType: VedtakType | null, vedtakDate: ISODate | null) {
27+
this.setValue(KLAGE_STORAGE_KEYS.KLAGE_FRITEKST, fritekst);
28+
this.setValue(KLAGE_STORAGE_KEYS.KLAGE_VEDTAK_TYPE, vedtakType);
29+
this.setValue(KLAGE_STORAGE_KEYS.KLAGE_VEDTAK_DATE, vedtakDate);
30+
}
31+
32+
public restore(klage: Klage): Klage {
33+
if (klage.status !== KlageStatus.DRAFT) {
34+
return klage;
35+
}
36+
const fritekst = this.storage.getItem(KLAGE_STORAGE_KEYS.KLAGE_FRITEKST);
37+
const vedtakType = this.storage.getItem(KLAGE_STORAGE_KEYS.KLAGE_VEDTAK_TYPE) as VedtakType | null;
38+
const vedtakDate = this.storage.getItem(KLAGE_STORAGE_KEYS.KLAGE_VEDTAK_DATE) as ISODate | null;
39+
40+
if (
41+
(vedtakType === null || vedtakType === klage.vedtakType) &&
42+
(vedtakDate === null || vedtakDate === klage.vedtakDate) &&
43+
(fritekst === null || fritekst === klage.fritekst)
44+
) {
45+
return klage;
46+
}
47+
48+
return {
49+
...klage,
50+
fritekst: fritekst ?? klage.fritekst,
51+
vedtakType: vedtakType ?? klage.vedtakType,
52+
vedtakDate: vedtakDate ?? klage.vedtakDate
53+
};
54+
}
55+
56+
public clear = () => this.keys.forEach(key => this.storage.removeItem(key));
57+
}
58+
59+
export default new KlageStorage(window.sessionStorage);

0 commit comments

Comments
 (0)