SuperHi FM

Intro to Full Stack Javascript

Get access to Intro to Full Stack Javascript

  • Practical, go-at-your-own pace learning, with help from our industry experts and experienced teachers
  • Projects and code that you can alter and include in your own sites and portfolio
  • Resources to get you started and going post-course
Lesson 25

Walkthrough: Creating our Zustand store

A Walkthrough of our previous Challenge so that we’re all on the same page.

Our completed store:


import { create } from "zustand";
import {
 ICareEvent,
 ICareRecipients,
 ICaregiver,
 ICareEventsByDate,
 ICareEventSanitised,
} from "./interfaces";

interface StoreState {
 // Authentication state
 accessToken: string;
 setAccessToken: (token: string) => void;
 initializeAccessToken: () => void;
 // Care recipients state
 id: string;
 setId: (name: string) => void;
 careRecipients: ICareRecipients | null;
 setCareRecipients: (data: ICareRecipients) => void;
 careRecipientName: string;
 setCareRecipientName: (name: string) => void;
 // Caregivers state
 caregivers: ICaregiver | null;
 setCaregivers: (data: ICaregiver) => void;
 // Care events state
 careEvents: ICareEvent | null;
 setCareEvents: (data: ICareEvent | null) => void;
 careEventsByDate: ICareEventsByDate | null;
 setCareEventsByDate: (data: ICareEventsByDate | null) => void;
 // Selected event state
 selectedEvent: ICareEventSanitised | null;
 setSelectedEvent: (data: ICareEventSanitised | null) => void;
 // Loading state
 isLoading: boolean;
 setIsLoading: (loading: boolean) => void;
 // Panel state
 showPanel: boolean;
 setShowPanel: (show: boolean) => void;
 isPanelOpen: boolean;
 setIsPanelOpen: (isOpen: boolean) => void;
 // Pagination state
 page: number;
 setPage: (pageNumber: number) => void;
 // Scroll state
 scroll: number;
 setScroll: (scrollPosition: number) => void;
 // Refs
 prevPanelState: React.MutableRefObject;
 panelEl: React.MutableRefObject;
 prevEvent: React.MutableRefObject;
}

export const useStore = create((set) => ({
 // Authentication state
 accessToken: "",
 setAccessToken: (token: string) => {
 sessionStorage.setItem("accessToken", token);
 set({ accessToken: token });
 },
 initializeAccessToken: () => {
 const storedToken = sessionStorage.getItem("accessToken");
 if (storedToken) {
 set({ accessToken: storedToken });
 }
 },

 // Care recipients state
 id: '',
 setId: (id: string) => set({ id }),
 careRecipients: null,
 setCareRecipients: (data) => set({ careRecipients: data }),
 careRecipientName: '',
 setCareRecipientName: (name) => set({ careRecipientName: name }),

 // Caregivers state
 caregivers: null,
 setCaregivers: (data) => set({ caregivers: data }),

 // Care events state
 careEvents: null,
 setCareEvents: (data) => set({ careEvents: data }),

 // Care events by date state
 careEventsByDate: null,
 setCareEventsByDate: (data) => set({ careEventsByDate: data }),

 // Selected event state
 selectedEvent: null,
 setSelectedEvent: (data) => set({ selectedEvent: data }),

 // Loading state
 isLoading: true,
 setIsLoading: (loading) => set({ isLoading: loading }),

 // Panel state
 showPanel: false,
 setShowPanel: (show) => set({ showPanel: show }),
 isPanelOpen: false,
 setIsPanelOpen: (isOpen) => {
 set({ isPanelOpen: isOpen });
 },

 // Pagination state
 page: 0,
 setPage: (pageNumber) => set({ page: pageNumber }),

 // Scroll state
 scroll: 0,
 setScroll: (scrollPosition) => set({ scroll: scrollPosition }),

 // Refs
 prevPanelState: { current: false },
 panelEl: { current: null },
 prevEvent: { current: null },
}));

export default useStore;

Transcript

00:00

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris euismod imperdiet feugiat. Pellentesque elementum rhoncus justo eu maximus. Donec varius magna sed nisl posuere fermentum. Integer in orci placerat, egestas lacus a, pharetra tortor. Sed iaculis ac turpis sit amet semper. Nunc accumsan gravida tempus. Donec vel eros a risus condimentum ullamcorper ac eu mauris. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam vel tortor faucibus, egestas tellus ut, condimentum erat. Vivamus tristique aliquam purus.

00:50

Nulla facilisi. Donec sed quam in dolor mattis condimentum. Proin mauris erat, laoreet et tellus vitae, iaculis interdum augue. Duis mattis nunc et felis facilisis lobortis. Pellentesque sagittis egestas neque. Vestibulum ultricies non libero at placerat. Quisque sodales eu lacus in molestie. Aenean tempor ac lacus id tincidunt. Curabitur lacinia condimentum elementum. Cras pellentesque, nibh auctor vehicula egestas, nunc purus molestie urna, eget maximus elit arcu id mauris. Nunc egestas congue dui, a posuere justo. Aliquam leo libero, lacinia at justo quis, tincidunt iaculis felis. Aliquam tempus varius vulputate. Donec porta, sem eu maximus viverra, turpis mi accumsan metus, gravida blandit mauris nunc sit amet massa.

01:41

Donec vitae diam id lectus faucibus tincidunt. Duis quis ipsum turpis. Donec facilisis sapien massa. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Duis hendrerit lacus quis odio maximus convallis. Mauris eu ultrices diam. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Nunc eu ligula diam. Vestibulum a risus nec libero dictum rutrum in ac arcu. Maecenas commodo, quam non suscipit mollis, risus lacus maximus leo, sed interdum metus ante eget justo. Phasellus condimentum nisl diam, at lacinia turpis viverra in.

Private notes

A place for you to post notes about anything on this page. Only you can view your notes.

SuperHi FM

Want some ambient music in the background? Play our radio station!

Feeling stuck?

Don’t worry, we are here to help you with:

  • Speedy help from one of our team members
  • Detailed, relevant solutions
  • Direct access to peer support through Discord!

Remember, there’s no such thing as a silly question, so don’t hesitate to reach out, we love hearing from you!