This commit applies `strictNullChecks` to the entire codebase to improve maintainability and type safety. Key changes include: - Remove some explicit null-checks where unnecessary. - Add necessary null-checks. - Refactor static factory functions for a more functional approach. - Improve some test names and contexts for better debugging. - Add unit tests for any additional logic introduced. - Refactor `createPositionFromRegexFullMatch` to its own function as the logic is reused. - Prefer `find` prefix on functions that may return `undefined` and `get` prefix for those that always return a value.
71 lines
2.0 KiB
TypeScript
71 lines
2.0 KiB
TypeScript
import { shallowRef, shallowReadonly } from 'vue';
|
|
import { IApplicationContext, IReadOnlyApplicationContext } from '@/application/Context/IApplicationContext';
|
|
import { ICategoryCollectionState, IReadOnlyCategoryCollectionState } from '@/application/Context/State/ICategoryCollectionState';
|
|
import { IEventSubscriptionCollection } from '@/infrastructure/Events/IEventSubscriptionCollection';
|
|
|
|
export function useCollectionState(
|
|
context: IApplicationContext,
|
|
events: IEventSubscriptionCollection,
|
|
) {
|
|
const currentState = shallowRef<IReadOnlyCategoryCollectionState>(context.state);
|
|
events.register([
|
|
context.contextChanged.on((event) => {
|
|
currentState.value = event.newState;
|
|
}),
|
|
]);
|
|
|
|
const defaultSettings: IStateCallbackSettings = {
|
|
immediate: false,
|
|
};
|
|
function onStateChange(
|
|
handler: NewStateEventHandler,
|
|
settings: Partial<IStateCallbackSettings> = defaultSettings,
|
|
) {
|
|
events.register([
|
|
context.contextChanged.on((event) => {
|
|
handler(event.newState, event.oldState);
|
|
}),
|
|
]);
|
|
const defaultedSettings: IStateCallbackSettings = {
|
|
...defaultSettings,
|
|
...settings,
|
|
};
|
|
if (defaultedSettings.immediate) {
|
|
handler(context.state, undefined);
|
|
}
|
|
}
|
|
|
|
function modifyCurrentState(mutator: StateModifier) {
|
|
mutator(context.state);
|
|
}
|
|
|
|
function modifyCurrentContext(mutator: ContextModifier) {
|
|
mutator(context);
|
|
}
|
|
|
|
return {
|
|
modifyCurrentState,
|
|
modifyCurrentContext,
|
|
onStateChange,
|
|
currentContext: context as IReadOnlyApplicationContext,
|
|
currentState: shallowReadonly(currentState),
|
|
};
|
|
}
|
|
|
|
export type NewStateEventHandler = (
|
|
newState: IReadOnlyCategoryCollectionState,
|
|
oldState: IReadOnlyCategoryCollectionState | undefined,
|
|
) => void;
|
|
|
|
export interface IStateCallbackSettings {
|
|
readonly immediate: boolean;
|
|
}
|
|
|
|
export type StateModifier = (
|
|
state: ICategoryCollectionState,
|
|
) => void;
|
|
|
|
export type ContextModifier = (
|
|
state: IApplicationContext,
|
|
) => void;
|