From 16a0ae696f98b9798c99a70165e54b25b681112e Mon Sep 17 00:00:00 2001 From: Michael Fatemi Date: Tue, 13 Jul 2021 13:29:13 -0400 Subject: [PATCH] add carpoolprovider --- package.json | 2 + src/components/Carpool/CarpoolProvider.tsx | 72 ++++++++++++++++++++++ src/components/api.ts | 4 +- yarn.lock | 17 +++++ 4 files changed, 93 insertions(+), 2 deletions(-) create mode 100644 src/components/Carpool/CarpoolProvider.tsx diff --git a/package.json b/package.json index 9bb6ccb..1dfa54a 100644 --- a/package.json +++ b/package.json @@ -8,11 +8,13 @@ "@testing-library/jest-dom": "^5.11.4", "@testing-library/react": "^11.1.0", "@testing-library/user-event": "^12.1.10", + "@types/immutable": "^3.8.7", "@types/node": "^14.14.37", "@types/react": "^17.0.3", "@types/react-dom": "^17.0.9", "@types/react-router-dom": "^5.1.7", "dotenv": "^8.2.0", + "immutable": "^4.0.0-rc.14", "react": "^17.0.2", "react-bootstrap": "^1.5.2", "react-dom": "^17.0.2", diff --git a/src/components/Carpool/CarpoolProvider.tsx b/src/components/Carpool/CarpoolProvider.tsx new file mode 100644 index 0000000..8e11b4f --- /dev/null +++ b/src/components/Carpool/CarpoolProvider.tsx @@ -0,0 +1,72 @@ +import { createContext, ReactNode, useMemo, useState } from 'react'; +import * as immutable from 'immutable'; +import { useEffect } from 'react'; +import { getCarpool } from '../api'; + +class Member extends immutable.Record({ + id: 0, + name: '', +}) {} + +class Invitation extends immutable.Record({ + user: new Member(), + isRequest: false, +}) {} + +class CarpoolState extends immutable.Record({ + id: 0, + name: '', + members: immutable.List(), + invitations: immutable.List(), +}) {} + +type Subscriber = (state: CarpoolState) => void; + +class CarpoolSDK { + private _state = new CarpoolState(); + get state() { + return this._state; + } + set state(state: CarpoolState) { + this._state = state; + } + private subscribers: Subscriber[] = []; + subscribe(subscriber: Subscriber) { + this.subscribers.push(subscriber); + return () => { + this.subscribers = this.subscribers.filter((s) => s !== subscriber); + }; + } +} + +export const CarpoolContext = createContext({ + sdk: new CarpoolSDK(), + carpool: new CarpoolState(), +}); + +export default function CarpoolProvider({ + id, + children, +}: { + id: number; + children: ReactNode; +}) { + const [carpool, setCarpool] = useState(new CarpoolState()); + const sdk = useMemo(() => new CarpoolSDK(), []); + + useEffect(() => { + getCarpool(id).then((carpool) => {}); + }, [id]); + + useEffect(() => { + const remove = sdk.subscribe(setCarpool); + + return () => remove(); + }, [sdk]); + + return ( + + {children} + + ); +} diff --git a/src/components/api.ts b/src/components/api.ts index 8647bbd..0878126 100644 --- a/src/components/api.ts +++ b/src/components/api.ts @@ -1,5 +1,5 @@ import { GroupPreview } from './GroupJoinerLink'; -import { IInvitation, IEventSignup } from './types'; +import { IInvitation, IEventSignup, ICarpool } from './types'; const base = process.env.REACT_APP_API_DOMAIN + 'api'; @@ -163,7 +163,7 @@ export async function getReceivedInvitationsAndRequests() { )) as IInvitation[]; } -export async function getCarpool(id: number) { +export async function getCarpool(id: number): Promise { return await get('/carpools/' + id); } diff --git a/yarn.lock b/yarn.lock index f36d239..16e7a69 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2622,6 +2622,13 @@ resolved "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz" integrity sha512-giAlZwstKbmvMk1OO7WXSj4OZ0keXAcl2TQq4LWHiiPH2ByaH7WeUzng+Qej8UPxxv+8lRTuouo0iaNDBuzIBA== +"@types/immutable@^3.8.7": + version "3.8.7" + resolved "https://registry.yarnpkg.com/@types/immutable/-/immutable-3.8.7.tgz#536d33d30f3f3d9a6d4642a219419fd82af633fb" + integrity sha1-U20z0w8/PZptRkKiGUGf2Cr2M/s= + dependencies: + immutable "*" + "@types/invariant@^2.2.33": version "2.2.34" resolved "https://registry.npmjs.org/@types/invariant/-/invariant-2.2.34.tgz" @@ -6693,6 +6700,16 @@ immer@8.0.1: resolved "https://registry.npmjs.org/immer/-/immer-8.0.1.tgz" integrity sha512-aqXhGP7//Gui2+UrEtvxZxSquQVXTpZ7KDxfCcKAF3Vysvw0CViVaW9RZ1j1xlIYqaaaipBoqdqeibkc18PNvA== +immutable@*: + version "3.8.2" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-3.8.2.tgz#c2439951455bb39913daf281376f1530e104adf3" + integrity sha1-wkOZUUVbs5kT2vKBN28VMOEErfM= + +immutable@^4.0.0-rc.14: + version "4.0.0-rc.14" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.0.0-rc.14.tgz#29ba96631ec10867d1348515ac4e6bdba462f071" + integrity sha512-pfkvmRKJSoW7JFx0QeYlAmT+kNYvn5j0u7bnpNq4N2RCvHSTlLT208G8jgaquNe+Q8kCPHKOSpxJkyvLDpYq0w== + import-cwd@^2.0.0: version "2.1.0" resolved "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz"