// import react import ApiSignal from './Api'; import UserSignal from './User'; import Signal, { effect } from '../signal'; // create signal const TeamsSignal = new Signal.State([]); export const loading = new Signal.State(true); export const current = new Signal.State(null); /** * on channel * * @param channel */ export const onUpdate = (team) => { // found const found = TeamsSignal.get().find((t) => t.id === team.id); // if found if (found) { // update found Object.keys(team).forEach((key) => { // set to found found[key] = team[key]; }); // set/get TeamsSignal.set([...TeamsSignal.get()]); } else { TeamsSignal.set([ ...TeamsSignal.get(), team, ]); } }; // effect effect(() => { // api const api = ApiSignal.get(); // check signal value if (!api) return null; // on team const onTeam = (team) => { // if team set current if (team) { // set value current.set(team || api.team); } }; // check team if (api.team) { // set current current.set(api.team); // set team return api.team?.id; } else { // listen api.events.on('team', onTeam); // return off return () => { // off api.events.removeListener('team', onTeam); }; } }); // effect effect(() => { // check user if (!UserSignal.get()) { // unset teams TeamsSignal.set([]); } else { // load teams ApiSignal.get().Team.list().then((data) => { // sort data.teams by new Date(createdAt) asc data.teams.sort((a, b) => new Date(a.createdAt) - new Date(b.createdAt)); // set teams TeamsSignal.set(data.teams); }); } // return id return UserSignal.get()?.id; }); // effect effect(() => { // check $crisp if (typeof window === 'undefined') return; // check crisp if (!window.$crisp) return; // tema const team = current.get(); // add user email if (!team?.id) return; // set team id and name /* window.$crisp.push(['set', 'session:data', [ ['team_id', team.id], ['team_name', team.name], ]]); */ // return id return team?.id; }); /** * export api signal */ export default TeamsSignal;