feat: turbostarter boilerplate
Production-ready Next.js boilerplate with: - Runtime env validation (fail-fast on missing vars) - Feature-gated config (S3, Stripe, email, OAuth) - Docker + Coolify deployment pipeline - PostgreSQL + pgvector, MinIO S3, Better Auth - TypeScript strict mode (no ignoreBuildErrors) - i18n (en/es), AI modules, billing, monitoring Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,69 @@
|
||||
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
|
||||
/* eslint-disable @typescript-eslint/no-unsafe-call */
|
||||
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
||||
// @ts-nocheck
|
||||
import analytics from "@react-native-firebase/analytics";
|
||||
import { useGlobalSearchParams, usePathname } from "expo-router";
|
||||
import { useEffect } from "react";
|
||||
|
||||
import { useTrackingPermissions } from "../../hooks";
|
||||
|
||||
import type { AnalyticsProviderClientStrategy } from "@turbostarter/analytics";
|
||||
|
||||
const setup = async () => {
|
||||
await analytics().setAnalyticsCollectionEnabled(true);
|
||||
await analytics().setConsent({
|
||||
analytics_storage: true,
|
||||
ad_storage: true,
|
||||
ad_user_data: true,
|
||||
ad_personalization: true,
|
||||
});
|
||||
};
|
||||
|
||||
const useSetup = () => {
|
||||
const granted = useTrackingPermissions();
|
||||
const pathname = usePathname();
|
||||
const params = useGlobalSearchParams();
|
||||
|
||||
useEffect(() => {
|
||||
if (!granted) {
|
||||
return;
|
||||
}
|
||||
|
||||
void setup();
|
||||
}, [granted]);
|
||||
|
||||
useEffect(() => {
|
||||
if (!granted) {
|
||||
return;
|
||||
}
|
||||
|
||||
void analytics().logScreenView({
|
||||
screen_name: pathname,
|
||||
screen_class: pathname,
|
||||
params,
|
||||
});
|
||||
}, [pathname, params, granted]);
|
||||
};
|
||||
|
||||
export const { Provider, track, identify, reset } = {
|
||||
Provider: ({ children }) => {
|
||||
useSetup();
|
||||
|
||||
return children;
|
||||
},
|
||||
track: (name, params) => {
|
||||
void analytics().logEvent(name, params);
|
||||
},
|
||||
identify: (userId, traits) => {
|
||||
void analytics().setUserId(userId);
|
||||
|
||||
if (traits) {
|
||||
void analytics().setUserProperties(traits);
|
||||
}
|
||||
},
|
||||
reset: () => {
|
||||
void analytics().setUserId(null);
|
||||
void analytics().setUserProperties({});
|
||||
},
|
||||
} satisfies AnalyticsProviderClientStrategy;
|
||||
Reference in New Issue
Block a user