diff --git a/src/Bones.UI/core/composableFactory.ts b/src/Bones.UI/core/composableFactory.ts index 9a3f90c..f671d33 100644 --- a/src/Bones.UI/core/composableFactory.ts +++ b/src/Bones.UI/core/composableFactory.ts @@ -1,4 +1,4 @@ -import { Ref, onUnmounted, ref, computed, computed } from "vue"; +import { Ref, onUnmounted, ref, computed } from "vue"; import { FilterFactory } from "./filterFactory"; import { INotifyService } from "../abstractions"; @@ -54,6 +54,28 @@ export class ComposableFactory { } + public static subscribe(service: INotifyService) { + return () => { + let subscribersIds: number[] = []; + + onUnmounted(() => { + subscribersIds.forEach(id => service.unsubscribe(id)); + subscribersIds = []; + }); + + const subscribe: INotifyService["subscribe"] = (ev: any, callback: any) => { + const subscriberId = service.subscribe(ev, callback); + subscribersIds.push(subscriberId); + return subscriberId; + } + + return { + subscribe + } + } + } + + public static customGet(service: INotifyService, method: (...args: TArgs) => Promise, applyFactory?: () => (entity: Ref) => void) { return () => { const apply = applyFactory ? applyFactory() : () => { }; diff --git a/tests/Bones.UI.Tests/services/testUserService.ts b/tests/Bones.UI.Tests/services/testUserService.ts index 71e8032..81ae916 100644 --- a/tests/Bones.UI.Tests/services/testUserService.ts +++ b/tests/Bones.UI.Tests/services/testUserService.ts @@ -23,13 +23,13 @@ const AccountLoginFactory = new ServiceFactory(testUserServiceFactory); export const useTestUserTrack = ComposableFactory.trackRef(testUserServiceFactory); -// export const useTestUserSubscribe = ComposableFactory.subscribe(testUserServiceFactory); +export const useTestUserSubscribe = ComposableFactory.subscribe(testUserServiceFactory); -// const { subscribe } = useTestUserSubscribe(); +const { subscribe } = useTestUserSubscribe(); -// subscribe("add", (ev, payload) => { -// console.log(ev, payload); -// }); +subscribe("delete", (ev, payload) => { + console.log(ev, payload); +}); export const useLogin = ComposableFactory.custom(AccountLoginFactory.login, () => { const { sync } = useTestUsersSync();