/** * @typedef {import('./cart').CartData} CartData * @typedef {import('./cart').CartShippingAddress} CartShippingAddress */ /** * @typedef {Object} StoreCart * * @property {Array} cartCoupons An array of coupons applied * to the cart. * @property {Array} cartItems An array of items in the * cart. * @property {number} cartItemsCount The number of items in the * cart. * @property {number} cartItemsWeight The weight of all items in * the cart. * @property {boolean} cartNeedsPayment True when the cart will * require payment. * @property {boolean} cartNeedsShipping True when the cart will * require shipping. * @property {Array} cartItemErrors Item validation errors. * @property {Object} cartTotals Cart and line total * amounts. * @property {boolean} cartIsLoading True when cart data is * being loaded. * @property {Array} cartErrors An array of errors thrown * by the cart. * @property {CartShippingAddress} shippingAddress Shipping address for the * cart. * @property {Array} shippingRates array of selected shipping * rates. * @property {boolean} shippingRatesLoading Whether or not the * shipping rates are * being loaded. * @property {boolean} hasShippingAddress Whether or not the cart * has a shipping address yet. * @property {function(Object):any} receiveCart Dispatcher to receive * updated cart. */ /** * @typedef {Object} StoreCartCoupon * * @property {Array} appliedCoupons Collection of applied coupons from the * API. * @property {boolean} isLoading True when coupon data is being loaded. * @property {Function} applyCoupon Callback for applying a coupon by code. * @property {Function} removeCoupon Callback for removing a coupon by code. * @property {boolean} isApplyingCoupon True when a coupon is being applied. * @property {boolean} isRemovingCoupon True when a coupon is being removed. */ /** * @typedef {Object} StoreCartItemAddToCart * * @property {number} cartQuantity The quantity of the item in the * cart. * @property {boolean} addingToCart Whether the cart item is still * being added or not. * @property {boolean} cartIsLoading Whether the cart is being loaded. * @property {Function} addToCart Callback for adding a cart item. */ /** * @typedef {Object} StoreCartItemQuantity * * @property {number} quantity The quantity of the item in the * cart. * @property {boolean} isPendingDelete Whether the cart item is being * deleted or not. * @property {Function} changeQuantity Callback for changing quantity * of item in cart. * @property {Function} removeItem Callback for removing a cart item. * @property {Object} cartItemQuantityErrors An array of errors thrown by * the cart. */ /** * @typedef {Object} EmitResponseTypes * * @property {string} SUCCESS To indicate a success response. * @property {string} FAIL To indicate a failed response. * @property {string} ERROR To indicate an error response. */ /** * @typedef {Object} NoticeContexts * * @property {string} PAYMENTS Notices for the payments step. * @property {string} EXPRESS_PAYMENTS Notices for the express payments step. */ /* eslint-disable jsdoc/valid-types */ // Enum format below triggers the above rule even though VSCode interprets it fine. /** * @typedef {NoticeContexts['PAYMENTS']|NoticeContexts['EXPRESS_PAYMENTS']} NoticeContextsEnum */ /** * @typedef {Object} EmitSuccessResponse * * @property {EmitResponseTypes['SUCCESS']} type Should have the value of * EmitResponseTypes.SUCCESS. * @property {string} [redirectUrl] If the redirect url should be changed set * this. Note, this is ignored for some * emitters. * @property {Object} [meta] Additional data returned for the success * response. This varies between context * emitters. */ /** * @typedef {Object} EmitFailResponse * * @property {EmitResponseTypes['FAIL']} type Should have the value of * EmitResponseTypes.FAIL * @property {string} message A message to trigger a notice for. * @property {NoticeContextsEnum} [messageContext] What context to display any message in. * @property {Object} [meta] Additional data returned for the fail * response. This varies between context * emitters. */ /** * @typedef {Object} EmitErrorResponse * * @property {EmitResponseTypes['ERROR']} type Should have the value of * EmitResponseTypes.ERROR * @property {string} message A message to trigger a notice for. * @property {boolean} retry If false, then it means an * irrecoverable error so don't allow for * shopper to retry checkout (which may * mean either a different payment or * fixing validation errors). * @property {Object} [validationErrors] If provided, will be set as validation * errors in the validation context. * @property {NoticeContextsEnum} [messageContext] What context to display any message in. * @property {Object} [meta] Additional data returned for the fail * response. This varies between context * emitters. */ /* eslint-enable jsdoc/valid-types */ /** * @typedef {Object} EmitResponseApi * * @property {EmitResponseTypes} responseTypes An object of various response types that can * be used in returned response objects. * @property {NoticeContexts} noticeContexts An object of various notice contexts that can * be used for targeting where a notice appears. * @property {function(Object):boolean} shouldRetry Returns whether the user is allowed to retry * the payment after a failed one. * @property {function(Object):boolean} isSuccessResponse Returns whether the given response is of a * success response type. * @property {function(Object):boolean} isErrorResponse Returns whether the given response is of an * error response type. * @property {function(Object):boolean} isFailResponse Returns whether the given response is of a * fail response type. */ export {}; /** * Internal dependencies */ import { ACTION_TYPES as types } from './action-types'; /** * Action creator for setting a single query-state value for a given context. * * @param {string} context Context for query state being stored. * @param {string} queryKey Key for query item. * @param {*} value The value for the query item. * * @return {Object} The action object. */ export const setQueryValue = ( context, queryKey, value ) => { return { type: types.SET_QUERY_KEY_VALUE, context, queryKey, value, }; }; /** * Action creator for setting query-state for a given context. * * @param {string} context Context for query state being stored. * @param {*} value Query state being stored for the given context. * * @return {Object} The action object. */ export const setValueForQueryContext = ( context, value ) => { return { type: types.SET_QUERY_CONTEXT_VALUE, context, value, }; };
Phụ kiện camera đa dạng, chính hãng, giá tốt
\tC\u1eeda h\u00e0ng ph\u1ee5 ki\u1ec7n camera quan s\u00e1t \u0111\u1ecba ch\u1ec9 cung c\u1ea5p \u1ed5 c\u1ee9ng HDD uy t\u00edn c\u1ee7a c\u00e1c th\u01b0\u01a1ng hi\u1ec7u h\u00e0ng \u0111\u1ea7u tr\u00ean th\u1ebf gi\u1edbi v\u1edbi \u0111\u1ea7y \u0111\u1ee7 lo\u1ea1i dung l\u01b0\u1ee3ng. Nh\u01b0ng mua \u1edf c\u1eeda h\u00e0ng \u1ed5 c\u1ee9ng HDD 500GB gi\u00e1 bao nhi\u00eau<\/strong><\/a><\/p>\n \t\u1ed4 c\u1ee9ng HDD l\u00e0 n\u01a1i l\u01b0u tr\u1eef h\u1ec7 \u0111i\u1ec1u h\u00e0nh c\u1ee7a m\u00e1y t\u00ednh, c\u00e1c file v\u0103n b\u1ea3n, t\u1eadp tin \u1ee9ng d\u1ee5ng c\u1ee7a m\u00e1y.<\/p>\n \t\u1ed4 c\u1ee9ng HDD 500 GB c\u00f3 c\u00e1c b\u1ed9 ph\u1eadn \u0111\u0129a c\u1ee9ng v\u00e0 \u0111\u1ea7u \u0111\u1ecdc t\u1eeb. \tV\u1ec1 \u0111\u1ea7u \u0111\u1ecdc t\u1eeb: M\u1ed7i \u1ed5 c\u1ee9ng HDD c\u00f3 m\u1ed9t \u0111\u1ea7u \u0111\u1ecdc v\u00e0 m\u1ed9t \u0111\u1ea7u ghi \u0111\u01b0\u1ee3c n\u1ed1i b\u1edfi c\u1ea7n chuy\u00ean c\u01a1<\/p>\n \t\u1ed4 c\u1ee9ng HDD \u0111\u01b0\u1ee3c nhi\u1ec1u h\u00e3ng \u0111i\u1ec7n t\u1eed s\u1ea3n xu\u1ea5t nh\u01b0 samsung, seagate, hitachi, toshiba, western v\u1edbi nhi\u1ec1u m\u1ee9c gi\u00e1 kh\u00e1c nhau 1 ch\u00fat. C\u00e1c h\u00e3ng kh\u00e1c nhau th\u00ec gi\u00e1 kh\u00e1c nhau v\u00ec dung l\u01b0\u1ee3ng kh\u00e1c nhau, kh\u1ea3 n\u0103ng ti\u00eau hao kh\u00e1c nhau, t\u1ed1c \u0111\u1ed9 quay kh\u00e1c nhau.<\/p>\n \tNh\u01b0 v\u1eady \u1ed5 c\u1ee9ng HDD 500 GB l\u00e0 \u1ed5 c\u1ee9ng c\u00f3 k\u00edch th\u01b0\u1edbc dung l\u01b0\u1ee3ng t\u1ed1i \u0111a l\u00e0 500GB, T\u1ed1c \u0111\u1ed9 quay: 7.200 rpm,<\/p>\n \tC\u1eeda h\u00e0ng ph\u1ee5 ki\u1ec7n camera quan s\u00e1t l\u00e0 c\u1eeda h\u00e0ng ph\u00e2n ph\u1ed1i ch\u00ednh h\u00e3ng \u1ed5 c\u1ee9ng HDD 500GB c\u1ee7a t\u1ea5t c\u1ea3 h\u00e3ng tr\u00ean v\u1edbi gi\u00e1 r\u1ebb nh\u1ea5t TPHCM, c\u1ee5 th\u1ec3:<\/p>\n \t<\/p>\n\tT\u00ecm hi\u1ec3u v\u1ec1 \u1ed5 c\u1ee9ng HDD 500GB<\/strong><\/span><\/h2>\n
\tV\u1ec1 h\u00ecnh d\u1ea1ng c\u1ea5u t\u1ea1o: l\u00e0 m\u1ed9t h\u1ec7 th\u1ed1ng g\u1ed3m nhi\u1ec1u \u0111\u0129a c\u1ee9ng x\u1ebfp v\u1edbi nhau b\u1eb1ng tr\u1ee5c m\u00f4 t\u01a1 quay \u0111\u01b0\u1ee3c l\u00e0m b\u1eb1ng th\u1ee7y tinh, ho\u1eb7c nh\u00f4m. Do \u0111\u00f3 c\u00e1c \u0111\u0129a c\u1ee9ng n\u00e0y ngang b\u1eb1ng nhau v\u1ec1 t\u1ed1c \u0111\u1ed9. Tr\u01b0\u1edbc khi ph\u00e1t minh ra \u0111\u0129a c\u1ee9ng n\u00e0y th\u00ec ng\u01b0\u1eddi ta d\u00f9ng b\u0103ng t\u1eeb. Th\u1ebf nh\u01b0ng thay v\u00ec ph\u1ea3i ng\u1ed3i \u0111\u1ee3i h\u00e0ng bao nhi\u00eau m\u00e9t b\u0103ng cu\u1ed1n xong th\u00ec c\u00e1c \u0111\u1ea7u \u0111\u1ecdc t\u1eeb s\u1ebd tr\u1ef1c ti\u1ebfp ch\u1ea1m \u0111\u01b0\u1ee3c v\u00e0o ch\u1ed7 d\u1eef li\u1ec7u l\u01b0u tr\u1eef.<\/p>\n\tB\u00e1o gi\u00e1 \u1ed5 c\u1ee9ng HDD 500GB<\/strong><\/span><\/h2>\n