Skip to content

Commit 239560d

Browse files
committed
feat: add recently scanned
1 parent 2fd7ed8 commit 239560d

File tree

5 files changed

+49
-3
lines changed

5 files changed

+49
-3
lines changed
+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
"use client";
2+
3+
import List from "@/components/List";
4+
import { UserTile } from "@/components/user/UserTile";
5+
import { getHistory, getUserFromQRCode } from "@/utils/utils";
6+
import { useEffect, useState } from "react";
7+
8+
export default function History() {
9+
const [history, setHistory] = useState<string[]>([]);
10+
11+
useEffect(() => {
12+
if (window) {
13+
setHistory(getHistory());
14+
}
15+
}, []);
16+
17+
return !!history.length ? (
18+
<List title="Recently Scanned">
19+
{history
20+
.map(getUserFromQRCode)
21+
.map((u) => u && <UserTile key={u.id} user={u} />)}
22+
</List>
23+
) : (
24+
<></>
25+
);
26+
}

src/app/(authenticated)/qr/page.tsx

+4-2
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import { convertToAppRole, isCompany } from "@/utils/utils";
1111
import Link from "next/link";
1212
import { ScanQrCode } from "lucide-react";
1313
import BlankPageWithMessage from "@/components/BlankPageMessage";
14+
import History from "./History";
1415

1516
export default async function QR() {
1617
const session = await getServerSession(authOptions);
@@ -50,8 +51,8 @@ export default async function QR() {
5051
})();
5152

5253
return (
53-
<div className="container mx-auto flex-1">
54-
<div className="flex flex-col h-full justify-center items-center text-center p-4 gap-y-4">
54+
<div className="container mx-auto flex flex-col">
55+
<div className="flex flex-col h-full justify-center items-center text-center p-4 py-8 gap-y-4">
5556
<div className="flex flex-col justify-center items-center">
5657
<QRCode
5758
className="w-72 h-72 p-4 border-[14px] bg-white rounded-lg"
@@ -85,6 +86,7 @@ export default async function QR() {
8586
</Link>
8687
)}
8788
</div>
89+
<History />
8890
</div>
8991
);
9092
}

src/app/(authenticated)/qr/scan/QRScanner.tsx

+2
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import {
99
getAchievementFromQRCode,
1010
getUserFromQRCode,
1111
isCompany,
12+
pushToHistory,
1213
} from "@/utils/utils";
1314
import { ReactNode, useCallback, useEffect, useRef, useState } from "react";
1415

@@ -50,6 +51,7 @@ export default function QRScanner({ user, cannonToken }: QRScannerProps) {
5051
);
5152
}
5253
}
54+
pushToHistory(data);
5355
} else if (scannedAchievement) {
5456
const redeemedAchievement =
5557
await AchievementService.redeemSecretAchievement(

src/components/user/Notes.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ export default function Notes({ notes, onNotesUpdate }: NotesProps) {
1313
const inputRef = useRef<HTMLTextAreaElement>(null);
1414

1515
return (
16-
<List title="Notes">
16+
<List title="Notes" description="Notes are only visible to you">
1717
<textarea
1818
ref={inputRef}
1919
className="input resize-y min-h-16 max-h-32"

src/utils/utils.ts

+16
Original file line numberDiff line numberDiff line change
@@ -160,3 +160,19 @@ export function getUserActiveSignatureData(user: User, edition: string) {
160160
signatures: Object.values(singatureMap),
161161
};
162162
}
163+
164+
const HISTORY_KEY = "scan-history";
165+
166+
export function pushToHistory(data: string): string[] {
167+
const history = [data, ...getHistory()].slice(0, 20);
168+
localStorage.setItem(HISTORY_KEY, JSON.stringify(history));
169+
return history;
170+
}
171+
172+
export function getHistory(): string[] {
173+
return JSON.parse(localStorage.getItem(HISTORY_KEY) || "[]");
174+
}
175+
176+
export function deleteHistory() {
177+
localStorage.removeItem(HISTORY_KEY);
178+
}

0 commit comments

Comments
 (0)