mirror of
https://github.com/pybricks/pybricks-code.git
synced 2026-09-14 10:35:11 +00:00
Also fix all errors, which can lead to subtile bugs. Mostly fixings deps and refactoring to make typescript happy.
46 lines
1.6 KiB
TypeScript
46 lines
1.6 KiB
TypeScript
// SPDX-License-Identifier: MIT
|
|
// Copyright (c) 2022 The Pybricks Authors
|
|
|
|
import { useEffect } from 'react';
|
|
import { useEffectOnce, useLocalStorage, useSessionStorage } from 'usehooks-ts';
|
|
|
|
/** Indicates the selected activity. */
|
|
export enum Activity {
|
|
/** No activity is selected. */
|
|
None = 'activity.none',
|
|
/** The explorer activity is selected. */
|
|
Explorer = 'activity.explorer',
|
|
/** The settings activity is selected. */
|
|
Settings = 'activity.settings',
|
|
}
|
|
|
|
/**
|
|
* React hook for getting and setting the selected activity in the activity panel.
|
|
* @returns a tuple of the current state and the setter function (like useState()).
|
|
*/
|
|
export function useActivitiesSelectedActivity(): ReturnType<
|
|
typeof useSessionStorage<Activity>
|
|
> {
|
|
// If multiple windows are open, this allows each window to control the
|
|
// current activity independently. The local storage uses a "last one wins"
|
|
// approach to deciding which state to restore when a window is opened.
|
|
const [lastSelectedActivity, setLastSelectedActivity] = useLocalStorage(
|
|
'activities.selectedActivity',
|
|
Activity.Explorer,
|
|
);
|
|
|
|
const [selectedActivity, setSelectedActivity] = useSessionStorage(
|
|
'activities.selectedActivity',
|
|
lastSelectedActivity,
|
|
);
|
|
|
|
// Force writing to session storage since default value is not constant.
|
|
useEffectOnce(() => setSelectedActivity(selectedActivity));
|
|
|
|
useEffect(() => {
|
|
setLastSelectedActivity(selectedActivity);
|
|
}, [selectedActivity, setLastSelectedActivity]);
|
|
|
|
return [selectedActivity, setSelectedActivity];
|
|
}
|