web-src 폴더의 목적 살펴보기 web-src-folder

이 샘플 앱의 web-src 폴더에는 많은 JavaScript 파일과 폴더가 있습니다. 이 폴더는 사용자 인터페이스가 있는 애플리케이션에 사용됩니다. 일부 애플리케이션에서는 이 기능을 사용하지 않습니다. 예를 들어, 외부 인벤토리 관리 시스템과 Commerce 통합에는 프론트엔드 인터페이스와 코드가 필요하지 않을 수 있습니다.

이 비디오는 누구의 것입니까?

  • web-src 폴더 및 해당 콘텐츠에 대해 학습하는 개발자로서 Adobe App Builder을 사용하여 경험이 제한된 Adobe Commerce을 처음 사용하는 개발자입니다.

비디오 콘텐츠

  • web-src 폴더의 주요 용도는 무엇입니까?
  • 일반적으로 포함된 파일 및 폴더
  • 샘플 응용 프로그램에서 web-src 폴더와 내부 내용을 사용하는 방법

코드 샘플

web-src/src/components/Orders.js

/*
 * Copyright 2023 Adobe
 * All Rights Reserved.
 *
 * NOTICE: All information contained herein is, and remains
 * the property of Adobe and its suppliers, if any. The intellectual
 * and technical concepts contained herein are proprietary to Adobe
 * and its suppliers and are protected by all applicable intellectual
 * property laws, including trade secret and copyright laws.
 * Dissemination of this information or reproduction of this material
 * is strictly forbidden unless prior written permission is obtained
 * from Adobe.
 */
import {
    Content,
    Heading,
    IllustratedMessage,
    TableView,
    TableHeader,
    TableBody,
    Column,
    Row,
    Cell,
    View,
    Flex,
    ProgressCircle
} from '@adobe/react-spectrum'
import {useCommerceOrders} from '../hooks/useCommerceOrders'

export const Orders = props => {

    const {isLoadingCommerceOrders, commerceOrders} = useCommerceOrders(props)

    const ordersColumns = [
        {name: 'Order Id', uid: 'increment_id'},
        {name: 'Status', uid: 'status'},
        {name: 'Store Name', uid: 'store_name'},
        {name: 'Total Item Count', uid: 'total_item_count'},
        {name: 'Total Quantity', uid: 'total_qty_ordered'},
        {name: 'Total Due', uid: 'total_due'},
        {name: 'Tax', uid: 'tax_amount'},
        {name: 'Created At', uid: 'created_at'}
    ]

    function renderEmptyState() {
        return (
            <IllustratedMessage>
                <Content>No data available</Content>
            </IllustratedMessage>
        )
    }

    return (

        <View>
            {isLoadingCommerceOrders ? (
                <Flex alignItems="center" justifyContent="center" height="100vh">
                    <ProgressCircle size="L" aria-label="Loading…" isIndeterminate/>
                </Flex>
            ) : (
                <View margin={10}>
                    <Heading level={1}>Fetched orders from Adobe Commerce</Heading>
                    <TableView
                        overflowMode="wrap"
                        aria-label="orders table"
                        flex
                        renderEmptyState={renderEmptyState}
                        height="static-size-1000"
                    >
                        <TableHeader columns={ordersColumns}>
                            {column => <Column key={column.uid}>{column.name}</Column>}
                        </TableHeader>
                        <TableBody items={commerceOrders}>
                            {order => (
                                <Row key={order['increment_id']}>{columnKey => <Cell>{order[columnKey]}</Cell>}</Row>
                            )}
                        </TableBody>
                    </TableView>
                </View>
            )}
        </View>
    )
}

web-src/src/hooks/useCommerceOrders.js

CAUTION
API 호출을 수행할 때 일종의 searchCriteria가 사용되는지 확인하십시오. 페이지 매김을 사용하는 것도 고려해 볼 수 있습니다. Adobe Commerce의 결과가 너무 크면 Adobe Developer App Builder 용량이 충족되어 파일이 예기치 않게 종료될 수 있습니다. 그 결과 400 오류로 인해 응답 형식이 잘못되었습니다.
예를 들어 Adobe Commerce에서 모든 현재 제품을 요청해야 한다고 가정해 보겠습니다. 결과 URL은 {{base_url}}rest/V1/products?searchCriteria=all과(와) 비슷합니다. 반환된 카탈로그의 크기에 따라 App Builder에서 사용하기에는 json이 너무 클 수 있습니다. 대신 페이지 매김을 사용하고 Response is not valid 'message/http'.을(를) 피하기 위해 몇 가지 요청을 하십시오.

아래 예제에서 코드 샘플은 요청을 제한하는 not입니다. 400 오류를 방지하려면 searchCriteria을(를) 사용하여 응답 크기를 줄이십시오.

?searchCriteria[filter_groups][0][filters][0][field]=created_at&searchCriteria[filter_groups][0][filters][0][value]=2022-12-01&searchCriteria[filter_groups][0][filters][0][condition_type]=gt

/*
 * Copyright 2023 Adobe
 * All Rights Reserved.
 *
 * NOTICE: All information contained herein is, and remains
 * the property of Adobe and its suppliers, if any. The intellectual
 * and technical concepts contained herein are proprietary to Adobe
 * and its suppliers and are protected by all applicable intellectual
 * property laws, including trade secret and copyright laws.
 * Dissemination of this information or reproduction of this material
 * is strictly forbidden unless prior written permission is obtained
 * from Adobe.
 */
import { useEffect, useState } from 'react'
import { callAction } from '../utils'

export const useCommerceOrders = props => {
    const [isLoadingCommerceOrders, setIsLoadingCommerceOrders] = useState(true)
    const [commerceOrders, setCommerceOrders] = useState([])

    const fetchCommerceOrders = async () => {
        const commerceOrdersResponse = await callAction(
            props,
            'commerce-rest-get',
            'orders?searchCriteria=all'
        )
        setCommerceOrders(commerceOrdersResponse.error ? [] : commerceOrdersResponse.items)
    }

    useEffect(() => {
        fetchCommerceOrders().then(() => setIsLoadingCommerceOrders(false))
    }, [])

    return { isLoadingCommerceOrders, commerceOrders }
}

App Builder - 첫 번째 앱 관련 페이지 작성

recommendation-more-help
3a5f7e19-f383-4af8-8983-d01154c1402f