* wip: custom roadmap renderer * wip: custom roadmap events * wip: roadmap content * wip: svg styles * wip: custom roadmap progress * Render progress * Shortcut progress * Progress Tracking styles * wip: edit and share button * fix: disabled the share button * wip: content links rendering * Fix progress share * Replace disabled with `canShare` * wip: show custom roadmaps * wip: users all roadmaps * fix: create roadmap api * chore: roadmap sidebar icon * wip: content links * Update links color * Create roadmap home * Create Roadmap button * Roadmap type * chore: share progress modal * wip: share roadmap * wip: change visibility * chore: custom roadmap progress in activity * wip: custom roadmap share progress * chore: friend's roadmap * wip: custom roadmap skeleton * chore: roadmap title * Restricted Page * fix: skeleton loading width * Fix create roadmap button * chore: remove user id * chore: pick roadmap and share * chore: open new tab on create roadmap * chore: change share title * chore: use team id from params * chore: team roadmap create modal * chore: create team roadmap * chore: custom roadmap modal * chore: placeholde roadmaps * chore: roadmap hint * chore: visibility label * chore: public roadmap * chore: empty screen * chore: team progress * chore: create roadmap responsive * chore: form error * chore: multi user history * wip: manage custom roadmap * chore: empty roadmap list * chore: custom roadmap visit * chore: shared roadmaps * chore: shared roadmaps * chore: empty screen and topic title * chore: show progress bar * Implement Error in topic details * Add Modal close button * fix: link groups * Refactor roadmap creation * Refactor roadmap creation * Refactor team creation * Refactor team roadmaps * Refactor team creation roadmap selection * Refactor * Refactor team roadmap loading * Refactor team roadmaps * Refactor team roadmaps listing * Refactor Account dropdown * Updates * Refactor Account dropdown * Fix Team name overflow * Change Icon color * Update team dropdown * Minor UI fixes * Fix minor UI * Flicker fix in team dropdown * Roadmap action dropdown with responsiveness * Team roadmaps listing * Update team settings * Team roadmaps listing * fix: remove visibility change * Update roadmap options modal * Add dummy renderer * Add renderer script * Add generate renderer script * Add generate renderer * wip: add share settings * Update * Update UI * Update Minor UI * Fix team issue * Update Personal roadmaps UI * Add Roadmap Secret * Update teams type * Rearrange sections * Change Secret name * Add action button on roadmap detail page --------- Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
84 lines
2.4 KiB
TypeScript
84 lines
2.4 KiB
TypeScript
import { useStore } from '@nanostores/react';
|
|
import { $toastMessage } from '../stores/toast';
|
|
import { useEffect } from 'react';
|
|
import { CheckIcon } from './ReactIcons/CheckIcon';
|
|
import { ErrorIcon } from './ReactIcons/ErrorIcon';
|
|
import { WarningIcon } from './ReactIcons/WarningIcon';
|
|
import { InfoIcon } from './ReactIcons/InfoIcon';
|
|
import { Spinner } from './ReactIcons/Spinner';
|
|
import { deleteUrlParam, getUrlParams, setUrlParams } from '../lib/browser';
|
|
|
|
export interface Props {}
|
|
|
|
const messageCodes: Record<string, string> = {
|
|
tl: 'Successfully left the team',
|
|
fs: 'Friend request sent',
|
|
fa: 'Friend request accepted',
|
|
};
|
|
|
|
export function Toaster(props: Props) {
|
|
const toastMessage = useStore($toastMessage);
|
|
|
|
const { c } = getUrlParams();
|
|
if (c) {
|
|
deleteUrlParam('c');
|
|
|
|
if (messageCodes[c]) {
|
|
$toastMessage.set({ type: 'success', message: messageCodes[c] });
|
|
}
|
|
}
|
|
|
|
useEffect(() => {
|
|
if (toastMessage === undefined) {
|
|
return;
|
|
}
|
|
|
|
const removeMessage = setTimeout(() => {
|
|
if (toastMessage?.type !== 'loading') {
|
|
$toastMessage.set(undefined);
|
|
}
|
|
}, 2500);
|
|
|
|
return () => {
|
|
clearTimeout(removeMessage);
|
|
};
|
|
}, [toastMessage]);
|
|
|
|
if (!toastMessage) {
|
|
return null;
|
|
}
|
|
|
|
return (
|
|
<div
|
|
onClick={() => {
|
|
$toastMessage.set(undefined);
|
|
}}
|
|
className={`fixed bottom-5 left-1/2 z-[9999] min-w-[375px] max-w-[375px] animate-fade-slide-up sm:min-w-[auto]`}
|
|
>
|
|
<div
|
|
className={`flex -translate-x-1/2 transform cursor-pointer items-center gap-2 rounded-md border border-gray-200 bg-white py-3 pl-4 pr-5 text-black shadow-md hover:bg-gray-50`}
|
|
>
|
|
{toastMessage.type === 'success' && (
|
|
<CheckIcon additionalClasses="h-5 w-5 shrink-0 relative top-[0.5px] text-green-500" />
|
|
)}
|
|
|
|
{toastMessage.type === 'error' && (
|
|
<ErrorIcon additionalClasses="h-5 w-5 shrink-0 relative top-[0.5px] text-red-500" />
|
|
)}
|
|
|
|
{toastMessage.type === 'warning' && (
|
|
<WarningIcon additionalClasses="h-5 w-5 shrink-0 relative top-[0.5px] text-orange-500" />
|
|
)}
|
|
|
|
{toastMessage.type === 'info' && (
|
|
<InfoIcon additionalClasses="h-5 w-5 shrink-0 relative top-[0.5px] text-blue-500" />
|
|
)}
|
|
|
|
{toastMessage.type === 'loading' && <Spinner isDualRing={false} />}
|
|
|
|
<span className="flex-grow text-base">{toastMessage.message}</span>
|
|
</div>
|
|
</div>
|
|
);
|
|
}
|