File size: 1,584 Bytes
6f005bf
b3c3418
6f005bf
 
 
 
 
b3c3418
 
 
 
 
 
 
 
 
 
 
 
 
6f005bf
 
 
 
 
b3c3418
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6f005bf
 
b3c3418
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6f005bf
 
 
 
b3c3418
6f005bf
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
import { PersistedState } from "runed";
import { validateOrganization, type OrganizationInfo } from "$lib/utils/organization.js";

const STORAGE_KEY = "hf_billing_org";

class Billing {
	#organization = new PersistedState(STORAGE_KEY, "");
	#organizationInfo = $state<OrganizationInfo | null>(null);
	#validating = $state(false);

	constructor() {
		$effect.root(() => {
			// Validate organization on initialization if one exists
			$effect(() => {
				if (this.#organization.current) {
					this.validateCurrentOrganization();
				}
			});
		});
	}

	get organization() {
		return this.#organization.current;
	}

	get organizationInfo() {
		return this.#organizationInfo;
	}

	get validating() {
		return this.#validating;
	}

	get displayName() {
		if (!this.#organization.current) return "Personal Account";
		return this.#organizationInfo?.displayName || this.#organization.current;
	}

	get isValid() {
		if (!this.#organization.current) return true; // Personal account is always valid
		return this.#organizationInfo?.isValid ?? false;
	}

	set organization(org: string) {
		this.#organization.current = org;
		this.validateCurrentOrganization();
	}

	private async validateCurrentOrganization() {
		if (!this.#organization.current) {
			this.#organizationInfo = null;
			return;
		}

		this.#validating = true;
		try {
			this.#organizationInfo = await validateOrganization(this.#organization.current);
		} finally {
			this.#validating = false;
		}
	}

	reset = () => {
		this.organization = "";
		this.#organizationInfo = null;
	};
}

export const billing = new Billing();