forked from jsnbuchanan/crowd-funder-for-time-pwa
Fix Vue property conflicts in PlatformServiceMixin implementation
- 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 errors
This commit is contained in:
136
src/utils/PlatformServiceMixin.ts
Normal file
136
src/utils/PlatformServiceMixin.ts
Normal file
@@ -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;
|
||||
}
|
||||
Reference in New Issue
Block a user