diff --git a/apps/browser/src/background/main.background.ts b/apps/browser/src/background/main.background.ts index 2c111a20525..00c2ba7a7fb 100644 --- a/apps/browser/src/background/main.background.ts +++ b/apps/browser/src/background/main.background.ts @@ -61,7 +61,6 @@ import { FolderApiService } from "@bitwarden/common/services/folder/folder-api.s import { KeyConnectorService } from "@bitwarden/common/services/keyConnector.service"; import { MemoryStorageService } from "@bitwarden/common/services/memoryStorage.service"; import { NotificationsService } from "@bitwarden/common/services/notifications.service"; -import { OrganizationService } from "@bitwarden/common/services/organization/organization.service"; import { PasswordGenerationService } from "@bitwarden/common/services/passwordGeneration.service"; import { PolicyApiService } from "@bitwarden/common/services/policy/policy-api.service"; import { ProviderService } from "@bitwarden/common/services/provider.service"; @@ -92,6 +91,7 @@ import { BrowserStateService as StateServiceAbstraction } from "../services/abst import AutofillService from "../services/autofill.service"; import { BrowserEnvironmentService } from "../services/browser-environment.service"; import { BrowserFolderService } from "../services/browser-folder.service"; +import { BrowserOrganizationService } from "../services/browser-organization.service"; import { BrowserPolicyService } from "../services/browser-policy.service"; import { BrowserStateService } from "../services/browser-state.service"; import { BrowserCryptoService } from "../services/browserCrypto.service"; @@ -317,7 +317,10 @@ export default class MainBackground { this.stateService ); this.syncNotifierService = new SyncNotifierService(); - this.organizationService = new OrganizationService(this.stateService, this.syncNotifierService); + this.organizationService = new BrowserOrganizationService( + this.stateService, + this.syncNotifierService + ); this.policyService = new BrowserPolicyService(this.stateService, this.organizationService); this.policyApiService = new PolicyApiService( this.policyService, diff --git a/apps/browser/src/popup/services/services.module.ts b/apps/browser/src/popup/services/services.module.ts index 25f939af53b..41dabd9e166 100644 --- a/apps/browser/src/popup/services/services.module.ts +++ b/apps/browser/src/popup/services/services.module.ts @@ -37,10 +37,14 @@ import { ProviderService } from "@bitwarden/common/abstractions/provider.service import { SearchService as SearchServiceAbstraction } from "@bitwarden/common/abstractions/search.service"; import { SendService } from "@bitwarden/common/abstractions/send.service"; import { SettingsService } from "@bitwarden/common/abstractions/settings.service"; -import { StateService as BaseStateServiceAbstraction } from "@bitwarden/common/abstractions/state.service"; +import { + StateService as BaseStateServiceAbstraction, + StateService, +} from "@bitwarden/common/abstractions/state.service"; import { StateMigrationService } from "@bitwarden/common/abstractions/stateMigration.service"; import { AbstractStorageService } from "@bitwarden/common/abstractions/storage.service"; import { SyncService } from "@bitwarden/common/abstractions/sync/sync.service.abstraction"; +import { SyncNotifierService } from "@bitwarden/common/abstractions/sync/syncNotifier.service.abstraction"; import { TokenService } from "@bitwarden/common/abstractions/token.service"; import { TotpService } from "@bitwarden/common/abstractions/totp.service"; import { TwoFactorService } from "@bitwarden/common/abstractions/twoFactor.service"; @@ -61,6 +65,7 @@ import { Account } from "../../models/account"; import { AutofillService } from "../../services/abstractions/autofill.service"; import { BrowserStateService as StateServiceAbstraction } from "../../services/abstractions/browser-state.service"; import { BrowserEnvironmentService } from "../../services/browser-environment.service"; +import { BrowserOrganizationService } from "../../services/browser-organization.service"; import { BrowserPolicyService } from "../../services/browser-policy.service"; import { BrowserStateService } from "../../services/browser-state.service"; import { BrowserFileDownloadService } from "../../services/browserFileDownloadService"; @@ -272,8 +277,10 @@ function getBgService(service: keyof MainBackground) { { provide: PasswordRepromptServiceAbstraction, useClass: PasswordRepromptService }, { provide: OrganizationService, - useFactory: getBgService("organizationService"), - deps: [], + useFactory: (stateService: StateService, syncNotifierService: SyncNotifierService) => { + return new BrowserOrganizationService(stateService, syncNotifierService); + }, + deps: [StateService, SyncNotifierService], }, { provide: VaultFilterService, diff --git a/apps/browser/src/services/browser-organization.service.ts b/apps/browser/src/services/browser-organization.service.ts new file mode 100644 index 00000000000..63f2848e2e8 --- /dev/null +++ b/apps/browser/src/services/browser-organization.service.ts @@ -0,0 +1,12 @@ +import { BehaviorSubject } from "rxjs"; + +import { Organization } from "@bitwarden/common/models/domain/organization"; +import { OrganizationService } from "@bitwarden/common/services/organization/organization.service"; + +import { browserSession, sessionSync } from "../decorators/session-sync-observable"; + +@browserSession +export class BrowserOrganizationService extends OrganizationService { + @sessionSync({ initializer: Organization.fromJSON, initializeAs: "array" }) + protected _organizations: BehaviorSubject; +} diff --git a/libs/common/src/models/domain/organization.ts b/libs/common/src/models/domain/organization.ts index faf1ee1f978..e8a580c9602 100644 --- a/libs/common/src/models/domain/organization.ts +++ b/libs/common/src/models/domain/organization.ts @@ -1,3 +1,5 @@ +import { Jsonify } from "type-fest"; + import { OrganizationUserStatusType } from "../../enums/organizationUserStatusType"; import { OrganizationUserType } from "../../enums/organizationUserType"; import { ProductType } from "../../enums/productType"; @@ -201,4 +203,11 @@ export class Organization { get hasProvider() { return this.providerId != null || this.providerName != null; } + + static fromJSON(json: Jsonify) { + return Object.assign(new Organization(), json, { + familySponsorshipLastSyncDate: new Date(json.familySponsorshipLastSyncDate), + familySponsorshipValidUntil: new Date(json.familySponsorshipValidUntil), + }); + } } diff --git a/libs/common/src/services/organization/organization.service.ts b/libs/common/src/services/organization/organization.service.ts index 101069adadc..090e0143c66 100644 --- a/libs/common/src/services/organization/organization.service.ts +++ b/libs/common/src/services/organization/organization.service.ts @@ -8,7 +8,7 @@ import { Organization } from "../../models/domain/organization"; import { isSuccessfullyCompleted } from "../../types/syncEventArgs"; export class OrganizationService implements OrganizationServiceAbstraction { - private _organizations = new BehaviorSubject([]); + protected _organizations = new BehaviorSubject([]); organizations$ = this._organizations.asObservable();