Skip to content

Commit

Permalink
feat: adding router state persistence (#104)
Browse files Browse the repository at this point in the history
* feat: adding router state persistence

Signed-off-by: axel7083 <[email protected]>

* fix: tests

Signed-off-by: axel7083 <[email protected]>

* fix: linter

Signed-off-by: axel7083 <[email protected]>

* fix: prettier

Signed-off-by: axel7083 <[email protected]>

* fix: revert + using state management

Signed-off-by: axel7083 <[email protected]>

* fix: moving model file to frontend package

Signed-off-by: axel7083 <[email protected]>

---------

Signed-off-by: axel7083 <[email protected]>
  • Loading branch information
axel7083 authored Jan 22, 2024
1 parent 4696e3f commit ffad087
Show file tree
Hide file tree
Showing 4 changed files with 56 additions and 2 deletions.
15 changes: 13 additions & 2 deletions packages/frontend/src/App.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,24 @@ import Preferences from '/@/pages/Preferences.svelte';
import Registries from '/@/pages/Registries.svelte';
import Models from '/@/pages/Models.svelte';
import Recipe from '/@/pages/Recipe.svelte';
import Model from './pages/Model.svelte';
import Model from './pages/Model.svelte';
import { onMount } from 'svelte';
import { getRouterState } from '/@/utils/client';
router.mode.hash();
let isMounted = false;
onMount(() => {
// Load router state on application startup
const state = getRouterState();
router.goto(state.url);
isMounted = true;
});
</script>


<Route path="/*" breadcrumb="Home" let:meta>
<Route path="/*" breadcrumb="Home" isAppMounted="{isMounted}" let:meta>
<main class="flex flex-col w-screen h-screen overflow-hidden bg-charcoal-700">
<div class="flex flex-row w-full h-full overflow-hidden">
<Navigation meta="{meta}"/>
Expand Down
7 changes: 7 additions & 0 deletions packages/frontend/src/Route.svelte
Original file line number Diff line number Diff line change
@@ -1,13 +1,16 @@
<script lang="ts">
import { createRouteObject } from 'tinro/dist/tinro_lib';
import type { TinroRouteMeta } from 'tinro';
import { saveRouterState, studioClient } from '/@/utils/client';
export let path = '/*';
export let fallback = false;
export let redirect = false;
export let firstmatch = false;
export let breadcrumb: string | undefined = undefined;
export let isAppMounted: boolean = false;
let showContent = false;
let params: Record<string, string> = {};
let meta: TinroRouteMeta = {} as TinroRouteMeta;
Expand All @@ -23,6 +26,10 @@ const route = createRouteObject({
onMeta(newMeta: TinroRouteMeta) {
meta = newMeta;
params = meta.params;
if(isAppMounted) {
saveRouterState({url: newMeta.url});
}
},
});
Expand Down
21 changes: 21 additions & 0 deletions packages/frontend/src/models/IRouterState.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
/**********************************************************************
* Copyright (C) 2024 Red Hat, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* SPDX-License-Identifier: Apache-2.0
***********************************************************************/

export interface RouterState {
url: string;
}
15 changes: 15 additions & 0 deletions packages/frontend/src/utils/client.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,23 @@
import type { StudioAPI } from '@shared/src/StudioAPI';
import { RpcBrowser } from '@shared/src/messages/MessageProxy';
import type { RouterState } from '/@/models/IRouterState';

export const RECENT_CATEGORY_ID = 'recent-category';
const podmanDesktopApi = acquirePodmanDesktopApi();
export const rpcBrowser: RpcBrowser = new RpcBrowser(window, podmanDesktopApi);

export const studioClient: StudioAPI = rpcBrowser.getProxy<StudioAPI>();

export const saveRouterState = (state: RouterState) => {
podmanDesktopApi.setState(state);
};

const isRouterState = (value: unknown): value is RouterState => {
return typeof value === 'object' && !!value && 'url' in value;
};

export const getRouterState = (): RouterState => {
const state = podmanDesktopApi.getState();
if (isRouterState(state)) return state;
return { url: '/' };
};

0 comments on commit ffad087

Please sign in to comment.