@shepai/cli 1.26.0 → 1.28.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/packages/core/src/application/ports/output/index.d.ts +1 -1
- package/dist/packages/core/src/application/ports/output/index.d.ts.map +1 -1
- package/dist/packages/core/src/application/ports/output/services/index.d.ts +1 -0
- package/dist/packages/core/src/application/ports/output/services/index.d.ts.map +1 -1
- package/dist/packages/core/src/application/ports/output/services/notification-service.interface.d.ts +29 -0
- package/dist/packages/core/src/application/ports/output/services/notification-service.interface.d.ts.map +1 -0
- package/dist/packages/core/src/application/ports/output/services/notification-service.interface.js +12 -0
- package/dist/packages/core/src/application/use-cases/features/create/metadata-generator.d.ts +3 -2
- package/dist/packages/core/src/application/use-cases/features/create/metadata-generator.d.ts.map +1 -1
- package/dist/packages/core/src/application/use-cases/features/create/metadata-generator.js +36 -15
- package/dist/packages/core/src/domain/factories/settings-defaults.factory.d.ts.map +1 -1
- package/dist/packages/core/src/domain/factories/settings-defaults.factory.js +13 -0
- package/dist/packages/core/src/domain/generated/output.d.ts +109 -0
- package/dist/packages/core/src/domain/generated/output.d.ts.map +1 -1
- package/dist/packages/core/src/domain/generated/output.js +15 -0
- package/dist/packages/core/src/infrastructure/di/container.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/di/container.js +17 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts +8 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.js +22 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations.js +14 -0
- package/dist/packages/core/src/infrastructure/repositories/sqlite-settings.repository.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/repositories/sqlite-settings.repository.js +17 -3
- package/dist/packages/core/src/infrastructure/services/notifications/desktop-notifier.d.ts +22 -0
- package/dist/packages/core/src/infrastructure/services/notifications/desktop-notifier.d.ts.map +1 -0
- package/dist/packages/core/src/infrastructure/services/notifications/desktop-notifier.js +39 -0
- package/dist/packages/core/src/infrastructure/services/notifications/notification-bus.d.ts +52 -0
- package/dist/packages/core/src/infrastructure/services/notifications/notification-bus.d.ts.map +1 -0
- package/dist/packages/core/src/infrastructure/services/notifications/notification-bus.js +64 -0
- package/dist/packages/core/src/infrastructure/services/notifications/notification-watcher.service.d.ts +60 -0
- package/dist/packages/core/src/infrastructure/services/notifications/notification-watcher.service.d.ts.map +1 -0
- package/dist/packages/core/src/infrastructure/services/notifications/notification-watcher.service.js +225 -0
- package/dist/packages/core/src/infrastructure/services/notifications/notification.service.d.ts +21 -0
- package/dist/packages/core/src/infrastructure/services/notifications/notification.service.d.ts.map +1 -0
- package/dist/packages/core/src/infrastructure/services/notifications/notification.service.js +43 -0
- package/dist/src/presentation/cli/commands/feat/new.command.d.ts.map +1 -1
- package/dist/src/presentation/cli/commands/feat/new.command.js +7 -6
- package/dist/src/presentation/cli/commands/ui.command.d.ts.map +1 -1
- package/dist/src/presentation/cli/commands/ui.command.js +8 -0
- package/dist/src/presentation/web/app/api/agent-events/route.d.ts +14 -0
- package/dist/src/presentation/web/app/api/agent-events/route.d.ts.map +1 -0
- package/dist/src/presentation/web/app/api/agent-events/route.js +77 -0
- package/dist/src/presentation/web/app/api/features/create/route.d.ts.map +1 -1
- package/dist/src/presentation/web/app/api/features/create/route.js +28 -2
- package/dist/src/presentation/web/app/page.d.ts.map +1 -1
- package/dist/src/presentation/web/app/page.js +9 -12
- package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.d.ts +4 -8
- package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.js +37 -4
- package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.stories.d.ts +30 -6
- package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.stories.js +74 -18
- package/dist/src/presentation/web/components/common/feature-create-drawer/index.d.ts +1 -1
- package/dist/src/presentation/web/components/common/feature-create-drawer/index.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-drawer/feature-drawer.js +2 -2
- package/dist/src/presentation/web/components/common/feature-drawer/feature-drawer.stories.js +3 -3
- package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts +5 -2
- package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.js +9 -0
- package/dist/src/presentation/web/components/common/feature-node/feature-node.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-node/feature-node.js +9 -7
- package/dist/src/presentation/web/components/common/feature-node/feature-node.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-node/feature-node.stories.js +3 -0
- package/dist/src/presentation/web/components/common/index.d.ts +1 -1
- package/dist/src/presentation/web/components/common/index.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/index.js +1 -1
- package/dist/src/presentation/web/components/features/control-center/control-center-inner.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/control-center/control-center-inner.js +2 -2
- package/dist/src/presentation/web/components/features/control-center/use-control-center-state.d.ts +3 -2
- package/dist/src/presentation/web/components/features/control-center/use-control-center-state.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/control-center/use-control-center-state.js +4 -12
- package/dist/src/presentation/web/components/layouts/app-shell/app-shell.d.ts.map +1 -1
- package/dist/src/presentation/web/components/layouts/app-shell/app-shell.js +3 -0
- package/dist/src/presentation/web/components/ui/button.d.ts +1 -1
- package/dist/src/presentation/web/components/ui/checkbox-group-item.d.ts +11 -0
- package/dist/src/presentation/web/components/ui/checkbox-group-item.d.ts.map +1 -0
- package/dist/src/presentation/web/components/ui/checkbox-group-item.js +8 -0
- package/dist/src/presentation/web/components/ui/checkbox-group-item.stories.d.ts +17 -0
- package/dist/src/presentation/web/components/ui/checkbox-group-item.stories.d.ts.map +1 -0
- package/dist/src/presentation/web/components/ui/checkbox-group-item.stories.js +33 -0
- package/dist/src/presentation/web/components/ui/checkbox-group.d.ts +21 -0
- package/dist/src/presentation/web/components/ui/checkbox-group.d.ts.map +1 -0
- package/dist/src/presentation/web/components/ui/checkbox-group.js +24 -0
- package/dist/src/presentation/web/components/ui/checkbox-group.stories.d.ts +23 -0
- package/dist/src/presentation/web/components/ui/checkbox-group.stories.d.ts.map +1 -0
- package/dist/src/presentation/web/components/ui/checkbox-group.stories.js +61 -0
- package/dist/src/presentation/web/components/ui/checkbox.d.ts +5 -0
- package/dist/src/presentation/web/components/ui/checkbox.d.ts.map +1 -0
- package/dist/src/presentation/web/components/ui/checkbox.js +9 -0
- package/dist/src/presentation/web/components/ui/checkbox.stories.d.ts +10 -0
- package/dist/src/presentation/web/components/ui/checkbox.stories.d.ts.map +1 -0
- package/dist/src/presentation/web/components/ui/checkbox.stories.js +24 -0
- package/dist/src/presentation/web/hooks/use-agent-events.d.ts +12 -0
- package/dist/src/presentation/web/hooks/use-agent-events.d.ts.map +1 -0
- package/dist/src/presentation/web/hooks/use-agent-events.js +58 -0
- package/dist/src/presentation/web/hooks/use-notifications.d.ts +10 -0
- package/dist/src/presentation/web/hooks/use-notifications.d.ts.map +1 -0
- package/dist/src/presentation/web/hooks/use-notifications.js +57 -0
- package/dist/src/presentation/web/hooks/use-notifications.stories.d.ts +6 -0
- package/dist/src/presentation/web/hooks/use-notifications.stories.d.ts.map +1 -0
- package/dist/src/presentation/web/hooks/use-notifications.stories.js +62 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +3 -1
- package/web/.next/BUILD_ID +1 -1
- package/web/.next/app-path-routes-manifest.json +1 -0
- package/web/.next/build-manifest.json +2 -2
- package/web/.next/cache/.previewinfo +1 -1
- package/web/.next/cache/.rscinfo +1 -1
- package/web/.next/cache/.tsbuildinfo +1 -1
- package/web/.next/cache/config.json +3 -3
- package/web/.next/fallback-build-manifest.json +2 -2
- package/web/.next/prerender-manifest.json +3 -3
- package/web/.next/required-server-files.js +1 -1
- package/web/.next/required-server-files.json +1 -1
- package/web/.next/routes-manifest.json +6 -0
- package/web/.next/server/app/_global-error.html +2 -2
- package/web/.next/server/app/_global-error.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/_not-found.html +2 -2
- package/web/.next/server/app/_not-found.rsc +10 -10
- package/web/.next/server/app/_not-found.segments/_full.segment.rsc +10 -10
- package/web/.next/server/app/_not-found.segments/_head.segment.rsc +3 -3
- package/web/.next/server/app/_not-found.segments/_index.segment.rsc +6 -6
- package/web/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
- package/web/.next/server/app/_not-found.segments/_not-found.segment.rsc +3 -3
- package/web/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/web/.next/server/app/api/agent-events/route/app-paths-manifest.json +3 -0
- package/web/.next/server/app/api/agent-events/route/build-manifest.json +11 -0
- package/web/.next/server/app/api/agent-events/route/server-reference-manifest.json +4 -0
- package/web/.next/server/app/api/agent-events/route.js +6 -0
- package/web/.next/server/app/api/agent-events/route.js.map +5 -0
- package/web/.next/server/app/api/agent-events/route.js.nft.json +1 -0
- package/web/.next/server/app/api/agent-events/route_client-reference-manifest.js +2 -0
- package/web/.next/server/app/api/dialog/pick-files/route.js +3 -2
- package/web/.next/server/app/api/dialog/pick-files/route.js.nft.json +1 -1
- package/web/.next/server/app/api/dialog/pick-folder/route.js +3 -2
- package/web/.next/server/app/api/dialog/pick-folder/route.js.nft.json +1 -1
- package/web/.next/server/app/api/features/create/route.js +3 -2
- package/web/.next/server/app/api/features/create/route.js.nft.json +1 -1
- package/web/.next/server/app/api/ide/open/route.js +4 -2
- package/web/.next/server/app/api/ide/open/route.js.nft.json +1 -1
- package/web/.next/server/app/api/shell/open/route.js +3 -2
- package/web/.next/server/app/api/shell/open/route.js.nft.json +1 -1
- package/web/.next/server/app/page.js +1 -1
- package/web/.next/server/app/page.js.nft.json +1 -1
- package/web/.next/server/app/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/version/page.js.nft.json +1 -1
- package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/version.html +2 -2
- package/web/.next/server/app/version.rsc +5 -5
- package/web/.next/server/app/version.segments/_full.segment.rsc +5 -5
- package/web/.next/server/app/version.segments/_head.segment.rsc +1 -1
- package/web/.next/server/app/version.segments/_index.segment.rsc +4 -4
- package/web/.next/server/app/version.segments/_tree.segment.rsc +2 -2
- package/web/.next/server/app/version.segments/version/__PAGE__.segment.rsc +2 -2
- package/web/.next/server/app/version.segments/version.segment.rsc +1 -1
- package/web/.next/server/app-paths-manifest.json +1 -0
- package/web/.next/server/chunks/403f9_next_567de315._.js +17 -0
- package/web/.next/server/chunks/403f9_next_567de315._.js.map +1 -0
- package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_12059e3e.js +3 -0
- package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_12059e3e.js.map +1 -0
- package/web/.next/server/chunks/744ca_web__next-internal_server_app_api_agent-events_route_actions_686edb08.js +3 -0
- package/web/.next/server/chunks/744ca_web__next-internal_server_app_api_agent-events_route_actions_686edb08.js.map +1 -0
- package/web/.next/server/chunks/[root-of-the-server]__4e987cf3._.js +8 -0
- package/web/.next/server/chunks/[root-of-the-server]__4e987cf3._.js.map +1 -0
- package/web/.next/server/chunks/[root-of-the-server]__57104a4c._.js +7 -0
- package/web/.next/server/chunks/[root-of-the-server]__57104a4c._.js.map +1 -0
- package/web/.next/server/chunks/{[root-of-the-server]__602cce1b._.js → [root-of-the-server]__61349adc._.js} +2 -2
- package/web/.next/server/chunks/{[root-of-the-server]__bb4fc5b5._.js → [root-of-the-server]__a6bf88cc._.js} +2 -2
- package/web/.next/server/chunks/[root-of-the-server]__aa2074ca._.js +3 -0
- package/web/.next/server/chunks/[root-of-the-server]__aa2074ca._.js.map +1 -0
- package/web/.next/server/chunks/{[root-of-the-server]__1913013c._.js → [root-of-the-server]__ec87d735._.js} +2 -2
- package/web/.next/server/chunks/[root-of-the-server]__ecaf05bc._.js +3 -0
- package/web/.next/server/chunks/[root-of-the-server]__ecaf05bc._.js.map +1 -0
- package/web/.next/server/chunks/ssr/403f9_next_dist_esm_build_templates_app-page_dbf21e04.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__80e5bed2._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__f12b60be._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__fa87595c._.js +1 -1
- package/web/.next/server/chunks/ssr/_09afa42a._.js +6 -1
- package/web/.next/server/chunks/ssr/_09afa42a._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_884ddade._.js +1 -1
- package/web/.next/server/chunks/ssr/_a4189414._.js +10 -0
- package/web/.next/server/chunks/ssr/_a4189414._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_c5d377cc._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_ed0934e5._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_ed0934e5._.js.map +1 -1
- package/web/.next/server/pages/404.html +2 -2
- package/web/.next/server/pages/500.html +2 -2
- package/web/.next/server/server-reference-manifest.js +1 -1
- package/web/.next/server/server-reference-manifest.json +1 -1
- package/web/.next/static/chunks/1d665ddc2230f73f.js +5 -0
- package/web/.next/static/chunks/{c2854b6c6d0ca1f3.js → 28c05929f2636c01.js} +7 -2
- package/web/.next/static/chunks/a7273c84449394e0.css +2 -0
- package/web/.next/static/chunks/b32b17f102226f32.js +1 -0
- package/web/.next/trace +1 -1
- package/web/.next/trace-build +1 -1
- package/web/.next/types/link.d.ts +1 -0
- package/web/.next/types/routes.d.ts +2 -1
- package/web/.next/types/validator.ts +9 -0
- package/web/.next/server/chunks/[root-of-the-server]__56ac1509._.js +0 -3
- package/web/.next/server/chunks/[root-of-the-server]__56ac1509._.js.map +0 -1
- package/web/.next/server/chunks/[root-of-the-server]__ba6c5641._.js +0 -21
- package/web/.next/server/chunks/[root-of-the-server]__ba6c5641._.js.map +0 -1
- package/web/.next/server/chunks/[root-of-the-server]__eaa478b7._.js +0 -8
- package/web/.next/server/chunks/[root-of-the-server]__eaa478b7._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_1c3962d7._.js +0 -10
- package/web/.next/server/chunks/ssr/_1c3962d7._.js.map +0 -1
- package/web/.next/static/chunks/78ef4acb26e4d6ea.js +0 -1
- package/web/.next/static/chunks/79009d1ca0d944d2.js +0 -5
- package/web/.next/static/chunks/86ff2b6444e06e88.css +0 -2
- /package/web/.next/server/chunks/{[root-of-the-server]__602cce1b._.js.map → [root-of-the-server]__61349adc._.js.map} +0 -0
- /package/web/.next/server/chunks/{[root-of-the-server]__bb4fc5b5._.js.map → [root-of-the-server]__a6bf88cc._.js.map} +0 -0
- /package/web/.next/server/chunks/{[root-of-the-server]__1913013c._.js.map → [root-of-the-server]__ec87d735._.js.map} +0 -0
- /package/web/.next/static/{_6j6GS-S6zPiASj5tsxJ8 → wymVMk3X_cTuoYKeS0Gbf}/_buildManifest.js +0 -0
- /package/web/.next/static/{_6j6GS-S6zPiASj5tsxJ8 → wymVMk3X_cTuoYKeS0Gbf}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/static/{_6j6GS-S6zPiASj5tsxJ8 → wymVMk3X_cTuoYKeS0Gbf}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export interface UseNotificationsOptions {
|
|
2
|
+
browserEnabled?: boolean;
|
|
3
|
+
runId?: string;
|
|
4
|
+
}
|
|
5
|
+
export interface UseNotificationsResult {
|
|
6
|
+
requestBrowserPermission: () => Promise<void>;
|
|
7
|
+
browserPermissionState: NotificationPermission;
|
|
8
|
+
}
|
|
9
|
+
export declare function useNotifications(options?: UseNotificationsOptions): UseNotificationsResult;
|
|
10
|
+
//# sourceMappingURL=use-notifications.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-notifications.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/web/hooks/use-notifications.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,uBAAuB;IACtC,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,sBAAsB;IACrC,wBAAwB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9C,sBAAsB,EAAE,sBAAsB,CAAC;CAChD;AAqBD,wBAAgB,gBAAgB,CAAC,OAAO,CAAC,EAAE,uBAAuB,GAAG,sBAAsB,CAyC1F"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { useCallback, useEffect, useRef, useState } from 'react';
|
|
3
|
+
import { toast } from 'sonner';
|
|
4
|
+
import { NotificationSeverity } from '../../../../packages/core/src/domain/generated/output.js';
|
|
5
|
+
import { useAgentEvents } from './use-agent-events.js';
|
|
6
|
+
const SEVERITY_TO_TOAST = {
|
|
7
|
+
[NotificationSeverity.Success]: 'success',
|
|
8
|
+
[NotificationSeverity.Error]: 'error',
|
|
9
|
+
[NotificationSeverity.Warning]: 'warning',
|
|
10
|
+
[NotificationSeverity.Info]: 'info',
|
|
11
|
+
};
|
|
12
|
+
function dispatchToast(event) {
|
|
13
|
+
const method = SEVERITY_TO_TOAST[event.severity] ?? 'info';
|
|
14
|
+
toast[method](event.featureName, { description: event.message });
|
|
15
|
+
}
|
|
16
|
+
function dispatchBrowserNotification(event) {
|
|
17
|
+
if (globalThis.Notification?.permission !== 'granted') {
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
new Notification(event.featureName, { body: event.message });
|
|
21
|
+
}
|
|
22
|
+
export function useNotifications(options) {
|
|
23
|
+
const browserEnabled = options?.browserEnabled ?? false;
|
|
24
|
+
const { lastEvent } = useAgentEvents({ runId: options?.runId });
|
|
25
|
+
const [browserPermissionState, setBrowserPermissionState] = useState(() => {
|
|
26
|
+
if (typeof globalThis.Notification === 'undefined')
|
|
27
|
+
return 'default';
|
|
28
|
+
return globalThis.Notification.permission;
|
|
29
|
+
});
|
|
30
|
+
// Track which events we've already dispatched to avoid re-dispatching on re-render
|
|
31
|
+
const processedRef = useRef(new Set());
|
|
32
|
+
useEffect(() => {
|
|
33
|
+
if (!lastEvent)
|
|
34
|
+
return;
|
|
35
|
+
// Create a key for deduplication
|
|
36
|
+
const key = `${lastEvent.agentRunId}-${lastEvent.eventType}-${lastEvent.timestamp}`;
|
|
37
|
+
if (processedRef.current.has(key))
|
|
38
|
+
return;
|
|
39
|
+
processedRef.current.add(key);
|
|
40
|
+
// Always dispatch toast
|
|
41
|
+
dispatchToast(lastEvent);
|
|
42
|
+
// Dispatch browser notification if enabled and permitted
|
|
43
|
+
if (browserEnabled) {
|
|
44
|
+
dispatchBrowserNotification(lastEvent);
|
|
45
|
+
}
|
|
46
|
+
}, [lastEvent, browserEnabled]);
|
|
47
|
+
const requestBrowserPermission = useCallback(async () => {
|
|
48
|
+
if (typeof globalThis.Notification === 'undefined')
|
|
49
|
+
return;
|
|
50
|
+
const result = await globalThis.Notification.requestPermission();
|
|
51
|
+
setBrowserPermissionState(result);
|
|
52
|
+
}, []);
|
|
53
|
+
return {
|
|
54
|
+
requestBrowserPermission,
|
|
55
|
+
browserPermissionState,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-notifications.stories.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/web/hooks/use-notifications.stories.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAwIvD,QAAA,MAAM,IAAI,EAAE,IAcX,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC;AAEtB,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { useState } from 'react';
|
|
3
|
+
import { toast } from 'sonner';
|
|
4
|
+
import { Toaster } from '../components/ui/sonner.js';
|
|
5
|
+
import { Button } from '../components/ui/button.js';
|
|
6
|
+
function simulateNotification(event) {
|
|
7
|
+
const method = event.severity ?? 'info';
|
|
8
|
+
toast[method](event.featureName, { description: event.message });
|
|
9
|
+
if (globalThis.Notification?.permission === 'granted') {
|
|
10
|
+
new Notification(event.featureName, { body: event.message });
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
function NotificationDemo() {
|
|
14
|
+
const [browserPermission, setBrowserPermission] = useState(typeof globalThis.Notification !== 'undefined' ? globalThis.Notification.permission : 'default');
|
|
15
|
+
const requestPermission = async () => {
|
|
16
|
+
if (typeof globalThis.Notification === 'undefined')
|
|
17
|
+
return;
|
|
18
|
+
const result = await globalThis.Notification.requestPermission();
|
|
19
|
+
setBrowserPermission(result);
|
|
20
|
+
};
|
|
21
|
+
return (_jsxs("div", { className: "flex w-[420px] flex-col gap-6", children: [_jsxs("div", { className: "flex flex-col gap-2", children: [_jsx("h3", { className: "text-sm font-semibold", children: "Browser Notification Permission" }), _jsxs("div", { className: "flex items-center gap-3", children: [_jsxs("span", { className: "text-muted-foreground text-sm", children: ["Status: ", _jsx("code", { className: "bg-muted rounded px-1.5 py-0.5", children: browserPermission })] }), _jsx(Button, { size: "sm", variant: "outline", onClick: requestPermission, children: "Request Permission" })] })] }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx("h3", { className: "text-sm font-semibold", children: "Simulate Notification Events" }), _jsx("p", { className: "text-muted-foreground text-xs", children: "Click a button to fire a toast and browser notification." }), _jsxs("div", { className: "flex flex-wrap gap-2", children: [_jsx(Button, { size: "sm", variant: "outline", onClick: () => simulateNotification({
|
|
22
|
+
eventType: 'agent_started',
|
|
23
|
+
severity: 'info',
|
|
24
|
+
featureName: 'Auth Module',
|
|
25
|
+
message: 'Agent started running',
|
|
26
|
+
}), children: "Agent Started" }), _jsx(Button, { size: "sm", variant: "outline", onClick: () => simulateNotification({
|
|
27
|
+
eventType: 'phase_completed',
|
|
28
|
+
severity: 'info',
|
|
29
|
+
featureName: 'Auth Module',
|
|
30
|
+
message: 'Completed analyze phase',
|
|
31
|
+
phaseName: 'analyze',
|
|
32
|
+
}), children: "Phase Completed" }), _jsx(Button, { size: "sm", variant: "secondary", onClick: () => simulateNotification({
|
|
33
|
+
eventType: 'waiting_approval',
|
|
34
|
+
severity: 'warning',
|
|
35
|
+
featureName: 'Auth Module',
|
|
36
|
+
message: 'Waiting for user approval',
|
|
37
|
+
}), children: "Waiting Approval" }), _jsx(Button, { size: "sm", onClick: () => simulateNotification({
|
|
38
|
+
eventType: 'agent_completed',
|
|
39
|
+
severity: 'success',
|
|
40
|
+
featureName: 'Auth Module',
|
|
41
|
+
message: 'Agent completed successfully',
|
|
42
|
+
}), children: "Agent Completed" }), _jsx(Button, { size: "sm", variant: "destructive", onClick: () => simulateNotification({
|
|
43
|
+
eventType: 'agent_failed',
|
|
44
|
+
severity: 'error',
|
|
45
|
+
featureName: 'Auth Module',
|
|
46
|
+
message: 'Agent failed: token refresh error',
|
|
47
|
+
}), children: "Agent Failed" })] })] })] }));
|
|
48
|
+
}
|
|
49
|
+
const meta = {
|
|
50
|
+
title: 'Hooks/useNotifications',
|
|
51
|
+
parameters: {
|
|
52
|
+
layout: 'centered',
|
|
53
|
+
},
|
|
54
|
+
tags: ['autodocs'],
|
|
55
|
+
decorators: [
|
|
56
|
+
(Story) => (_jsxs(_Fragment, { children: [_jsx(Story, {}), _jsx(Toaster, {})] })),
|
|
57
|
+
],
|
|
58
|
+
};
|
|
59
|
+
export default meta;
|
|
60
|
+
export const Default = {
|
|
61
|
+
render: () => _jsx(NotificationDemo, {}),
|
|
62
|
+
};
|