123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. function PageShare(props) {
  2. const { useRef, useState, useEffect } = React;
  3. const { userMerge } = props;
  4. const [ loading, setLoading ] = useState(false);
  5. const [ isReady, setIsReady ] = useState(false);
  6. const refDisplayImage = useRef();
  7. const userOrder = useRef(0);
  8. const API__DOMAIN = (window.location.host === 'www.pxfreshdelivery.tw') ? 'https://www.pxfreshdelivery.tw/' : 'https://demo.pxfreshdelivery.tw/';
  9. function goNext() {
  10. props.next();
  11. }
  12. function goBack() {
  13. props.back();
  14. }
  15. function share2Facebook() {
  16. if (!isReady || !userOrder.current) return;
  17. shareToFacebook(userOrder.current);
  18. }
  19. function share2Line() {
  20. if (!isReady || !userOrder.current) return;
  21. shareToLine(userOrder.current);
  22. }
  23. function getId() {
  24. return new Promise((resolve, reject) => {
  25. const kol = getQueryVariable('kol');
  26. $.ajax({
  27. type: 'POST',
  28. url: `${API__DOMAIN}web/saveData`,
  29. data: {
  30. title: '全聯小時達|料理靈感 食材一鍵送達',
  31. desc: getDescription(kol),
  32. },
  33. success(response) {
  34. resolve(response.id);
  35. },
  36. error(XMLHttpRequest, textStatus, errorThrown) {
  37. console.log(`Status: ${textStatus}, Error: ${errorThrown}`);
  38. reject(new Error(errorThrown));
  39. },
  40. });
  41. });
  42. }
  43. function upload2Server(base64) {
  44. return new Promise((resolve, reject) => {
  45. getId().then((id) => {
  46. userOrder.current = id;
  47. $.ajax({
  48. type: 'POST',
  49. url: `${API__DOMAIN}web/saveImg`,
  50. data: {
  51. id: id,
  52. image: base64,
  53. },
  54. dataType: 'json',
  55. success(response) {
  56. resolve(response);
  57. },
  58. error(XMLHttpRequest, textStatus, errorThrown) {
  59. console.log(`Status: ${textStatus}, Error: ${errorThrown}`);
  60. reject(new Error(errorThrown));
  61. },
  62. });
  63. })
  64. });
  65. }
  66. async function generateCard(tempsrc, imgsrc) {
  67. const image = await ImageLoader(imgsrc);
  68. const tempImage = await ImageLoader(tempsrc);
  69. const canvas = document.createElement('canvas');
  70. const context = canvas.getContext('2d');
  71. canvas.width = 1200;
  72. canvas.height = 630;
  73. context.drawImage(image, 0, 0, 1200, 630);
  74. context.drawImage(tempImage, 0, 0, 1200, 630);
  75. return canvas.toDataURL('image/jpg', 1.0);
  76. }
  77. function doInitProcess() {
  78. setLoading(true);
  79. const kol = getQueryVariable('kol');
  80. const tempImageSrc = getTemplate(kol);
  81. if (!tempImageSrc) return;
  82. generateCard(tempImageSrc, userMerge).then((base64) => {
  83. upload2Server(base64).then(() => {
  84. refDisplayImage.current.src = base64;
  85. setLoading(false);
  86. setIsReady(true);
  87. }).catch((error) => {
  88. setLoading(false);
  89. console.log('Upload2Server Error\nName:' + error.name + '\nMessage:' + error.message);
  90. });
  91. });
  92. }
  93. useEffect(() => {
  94. doInitProcess();
  95. return () => {};
  96. }, []);
  97. return (
  98. <div class="sharePage">
  99. <div class="sharePage__header">
  100. <div class="btn__back" onClick={goBack}>
  101. <img src="https://d1xzlli46wohoc.cloudfront.net/assets/images/btn-retake.png" alt="" />
  102. </div>
  103. </div>
  104. <div class="sharePage__body">
  105. <div class="sharePage__title">
  106. <img src="https://d1xzlli46wohoc.cloudfront.net/assets/images/share-title.png" alt="" />
  107. </div>
  108. <div class="sharePage__demo">
  109. <div class="sharePage__picture">
  110. <img ref={refDisplayImage} />
  111. </div>
  112. {
  113. (loading) ? (<div class="sharePage__loader">
  114. <div class="loader-46"></div>
  115. </div>) : ('')
  116. }
  117. </div>
  118. </div>
  119. <div className={"sharePage__footer " + (isReady ? 'is__show' : 'is__hidden')}>
  120. <div class="btn__group">
  121. <div class="btn__line" onClick={share2Line}>分享至LINE</div>
  122. <div class="btn__facebook" onClick={share2Facebook}>分享至Facebook</div>
  123. </div>
  124. </div>
  125. </div>
  126. );
  127. }