Skip to content

Commit

Permalink
move thread_store to dixie
Browse files Browse the repository at this point in the history
  • Loading branch information
walteh committed Jul 24, 2024
1 parent 8288872 commit 48b3b7e
Show file tree
Hide file tree
Showing 24 changed files with 312 additions and 271 deletions.
150 changes: 75 additions & 75 deletions .vscode/unthread.me.code-workspace
Original file line number Diff line number Diff line change
@@ -1,77 +1,77 @@
{
"folders": [
{
"name": "root",
"path": "../",
},
{
"name": "terraform",
"path": "../terraform",
}
],
"settings": {
"editor.formatOnSave": true,
"editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.formatOnSaveMode": "file",
"editor.codeActionsOnSave": {
"source.fixAll.eslint": "always",
// "source.organizeImports": "always",
"source.fixAll": "always",
},
"files.associations": {
"tsconfig.*json": "jsonc",
"*.css": "tailwindcss",
},
"typescript.inlayHints.parameterNames.suppressWhenArgumentMatchesName": true,
"editor.detectIndentation": false,
"prettier.requireConfig": true,
"typescript.inlayHints.parameterNames.enabled": "all",
"typescript.inlayHints.variableTypes.enabled": false,
"typescript.inlayHints.propertyDeclarationTypes.enabled": true,
"typescript.tsserver.experimental.enableProjectDiagnostics": true,
"eslint.useESLintClass": true,
"explorer.sortOrder": "type",
"explorer.sortOrderLexicographicOptions": "upper",
"[dotenv]": {
"editor.defaultFormatter": "foxundermoon.shell-format",
},
"gitlens.codeLens.enabled": false,
"workbench.tree.indent": 16,
"yaml.format.enable": true,
"terraform.experimentalFeatures.validateOnSave": true,
"github.copilot.enable": {
"*": true,
"yaml": false,
"plaintext": false,
"markdown": false
},
"[terraform]": {
"editor.defaultFormatter": "hashicorp.terraform",
"editor.formatOnSave": false,
"editor.codeActionsOnSave": {
"source.formatAll.terraform": "always"
},
},
"[terraform-vars]": {
"editor.defaultFormatter": "hashicorp.terraform",
"editor.formatOnSave": false,
"editor.codeActionsOnSave": {
"source.formatAll.terraform": "always"
},
},
"material-icon-theme.folders.associations": {
"dynamo": "database",
"mw": "middleware",
},
"emeraldwalk.runonsave": {
"shell": "bash",
"commands": [
{
"isAsync": true,
"match": "\\.tf$|\\.tfvars$|\\.hcl$|\\.hclvars$",
"cmd": "/opt/homebrew/bin/terraform fmt \"${file}\" && sed -e'':a'' -e's/^\\(\\t*\\) /\\1\\t/;ta' \"${file}\" > \"${file}\"-notab && mv \"${file}\"-notab \"${file}\""
},
]
},
},
"folders": [
{
"name": "root",
"path": "../",
},
{
"name": "terraform",
"path": "../terraform",
},
],
"settings": {
"editor.formatOnSave": true,
"editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.formatOnSaveMode": "file",
"editor.codeActionsOnSave": {
"source.fixAll.eslint": "always",
// "source.organizeImports": "always",
"source.fixAll": "always",
},
"files.associations": {
"tsconfig.*json": "jsonc",
"*.css": "tailwindcss",
},
"typescript.inlayHints.parameterNames.suppressWhenArgumentMatchesName": true,
"editor.detectIndentation": false,
"prettier.requireConfig": true,
"typescript.inlayHints.parameterNames.enabled": "all",
"typescript.inlayHints.variableTypes.enabled": false,
"typescript.inlayHints.propertyDeclarationTypes.enabled": true,
"typescript.tsserver.experimental.enableProjectDiagnostics": true,
"eslint.useESLintClass": true,
"explorer.sortOrder": "type",
"explorer.sortOrderLexicographicOptions": "upper",
"[dotenv]": {
"editor.defaultFormatter": "foxundermoon.shell-format",
},
"gitlens.codeLens.enabled": false,
"workbench.tree.indent": 16,
"yaml.format.enable": true,
"terraform.experimentalFeatures.validateOnSave": true,
"github.copilot.enable": {
"*": true,
"yaml": false,
"plaintext": false,
"markdown": false,
},
"[terraform]": {
"editor.defaultFormatter": "hashicorp.terraform",
"editor.formatOnSave": false,
"editor.codeActionsOnSave": {
"source.formatAll.terraform": "always",
},
},
"[terraform-vars]": {
"editor.defaultFormatter": "hashicorp.terraform",
"editor.formatOnSave": false,
"editor.codeActionsOnSave": {
"source.formatAll.terraform": "always",
},
},
"material-icon-theme.folders.associations": {
"dynamo": "database",
"mw": "middleware",
},
"emeraldwalk.runonsave": {
"shell": "bash",
"commands": [
{
"isAsync": true,
"match": "\\.tf$|\\.tfvars$|\\.hcl$|\\.hclvars$",
"cmd": "/opt/homebrew/bin/terraform fmt \"${file}\" && sed -e'':a'' -e's/^\\(\\t*\\) /\\1\\t/;ta' \"${file}\" > \"${file}\"-notab && mv \"${file}\"-notab \"${file}\"",
},
],
},
},
}
Binary file modified bun.lockb
Binary file not shown.
5 changes: 4 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@
"@types/react-dom": "npm:types-react-dom@rc"
},
"devDependencies": {
"dexie": "^4.0.8",
"dexie-react-hooks": "^1.1.7",
"@headlessui/react": "^2.1.2",
"@react-spring/web": "^9.7.3",
"@tailwindcss/forms": "^0.5.7",
Expand Down Expand Up @@ -66,6 +68,7 @@
"typescript": "^5.5.3",
"ua-parser-js": "^1.0.38",
"vite": "^5.3.4",
"vite-plugin-wasm": "^3.3.0",
"zustand": "^4.5.4"
}
}
}
119 changes: 3 additions & 116 deletions src/client/cache_store.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,42 +3,13 @@ import { create } from "zustand";
import { combine, createJSONStorage, devtools, persist } from "zustand/middleware";

import threadsapi from "@src/threadsapi";
import get_conversation from "@src/threadsapi/get_conversation";
import get_media_insights from "@src/threadsapi/get_media_insights";
import { fetch_user_threads_page, GetUserThreadsParams } from "@src/threadsapi/get_user_threads";

import {
AccessTokenResponse,
BreakdownMetricTypeMap,
ConversationResponse,
SimplifedMediaMetricTypeMap,
SimplifedMetricTypeMap,
ThreadMedia,
UserProfileResponse,
} from "../threadsapi/types";

export interface CachedThreadData {
id: ThreadID;
media: ThreadMedia;
replies: ConversationResponse | null;
insights: SimplifedMediaMetricTypeMap | null;
}

export type ThreadID = `thread_${string}`;

function makeThreadID(id: string): ThreadID {
return `thread_${id}`;
}

function extractThreadID(id: ThreadID): string {
return id.replace(/^thread_/, "");
}
import { AccessTokenResponse, BreakdownMetricTypeMap, SimplifedMetricTypeMap, UserProfileResponse } from "../threadsapi/types";

interface CacheStoreState {
user_profile: UserProfileResponse | null;
user_insights: SimplifedMetricTypeMap | null;
user_follower_demographics: BreakdownMetricTypeMap | null;
user_threads: Record<ThreadID, CachedThreadData>;
user_profile_refreshed_at: number;
}

Expand All @@ -51,66 +22,8 @@ export const cache_store = create(
user_profile: null,
user_insights: null,
user_follower_demographics: null,
user_threads: {},
} as CacheStoreState,
(set, get) => {
const loadThreadsData = async (ky: KyInstance, token: AccessTokenResponse, params?: GetUserThreadsParams) => {
const promises: Promise<void>[] = [];
// let count = 0;
const fetchAllPages = async (cursor?: string): Promise<void> => {
const [response, paging] = await fetch_user_threads_page(ky, token, params, cursor).then((data) => {
set((state) => {
for (const thread of data.data) {
const id = makeThreadID(thread.id);
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
if (!state.user_threads[id]) {
state.user_threads[id] = {
id,
media: thread,
replies: null,
insights: null,
};
} else {
state.user_threads[id].id = id;
state.user_threads[id].media = thread;
}
}
return state;
});

return [data.data.map((thread) => makeThreadID(thread.id)), data.paging] as const;
});

for (const thread of response) {
promises.push(loadThreadRepliesData(ky, token, thread));
promises.push(loadThreadInsightsData(ky, token, thread));
}

if (paging?.cursors.after && !params?.limit) {
await fetchAllPages(paging.cursors.after);
}
};

await fetchAllPages();
await Promise.all(promises);
};
const loadThreadInsightsData = async (ky: KyInstance, token: AccessTokenResponse, id: ThreadID) => {
await get_media_insights(ky, token, extractThreadID(id)).then((data) => {
set((state) => {
state.user_threads[id].insights = data;
return state;
});
});
};
const loadThreadRepliesData = async (ky: KyInstance, token: AccessTokenResponse, id: ThreadID) => {
await get_conversation(ky, token, extractThreadID(id)).then((data) => {
set((state) => {
state.user_threads[id].replies = data;
return state;
});
});
};

(set) => {
const loadUserData = async (ky: KyInstance, token: AccessTokenResponse) => {
const prof = threadsapi.get_user_profile(ky, token).then((data) => {
set(() => ({
Expand Down Expand Up @@ -140,18 +53,6 @@ export const cache_store = create(
return {
loadUserData,

getThreadInsights: (id: ThreadID) => {
return get().user_threads[id].insights;
},

getThreadReplies: (id: ThreadID) => {
return get().user_threads[id].replies;
},

getThreadMedia: (id: ThreadID) => {
return get().user_threads[id].media;
},

clearUserData: () => {
set(() => {
return {
Expand All @@ -161,26 +62,12 @@ export const cache_store = create(
};
});
},

loadThreadsData,

refreshThreadsLast2Days: async (ky: KyInstance, token: AccessTokenResponse) => {
await loadThreadsData(ky, token, { since: `${Math.round((Date.now() - 1000 * 60 * 60 * 24 * 2) / 1000)}` });
},

clearThreads: () => {
set(() => ({
user_threads: {},
user_threads_replies: {},
user_threads_insights: {},
}));
},
};
},
),
{
name: "unthread.me/cache_store",
storage: createJSONStorage(() => localStorage),
storage: createJSONStorage(() => localStorage, {}),
version: 10,
},
),
Expand Down
14 changes: 10 additions & 4 deletions src/client/hooks/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,28 +2,34 @@ import useAccessTokenUpdater from "./useAccessTokenUpdater";
import useBackgroundUpdater from "./useBackgroundUpdater";
import useCacheStore from "./useCacheStore";
import useDimensions from "./useDimensions";
import useFeatureFlagStrore from "./useFeatureFlagStore";
import useFeatureFlagStore from "./useFeatureFlagStore";
import useFeatureFlagUpdater from "./useFeatureFlagUpdater";
import useInsightsByDate from "./useInsightsByDate";
import useMLByDate from "./useMLByDate";
import useModalStore from "./useModalStore";
import useSessionStore from "./useSessionStore";
import useThreadInfo from "./useThreadInfo";
import useThreadInfoListByDateRange from "./useThreadInfoListByDateRange";
import useThreadsListByDate from "./useThreadsListByDate";
import useThreadStore from "./useThreadStore";
import useTimePeriod from "./useTimePeriod";
import useTokenStore from "./useTokenStore";
import useUserInsights from "./useUserInsights";

export default {
useFeatureFlagStrore,
useInsightsByDate,
useTimePeriod,
useTokenStore,
useDimensions,
useThreadStore,
useUserInsights,
useSessionStore,
useModalStore,
useThreadInfo,
useCacheStore,
useFeatureFlagStore,
useMLByDate,
useAccessTokenUpdater,
useBackgroundUpdater,
useFeatureFlagUpdater,
useThreadsListByDate,
useThreadInfoListByDateRange,
};
Loading

0 comments on commit 48b3b7e

Please sign in to comment.