Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

refactor stores #729

Merged
merged 3 commits into from
Jul 20, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
Expand Up @@ -2,42 +2,18 @@
import { packagesStore, searchStore } from "$libs/stores";
import SearchInput from "$components/search-input/search-input.svelte";
import { t } from "$libs/translations";
import { PackageStates } from "$libs/types";
import { PackageStates, type GUIPackage } from "$libs/types";
import PackageResult from "./package-search-result.svelte";

import NoSearchResults from "./no-search-results.svelte";

const { searching, packagesSearch } = searchStore;
// import type { AirtablePost } from '$libs/types';
const { searching } = searchStore;
let packages: GUIPackage[] = [];
let term: string;
// let articles: AirtablePost[] = []; // news, blogs, etc
// let workshops: AirtablePost[] = []; // workshops, course
// let loading = true;

// searchStore.packagesSearch.subscribe((pkgs) => {
// packages = pkgs;
// });
// searchStore.postsSearch.subscribe((posts) => {
// let partialArticles: AirtablePost[] = [];
// let partialWorkshops: AirtablePost[] = [];
// for (let post of posts) {
// if (post.tags.includes('news')) {
// partialArticles.push(post);
// }
// if (post.tags.includes('course') || post.tags.includes('featured_course')) {
// partialWorkshops.push(post);
// }
// }

// articles = partialArticles;
// workshops = partialWorkshops;
// });

// searchStore.searching.subscribe((v) => (loading = v));

const onClose = () => {
term = "";
searchStore.searching.set(false);
searching.set(false);
};
</script>

Expand All @@ -55,7 +31,7 @@
placeholder={$t("store-search-placeholder")}
onSearch={(search) => {
term = search;
searchStore.search(search);
packages = packagesStore.search(search);
}}
/>
<div class="absolute right-4 top-1 flex items-center gap-1 pt-[1px] opacity-50">
Expand All @@ -70,12 +46,12 @@
</header>
{#if term}
<div class="z-20 bg-black">
{#if $packagesSearch.length > 0}
{#if packages.length > 0}
<header class="text-gray p-4 text-lg">
packages ({$packagesSearch.length})
packages ({packages.length})
</header>
<ul class="flex flex-col gap-2 p-2">
{#each $packagesSearch as pkg}
{#each packages as pkg}
<div class={pkg.state === PackageStates.INSTALLING ? "animate-pulse" : ""}>
<PackageResult
{pkg}
Expand All @@ -99,20 +75,6 @@
{:else}
<NoSearchResults />
{/if}
<!-- <header class="text-primary p-4 text-lg">
Top Article Results ({articles.length})
</header>

<header class="text-primary p-4 text-lg">
Top Workshop Results ({workshops.length})
</header>
{#if workshops.length}
<Posts posts={workshops} linkTarget="_blank" />
{:else if loading}
<section class="border-gray h-64 border bg-black p-4">
<Preloader />
</section>
{/if} -->
</div>
{:else}
<div class="flex h-full w-full flex-col justify-center bg-black">
Expand Down
13 changes: 0 additions & 13 deletions svelte/src/libs/native-electron.ts
Original file line number Diff line number Diff line change
Expand Up @@ -75,19 +75,6 @@ export async function getPackages(): Promise<GUIPackage[]> {
});
}

export async function getFeaturedPackages(): Promise<Package[]> {
const packages = await mock.getFeaturedPackages();
return packages;
}

export async function getPackageReviews(full_name: string): Promise<Review[]> {
console.log(`getting reviews for ${full_name}`);
const reviews: Review[] =
(await apiGet<Review[]>(`packages/${full_name.replaceAll("/", ":")}/reviews`)) ?? [];

return reviews;
}

export async function installPackage(pkg: GUIPackage, version?: string) {
const latestVersion = pkg.version;
const specificVersion = version || latestVersion;
Expand Down
44 changes: 0 additions & 44 deletions svelte/src/libs/native-mock.ts
Original file line number Diff line number Diff line change
Expand Up @@ -225,50 +225,6 @@ export async function getPackages(): Promise<GUIPackage[]> {
});
}

export async function getFeaturedPackages(): Promise<Package[]> {
await delay(2000);
return packages.slice(0, 4);
}

export async function getPackageReviews(full_name: string): Promise<Review[]> {
console.log(`generating reviews for ${full_name}`);

const reviewCount = _.random(9, 21);
const reviews: Review[] = [];

for (let i = 0; i < reviewCount; i++) {
const title = loremIpsum({
count: _.random(2, 5),
format: "plain",
paragraphLowerBound: 3,
paragraphUpperBound: 7,
random: Math.random,
sentenceLowerBound: 5,
sentenceUpperBound: 15,
units: "words"
});
const comment = loremIpsum({
count: 2,
format: "plain",
paragraphLowerBound: 3,
paragraphUpperBound: 7,
random: Math.random,
sentenceLowerBound: 5,
sentenceUpperBound: 15,
units: "sentences"
});
const rating = _.random(0, 5);
reviews.push({
title,
comment,
rating
});
}

await delay(2000);
return reviews;
}

export async function installPackage(pkg: GUIPackage, version?: string) {
console.log("installing: ", pkg.full_name, version);
await delay(10000);
Expand Down
126 changes: 3 additions & 123 deletions svelte/src/libs/stores.ts
Original file line number Diff line number Diff line change
@@ -1,140 +1,20 @@
import { writable } from "svelte/store";
import Fuse from "fuse.js";

import type { Package, Review, AirtablePost } from "$libs/types";
import type { GUIPackage } from "$libs/types";
import type { Package } from "$libs/types";

import { getFeaturedPackages, getPackageReviews } from "@native";
import initAuthStore from "./stores/auth";
import initNavStore from "./stores/nav";
import pkgStore from "./stores/pkgs";
import initNotificationStore from "./stores/notifications";
import initAppUpdateStore from "./stores/update";
import { trackSearch } from "./analytics";
import initScrollStore from "./stores/scroll";
import ptysStore from "./stores/ptys";
import pkgStore from "./stores/pkgs";
export * as searchStore from "./stores/search";

export const featuredPackages = writable<Package[]>([]);
export const ptys = ptysStore;
export const packagesStore = pkgStore;

export const initializeFeaturedPackages = async () => {
console.log("intialize featured packages");
const packages = await getFeaturedPackages();
featuredPackages.set(packages);
};

interface PackagesReview {
[full_name: string]: Review[];
}

function initPackagesReviewStore() {
const { update, subscribe } = writable<PackagesReview>({});

let packagesReviews: PackagesReview = {};

subscribe((v) => (packagesReviews = v));

const getSetPackageReviews = async (full_name: string) => {
if (full_name && !packagesReviews[full_name]) {
packagesReviews[full_name] = [];
const reviews = await getPackageReviews(full_name);
update((v) => {
return {
...v,
[full_name]: reviews
};
});
}
};

return {
subscribe: (full_name: string, reset: (reviews: Review[]) => void) => {
getSetPackageReviews(full_name);
return subscribe((value) => {
if (value[full_name]) {
reset(value[full_name]);
}
});
}
};
}

export const packagesReviewStore = initPackagesReviewStore();

function initPosts() {
let initialized = false;
const { subscribe } = writable<AirtablePost[]>([]);
const posts: AirtablePost[] = [];
let postsIndex: Fuse<AirtablePost>;

if (!initialized) {
initialized = true;
// getAllPosts().then(set);
}

subscribe((v) => {
posts.push(...v);
postsIndex = new Fuse(posts, {
keys: ["title", "sub_title", "short_description", "tags"]
});
});

return {
subscribe,
search: async (term: string, limit = 10) => {
const res = postsIndex.search(term, { limit });
const matchingPosts: AirtablePost[] = res.map((v) => v.item);
return matchingPosts;
},
subscribeByTag: (tag: string, cb: (posts: AirtablePost[]) => void) => {
subscribe((newPosts: AirtablePost[]) => {
const filteredPosts = newPosts.filter((post) => post.tags.includes(tag));
cb(filteredPosts);
});
}
};
}
export const postsStore = initPosts();

function initSearchStore() {
const searching = writable<boolean>(false);
const packagesSearch = writable<GUIPackage[]>([]);
const postsSearch = writable<AirtablePost[]>([]);

// TODO:
// should use algolia if user is somehow online

return {
searching,
packagesSearch,
postsSearch,
search: async (term: string) => {
try {
if (term) {
const [
resultPkgs
// resultPosts
] = await Promise.all([
packagesStore.search(term, 5)
// postsStore.search(term, 10)
]);
trackSearch(term, resultPkgs.length);
packagesSearch.set(resultPkgs);
// postsSearch.set(resultPosts);
} else {
packagesSearch.set([]);
// postsSearch.set([]);
}
} catch (error) {
console.error(error);
}
}
};
}

export const searchStore = initSearchStore();

export const authStore = initAuthStore();

export const navStore = initNavStore();
Expand Down
3 changes: 3 additions & 0 deletions svelte/src/libs/stores/search.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
import { writable } from "svelte/store";

export const searching = writable<boolean>(false);
Loading