174 lines
6.0 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import AddressList from "@/components/AddressList"
import { Button, Canvas, ScrollView, Text, View } from "@tarojs/components"
import Taro, { useReady } from "@tarojs/taro"
import { useEffect, useState } from "react"
import {creditInfoApi} from "@/api/creditLine"
import "./index.scss"
import { useSelector } from "@/reducers/hooks";
import { formatPriceDiv } from "@/common/fotmat"
export default ()=>{
const userInfo = useSelector(state => state.userInfo);
useEffect(()=>{
getData()
}, [])
const {fetchData, state} = creditInfoApi();
const [data, setData] = useState({
credit_quota_used_line: [0,"00"],
credit_quota_line: [0,"00"],
credit_quota_available_line: [0,"00"],
progress: 0,
create_time: ""
});
// 获取数据
const getData = async ()=>{
const result = await fetchData();
const credit_quota_used_line = convertPrice(formatPriceDiv(result.data.credit_quota_used_line));
const credit_quota_line = convertPrice(formatPriceDiv(result.data.credit_quota_line));
const credit_quota_available_line = convertPrice(formatPriceDiv(result.data.credit_quota_available_line));
const progress = credit_quota_line[0] / credit_quota_available_line[0] * 100;
setData({
...result.data,
progress,
credit_quota_used_line,
credit_quota_line,
credit_quota_available_line
})
}
const convertPrice = (data)=>{
var t = data.toString().split(".");
t[0] = t[0].toLocaleString();
t[1] = t[1]?t[1].padStart(2,0):"00";
return t;
}
return (
<View className="credit-line">
<View className="credit-line-tips">
<Text className="iconfont icon-zhuyi"></Text> 线
</View>
<View className="credit-line-card">
<View className="credit-line-card-top">
<View><Progress progress={data.progress} /></View>
<View className="credit-line-card-top-info">
<View className="credit-line-card-top-info-title"></View>
<View className="credit-line-card-top-info-price"><Text>¥</Text>{data.credit_quota_available_line[0]}<Text>.{data.credit_quota_available_line[1]}</Text></View>
<View className="credit-line-card-top-info-date">: {data.create_time} 2022-03-092022-05-13</View>
</View>
</View>
<View className="credit-line-card-bottom">
<View className="credit-line-card-bottom-item">
<View className="credit-line-card-bottom-item-title">
<Text className="iconfont icon-yucunkuan"></Text>
<View></View>
</View>
<View className="credit-line-card-bottom-item-price"><Text>¥</Text>{data.credit_quota_line[0]}<Text>.{data.credit_quota_line[1]}</Text></View>
</View>
<View className="credit-line-card-bottom-item">
<View className="credit-line-card-bottom-item-title">
<Text className="iconfont icon-tick-pressed"></Text>
<View></View>
</View>
<View className="credit-line-card-bottom-item-price"><Text>¥</Text>{data?.credit_quota_used_line[0]}<Text>.{data.credit_quota_used_line[1]}</Text></View>
</View>
</View>
</View>
</View>
)
}
const Progress = (props)=>{
useEffect(()=>{
getCanvas();
},[props.progress])
const getCanvas = ()=>{
const percentage = props.progress??0;
const query = Taro.createSelectorQuery();
query.select("#myCanvas").fields({ node: true, size: true }).exec((res) => {
const canvas = res[0]?.node;
if(canvas){
const ctx = canvas.getContext('2d');
const { windowHeight, windowWidth } = Taro.getSystemInfoSync();
const dpr = 750 / windowWidth;
canvas.width = res[0].width * dpr;
canvas.height = res[0].height * dpr;
const r = canvas.width / 2;
ctx.translate(r,r);
// 白色大圆
ctx.beginPath();
ctx.fillStyle = "white";
ctx.shadowBlur = 20;
ctx.shadowColor = "#cde5ff";
ctx.arc(0,0,100,0,2*Math.PI, false);
ctx.fill();
// 刻度
const my_minute = Math.PI*2/60;
const my_second = Math.PI*2/60;
ctx.strokeStyle="#F59F5D";
ctx.lineWidth=2;
ctx.beginPath();
for(let i=0;i<15;i++){
ctx.save();
ctx.rotate(i*4*my_minute);
ctx.moveTo(r-45,0);
ctx.lineTo(r-40,0);
ctx.stroke();
ctx.restore();
}
// 白色小圆
ctx.beginPath();
ctx.fillStyle = "white";
ctx.shadowBlur = 20;
ctx.shadowColor = "rgba(204,204,204,0.50)";
ctx.arc(0,0,74,0,2*Math.PI, false);
ctx.fill();
// 文字
ctx.beginPath();
ctx.restore();
ctx.fillStyle = "#007aff";
ctx.font="42px Cambria, Cambria-Bold";
ctx.textAlign="center";
ctx.textBaseline="middle";
ctx.fillText(percentage+"%", 0,0);
// 蓝色的圆
if(percentage>0){
ctx.beginPath();
ctx.lineWidth = 25;
ctx.lineCap = "round";
const gad = ctx.createLinearGradient(100,0,0,100);
gad.addColorStop(0, "#047CFF");
gad.addColorStop(1, "#51A4FF");
ctx.strokeStyle = gad;
ctx.arc(0,0,104,-Math.PI*0.5,2*Math.PI/100*((percentage<50?percentage:50)-25), false);
ctx.stroke();
}
if(percentage>50){
ctx.beginPath();
const gad2 = ctx.createLinearGradient(0,-100,0,0);
gad2.addColorStop(0, "#87C0FF");
gad2.addColorStop(1, "#57A8FF");
ctx.strokeStyle = gad2;
ctx.arc(0,0,104,Math.PI*0.5,2*Math.PI/100*(percentage-25), false);
ctx.stroke();
}
}else{
getCanvas();
}
});
}
useReady(()=>{
getCanvas();
})
return <Canvas type="2d" id="myCanvas"/>
}