mirror of
				https://github.com/Unleash/unleash.git
				synced 2025-10-27 11:02:16 +01:00 
			
		
		
		
	This PR puts our contributing guidelines in the sidebar of the unleash documentation. Currently there was no way of navigating to them easily, which made our contribution guides and ADRs less useful. This PR adds them to the sidebar as their own category, and adds an ADR for domain centric language. Co-authored-by: Thomas Heartman <thomas@getunleash.ai>
		
			
				
	
	
		
			84 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			84 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| ---
 | |
| title: "ADR: Preferred data fetching method"
 | |
| ---
 | |
| 
 | |
| ## Background
 | |
| 
 | |
| We have found a need to standardise how we fetch data from APIs, in order to reduce complexity and simplify the data fetching process.
 | |
| 
 | |
| ## Decision
 | |
| 
 | |
| We have decided to remove redux from our application and fetch all of our data via a third party library called `useSWR` (SWR stands for stale-while-revalidate and is a common cache strategy).
 | |
| 
 | |
| ```tsx
 | |
| // Do:
 | |
| // useSegments.ts
 | |
| 
 | |
| import useSWR from 'swr';
 | |
| import { useCallback } from 'react';
 | |
| import { formatApiPath } from 'utils/formatPath';
 | |
| import handleErrorResponses from '../httpErrorResponseHandler';
 | |
| import { ISegment } from 'interfaces/segment';
 | |
| import useUiConfig from 'hooks/api/getters/useUiConfig/useUiConfig';
 | |
| import { IFlags } from 'interfaces/uiConfig';
 | |
| 
 | |
| export interface UseSegmentsOutput {
 | |
|     segments?: ISegment[];
 | |
|     refetchSegments: () => void;
 | |
|     loading: boolean;
 | |
|     error?: Error;
 | |
| }
 | |
| 
 | |
| export const useSegments = (strategyId?: string): UseSegmentsOutput => {
 | |
|     const { uiConfig } = useUiConfig();
 | |
| 
 | |
|     const { data, error, mutate } = useSWR(
 | |
|         [strategyId, uiConfig.flags],
 | |
|         fetchSegments
 | |
|     );
 | |
| 
 | |
|     const refetchSegments = useCallback(() => {
 | |
|         mutate().catch(console.warn);
 | |
|     }, [mutate]);
 | |
| 
 | |
|     return {
 | |
|         segments: data,
 | |
|         refetchSegments,
 | |
|         loading: !error && !data,
 | |
|         error,
 | |
|     };
 | |
| };
 | |
| 
 | |
| export const fetchSegments = async (
 | |
|     strategyId?: string,
 | |
|     flags?: IFlags
 | |
| ): Promise<ISegment[]> => {
 | |
|     if (!flags?.SE) {
 | |
|         return [];
 | |
|     }
 | |
| 
 | |
|     return fetch(formatSegmentsPath(strategyId))
 | |
|         .then(handleErrorResponses('Segments'))
 | |
|         .then(res => res.json())
 | |
|         .then(res => res.segments);
 | |
| };
 | |
| 
 | |
| const formatSegmentsPath = (strategyId?: string): string => {
 | |
|     return strategyId
 | |
|         ? formatApiPath(`api/admin/segments/strategies/${strategyId}`)
 | |
|         : formatApiPath('api/admin/segments');
 | |
| };
 | |
| 
 | |
| // Don't:
 | |
| const MyComponent = () => {
 | |
|     useEffect(() => {
 | |
|         const getData = () => {
 | |
|             fetch(API_URL)
 | |
|                 .then(res => res.json())
 | |
|                 .then(setData);
 | |
|         };
 | |
|         getData();
 | |
|     }, []);
 | |
| };
 | |
| ```
 |