From f749eb1df8a01f2513ae4b1a55804336457f95a1 Mon Sep 17 00:00:00 2001 From: James Grugett Date: Mon, 4 Apr 2022 22:28:38 -0500 Subject: [PATCH] Log views of contracts in feed --- common/view.ts | 4 ++++ firestore.rules | 4 ++++ web/components/feed/contract-activity.tsx | 1 + web/components/feed/feed-items.tsx | 5 +++-- web/hooks/use-seen-contracts.ts | 9 +++++++-- web/lib/firebase/views.ts | 16 ++++++++++++++++ 6 files changed, 35 insertions(+), 4 deletions(-) create mode 100644 common/view.ts create mode 100644 web/lib/firebase/views.ts diff --git a/common/view.ts b/common/view.ts new file mode 100644 index 00000000..7355bf89 --- /dev/null +++ b/common/view.ts @@ -0,0 +1,4 @@ +export type View = { + contractId: string + timestamp: number +} diff --git a/firestore.rules b/firestore.rules index 8c419b01..099aa51d 100644 --- a/firestore.rules +++ b/firestore.rules @@ -22,6 +22,10 @@ service cloud.firestore { allow read: if resource.data.id == request.auth.uid || isAdmin(); } + match /private-users/{userId}/views/{viewId} { + allow create: if userId == request.auth.uid; + } + match /contracts/{contractId} { allow read; allow update: if request.resource.data.diff(resource.data).affectedKeys() diff --git a/web/components/feed/contract-activity.tsx b/web/components/feed/contract-activity.tsx index 9c60e26b..a0d25f0b 100644 --- a/web/components/feed/contract-activity.tsx +++ b/web/components/feed/contract-activity.tsx @@ -47,6 +47,7 @@ export function ContractActivity(props: { return ( diff --git a/web/components/feed/feed-items.tsx b/web/components/feed/feed-items.tsx index f9f9225d..abb181ce 100644 --- a/web/components/feed/feed-items.tsx +++ b/web/components/feed/feed-items.tsx @@ -52,14 +52,15 @@ import { Modal } from '../layout/modal' export function FeedItems(props: { contract: Contract + user: User | null | undefined items: ActivityItem[] betRowClassName?: string }) { - const { contract, items, betRowClassName } = props + const { contract, user, items, betRowClassName } = props const { outcomeType } = contract const ref = useRef(null) - useSaveSeenContract(ref, contract) + useSaveSeenContract(ref, contract, user) return (
diff --git a/web/hooks/use-seen-contracts.ts b/web/hooks/use-seen-contracts.ts index 0cda7a67..68e4c71d 100644 --- a/web/hooks/use-seen-contracts.ts +++ b/web/hooks/use-seen-contracts.ts @@ -1,6 +1,8 @@ import _ from 'lodash' import { useEffect, RefObject, useState } from 'react' import { Contract } from '../../common/contract' +import { User } from '../../common/user' +import { logView } from '../lib/firebase/views' import { useIsVisible } from './use-is-visible' export const useSeenContracts = () => { @@ -17,7 +19,8 @@ export const useSeenContracts = () => { export const useSaveSeenContract = ( ref: RefObject, - contract: Contract + contract: Contract, + user: User | null | undefined ) => { const isVisible = useIsVisible(ref) @@ -28,8 +31,10 @@ export const useSaveSeenContract = ( [contract.id]: Date.now(), } localStorage.setItem(key, JSON.stringify(newSeenContracts)) + + if (user) logView(user.id, contract.id) } - }, [isVisible, contract]) + }, [isVisible, contract, user]) } const key = 'feed-seen-contracts' diff --git a/web/lib/firebase/views.ts b/web/lib/firebase/views.ts new file mode 100644 index 00000000..af110b6b --- /dev/null +++ b/web/lib/firebase/views.ts @@ -0,0 +1,16 @@ +import { doc, collection, setDoc } from 'firebase/firestore' +import _ from 'lodash' + +import { db } from './init' +import { View } from '../../../common/view' + +export async function logView(userId: string, contractId: string) { + const ref = doc(collection(db, 'private-users', userId, 'views')) + + const view: View = { + contractId, + timestamp: Date.now(), + } + + return await setDoc(ref, view) +}