State components
Every empty, loading, error, confirmation and gate component in the mobile app, with its copy and where it is used.
Empty states
Props: image or icon, title, description, optional CTA
Action: prop CTA → prop
Used in: see rows below
src/shared/components/ui/empty-state.tsx:62Sign in to The Raw / Collect stamps, save favourites and track your orders.
Action: Sign in → auth sheet
Used in: edit-profile, beauty-profile, beauty-quiz, order-list, wishlist-screen
src/shared/components/ui/sign-in-required.tsx:1812 reasons, e.g. Sign in to save this / Your wishlist follows you to any phone.
Action: Sign in → auth sheet
Used in: login sheet title
src/shared/constants/sign-in-reasons.ts:28Sign in to manage addresses / Save addresses to speed up checkout and delivery details.
Action: Sign in → requireSignIn addresses
Used in: profile/settings/account/addresses
src/app/(app)/(tabs)/profile/settings/account/addresses.tsx:92Sign in to view discounts / Sign in to view your earned vouchers and exclusive discounts.
Action: Sign in → requireSignIn vouchers
Used in: profile/settings/account/discount-pool
src/app/(app)/(tabs)/profile/settings/account/discount-pool.tsx:66Sign in to contact us / Support messages are linked to your account so our team can reply.
Action: Sign in → requireSignIn support
Used in: profile/settings/support/contact-us
src/app/(app)/(tabs)/profile/settings/support/contact-us.tsx:237Sign in to view notifications / Your notifications will appear here once you're signed in
Action: Sign in → requireSignIn notifications
Used in: notifications
src/features/notifications/components/notifications-list-screen.tsx:138Sign in to manage preferences / Customize your notification settings once you're signed in
Action: Sign in → requireSignIn notifications
Used in: notification-preferences
src/app/(modals)/notification-preferences.tsx:162No saved addresses / Save an address to prefill delivery details at checkout.
Used in: profile/settings/account/addresses
src/app/(app)/(tabs)/profile/settings/account/addresses.tsx:198Your wishlist is empty / Tap the heart on any product to save it here for later.
Action: Start shopping → Shop tab
Used in: wishlist
src/features/wishlist/components/wishlist-screen.tsx:202No Orders Yet / Start shopping to place your first order and track it here.
Action: Start Shopping → Home
Used in: orders
src/features/orders/components/list/_internal/empty-state.tsx:16No matching orders / Try a different search term
Used in: orders
src/features/orders/components/list/order-list.tsx:486All caught up / No notifications to show
Used in: notifications
src/features/notifications/components/notifications-list-screen.tsx:35Your bag is empty / Let's fill it with your favourite finds and great deals!
Action: Start shopping → product list
Used in: my-bag
src/features/cart/components/core/empty-cart-state.tsx:63No Discounts Yet / Earn vouchers by collecting stamps and playing Shake to Win
Action: Start Earning → Loyalty tab
Used in: profile/settings/account/discount-pool
src/features/vouchers/components/voucher-empty-state.tsx:23No vouchers yet, earn them through stamps and rewards.
Used in: my-bag
src/features/cart/components/vouchers/voucher-sheet.tsx:283No products found / Try adjusting your filters or check back later
Used in: shop, product-list/[id]
src/features/product-list/components/ui/no-results-state.tsx:12No products found for <query> / Try a different search term
Used in: search
src/features/search/components/states/no-results.tsx:24No reviews yet. Be the first to share your thoughts!
Used in: product-reviews/[id]
src/features/reviews/components/reviews-list-view.tsx:158No saved addresses yet. Add one to speed up checkout.
Action: Add new address → address form
Used in: checkout, my-bag
src/features/addresses/components/address-picker-modal.tsx:62No avatars available / Ask an admin to activate avatars in the dashboard.
Used in: (modals)/select-avatar
src/app/(modals)/select-avatar.tsx:146No activity yet / Your stamp collection history will appear here
Used in: loyalty
src/features/loyalty/components/activity-history.tsx:228No Active Campaign, Campaign Has Ended, You're Offline and 9 more; only two used
Action: Refresh, Retry, Sign in and others
Used in: loyalty
src/features/loyalty/components/shared/loyalty-empty-state.tsx:182Spend & collect stamps to unlock surprise rewards
Action: Get Started → requireSignIn loyalty
Used in: loyalty
src/features/loyalty/components/shared/loyalty-guest-view.tsx:35No recommendations yet / Retake the quiz to get updated suggestions
Action: Retake Quiz → beauty quiz
Used in: beauty-profile
src/app/(app)/beauty-profile.tsx:612Renders nothing when empty (recently viewed, category list)
Used in: home
src/features/home/components/recently-viewed-section.tsx:123Loading
Loading... (also Signing out..., Loading profile..., Loading notification...)
Used in: profile, edit-profile, addresses, discount-pool, loyalty, order-confirmation
src/shared/components/ui/feedback/page-loader.tsx:25Bare spinner, no copy
Used in: search, recently-viewed
src/shared/components/ui/feedback/loading-spinner.tsxWidth and height block, no copy
Used in: profile, addresses, discount-pool, loyalty, home, beauty-profile
src/shared/components/ui/primitives/skeleton.tsx:12Grouped shimmer; only SkeletonGroup user in the app
Used in: product/[id]
src/features/product/components/product-detail-skeleton.tsx:30Product grid skeletons, no copy
Used in: wishlist, shop, search
src/shared/components/product/skeleton-product-list.tsx:68OrderListSkeleton (5 rows), DetailSkeleton, NotificationSkeleton (6 rows)
Used in: orders, order detail, notifications
src/features/orders/components/list/order-list-skeleton.tsx:15Small spinners in footers, buttons, bottom bars and sheets
Used in: wishlist, notifications, product-list, product/[id]
src/shared/components/ui/primitives/button.tsx:114FilteringOverlay, reviews loading, Signing you in
Used in: product-list/[id], product-reviews/[id], auth
src/features/product-list/components/ui/filtering-overlay.tsx:28Splash image while the auth gate blocks, up to 15 s
Used in: app shell
src/app/(app)/_layout.tsx:19412 plain grey tiles, not a Skeleton
Used in: (modals)/select-avatar
src/app/(modals)/select-avatar.tsx:129Accent RefreshControl; notifications use a 400 ms fake spinner; vouchers no-op
Used in: orders, notifications, loyalty, discount-pool
src/features/orders/components/list/order-list.tsx:554Load More (n/total) or Showing all N orders
Action: Load More → next page
Used in: orders
src/features/orders/components/list/pagination-footer.tsx:21Syncing bag... / Processing...
Used in: my-bag
src/app/(app)/(tabs)/my-bag/index.tsx:836Errors
App Error / Something went wrong, but we can try to recover.
Action: Try Again, Retry Connection, Restart App
Used in: app root
src/shared/components/error/app-error-boundary.tsx:36Something Went Wrong / An unexpected error occurred. Please try again.
Action: Try Again (3 retries)
Used in: notifications/detail/[id]
src/shared/components/error/enhanced-error-boundary.tsxSomething went wrong / The <Tab> tab encountered an error. Shows raw error message.
Action: Try Again
Used in: home, shop, loyalty, my-bag, profile
src/shared/components/error/tab-error-boundary.tsx:34Something went wrong plus analyzed user message
Action: Try Again, Go Back, Go to Home
Used in: shop, product-list/[id]
src/shared/components/error/product-list-error-boundary.tsx:31Data Issue, Connection Issue, Authentication Required, Access Denied, Too Many Requests
Action: Try Again
Used in: discount-pool, notifications
src/shared/components/common/api-error-boundary.tsx:162Authentication Error / Something went wrong during authentication.
Action: Try Again, Go Back
Used in: auth/login, auth/verify, profile-completion
src/features/auth/components/auth-error-boundary.tsxAlert icon with title and message
Action: Retry
Used in: shake-to-win
src/features/loyalty/components/shake-to-win/error-boundary.tsx:30Framework default error screen
Used in: app root
src/app/_layout.tsx:128Oops! / This screen doesn't exist.
Action: Go to home screen! → /
Used in: unknown routes
src/app/+not-found.tsx:6Can't load your account / We couldn't reach our servers. Check your connection and try again.
Action: Try again; Continue browsing → degraded mode
Used in: app shell
src/app/(app)/_layout.tsx:204We couldn't load your account / You're signed in. Check your connection, then try again.
Action: Try again
Used in: auth/login, auth/verify, profile-completion
src/features/auth/components/signing-in-state.tsx:20Could not load your orders / Check your connection and try again.
Action: Try Again
Used in: orders
src/features/orders/components/list/order-list.tsx:88Could not load more orders.
Action: Try Again
Used in: orders
src/features/orders/components/list/order-list.tsx:526Could not load your wishlist / Check your connection and try again.
Action: Try Again
Used in: wishlist
src/features/wishlist/components/wishlist-screen.tsx:172Couldn't load notifications / Please check your connection and try again
Action: Try again
Used in: notifications
src/features/notifications/components/notifications-list-screen.tsx:161Unable to load notification / This notification may have been deleted.
Action: Go Back
Used in: notifications/detail/[id]
src/app/(app)/notifications/detail/[id].tsx:100Failed to load products / Please check your connection and try again
Action: Try Again
Used in: product-list/[id]
src/features/product-list/components/ui/product-list-error-state.tsx:28Unable to load vouchers / Something went wrong while loading your vouchers.
Action: Try Again (unreachable)
Used in: discount-pool
src/features/vouchers/components/voucher-list.tsx:366Unable to load order details / Please try again later
Action: Back to Home → Home
Used in: order-confirmation
src/app/(app)/order-confirmation.tsx:75Claim Failed plus message
Action: Try Again; Back to Home
Used in: duit-raya-flow
src/app/duit-raya-flow.tsx:815Unable to Load Document / The document could not be displayed in the app.
Action: Try Again; Open in Browser
Used in: legal PDFs
src/features/settings/components/legal/legal-pdf-viewer.tsx:147error, network-error, auth-error, server-error, offline types; none used
Action: Retry
Used in: loyalty
src/features/loyalty/components/shared/loyalty-empty-state.tsx:45Checkout in progress plus status text
Action: Close checkout
Used in: my-bag
src/app/(app)/(tabs)/my-bag/index.tsx:652Some items are unavailable / Remove them to proceed with checkout
Used in: my-bag
src/features/cart/components/unavailable-items-warning.tsx:31Items Unavailable; Out of stock, Not enough stock, No longer available
Action: Remove & Continue Checkout; Return to Cart
Used in: checkout
src/features/checkout/components/unavailable-items-modal.tsx:68Alert dialogs
Delete address? / <line1>, <postcode> <city>. Cancel, Delete
Action: Delete (destructive)
Used in: profile/settings/account/addresses
src/app/(app)/(tabs)/profile/settings/account/addresses.tsx:127Document unavailable / This document cannot be opened from the app right now.
Action: OK
Used in: legal PDFs
src/features/settings/components/legal/legal-pdf-viewer.tsx:86Unable to open document / Please try again later or contact support.
Action: OK
Used in: legal PDFs
src/features/settings/components/legal/legal-pdf-viewer.tsx:96Add Photo / Choose an option
Action: Camera; Photo Library; Cancel
Used in: product-reviews/[id]
src/features/product/components/variants/image-picker-grid.tsx:176Block User / Block <name>? You won't see their reviews anymore.
Action: Block (destructive)
Used in: product-reviews/[id]
src/features/reviews/components/report-review-sheet.tsx:108Some items unavailable / server message
Action: View Cart → /my-bag
Used in: orders
src/features/orders/hooks/use-reorder.ts:34Reorder failed / server message or Something went wrong. Please try again.
Action: OK
Used in: orders
src/features/orders/hooks/use-reorder.ts:44Mark as received? / Confirm you've received this parcel. This marks the order as delivered.
Action: Mark received
Used in: orders/[id]
src/features/orders/hooks/use-mark-received.ts:23Could not update / server message or Something went wrong. Please try again.
Action: OK
Used in: orders/[id]
src/features/orders/hooks/use-mark-received.ts:39Camera Access Required / enable camera access in Settings > Privacy > Camera > THERAW.
Action: Open Settings; Cancel
Used in: duit-raya-flow
src/shared/hooks/utils/use-camera-permission.ts:136Toasts
HeroUI toast (about 55 sites) and flash-message wrapper (3 to 4 s) in use together
Used in: app root
src/app/_layout.tsx:415Could not delete account / error message or Please check your connection and try again.
Used in: profile
src/app/(app)/(tabs)/profile/index.tsx:315Success / Profile updated successfully; Update failed
Used in: edit-profile
src/app/(app)/edit-profile.tsx:85Message Sent; Failed to Send; warning Sign In Required
Used in: contact-us
src/app/(app)/(tabs)/profile/settings/support/contact-us.tsx:154Email Copied / cx@theraw.com.my has been copied to clipboard.
Used in: faq
src/app/(app)/(tabs)/profile/settings/support/faq.tsx:47Address deleted; Default address updated; Location permission needed; Unable to save address
Used in: addresses, address-form
src/app/(app)/(tabs)/profile/settings/account/addresses.tsx:114Unable to Remove Item; Checkout In Progress; Promo code applied; Invalid promo code; Variant updated
Used in: my-bag
src/app/(app)/(tabs)/my-bag/index.tsx:294Failed to add to bag; Checkout failed
Used in: product/[id]
src/features/product/components/product-detail-page.tsx:217Saved to wishlist; Removed from wishlist; Could not update wishlist; Slow down a moment
Used in: wishlist, product/[id]
src/features/wishlist/hooks/use-wishlist-set.ts:59Rating Required; Review Exists; Cannot Report; User Blocked
Used in: product-reviews/[id]
src/features/reviews/components/review-form-view.tsx:66Voucher Unavailable; Code Copied; Copy Failed
Used in: discount-pool, my-bag
src/features/vouchers/hooks/use-voucher-actions.ts:50Could not delete notification; Notification deleted / Tap to undo
Action: Tap to undo → restore
Used in: notifications
src/features/notifications/hooks/use-notification-inbox.ts:188Notifications Disabled; Error; both close the modal
Used in: notification-permission
src/app/(modals)/notification-permission.tsx:118Cannot open link; Could not save profile / Please check your connection and try again.
Used in: marketing, beauty-quiz
src/features/marketing/components/marketing-page.tsx:87WhatsApp open failure toast
Used in: auth
src/features/auth/components/support-help-button.tsx:19Confirmations
Sign out? / You will need to sign in again.
Action: Cancel; Sign out
Used in: profile
src/shared/components/ui/dialog/sign-out-confirmation-dialog.tsx:43Delete Account / Are you sure? All your data will be permanently removed.
Action: Cancel; Delete
Used in: profile
src/app/(app)/(tabs)/profile/index.tsx:299Native alert, see Alert dialogs
Action: Cancel; Delete
Used in: addresses
src/app/(app)/(tabs)/profile/settings/account/addresses.tsx:127Native alert, see Alert dialogs
Action: Cancel; Block
Used in: product-reviews/[id]
src/features/reviews/components/report-review-sheet.tsx:108Native alert, see Alert dialogs
Action: Cancel; Mark received
Used in: orders/[id]
src/features/orders/hooks/use-mark-received.ts:23No dialog; swipe left, optimistic delete with Tap to undo toast
Action: Tap to undo
Used in: notifications
src/features/notifications/components/notification-row.tsx:245No confirmation; mutation runs at once, failure toast only
Used in: my-bag
src/app/(app)/(tabs)/my-bag/index.tsx:395Immediate with informative toasts
Used in: my-bag
src/features/cart/hooks/use-cart-discount.tsClose checkout button, no extra confirm
Action: Close checkout
Used in: my-bag
src/app/(app)/(tabs)/my-bag/index.tsx:667Immediate; error only logged
Used in: search
src/app/(public)/search.tsx:249Remove All Data? / Remove All; exists but unused
Action: Remove All
Used in: none
src/shared/components/ui/dialog/sign-out-confirmation-dialog.tsx:4364px icon disc, title, message, confirm and outline cancel; dismiss blocked while confirming
Used in: profile
src/shared/components/ui/feedback/confirmation-dialog.tsx:90Gates
Screen stays mounted; CTA opens auth sheet then runs onSignedIn
Action: Sign in → auth sheet
Used in: edit-profile, orders, wishlist, addresses, discount-pool, contact-us
src/shared/components/ui/sign-in-required.tsx:18Root modal titled from SIGN_IN_COPY by reason
Used in: app root
src/app/_layout.tsx:197Signed-in account without details gets profile-completion pushed once
Action: → /auth/profile-completion
Used in: app shell
src/app/(app)/_layout.tsx:176Splash, then timeout fallback; Continue browsing sets degraded mode
Action: Continue browsing
Used in: app shell
src/app/(app)/_layout.tsx:151Deleted or suspended accounts signed out silently, no message
Used in: app shell
src/features/auth/hooks/use-post-auth-redirect.ts:85Know when your order ships / Turn on notifications for shipping updates, new stamps and vouchers.
Action: Turn on notifications; Not now
Used in: order-confirmation
src/app/(modals)/notification-permission.tsx:155Granted closes; denied shows warning toast; error shows danger toast
Used in: notification-permission
src/app/(modals)/notification-permission.tsx:97Alert with Open Settings
Action: Open Settings
Used in: duit-raya-flow
src/shared/hooks/utils/use-camera-permission.ts:136Location permission needed / Enable location access to autofill your address.
Used in: address-form
src/features/addresses/components/address-form.tsx:340Update available / A newer version of the app is available. Update now to get the latest features.
Action: Update Now → store; Later
Used in: app root
src/shared/components/update/app-update-modal.tsx:17None found; update modal is always dismissible (7 days)
Used in: none
unverifiedSign-in gate with reason duit-raya, camera permission, result sheets
Action: Sign in
Used in: duit-raya-flow
src/app/duit-raya-flow.tsxSheets
Title: Select Country
Used in: auth/login
src/features/auth/components/forms/phone-login-country-picker.tsx:37Title: prop
Used in: edit-profile
src/shared/components/ui/primitives/select.tsx:98Title: prop
Used in: edit-profile
src/shared/components/ui/forms/date-picker-bottom-sheet.tsx:187Bottom sheet
Used in: product/[id]
src/features/product/components/variants/variant-selection-sheet.tsx:122Title: Report Review
Used in: product-reviews/[id]
src/features/reviews/components/report-review-sheet.tsx:141Title: Items Unavailable
Used in: checkout
src/features/checkout/components/unavailable-items-modal.tsx:68Title: Deliver to
Used in: checkout, my-bag
src/features/addresses/components/address-picker-modal.tsx:46Title: Select a state
Used in: address-form
src/features/addresses/components/address-form.tsx:710Title: step name
Used in: beauty-profile
src/features/beauty-profile/components/see-all-products-modal.tsx:35Title: Vouchers & Promo
Used in: my-bag
src/features/cart/components/vouchers/voucher-sheet.tsx:229Title: Choose variant
Used in: my-bag
src/features/cart/components/variant-switcher-sheet.tsx:75Title: Checkout details
Used in: my-bag
src/features/cart/components/checkout-details-sheet.tsx:105Title: prop
Used in: product-list/[id]
src/features/product-list/components/filters/filter-bottom-sheet.tsx:46Bottom sheet
Used in: loyalty
src/features/loyalty/components/shake-to-win/simple-shake-reward.tsx:224Bottom sheet
Used in: duit-raya-flow
src/app/duit-raya-flow.tsx:410Title: New Address / Edit Address
Used in: addresses
src/app/(app)/_layout.tsx:344Title: row label
Used in: profile, edit-profile
src/shared/components/ui/anchored-menu.tsxTitle: HeroUI Dialog
Used in: profile, app root
src/shared/components/ui/feedback/confirmation-dialog.tsxTitle: notification-permission, notification-preferences, select-avatar
Used in: profile
src/app/(modals)/_layout.tsx:33Building blocks
HeroUI wrapper; variants default, secondary, outline, destructive, ghost, link, oval; loading prop
Used in: all screens
src/shared/components/ui/primitives/button.tsxpressto gesture-handler redirect
Used in: all screens
src/shared/components/ui/utils/pressto.tsxOutlined accent pill, 2px border, 48px min height
Used in: profile
src/features/settings/components/sections/logout-button.tsxSettings toggle
Used in: notification-preferences
src/shared/components/ui/styled-switch.tsxImage, brand, title, rating, price, badge, wishlist heart; skeleton twin
Used in: shop, search, wishlist, home
src/shared/components/product/product-card/index.tsx:164Order summary card
Used in: orders
src/features/orders/components/list/_internal/order-card.tsx:49Voucher card; cart coupon in voucher-sheet
Used in: discount-pool, my-bag
src/features/vouchers/components/voucher-card.tsx:62Swipe left to delete, unread styling, category avatars
Used in: notifications
src/features/notifications/components/notification-row.tsx:327Address with edit, delete, default
Used in: addresses
src/features/addresses/components/address-card.tsx:32Wishlist product card
Used in: wishlist
src/features/wishlist/components/_internal/wishlist-card.tsx:63Titled group, rounded surface, 52px rows with chevron
Used in: profile
src/features/settings/components/sections/settings-menu-section.tsx:39Accent hero with avatar, name, contact line and stat tiles
Used in: profile
src/features/settings/components/sections/profile-header-card.tsx:44Label and value row
Used in: orders/[id]
src/shared/components/ui/detail-row.tsx:14HeroUI list group rows
Used in: edit-profile, notification-preferences
src/features/beauty-profile/components/edit-profile-form.tsxAll, Pending, Processing, Shipped, Delivered, Cancelled
Used in: orders
src/features/orders/components/list/status-filter-chips.tsx:37All, Orders, Rewards, Promos
Used in: notifications
src/features/notifications/components/notification-filter-chips.tsx:21Shop filters
Used in: shop
src/features/product-list/components/filters/Home, Shop, My Bag, Loyalty, Profile; bag count and unread badges cap at 99+
Used in: app shell
src/app/(app)/(tabs)/_layout.tsx:77Orders, Stamps, Notifications
Used in: profile
src/features/settings/components/sections/profile-header-card.tsx:157No shared Badge; each feature draws its own
Used in: product/[id], orders/[id], discount-pool
src/features/product/components/product-info-block.tsxGlass or flat 40px, label Go back
Used in: all stacks
src/shared/components/ui/navigation/header-components.tsx:32Close control for modals
Used in: (modals)
src/shared/components/ui/navigation/header-components.tsx:68standardHeaderStyle, opaqueHeaderOptions, modalHeaderStyle
Used in: (app), settings, legal, (modals)
src/shared/utils/header-stylesSearch bar header
Used in: search
src/shared/components/ui/search-header.tsx:28Wishlist: back, Wishlist, n item(s) saved; orders appBar; beauty Header
Used in: wishlist, orders, beauty-profile
src/features/wishlist/components/wishlist-screen.tsx:135Wizard header, progress and selection card
Used in: beauty-quiz
src/shared/components/wizard/wizard-header.tsx@expo/ui BottomSheet on iOS and Compose ModalBottomSheet on Android; header, footer, dismissible
Used in: all sheets
src/shared/components/ui/app-bottom-sheet.tsx