| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616 |
- import { Textarea, View, Image, Input, ScrollView } from "@tarojs/components";
- import './log_publish.scss'
- import { rpxToPx } from "@/utils/tools";
- import { useEffect, useState } from "react";
- import { useSelector } from "react-redux";
- import Taro from "@tarojs/taro";
- import { IconArrow, IconClose } from "@/components/basic/Icons";
- import NewButton, { NewButtonType } from "@/_health/base/new_button";
- import showAlert from "@/components/basic/Alert";
- import { IconCamera, IconClock } from "@/_record/components/record_icon";
- import { useTranslation } from "react-i18next";
- import { MainColorType } from "@/context/themes/color";
- import dayjs from "dayjs";
- import { addEvents } from "@/services/health";
- import { TimeFormatter } from "@/utils/time_format";
- import { BASE_IMG_URL, baseUrl } from "@/services/http/api";
- import LogTags from "./log_tags";
- import PickerCard from "@/_record/components/picker_card";
- import showActionSheet from "@/components/basic/ActionSheet";
- let useRoute;
- let useNavigation;
- let LinearGradient;
- if (process.env.TARO_ENV == 'rn') {
- useRoute = require("@react-navigation/native").useRoute
- useNavigation = require("@react-navigation/native").useNavigation
- LinearGradient = require('react-native-linear-gradient').default
- }
- export default function LogPublish(props: { onClose: any, scenario: string, tag?: any, tags: any, addTag: boolean }) {
- const scale = '?x-oss-process=image/format,jpg/resize,w_400'
- const systemInfo: any = Taro.getWindowInfo ? Taro.getWindowInfo() : Taro.getSystemInfoSync();
- const navigationBarHeight = systemInfo.statusBarHeight + 44;
- const screenHeight = systemInfo.screenHeight
- const [showChoose, setShowChoose] = useState(false)
- const record = useSelector((state: any) => state.record);
- const [pics, setPics] = useState<any>([])
- const [desc, setDesc] = useState('')
- const [focus, setFocus] = useState(false)
- const [time, setTime] = useState(dayjs().format('HH:mm'))
- const [selDate, setSelDate] = useState(dayjs().format('YYYY-MM-DD'))
- const [enterTimestmap] = useState(new Date().getTime())
- const [scenario, setScenarios] = useState(props.scenario)
- const [posting, setPosting] = useState(false)
- const [title, setTitle] = useState(props.tag ? props.tag.title : '')
- const [step, setStep] = useState(props.addTag ? 1 : 2)
- const [inputFocus, setInputFocus] = useState(false)
- const [showTimePicker, setShowTimePicker] = useState(false)
- const [addEnter, setAddEnter] = useState(props.addTag ?? false)
- const { t } = useTranslation()
- useEffect(() => {
- if (step == 1) {
- setTimeout(() => {
- setInputFocus(true)
- }, 300)
- }
- else {
- setAddEnter(false)
- }
- }, [step])
- function addImage(isCamera) {
- var source: any = isCamera ? ['camera'] : ['album']
- Taro.chooseImage({
- count: 9 - pics.length,
- sizeType: ['compressed'],
- // mediaType: ['image'],
- sourceType: source,
- success: async function (res) {
- const results = await Promise.all(res.tempFiles.map(getImageInfo));
- chooseSuccess(results, true)
- // checkAuthorized()
- },
- fail: function (res) {
- }
- })
- }
- async function chooseSuccess(res, isAlbum) {
- // const filePaths = res.map(file => file.path
- // // process.env.TARO_ENV === 'rn' || isFilePath ? file.path : file.tempFilePath
- // )
- Taro.showLoading({
- title: t('health.uploading')
- })
- try {
- const uploadedUrls = await Promise.all(res.map(path => uploadFile2(path, isAlbum ? 'album' : 'camera')))
- setPics([...pics, ...uploadedUrls])
- Taro.hideLoading()
- } catch (error) {
- console.error('Error uploading files:', error)
- Taro.hideLoading()
- }
- }
- function uploadFile2(obj: any, source: string): Promise<string> {
- return new Promise((resolve, reject) => {
- var path = obj.path
- const dot = path.lastIndexOf('.')
- const fileExt = dot > 0 ? path.substring(dot) : ''
- Taro.request({
- method: 'GET',
- timeout: 30000,
- url: `${baseUrl}/api/thirdparty/aliyun/oss-form-upload`,
- header: {
- 'Authorization': 'bearer ' + global.token
- },
- data: {
- type: 'FOOD_JOURNAL',
- file_ext: fileExt
- },
- success: (rsp) => {
- if (rsp.statusCode !== 200) {
- reject(new Error(t('health.networkError')))
- return
- }
- Taro.uploadFile({
- timeout: 30000,
- url: rsp.data.upload_url,
- filePath: path,
- name: 'file',
- formData: rsp.data.fields,
- success: () => {
- var temp = JSON.parse(JSON.stringify(obj))
- temp.url = rsp.data.view_url
- // resolve(rsp.data.view_url)
- resolve(temp)
- },
- fail: (error) => {
- reject(error)
- }
- })
- },
- fail: reject
- })
- })
- }
- const getImageInfo = (src) => {
- const { tempFilePath, path } = src
- return new Promise((resolve) => {
- Taro.getImageInfo({
- src: tempFilePath ? tempFilePath : path,
- success: (result) => resolve({
- height: result.height,
- width: result.width,
- orientation: result.orientation,
- path: result.path,
- type: result.type
- }),
- fail: (error) => resolve({
- height: 1024,
- width: 1024,
- orientation: 'up',
- path: tempFilePath,
- type: 'unknown'
- }),
- });
- });
- };
- function tapPic() {
- var list = process.env.TARO_ENV == 'weapp' ? [t('health.add_photos'), t('health.camera2'), t('health.import_chat')] :
- [t('health.add_photos'), t('health.camera2')]
- showActionSheet({
- title: '',
- // showActionSheetWithOptions: showActionSheetWithOptions,
- itemList: list,
- success: function (res) {
- switch (res) {
- case 0:
- addImage(false)
- break;
- case 1:
- addImage(true)
- break;
- case 2:
- Taro.chooseMessageFile({
- count: 9 - pics.length,
- type: 'image',
- success: async function (res) {
- const results = await Promise.all(res.tempFiles.map(getImageInfo));
- chooseSuccess(results, true)
- },
- fail(res) {
- },
- })
- break;
- case 3:
- // setImgUrl('')
- break;
- }
- }
- })
- }
- function save() {
- var date = TimeFormatter.stringToDate(selDate, time)
- date.setMilliseconds(new Date(enterTimestmap).getMilliseconds())
- var params: any = {
- scenario: scenario, //ACTIVITY
- type: 'POINT',
- sub_type: scenario,
- title: title,
- time: {
- start_timestamp: date.getTime()
- }
- }
- // if (router.params.join_id) {
- // params.join_key = router.params.join_id
- // }
- var moment: any = {
- description: desc,
- }
- if (pics.length > 0) {
- var picList: any = []
- pics.map((item) => {
- picList.push({
- url: item.url,
- type: item.url.indexOf('mp4') != -1 ? 'video' : 'image',
- source: 'album',
- width: item.width,
- height: item.height,
- format: item.format
- })
- })
- moment.media = picList
- }
- params.moment = moment
- // if (event_id && event_id != 'undefined') {
- // params.event_id = event_id
- // }
- // if (is_temp) {
- // params.event = window == 'EAT' ? 'EAT_CUSTOM' : 'ACTIVE_CUSTOM'
- // }
- // params.op_page = window == 'EAT' ? 'HOME_EAT' : 'HOME_ACTIVE'
- params.extra = {
- set_time: global.set_time ? global.set_time : new Date().getTime(),
- confirm_time: new Date().getTime()
- }
- if (posting) return
- setPosting(true)
- // Taro.showLoading({
- // title: t('health.uploading')
- // })
- addEvents(params).then(res => {
- // setShowResult(true)
- // setResult(res)
- setPosting(false)
- // Taro.hideLoading()
- Taro.reLaunch({
- url: '/pages/moment/moment'
- })
- props.onClose()
- }).catch(e => {
- setPosting(false)
- // Taro.hideLoading()
- })
- }
- function getDate() {
- var sel = dayjs(selDate)
- var now = dayjs().format('YYYY-MM-DD')
- const yesterday = dayjs().subtract(1, 'day');
- if (sel.format('YYYY-MM-DD') == now) {
- return ''
- }
- if (yesterday.format('YYYY-MM-DD') == sel.format('YYYY-MM-DD')) {
- return global.language == 'en' ? 'Yesterday ' : '昨天 '
- }
- else {
- return global.language == 'en' ? sel.format('MMM D ') : sel.format('MMMD日 ')
- }
- }
- function getBackground() {
- var time = record.time
- if (!time) return '#fff'
- const { background_colors } = time
- if (!background_colors) {
- return '#fff'
- }
- else if (background_colors.length == 1) {
- return background_colors[0]
- }
- return `linear-gradient(to bottom, ${background_colors[0]}, ${background_colors[1]})`
- }
- function bgView() {
- if (process.env.TARO_ENV == 'weapp') {
- return <View className="main_bg" style={{ background: getBackground() }} />
- }
- var time = record.time
- if (!time) return <View />
- const { background_colors } = time
- if (!background_colors) {
- return <View />
- }
- else if (background_colors.length == 1) {
- return <View />
- }
- return <LinearGradient style={{
- position: 'absolute',
- left: 0,
- top: 0,
- width: rpxToPx(750),
- height: screenHeight,
- zIndex: 0,
- pointerEvents: 'none'
- }}
- colors={[background_colors[0], background_colors[1]]}
- start={{ x: 0, y: 0 }}
- end={{ x: 0, y: 1 }} pointerEvents="none" />
- }
- function publishCard() {
- return <View className="cardShowAni" style={{ paddingTop: rpxToPx(26) }}>
- <View className="content_card">
- <View style={{ display: 'flex', flexDirection: 'row' }} >
- <NewButton type={NewButtonType.custom}
- onClick={() => {
- // setStep(0)
- // setFocus(false)
- setStep(0)
- }}>
- <View className="sel_tag">
- {/* <View className="h34 bold">{selPostCount}</View>
- <View className="h34" style={{ marginLeft: rpxToPx(6) }}>次</View>
- <View style={{
- width: rpxToPx(2),
- height: rpxToPx(32),
- backgroundColor: '#000',
- opacity: 0.2,
- marginLeft: rpxToPx(12),
- marginRight: rpxToPx(12)
- }} /> */}
- <View className="h34 bold">{title}</View>
- <View style={{ width: rpxToPx(6) }} />
- <IconArrow width={rpxToPx(34)} color='#000' />
- </View>
- </NewButton>
- </View>
- {/* <Input placeholder="hhhhhhh" style={{textAlign:'center'}}/> */}
- <Textarea placeholder={t('health.add_text')} className="textarea2 h44"
- placeholder-style="color:rgba(0,0,0,0.2)"
- value={desc}
- focus={focus}
- onBlur={() => {
- setFocus(false)
- }}
- onInput={e => {
- setDesc(e.detail.value)
- }} />
- <View className="form2">
- {
- pics.map((item, index) => {
- return <View className="cover1" key={index}>
- <Image src={item.url + scale} mode="aspectFill" className="cover2" key={index} onClick={() => {
- Taro.previewImage({
- current: pics[index].url,
- urls: pics.map(file => file.url)
- })
- }} />
- <View className="cover_del" onClick={() => {
- showAlert({
- title: t('health.del_title'),
- content: '',
- cancelText: t('health.del_cancel'),
- confirmText: t('health.del_confirm'),
- showCancel: true,
- confirm: () => {
- var array = JSON.parse(JSON.stringify(pics))
- array.splice(index, 1)
- setPics(array)
- }
- })
- }}>
- <View className="cover_del_btn">
- <IconClose width={10} height={10} color="#fff" />
- </View>
- </View>
- </View>
- })
- }
- {
- pics.length < 9 && <NewButton
- type={NewButtonType.custom}
- onClick={tapPic}>
- <View className="cover1" style={{}}><IconCamera color="#000" width={rpxToPx(48)} /></View>
- </NewButton>
- }
- </View>
- </View>
- <View className="time_view" onClick={() => {
- setShowTimePicker(true)
- }}>
- <IconClock width={rpxToPx(36)} color={MainColorType.black_25} />
- <View className="h30" style={{ opacity: 0.25, marginLeft: rpxToPx(12) }}>{t('health.time')}</View>
- <View style={{ flex: 1 }} />
- <View className="h30" style={{ opacity: 0.25 }}>{getDate() + time}</View>
- <IconArrow width={rpxToPx(34)} color={MainColorType.black_25} />
- <View className="border_footer_line" style={{ left: rpxToPx(48) }} />
- </View>
- {/* {
- router.params.join_id && <FollowInfo user={long.follow} />
- } */}
- </View>
- }
- function publishBtn() {
- return <View className="main_footer" style={{ backgroundColor: 'transparent' }}>
- <NewButton
- type={NewButtonType.fill}
- color={MainColorType.orange}
- width={rpxToPx(646)}
- height={rpxToPx(108)}
- title={t('health.share_to_moment')}
- onClick={save}
- />
- </View>
- }
- function tagsContent() {
- return <ScrollView scrollY style={{height:screenHeight-navigationBarHeight}}>
- <View style={{ display: 'flex', alignItems: 'center', flexDirection: 'column', marginTop: rpxToPx(26) }}>
- <Image src={BASE_IMG_URL + 'tag.svg'} style={{ width: rpxToPx(96), height: rpxToPx(96), marginBottom: rpxToPx(24) }} />
- <View className="h50 bold" style={{ textAlign: 'center', width: rpxToPx(600), }}>{t('health.add_a_tag')}</View>
- <LogTags tags={props.tags} scenario={props.scenario} showPublish={(scenario, item, addTag) => {
- // props.showPublish(scenario, item, tags)
- if (addTag) {
- setStep(1)
- return
- }
- setTitle(item.title)
- setStep(2)
- }} />
- </View>
- </ScrollView>
- }
- function addTagContent() {
- return <View className="cardShowAni" style={{ display: 'flex', flexDirection: 'column', alignItems: 'center', marginTop: rpxToPx(300) }}>
- <View className="input_form">
- <Input className="input_content h36" placeholder={t('health.custom_name')} value={title}
- placeholderClass="input_content_placeholder"
- focus={inputFocus}
- autoFocus={inputFocus}
- maxlength={30}
- onBlur={() => {
- setInputFocus(false)
- }}
- onInput={(e: any) => {
- setTitle(e.target.value)
- }} />
- <View className="form_btns">
- <View className="form_cancel">
- <NewButton btnStyle={{ flex: 1 }} type={NewButtonType.img}
- onClick={() => {
- if (addEnter) {
- props.onClose()
- return
- }
- setStep(0)
- }}
- >
- <View className="h30 bold">{t('health.cancel')}</View>
- </NewButton>
- </View>
- <View className="form_cancel">
- <NewButton btnStyle={{ flex: 1 }} type={NewButtonType.img}
- onClick={() => {
- if (!title || title.length == 0) return
- // setChooseTitle(title)
- // setPostCount(1)
- setStep(2)
- // addTag()
- }}
- >
- <View className={!title || title.length == 0 ? 'form_cancel form_confirm h30 bold' : 'form_cancel h30 bold'}
- >{t('health.confirm')}</View>
- </NewButton>
- </View>
- </View>
- </View>
- </View>
- }
- return <View className="log_publish_bg" style={{ overflow: showChoose ? 'hidden' : 'visible' }}>
- {
- bgView()
- }
- <View className="navi_bar" style={{ height: navigationBarHeight, zIndex: 1000 }}>
- <View style={{
- position: 'absolute',
- left: 0,
- right: 0,
- bottom: 0,
- height: 44,
- display: 'flex',
- alignItems: 'center',
- justifyContent: 'center'
- }}>
- <View style={{
- position: 'absolute',
- width: rpxToPx(92),
- height: rpxToPx(64),
- left: 22,
- top: 22 - rpxToPx(32)
- }}
- onClick={() => {
- if (addEnter) {
- props.onClose()
- return
- }
- // if (showResult) {
- // process.env.TARO_ENV == 'weapp' ? Taro.navigateBack() : navigation.goBack()
- // return
- // }
- if (title && title.length > 0 && step == 0) {
- setStep(2)
- return
- }
- if (step == 2 && (desc.length > 0 || pics.length > 0)) {
- showAlert({
- title: t('health.back_no_save'),
- content: '',
- showCancel: true,
- cancelText: t('health.cancel'),
- confirmText: t('health.exit'),
- confirm: () => {
- props.onClose()
- // process.env.TARO_ENV == 'weapp' ? Taro.navigateBack() : navigation.goBack()
- }
- })
- return
- }
- props.onClose()
- // process.env.TARO_ENV == 'weapp' ? Taro.navigateBack() : navigation.goBack()
- }}>
- <IconClose color={"#000"} width={rpxToPx(64)} height={rpxToPx(64)} />
- </View>
- </View>
- </View>
- <View style={{ height: navigationBarHeight }} />
- {
- step == 2 && publishCard()
- }
- {
- step == 2 && publishBtn()
- }
- {
- step == 0 && tagsContent()
- }
- {
- step == 1 && addTagContent()
- }
- {
- showTimePicker && <PickerCard onClose={() => { setShowTimePicker(false) }}
- value={new Date(selDate + 'T' + time + ':00').getTime()}
- title={global.language == 'en' ? 'Choose Time' : "选择时间"}
- type="datetime"
- onConfirm={(e) => {
- setSelDate(dayjs(e).format('YYYY-MM-DD'))
- setTime(dayjs(e).format('HH:mm'))
- setShowTimePicker(false)
- }}
- />
- }
- </View>
- }
|