aboutsummaryrefslogtreecommitdiff
path: root/lib/vnlib.browser/src/helpers/lastPage.ts
blob: b3c7103185d845dc7e52572498cc8825e45aa932 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
// Copyright (c) 2024 Vaughn Nugent
//
// Permission is hereby granted, free of charge, to any person obtaining a copy of
// this software and associated documentation files (the "Software"), to deal in
// the Software without restriction, including without limitation the rights to
// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
// the Software, and to permit persons to whom the Software is furnished to do so,
// subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

import { defaultTo } from "lodash-es";
import { useRouter } from "vue-router"

export interface ILastPage{
    /**
     * Pushes the current page into the last-page stack
     */
    push(): void;
    /**
    * Stores the current page and navigates to the desired route
    * @param route The route to navigate to
    */
    pushAndNavigate(route: object): void;
    /**
     * Navigates to the last page if it exists
     */
    gotoLastPage(): void;
}

export interface ILastPageStorage {

    /**
     * Pushes the current page into the last-page stack
     */
    push(route: string): void;

    /**
     * Pops the last page from the last-page stack storage
     * @returns {any} The last page route object stored
     */
    pop(): string | null;
}

/**
 * Represents a router-like object that can be used 
 * to navigate to a desired route 
 */
export interface RouterLike{
    currentRoute: {
        value: {
            fullPath: string;
        }
    }
    push(route: object | string): void;
}

const storageKey = "lastPage";

//Storage impl
const defaultStack = (): ILastPageStorage => {
    const storage = sessionStorage;

    const push = (route: string) => {
        //Serialize the route data and store it
        storage?.setItem(storageKey, route);
    }

    const pop = (): string | null => {
        //Get the route data and deserialize it
        const route = storage?.getItem(storageKey);
        if (route) {
            storage?.removeItem(storageKey);
            return route;
        }
        return null;
    }
    return { push, pop }
}

/**
 * Gets the configuration for the last page the user was on 
 * when the page guard was called. This is used to return to the
 * last page after login.
 * @returns { gotoLastPage: Function }
 */
export const useLastPage = (storage?: ILastPageStorage, router?: RouterLike): ILastPage => {
    
    //fallback to default storage
    const _storage = defaultTo(storage, defaultStack());

    //Get the current router instance
    const _router = defaultTo(router, useRouter());

    //Store the current page to the last page stack
    const push = () => _storage.push(_router.currentRoute.value.fullPath);

    const pushAndNavigate = (route: object) => {
        //Store the current page to the last page stack
        push();
        //Navigate to the desired route
        _router.push(route);
    };

    const gotoLastPage = () => {
        //Get the last stored page and navigate to it
        const lp = _storage.pop();
        if (lp) {
            _router.push(lp);
        }
    };

    return { push, pushAndNavigate, gotoLastPage }
}