Removed React prefix to some use hooks

This commit is contained in:
Donkie
2024-08-06 14:28:09 +02:00
parent 701ed2fae6
commit 3bd93cb0af
13 changed files with 53 additions and 71 deletions

View File

@@ -19,7 +19,6 @@ import {
UserOutlined, UserOutlined,
} from "@ant-design/icons"; } from "@ant-design/icons";
import { ConfigProvider } from "antd"; import { ConfigProvider } from "antd";
import React from "react";
import { Locale } from "antd/es/locale"; import { Locale } from "antd/es/locale";
import { languages } from "./i18n"; import { languages } from "./i18n";
import loadable from "@loadable/component"; import loadable from "@loadable/component";
@@ -28,6 +27,7 @@ import { SpoolmanLayout } from "./components/layout";
import liveProvider from "./components/liveProvider"; import liveProvider from "./components/liveProvider";
import { getAPIURL, getBasePath } from "./utils/url"; import { getAPIURL, getBasePath } from "./utils/url";
import { Favicon } from "./components/favicon"; import { Favicon } from "./components/favicon";
import { useEffect, useState } from "react";
interface ResourcePageProps { interface ResourcePageProps {
resource: "spools" | "filaments" | "vendors"; resource: "spools" | "filaments" | "vendors";
@@ -62,8 +62,8 @@ function App() {
}; };
// Fetch the antd locale using dynamic imports // Fetch the antd locale using dynamic imports
const [antdLocale, setAntdLocale] = React.useState<Locale | undefined>(); const [antdLocale, setAntdLocale] = useState<Locale | undefined>();
React.useEffect(() => { useEffect(() => {
const fetchLocale = async () => { const fetchLocale = async () => {
const locale = await import( const locale = await import(
`./../node_modules/antd/es/locale/${languages[i18n.language].fullCode.replace("-", "_")}.js` `./../node_modules/antd/es/locale/${languages[i18n.language].fullCode.replace("-", "_")}.js`

View File

@@ -1,7 +1,7 @@
import { LiveEvent } from "@refinedev/core"; import { LiveEvent } from "@refinedev/core";
import React from "react";
import liveProvider from "./liveProvider"; import liveProvider from "./liveProvider";
import { getAPIURL } from "../utils/url"; import { getAPIURL } from "../utils/url";
import { useEffect, useMemo, useState } from "react";
const liveProviderInstance = liveProvider(getAPIURL()); const liveProviderInstance = liveProvider(getAPIURL());
@@ -18,22 +18,22 @@ export function useLiveify<Data extends { id: number }>(
) { ) {
// TODO: The hooks in this function is quite janky, and should be refactored to be more efficient // TODO: The hooks in this function is quite janky, and should be refactored to be more efficient
// New state that holds the dataSource with updated values from the live provider // New state that holds the dataSource with updated values from the live provider
const [updatedDataSource, setUpdatedDataSource] = React.useState<Data[]>(dataSource); const [updatedDataSource, setUpdatedDataSource] = useState<Data[]>(dataSource);
// If the original dataSource changes, update the updatedDataSource // If the original dataSource changes, update the updatedDataSource
React.useEffect(() => { useEffect(() => {
setUpdatedDataSource(dataSource); setUpdatedDataSource(dataSource);
}, [dataSource]); }, [dataSource]);
// Create a constant reference to itemIds. This is to prevent the useEffect below from triggering extra times. // Create a constant reference to itemIds. This is to prevent the useEffect below from triggering extra times.
const itemIds = dataSource.map((item) => item.id); const itemIds = dataSource.map((item) => item.id);
const [prevItemIds, setPrevItemIds] = React.useState<number[]>(itemIds); const [prevItemIds, setPrevItemIds] = useState<number[]>(itemIds);
if (JSON.stringify(itemIds) !== JSON.stringify(prevItemIds)) { if (JSON.stringify(itemIds) !== JSON.stringify(prevItemIds)) {
setPrevItemIds(itemIds); setPrevItemIds(itemIds);
} }
// Subscribe to changes for all items in the dataSource // Subscribe to changes for all items in the dataSource
React.useEffect(() => { useEffect(() => {
const subscription = liveProviderInstance?.subscribe({ const subscription = liveProviderInstance?.subscribe({
channel: `${resource}-list`, channel: `${resource}-list`,
params: { params: {

View File

@@ -1,7 +1,6 @@
import React from "react";
import { HttpError, IResourceComponentsProps, useInvalidate, useTranslate } from "@refinedev/core"; import { HttpError, IResourceComponentsProps, useInvalidate, useTranslate } from "@refinedev/core";
import { Create, useForm, useSelect } from "@refinedev/antd"; import { Create, useForm, useSelect } from "@refinedev/antd";
import { Form, Input, Select, InputNumber, ColorPicker, Button, Typography, Modal, Radio } from "antd"; import { Form, Input, Select, InputNumber, ColorPicker, Button, Typography, Radio } from "antd";
import TextArea from "antd/es/input/TextArea"; import TextArea from "antd/es/input/TextArea";
import { numberFormatter, numberParser } from "../../utils/parsing"; import { numberFormatter, numberParser } from "../../utils/parsing";
import { IVendor } from "../vendors/model"; import { IVendor } from "../vendors/model";
@@ -11,12 +10,11 @@ import { ExtraFieldFormItem, ParsedExtras, StringifiedExtras } from "../../compo
import dayjs from "dayjs"; import dayjs from "dayjs";
import utc from "dayjs/plugin/utc"; import utc from "dayjs/plugin/utc";
import { getCurrencySymbol, useCurrency } from "../../utils/settings"; import { getCurrencySymbol, useCurrency } from "../../utils/settings";
import { searchMatches } from "../../utils/filtering"; import { ExternalFilament } from "../../utils/queryExternalDB";
import { ExternalFilament, useGetExternalDBFilaments } from "../../utils/queryExternalDB";
import { formatFilamentLabel } from "../spools/functions";
import { FilamentImportModal } from "../../components/filamentImportModal"; import { FilamentImportModal } from "../../components/filamentImportModal";
import { getOrCreateVendorFromExternal } from "../vendors/functions"; import { getOrCreateVendorFromExternal } from "../vendors/functions";
import { MultiColorPicker } from "../../components/multiColorPicker"; import { MultiColorPicker } from "../../components/multiColorPicker";
import { useEffect, useState } from "react";
dayjs.extend(utc); dayjs.extend(utc);
@@ -32,9 +30,9 @@ export const FilamentCreate: React.FC<IResourceComponentsProps & CreateOrClonePr
const t = useTranslate(); const t = useTranslate();
const extraFields = useGetFields(EntityType.filament); const extraFields = useGetFields(EntityType.filament);
const currency = useCurrency(); const currency = useCurrency();
const [isImportExtOpen, setIsImportExtOpen] = React.useState(false); const [isImportExtOpen, setIsImportExtOpen] = useState(false);
const invalidate = useInvalidate(); const invalidate = useInvalidate();
const [colorType, setColorType] = React.useState<"single" | "multi">("single"); const [colorType, setColorType] = useState<"single" | "multi">("single");
const { form, formProps, formLoading, onFinish, redirect } = useForm< const { form, formProps, formLoading, onFinish, redirect } = useForm<
IFilament, IFilament,
@@ -91,7 +89,7 @@ export const FilamentCreate: React.FC<IResourceComponentsProps & CreateOrClonePr
// Use useEffect to update the form's initialValues when the extra fields are loaded // Use useEffect to update the form's initialValues when the extra fields are loaded
// This is necessary because the form is rendered before the extra fields are loaded // This is necessary because the form is rendered before the extra fields are loaded
React.useEffect(() => { useEffect(() => {
extraFields.data?.forEach((field) => { extraFields.data?.forEach((field) => {
if (formProps.initialValues && field.default_value) { if (formProps.initialValues && field.default_value) {
const parsedValue = JSON.parse(field.default_value as string); const parsedValue = JSON.parse(field.default_value as string);

View File

@@ -1,4 +1,4 @@
import React, { useState } from "react"; import { useEffect, useState } from "react";
import { HttpError, IResourceComponentsProps, useTranslate } from "@refinedev/core"; import { HttpError, IResourceComponentsProps, useTranslate } from "@refinedev/core";
import { Edit, useForm, useSelect } from "@refinedev/antd"; import { Edit, useForm, useSelect } from "@refinedev/antd";
import { Form, Input, DatePicker, Select, InputNumber, ColorPicker, message, Alert, Typography, Radio } from "antd"; import { Form, Input, DatePicker, Select, InputNumber, ColorPicker, message, Alert, Typography, Radio } from "antd";
@@ -26,7 +26,7 @@ export const FilamentEdit: React.FC<IResourceComponentsProps> = () => {
const [hasChanged, setHasChanged] = useState(false); const [hasChanged, setHasChanged] = useState(false);
const extraFields = useGetFields(EntityType.filament); const extraFields = useGetFields(EntityType.filament);
const currency = useCurrency(); const currency = useCurrency();
const [colorType, setColorType] = React.useState<"single" | "multi">("single"); const [colorType, setColorType] = useState<"single" | "multi">("single");
const { formProps, saveButtonProps } = useForm<IFilament, HttpError, IFilament, IFilament>({ const { formProps, saveButtonProps } = useForm<IFilament, HttpError, IFilament, IFilament>({
liveMode: "manual", liveMode: "manual",
@@ -52,7 +52,7 @@ export const FilamentEdit: React.FC<IResourceComponentsProps> = () => {
} }
// Update colorType state // Update colorType state
React.useEffect(() => { useEffect(() => {
console.log(formProps.initialValues?.multi_color_hexes); console.log(formProps.initialValues?.multi_color_hexes);
if (formProps.initialValues?.multi_color_hexes) { if (formProps.initialValues?.multi_color_hexes) {
setColorType("multi"); setColorType("multi");

View File

@@ -1,4 +1,4 @@
import React from "react"; import { useMemo, useState } from "react";
import { IResourceComponentsProps, useTranslate, useInvalidate, useNavigation } from "@refinedev/core"; import { IResourceComponentsProps, useTranslate, useInvalidate, useNavigation } from "@refinedev/core";
import { useTable, List } from "@refinedev/antd"; import { useTable, List } from "@refinedev/antd";
import { Table, Button, Dropdown } from "antd"; import { Table, Button, Dropdown } from "antd";
@@ -125,7 +125,7 @@ export const FilamentList: React.FC<IResourceComponentsProps> = () => {
}); });
// Create state for the columns to show // Create state for the columns to show
const [showColumns, setShowColumns] = React.useState<string[]>(initialState.showColumns ?? defaultColumns); const [showColumns, setShowColumns] = useState<string[]>(initialState.showColumns ?? defaultColumns);
// Store state in local storage // Store state in local storage
const tableState: TableState = { const tableState: TableState = {
@@ -137,7 +137,7 @@ export const FilamentList: React.FC<IResourceComponentsProps> = () => {
useStoreInitialState(namespace, tableState); useStoreInitialState(namespace, tableState);
// Collapse the dataSource to a mutable list // Collapse the dataSource to a mutable list
const queryDataSource: IFilamentCollapsed[] = React.useMemo( const queryDataSource: IFilamentCollapsed[] = useMemo(
() => (tableProps.dataSource || []).map((record) => ({ ...record })), () => (tableProps.dataSource || []).map((record) => ({ ...record })),
[tableProps.dataSource] [tableProps.dataSource]
); );

View File

@@ -1,4 +1,4 @@
import React, { useState } from "react"; import { useMemo, useState } from "react";
import { Table, Checkbox, Space, Row, Col, message, Button } from "antd"; import { Table, Checkbox, Space, Row, Col, message, Button } from "antd";
import { ISpool } from "../spools/model"; import { ISpool } from "../spools/model";
import { FilteredQueryColumn, SortedColumn, SpoolIconColumn } from "../../components/column"; import { FilteredQueryColumn, SortedColumn, SpoolIconColumn } from "../../components/column";
@@ -79,7 +79,7 @@ const SpoolSelectModal: React.FC<Props> = ({ description, onContinue }) => {
}; };
// Collapse the dataSource to a mutable list and add a filament_name field // Collapse the dataSource to a mutable list and add a filament_name field
const dataSource: ISpoolCollapsed[] = React.useMemo( const dataSource: ISpoolCollapsed[] = useMemo(
() => (tableProps.dataSource || []).map((record) => ({ ...record })), () => (tableProps.dataSource || []).map((record) => ({ ...record })),
[tableProps.dataSource] [tableProps.dataSource]
); );

View File

@@ -1,4 +1,4 @@
import React from "react"; import { useEffect } from "react";
import { useTranslate } from "@refinedev/core"; import { useTranslate } from "@refinedev/core";
import { Button, Form, Input, message } from "antd"; import { Button, Form, Input, message } from "antd";
import { useGetSettings, useSetSetting } from "../../utils/querySettings"; import { useGetSettings, useSetSetting } from "../../utils/querySettings";
@@ -11,7 +11,7 @@ export function GeneralSettings() {
const t = useTranslate(); const t = useTranslate();
// Set initial form values // Set initial form values
React.useEffect(() => { useEffect(() => {
if (settings.data) { if (settings.data) {
form.setFieldsValue({ form.setFieldsValue({
currency: JSON.parse(settings.data.currency.value), currency: JSON.parse(settings.data.currency.value),
@@ -20,7 +20,7 @@ export function GeneralSettings() {
}, [settings.data, form]); }, [settings.data, form]);
// Popup message if setSetting is successful // Popup message if setSetting is successful
React.useEffect(() => { useEffect(() => {
if (setCurrency.isSuccess) { if (setCurrency.isSuccess) {
messageApi.success(t("notifications.saveSuccessful")); messageApi.success(t("notifications.saveSuccessful"));
} }

View File

@@ -1,25 +1,11 @@
import React, { useMemo, useState } from "react"; import { useEffect, useMemo, useState } from "react";
import { HttpError, IResourceComponentsProps, useTranslate } from "@refinedev/core"; import { HttpError, IResourceComponentsProps, useTranslate } from "@refinedev/core";
import { Create, useForm, useSelect } from "@refinedev/antd"; import { Create, useForm } from "@refinedev/antd";
import { import { Form, Input, DatePicker, Select, InputNumber, Radio, Divider, Button, Typography, Alert } from "antd";
Form,
Input,
DatePicker,
Select,
InputNumber,
Radio,
Divider,
Button,
Typography,
ConfigProvider,
Alert,
Space,
} from "antd";
import dayjs from "dayjs"; import dayjs from "dayjs";
import TextArea from "antd/es/input/TextArea"; import TextArea from "antd/es/input/TextArea";
import { IFilament } from "../filaments/model";
import { ISpool, ISpoolParsedExtras, WeightToEnter } from "./model"; import { ISpool, ISpoolParsedExtras, WeightToEnter } from "./model";
import { formatLength, formatWeight, numberFormatter, numberParser } from "../../utils/parsing"; import { numberFormatter, numberParser } from "../../utils/parsing";
import { useSpoolmanLocations } from "../../components/otherModels"; import { useSpoolmanLocations } from "../../components/otherModels";
import { MinusOutlined, PlusOutlined } from "@ant-design/icons"; import { MinusOutlined, PlusOutlined } from "@ant-design/icons";
import "../../utils/overrides.css"; import "../../utils/overrides.css";
@@ -27,9 +13,8 @@ import { EntityType, useGetFields } from "../../utils/queryFields";
import { ExtraFieldFormItem, ParsedExtras, StringifiedExtras } from "../../components/extraFields"; import { ExtraFieldFormItem, ParsedExtras, StringifiedExtras } from "../../components/extraFields";
import utc from "dayjs/plugin/utc"; import utc from "dayjs/plugin/utc";
import { getCurrencySymbol, useCurrency } from "../../utils/settings"; import { getCurrencySymbol, useCurrency } from "../../utils/settings";
import { ExternalFilament, useGetExternalDBFilaments } from "../../utils/queryExternalDB";
import { createFilamentFromExternal } from "../filaments/functions"; import { createFilamentFromExternal } from "../filaments/functions";
import { formatFilamentLabel, useGetFilamentSelectOptions } from "./functions"; import { useGetFilamentSelectOptions } from "./functions";
import { searchMatches } from "../../utils/filtering"; import { searchMatches } from "../../utils/filtering";
dayjs.extend(utc); dayjs.extend(utc);
@@ -145,7 +130,7 @@ export const SpoolCreate: React.FC<IResourceComponentsProps & CreateOrCloneProps
// Use useEffect to update the form's initialValues when the extra fields are loaded // Use useEffect to update the form's initialValues when the extra fields are loaded
// This is necessary because the form is rendered before the extra fields are loaded // This is necessary because the form is rendered before the extra fields are loaded
React.useEffect(() => { useEffect(() => {
extraFields.data?.forEach((field) => { extraFields.data?.forEach((field) => {
if (formProps.initialValues && field.default_value) { if (formProps.initialValues && field.default_value) {
const parsedValue = JSON.parse(field.default_value as string); const parsedValue = JSON.parse(field.default_value as string);
@@ -161,7 +146,7 @@ export const SpoolCreate: React.FC<IResourceComponentsProps & CreateOrCloneProps
const [weightToEnter, setWeightToEnter] = useState(1); const [weightToEnter, setWeightToEnter] = useState(1);
const [usedWeight, setUsedWeight] = useState(0); const [usedWeight, setUsedWeight] = useState(0);
React.useEffect(() => { useEffect(() => {
const newFilamentWeight = selectedFilament?.weight || 0; const newFilamentWeight = selectedFilament?.weight || 0;
const newSpoolWeight = selectedFilament?.spool_weight || 0; const newSpoolWeight = selectedFilament?.spool_weight || 0;
if (newFilamentWeight > 0) { if (newFilamentWeight > 0) {
@@ -242,7 +227,7 @@ export const SpoolCreate: React.FC<IResourceComponentsProps & CreateOrCloneProps
return selectedFilament?.weight ? true : false; return selectedFilament?.weight ? true : false;
}; };
React.useEffect(() => { useEffect(() => {
if (weightToEnter >= WeightToEnter.measured_weight) { if (weightToEnter >= WeightToEnter.measured_weight) {
if (!isMeasuredWeightEnabled()) { if (!isMeasuredWeightEnabled()) {
setWeightToEnter(WeightToEnter.remaining_weight); setWeightToEnter(WeightToEnter.remaining_weight);

View File

@@ -1,10 +1,9 @@
import React, { useEffect, useMemo, useState } from "react"; import { useEffect, useMemo, useState } from "react";
import { HttpError, IResourceComponentsProps, useTranslate } from "@refinedev/core"; import { HttpError, IResourceComponentsProps, useTranslate } from "@refinedev/core";
import { Edit, useForm, useSelect } from "@refinedev/antd"; import { Edit, useForm } from "@refinedev/antd";
import { Form, Input, DatePicker, Select, InputNumber, Radio, Divider, Alert, Typography } from "antd"; import { Form, Input, DatePicker, Select, InputNumber, Radio, Divider, Alert, Typography } from "antd";
import dayjs from "dayjs"; import dayjs from "dayjs";
import TextArea from "antd/es/input/TextArea"; import TextArea from "antd/es/input/TextArea";
import { IFilament } from "../filaments/model";
import { ISpool, ISpoolParsedExtras, WeightToEnter } from "./model"; import { ISpool, ISpoolParsedExtras, WeightToEnter } from "./model";
import { numberFormatter, numberParser } from "../../utils/parsing"; import { numberFormatter, numberParser } from "../../utils/parsing";
import { useSpoolmanLocations } from "../../components/otherModels"; import { useSpoolmanLocations } from "../../components/otherModels";
@@ -117,7 +116,7 @@ export const SpoolEdit: React.FC<IResourceComponentsProps> = () => {
const [weightToEnter, setWeightToEnter] = useState(1); const [weightToEnter, setWeightToEnter] = useState(1);
const [usedWeight, setUsedWeight] = useState(0); const [usedWeight, setUsedWeight] = useState(0);
React.useEffect(() => { useEffect(() => {
const newFilamentWeight = selectedFilament?.weight || 0; const newFilamentWeight = selectedFilament?.weight || 0;
const newSpoolWeight = selectedFilament?.spool_weight || 0; const newSpoolWeight = selectedFilament?.spool_weight || 0;
console.log("selectedFilament", selectedFilament, newFilamentWeight, newSpoolWeight); console.log("selectedFilament", selectedFilament, newFilamentWeight, newSpoolWeight);
@@ -190,7 +189,7 @@ export const SpoolEdit: React.FC<IResourceComponentsProps> = () => {
return selectedFilament?.weight ? true : false; return selectedFilament?.weight ? true : false;
}; };
React.useEffect(() => { useEffect(() => {
if (weightToEnter >= WeightToEnter.measured_weight) { if (weightToEnter >= WeightToEnter.measured_weight) {
if (!isMeasuredWeightEnabled()) { if (!isMeasuredWeightEnabled()) {
setWeightToEnter(WeightToEnter.remaining_weight); setWeightToEnter(WeightToEnter.remaining_weight);

View File

@@ -1,4 +1,4 @@
import React, { useCallback, useMemo } from "react"; import { useCallback, useMemo, useState } from "react";
import { IResourceComponentsProps, useInvalidate, useNavigation, useTranslate } from "@refinedev/core"; import { IResourceComponentsProps, useInvalidate, useNavigation, useTranslate } from "@refinedev/core";
import { useTable, List } from "@refinedev/antd"; import { useTable, List } from "@refinedev/antd";
import { Table, Button, Dropdown, Modal } from "antd"; import { Table, Button, Dropdown, Modal } from "antd";
@@ -159,7 +159,7 @@ export const SpoolList: React.FC<IResourceComponentsProps> = () => {
}); });
// Create state for the columns to show // Create state for the columns to show
const [showColumns, setShowColumns] = React.useState<string[]>(initialState.showColumns ?? defaultColumns); const [showColumns, setShowColumns] = useState<string[]>(initialState.showColumns ?? defaultColumns);
// Store state in local storage // Store state in local storage
const tableState: TableState = { const tableState: TableState = {
@@ -171,7 +171,7 @@ export const SpoolList: React.FC<IResourceComponentsProps> = () => {
useStoreInitialState(namespace, tableState); useStoreInitialState(namespace, tableState);
// Collapse the dataSource to a mutable list // Collapse the dataSource to a mutable list
const queryDataSource: ISpoolCollapsed[] = React.useMemo( const queryDataSource: ISpoolCollapsed[] = useMemo(
() => (tableProps.dataSource || []).map((record) => ({ ...record })), () => (tableProps.dataSource || []).map((record) => ({ ...record })),
[tableProps.dataSource] [tableProps.dataSource]
); );

View File

@@ -1,4 +1,4 @@
import React from "react"; import { useEffect } from "react";
import { HttpError, IResourceComponentsProps, useTranslate } from "@refinedev/core"; import { HttpError, IResourceComponentsProps, useTranslate } from "@refinedev/core";
import { Create, useForm } from "@refinedev/antd"; import { Create, useForm } from "@refinedev/antd";
import { Button, Form, Input, Typography, InputNumber } from "antd"; import { Button, Form, Input, Typography, InputNumber } from "antd";
@@ -43,7 +43,7 @@ export const VendorCreate: React.FC<IResourceComponentsProps & CreateOrCloneProp
// Use useEffect to update the form's initialValues when the extra fields are loaded // Use useEffect to update the form's initialValues when the extra fields are loaded
// This is necessary because the form is rendered before the extra fields are loaded // This is necessary because the form is rendered before the extra fields are loaded
React.useEffect(() => { useEffect(() => {
extraFields.data?.forEach((field) => { extraFields.data?.forEach((field) => {
if (formProps.initialValues && field.default_value) { if (formProps.initialValues && field.default_value) {
const parsedValue = JSON.parse(field.default_value as string); const parsedValue = JSON.parse(field.default_value as string);

View File

@@ -1,4 +1,3 @@
import React from "react";
import { IResourceComponentsProps, useTranslate, useInvalidate, useNavigation } from "@refinedev/core"; import { IResourceComponentsProps, useTranslate, useInvalidate, useNavigation } from "@refinedev/core";
import { useTable, List } from "@refinedev/antd"; import { useTable, List } from "@refinedev/antd";
import { Table, Button, Dropdown } from "antd"; import { Table, Button, Dropdown } from "antd";
@@ -19,6 +18,7 @@ import { useLiveify } from "../../components/liveify";
import { removeUndefined } from "../../utils/filtering"; import { removeUndefined } from "../../utils/filtering";
import { EntityType, useGetFields } from "../../utils/queryFields"; import { EntityType, useGetFields } from "../../utils/queryFields";
import { useNavigate } from "react-router-dom"; import { useNavigate } from "react-router-dom";
import { useMemo, useState } from "react";
dayjs.extend(utc); dayjs.extend(utc);
@@ -66,7 +66,7 @@ export const VendorList: React.FC<IResourceComponentsProps> = () => {
}); });
// Create state for the columns to show // Create state for the columns to show
const [showColumns, setShowColumns] = React.useState<string[]>(initialState.showColumns ?? allColumns); const [showColumns, setShowColumns] = useState<string[]>(initialState.showColumns ?? allColumns);
// Store state in local storage // Store state in local storage
const tableState: TableState = { const tableState: TableState = {
@@ -78,9 +78,9 @@ export const VendorList: React.FC<IResourceComponentsProps> = () => {
useStoreInitialState(namespace, tableState); useStoreInitialState(namespace, tableState);
// Collapse the dataSource to a mutable list // Collapse the dataSource to a mutable list
const queryDataSource: IVendor[] = React.useMemo(
() => (tableProps.dataSource || []).map((record) => ({ ...record })), () => (tableProps.dataSource || []).map((record) => ({ ...record })),
[tableProps.dataSource] [tableProps.dataSource]
const queryDataSource: IVendor[] = useMemo(
); );
const dataSource = useLiveify("vendor", queryDataSource, (record: IVendor) => record); const dataSource = useLiveify("vendor", queryDataSource, (record: IVendor) => record);

View File

@@ -1,6 +1,6 @@
import React from "react";
import { CrudFilter, CrudSort } from "@refinedev/core"; import { CrudFilter, CrudSort } from "@refinedev/core";
import { isLocalStorageAvailable } from "./support"; import { isLocalStorageAvailable } from "./support";
import { useEffect, useState } from "react";
interface Pagination { interface Pagination {
current: number; current: number;
pageSize: number; pageSize: number;
@@ -14,7 +14,7 @@ export interface TableState {
} }
export function useInitialTableState(tableId: string): TableState { export function useInitialTableState(tableId: string): TableState {
const [initialState] = React.useState(() => { const [initialState] = useState(() => {
const savedSorters = hasHashProperty("sorters") const savedSorters = hasHashProperty("sorters")
? getHashProperty("sorters") ? getHashProperty("sorters")
: isLocalStorageAvailable : isLocalStorageAvailable
@@ -42,7 +42,7 @@ export function useInitialTableState(tableId: string): TableState {
} }
export function useStoreInitialState(tableId: string, state: TableState) { export function useStoreInitialState(tableId: string, state: TableState) {
React.useEffect(() => { useEffect(() => {
if (state.sorters.length > 0 && JSON.stringify(state.sorters) != JSON.stringify([{ field: "id", order: "asc" }])) { if (state.sorters.length > 0 && JSON.stringify(state.sorters) != JSON.stringify([{ field: "id", order: "asc" }])) {
if (isLocalStorageAvailable) { if (isLocalStorageAvailable) {
localStorage.setItem(`${tableId}-sorters`, JSON.stringify(state.sorters)); localStorage.setItem(`${tableId}-sorters`, JSON.stringify(state.sorters));
@@ -54,7 +54,7 @@ export function useStoreInitialState(tableId: string, state: TableState) {
} }
}, [tableId, state.sorters]); }, [tableId, state.sorters]);
React.useEffect(() => { useEffect(() => {
const filters = state.filters.filter((f) => f.value.length != 0); const filters = state.filters.filter((f) => f.value.length != 0);
if (filters.length > 0) { if (filters.length > 0) {
if (isLocalStorageAvailable) { if (isLocalStorageAvailable) {
@@ -67,7 +67,7 @@ export function useStoreInitialState(tableId: string, state: TableState) {
} }
}, [tableId, state.filters]); }, [tableId, state.filters]);
React.useEffect(() => { useEffect(() => {
if (JSON.stringify(state.pagination) != JSON.stringify({ current: 1, pageSize: 20 })) { if (JSON.stringify(state.pagination) != JSON.stringify({ current: 1, pageSize: 20 })) {
if (isLocalStorageAvailable) { if (isLocalStorageAvailable) {
localStorage.setItem(`${tableId}-pagination`, JSON.stringify(state.pagination)); localStorage.setItem(`${tableId}-pagination`, JSON.stringify(state.pagination));
@@ -79,7 +79,7 @@ export function useStoreInitialState(tableId: string, state: TableState) {
} }
}, [tableId, state.pagination]); }, [tableId, state.pagination]);
React.useEffect(() => { useEffect(() => {
if (isLocalStorageAvailable) { if (isLocalStorageAvailable) {
if (state.showColumns === undefined) { if (state.showColumns === undefined) {
localStorage.removeItem(`${tableId}-showColumns`); localStorage.removeItem(`${tableId}-showColumns`);
@@ -91,12 +91,12 @@ export function useStoreInitialState(tableId: string, state: TableState) {
} }
export function useSavedState<T>(id: string, defaultValue: T) { export function useSavedState<T>(id: string, defaultValue: T) {
const [state, setState] = React.useState<T>(() => { const [state, setState] = useState<T>(() => {
const savedState = isLocalStorageAvailable ? localStorage.getItem(`savedStates-${id}`) : null; const savedState = isLocalStorageAvailable ? localStorage.getItem(`savedStates-${id}`) : null;
return savedState ? JSON.parse(savedState) : defaultValue; return savedState ? JSON.parse(savedState) : defaultValue;
}); });
React.useEffect(() => { useEffect(() => {
if (isLocalStorageAvailable) { if (isLocalStorageAvailable) {
localStorage.setItem(`savedStates-${id}`, JSON.stringify(state)); localStorage.setItem(`savedStates-${id}`, JSON.stringify(state));
} }