@riosst100/pwa-marketplace 2.9.5 → 2.9.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,179 @@
1
+ import { useCallback, useEffect, useMemo, useState } from 'react';
2
+ import { useQuery, useMutation } from '@apollo/client';
3
+
4
+ import { useAppContext } from '@magento/peregrine/lib/context/app';
5
+ import { deriveErrorMessage } from '@magento/peregrine/lib/util/deriveErrorMessage';
6
+ import { usePagination } from '@magento/peregrine/lib/hooks/usePagination';
7
+
8
+ import operations from '@riosst100/pwa-marketplace/src/overwrites/peregrine/lib/talons/RMAPage/rmaPage.gql';
9
+
10
+ const PAGE_SIZE = 5;
11
+
12
+ // Custom RMA Page talon with page-based pagination
13
+ export const useRmaPage = (props = {}) => {
14
+ const { rmaId, orderNumber } = props;
15
+ const { getLofmpRmasQuery, getLofmpRmaDetailQuery, lofmpCreateRmaMutation, lofmpRmaShippingConfirmMutation, lofmpSendRmaMessageMutation } = operations;
16
+
17
+ // Mutation for sending RMA message
18
+ const [sendRmaMessageMutation, { data: sendRmaMessageData, error: sendRmaMessageError, loading: sendRmaMessageLoading }] = useMutation(lofmpSendRmaMessageMutation);
19
+
20
+ // Handler for sending RMA message
21
+ const sendRmaMessage = useCallback(async (input) => {
22
+ try {
23
+ const { data } = await sendRmaMessageMutation({ variables: { input } });
24
+ return { data, error: null };
25
+ } catch (error) {
26
+ return { data: null, error };
27
+ }
28
+ }, [sendRmaMessageMutation]);
29
+
30
+ // Mutation for creating RMA
31
+ const [createRmaMutation, { data: createRmaData, error: createRmaError, loading: createRmaLoading }] = useMutation(lofmpCreateRmaMutation);
32
+
33
+ // Mutation for confirming shipping
34
+ const [confirmShippingMutation, { data: confirmShippingData, error: confirmShippingError, loading: confirmShippingLoading }] = useMutation(lofmpRmaShippingConfirmMutation);
35
+
36
+ // Handler for creating RMA
37
+ const createRma = useCallback(async (input) => {
38
+ try {
39
+ const { data } = await createRmaMutation({ variables: { input } });
40
+ return { data, error: null };
41
+ } catch (error) {
42
+ return { data: null, error };
43
+ }
44
+ }, [createRmaMutation]);
45
+
46
+ // Handler for confirming shipping
47
+ const confirmShipping = useCallback(async (rma_id) => {
48
+ try {
49
+ const { data } = await confirmShippingMutation({ variables: { rma_id } });
50
+ return { data, error: null };
51
+ } catch (error) {
52
+ return { data: null, error };
53
+ }
54
+ }, [confirmShippingMutation]);
55
+
56
+ const [
57
+ ,
58
+ {
59
+ actions: { setPageLoading }
60
+ }
61
+ ] = useAppContext();
62
+
63
+ const [pageSize] = useState(PAGE_SIZE);
64
+ const [searchText, setSearchText] = useState('');
65
+
66
+ // Pagination state
67
+ const [paginationValues, paginationApi] = usePagination();
68
+ const { currentPage = 1, totalPages } = paginationValues;
69
+ const { setCurrentPage, setTotalPages } = paginationApi;
70
+
71
+ // List query (skipped when viewing detail)
72
+ const { data, error, loading } = useQuery(getLofmpRmasQuery, {
73
+ fetchPolicy: 'cache-and-network',
74
+ variables: {
75
+ filter: orderNumber
76
+ ? { order_number: orderNumber }
77
+ : (searchText ? { order_number: searchText } : undefined),
78
+ pageSize,
79
+ currentPage
80
+ },
81
+ skip: !!rmaId
82
+ });
83
+
84
+ // Detail query (only when rmaId provided)
85
+ const {
86
+ data: rmaDetailData,
87
+ error: rmaDetailError,
88
+ loading: rmaDetailLoading,
89
+ refetch: refetchRmaDetail
90
+ } = useQuery(getLofmpRmaDetailQuery, {
91
+ fetchPolicy: 'cache-and-network',
92
+ variables: { rmaId },
93
+ skip: !rmaId,
94
+ pollInterval: 3000 // 1 detik auto-refresh
95
+ });
96
+
97
+ const rmasData = data && data.lofmpRmas ? data.lofmpRmas : undefined;
98
+ const rmas = rmasData && rmasData.items ? rmasData.items : [];
99
+ const totalCount = rmasData && typeof rmasData.total_count !== 'undefined' && rmasData.total_count !== null
100
+ ? rmasData.total_count
101
+ : 0;
102
+ // Use page_info.total_pages if available, fallback to manual calculation
103
+ const totalPagesFromData = rmasData && rmasData.page_info && typeof rmasData.page_info.total_pages !== 'undefined'
104
+ ? rmasData.page_info.total_pages
105
+ : (totalCount ? Math.ceil(totalCount / pageSize) : null);
106
+
107
+ // Keep pagination total pages in sync with query result
108
+ useEffect(() => {
109
+ setTotalPages(totalPagesFromData);
110
+ return () => setTotalPages(null);
111
+ }, [setTotalPages, totalPagesFromData]);
112
+
113
+ const isLoadingWithoutData = rmaId ? (!rmaDetailData && rmaDetailLoading) : (!data && loading);
114
+ const isBackgroundLoading = rmaId ? (!!rmaDetailData && rmaDetailLoading) : (!!data && loading);
115
+
116
+ const pageInfo = useMemo(() => {
117
+ if (!rmaId && data) {
118
+ const currentShown = Math.min(currentPage * pageSize, totalCount);
119
+ return { current: currentShown, total: totalCount };
120
+ }
121
+ return null;
122
+ }, [rmaId, data, currentPage, pageSize, totalCount]);
123
+
124
+ const derivedErrorMessage = useMemo(
125
+ () => deriveErrorMessage([rmaId ? rmaDetailError : error]),
126
+ [rmaId, rmaDetailError, error]
127
+ );
128
+
129
+ const handleReset = useCallback(() => {
130
+ setSearchText('');
131
+ setCurrentPage(1);
132
+ }, [setCurrentPage]);
133
+
134
+ const handleSubmit = useCallback(
135
+ ({ search }) => {
136
+ setSearchText(search);
137
+ setCurrentPage(1);
138
+ },
139
+ [setCurrentPage]
140
+ );
141
+
142
+ // Update the page indicator if the GraphQL query is in flight.
143
+ useEffect(() => {
144
+ setPageLoading(isBackgroundLoading);
145
+ }, [isBackgroundLoading, setPageLoading]);
146
+
147
+ const pageControl = useMemo(
148
+ () => ({ currentPage, setPage: setCurrentPage, totalPages }),
149
+ [currentPage, setCurrentPage, totalPages]
150
+ );
151
+
152
+ return {
153
+ errorMessage: derivedErrorMessage,
154
+ handleReset,
155
+ handleSubmit,
156
+ isBackgroundLoading,
157
+ isLoadingWithoutData,
158
+ loadMoreRmas: null,
159
+ rmas,
160
+ pageInfo,
161
+ searchText,
162
+ pageControl,
163
+ createRma,
164
+ createRmaLoading,
165
+ createRmaError,
166
+ createRmaData,
167
+ confirmShipping,
168
+ confirmShippingLoading,
169
+ confirmShippingError,
170
+ confirmShippingData,
171
+ rmaDetail: rmaDetailData ? rmaDetailData.lofmpRmaDetail : undefined,
172
+ rmaDetailLoading,
173
+ rmaDetailError,
174
+ refetchRmaDetail
175
+ ,sendRmaMessage, sendRmaMessageData, sendRmaMessageError, sendRmaMessageLoading
176
+ };
177
+ };
178
+
179
+ export default useRmaPage;