* 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>
63 lines
1.6 KiB
TypeScript
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';
|