@webority/mobile-support 0.104.1 → 0.107.0

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.
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.NewSupportTicket=void 0;var _mobileUi=require("@webority/mobile-ui"),_react=require("react"),_reactNative=require("react-native"),_client=require("../client.js"),_device=require("../device.js"),_SupportProvider=require("../SupportProvider.js"),_validation=require("../validation.js"),_PhotoTray=require("./PhotoTray.js"),_jsxRuntime=require("react/jsx-runtime");const TicketForm=({config:e,styles:t,onCreated:i,onCancel:r,initialDraft:a,defaultCategory:o,appVersion:s})=>{const n=(0,_SupportProvider.useCreateSupportTicket)(),listed=t=>t&&e.categories.includes(t)?t:void 0,[l,u]=(0,_react.useState)([]),[c,d]=(0,_react.useState)(a?.screenshots??[]),[m,p]=(0,_react.useState)(null),[g,x]=(0,_react.useState)(null),b=(0,_mobileUi.useForm)({initialValues:{category:listed(a?.category)??listed(o)??"",subject:a?.subject??"",body:a?.body??""},validate:{category:t=>(0,_validation.validateCategory)(t,e),subject:t=>(0,_validation.validateSubject)(t,e),body:t=>(0,_validation.validateBody)(t,e)},onSubmit:async t=>{const r=(0,_validation.validateFiles)([...c,...l],e);if(p(r??null),!r){x(null);try{const e=await n({category:t.category,subject:t.subject.trim(),body:t.body.trim(),pageUrl:a?.pageUrl,userAgent:a?.userAgent??(0,_device.describeDevice)(),appVersion:a?.appVersion??s,files:l,screenshots:c});i(e)}catch(e){x((0,_client.toSupportApiError)(e).message)}}}}),_=b.getFieldProps("category"),j=b.getFieldProps("subject"),y=b.getFieldProps("body"),h=c.length+l.length;return(0,_jsxRuntime.jsxs)(_mobileUi.KeyboardAwareScrollView,{contentContainerStyle:t.content,safeAreaEdges:[],children:[(0,_jsxRuntime.jsx)(_mobileUi.Text,{variant:"bodySmall",color:"secondary",children:"Tell us what you need. We reply by email and in this ticket."}),(0,_jsxRuntime.jsx)(_mobileUi.Select,{label:"Category",placeholder:"Choose a category",options:e.categories.map(e=>({label:e,value:e})),value:_.value||void 0,onChange:e=>_.setValue(String(e),!0),error:_.error,testID:"support-new-category"}),(0,_jsxRuntime.jsx)(_mobileUi.Input,{label:"Subject",placeholder:"A short summary",required:!0,maxLength:e.subjectMaxLength,value:j.value,onChangeText:j.onChangeText,onBlur:j.onBlur,error:j.error,testID:"support-new-subject"}),(0,_jsxRuntime.jsx)(_mobileUi.Input,{label:"Message",placeholder:"What happened, and what did you expect?",required:!0,multiline:!0,maxLength:e.bodyMaxLength,value:y.value,onChangeText:y.onChangeText,onBlur:y.onBlur,error:y.error,testID:"support-new-body"}),c.length>0&&(0,_jsxRuntime.jsx)(_PhotoTray.PhotoTray,{label:"Screenshot",photos:c,onChange:d,remaining:0,allowAdd:!1,maxBytes:e.maxAttachmentBytes,disabled:b.isSubmitting}),(0,_jsxRuntime.jsx)(_PhotoTray.PhotoTray,{label:"Photos",photos:l,onChange:u,remaining:e.maxAttachmentsPerMessage-h,maxBytes:e.maxAttachmentBytes,disabled:b.isSubmitting}),(0,_jsxRuntime.jsx)(_mobileUi.Text,{variant:"caption",color:"tertiary",children:`Attach up to ${e.maxAttachmentsPerMessage} files.`}),(m||g)&&(0,_jsxRuntime.jsx)(_mobileUi.Text,{variant:"bodySmall",color:"danger",accessibilityLiveRegion:"polite",children:m??g}),(0,_jsxRuntime.jsxs)(_reactNative.View,{style:t.actions,children:[r&&(0,_jsxRuntime.jsx)(_mobileUi.Button,{title:"Cancel",variant:"ghost",tone:"neutral",onPress:r,disabled:b.isSubmitting}),(0,_jsxRuntime.jsx)(_mobileUi.Button,{title:"Send ticket",loading:b.isSubmitting,disabled:b.isSubmitting,onPress:b.submit,testID:"support-new-submit"})]})]})},NewSupportTicket=e=>{const t=(0,_mobileUi.useTheme)(),i=(0,_react.useMemo)(()=>buildStyles(t),[t]),{config:r,loading:a,error:o,reload:s}=(0,_SupportProvider.useSupportConfig)(),n=e.testID??"support-new-ticket";return r?(0,_jsxRuntime.jsx)(_reactNative.View,{style:i.root,testID:n,children:(0,_jsxRuntime.jsx)(TicketForm,{...e,config:r,styles:i})}):(0,_jsxRuntime.jsx)(_reactNative.View,{style:i.center,testID:n,children:a?(0,_jsxRuntime.jsx)(_mobileUi.Spinner,{accessibilityLabel:"Loading"}):(0,_jsxRuntime.jsxs)(_jsxRuntime.Fragment,{children:[(0,_jsxRuntime.jsx)(_mobileUi.Text,{variant:"body",color:"danger",align:"center",children:o?.message??"Support is not available right now."}),(0,_jsxRuntime.jsx)(_mobileUi.Button,{title:"Try again",variant:"ghost",onPress:()=>{s()}})]})})};exports.NewSupportTicket=NewSupportTicket;const buildStyles=e=>_reactNative.StyleSheet.create({root:{flex:1},content:{padding:e.space.md,gap:e.space.md},center:{flex:1,alignItems:"center",justifyContent:"center",padding:e.space.xl,gap:e.space.sm},actions:{flexDirection:"row",justifyContent:"flex-end",gap:e.space.sm}});
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.NewSupportTicket=void 0;var _mobileUi=require("@webority/mobile-ui"),_react=require("react"),_reactHookForm=require("react-hook-form"),_reactNative=require("react-native"),_client=require("../client.js"),_device=require("../device.js"),_SupportProvider=require("../SupportProvider.js"),_validation=require("../validation.js"),_PhotoTray=require("./PhotoTray.js"),_jsxRuntime=require("react/jsx-runtime");const TicketForm=({config:e,styles:t,onCreated:o,onCancel:r,initialDraft:i,defaultCategory:a,appVersion:n})=>{const s=(0,_SupportProvider.useCreateSupportTicket)(),listed=t=>t&&e.categories.includes(t)?t:void 0,[l,c]=(0,_react.useState)([]),[u,d]=(0,_react.useState)(i?.screenshots??[]),[m,p]=(0,_react.useState)(null),[x,_]=(0,_react.useState)(null),b=(0,_reactHookForm.useForm)({defaultValues:{category:listed(i?.category)??listed(a)??"",subject:i?.subject??"",body:i?.body??""}}),g=b.handleSubmit(async t=>{const r=(0,_validation.validateFiles)([...u,...l],e);if(p(r??null),!r){_(null);try{const e=await s({category:t.category,subject:t.subject.trim(),body:t.body.trim(),pageUrl:i?.pageUrl,userAgent:i?.userAgent??(0,_device.describeDevice)(),appVersion:i?.appVersion??n,files:l,screenshots:u});o(e)}catch(e){_((0,_client.toSupportApiError)(e).message)}}}),h=b.formState.isSubmitting,j=(0,_mobileUi.useHookFormField)({control:b.control,name:"category",rules:{validate:t=>(0,_validation.validateCategory)(t,e)}}),y=(0,_mobileUi.useHookFormField)({control:b.control,name:"subject",rules:{validate:t=>(0,_validation.validateSubject)(t,e)}}),v=(0,_mobileUi.useHookFormField)({control:b.control,name:"body",rules:{validate:t=>(0,_validation.validateBody)(t,e)}}),S=u.length+l.length;return(0,_jsxRuntime.jsxs)(_mobileUi.KeyboardAwareScrollView,{contentContainerStyle:t.content,safeAreaEdges:[],children:[(0,_jsxRuntime.jsx)(_mobileUi.Text,{variant:"bodySmall",color:"secondary",children:"Tell us what you need. We reply by email and in this ticket."}),(0,_jsxRuntime.jsx)(_mobileUi.Select,{label:"Category",placeholder:"Choose a category",options:e.categories.map(e=>({label:e,value:e})),value:j.value||void 0,onChange:e=>j.onChange(String(e)),error:j.error,testID:"support-new-category"}),(0,_jsxRuntime.jsx)(_mobileUi.Input,{label:"Subject",placeholder:"A short summary",required:!0,maxLength:e.subjectMaxLength,value:y.value,onChangeText:y.onChangeText,onBlur:y.onBlur,error:y.error,testID:"support-new-subject"}),(0,_jsxRuntime.jsx)(_mobileUi.Input,{label:"Message",placeholder:"What happened, and what did you expect?",required:!0,multiline:!0,maxLength:e.bodyMaxLength,value:v.value,onChangeText:v.onChangeText,onBlur:v.onBlur,error:v.error,testID:"support-new-body"}),u.length>0&&(0,_jsxRuntime.jsx)(_PhotoTray.PhotoTray,{label:"Screenshot",photos:u,onChange:d,remaining:0,allowAdd:!1,maxBytes:e.maxAttachmentBytes,disabled:h}),(0,_jsxRuntime.jsx)(_PhotoTray.PhotoTray,{label:"Photos",photos:l,onChange:c,remaining:e.maxAttachmentsPerMessage-S,maxBytes:e.maxAttachmentBytes,disabled:h}),(0,_jsxRuntime.jsx)(_mobileUi.Text,{variant:"caption",color:"tertiary",children:`Attach up to ${e.maxAttachmentsPerMessage} files.`}),(m||x)&&(0,_jsxRuntime.jsx)(_mobileUi.Text,{variant:"bodySmall",color:"danger",accessibilityLiveRegion:"polite",children:m??x}),(0,_jsxRuntime.jsxs)(_reactNative.View,{style:t.actions,children:[r&&(0,_jsxRuntime.jsx)(_mobileUi.Button,{label:"Cancel",variant:"ghost",tone:"neutral",onPress:r,disabled:h}),(0,_jsxRuntime.jsx)(_mobileUi.Button,{label:"Send ticket",loading:h,disabled:h,onPress:()=>{g()},testID:"support-new-submit"})]})]})},NewSupportTicket=e=>{const t=(0,_mobileUi.useTheme)(),o=(0,_react.useMemo)(()=>buildStyles(t),[t]),{config:r,loading:i,error:a,reload:n}=(0,_SupportProvider.useSupportConfig)(),s=e.testID??"support-new-ticket";return r?(0,_jsxRuntime.jsx)(_reactNative.View,{style:o.root,testID:s,children:(0,_jsxRuntime.jsx)(TicketForm,{...e,config:r,styles:o})}):(0,_jsxRuntime.jsx)(_reactNative.View,{style:o.center,testID:s,children:i?(0,_jsxRuntime.jsx)(_mobileUi.Spinner,{accessibilityLabel:"Loading"}):(0,_jsxRuntime.jsxs)(_jsxRuntime.Fragment,{children:[(0,_jsxRuntime.jsx)(_mobileUi.Text,{variant:"body",color:"danger",align:"center",children:a?.message??"Support is not available right now."}),(0,_jsxRuntime.jsx)(_mobileUi.Button,{label:"Try again",variant:"ghost",onPress:()=>{n()}})]})})};exports.NewSupportTicket=NewSupportTicket;const buildStyles=e=>_reactNative.StyleSheet.create({root:{flex:1},content:{padding:e.space.md,gap:e.space.md},center:{flex:1,alignItems:"center",justifyContent:"center",padding:e.space.xl,gap:e.space.sm},actions:{flexDirection:"row",justifyContent:"flex-end",gap:e.space.sm}});
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.PhotoTray=void 0;var _mobileUi=require("@webority/mobile-ui"),_react=require("react"),_reactNative=require("react-native"),_photos=require("../photos.js"),_jsxRuntime=require("react/jsx-runtime");const PhotoTray=({photos:e,onChange:t,remaining:i,maxBytes:o,disabled:r,label:s,allowAdd:a=!0})=>{const l=(0,_mobileUi.useTheme)(),n=(0,_react.useMemo)(()=>buildStyles(l),[l]),[c,u]=(0,_react.useState)(null),[m,d]=(0,_react.useState)(null),add=async r=>{d(null),u(r);try{const s=await(0,_photos.pickPhotos)(r,{maxCount:i,maxBytes:o});s.length>0&&t([...e,...s])}catch(e){d(e instanceof Error&&"PhotoPermissionError"===e.name?e.message:"That photo could not be added. Try another one.")}finally{u(null)}},h=i<=0;return(0,_jsxRuntime.jsxs)(_reactNative.View,{style:n.root,children:[s?(0,_jsxRuntime.jsx)(_mobileUi.Text,{variant:"label",color:"secondary",children:s}):null,e.length>0&&(0,_jsxRuntime.jsx)(_reactNative.View,{style:n.row,children:e.map((i,o)=>(0,_jsxRuntime.jsxs)(_reactNative.View,{style:n.item,children:[(0,_jsxRuntime.jsx)(_reactNative.Image,{source:{uri:i.uri},style:n.thumb,accessibilityLabel:i.name}),(0,_jsxRuntime.jsx)(_reactNative.View,{style:n.remove,children:(0,_jsxRuntime.jsx)(_mobileUi.IconButton,{size:"sm",variant:"glass",style:n.removeButton,icon:({color:e})=>(0,_jsxRuntime.jsx)(_mobileUi.AppIcon,{name:"trash",color:r?e:l.colors["on-scrim"],size:REMOVE_ICON}),accessibilityLabel:`Remove ${i.name}`,disabled:r,onPress:()=>t(e.filter((e,t)=>t!==o))})})]},`${i.uri}-${o}`))}),a&&(0,_jsxRuntime.jsxs)(_reactNative.View,{style:n.actions,children:[(0,_jsxRuntime.jsx)(_mobileUi.Button,{size:"sm",variant:"outline",tone:"neutral",leftIcon:"gallery",title:"Add photo",accessibilityLabel:"Add a photo from your library",loading:"library"===c,disabled:r||h||null!==c,onPress:()=>{add("library")}}),(0,_jsxRuntime.jsx)(_mobileUi.Button,{size:"sm",variant:"outline",tone:"neutral",leftIcon:"camera",title:"Take photo",accessibilityLabel:"Take a photo with your camera",loading:"camera"===c,disabled:r||h||null!==c,onPress:()=>{add("camera")}})]}),m?(0,_jsxRuntime.jsx)(_mobileUi.Text,{variant:"caption",color:"danger",accessibilityLiveRegion:"polite",children:m}):null]})};exports.PhotoTray=PhotoTray;const THUMB=72,REMOVE_SIZE=24,REMOVE_ICON=14,buildStyles=e=>_reactNative.StyleSheet.create({root:{gap:e.space.xs},row:{flexDirection:"row",flexWrap:"wrap",gap:e.space.xs},item:{width:72,height:72},thumb:{width:72,height:72,borderRadius:e.radius.sm,backgroundColor:e.colors["bg-subtle"]},remove:{position:"absolute",top:e.space.xxs,right:e.space.xxs},removeButton:{width:24,height:24,borderRadius:12,backgroundColor:e.colors.scrim,borderColor:e.colors["on-scrim"]},actions:{flexDirection:"row",gap:e.space.sm}});
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.PhotoTray=void 0;var _mobileUi=require("@webority/mobile-ui"),_react=require("react"),_reactNative=require("react-native"),_photos=require("../photos.js"),_jsxRuntime=require("react/jsx-runtime");const PhotoTray=({photos:e,onChange:t,remaining:i,maxBytes:o,disabled:r,label:a,allowAdd:s=!0})=>{const l=(0,_mobileUi.useTheme)(),n=(0,_react.useMemo)(()=>buildStyles(l),[l]),[c,u]=(0,_react.useState)(null),[m,d]=(0,_react.useState)(null),add=async r=>{d(null),u(r);try{const a=await(0,_photos.pickPhotos)(r,{maxCount:i,maxBytes:o});a.length>0&&t([...e,...a])}catch(e){d(e instanceof Error&&"PhotoPermissionError"===e.name?e.message:"That photo could not be added. Try another one.")}finally{u(null)}},b=i<=0;return(0,_jsxRuntime.jsxs)(_reactNative.View,{style:n.root,children:[a?(0,_jsxRuntime.jsx)(_mobileUi.Text,{variant:"label",color:"secondary",children:a}):null,e.length>0&&(0,_jsxRuntime.jsx)(_reactNative.View,{style:n.row,children:e.map((i,o)=>(0,_jsxRuntime.jsxs)(_reactNative.View,{style:n.item,children:[(0,_jsxRuntime.jsx)(_reactNative.Image,{source:{uri:i.uri},style:n.thumb,accessibilityLabel:i.name}),(0,_jsxRuntime.jsx)(_reactNative.View,{style:n.remove,children:(0,_jsxRuntime.jsx)(_mobileUi.IconButton,{size:"sm",variant:"glass",style:n.removeButton,icon:({color:e})=>(0,_jsxRuntime.jsx)(_mobileUi.AppIcon,{name:"trash",color:r?e:l.colors["on-scrim"],size:REMOVE_ICON}),accessibilityLabel:`Remove ${i.name}`,disabled:r,onPress:()=>t(e.filter((e,t)=>t!==o))})})]},`${i.uri}-${o}`))}),s&&(0,_jsxRuntime.jsxs)(_reactNative.View,{style:n.actions,children:[(0,_jsxRuntime.jsx)(_mobileUi.Button,{size:"sm",variant:"outline",tone:"neutral",leftIcon:"gallery",label:"Add photo",accessibilityLabel:"Add a photo from your library",loading:"library"===c,disabled:r||b||null!==c,onPress:()=>{add("library")}}),(0,_jsxRuntime.jsx)(_mobileUi.Button,{size:"sm",variant:"outline",tone:"neutral",leftIcon:"camera",label:"Take photo",accessibilityLabel:"Take a photo with your camera",loading:"camera"===c,disabled:r||b||null!==c,onPress:()=>{add("camera")}})]}),m?(0,_jsxRuntime.jsx)(_mobileUi.Text,{variant:"caption",color:"danger",accessibilityLiveRegion:"polite",children:m}):null]})};exports.PhotoTray=PhotoTray;const THUMB=72,REMOVE_SIZE=24,REMOVE_ICON=14,buildStyles=e=>_reactNative.StyleSheet.create({root:{gap:e.space.xs},row:{flexDirection:"row",flexWrap:"wrap",gap:e.space.xs},item:{width:72,height:72},thumb:{width:72,height:72,borderRadius:e.radius.sm,backgroundColor:e.colors["bg-subtle"]},remove:{position:"absolute",top:e.space.xxs,right:e.space.xxs},removeButton:{width:24,height:24,borderRadius:12,backgroundColor:e.colors.scrim,borderColor:e.colors["on-scrim"]},actions:{flexDirection:"row",gap:e.space.sm}});
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.SupportContact=void 0;var _mobileUi=require("@webority/mobile-ui"),_react=require("react"),_reactNative=require("react-native"),_clipboard=require("../clipboard.js"),_SupportProvider=require("../SupportProvider.js"),_jsxRuntime=require("react/jsx-runtime");const COPY_TOAST_KEY="support-contact-copy",SupportContact=({testID:e="support-contact"})=>{const t=(0,_mobileUi.useTheme)(),i=(0,_react.useMemo)(()=>buildStyles(t),[t]),{config:o,loading:a,error:r}=(0,_SupportProvider.useSupportConfig)();if(!o)return(0,_jsxRuntime.jsx)(_mobileUi.Card,{variant:"outlined",testID:e,children:a?(0,_jsxRuntime.jsx)(_mobileUi.Spinner,{size:"sm",accessibilityLabel:"Loading contact details"}):(0,_jsxRuntime.jsx)(_mobileUi.Text,{variant:"bodySmall",color:"danger",children:r?.message??"Contact details are not available right now."})});const s=o.supportEmail,l=o.supportPhone?.trim(),n=o.supportHours?.trim(),open=(e,t)=>{_reactNative.Linking.openURL(e).catch(()=>_mobileUi.toast.error(t))};return(0,_jsxRuntime.jsxs)(_mobileUi.Card,{variant:"outlined",bodyStyle:i.body,testID:e,children:[(0,_jsxRuntime.jsx)(_mobileUi.Text,{variant:"title",accessibilityRole:"header",children:`Contact ${o.supportName||o.productName}`}),(0,_jsxRuntime.jsxs)(_reactNative.View,{style:i.row,children:[(0,_jsxRuntime.jsx)(_mobileUi.Text,{variant:"label",color:"secondary",children:"Email"}),(0,_jsxRuntime.jsx)(_mobileUi.Text,{variant:"body",selectable:!0,testID:"support-contact-email",children:s||"-"})]}),s?(0,_jsxRuntime.jsxs)(_reactNative.View,{style:i.actions,children:[(0,_jsxRuntime.jsx)(_mobileUi.Button,{title:"Copy",size:"sm",variant:"outline",tone:"neutral",leftIcon:"copy",accessibilityLabel:`Copy ${s}`,onPress:()=>{(async()=>{try{await(0,_clipboard.copyText)(s),"android"===_reactNative.Platform.OS&&Number(_reactNative.Platform.Version)>=33||_mobileUi.toast.success("Email address copied.",{key:COPY_TOAST_KEY})}catch{_mobileUi.toast.error("Could not copy the email address.",{key:COPY_TOAST_KEY})}})()},testID:"support-contact-copy"}),(0,_jsxRuntime.jsx)(_mobileUi.Button,{title:"Send email",size:"sm",variant:"outline",leftIcon:"mail",accessibilityLabel:`Send an email to ${s}`,onPress:()=>open(`mailto:${s}`,"No email app is set up on this device."),testID:"support-contact-mail"})]}):null,l?(0,_jsxRuntime.jsxs)(_reactNative.View,{style:i.row,children:[(0,_jsxRuntime.jsx)(_mobileUi.Text,{variant:"label",color:"secondary",children:"Phone"}),(0,_jsxRuntime.jsx)(_mobileUi.Button,{title:l,size:"sm",variant:"link",leftIcon:"call",accessibilityLabel:`Call ${l}`,onPress:()=>open(`tel:${l.replace(/[^\d+]/g,"")}`,"This device cannot make calls."),testID:"support-contact-phone"})]}):null,n?(0,_jsxRuntime.jsxs)(_reactNative.View,{style:i.row,children:[(0,_jsxRuntime.jsx)(_mobileUi.Text,{variant:"label",color:"secondary",children:"Hours"}),(0,_jsxRuntime.jsx)(_mobileUi.Text,{variant:"bodySmall",children:n})]}):null]})};exports.SupportContact=SupportContact;const buildStyles=e=>_reactNative.StyleSheet.create({body:{gap:e.space.sm},row:{gap:e.space.xxs,alignItems:"flex-start"},actions:{flexDirection:"row",gap:e.space.sm}});
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.SupportContact=void 0;var _mobileUi=require("@webority/mobile-ui"),_react=require("react"),_reactNative=require("react-native"),_clipboard=require("../clipboard.js"),_SupportProvider=require("../SupportProvider.js"),_jsxRuntime=require("react/jsx-runtime");const COPY_TOAST_KEY="support-contact-copy",SupportContact=({testID:e="support-contact"})=>{const t=(0,_mobileUi.useTheme)(),i=(0,_react.useMemo)(()=>buildStyles(t),[t]),{config:a,loading:o,error:r}=(0,_SupportProvider.useSupportConfig)();if(!a)return(0,_jsxRuntime.jsx)(_mobileUi.Card,{variant:"outline",testID:e,children:o?(0,_jsxRuntime.jsx)(_mobileUi.Spinner,{size:"sm",accessibilityLabel:"Loading contact details"}):(0,_jsxRuntime.jsx)(_mobileUi.Text,{variant:"bodySmall",color:"danger",children:r?.message??"Contact details are not available right now."})});const s=a.supportEmail,l=a.supportPhone?.trim(),n=a.supportHours?.trim(),open=(e,t)=>{_reactNative.Linking.openURL(e).catch(()=>_mobileUi.toast.error(t))};return(0,_jsxRuntime.jsxs)(_mobileUi.Card,{variant:"outline",bodyStyle:i.body,testID:e,children:[(0,_jsxRuntime.jsx)(_mobileUi.Text,{variant:"title",accessibilityRole:"header",children:`Contact ${a.supportName||a.productName}`}),(0,_jsxRuntime.jsxs)(_reactNative.View,{style:i.row,children:[(0,_jsxRuntime.jsx)(_mobileUi.Text,{variant:"label",color:"secondary",children:"Email"}),(0,_jsxRuntime.jsx)(_mobileUi.Text,{variant:"body",selectable:!0,testID:"support-contact-email",children:s||"-"})]}),s?(0,_jsxRuntime.jsxs)(_reactNative.View,{style:i.actions,children:[(0,_jsxRuntime.jsx)(_mobileUi.Button,{label:"Copy",size:"sm",variant:"outline",tone:"neutral",leftIcon:"copy",accessibilityLabel:`Copy ${s}`,onPress:()=>{(async()=>{try{await(0,_clipboard.copyText)(s),"android"===_reactNative.Platform.OS&&Number(_reactNative.Platform.Version)>=33||_mobileUi.toast.success("Email address copied.",{key:COPY_TOAST_KEY})}catch{_mobileUi.toast.error("Could not copy the email address.",{key:COPY_TOAST_KEY})}})()},testID:"support-contact-copy"}),(0,_jsxRuntime.jsx)(_mobileUi.Button,{label:"Send email",size:"sm",variant:"outline",leftIcon:"mail",accessibilityLabel:`Send an email to ${s}`,onPress:()=>open(`mailto:${s}`,"No email app is set up on this device."),testID:"support-contact-mail"})]}):null,l?(0,_jsxRuntime.jsxs)(_reactNative.View,{style:i.row,children:[(0,_jsxRuntime.jsx)(_mobileUi.Text,{variant:"label",color:"secondary",children:"Phone"}),(0,_jsxRuntime.jsx)(_mobileUi.Button,{label:l,size:"sm",variant:"link",leftIcon:"call",accessibilityLabel:`Call ${l}`,onPress:()=>open(`tel:${l.replace(/[^\d+]/g,"")}`,"This device cannot make calls."),testID:"support-contact-phone"})]}):null,n?(0,_jsxRuntime.jsxs)(_reactNative.View,{style:i.row,children:[(0,_jsxRuntime.jsx)(_mobileUi.Text,{variant:"label",color:"secondary",children:"Hours"}),(0,_jsxRuntime.jsx)(_mobileUi.Text,{variant:"bodySmall",children:n})]}):null]})};exports.SupportContact=SupportContact;const buildStyles=e=>_reactNative.StyleSheet.create({body:{gap:e.space.sm},row:{gap:e.space.xxs,alignItems:"flex-start"},actions:{flexDirection:"row",gap:e.space.sm}});
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.SupportTicketDetail=void 0;var _mobileCore=require("@webority/mobile-core"),_mobileUi=require("@webority/mobile-ui"),_react=require("react"),_reactNative=require("react-native"),_SupportProvider=require("../SupportProvider.js"),_validation=require("../validation.js"),_Attachments=require("./Attachments.js"),_PhotoTray=require("./PhotoTray.js"),_SupportTicketList=require("./SupportTicketList.js"),_jsxRuntime=require("react/jsx-runtime");const MessageBubble=({message:e,styles:t,timeZone:i,onOpenImage:s})=>{if("System"===e.authorKind)return(0,_jsxRuntime.jsx)(_reactNative.View,{style:t.system,testID:`support-message-${e.id}`,children:(0,_jsxRuntime.jsx)(_mobileUi.Text,{variant:"caption",color:"tertiary",align:"center",children:`${e.body}, ${(0,_mobileCore.formatDateTime)(e.createdDateTimeUtc,{zone:i})}`})});const a="Customer"===e.authorKind;return(0,_jsxRuntime.jsx)(_reactNative.View,{style:[t.bubbleRow,a?t.mineRow:t.theirsRow],testID:`support-message-${e.id}`,children:(0,_jsxRuntime.jsxs)(_reactNative.View,{style:[t.bubble,a?t.mine:t.theirs],children:[(0,_jsxRuntime.jsx)(_mobileUi.Text,{variant:"label",color:a?"primary":"secondary",children:e.authorName??(a?"You":"Support team")}),(0,_jsxRuntime.jsx)(_mobileUi.Text,{variant:"body",selectable:!0,children:e.body}),(0,_jsxRuntime.jsx)(_Attachments.AttachmentList,{attachments:e.attachments,onOpenImage:s}),(0,_jsxRuntime.jsx)(_mobileUi.Text,{variant:"caption",color:"tertiary",children:(0,_mobileCore.formatDateTime)(e.createdDateTimeUtc,{zone:i})})]})})},SATISFACTION_TEXT={Satisfied:"You told us this solved your problem.",Unsatisfied:"You told us this did not solve your problem."},SupportTicketDetail=({ticketId:e,testID:t="support-ticket-detail"})=>{const i=(0,_mobileUi.useTheme)(),s=(0,_react.useMemo)(()=>buildStyles(i),[i]),{config:a}=(0,_SupportProvider.useSupportConfig)(),n=(0,_SupportProvider.useSupportTimeZone)(),{ticket:o,loading:r,error:l,actionError:c,busy:m,reload:u,reply:d,reopen:x,rate:p}=(0,_SupportProvider.useSupportTicket)(e),[_,b]=(0,_react.useState)(null),[j,y]=(0,_react.useState)(""),[h,g]=(0,_react.useState)([]),[R,v]=(0,_react.useState)(null),[S,T]=(0,_react.useState)(null),[f,U]=(0,_react.useState)("");if(!o)return(0,_jsxRuntime.jsx)(_reactNative.View,{style:s.center,testID:t,children:r?(0,_jsxRuntime.jsx)(_mobileUi.Spinner,{accessibilityLabel:"Loading the ticket"}):(0,_jsxRuntime.jsxs)(_jsxRuntime.Fragment,{children:[(0,_jsxRuntime.jsx)(_mobileUi.Text,{variant:"body",color:"danger",align:"center",children:l?.message??"That ticket could not be found."}),(0,_jsxRuntime.jsx)(_mobileUi.Button,{title:"Try again",variant:"ghost",onPress:()=>{u()}})]})});const w=o.messages.filter(e=>!e.isInternal);return(0,_jsxRuntime.jsxs)(_reactNative.View,{style:s.root,testID:t,children:[(0,_jsxRuntime.jsxs)(_mobileUi.KeyboardAwareScrollView,{contentContainerStyle:s.content,safeAreaEdges:[],children:[(0,_jsxRuntime.jsxs)(_reactNative.View,{style:s.head,children:[(0,_jsxRuntime.jsx)(_mobileUi.Text,{variant:"h3",accessibilityRole:"header",children:o.subject}),(0,_jsxRuntime.jsx)(_mobileUi.Text,{variant:"bodySmall",color:"secondary",children:`${o.number}, ${o.category}`}),(0,_jsxRuntime.jsxs)(_reactNative.View,{style:s.headRow,children:[(0,_jsxRuntime.jsx)(_mobileUi.StatusBadge,{label:o.statusLabel,tone:_SupportTicketList.STATUS_TONES[o.status]??"neutral",accessibilityLabel:`Status: ${o.statusLabel}`}),(0,_jsxRuntime.jsx)(_mobileUi.Text,{variant:"caption",color:"tertiary",children:`Opened ${(0,_mobileCore.formatDateTime)(o.createdDateTimeUtc,{zone:n})}`})]})]}),"WaitingOnCustomer"===o.status&&(0,_jsxRuntime.jsx)(_mobileUi.Card,{variant:"outlined",bodyStyle:s.section,testID:"support-waiting",children:(0,_jsxRuntime.jsx)(_mobileUi.Text,{variant:"bodySmall",children:"We need your answer to carry on. Reply below and the ticket goes back to our team."})}),o.canReopen&&(0,_jsxRuntime.jsxs)(_mobileUi.Card,{variant:"outlined",bodyStyle:s.section,children:[(0,_jsxRuntime.jsx)(_mobileUi.Text,{variant:"bodySmall",children:`This ticket is ${o.statusLabel}. Reopen it if you still need help.`}),(0,_jsxRuntime.jsx)(_mobileUi.Button,{title:"Reopen ticket",variant:"outline",size:"sm",loading:m,disabled:m,onPress:()=>{x()},testID:"support-reopen"})]}),o.satisfaction?(0,_jsxRuntime.jsxs)(_mobileUi.Card,{variant:"outlined",bodyStyle:s.section,testID:"support-rating",children:[(0,_jsxRuntime.jsx)(_mobileUi.Text,{variant:"bodySmall",accessibilityLiveRegion:"polite",children:SATISFACTION_TEXT[o.satisfaction]}),o.satisfactionComment?(0,_jsxRuntime.jsx)(_mobileUi.Text,{variant:"bodySmall",color:"secondary",children:`Your comment: ${o.satisfactionComment}`}):null]}):o.canRate?(0,_jsxRuntime.jsxs)(_mobileUi.Card,{variant:"outlined",bodyStyle:s.section,testID:"support-rating",children:[(0,_jsxRuntime.jsx)(_mobileUi.Text,{variant:"label",children:"Did this solve your problem?"}),(0,_jsxRuntime.jsxs)(_reactNative.View,{style:s.ratingRow,children:[(0,_jsxRuntime.jsx)(_mobileUi.Button,{title:"Yes, it is solved",size:"sm",leftIcon:"like",variant:"Satisfied"===S?"solid":"outline",tone:"success",accessibilityState:{selected:"Satisfied"===S},"aria-selected":"Satisfied"===S,onPress:()=>T("Satisfied"),testID:"support-rate-satisfied"}),(0,_jsxRuntime.jsx)(_mobileUi.Button,{title:"No, it is not",size:"sm",leftIcon:"dislike",variant:"Unsatisfied"===S?"solid":"outline",tone:"danger",accessibilityState:{selected:"Unsatisfied"===S},"aria-selected":"Unsatisfied"===S,onPress:()=>T("Unsatisfied"),testID:"support-rate-unsatisfied"})]}),S&&(0,_jsxRuntime.jsxs)(_jsxRuntime.Fragment,{children:[(0,_jsxRuntime.jsx)(_mobileUi.Input,{label:"Anything to add? (optional)",helperText:"Your comment goes to the support team.",value:f,onChangeText:U,multiline:!0,maxLength:a?.satisfactionCommentMaxLength,testID:"support-rating-comment"}),(0,_jsxRuntime.jsx)(_mobileUi.Button,{title:"Send answer",size:"sm",loading:m,disabled:m,onPress:()=>{(async()=>{S&&await p({satisfaction:S,comment:f})&&(T(null),U(""))})()},testID:"support-rating-send"})]})]}):null,(0,_jsxRuntime.jsx)(_reactNative.View,{style:s.thread,accessibilityLabel:"Conversation",children:w.map(e=>(0,_jsxRuntime.jsx)(MessageBubble,{message:e,styles:s,timeZone:n,onOpenImage:(e,t)=>b({uri:e,name:t})},e.id))}),(0,_jsxRuntime.jsxs)(_reactNative.View,{style:s.section,children:[(0,_jsxRuntime.jsx)(_mobileUi.Input,{label:"Your reply",required:!0,placeholder:"Write a reply to the support team",value:j,onChangeText:y,multiline:!0,maxLength:a?.bodyMaxLength,error:R??void 0,testID:"support-reply-input"}),a&&(0,_jsxRuntime.jsx)(_PhotoTray.PhotoTray,{photos:h,onChange:g,remaining:a.maxAttachmentsPerMessage-h.length,maxBytes:a.maxAttachmentBytes,disabled:m}),o.canReopen&&(0,_jsxRuntime.jsx)(_mobileUi.Text,{variant:"caption",color:"secondary",children:"Replying reopens this ticket."}),c&&(0,_jsxRuntime.jsx)(_mobileUi.Text,{variant:"bodySmall",color:"danger",accessibilityLiveRegion:"polite",children:c.message}),(0,_jsxRuntime.jsx)(_mobileUi.Button,{title:"Send reply",leftIcon:"send",loading:m,disabled:m,onPress:()=>{(async()=>{const e=j.trim(),t=a?(0,_validation.validateBody)(e,a)??(0,_validation.validateFiles)(h,a):e?void 0:"Write a message.";t?v(t):(v(null),await d({body:e,files:h})&&(y(""),g([])))})()},testID:"support-reply-send"})]})]}),(0,_jsxRuntime.jsx)(_Attachments.ImageViewer,{image:_,onClose:()=>b(null)})]})};exports.SupportTicketDetail=SupportTicketDetail;const buildStyles=e=>_reactNative.StyleSheet.create({root:{flex:1},content:{padding:e.space.md,gap:e.space.md},center:{flex:1,alignItems:"center",justifyContent:"center",padding:e.space.xl,gap:e.space.sm},head:{gap:e.space.xxs},headRow:{flexDirection:"row",alignItems:"center",gap:e.space.sm,marginTop:e.space.xs},section:{gap:e.space.sm},ratingRow:{flexDirection:"row",flexWrap:"wrap",gap:e.space.sm},thread:{gap:e.space.sm},system:{paddingHorizontal:e.space.lg,paddingVertical:e.space.xxs},bubbleRow:{flexDirection:"row"},mineRow:{justifyContent:"flex-end"},theirsRow:{justifyContent:"flex-start"},bubble:{maxWidth:"85%",borderRadius:e.radius.lg,padding:e.space.sm,gap:e.space.xxs},mine:{backgroundColor:e.colors["primary-soft"]},theirs:{backgroundColor:e.colors["bg-subtle"]}});
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.SupportTicketDetail=void 0;var _mobileCore=require("@webority/mobile-core"),_mobileUi=require("@webority/mobile-ui"),_react=require("react"),_reactNative=require("react-native"),_SupportProvider=require("../SupportProvider.js"),_validation=require("../validation.js"),_Attachments=require("./Attachments.js"),_PhotoTray=require("./PhotoTray.js"),_SupportTicketList=require("./SupportTicketList.js"),_jsxRuntime=require("react/jsx-runtime");const MessageBubble=({message:e,styles:t,timeZone:i,onOpenImage:s})=>{if("System"===e.authorKind)return(0,_jsxRuntime.jsx)(_reactNative.View,{style:t.system,testID:`support-message-${e.id}`,children:(0,_jsxRuntime.jsx)(_mobileUi.Text,{variant:"caption",color:"tertiary",align:"center",children:`${e.body}, ${(0,_mobileCore.formatDateTime)(e.createdDateTimeUtc,{zone:i})}`})});const a="Customer"===e.authorKind;return(0,_jsxRuntime.jsx)(_reactNative.View,{style:[t.bubbleRow,a?t.mineRow:t.theirsRow],testID:`support-message-${e.id}`,children:(0,_jsxRuntime.jsxs)(_reactNative.View,{style:[t.bubble,a?t.mine:t.theirs],children:[(0,_jsxRuntime.jsx)(_mobileUi.Text,{variant:"label",color:a?"primary":"secondary",children:e.authorName??(a?"You":"Support team")}),(0,_jsxRuntime.jsx)(_mobileUi.Text,{variant:"body",selectable:!0,children:e.body}),(0,_jsxRuntime.jsx)(_Attachments.AttachmentList,{attachments:e.attachments,onOpenImage:s}),(0,_jsxRuntime.jsx)(_mobileUi.Text,{variant:"caption",color:"tertiary",children:(0,_mobileCore.formatDateTime)(e.createdDateTimeUtc,{zone:i})})]})})},SATISFACTION_TEXT={Satisfied:"You told us this solved your problem.",Unsatisfied:"You told us this did not solve your problem."},SupportTicketDetail=({ticketId:e,testID:t="support-ticket-detail"})=>{const i=(0,_mobileUi.useTheme)(),s=(0,_react.useMemo)(()=>buildStyles(i),[i]),{config:a}=(0,_SupportProvider.useSupportConfig)(),n=(0,_SupportProvider.useSupportTimeZone)(),{ticket:o,loading:r,error:l,actionError:c,busy:m,reload:u,reply:d,reopen:x,rate:p}=(0,_SupportProvider.useSupportTicket)(e),[_,b]=(0,_react.useState)(null),[j,y]=(0,_react.useState)(""),[h,g]=(0,_react.useState)([]),[R,v]=(0,_react.useState)(null),[S,T]=(0,_react.useState)(null),[f,U]=(0,_react.useState)("");if(!o)return(0,_jsxRuntime.jsx)(_reactNative.View,{style:s.center,testID:t,children:r?(0,_jsxRuntime.jsx)(_mobileUi.Spinner,{accessibilityLabel:"Loading the ticket"}):(0,_jsxRuntime.jsxs)(_jsxRuntime.Fragment,{children:[(0,_jsxRuntime.jsx)(_mobileUi.Text,{variant:"body",color:"danger",align:"center",children:l?.message??"That ticket could not be found."}),(0,_jsxRuntime.jsx)(_mobileUi.Button,{label:"Try again",variant:"ghost",onPress:()=>{u()}})]})});const w=o.messages.filter(e=>!e.isInternal);return(0,_jsxRuntime.jsxs)(_reactNative.View,{style:s.root,testID:t,children:[(0,_jsxRuntime.jsxs)(_mobileUi.KeyboardAwareScrollView,{contentContainerStyle:s.content,safeAreaEdges:[],children:[(0,_jsxRuntime.jsxs)(_reactNative.View,{style:s.head,children:[(0,_jsxRuntime.jsx)(_mobileUi.Text,{variant:"h3",accessibilityRole:"header",children:o.subject}),(0,_jsxRuntime.jsx)(_mobileUi.Text,{variant:"bodySmall",color:"secondary",children:`${o.number}, ${o.category}`}),(0,_jsxRuntime.jsxs)(_reactNative.View,{style:s.headRow,children:[(0,_jsxRuntime.jsx)(_mobileUi.StatusBadge,{label:o.statusLabel,tone:_SupportTicketList.STATUS_TONES[o.status]??"neutral",accessibilityLabel:`Status: ${o.statusLabel}`}),(0,_jsxRuntime.jsx)(_mobileUi.Text,{variant:"caption",color:"tertiary",children:`Opened ${(0,_mobileCore.formatDateTime)(o.createdDateTimeUtc,{zone:n})}`})]})]}),"WaitingOnCustomer"===o.status&&(0,_jsxRuntime.jsx)(_mobileUi.Card,{variant:"outline",bodyStyle:s.section,testID:"support-waiting",children:(0,_jsxRuntime.jsx)(_mobileUi.Text,{variant:"bodySmall",children:"We need your answer to carry on. Reply below and the ticket goes back to our team."})}),o.canReopen&&(0,_jsxRuntime.jsxs)(_mobileUi.Card,{variant:"outline",bodyStyle:s.section,children:[(0,_jsxRuntime.jsx)(_mobileUi.Text,{variant:"bodySmall",children:`This ticket is ${o.statusLabel}. Reopen it if you still need help.`}),(0,_jsxRuntime.jsx)(_mobileUi.Button,{label:"Reopen ticket",variant:"outline",size:"sm",loading:m,disabled:m,onPress:()=>{x()},testID:"support-reopen"})]}),o.satisfaction?(0,_jsxRuntime.jsxs)(_mobileUi.Card,{variant:"outline",bodyStyle:s.section,testID:"support-rating",children:[(0,_jsxRuntime.jsx)(_mobileUi.Text,{variant:"bodySmall",accessibilityLiveRegion:"polite",children:SATISFACTION_TEXT[o.satisfaction]}),o.satisfactionComment?(0,_jsxRuntime.jsx)(_mobileUi.Text,{variant:"bodySmall",color:"secondary",children:`Your comment: ${o.satisfactionComment}`}):null]}):o.canRate?(0,_jsxRuntime.jsxs)(_mobileUi.Card,{variant:"outline",bodyStyle:s.section,testID:"support-rating",children:[(0,_jsxRuntime.jsx)(_mobileUi.Text,{variant:"label",children:"Did this solve your problem?"}),(0,_jsxRuntime.jsxs)(_reactNative.View,{style:s.ratingRow,children:[(0,_jsxRuntime.jsx)(_mobileUi.Button,{label:"Yes, it is solved",size:"sm",leftIcon:"like",variant:"Satisfied"===S?"solid":"outline",tone:"success",accessibilityState:{selected:"Satisfied"===S},"aria-selected":"Satisfied"===S,onPress:()=>T("Satisfied"),testID:"support-rate-satisfied"}),(0,_jsxRuntime.jsx)(_mobileUi.Button,{label:"No, it is not",size:"sm",leftIcon:"dislike",variant:"Unsatisfied"===S?"solid":"outline",tone:"danger",accessibilityState:{selected:"Unsatisfied"===S},"aria-selected":"Unsatisfied"===S,onPress:()=>T("Unsatisfied"),testID:"support-rate-unsatisfied"})]}),S&&(0,_jsxRuntime.jsxs)(_jsxRuntime.Fragment,{children:[(0,_jsxRuntime.jsx)(_mobileUi.Input,{label:"Anything to add? (optional)",helperText:"Your comment goes to the support team.",value:f,onChangeText:U,multiline:!0,maxLength:a?.satisfactionCommentMaxLength,testID:"support-rating-comment"}),(0,_jsxRuntime.jsx)(_mobileUi.Button,{label:"Send answer",size:"sm",loading:m,disabled:m,onPress:()=>{(async()=>{S&&await p({satisfaction:S,comment:f})&&(T(null),U(""))})()},testID:"support-rating-send"})]})]}):null,(0,_jsxRuntime.jsx)(_reactNative.View,{style:s.thread,accessibilityLabel:"Conversation",children:w.map(e=>(0,_jsxRuntime.jsx)(MessageBubble,{message:e,styles:s,timeZone:n,onOpenImage:(e,t)=>b({uri:e,name:t})},e.id))}),(0,_jsxRuntime.jsxs)(_reactNative.View,{style:s.section,children:[(0,_jsxRuntime.jsx)(_mobileUi.Input,{label:"Your reply",required:!0,placeholder:"Write a reply to the support team",value:j,onChangeText:y,multiline:!0,maxLength:a?.bodyMaxLength,error:R??void 0,testID:"support-reply-input"}),a&&(0,_jsxRuntime.jsx)(_PhotoTray.PhotoTray,{photos:h,onChange:g,remaining:a.maxAttachmentsPerMessage-h.length,maxBytes:a.maxAttachmentBytes,disabled:m}),o.canReopen&&(0,_jsxRuntime.jsx)(_mobileUi.Text,{variant:"caption",color:"secondary",children:"Replying reopens this ticket."}),c&&(0,_jsxRuntime.jsx)(_mobileUi.Text,{variant:"bodySmall",color:"danger",accessibilityLiveRegion:"polite",children:c.message}),(0,_jsxRuntime.jsx)(_mobileUi.Button,{label:"Send reply",leftIcon:"send",loading:m,disabled:m,onPress:()=>{(async()=>{const e=j.trim(),t=a?(0,_validation.validateBody)(e,a)??(0,_validation.validateFiles)(h,a):e?void 0:"Write a message.";t?v(t):(v(null),await d({body:e,files:h})&&(y(""),g([])))})()},testID:"support-reply-send"})]})]}),(0,_jsxRuntime.jsx)(_Attachments.ImageViewer,{image:_,onClose:()=>b(null)})]})};exports.SupportTicketDetail=SupportTicketDetail;const buildStyles=e=>_reactNative.StyleSheet.create({root:{flex:1},content:{padding:e.space.md,gap:e.space.md},center:{flex:1,alignItems:"center",justifyContent:"center",padding:e.space.xl,gap:e.space.sm},head:{gap:e.space.xxs},headRow:{flexDirection:"row",alignItems:"center",gap:e.space.sm,marginTop:e.space.xs},section:{gap:e.space.sm},ratingRow:{flexDirection:"row",flexWrap:"wrap",gap:e.space.sm},thread:{gap:e.space.sm},system:{paddingHorizontal:e.space.lg,paddingVertical:e.space.xxs},bubbleRow:{flexDirection:"row"},mineRow:{justifyContent:"flex-end"},theirsRow:{justifyContent:"flex-start"},bubble:{maxWidth:"85%",borderRadius:e.radius.lg,padding:e.space.sm,gap:e.space.xxs},mine:{backgroundColor:e.colors["primary-soft"]},theirs:{backgroundColor:e.colors["bg-subtle"]}});
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.statusFilterOptions=exports.SupportTicketList=exports.STATUS_TONES=void 0;var _mobileCore=require("@webority/mobile-core"),_mobileUi=require("@webority/mobile-ui"),_react=require("react"),_reactNative=require("react-native"),_SupportProvider=require("../SupportProvider.js"),_jsxRuntime=require("react/jsx-runtime");const STATUS_TONES=exports.STATUS_TONES={Open:"warning",InProgress:"info",WaitingOnCustomer:"warning",Resolved:"success",Closed:"neutral"},STATUS_FILTERS=[{value:"Open",label:"Open",count:"open"},{value:"InProgress",label:"In progress",count:"inProgress"},{value:"WaitingOnCustomer",label:"Waiting on you",count:"waitingOnCustomer"},{value:"Resolved",label:"Resolved",count:"resolved"},{value:"Closed",label:"Closed",count:"closed"}],ALL="all",statusFilterOptions=(e,t)=>[{value:ALL,label:"All",count:e.total},...STATUS_FILTERS.filter(i=>e[i.count]>0||i.value===t).map(t=>({value:t.value,label:t.label,count:e[t.count]}))];exports.statusFilterOptions=statusFilterOptions;const SEARCH_DEBOUNCE_MS=400,ticketKey=e=>e.id,TicketRow=(0,_react.memo)(function TicketRow({item:e,timeZone:t,onOpen:i,styles:s}){return(0,_jsxRuntime.jsxs)(_mobileUi.Card,{onPress:()=>i(e),accessibilityLabel:`${e.subject}, ${e.statusLabel}, ticket ${e.number}`,bodyStyle:s.card,testID:`support-ticket-${e.id}`,children:[(0,_jsxRuntime.jsxs)(_reactNative.View,{style:s.cardTop,children:[(0,_jsxRuntime.jsx)(_mobileUi.Text,{variant:"caption",color:"tertiary",children:e.number}),(0,_jsxRuntime.jsx)(_mobileUi.StatusBadge,{label:e.statusLabel,tone:STATUS_TONES[e.status]??"neutral",size:"sm"})]}),(0,_jsxRuntime.jsx)(_mobileUi.Text,{variant:"title",numberOfLines:2,children:e.subject}),(0,_jsxRuntime.jsx)(_mobileUi.Text,{variant:"bodySmall",color:"secondary",children:e.category}),(0,_jsxRuntime.jsxs)(_reactNative.View,{style:s.cardBottom,children:[(0,_jsxRuntime.jsx)(_mobileUi.Text,{variant:"caption",color:"tertiary",children:`Updated ${(0,_mobileCore.formatDateTime)(e.updatedDateTimeUtc,{zone:t})}`}),e.awaitingCustomer&&(0,_jsxRuntime.jsx)(_mobileUi.Text,{variant:"caption",color:"warning",children:"Waiting for your reply"})]})]})}),SupportTicketList=({onOpenTicket:e,onNewTicket:t,header:i,pageSize:s,testID:r="support-ticket-list"})=>{const o=(0,_mobileUi.useTheme)(),a=(0,_react.useMemo)(()=>buildStyles(o),[o]),{tickets:n,counts:l,status:c,search:u,setStatus:m,setSearch:p,loading:d,refreshing:x,loadingMore:_,error:b,loadMoreError:j,refresh:y,loadMore:S}=(0,_SupportProvider.useSupportTickets)({pageSize:s}),h=(0,_SupportProvider.useSupportTimeZone)(),v=(0,_react.useCallback)(({item:t})=>(0,_jsxRuntime.jsx)(TicketRow,{item:t,timeZone:h,onOpen:e,styles:a}),[h,e,a]),R=(0,_react.useCallback)(()=>{S()},[S]),g=(0,_react.useCallback)(()=>{y()},[y]),T=(0,_react.useMemo)(()=>(0,_jsxRuntime.jsx)(_reactNative.RefreshControl,{refreshing:x,onRefresh:g}),[x,g]),L=(l?.total??0)>0,k=null!==c||""!==u.trim(),f=(0,_jsxRuntime.jsxs)(_reactNative.View,{style:a.header,children:[i,t&&(0,_jsxRuntime.jsx)(_mobileUi.Button,{title:"New ticket",leftIcon:"add",onPress:t,fullWidth:!0}),b&&(0,_jsxRuntime.jsxs)(_reactNative.View,{style:a.error,accessibilityLiveRegion:"polite",children:[(0,_jsxRuntime.jsx)(_mobileUi.Text,{variant:"bodySmall",color:"danger",children:b.message}),(0,_jsxRuntime.jsx)(_mobileUi.Button,{title:"Try again",size:"sm",variant:"ghost",onPress:()=>{y()}})]}),l&&L&&(0,_jsxRuntime.jsxs)(_jsxRuntime.Fragment,{children:[(0,_jsxRuntime.jsx)(_mobileUi.SearchBar,{value:u,onChangeText:p,debounceMs:400,placeholder:"Search by subject or ticket number",accessibilityLabel:"Search tickets",testID:"support-ticket-search"}),(0,_jsxRuntime.jsx)(_reactNative.ScrollView,{horizontal:!0,showsHorizontalScrollIndicator:!1,contentContainerStyle:a.filters,accessibilityRole:"tablist",accessibilityLabel:"Filter by status",children:statusFilterOptions(l,c).map(e=>(0,_jsxRuntime.jsx)(_mobileUi.Chip,{label:`${e.label} (${e.count})`,selected:(c??ALL)===e.value,onPress:()=>m(e.value===ALL?null:e.value),accessibilityLabel:`${e.label}, ${e.count} tickets`,testID:`support-filter-${e.value}`},e.value))})]})]});if(d&&null===l&&!b)return(0,_jsxRuntime.jsx)(_reactNative.View,{style:a.center,testID:r,children:(0,_jsxRuntime.jsx)(_mobileUi.Spinner,{accessibilityLabel:"Loading your tickets"})});const w=_?(0,_jsxRuntime.jsx)(_reactNative.View,{style:a.footer,children:(0,_jsxRuntime.jsx)(_mobileUi.Spinner,{size:"sm",accessibilityLabel:"Loading more tickets"})}):j?(0,_jsxRuntime.jsxs)(_reactNative.View,{style:[a.footer,a.error],accessibilityLiveRegion:"polite",children:[(0,_jsxRuntime.jsx)(_mobileUi.Text,{variant:"bodySmall",color:"danger",children:j.message}),(0,_jsxRuntime.jsx)(_mobileUi.Button,{title:"Load more",size:"sm",variant:"ghost",onPress:()=>{S()}})]}):null;return(0,_jsxRuntime.jsx)(_reactNative.FlatList,{testID:r,data:n,keyExtractor:ticketKey,contentContainerStyle:a.content,ListHeaderComponent:f,ListFooterComponent:w,onEndReached:R,onEndReachedThreshold:.5,refreshControl:T,ListEmptyComponent:d?(0,_jsxRuntime.jsx)(_reactNative.View,{style:a.footer,children:(0,_jsxRuntime.jsx)(_mobileUi.Spinner,{accessibilityLabel:"Loading your tickets"})}):b?null:L?(0,_jsxRuntime.jsx)(_mobileUi.EmptyState,{title:"No tickets match",description:k?"Try another status or search.":void 0}):(0,_jsxRuntime.jsx)(_mobileUi.EmptyState,{title:"No tickets yet",description:"Raise a ticket and it will show here with its status.",action:t?{label:"New ticket",onPress:t}:void 0}),renderItem:v})};exports.SupportTicketList=SupportTicketList;const buildStyles=e=>_reactNative.StyleSheet.create({content:{padding:e.space.md,gap:e.space.sm},header:{gap:e.space.sm,marginBottom:e.space.xs},filters:{gap:e.space.xs},error:{gap:e.space.xs,alignItems:"flex-start"},center:{flex:1,alignItems:"center",justifyContent:"center",padding:e.space.xl},footer:{paddingVertical:e.space.md,alignItems:"center"},card:{gap:e.space.xxs},cardTop:{flexDirection:"row",justifyContent:"space-between",alignItems:"center"},cardBottom:{flexDirection:"row",justifyContent:"space-between",marginTop:e.space.xxs}});
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.statusFilterOptions=exports.SupportTicketList=exports.STATUS_TONES=void 0;var _mobileCore=require("@webority/mobile-core"),_mobileUi=require("@webority/mobile-ui"),_react=require("react"),_reactNative=require("react-native"),_SupportProvider=require("../SupportProvider.js"),_jsxRuntime=require("react/jsx-runtime");const STATUS_TONES=exports.STATUS_TONES={Open:"warning",InProgress:"info",WaitingOnCustomer:"warning",Resolved:"success",Closed:"neutral"},STATUS_FILTERS=[{value:"Open",label:"Open",count:"open"},{value:"InProgress",label:"In progress",count:"inProgress"},{value:"WaitingOnCustomer",label:"Waiting on you",count:"waitingOnCustomer"},{value:"Resolved",label:"Resolved",count:"resolved"},{value:"Closed",label:"Closed",count:"closed"}],ALL="all",statusFilterOptions=(e,t)=>[{value:ALL,label:"All",count:e.total},...STATUS_FILTERS.filter(i=>e[i.count]>0||i.value===t).map(t=>({value:t.value,label:t.label,count:e[t.count]}))];exports.statusFilterOptions=statusFilterOptions;const SEARCH_DEBOUNCE_MS=400,ticketKey=e=>e.id,TicketRow=(0,_react.memo)(function TicketRow({item:e,timeZone:t,onOpen:i,styles:s}){return(0,_jsxRuntime.jsxs)(_mobileUi.Card,{onPress:()=>i(e),accessibilityLabel:`${e.subject}, ${e.statusLabel}, ticket ${e.number}`,bodyStyle:s.card,testID:`support-ticket-${e.id}`,children:[(0,_jsxRuntime.jsxs)(_reactNative.View,{style:s.cardTop,children:[(0,_jsxRuntime.jsx)(_mobileUi.Text,{variant:"caption",color:"tertiary",children:e.number}),(0,_jsxRuntime.jsx)(_mobileUi.StatusBadge,{label:e.statusLabel,tone:STATUS_TONES[e.status]??"neutral",size:"sm"})]}),(0,_jsxRuntime.jsx)(_mobileUi.Text,{variant:"title",numberOfLines:2,children:e.subject}),(0,_jsxRuntime.jsx)(_mobileUi.Text,{variant:"bodySmall",color:"secondary",children:e.category}),(0,_jsxRuntime.jsxs)(_reactNative.View,{style:s.cardBottom,children:[(0,_jsxRuntime.jsx)(_mobileUi.Text,{variant:"caption",color:"tertiary",children:`Updated ${(0,_mobileCore.formatDateTime)(e.updatedDateTimeUtc,{zone:t})}`}),e.awaitingCustomer&&(0,_jsxRuntime.jsx)(_mobileUi.Text,{variant:"caption",color:"warning",children:"Waiting for your reply"})]})]})}),SupportTicketList=({onOpenTicket:e,onNewTicket:t,header:i,pageSize:s,testID:r="support-ticket-list"})=>{const a=(0,_mobileUi.useTheme)(),o=(0,_react.useMemo)(()=>buildStyles(a),[a]),{tickets:n,counts:l,status:c,search:u,setStatus:m,setSearch:p,loading:d,refreshing:x,loadingMore:_,error:b,loadMoreError:j,refresh:y,loadMore:S}=(0,_SupportProvider.useSupportTickets)({pageSize:s}),h=(0,_SupportProvider.useSupportTimeZone)(),v=(0,_react.useCallback)(({item:t})=>(0,_jsxRuntime.jsx)(TicketRow,{item:t,timeZone:h,onOpen:e,styles:o}),[h,e,o]),R=(0,_react.useCallback)(()=>{S()},[S]),g=(0,_react.useCallback)(()=>{y()},[y]),T=(0,_react.useMemo)(()=>(0,_jsxRuntime.jsx)(_reactNative.RefreshControl,{refreshing:x,onRefresh:g}),[x,g]),L=(l?.total??0)>0,k=null!==c||""!==u.trim(),f=(0,_jsxRuntime.jsxs)(_reactNative.View,{style:o.header,children:[i,t&&(0,_jsxRuntime.jsx)(_mobileUi.Button,{label:"New ticket",leftIcon:"add",onPress:t,fullWidth:!0}),b&&(0,_jsxRuntime.jsxs)(_reactNative.View,{style:o.error,accessibilityLiveRegion:"polite",children:[(0,_jsxRuntime.jsx)(_mobileUi.Text,{variant:"bodySmall",color:"danger",children:b.message}),(0,_jsxRuntime.jsx)(_mobileUi.Button,{label:"Try again",size:"sm",variant:"ghost",onPress:()=>{y()}})]}),l&&L&&(0,_jsxRuntime.jsxs)(_jsxRuntime.Fragment,{children:[(0,_jsxRuntime.jsx)(_mobileUi.SearchBar,{value:u,onChangeText:p,debounceMs:400,placeholder:"Search by subject or ticket number",accessibilityLabel:"Search tickets",testID:"support-ticket-search"}),(0,_jsxRuntime.jsx)(_reactNative.ScrollView,{horizontal:!0,showsHorizontalScrollIndicator:!1,contentContainerStyle:o.filters,accessibilityRole:"tablist",accessibilityLabel:"Filter by status",children:statusFilterOptions(l,c).map(e=>(0,_jsxRuntime.jsx)(_mobileUi.Chip,{label:`${e.label} (${e.count})`,selected:(c??ALL)===e.value,onPress:()=>m(e.value===ALL?null:e.value),accessibilityLabel:`${e.label}, ${e.count} tickets`,testID:`support-filter-${e.value}`},e.value))})]})]});if(d&&null===l&&!b)return(0,_jsxRuntime.jsx)(_reactNative.View,{style:o.center,testID:r,children:(0,_jsxRuntime.jsx)(_mobileUi.Spinner,{accessibilityLabel:"Loading your tickets"})});const w=_?(0,_jsxRuntime.jsx)(_reactNative.View,{style:o.footer,children:(0,_jsxRuntime.jsx)(_mobileUi.Spinner,{size:"sm",accessibilityLabel:"Loading more tickets"})}):j?(0,_jsxRuntime.jsxs)(_reactNative.View,{style:[o.footer,o.error],accessibilityLiveRegion:"polite",children:[(0,_jsxRuntime.jsx)(_mobileUi.Text,{variant:"bodySmall",color:"danger",children:j.message}),(0,_jsxRuntime.jsx)(_mobileUi.Button,{label:"Load more",size:"sm",variant:"ghost",onPress:()=>{S()}})]}):null;return(0,_jsxRuntime.jsx)(_reactNative.FlatList,{testID:r,data:n,keyExtractor:ticketKey,contentContainerStyle:o.content,ListHeaderComponent:f,ListFooterComponent:w,onEndReached:R,onEndReachedThreshold:.5,refreshControl:T,ListEmptyComponent:d?(0,_jsxRuntime.jsx)(_reactNative.View,{style:o.footer,children:(0,_jsxRuntime.jsx)(_mobileUi.Spinner,{accessibilityLabel:"Loading your tickets"})}):b?null:L?(0,_jsxRuntime.jsx)(_mobileUi.EmptyState,{title:"No tickets match",description:k?"Try another status or search.":void 0}):(0,_jsxRuntime.jsx)(_mobileUi.EmptyState,{title:"No tickets yet",description:"Raise a ticket and it will show here with its status.",action:t?{label:"New ticket",onPress:t}:void 0}),renderItem:v})};exports.SupportTicketList=SupportTicketList;const buildStyles=e=>_reactNative.StyleSheet.create({content:{padding:e.space.md,gap:e.space.sm},header:{gap:e.space.sm,marginBottom:e.space.xs},filters:{gap:e.space.xs},error:{gap:e.space.xs,alignItems:"flex-start"},center:{flex:1,alignItems:"center",justifyContent:"center",padding:e.space.xl},footer:{paddingVertical:e.space.md,alignItems:"center"},card:{gap:e.space.xxs},cardTop:{flexDirection:"row",justifyContent:"space-between",alignItems:"center"},cardBottom:{flexDirection:"row",justifyContent:"space-between",marginTop:e.space.xxs}});
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.ReportIssueButton=void 0;var _mobileUi=require("@webority/mobile-ui"),_react=require("react"),_reactNative=require("react-native"),_captureAndReport=require("./captureAndReport.js"),_jsxRuntime=require("react/jsx-runtime");const ReportIssueButton=({onReport:e,onCaptureError:t,captureScreenshot:s=!1,screenName:r,appVersion:i,category:a,subject:o,title:n="Report an issue",accessibilityLabel:u="Report an issue with this screen",testID:c="support-report-issue",...p})=>{const l=(0,_mobileUi.useTheme)(),[d,b]=(0,_react.useState)(!1),draftWithoutScreenshot=()=>({category:a,subject:o,pageUrl:r,appVersion:i}),_=(0,_jsxRuntime.jsx)(_mobileUi.Button,{leftIcon:"message-question",...p,title:n,accessibilityLabel:u,testID:c,disabled:p.disabled||d,onPress:()=>e(draftWithoutScreenshot())});return s?(0,_jsxRuntime.jsxs)(_reactNative.View,{style:{gap:l.space.sm},children:[_,(0,_jsxRuntime.jsx)(_mobileUi.Button,{variant:"outline",title:"Add a screenshot",accessibilityLabel:"Add a screenshot",testID:`${c}-screenshot`,loading:d,disabled:p.disabled,onPress:()=>{(async()=>{b(!0);try{e(await(0,_captureAndReport.captureAndReport)({screenName:r,appVersion:i,category:a,subject:o}))}catch(s){t?.(s),e(draftWithoutScreenshot())}finally{b(!1)}})()}})]}):_};exports.ReportIssueButton=ReportIssueButton;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.ReportIssueButton=void 0;var _mobileUi=require("@webority/mobile-ui"),_react=require("react"),_reactNative=require("react-native"),_captureAndReport=require("./captureAndReport.js"),_jsxRuntime=require("react/jsx-runtime");const ReportIssueButton=({onReport:e,onCaptureError:t,captureScreenshot:s=!1,screenName:r,appVersion:i,category:a,subject:o,title:n="Report an issue",accessibilityLabel:u="Report an issue with this screen",testID:c="support-report-issue",...p})=>{const l=(0,_mobileUi.useTheme)(),[b,d]=(0,_react.useState)(!1),draftWithoutScreenshot=()=>({category:a,subject:o,pageUrl:r,appVersion:i}),_=(0,_jsxRuntime.jsx)(_mobileUi.Button,{leftIcon:"message-question",...p,label:n,accessibilityLabel:u,testID:c,disabled:p.disabled||b,onPress:()=>e(draftWithoutScreenshot())});return s?(0,_jsxRuntime.jsxs)(_reactNative.View,{style:{gap:l.space.sm},children:[_,(0,_jsxRuntime.jsx)(_mobileUi.Button,{variant:"outline",label:"Add a screenshot",accessibilityLabel:"Add a screenshot",testID:`${c}-screenshot`,loading:b,disabled:p.disabled,onPress:()=>{(async()=>{d(!0);try{e(await(0,_captureAndReport.captureAndReport)({screenName:r,appVersion:i,category:a,subject:o}))}catch(s){t?.(s),e(draftWithoutScreenshot())}finally{d(!1)}})()}})]}):_};exports.ReportIssueButton=ReportIssueButton;
@@ -1 +1 @@
1
- "use strict";import{Button,Input,KeyboardAwareScrollView,Select,Spinner,Text,useForm,useTheme}from"@webority/mobile-ui";import{useMemo,useState}from"react";import{StyleSheet,View}from"react-native";import{toSupportApiError}from"../client.js";import{describeDevice}from"../device.js";import{useCreateSupportTicket,useSupportConfig}from"../SupportProvider.js";import{validateBody,validateCategory,validateFiles,validateSubject}from"../validation.js";import{PhotoTray}from"./PhotoTray.js";import{jsx as _jsx,jsxs as _jsxs,Fragment as _Fragment}from"react/jsx-runtime";const TicketForm=({config:e,styles:t,onCreated:o,onCancel:r,initialDraft:a,defaultCategory:s,appVersion:i})=>{const n=useCreateSupportTicket(),listed=t=>t&&e.categories.includes(t)?t:void 0,[l,c]=useState([]),[u,d]=useState(a?.screenshots??[]),[p,g]=useState(null),[m,y]=useState(null),h=useForm({initialValues:{category:listed(a?.category)??listed(s)??"",subject:a?.subject??"",body:a?.body??""},validate:{category:t=>validateCategory(t,e),subject:t=>validateSubject(t,e),body:t=>validateBody(t,e)},onSubmit:async t=>{const r=validateFiles([...u,...l],e);if(g(r??null),!r){y(null);try{const e=await n({category:t.category,subject:t.subject.trim(),body:t.body.trim(),pageUrl:a?.pageUrl,userAgent:a?.userAgent??describeDevice(),appVersion:a?.appVersion??i,files:l,screenshots:u});o(e)}catch(e){y(toSupportApiError(e).message)}}}}),b=h.getFieldProps("category"),x=h.getFieldProps("subject"),j=h.getFieldProps("body"),S=u.length+l.length;return _jsxs(KeyboardAwareScrollView,{contentContainerStyle:t.content,safeAreaEdges:[],children:[_jsx(Text,{variant:"bodySmall",color:"secondary",children:"Tell us what you need. We reply by email and in this ticket."}),_jsx(Select,{label:"Category",placeholder:"Choose a category",options:e.categories.map(e=>({label:e,value:e})),value:b.value||void 0,onChange:e=>b.setValue(String(e),!0),error:b.error,testID:"support-new-category"}),_jsx(Input,{label:"Subject",placeholder:"A short summary",required:!0,maxLength:e.subjectMaxLength,value:x.value,onChangeText:x.onChangeText,onBlur:x.onBlur,error:x.error,testID:"support-new-subject"}),_jsx(Input,{label:"Message",placeholder:"What happened, and what did you expect?",required:!0,multiline:!0,maxLength:e.bodyMaxLength,value:j.value,onChangeText:j.onChangeText,onBlur:j.onBlur,error:j.error,testID:"support-new-body"}),u.length>0&&_jsx(PhotoTray,{label:"Screenshot",photos:u,onChange:d,remaining:0,allowAdd:!1,maxBytes:e.maxAttachmentBytes,disabled:h.isSubmitting}),_jsx(PhotoTray,{label:"Photos",photos:l,onChange:c,remaining:e.maxAttachmentsPerMessage-S,maxBytes:e.maxAttachmentBytes,disabled:h.isSubmitting}),_jsx(Text,{variant:"caption",color:"tertiary",children:`Attach up to ${e.maxAttachmentsPerMessage} files.`}),(p||m)&&_jsx(Text,{variant:"bodySmall",color:"danger",accessibilityLiveRegion:"polite",children:p??m}),_jsxs(View,{style:t.actions,children:[r&&_jsx(Button,{title:"Cancel",variant:"ghost",tone:"neutral",onPress:r,disabled:h.isSubmitting}),_jsx(Button,{title:"Send ticket",loading:h.isSubmitting,disabled:h.isSubmitting,onPress:h.submit,testID:"support-new-submit"})]})]})};export const NewSupportTicket=e=>{const t=useTheme(),o=useMemo(()=>buildStyles(t),[t]),{config:r,loading:a,error:s,reload:i}=useSupportConfig(),n=e.testID??"support-new-ticket";return _jsx(View,r?{style:o.root,testID:n,children:_jsx(TicketForm,{...e,config:r,styles:o})}:{style:o.center,testID:n,children:a?_jsx(Spinner,{accessibilityLabel:"Loading"}):_jsxs(_Fragment,{children:[_jsx(Text,{variant:"body",color:"danger",align:"center",children:s?.message??"Support is not available right now."}),_jsx(Button,{title:"Try again",variant:"ghost",onPress:()=>{i()}})]})})};const buildStyles=e=>StyleSheet.create({root:{flex:1},content:{padding:e.space.md,gap:e.space.md},center:{flex:1,alignItems:"center",justifyContent:"center",padding:e.space.xl,gap:e.space.sm},actions:{flexDirection:"row",justifyContent:"flex-end",gap:e.space.sm}});
1
+ "use strict";import{Button,Input,KeyboardAwareScrollView,Select,Spinner,Text,useHookFormField,useTheme}from"@webority/mobile-ui";import{useMemo,useState}from"react";import{useForm}from"react-hook-form";import{StyleSheet,View}from"react-native";import{toSupportApiError}from"../client.js";import{describeDevice}from"../device.js";import{useCreateSupportTicket,useSupportConfig}from"../SupportProvider.js";import{validateBody,validateCategory,validateFiles,validateSubject}from"../validation.js";import{PhotoTray}from"./PhotoTray.js";import{jsx as _jsx,jsxs as _jsxs,Fragment as _Fragment}from"react/jsx-runtime";const TicketForm=({config:e,styles:t,onCreated:o,onCancel:r,initialDraft:a,defaultCategory:s,appVersion:n})=>{const l=useCreateSupportTicket(),listed=t=>t&&e.categories.includes(t)?t:void 0,[i,c]=useState([]),[u,d]=useState(a?.screenshots??[]),[p,m]=useState(null),[g,h]=useState(null),y=useForm({defaultValues:{category:listed(a?.category)??listed(s)??"",subject:a?.subject??"",body:a?.body??""}}),b=y.handleSubmit(async t=>{const r=validateFiles([...u,...i],e);if(m(r??null),!r){h(null);try{const e=await l({category:t.category,subject:t.subject.trim(),body:t.body.trim(),pageUrl:a?.pageUrl,userAgent:a?.userAgent??describeDevice(),appVersion:a?.appVersion??n,files:i,screenshots:u});o(e)}catch(e){h(toSupportApiError(e).message)}}}),x=y.formState.isSubmitting,j=useHookFormField({control:y.control,name:"category",rules:{validate:t=>validateCategory(t,e)}}),S=useHookFormField({control:y.control,name:"subject",rules:{validate:t=>validateSubject(t,e)}}),v=useHookFormField({control:y.control,name:"body",rules:{validate:t=>validateBody(t,e)}}),f=u.length+i.length;return _jsxs(KeyboardAwareScrollView,{contentContainerStyle:t.content,safeAreaEdges:[],children:[_jsx(Text,{variant:"bodySmall",color:"secondary",children:"Tell us what you need. We reply by email and in this ticket."}),_jsx(Select,{label:"Category",placeholder:"Choose a category",options:e.categories.map(e=>({label:e,value:e})),value:j.value||void 0,onChange:e=>j.onChange(String(e)),error:j.error,testID:"support-new-category"}),_jsx(Input,{label:"Subject",placeholder:"A short summary",required:!0,maxLength:e.subjectMaxLength,value:S.value,onChangeText:S.onChangeText,onBlur:S.onBlur,error:S.error,testID:"support-new-subject"}),_jsx(Input,{label:"Message",placeholder:"What happened, and what did you expect?",required:!0,multiline:!0,maxLength:e.bodyMaxLength,value:v.value,onChangeText:v.onChangeText,onBlur:v.onBlur,error:v.error,testID:"support-new-body"}),u.length>0&&_jsx(PhotoTray,{label:"Screenshot",photos:u,onChange:d,remaining:0,allowAdd:!1,maxBytes:e.maxAttachmentBytes,disabled:x}),_jsx(PhotoTray,{label:"Photos",photos:i,onChange:c,remaining:e.maxAttachmentsPerMessage-f,maxBytes:e.maxAttachmentBytes,disabled:x}),_jsx(Text,{variant:"caption",color:"tertiary",children:`Attach up to ${e.maxAttachmentsPerMessage} files.`}),(p||g)&&_jsx(Text,{variant:"bodySmall",color:"danger",accessibilityLiveRegion:"polite",children:p??g}),_jsxs(View,{style:t.actions,children:[r&&_jsx(Button,{label:"Cancel",variant:"ghost",tone:"neutral",onPress:r,disabled:x}),_jsx(Button,{label:"Send ticket",loading:x,disabled:x,onPress:()=>{b()},testID:"support-new-submit"})]})]})};export const NewSupportTicket=e=>{const t=useTheme(),o=useMemo(()=>buildStyles(t),[t]),{config:r,loading:a,error:s,reload:n}=useSupportConfig(),l=e.testID??"support-new-ticket";return _jsx(View,r?{style:o.root,testID:l,children:_jsx(TicketForm,{...e,config:r,styles:o})}:{style:o.center,testID:l,children:a?_jsx(Spinner,{accessibilityLabel:"Loading"}):_jsxs(_Fragment,{children:[_jsx(Text,{variant:"body",color:"danger",align:"center",children:s?.message??"Support is not available right now."}),_jsx(Button,{label:"Try again",variant:"ghost",onPress:()=>{n()}})]})})};const buildStyles=e=>StyleSheet.create({root:{flex:1},content:{padding:e.space.md,gap:e.space.md},center:{flex:1,alignItems:"center",justifyContent:"center",padding:e.space.xl,gap:e.space.sm},actions:{flexDirection:"row",justifyContent:"flex-end",gap:e.space.sm}});
@@ -1 +1 @@
1
- "use strict";import{AppIcon,Button,IconButton,Text,useTheme}from"@webority/mobile-ui";import{useMemo,useState}from"react";import{Image,StyleSheet,View}from"react-native";import{pickPhotos}from"../photos.js";import{jsx as _jsx,jsxs as _jsxs}from"react/jsx-runtime";export const PhotoTray=({photos:e,onChange:o,remaining:t,maxBytes:s,disabled:r,label:i,allowAdd:a=!0})=>{const l=useTheme(),n=useMemo(()=>buildStyles(l),[l]),[c,m]=useState(null),[u,d]=useState(null),add=async r=>{d(null),m(r);try{const i=await pickPhotos(r,{maxCount:t,maxBytes:s});i.length>0&&o([...e,...i])}catch(e){d(e instanceof Error&&"PhotoPermissionError"===e.name?e.message:"That photo could not be added. Try another one.")}finally{m(null)}},h=t<=0;return _jsxs(View,{style:n.root,children:[i?_jsx(Text,{variant:"label",color:"secondary",children:i}):null,e.length>0&&_jsx(View,{style:n.row,children:e.map((t,s)=>_jsxs(View,{style:n.item,children:[_jsx(Image,{source:{uri:t.uri},style:n.thumb,accessibilityLabel:t.name}),_jsx(View,{style:n.remove,children:_jsx(IconButton,{size:"sm",variant:"glass",style:n.removeButton,icon:({color:e})=>_jsx(AppIcon,{name:"trash",color:r?e:l.colors["on-scrim"],size:REMOVE_ICON}),accessibilityLabel:`Remove ${t.name}`,disabled:r,onPress:()=>o(e.filter((e,o)=>o!==s))})})]},`${t.uri}-${s}`))}),a&&_jsxs(View,{style:n.actions,children:[_jsx(Button,{size:"sm",variant:"outline",tone:"neutral",leftIcon:"gallery",title:"Add photo",accessibilityLabel:"Add a photo from your library",loading:"library"===c,disabled:r||h||null!==c,onPress:()=>{add("library")}}),_jsx(Button,{size:"sm",variant:"outline",tone:"neutral",leftIcon:"camera",title:"Take photo",accessibilityLabel:"Take a photo with your camera",loading:"camera"===c,disabled:r||h||null!==c,onPress:()=>{add("camera")}})]}),u?_jsx(Text,{variant:"caption",color:"danger",accessibilityLiveRegion:"polite",children:u}):null]})};const THUMB=72,REMOVE_SIZE=24,REMOVE_ICON=14,buildStyles=e=>StyleSheet.create({root:{gap:e.space.xs},row:{flexDirection:"row",flexWrap:"wrap",gap:e.space.xs},item:{width:72,height:72},thumb:{width:72,height:72,borderRadius:e.radius.sm,backgroundColor:e.colors["bg-subtle"]},remove:{position:"absolute",top:e.space.xxs,right:e.space.xxs},removeButton:{width:24,height:24,borderRadius:12,backgroundColor:e.colors.scrim,borderColor:e.colors["on-scrim"]},actions:{flexDirection:"row",gap:e.space.sm}});
1
+ "use strict";import{AppIcon,Button,IconButton,Text,useTheme}from"@webority/mobile-ui";import{useMemo,useState}from"react";import{Image,StyleSheet,View}from"react-native";import{pickPhotos}from"../photos.js";import{jsx as _jsx,jsxs as _jsxs}from"react/jsx-runtime";export const PhotoTray=({photos:e,onChange:o,remaining:t,maxBytes:s,disabled:r,label:a,allowAdd:i=!0})=>{const l=useTheme(),n=useMemo(()=>buildStyles(l),[l]),[c,m]=useState(null),[u,d]=useState(null),add=async r=>{d(null),m(r);try{const a=await pickPhotos(r,{maxCount:t,maxBytes:s});a.length>0&&o([...e,...a])}catch(e){d(e instanceof Error&&"PhotoPermissionError"===e.name?e.message:"That photo could not be added. Try another one.")}finally{m(null)}},h=t<=0;return _jsxs(View,{style:n.root,children:[a?_jsx(Text,{variant:"label",color:"secondary",children:a}):null,e.length>0&&_jsx(View,{style:n.row,children:e.map((t,s)=>_jsxs(View,{style:n.item,children:[_jsx(Image,{source:{uri:t.uri},style:n.thumb,accessibilityLabel:t.name}),_jsx(View,{style:n.remove,children:_jsx(IconButton,{size:"sm",variant:"glass",style:n.removeButton,icon:({color:e})=>_jsx(AppIcon,{name:"trash",color:r?e:l.colors["on-scrim"],size:REMOVE_ICON}),accessibilityLabel:`Remove ${t.name}`,disabled:r,onPress:()=>o(e.filter((e,o)=>o!==s))})})]},`${t.uri}-${s}`))}),i&&_jsxs(View,{style:n.actions,children:[_jsx(Button,{size:"sm",variant:"outline",tone:"neutral",leftIcon:"gallery",label:"Add photo",accessibilityLabel:"Add a photo from your library",loading:"library"===c,disabled:r||h||null!==c,onPress:()=>{add("library")}}),_jsx(Button,{size:"sm",variant:"outline",tone:"neutral",leftIcon:"camera",label:"Take photo",accessibilityLabel:"Take a photo with your camera",loading:"camera"===c,disabled:r||h||null!==c,onPress:()=>{add("camera")}})]}),u?_jsx(Text,{variant:"caption",color:"danger",accessibilityLiveRegion:"polite",children:u}):null]})};const THUMB=72,REMOVE_SIZE=24,REMOVE_ICON=14,buildStyles=e=>StyleSheet.create({root:{gap:e.space.xs},row:{flexDirection:"row",flexWrap:"wrap",gap:e.space.xs},item:{width:72,height:72},thumb:{width:72,height:72,borderRadius:e.radius.sm,backgroundColor:e.colors["bg-subtle"]},remove:{position:"absolute",top:e.space.xxs,right:e.space.xxs},removeButton:{width:24,height:24,borderRadius:12,backgroundColor:e.colors.scrim,borderColor:e.colors["on-scrim"]},actions:{flexDirection:"row",gap:e.space.sm}});
@@ -1 +1 @@
1
- "use strict";import{Button,Card,Spinner,Text,toast,useTheme}from"@webority/mobile-ui";import{useMemo}from"react";import{Linking,Platform,StyleSheet,View}from"react-native";import{copyText}from"../clipboard.js";import{useSupportConfig}from"../SupportProvider.js";import{jsx as _jsx,jsxs as _jsxs}from"react/jsx-runtime";const COPY_TOAST_KEY="support-contact-copy";export const SupportContact=({testID:t="support-contact"})=>{const e=useTheme(),o=useMemo(()=>buildStyles(e),[e]),{config:s,loading:a,error:i}=useSupportConfig();if(!s)return _jsx(Card,{variant:"outlined",testID:t,children:a?_jsx(Spinner,{size:"sm",accessibilityLabel:"Loading contact details"}):_jsx(Text,{variant:"bodySmall",color:"danger",children:i?.message??"Contact details are not available right now."})});const r=s.supportEmail,l=s.supportPhone?.trim(),n=s.supportHours?.trim(),open=(t,e)=>{Linking.openURL(t).catch(()=>toast.error(e))};return _jsxs(Card,{variant:"outlined",bodyStyle:o.body,testID:t,children:[_jsx(Text,{variant:"title",accessibilityRole:"header",children:`Contact ${s.supportName||s.productName}`}),_jsxs(View,{style:o.row,children:[_jsx(Text,{variant:"label",color:"secondary",children:"Email"}),_jsx(Text,{variant:"body",selectable:!0,testID:"support-contact-email",children:r||"-"})]}),r?_jsxs(View,{style:o.actions,children:[_jsx(Button,{title:"Copy",size:"sm",variant:"outline",tone:"neutral",leftIcon:"copy",accessibilityLabel:`Copy ${r}`,onPress:()=>{(async()=>{try{await copyText(r),"android"===Platform.OS&&Number(Platform.Version)>=33||toast.success("Email address copied.",{key:COPY_TOAST_KEY})}catch{toast.error("Could not copy the email address.",{key:COPY_TOAST_KEY})}})()},testID:"support-contact-copy"}),_jsx(Button,{title:"Send email",size:"sm",variant:"outline",leftIcon:"mail",accessibilityLabel:`Send an email to ${r}`,onPress:()=>open(`mailto:${r}`,"No email app is set up on this device."),testID:"support-contact-mail"})]}):null,l?_jsxs(View,{style:o.row,children:[_jsx(Text,{variant:"label",color:"secondary",children:"Phone"}),_jsx(Button,{title:l,size:"sm",variant:"link",leftIcon:"call",accessibilityLabel:`Call ${l}`,onPress:()=>open(`tel:${l.replace(/[^\d+]/g,"")}`,"This device cannot make calls."),testID:"support-contact-phone"})]}):null,n?_jsxs(View,{style:o.row,children:[_jsx(Text,{variant:"label",color:"secondary",children:"Hours"}),_jsx(Text,{variant:"bodySmall",children:n})]}):null]})};const buildStyles=t=>StyleSheet.create({body:{gap:t.space.sm},row:{gap:t.space.xxs,alignItems:"flex-start"},actions:{flexDirection:"row",gap:t.space.sm}});
1
+ "use strict";import{Button,Card,Spinner,Text,toast,useTheme}from"@webority/mobile-ui";import{useMemo}from"react";import{Linking,Platform,StyleSheet,View}from"react-native";import{copyText}from"../clipboard.js";import{useSupportConfig}from"../SupportProvider.js";import{jsx as _jsx,jsxs as _jsxs}from"react/jsx-runtime";const COPY_TOAST_KEY="support-contact-copy";export const SupportContact=({testID:e="support-contact"})=>{const t=useTheme(),o=useMemo(()=>buildStyles(t),[t]),{config:s,loading:a,error:r}=useSupportConfig();if(!s)return _jsx(Card,{variant:"outline",testID:e,children:a?_jsx(Spinner,{size:"sm",accessibilityLabel:"Loading contact details"}):_jsx(Text,{variant:"bodySmall",color:"danger",children:r?.message??"Contact details are not available right now."})});const i=s.supportEmail,l=s.supportPhone?.trim(),n=s.supportHours?.trim(),open=(e,t)=>{Linking.openURL(e).catch(()=>toast.error(t))};return _jsxs(Card,{variant:"outline",bodyStyle:o.body,testID:e,children:[_jsx(Text,{variant:"title",accessibilityRole:"header",children:`Contact ${s.supportName||s.productName}`}),_jsxs(View,{style:o.row,children:[_jsx(Text,{variant:"label",color:"secondary",children:"Email"}),_jsx(Text,{variant:"body",selectable:!0,testID:"support-contact-email",children:i||"-"})]}),i?_jsxs(View,{style:o.actions,children:[_jsx(Button,{label:"Copy",size:"sm",variant:"outline",tone:"neutral",leftIcon:"copy",accessibilityLabel:`Copy ${i}`,onPress:()=>{(async()=>{try{await copyText(i),"android"===Platform.OS&&Number(Platform.Version)>=33||toast.success("Email address copied.",{key:COPY_TOAST_KEY})}catch{toast.error("Could not copy the email address.",{key:COPY_TOAST_KEY})}})()},testID:"support-contact-copy"}),_jsx(Button,{label:"Send email",size:"sm",variant:"outline",leftIcon:"mail",accessibilityLabel:`Send an email to ${i}`,onPress:()=>open(`mailto:${i}`,"No email app is set up on this device."),testID:"support-contact-mail"})]}):null,l?_jsxs(View,{style:o.row,children:[_jsx(Text,{variant:"label",color:"secondary",children:"Phone"}),_jsx(Button,{label:l,size:"sm",variant:"link",leftIcon:"call",accessibilityLabel:`Call ${l}`,onPress:()=>open(`tel:${l.replace(/[^\d+]/g,"")}`,"This device cannot make calls."),testID:"support-contact-phone"})]}):null,n?_jsxs(View,{style:o.row,children:[_jsx(Text,{variant:"label",color:"secondary",children:"Hours"}),_jsx(Text,{variant:"bodySmall",children:n})]}):null]})};const buildStyles=e=>StyleSheet.create({body:{gap:e.space.sm},row:{gap:e.space.xxs,alignItems:"flex-start"},actions:{flexDirection:"row",gap:e.space.sm}});
@@ -1 +1 @@
1
- "use strict";import{formatDateTime}from"@webority/mobile-core";import{Button,Card,Input,KeyboardAwareScrollView,Spinner,StatusBadge,Text,useTheme}from"@webority/mobile-ui";import{useMemo,useState}from"react";import{StyleSheet,View}from"react-native";import{useSupportConfig,useSupportTicket,useSupportTimeZone}from"../SupportProvider.js";import{validateBody,validateFiles}from"../validation.js";import{AttachmentList,ImageViewer}from"./Attachments.js";import{PhotoTray}from"./PhotoTray.js";import{STATUS_TONES}from"./SupportTicketList.js";import{jsx as _jsx,jsxs as _jsxs,Fragment as _Fragment}from"react/jsx-runtime";const MessageBubble=({message:e,styles:t,timeZone:s,onOpenImage:i})=>{if("System"===e.authorKind)return _jsx(View,{style:t.system,testID:`support-message-${e.id}`,children:_jsx(Text,{variant:"caption",color:"tertiary",align:"center",children:`${e.body}, ${formatDateTime(e.createdDateTimeUtc,{zone:s})}`})});const a="Customer"===e.authorKind;return _jsx(View,{style:[t.bubbleRow,a?t.mineRow:t.theirsRow],testID:`support-message-${e.id}`,children:_jsxs(View,{style:[t.bubble,a?t.mine:t.theirs],children:[_jsx(Text,{variant:"label",color:a?"primary":"secondary",children:e.authorName??(a?"You":"Support team")}),_jsx(Text,{variant:"body",selectable:!0,children:e.body}),_jsx(AttachmentList,{attachments:e.attachments,onOpenImage:i}),_jsx(Text,{variant:"caption",color:"tertiary",children:formatDateTime(e.createdDateTimeUtc,{zone:s})})]})})},SATISFACTION_TEXT={Satisfied:"You told us this solved your problem.",Unsatisfied:"You told us this did not solve your problem."};export const SupportTicketDetail=({ticketId:e,testID:t="support-ticket-detail"})=>{const s=useTheme(),i=useMemo(()=>buildStyles(s),[s]),{config:a}=useSupportConfig(),o=useSupportTimeZone(),{ticket:n,loading:r,error:l,actionError:c,busy:d,reload:m,reply:p,reopen:u,rate:x}=useSupportTicket(e),[y,h]=useState(null),[g,b]=useState(""),[S,j]=useState([]),[f,T]=useState(null),[_,v]=useState(null),[w,I]=useState("");if(!n)return _jsx(View,{style:i.center,testID:t,children:r?_jsx(Spinner,{accessibilityLabel:"Loading the ticket"}):_jsxs(_Fragment,{children:[_jsx(Text,{variant:"body",color:"danger",align:"center",children:l?.message??"That ticket could not be found."}),_jsx(Button,{title:"Try again",variant:"ghost",onPress:()=>{m()}})]})});const D=n.messages.filter(e=>!e.isInternal);return _jsxs(View,{style:i.root,testID:t,children:[_jsxs(KeyboardAwareScrollView,{contentContainerStyle:i.content,safeAreaEdges:[],children:[_jsxs(View,{style:i.head,children:[_jsx(Text,{variant:"h3",accessibilityRole:"header",children:n.subject}),_jsx(Text,{variant:"bodySmall",color:"secondary",children:`${n.number}, ${n.category}`}),_jsxs(View,{style:i.headRow,children:[_jsx(StatusBadge,{label:n.statusLabel,tone:STATUS_TONES[n.status]??"neutral",accessibilityLabel:`Status: ${n.statusLabel}`}),_jsx(Text,{variant:"caption",color:"tertiary",children:`Opened ${formatDateTime(n.createdDateTimeUtc,{zone:o})}`})]})]}),"WaitingOnCustomer"===n.status&&_jsx(Card,{variant:"outlined",bodyStyle:i.section,testID:"support-waiting",children:_jsx(Text,{variant:"bodySmall",children:"We need your answer to carry on. Reply below and the ticket goes back to our team."})}),n.canReopen&&_jsxs(Card,{variant:"outlined",bodyStyle:i.section,children:[_jsx(Text,{variant:"bodySmall",children:`This ticket is ${n.statusLabel}. Reopen it if you still need help.`}),_jsx(Button,{title:"Reopen ticket",variant:"outline",size:"sm",loading:d,disabled:d,onPress:()=>{u()},testID:"support-reopen"})]}),n.satisfaction?_jsxs(Card,{variant:"outlined",bodyStyle:i.section,testID:"support-rating",children:[_jsx(Text,{variant:"bodySmall",accessibilityLiveRegion:"polite",children:SATISFACTION_TEXT[n.satisfaction]}),n.satisfactionComment?_jsx(Text,{variant:"bodySmall",color:"secondary",children:`Your comment: ${n.satisfactionComment}`}):null]}):n.canRate?_jsxs(Card,{variant:"outlined",bodyStyle:i.section,testID:"support-rating",children:[_jsx(Text,{variant:"label",children:"Did this solve your problem?"}),_jsxs(View,{style:i.ratingRow,children:[_jsx(Button,{title:"Yes, it is solved",size:"sm",leftIcon:"like",variant:"Satisfied"===_?"solid":"outline",tone:"success",accessibilityState:{selected:"Satisfied"===_},"aria-selected":"Satisfied"===_,onPress:()=>v("Satisfied"),testID:"support-rate-satisfied"}),_jsx(Button,{title:"No, it is not",size:"sm",leftIcon:"dislike",variant:"Unsatisfied"===_?"solid":"outline",tone:"danger",accessibilityState:{selected:"Unsatisfied"===_},"aria-selected":"Unsatisfied"===_,onPress:()=>v("Unsatisfied"),testID:"support-rate-unsatisfied"})]}),_&&_jsxs(_Fragment,{children:[_jsx(Input,{label:"Anything to add? (optional)",helperText:"Your comment goes to the support team.",value:w,onChangeText:I,multiline:!0,maxLength:a?.satisfactionCommentMaxLength,testID:"support-rating-comment"}),_jsx(Button,{title:"Send answer",size:"sm",loading:d,disabled:d,onPress:()=>{(async()=>{_&&await x({satisfaction:_,comment:w})&&(v(null),I(""))})()},testID:"support-rating-send"})]})]}):null,_jsx(View,{style:i.thread,accessibilityLabel:"Conversation",children:D.map(e=>_jsx(MessageBubble,{message:e,styles:i,timeZone:o,onOpenImage:(e,t)=>h({uri:e,name:t})},e.id))}),_jsxs(View,{style:i.section,children:[_jsx(Input,{label:"Your reply",required:!0,placeholder:"Write a reply to the support team",value:g,onChangeText:b,multiline:!0,maxLength:a?.bodyMaxLength,error:f??void 0,testID:"support-reply-input"}),a&&_jsx(PhotoTray,{photos:S,onChange:j,remaining:a.maxAttachmentsPerMessage-S.length,maxBytes:a.maxAttachmentBytes,disabled:d}),n.canReopen&&_jsx(Text,{variant:"caption",color:"secondary",children:"Replying reopens this ticket."}),c&&_jsx(Text,{variant:"bodySmall",color:"danger",accessibilityLiveRegion:"polite",children:c.message}),_jsx(Button,{title:"Send reply",leftIcon:"send",loading:d,disabled:d,onPress:()=>{(async()=>{const e=g.trim(),t=a?validateBody(e,a)??validateFiles(S,a):e?void 0:"Write a message.";t?T(t):(T(null),await p({body:e,files:S})&&(b(""),j([])))})()},testID:"support-reply-send"})]})]}),_jsx(ImageViewer,{image:y,onClose:()=>h(null)})]})};const buildStyles=e=>StyleSheet.create({root:{flex:1},content:{padding:e.space.md,gap:e.space.md},center:{flex:1,alignItems:"center",justifyContent:"center",padding:e.space.xl,gap:e.space.sm},head:{gap:e.space.xxs},headRow:{flexDirection:"row",alignItems:"center",gap:e.space.sm,marginTop:e.space.xs},section:{gap:e.space.sm},ratingRow:{flexDirection:"row",flexWrap:"wrap",gap:e.space.sm},thread:{gap:e.space.sm},system:{paddingHorizontal:e.space.lg,paddingVertical:e.space.xxs},bubbleRow:{flexDirection:"row"},mineRow:{justifyContent:"flex-end"},theirsRow:{justifyContent:"flex-start"},bubble:{maxWidth:"85%",borderRadius:e.radius.lg,padding:e.space.sm,gap:e.space.xxs},mine:{backgroundColor:e.colors["primary-soft"]},theirs:{backgroundColor:e.colors["bg-subtle"]}});
1
+ "use strict";import{formatDateTime}from"@webority/mobile-core";import{Button,Card,Input,KeyboardAwareScrollView,Spinner,StatusBadge,Text,useTheme}from"@webority/mobile-ui";import{useMemo,useState}from"react";import{StyleSheet,View}from"react-native";import{useSupportConfig,useSupportTicket,useSupportTimeZone}from"../SupportProvider.js";import{validateBody,validateFiles}from"../validation.js";import{AttachmentList,ImageViewer}from"./Attachments.js";import{PhotoTray}from"./PhotoTray.js";import{STATUS_TONES}from"./SupportTicketList.js";import{jsx as _jsx,jsxs as _jsxs,Fragment as _Fragment}from"react/jsx-runtime";const MessageBubble=({message:e,styles:t,timeZone:s,onOpenImage:a})=>{if("System"===e.authorKind)return _jsx(View,{style:t.system,testID:`support-message-${e.id}`,children:_jsx(Text,{variant:"caption",color:"tertiary",align:"center",children:`${e.body}, ${formatDateTime(e.createdDateTimeUtc,{zone:s})}`})});const i="Customer"===e.authorKind;return _jsx(View,{style:[t.bubbleRow,i?t.mineRow:t.theirsRow],testID:`support-message-${e.id}`,children:_jsxs(View,{style:[t.bubble,i?t.mine:t.theirs],children:[_jsx(Text,{variant:"label",color:i?"primary":"secondary",children:e.authorName??(i?"You":"Support team")}),_jsx(Text,{variant:"body",selectable:!0,children:e.body}),_jsx(AttachmentList,{attachments:e.attachments,onOpenImage:a}),_jsx(Text,{variant:"caption",color:"tertiary",children:formatDateTime(e.createdDateTimeUtc,{zone:s})})]})})},SATISFACTION_TEXT={Satisfied:"You told us this solved your problem.",Unsatisfied:"You told us this did not solve your problem."};export const SupportTicketDetail=({ticketId:e,testID:t="support-ticket-detail"})=>{const s=useTheme(),a=useMemo(()=>buildStyles(s),[s]),{config:i}=useSupportConfig(),o=useSupportTimeZone(),{ticket:n,loading:r,error:l,actionError:c,busy:d,reload:m,reply:p,reopen:u,rate:x}=useSupportTicket(e),[y,h]=useState(null),[b,g]=useState(""),[S,j]=useState([]),[f,T]=useState(null),[_,v]=useState(null),[w,I]=useState("");if(!n)return _jsx(View,{style:a.center,testID:t,children:r?_jsx(Spinner,{accessibilityLabel:"Loading the ticket"}):_jsxs(_Fragment,{children:[_jsx(Text,{variant:"body",color:"danger",align:"center",children:l?.message??"That ticket could not be found."}),_jsx(Button,{label:"Try again",variant:"ghost",onPress:()=>{m()}})]})});const D=n.messages.filter(e=>!e.isInternal);return _jsxs(View,{style:a.root,testID:t,children:[_jsxs(KeyboardAwareScrollView,{contentContainerStyle:a.content,safeAreaEdges:[],children:[_jsxs(View,{style:a.head,children:[_jsx(Text,{variant:"h3",accessibilityRole:"header",children:n.subject}),_jsx(Text,{variant:"bodySmall",color:"secondary",children:`${n.number}, ${n.category}`}),_jsxs(View,{style:a.headRow,children:[_jsx(StatusBadge,{label:n.statusLabel,tone:STATUS_TONES[n.status]??"neutral",accessibilityLabel:`Status: ${n.statusLabel}`}),_jsx(Text,{variant:"caption",color:"tertiary",children:`Opened ${formatDateTime(n.createdDateTimeUtc,{zone:o})}`})]})]}),"WaitingOnCustomer"===n.status&&_jsx(Card,{variant:"outline",bodyStyle:a.section,testID:"support-waiting",children:_jsx(Text,{variant:"bodySmall",children:"We need your answer to carry on. Reply below and the ticket goes back to our team."})}),n.canReopen&&_jsxs(Card,{variant:"outline",bodyStyle:a.section,children:[_jsx(Text,{variant:"bodySmall",children:`This ticket is ${n.statusLabel}. Reopen it if you still need help.`}),_jsx(Button,{label:"Reopen ticket",variant:"outline",size:"sm",loading:d,disabled:d,onPress:()=>{u()},testID:"support-reopen"})]}),n.satisfaction?_jsxs(Card,{variant:"outline",bodyStyle:a.section,testID:"support-rating",children:[_jsx(Text,{variant:"bodySmall",accessibilityLiveRegion:"polite",children:SATISFACTION_TEXT[n.satisfaction]}),n.satisfactionComment?_jsx(Text,{variant:"bodySmall",color:"secondary",children:`Your comment: ${n.satisfactionComment}`}):null]}):n.canRate?_jsxs(Card,{variant:"outline",bodyStyle:a.section,testID:"support-rating",children:[_jsx(Text,{variant:"label",children:"Did this solve your problem?"}),_jsxs(View,{style:a.ratingRow,children:[_jsx(Button,{label:"Yes, it is solved",size:"sm",leftIcon:"like",variant:"Satisfied"===_?"solid":"outline",tone:"success",accessibilityState:{selected:"Satisfied"===_},"aria-selected":"Satisfied"===_,onPress:()=>v("Satisfied"),testID:"support-rate-satisfied"}),_jsx(Button,{label:"No, it is not",size:"sm",leftIcon:"dislike",variant:"Unsatisfied"===_?"solid":"outline",tone:"danger",accessibilityState:{selected:"Unsatisfied"===_},"aria-selected":"Unsatisfied"===_,onPress:()=>v("Unsatisfied"),testID:"support-rate-unsatisfied"})]}),_&&_jsxs(_Fragment,{children:[_jsx(Input,{label:"Anything to add? (optional)",helperText:"Your comment goes to the support team.",value:w,onChangeText:I,multiline:!0,maxLength:i?.satisfactionCommentMaxLength,testID:"support-rating-comment"}),_jsx(Button,{label:"Send answer",size:"sm",loading:d,disabled:d,onPress:()=>{(async()=>{_&&await x({satisfaction:_,comment:w})&&(v(null),I(""))})()},testID:"support-rating-send"})]})]}):null,_jsx(View,{style:a.thread,accessibilityLabel:"Conversation",children:D.map(e=>_jsx(MessageBubble,{message:e,styles:a,timeZone:o,onOpenImage:(e,t)=>h({uri:e,name:t})},e.id))}),_jsxs(View,{style:a.section,children:[_jsx(Input,{label:"Your reply",required:!0,placeholder:"Write a reply to the support team",value:b,onChangeText:g,multiline:!0,maxLength:i?.bodyMaxLength,error:f??void 0,testID:"support-reply-input"}),i&&_jsx(PhotoTray,{photos:S,onChange:j,remaining:i.maxAttachmentsPerMessage-S.length,maxBytes:i.maxAttachmentBytes,disabled:d}),n.canReopen&&_jsx(Text,{variant:"caption",color:"secondary",children:"Replying reopens this ticket."}),c&&_jsx(Text,{variant:"bodySmall",color:"danger",accessibilityLiveRegion:"polite",children:c.message}),_jsx(Button,{label:"Send reply",leftIcon:"send",loading:d,disabled:d,onPress:()=>{(async()=>{const e=b.trim(),t=i?validateBody(e,i)??validateFiles(S,i):e?void 0:"Write a message.";t?T(t):(T(null),await p({body:e,files:S})&&(g(""),j([])))})()},testID:"support-reply-send"})]})]}),_jsx(ImageViewer,{image:y,onClose:()=>h(null)})]})};const buildStyles=e=>StyleSheet.create({root:{flex:1},content:{padding:e.space.md,gap:e.space.md},center:{flex:1,alignItems:"center",justifyContent:"center",padding:e.space.xl,gap:e.space.sm},head:{gap:e.space.xxs},headRow:{flexDirection:"row",alignItems:"center",gap:e.space.sm,marginTop:e.space.xs},section:{gap:e.space.sm},ratingRow:{flexDirection:"row",flexWrap:"wrap",gap:e.space.sm},thread:{gap:e.space.sm},system:{paddingHorizontal:e.space.lg,paddingVertical:e.space.xxs},bubbleRow:{flexDirection:"row"},mineRow:{justifyContent:"flex-end"},theirsRow:{justifyContent:"flex-start"},bubble:{maxWidth:"85%",borderRadius:e.radius.lg,padding:e.space.sm,gap:e.space.xxs},mine:{backgroundColor:e.colors["primary-soft"]},theirs:{backgroundColor:e.colors["bg-subtle"]}});
@@ -1 +1 @@
1
- "use strict";import{formatDateTime}from"@webority/mobile-core";import{Button,Card,Chip,EmptyState,SearchBar,Spinner,StatusBadge,Text,useTheme}from"@webority/mobile-ui";import{memo,useCallback,useMemo}from"react";import{FlatList,RefreshControl,ScrollView,StyleSheet,View}from"react-native";import{useSupportTickets,useSupportTimeZone}from"../SupportProvider.js";import{jsx as _jsx,jsxs as _jsxs,Fragment as _Fragment}from"react/jsx-runtime";export const STATUS_TONES={Open:"warning",InProgress:"info",WaitingOnCustomer:"warning",Resolved:"success",Closed:"neutral"};const STATUS_FILTERS=[{value:"Open",label:"Open",count:"open"},{value:"InProgress",label:"In progress",count:"inProgress"},{value:"WaitingOnCustomer",label:"Waiting on you",count:"waitingOnCustomer"},{value:"Resolved",label:"Resolved",count:"resolved"},{value:"Closed",label:"Closed",count:"closed"}],ALL="all";export const statusFilterOptions=(e,t)=>[{value:ALL,label:"All",count:e.total},...STATUS_FILTERS.filter(s=>e[s.count]>0||s.value===t).map(t=>({value:t.value,label:t.label,count:e[t.count]}))];const SEARCH_DEBOUNCE_MS=400,ticketKey=e=>e.id,TicketRow=memo(function TicketRow({item:e,timeZone:t,onOpen:s,styles:i}){return _jsxs(Card,{onPress:()=>s(e),accessibilityLabel:`${e.subject}, ${e.statusLabel}, ticket ${e.number}`,bodyStyle:i.card,testID:`support-ticket-${e.id}`,children:[_jsxs(View,{style:i.cardTop,children:[_jsx(Text,{variant:"caption",color:"tertiary",children:e.number}),_jsx(StatusBadge,{label:e.statusLabel,tone:STATUS_TONES[e.status]??"neutral",size:"sm"})]}),_jsx(Text,{variant:"title",numberOfLines:2,children:e.subject}),_jsx(Text,{variant:"bodySmall",color:"secondary",children:e.category}),_jsxs(View,{style:i.cardBottom,children:[_jsx(Text,{variant:"caption",color:"tertiary",children:`Updated ${formatDateTime(e.updatedDateTimeUtc,{zone:t})}`}),e.awaitingCustomer&&_jsx(Text,{variant:"caption",color:"warning",children:"Waiting for your reply"})]})]})});export const SupportTicketList=({onOpenTicket:e,onNewTicket:t,header:s,pageSize:i,testID:r="support-ticket-list"})=>{const o=useTheme(),a=useMemo(()=>buildStyles(o),[o]),{tickets:n,counts:l,status:c,search:u,setStatus:d,setSearch:p,loading:m,refreshing:x,loadingMore:b,error:h,loadMoreError:y,refresh:g,loadMore:S}=useSupportTickets({pageSize:i}),j=useSupportTimeZone(),T=useCallback(({item:t})=>_jsx(TicketRow,{item:t,timeZone:j,onOpen:e,styles:a}),[j,e,a]),_=useCallback(()=>{S()},[S]),f=useCallback(()=>{g()},[g]),v=useMemo(()=>_jsx(RefreshControl,{refreshing:x,onRefresh:f}),[x,f]),w=(l?.total??0)>0,L=null!==c||""!==u.trim(),k=_jsxs(View,{style:a.header,children:[s,t&&_jsx(Button,{title:"New ticket",leftIcon:"add",onPress:t,fullWidth:!0}),h&&_jsxs(View,{style:a.error,accessibilityLiveRegion:"polite",children:[_jsx(Text,{variant:"bodySmall",color:"danger",children:h.message}),_jsx(Button,{title:"Try again",size:"sm",variant:"ghost",onPress:()=>{g()}})]}),l&&w&&_jsxs(_Fragment,{children:[_jsx(SearchBar,{value:u,onChangeText:p,debounceMs:400,placeholder:"Search by subject or ticket number",accessibilityLabel:"Search tickets",testID:"support-ticket-search"}),_jsx(ScrollView,{horizontal:!0,showsHorizontalScrollIndicator:!1,contentContainerStyle:a.filters,accessibilityRole:"tablist",accessibilityLabel:"Filter by status",children:statusFilterOptions(l,c).map(e=>_jsx(Chip,{label:`${e.label} (${e.count})`,selected:(c??ALL)===e.value,onPress:()=>d(e.value===ALL?null:e.value),accessibilityLabel:`${e.label}, ${e.count} tickets`,testID:`support-filter-${e.value}`},e.value))})]})]});if(m&&null===l&&!h)return _jsx(View,{style:a.center,testID:r,children:_jsx(Spinner,{accessibilityLabel:"Loading your tickets"})});const C=b?_jsx(View,{style:a.footer,children:_jsx(Spinner,{size:"sm",accessibilityLabel:"Loading more tickets"})}):y?_jsxs(View,{style:[a.footer,a.error],accessibilityLiveRegion:"polite",children:[_jsx(Text,{variant:"bodySmall",color:"danger",children:y.message}),_jsx(Button,{title:"Load more",size:"sm",variant:"ghost",onPress:()=>{S()}})]}):null;return _jsx(FlatList,{testID:r,data:n,keyExtractor:ticketKey,contentContainerStyle:a.content,ListHeaderComponent:k,ListFooterComponent:C,onEndReached:_,onEndReachedThreshold:.5,refreshControl:v,ListEmptyComponent:m?_jsx(View,{style:a.footer,children:_jsx(Spinner,{accessibilityLabel:"Loading your tickets"})}):h?null:_jsx(EmptyState,w?{title:"No tickets match",description:L?"Try another status or search.":void 0}:{title:"No tickets yet",description:"Raise a ticket and it will show here with its status.",action:t?{label:"New ticket",onPress:t}:void 0}),renderItem:T})};const buildStyles=e=>StyleSheet.create({content:{padding:e.space.md,gap:e.space.sm},header:{gap:e.space.sm,marginBottom:e.space.xs},filters:{gap:e.space.xs},error:{gap:e.space.xs,alignItems:"flex-start"},center:{flex:1,alignItems:"center",justifyContent:"center",padding:e.space.xl},footer:{paddingVertical:e.space.md,alignItems:"center"},card:{gap:e.space.xxs},cardTop:{flexDirection:"row",justifyContent:"space-between",alignItems:"center"},cardBottom:{flexDirection:"row",justifyContent:"space-between",marginTop:e.space.xxs}});
1
+ "use strict";import{formatDateTime}from"@webority/mobile-core";import{Button,Card,Chip,EmptyState,SearchBar,Spinner,StatusBadge,Text,useTheme}from"@webority/mobile-ui";import{memo,useCallback,useMemo}from"react";import{FlatList,RefreshControl,ScrollView,StyleSheet,View}from"react-native";import{useSupportTickets,useSupportTimeZone}from"../SupportProvider.js";import{jsx as _jsx,jsxs as _jsxs,Fragment as _Fragment}from"react/jsx-runtime";export const STATUS_TONES={Open:"warning",InProgress:"info",WaitingOnCustomer:"warning",Resolved:"success",Closed:"neutral"};const STATUS_FILTERS=[{value:"Open",label:"Open",count:"open"},{value:"InProgress",label:"In progress",count:"inProgress"},{value:"WaitingOnCustomer",label:"Waiting on you",count:"waitingOnCustomer"},{value:"Resolved",label:"Resolved",count:"resolved"},{value:"Closed",label:"Closed",count:"closed"}],ALL="all";export const statusFilterOptions=(e,t)=>[{value:ALL,label:"All",count:e.total},...STATUS_FILTERS.filter(s=>e[s.count]>0||s.value===t).map(t=>({value:t.value,label:t.label,count:e[t.count]}))];const SEARCH_DEBOUNCE_MS=400,ticketKey=e=>e.id,TicketRow=memo(function TicketRow({item:e,timeZone:t,onOpen:s,styles:i}){return _jsxs(Card,{onPress:()=>s(e),accessibilityLabel:`${e.subject}, ${e.statusLabel}, ticket ${e.number}`,bodyStyle:i.card,testID:`support-ticket-${e.id}`,children:[_jsxs(View,{style:i.cardTop,children:[_jsx(Text,{variant:"caption",color:"tertiary",children:e.number}),_jsx(StatusBadge,{label:e.statusLabel,tone:STATUS_TONES[e.status]??"neutral",size:"sm"})]}),_jsx(Text,{variant:"title",numberOfLines:2,children:e.subject}),_jsx(Text,{variant:"bodySmall",color:"secondary",children:e.category}),_jsxs(View,{style:i.cardBottom,children:[_jsx(Text,{variant:"caption",color:"tertiary",children:`Updated ${formatDateTime(e.updatedDateTimeUtc,{zone:t})}`}),e.awaitingCustomer&&_jsx(Text,{variant:"caption",color:"warning",children:"Waiting for your reply"})]})]})});export const SupportTicketList=({onOpenTicket:e,onNewTicket:t,header:s,pageSize:i,testID:r="support-ticket-list"})=>{const o=useTheme(),a=useMemo(()=>buildStyles(o),[o]),{tickets:n,counts:l,status:c,search:u,setStatus:d,setSearch:p,loading:m,refreshing:b,loadingMore:x,error:h,loadMoreError:y,refresh:g,loadMore:S}=useSupportTickets({pageSize:i}),j=useSupportTimeZone(),T=useCallback(({item:t})=>_jsx(TicketRow,{item:t,timeZone:j,onOpen:e,styles:a}),[j,e,a]),_=useCallback(()=>{S()},[S]),f=useCallback(()=>{g()},[g]),v=useMemo(()=>_jsx(RefreshControl,{refreshing:b,onRefresh:f}),[b,f]),w=(l?.total??0)>0,L=null!==c||""!==u.trim(),k=_jsxs(View,{style:a.header,children:[s,t&&_jsx(Button,{label:"New ticket",leftIcon:"add",onPress:t,fullWidth:!0}),h&&_jsxs(View,{style:a.error,accessibilityLiveRegion:"polite",children:[_jsx(Text,{variant:"bodySmall",color:"danger",children:h.message}),_jsx(Button,{label:"Try again",size:"sm",variant:"ghost",onPress:()=>{g()}})]}),l&&w&&_jsxs(_Fragment,{children:[_jsx(SearchBar,{value:u,onChangeText:p,debounceMs:400,placeholder:"Search by subject or ticket number",accessibilityLabel:"Search tickets",testID:"support-ticket-search"}),_jsx(ScrollView,{horizontal:!0,showsHorizontalScrollIndicator:!1,contentContainerStyle:a.filters,accessibilityRole:"tablist",accessibilityLabel:"Filter by status",children:statusFilterOptions(l,c).map(e=>_jsx(Chip,{label:`${e.label} (${e.count})`,selected:(c??ALL)===e.value,onPress:()=>d(e.value===ALL?null:e.value),accessibilityLabel:`${e.label}, ${e.count} tickets`,testID:`support-filter-${e.value}`},e.value))})]})]});if(m&&null===l&&!h)return _jsx(View,{style:a.center,testID:r,children:_jsx(Spinner,{accessibilityLabel:"Loading your tickets"})});const C=x?_jsx(View,{style:a.footer,children:_jsx(Spinner,{size:"sm",accessibilityLabel:"Loading more tickets"})}):y?_jsxs(View,{style:[a.footer,a.error],accessibilityLiveRegion:"polite",children:[_jsx(Text,{variant:"bodySmall",color:"danger",children:y.message}),_jsx(Button,{label:"Load more",size:"sm",variant:"ghost",onPress:()=>{S()}})]}):null;return _jsx(FlatList,{testID:r,data:n,keyExtractor:ticketKey,contentContainerStyle:a.content,ListHeaderComponent:k,ListFooterComponent:C,onEndReached:_,onEndReachedThreshold:.5,refreshControl:v,ListEmptyComponent:m?_jsx(View,{style:a.footer,children:_jsx(Spinner,{accessibilityLabel:"Loading your tickets"})}):h?null:_jsx(EmptyState,w?{title:"No tickets match",description:L?"Try another status or search.":void 0}:{title:"No tickets yet",description:"Raise a ticket and it will show here with its status.",action:t?{label:"New ticket",onPress:t}:void 0}),renderItem:T})};const buildStyles=e=>StyleSheet.create({content:{padding:e.space.md,gap:e.space.sm},header:{gap:e.space.sm,marginBottom:e.space.xs},filters:{gap:e.space.xs},error:{gap:e.space.xs,alignItems:"flex-start"},center:{flex:1,alignItems:"center",justifyContent:"center",padding:e.space.xl},footer:{paddingVertical:e.space.md,alignItems:"center"},card:{gap:e.space.xxs},cardTop:{flexDirection:"row",justifyContent:"space-between",alignItems:"center"},cardBottom:{flexDirection:"row",justifyContent:"space-between",marginTop:e.space.xxs}});
@@ -1 +1 @@
1
- "use strict";import{Button,useTheme}from"@webority/mobile-ui";import{useState}from"react";import{View}from"react-native";import{captureAndReport}from"./captureAndReport.js";import{jsx as _jsx,jsxs as _jsxs}from"react/jsx-runtime";export const ReportIssueButton=({onReport:e,onCaptureError:t,captureScreenshot:s=!1,screenName:r,appVersion:a,category:o,subject:i,title:n="Report an issue",accessibilityLabel:c="Report an issue with this screen",testID:p="support-report-issue",...u})=>{const l=useTheme(),[m,d]=useState(!1),draftWithoutScreenshot=()=>({category:o,subject:i,pageUrl:r,appVersion:a}),b=_jsx(Button,{leftIcon:"message-question",...u,title:n,accessibilityLabel:c,testID:p,disabled:u.disabled||m,onPress:()=>e(draftWithoutScreenshot())});return s?_jsxs(View,{style:{gap:l.space.sm},children:[b,_jsx(Button,{variant:"outline",title:"Add a screenshot",accessibilityLabel:"Add a screenshot",testID:`${p}-screenshot`,loading:m,disabled:u.disabled,onPress:()=>{(async()=>{d(!0);try{e(await captureAndReport({screenName:r,appVersion:a,category:o,subject:i}))}catch(s){t?.(s),e(draftWithoutScreenshot())}finally{d(!1)}})()}})]}):b};
1
+ "use strict";import{Button,useTheme}from"@webority/mobile-ui";import{useState}from"react";import{View}from"react-native";import{captureAndReport}from"./captureAndReport.js";import{jsx as _jsx,jsxs as _jsxs}from"react/jsx-runtime";export const ReportIssueButton=({onReport:e,onCaptureError:t,captureScreenshot:s=!1,screenName:r,appVersion:a,category:o,subject:i,title:n="Report an issue",accessibilityLabel:c="Report an issue with this screen",testID:p="support-report-issue",...u})=>{const l=useTheme(),[m,b]=useState(!1),draftWithoutScreenshot=()=>({category:o,subject:i,pageUrl:r,appVersion:a}),d=_jsx(Button,{leftIcon:"message-question",...u,label:n,accessibilityLabel:c,testID:p,disabled:u.disabled||m,onPress:()=>e(draftWithoutScreenshot())});return s?_jsxs(View,{style:{gap:l.space.sm},children:[d,_jsx(Button,{variant:"outline",label:"Add a screenshot",accessibilityLabel:"Add a screenshot",testID:`${p}-screenshot`,loading:m,disabled:u.disabled,onPress:()=>{(async()=>{b(!0);try{e(await captureAndReport({screenName:r,appVersion:a,category:o,subject:i}))}catch(s){t?.(s),e(draftWithoutScreenshot())}finally{b(!1)}})()}})]}):d};
@@ -1,7 +1,7 @@
1
- import { type StatusBadgeTone } from "@webority/mobile-ui";
1
+ import { type Tone } from "@webority/mobile-ui";
2
2
  import type React from "react";
3
3
  import type { SupportTicketCounts, SupportTicketStatus, SupportTicketSummary } from "../types";
4
- export declare const STATUS_TONES: Record<SupportTicketStatus, StatusBadgeTone>;
4
+ export declare const STATUS_TONES: Record<SupportTicketStatus, Tone>;
5
5
  declare const ALL = "all";
6
6
  export interface StatusFilterOption {
7
7
  value: SupportTicketStatus | typeof ALL;
@@ -2,7 +2,7 @@ import { type ButtonProps } from "@webority/mobile-ui";
2
2
  import type React from "react";
3
3
  import type { SupportTicketDraft } from "../types";
4
4
  import { type CaptureAndReportOptions } from "./captureAndReport";
5
- export interface ReportIssueButtonProps extends CaptureAndReportOptions, Omit<ButtonProps, "onPress" | "title" | "children" | "loading"> {
5
+ export interface ReportIssueButtonProps extends CaptureAndReportOptions, Omit<ButtonProps, "onPress" | "label" | "loading"> {
6
6
  /** Open the new ticket screen with this draft, for example `navigation.navigate('NewTicket', { draft })`. */
7
7
  onReport: (draft: SupportTicketDraft) => void;
8
8
  /**
@@ -1,7 +1,7 @@
1
- import { type StatusBadgeTone } from "@webority/mobile-ui";
1
+ import { type Tone } from "@webority/mobile-ui";
2
2
  import type React from "react";
3
3
  import type { SupportTicketCounts, SupportTicketStatus, SupportTicketSummary } from "../types.js";
4
- export declare const STATUS_TONES: Record<SupportTicketStatus, StatusBadgeTone>;
4
+ export declare const STATUS_TONES: Record<SupportTicketStatus, Tone>;
5
5
  declare const ALL = "all";
6
6
  export interface StatusFilterOption {
7
7
  value: SupportTicketStatus | typeof ALL;
@@ -2,7 +2,7 @@ import { type ButtonProps } from "@webority/mobile-ui";
2
2
  import type React from "react";
3
3
  import type { SupportTicketDraft } from "../types.js";
4
4
  import { type CaptureAndReportOptions } from "./captureAndReport.js";
5
- export interface ReportIssueButtonProps extends CaptureAndReportOptions, Omit<ButtonProps, "onPress" | "title" | "children" | "loading"> {
5
+ export interface ReportIssueButtonProps extends CaptureAndReportOptions, Omit<ButtonProps, "onPress" | "label" | "loading"> {
6
6
  /** Open the new ticket screen with this draft, for example `navigation.navigate('NewTicket', { draft })`. */
7
7
  onReport: (draft: SupportTicketDraft) => void;
8
8
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@webority/mobile-support",
3
- "version": "0.104.1",
3
+ "version": "0.107.0",
4
4
  "description": "Customer support tickets for Webority React Native apps: the support API client, hooks, ticket screens, contact card and a report-an-issue button that attaches a screenshot.",
5
5
  "keywords": [
6
6
  "react-native",
@@ -69,11 +69,12 @@
69
69
  "expo-image-picker": ">=57.0.0",
70
70
  "expo-sharing": ">=57.0.0",
71
71
  "react": "^19.1.0",
72
+ "react-hook-form": "^7.55.0",
72
73
  "react-native": ">=0.81.0",
73
74
  "react-native-gesture-handler": "^2.21.0 || ^3.0.0",
74
75
  "react-native-view-shot": ">=4.0.0",
75
- "@webority/mobile-core": "0.104.1",
76
- "@webority/mobile-ui": "0.104.1"
76
+ "@webority/mobile-ui": "0.107.0",
77
+ "@webority/mobile-core": "0.107.0"
77
78
  },
78
79
  "peerDependenciesMeta": {
79
80
  "expo-image-manipulator": {
@@ -128,6 +129,7 @@
128
129
  "expo-file-system": "57.0.6",
129
130
  "expo-image-manipulator": "57.0.14",
130
131
  "jest": "29.7.0",
132
+ "react-hook-form": "7.89.0",
131
133
  "react": "19.2.8",
132
134
  "react-native": "0.86.3",
133
135
  "react-native-builder-bob": "0.43.0",
@@ -136,8 +138,8 @@
136
138
  "rimraf": "6.1.3",
137
139
  "typescript": "5.9.3",
138
140
  "@webority/mobile-dev": "0.0.0",
139
- "@webority/mobile-ui": "0.104.1",
140
- "@webority/mobile-core": "0.104.1"
141
+ "@webority/mobile-ui": "0.107.0",
142
+ "@webority/mobile-core": "0.107.0"
141
143
  },
142
144
  "scripts": {
143
145
  "build": "bob build && node ../mobile-dev/scripts/minify-lib.mjs",