Chrome.storage + Jotai 세팅하기
2023. 1. 25. 00:15ㆍ개발 잡부/Chrome Extension
728x90
1. jotai를 설치한다.
npm i jotai
2. 최상위 파일에 Provider를 추가해준다.
import { Provider } from "jotai";
...
root.render(
<React.StrictMode>
<Provider>
<WeeklySheet />
</Provider>
</React.StrictMode>
);
3. useLocalStorage 추가
useLocalStorage는 크롬에서 제공하는 로컬 저장소를 이용할 때 사용할 것이다.
// useLocalStorage.tsx
/// <reference types="chrome"/>
import { useAtom } from "jotai";
import { useEffect } from "react";
import { stampRecordAtom } from "../atoms/stampRecord";
export const useLocalStorage = () => {
const [_, setStampRecord] = useAtom(stampRecordAtom);
useEffect(() => {
chrome.storage.local.get(["stampRecord"], ({ stampRecord }) => {
setStampRecord(JSON.parse(stampRecord ?? "{}"));
});
}, []);
const setLocalStorage = (key: string, value: any) => {
chrome.storage.local.set({ [key]: value });
};
return { setLocalStorage };
};
4. Atom 생성
Atom이란 Jotai에서 관리하는 상태를 부른 말이다.
아래 예제를 참고하여 자신만의 Atom을 만들자
import { atom } from "jotai";
export interface StampRecord {
id: number;
type: number;
createdAt: string;
}
export const stampRecordAtom = atom<{ [key: string]: StampRecord[] }>({});
5. 실제 사용 예시
import { useAtom } from "jotai";
import { StampRecord, stampRecordAtom } from "../atoms/stampRecord";
import { useLocalStorage } from "../hooks/useLocalStorage";
const WeeklySheet = () => {
const [stampRecord, setStampRecord] = useAtom(stampRecordAtom);
const { setLocalStorage } = useLocalStorage();
const handleClick = () => {
const today = dayjs().format("YYYYMMDD");
const newStampRecord = {
...stampRecord,
[today]: [
...(stampRecord[today] ?? []),
{ id: 0, type: 0, createdAt: dayjs().format("YYYY-MM-DD HH:mm:ss") },
],
};
setLocalStorage("stampRecord", JSON.stringify(newStampRecord));
setStampRecord(() => newStampRecord);
};
...
보면 매번 업데이트가 일어날 때마다 Atom과 localStorage가 업데이트 되고 있다.
이것도 어떻게 일괄적으로 처리하면 좋을텐데 나중에 고민해보겠다.
'개발 잡부 > Chrome Extension' 카테고리의 다른 글
항목을 게시하려면 먼저 연락이 가능한 이메일을 확인해야합니다. 계정탭에서 확인 과정을 시작하세요 (0) | 2023.02.05 |
---|---|
Trouble Shooting - Chrome Extension : Uncaught EvalError: Refused to evaluate a string as JavaScript because 'unsafe-eval'... (0) | 2023.01.25 |
chrome에 빨간줄 뜰 때 해결 방법 (0) | 2023.01.25 |
Chrome Extension 프로젝트 세팅 (React, Typescript, Webpack) (0) | 2023.01.15 |
크롬 익스텐션 생성에서 실행까지 (0) | 2021.11.12 |