Skip to content

Commit b643027

Browse files
committed
feat(theming): redesign facade api
1 parent c5cc163 commit b643027

3 files changed

Lines changed: 26 additions & 37 deletions

File tree

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,21 @@
11
import { ProviderToken } from '@angular/core';
2+
import { map, Observable, of } from 'rxjs';
23

34
import { ThemeBuilder, ThemeBuilderConfigOf } from './builder';
45

56
export interface ThemeBuilderComposition {
7+
name: string;
68
builder: ProviderToken<ThemeBuilder<any>>;
79
config: unknown;
810
}
911

1012
export const withThemeBuilder = <Builder extends ThemeBuilder<any>>(
13+
name: string,
1114
builder: ProviderToken<Builder>,
12-
config: ThemeBuilderConfigOf<Builder>,
13-
): ThemeBuilderComposition => ({
14-
builder,
15-
config,
16-
});
15+
config:
16+
| ThemeBuilderConfigOf<Builder>
17+
| Observable<ThemeBuilderConfigOf<Builder>>,
18+
): Observable<ThemeBuilderComposition> => {
19+
const config$ = config instanceof Observable ? config : of(config);
20+
return config$.pipe(map((config) => ({ name, builder, config })));
21+
};

packages/theming/src/manager.ts

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,11 @@ export class ThemeManager {
88
protected injector = inject(Injector);
99
protected tokens = inject(ThemeTokenRegistry);
1010

11-
build(config: ThemeBuildConfig): ThemeTokens {
11+
build(compositions: ThemeBuilderComposition[]): ThemeTokens {
1212
const tokens: ThemeTokens = {};
13-
for (const [name, composition] of Object.entries(config)) {
14-
const { builder: token, config } = composition;
15-
const builder = this.injector.get(token);
13+
for (const composition of compositions) {
14+
const { name, builder: builderToken, config } = composition;
15+
const builder = this.injector.get(builderToken);
1616
const result = builder.build({ name, config });
1717
Object.assign(tokens, result);
1818
}
@@ -22,13 +22,4 @@ export class ThemeManager {
2222
apply(tokens: ThemeTokens): void {
2323
for (const name in tokens) this.tokens.set(name, tokens[name]);
2424
}
25-
26-
buildAndApply(config: ThemeBuildConfig): void {
27-
const tokens = this.build(config);
28-
this.apply(tokens);
29-
}
30-
}
31-
32-
export interface ThemeBuildConfig {
33-
[name: string]: ThemeBuilderComposition;
3425
}

packages/theming/src/provide.ts

Lines changed: 12 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -6,33 +6,26 @@ import {
66
} from '@angular/core';
77
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
88
import { provideMulti } from '@angularity/core';
9-
import { from, ObservableInput, of } from 'rxjs';
9+
import { combineLatest, Observable } from 'rxjs';
1010

11-
import { ThemeBuildConfig, ThemeManager } from './manager';
12-
13-
/**
14-
* Invoked within an injection context.
15-
*/
16-
export interface ThemeBuildConfigFactory {
17-
(): ObservableInput<ThemeBuildConfig>;
18-
}
11+
import { ThemeBuilderComposition } from './builder-composition';
12+
import { ThemeManager } from './manager';
1913

2014
export function provideTheme(
21-
configInput: ThemeBuildConfig | ThemeBuildConfigFactory,
15+
...compositions: Observable<ThemeBuilderComposition>[]
2216
): EnvironmentProviders {
2317
return makeEnvironmentProviders([
2418
provideMulti({
2519
token: ENVIRONMENT_INITIALIZER,
26-
useFactory: (themeManager = inject(ThemeManager)) => {
27-
const configSource =
28-
typeof configInput === 'function' ? configInput() : of(configInput);
29-
return () =>
30-
from(configSource)
20+
useFactory:
21+
(manager = inject(ThemeManager)) =>
22+
() =>
23+
combineLatest(compositions)
3124
.pipe(takeUntilDestroyed())
32-
.subscribe((config) => {
33-
themeManager.buildAndApply(config);
34-
});
35-
},
25+
.subscribe((compositions) => {
26+
const tokens = manager.build(compositions);
27+
manager.apply(tokens);
28+
}),
3629
}),
3730
]);
3831
}

0 commit comments

Comments
 (0)