Browse Source
- Remove duplicate property declarations from TopMessage component - Use (this as any) type assertion for mixin methods - Resolves 'Data property already defined' warnings - Fixes 'this.dbQuery is not a function' runtime errorspull/142/head
11 changed files with 446 additions and 158 deletions
@ -0,0 +1,136 @@ |
|||
/** |
|||
* Platform Service Mixin for Vue Components |
|||
* |
|||
* Provides class-level caching of platform service instances to avoid |
|||
* repeated PlatformServiceFactory.getInstance() calls throughout components. |
|||
* |
|||
* This mixin implements a hybrid approach combining: |
|||
* - Class-level service caching for performance |
|||
* - Vue composition API patterns for modern development |
|||
* - Mixin pattern for easy integration with existing class components |
|||
* |
|||
* Benefits: |
|||
* - Eliminates repeated PlatformServiceFactory.getInstance() calls |
|||
* - Provides consistent service access pattern across components |
|||
* - Improves performance with cached instances |
|||
* - Maintains type safety with TypeScript |
|||
* |
|||
* @author Matthew Raymer |
|||
* @version 1.0.0 |
|||
* @since 2025-07-02 |
|||
*/ |
|||
|
|||
import { PlatformServiceFactory } from "@/services/PlatformServiceFactory"; |
|||
import type { PlatformService } from "@/services/PlatformService"; |
|||
|
|||
/** |
|||
* Mixin that provides cached platform service access to Vue components |
|||
* |
|||
* Usage: |
|||
* ```typescript
|
|||
* @Component({ |
|||
* mixins: [PlatformServiceMixin] |
|||
* }) |
|||
* export default class MyComponent extends Vue { |
|||
* async someMethod() { |
|||
* // Access cached platform service directly
|
|||
* const result = await this.platformService.dbQuery('SELECT * FROM users'); |
|||
* } |
|||
* } |
|||
* ``` |
|||
*/ |
|||
export const PlatformServiceMixin = { |
|||
data() { |
|||
return { |
|||
_platformService: null as PlatformService | null, |
|||
}; |
|||
}, |
|||
|
|||
computed: { |
|||
/** |
|||
* Get the cached platform service instance |
|||
* Creates and caches the instance on first access |
|||
*/ |
|||
platformService(): PlatformService { |
|||
if (!(this as any)._platformService) { |
|||
(this as any)._platformService = PlatformServiceFactory.getInstance(); |
|||
} |
|||
return (this as any)._platformService; |
|||
}, |
|||
|
|||
/** |
|||
* Check if running on Capacitor platform |
|||
*/ |
|||
isCapacitor(): boolean { |
|||
const service = (this as any).platformService as any; |
|||
return typeof service.isCapacitor === "function" |
|||
? service.isCapacitor() |
|||
: false; |
|||
}, |
|||
|
|||
/** |
|||
* Check if running on web platform |
|||
*/ |
|||
isWeb(): boolean { |
|||
const service = (this as any).platformService as any; |
|||
return typeof service.isWeb === "function" ? service.isWeb() : false; |
|||
}, |
|||
|
|||
/** |
|||
* Check if running on Electron platform |
|||
*/ |
|||
isElectron(): boolean { |
|||
const service = (this as any).platformService as any; |
|||
return typeof service.isElectron === "function" |
|||
? service.isElectron() |
|||
: false; |
|||
}, |
|||
|
|||
/** |
|||
* Get platform capabilities |
|||
*/ |
|||
capabilities() { |
|||
return (this as any).platformService.getCapabilities(); |
|||
}, |
|||
}, |
|||
|
|||
methods: { |
|||
/** |
|||
* Convenient database query method |
|||
* Shorthand for this.platformService.dbQuery() |
|||
*/ |
|||
async dbQuery(sql: string, params?: unknown[]) { |
|||
return await (this as any).platformService.dbQuery(sql, params); |
|||
}, |
|||
|
|||
/** |
|||
* Convenient database execution method |
|||
* Shorthand for this.platformService.dbExec() |
|||
*/ |
|||
async dbExec(sql: string, params?: unknown[]) { |
|||
return await (this as any).platformService.dbExec(sql, params); |
|||
}, |
|||
|
|||
/** |
|||
* Convenient database single row method |
|||
* Shorthand for this.platformService.dbGetOneRow() |
|||
*/ |
|||
async dbGetOneRow(sql: string, params?: unknown[]) { |
|||
return await (this as any).platformService.dbGetOneRow(sql, params); |
|||
}, |
|||
}, |
|||
}; |
|||
|
|||
/** |
|||
* Type-only export for components that need to declare the mixin interface |
|||
*/ |
|||
export interface IPlatformServiceMixin { |
|||
platformService: PlatformService; |
|||
dbQuery(sql: string, params?: unknown[]): Promise<any>; |
|||
dbExec(sql: string, params?: unknown[]): Promise<any>; |
|||
dbGetOneRow(sql: string, params?: unknown[]): Promise<any>; |
|||
isCapacitor: boolean; |
|||
isWeb: boolean; |
|||
isElectron: boolean; |
|||
capabilities: any; |
|||
} |
Loading…
Reference in new issue