ghost-keychain/packages/extension-ui/src/components/Toast/ToastProvider.tsx
Tarik Gul b6d42c28b5
Transition from manifest v2 to v3 for chrome (#1367)
* Update manifest.json

* replace `extension.getUrl` to `runtime.getUrl`

* Update localStorage to async chrome.storage.local

* Change action to browserAction

* fix bug

* revert async changes

* revert test change

* Fix localStorage breaking change

* .extension -> .runtime

* fix undefined behaviour

* fixed tests

* lint

* Up some callbacks to async

* Change where extractMetadata is called

* fix  in mock

* Update background field to take in type

* Change background.js to service_worker.js

* Update id and request origin for service worker

* updated chrome mock

* 13 tests passing

* Fix async issue

* switch naming back to original

* linting

* Fix linting in base

* remove timeOut

* added permission to alarms in manifest

* fixed alarms uncaught errors

* Cleanup addr for tests

---------

Co-authored-by: bee344 <alberto.penayo@parity.io>
2024-07-07 22:32:42 -04:00

63 lines
1.6 KiB
TypeScript

// Copyright 2019-2024 @polkadot/extension-ui authors & contributors
// SPDX-License-Identifier: Apache-2.0
/* global chrome */
import React, { useCallback, useEffect, useState } from 'react';
import { ToastContext } from '../index.js';
import Toast from './Toast.js';
interface ToastProviderProps {
children?: React.ReactNode;
}
const TOAST_TIMEOUT = 1500;
const ALARM_NAME = 'toastAlarm';
const ToastProvider = ({ children }: ToastProviderProps): React.ReactElement<ToastProviderProps> => {
const [content, setContent] = useState('');
const [visible, setVisible] = useState(false);
useEffect(() => {
const createAlarm = async () => {
try {
await chrome.alarms.create(ALARM_NAME, { delayInMinutes: TOAST_TIMEOUT / 60000 });
chrome.alarms.onAlarm.addListener((alarm) => {
if (alarm.name === ALARM_NAME) {
setVisible(false);
}
});
} catch (error) {
console.error('Error creating the alarm:', error);
throw error;
}
};
createAlarm().then(async () => {
return await chrome.alarms.clear(ALARM_NAME);
}).catch((error) => console.error('Error clearing the alarm: ', error));
}, []);
const show = useCallback((message: string): (() => void) => {
setContent(message);
setVisible(true);
return (): void => setVisible(false);
}, []);
return (
<ToastContext.Provider value={{ show }}>
{children}
<Toast
content={content}
visible={visible}
/>
</ToastContext.Provider>
);
};
export default ToastProvider;
ToastProvider.displayName = 'Toast';