From ba2b19d4c0b3086b378307ebc244d984986f953e Mon Sep 17 00:00:00 2001 From: Nikita Nek Dudnik Date: Wed, 13 May 2020 17:36:02 +0200 Subject: [PATCH] Add missing file --- .../src/pages/SettingsPage/settings.ts | 92 +++++++++++++++++++ 1 file changed, 92 insertions(+) create mode 100644 plugins/circleci/src/pages/SettingsPage/settings.ts diff --git a/plugins/circleci/src/pages/SettingsPage/settings.ts b/plugins/circleci/src/pages/SettingsPage/settings.ts new file mode 100644 index 0000000000..7f29b84f67 --- /dev/null +++ b/plugins/circleci/src/pages/SettingsPage/settings.ts @@ -0,0 +1,92 @@ +/* + * Copyright 2020 Spotify AB + * + * 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. + */ +import { useContext, useEffect } from 'react'; +import { AppContext, STORAGE_KEY } from '../../components/Store'; +import { useApi, errorApiRef } from '@backstage/core'; + +export type SettingsDispatch = { + saveSettings: (settings: SettingsState) => void; +}; + +export type SettingsState = { + token: string; + owner: string; + repo: string; +}; + +// type Effect = { +// type: 'rehydrate', +// payload: any +// }; + +// const effects = []; +// pushEffect, popEffect + +export function useSettings(): [SettingsState, SettingsDispatch] { + const [{ settings }, dispatch] = useContext(AppContext); + + // const interpret = eff => { + // return { + // async rehydrate() {}, + + // }[eff.type](eff.payload) + // } + // useEffect(() => { + // const effectToInterpret = effects[0]; + // removeEffect(0); + // interpret(effectToInterpret) + // },[effects]) + + const errorApi = useApi(errorApiRef); + + const rehydrate = () => { + try { + const stateFromStorage = JSON.parse(sessionStorage.getItem(STORAGE_KEY)!); + if ( + stateFromStorage && + Object.keys(stateFromStorage).some( + (k) => (settings as any)[k] !== stateFromStorage[k], + ) + ) + dispatch({ + type: 'setCredentials', + payload: stateFromStorage, + }); + } catch (error) { + errorApi.post(error); + } + }; + useEffect(() => { + rehydrate(); + }, []); + + const persist = (state: SettingsState) => { + sessionStorage.setItem(STORAGE_KEY, JSON.stringify(state)); + }; + + return [ + settings, + { + saveSettings: (state: SettingsState) => { + persist(state); + dispatch({ + type: 'setCredentials', + payload: state, + }); + }, + }, + ]; +}