diff --git a/mobile/package.json b/mobile/package.json index 85eb4f2..caefd6b 100644 --- a/mobile/package.json +++ b/mobile/package.json @@ -17,6 +17,7 @@ "dependencies": { "@bytelyst/api-client": "*", "@bytelyst/auth-client": "*", + "@bytelyst/billing-client": "*", "@bytelyst/blob-client": "*", "@bytelyst/broadcast-client": "*", "@bytelyst/design-tokens": "*", @@ -25,6 +26,7 @@ "@bytelyst/feedback-client": "*", "@bytelyst/kill-switch-client": "*", "@bytelyst/offline-queue": "*", + "@bytelyst/platform-client": "*", "@bytelyst/survey-client": "*", "@bytelyst/telemetry-client": "*", "expo": "~55.0.4", diff --git a/mobile/src/lib/billing-client.ts b/mobile/src/lib/billing-client.ts new file mode 100644 index 0000000..3755a9c --- /dev/null +++ b/mobile/src/lib/billing-client.ts @@ -0,0 +1,20 @@ +import { createBillingClient, type BillingClient } from '@bytelyst/billing-client'; +import { API_CONFIG, PRODUCT_ID } from '../api/config'; +import { mmkvStorage } from '../store/mmkv-storage'; + +function getAccessToken(): string | null { + return mmkvStorage.getItem(`${PRODUCT_ID}_access_token`); +} + +let _client: BillingClient | null = null; + +export function getBillingClient(): BillingClient { + if (!_client) { + _client = createBillingClient({ + baseUrl: API_CONFIG.platformBaseUrl, + productId: PRODUCT_ID, + getAccessToken, + }); + } + return _client; +} diff --git a/mobile/src/lib/platform-api.ts b/mobile/src/lib/platform-api.ts new file mode 100644 index 0000000..cb2379d --- /dev/null +++ b/mobile/src/lib/platform-api.ts @@ -0,0 +1,54 @@ +import { createPlatformClient, type PlatformClient } from '@bytelyst/platform-client'; +import { API_CONFIG, PRODUCT_ID } from '../api/config'; +import { mmkvStorage } from '../store/mmkv-storage'; + +function getAccessToken(): string | null { + return mmkvStorage.getItem(`${PRODUCT_ID}_access_token`); +} + +let _client: PlatformClient | null = null; + +function getClient(): PlatformClient { + if (!_client) { + _client = createPlatformClient({ + baseUrl: API_CONFIG.platformBaseUrl, + productId: PRODUCT_ID, + getAccessToken, + }); + } + return _client; +} + +export interface UserSettings { + theme?: 'dark' | 'light' | 'system'; + language?: string; + notificationsEnabled?: boolean; + [key: string]: unknown; +} + +export interface ActiveSession { + id: string; + deviceName: string; + lastActiveAt: string; + isCurrent: boolean; +} + +export async function getUserSettings(): Promise { + return getClient().get('/settings'); +} + +export async function updateUserSettings(settings: Partial): Promise { + return getClient().put('/settings', settings); +} + +export async function listSessions(): Promise { + return getClient().get('/sessions'); +} + +export async function revokeSession(sessionId: string): Promise { + await getClient().del(`/sessions/${sessionId}`); +} + +export async function updateProfile(updates: { displayName?: string }): Promise { + await getClient().put('/auth/profile', updates); +} diff --git a/web/package.json b/web/package.json index da3d284..0fab40c 100644 --- a/web/package.json +++ b/web/package.json @@ -15,6 +15,7 @@ }, "dependencies": { "@bytelyst/api-client": "*", + "@bytelyst/billing-client": "*", "@bytelyst/design-tokens": "*", "@bytelyst/blob-client": "*", "@bytelyst/diagnostics-client": "*", diff --git a/web/src/lib/billing-client.ts b/web/src/lib/billing-client.ts new file mode 100644 index 0000000..8b78634 --- /dev/null +++ b/web/src/lib/billing-client.ts @@ -0,0 +1,18 @@ +"use client"; + +import { createBillingClient, type BillingClient } from "@bytelyst/billing-client"; +import { PLATFORM_SERVICE_URL, PRODUCT_ID } from "@/lib/product-config"; +import { getAccessToken } from "@/lib/api-helpers"; + +let _client: BillingClient | null = null; + +export function getBillingClient(): BillingClient { + if (!_client) { + _client = createBillingClient({ + baseUrl: PLATFORM_SERVICE_URL, + productId: PRODUCT_ID, + getAccessToken, + }); + } + return _client; +}